Merge pull request #17 from etugarev/improvement/SLING-8706
SLING-8706 - Injections for java.util.Optional<> should be automatically optional
diff --git a/README.md b/README.md
index caf844e..1a415c2 100644
--- a/README.md
+++ b/README.md
@@ -1,6 +1,6 @@
-[<img src="https://sling.apache.org/res/logos/sling.png"/>](https://sling.apache.org)
+[![Apache Sling](https://sling.apache.org/res/logos/sling.png)](https://sling.apache.org)
- [![Build Status](https://builds.apache.org/buildStatus/icon?job=Sling/sling-org-apache-sling-models-impl/master)](https://builds.apache.org/job/Sling/job/sling-org-apache-sling-models-impl/job/master) [![Test Status](https://img.shields.io/jenkins/t/https/builds.apache.org/job/Sling/job/sling-org-apache-sling-models-impl/job/master.svg)](https://builds.apache.org/job/Sling/job/sling-org-apache-sling-models-impl/job/master/test_results_analyzer/) [![Maven Central](https://maven-badges.herokuapp.com/maven-central/org.apache.sling/org.apache.sling.models.impl/badge.svg)](https://search.maven.org/#search%7Cga%7C1%7Cg%3A%22org.apache.sling%22%20a%3A%22org.apache.sling.models.impl%22) [![JavaDocs](https://www.javadoc.io/badge/org.apache.sling/org.apache.sling.models.impl.svg)](https://www.javadoc.io/doc/org.apache.sling/org.apache.sling.models.impl) [![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](https://www.apache.org/licenses/LICENSE-2.0) [![models](https://sling.apache.org/badges/group-models.svg)](https://github.com/apache/sling-aggregator/blob/master/docs/groups/models.md)
+ [![Build Status](https://ci-builds.apache.org/job/Sling/job/modules/job/sling-org-apache-sling-models-impl/job/master/badge/icon)](https://ci-builds.apache.org/job/Sling/job/modules/job/sling-org-apache-sling-models-impl/job/master/) [![Test Status](https://img.shields.io/jenkins/tests.svg?jobUrl=https://ci-builds.apache.org/job/Sling/job/modules/job/sling-org-apache-sling-models-impl/job/master/)](https://ci-builds.apache.org/job/Sling/job/modules/job/sling-org-apache-sling-models-impl/job/master/test/?width=800&height=600) [![Coverage](https://sonarcloud.io/api/project_badges/measure?project=apache_sling-org-apache-sling-models-impl&metric=coverage)](https://sonarcloud.io/dashboard?id=apache_sling-org-apache-sling-models-impl) [![Sonarcloud Status](https://sonarcloud.io/api/project_badges/measure?project=apache_sling-org-apache-sling-models-impl&metric=alert_status)](https://sonarcloud.io/dashboard?id=apache_sling-org-apache-sling-models-impl) [![JavaDoc](https://www.javadoc.io/badge/org.apache.sling/org.apache.sling.models.impl.svg)](https://www.javadoc.io/doc/org.apache.sling/org.apache.sling.models.impl) [![Maven Central](https://maven-badges.herokuapp.com/maven-central/org.apache.sling/org.apache.sling.models.impl/badge.svg)](https://search.maven.org/#search%7Cga%7C1%7Cg%3A%22org.apache.sling%22%20a%3A%22org.apache.sling.models.impl%22) [![models](https://sling.apache.org/badges/group-models.svg)](https://github.com/apache/sling-aggregator/blob/master/docs/groups/models.md) [![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](https://www.apache.org/licenses/LICENSE-2.0)
# Apache Sling Models Implementation
diff --git a/bnd.bnd b/bnd.bnd
index 0b1929d..e3fce50 100644
--- a/bnd.bnd
+++ b/bnd.bnd
@@ -1,6 +1,5 @@
# Remove those package imports because embedded and relocated via shade plugin (see below)
Import-Package:\
- !org.apache.sling.commons.osgi,\
!org.apache.sling.scripting.core.impl.helper,\
*
Provide-Capability:\
diff --git a/pom.xml b/pom.xml
index 7aef7a3..0bda7fe 100644
--- a/pom.xml
+++ b/pom.xml
@@ -22,11 +22,11 @@
<parent>
<groupId>org.apache.sling</groupId>
<artifactId>sling-bundle-parent</artifactId>
- <version>35</version>
+ <version>46</version>
<relativePath />
</parent>
<artifactId>org.apache.sling.models.impl</artifactId>
- <version>1.4.13-SNAPSHOT</version>
+ <version>1.5.1-SNAPSHOT</version>
<name>Apache Sling Models Implementation</name>
<description>Apache Sling Models Implementation</description>
@@ -38,6 +38,7 @@
</scm>
<properties>
<sling.java.version>8</sling.java.version>
+ <project.build.outputTimestamp>2021-12-07T08:14:12Z</project.build.outputTimestamp>
</properties>
<build>
<plugins>
@@ -55,28 +56,17 @@
<shadeSourcesContent>true</shadeSourcesContent>
<artifactSet>
<includes>
- <include>org.apache.sling:org.apache.sling.commons.osgi</include>
<include>org.apache.sling:org.apache.sling.scripting.core</include>
</includes>
</artifactSet>
<relocations>
<relocation>
- <pattern>org.apache.sling.commons.osgi</pattern>
- <shadedPattern>slingmodelsimpl.org.apache.sling.commons.osgi</shadedPattern>
- </relocation>
- <relocation>
<pattern>org.apache.sling.scripting.core.impl.helper</pattern>
<shadedPattern>slingmodelsimpl.org.apache.sling.scripting.core.impl.helper</shadedPattern>
</relocation>
</relocations>
<filters>
<filter>
- <artifact>org.apache.sling:org.apache.sling.commons.osgi</artifact>
- <includes>
- <include>org/apache/sling/commons/osgi/**</include>
- </includes>
- </filter>
- <filter>
<artifact>org.apache.sling:org.apache.sling.scripting.core</artifact>
<includes>
<include>org/apache/sling/scripting/core/impl/helper/ProtectedBindings*</include>
@@ -105,31 +95,40 @@
</plugin>
</plugins>
</build>
+
<dependencies>
<dependency>
<groupId>org.apache.sling</groupId>
<artifactId>org.apache.sling.models.api</artifactId>
- <version>1.3.6</version>
+ <version>1.4.1-SNAPSHOT</version>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.osgi</groupId>
+ <artifactId>org.osgi.util.tracker</artifactId>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.osgi</groupId>
+ <artifactId>org.osgi.service.http.whiteboard</artifactId>
+ <version>1.1.0</version>
<scope>provided</scope>
</dependency>
<!-- OSGi annotations -->
<dependency>
<groupId>org.osgi</groupId>
<artifactId>org.osgi.service.component.annotations</artifactId>
- <version>1.3.0</version> <!-- downgrade to DS 1.3 (OSGi R6), as this leads to a run time dependency -->
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.osgi</groupId>
<artifactId>org.osgi.service.metatype.annotations</artifactId>
- <version>1.3.0</version> <!-- downgrade to metatype 1.3 (OSGi R6) -->
<scope>provided</scope>
</dependency>
<!-- regular compile-time dependencies -->
<dependency>
<groupId>javax.servlet</groupId>
- <artifactId>servlet-api</artifactId>
- <version>2.4</version><!-- still Servlet 2.4 -->
+ <artifactId>javax.servlet-api</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
@@ -158,10 +157,8 @@
<dependency>
<groupId>javax.inject</groupId>
<artifactId>javax.inject</artifactId>
- <version>1</version>
<scope>provided</scope>
</dependency>
- <!-- Artifact is shaded and inlined, only some classes included (see above) -->
<dependency>
<groupId>org.apache.sling</groupId>
<artifactId>org.apache.sling.commons.osgi</artifactId>
@@ -188,14 +185,14 @@
</dependency>
<dependency>
<groupId>org.apache.sling</groupId>
- <artifactId>org.apache.sling.testing.osgi-mock</artifactId>
- <version>2.3.2</version>
+ <artifactId>org.apache.sling.testing.osgi-mock.junit4</artifactId>
+ <version>3.2.0</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
- <artifactId>mockito-all</artifactId>
- <version>1.9.5</version>
+ <artifactId>mockito-core</artifactId>
+ <version>4.1.0</version>
<scope>test</scope>
</dependency>
<dependency>
@@ -209,12 +206,37 @@
<artifactId>slf4j-simple</artifactId>
<scope>test</scope>
</dependency>
+ <dependency>
+ <groupId>org.apache.sling</groupId>
+ <artifactId>org.apache.sling.servlet-helpers</artifactId>
+ <version>1.4.2</version>
+ <scope>test</scope>
+ </dependency>
+ <!-- transitive depedendencies of org.apache.sling.servlet-helpers -->
+ <dependency>
+ <groupId>org.apache.commons</groupId>
+ <artifactId>commons-collections4</artifactId>
+ <version>4.1</version>
+ <scope>test</scope>
+ </dependency>
<!-- for testing the annotations -->
<dependency>
- <groupId>org.apache.felix</groupId>
- <artifactId>org.apache.felix.converter</artifactId>
- <version>1.0.8</version>
+ <groupId>org.osgi</groupId>
+ <artifactId>org.osgi.util.converter</artifactId>
+ <version>1.0.9</version>
<scope>test</scope>
</dependency>
+ <dependency>
+ <groupId>org.springframework</groupId>
+ <artifactId>spring-context</artifactId>
+ <version>5.2.9.RELEASE</version>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>javax.annotation</groupId>
+ <artifactId>javax.annotation-api</artifactId>
+ <version>1.3.2</version>
+ <scope>provided</scope>
+ </dependency>
</dependencies>
</project>
diff --git a/src/main/java/org/apache/sling/models/impl/ExportServlet.java b/src/main/java/org/apache/sling/models/impl/ExportServlet.java
index f557713..29c980e 100644
--- a/src/main/java/org/apache/sling/models/impl/ExportServlet.java
+++ b/src/main/java/org/apache/sling/models/impl/ExportServlet.java
@@ -148,7 +148,6 @@
}
- @SuppressWarnings("unchecked")
private Map<String, String> createOptionMap(SlingHttpServletRequest request) {
Map<String, String[]> parameterMap = request.getParameterMap();
String[] selectors = request.getRequestPathInfo().getSelectors();
diff --git a/src/main/java/org/apache/sling/models/impl/FirstImplementationPicker.java b/src/main/java/org/apache/sling/models/impl/FirstImplementationPicker.java
index 2963739..89b6c96 100644
--- a/src/main/java/org/apache/sling/models/impl/FirstImplementationPicker.java
+++ b/src/main/java/org/apache/sling/models/impl/FirstImplementationPicker.java
@@ -19,6 +19,7 @@
package org.apache.sling.models.impl;
import org.apache.sling.models.spi.ImplementationPicker;
+import org.jetbrains.annotations.NotNull;
import org.osgi.framework.Constants;
import org.osgi.service.component.annotations.Component;
@@ -33,7 +34,7 @@
public class FirstImplementationPicker implements ImplementationPicker {
@Override
- public Class<?> pick(Class<?> adapterType, Class<?>[] implementationsTypes, Object adaptable) {
+ public Class<?> pick(@NotNull Class<?> adapterType, Class<?> @NotNull [] implementationsTypes, @NotNull Object adaptable) {
// implementations is never null or empty
return implementationsTypes[0];
}
diff --git a/src/main/java/org/apache/sling/models/impl/ModelAdapterFactory.java b/src/main/java/org/apache/sling/models/impl/ModelAdapterFactory.java
index 2d90ee0..1ecd7f7 100644
--- a/src/main/java/org/apache/sling/models/impl/ModelAdapterFactory.java
+++ b/src/main/java/org/apache/sling/models/impl/ModelAdapterFactory.java
@@ -93,8 +93,8 @@
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-@Component(immediate = true, service={ ModelFactory.class, ServletRequestListener.class },
- property= { HttpWhiteboardConstants.HTTP_WHITEBOARD_LISTENER+"=true",
+@Component(immediate = true, service={ ModelFactory.class, ServletRequestListener.class },
+ property= { HttpWhiteboardConstants.HTTP_WHITEBOARD_LISTENER+"=true",
HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_SELECT+"=(" + HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_NAME + "=*)" })
@Designate(ocd=ModelAdapterFactoryConfiguration.class)
@SuppressWarnings("deprecation")
@@ -107,6 +107,8 @@
private static final Object REQUEST_MARKER_VALUE = new Object();
+ private static final String REQUEST_CACHE_ATTRIBUTE = ModelAdapterFactory.class.getName() + ".AdapterCache";
+
private static class DisposalCallbackRegistryImpl implements DisposalCallbackRegistry, Disposable {
private List<DisposalCallback> callbacks = new ArrayList<>();
@@ -202,31 +204,31 @@
private static final Logger log = LoggerFactory.getLogger(ModelAdapterFactory.class);
- private final @NotNull ConcurrentMap<String, RankedServices<Injector>> injectors = new ConcurrentHashMap<>();
- private final @NotNull RankedServices<Injector> sortedInjectors = new RankedServices<>();
- private final @NotNull ConcurrentMap<Class<? extends ViaProviderType>, ViaProvider> viaProviders = new ConcurrentHashMap<>();
+ private final ConcurrentMap<String, RankedServices<Injector>> injectors = new ConcurrentHashMap<>();
+ private final RankedServices<Injector> sortedInjectors = new RankedServices<>();
+ private final ConcurrentMap<Class<? extends ViaProviderType>, ViaProvider> viaProviders = new ConcurrentHashMap<>();
@Reference(name="injectAnnotationProcessorFactory", cardinality = ReferenceCardinality.MULTIPLE, policy = ReferencePolicy.DYNAMIC)
- volatile @NotNull Collection<InjectAnnotationProcessorFactory> injectAnnotationProcessorFactories; // this must be non-final for fieldOption=replace!
+ volatile Collection<InjectAnnotationProcessorFactory> injectAnnotationProcessorFactories; // this must be non-final for fieldOption=replace!
@Reference(name="injectAnnotationProcessorFactory2", cardinality = ReferenceCardinality.MULTIPLE, policy = ReferencePolicy.DYNAMIC)
- volatile @NotNull Collection<InjectAnnotationProcessorFactory2> injectAnnotationProcessorFactories2; // this must be non-final for fieldOption=replace!
+ volatile Collection<InjectAnnotationProcessorFactory2> injectAnnotationProcessorFactories2; // this must be non-final for fieldOption=replace!
- private final @NotNull RankedServices<StaticInjectAnnotationProcessorFactory> staticInjectAnnotationProcessorFactories = new RankedServices<>();
+ private final RankedServices<StaticInjectAnnotationProcessorFactory> staticInjectAnnotationProcessorFactories = new RankedServices<>();
- private final @NotNull RankedServices<ImplementationPicker> implementationPickers = new RankedServices<>();
+ private final RankedServices<ImplementationPicker> implementationPickers = new RankedServices<>();
// bind the service with the highest priority (if a new one comes in this service gets restarted)
@Reference(cardinality=ReferenceCardinality.OPTIONAL, policyOption=ReferencePolicyOption.GREEDY)
private ModelValidation modelValidation = null;
@Reference(name = "modelExporter", cardinality = ReferenceCardinality.MULTIPLE, policy = ReferencePolicy.DYNAMIC)
- volatile @NotNull Collection<ModelExporter> modelExporters; // this must be non-final for fieldOption=replace!
+ volatile Collection<ModelExporter> modelExporters; // this must be non-final for fieldOption=replace!
@Reference
BindingsValuesProvidersByContext bindingsValuesProvidersByContext;
- @Reference
+ @Reference
AdapterManager adapterManager;
ModelPackageBundleListener listener;
@@ -244,16 +246,16 @@
private SlingModelsScriptEngineFactory scriptEngineFactory;
- // use a smaller initial capacity than the default as we expect a relatively small number of
- // adapters per adaptable
- private final int INNER_CACHE_INITIAL_CAPACITY = 4;
-
-
@Override
+ @SuppressWarnings("null")
public <AdapterType> AdapterType getAdapter(Object adaptable, Class<AdapterType> type) {
Result<AdapterType> result = internalCreateModel(adaptable, type);
if (!result.wasSuccessful()) {
- log.warn("Could not adapt to model", result.getThrowable());
+ if (result == Result.POST_CONSTRUCT_PREVENTED_MODEL_CONSTRUCTION) {
+ log.debug("Could not adapt to model as PostConstruct method returned false"); // do no construct runtime exception in this case
+ } else {
+ log.warn("Could not adapt to model", result.getThrowable());
+ }
return null;
} else {
return result.getValue();
@@ -331,7 +333,23 @@
}
@SuppressWarnings("unchecked")
- private <ModelType> Result<ModelType> internalCreateModel(final Object adaptable, final Class<ModelType> requestedType) {
+ private Map<Class<?>, SoftReference<Object>> getOrCreateCache(final Object adaptable) {
+ Map<Class<?>, SoftReference<Object>> adaptableCache;
+ if (adaptable instanceof ServletRequest) {
+ ServletRequest request = (ServletRequest) adaptable;
+ adaptableCache = (Map<Class<?>, SoftReference<Object>>) request.getAttribute(REQUEST_CACHE_ATTRIBUTE);
+ if (adaptableCache == null) {
+ adaptableCache = Collections.synchronizedMap(new WeakHashMap<>());
+ request.setAttribute(REQUEST_CACHE_ATTRIBUTE, adaptableCache);
+ }
+ } else {
+ adaptableCache = adapterCache.computeIfAbsent(adaptable, k -> Collections.synchronizedMap(new WeakHashMap<>()));
+ }
+ return adaptableCache;
+ }
+
+ @SuppressWarnings("unchecked")
+ <ModelType> Result<ModelType> internalCreateModel(final Object adaptable, final Class<ModelType> requestedType) {
Result<ModelType> result;
ThreadInvocationCounter threadInvocationCounter = invocationCountThreadLocal.get();
if (threadInvocationCounter.isMaximumReached()) {
@@ -351,12 +369,13 @@
boolean isAdaptable = false;
Model modelAnnotation = modelClass.getModelAnnotation();
+ Map<Class<?>, SoftReference<Object>> adaptableCache = null;
if (modelAnnotation.cache()) {
- Map<Class<?>, SoftReference<Object>> adaptableCache = adapterCache.get(adaptable);
- if (adaptableCache != null) {
- SoftReference<Object> SoftReference = adaptableCache.get(requestedType);
- ModelType cachedObject = (ModelType) SoftReference.get();
+ adaptableCache = getOrCreateCache(adaptable);
+ SoftReference<Object> softReference = adaptableCache.get(modelClass.getType());
+ if (softReference != null) {
+ ModelType cachedObject = (ModelType) softReference.get();
if (cachedObject != null) {
return new Result<>(cachedObject);
}
@@ -382,13 +401,8 @@
if (handlerResult.wasSuccessful()) {
ModelType model = (ModelType) Proxy.newProxyInstance(modelClass.getType().getClassLoader(), new Class<?>[] { modelClass.getType() }, handlerResult.getValue());
- if (modelAnnotation.cache()) {
- Map<Class<?>, SoftReference<Object>> adaptableCache = adapterCache.get(adaptable);
- if (adaptableCache == null) {
- adaptableCache = Collections.synchronizedMap(new WeakHashMap<Class<?>, SoftReference<Object>>());
- adapterCache.put(adaptable, adaptableCache);
- }
- adaptableCache.put(requestedType, new SoftReference<Object>(model));
+ if (modelAnnotation.cache() && adaptableCache != null) {
+ adaptableCache.put(modelClass.getType(), new SoftReference<>(model));
}
result = new Result<>(model);
@@ -399,13 +413,8 @@
try {
result = createObject(adaptable, modelClass);
- if (result.wasSuccessful() && modelAnnotation.cache()) {
- Map<Class<?>, SoftReference<Object>> adaptableCache = adapterCache.get(adaptable);
- if (adaptableCache == null) {
- adaptableCache = Collections.synchronizedMap(new WeakHashMap<Class<?>, SoftReference<Object>>());
- adapterCache.put(adaptable, adaptableCache);
- }
- adaptableCache.put(requestedType, new SoftReference<Object>(result.getValue()));
+ if (result.wasSuccessful() && modelAnnotation.cache() && adaptableCache != null) {
+ adaptableCache.put(modelClass.getType(), new SoftReference<>(result.getValue()));
}
} catch (Exception e) {
String msg = String.format("Unable to create model %s", modelClass.getType());
@@ -639,7 +648,6 @@
}
private BundleContext getModelBundleContext(final ModelClass<?> modelClass) {
- BundleContext modelContext = null;
Bundle modelBundle = FrameworkUtil.getBundle(modelClass.getType());
if (modelBundle != null) {
return modelBundle.getBundleContext();
@@ -705,6 +713,7 @@
return request;
}
+ @SuppressWarnings("unchecked")
private <ModelType> Result<ModelType> createObject(final Object adaptable, final ModelClass<ModelType> modelClass)
throws InstantiationException, InvocationTargetException, IllegalAccessException {
DisposalCallbackRegistryImpl registry = new DisposalCallbackRegistryImpl();
@@ -719,7 +728,8 @@
ModelType object;
if (constructorToUse.getConstructor().getParameterTypes().length == 0) {
// no parameters for constructor injection? instantiate it right away
- object = constructorToUse.getConstructor().newInstance();
+
+ object = constructorToUse.newInstance();
} else {
// instantiate with constructor injection
// if this fails, make sure resources that may be claimed by injectors are cleared up again
@@ -731,13 +741,7 @@
} else {
object = result.getValue();
}
- } catch (InstantiationException ex) {
- registry.onDisposed();
- throw ex;
- } catch (InvocationTargetException ex) {
- registry.onDisposed();
- throw ex;
- } catch (IllegalAccessException ex) {
+ } catch (InstantiationException | InvocationTargetException | IllegalAccessException ex) {
registry.onDisposed();
throw ex;
}
@@ -778,6 +782,9 @@
}
try {
object = invokePostConstruct(object);
+ if (object == null) {
+ return (Result<ModelType>) Result.POST_CONSTRUCT_PREVENTED_MODEL_CONSTRUCTION;
+ }
} catch (InvocationTargetException e) {
return new Result<>(new PostConstructException("Post-construct method has thrown an exception for model " + modelClass.getType(), e.getCause()));
} catch (IllegalAccessException e) {
@@ -792,7 +799,6 @@
* @param type Model type
* @return Constructor or null if none found
*/
- @SuppressWarnings("unchecked")
private <ModelType> ModelClassConstructor<ModelType> getBestMatchingConstructor(Object adaptable, ModelClass<ModelType> type) {
ModelClassConstructor<ModelType>[] constructors = type.getConstructors();
@@ -844,7 +850,7 @@
}
return new Result<>(missingElementsException);
}
- return new Result<>(constructor.getConstructor().newInstance(paramValues.toArray(new Object[paramValues.size()])));
+ return new Result<>(constructor.newInstance(paramValues.toArray(new Object[paramValues.size()])));
}
private Result<Boolean> injectDefaultValue(InjectableElement point, InjectAnnotationProcessor processor,
@@ -959,6 +965,7 @@
return true;
}
+ @SuppressWarnings("null")
private <ModelType> ModelType invokePostConstruct(ModelType object) throws InvocationTargetException, IllegalAccessException {
Class<?> clazz = object.getClass();
List<Method> postConstructMethods = new ArrayList<>();
@@ -973,20 +980,11 @@
}
Collections.reverse(postConstructMethods);
for (Method method : postConstructMethods) {
- boolean accessible = method.isAccessible();
- try {
- if (!accessible) {
- method.setAccessible(true);
- }
- Object result = method.invoke(object);
- if (result instanceof Boolean && !((Boolean) result).booleanValue()) {
- log.debug("PostConstruct method {}.{} returned false. Returning null model.", method.getDeclaringClass().getName(), method.getName());
- return null;
- }
- } finally {
- if (!accessible) {
- method.setAccessible(false);
- }
+ method.setAccessible(true);
+ Object result = method.invoke(object);
+ if (result instanceof Boolean && !((Boolean) result).booleanValue()) {
+ log.debug("PostConstruct method {}.{} returned false. Returning null model.", method.getDeclaringClass().getName(), method.getName());
+ return null;
}
}
return object;
@@ -1026,6 +1024,7 @@
}
}
+ @SuppressWarnings("null")
private Result<Object> adaptIfNecessary(final Object value, final Class<?> type, final Type genericType) {
final Object adaptedValue;
if (!isAcceptableType(type, genericType, value)) {
@@ -1091,6 +1090,7 @@
}
}
+ @SuppressWarnings("null")
private static boolean isAcceptableType(Class<?> type, Type genericType, Object value) {
if (type.isInstance(value)) {
if ((type == Collection.class || type == List.class) && genericType instanceof ParameterizedType &&
@@ -1299,7 +1299,7 @@
}
@Override
- public Object getModelFromResource(Resource resource) {
+ public Object getModelFromResource(@NotNull Resource resource) {
Class<?> clazz = this.adapterImplementations.getModelClassForResource(resource);
if (clazz == null) {
throw new ModelClassException("Could find model registered for resource type: " + resource.getResourceType());
@@ -1308,7 +1308,7 @@
}
@Override
- public Object getModelFromRequest(SlingHttpServletRequest request) {
+ public Object getModelFromRequest(@NotNull SlingHttpServletRequest request) {
Class<?> clazz = this.adapterImplementations.getModelClassForRequest(request);
if (clazz == null) {
throw new ModelClassException("Could find model registered for request path: " + request.getServletPath());
@@ -1325,6 +1325,7 @@
}
@Override
+ @SuppressWarnings("null")
public <T> T exportModel(Object model, String name, Class<T> targetClass, Map<String, String> options)
throws ExportException, MissingExporterException {
for (ModelExporter exporter : modelExporters) {
diff --git a/src/main/java/org/apache/sling/models/impl/ModelPackageBundleListener.java b/src/main/java/org/apache/sling/models/impl/ModelPackageBundleListener.java
index c3b1757..b80377a 100644
--- a/src/main/java/org/apache/sling/models/impl/ModelPackageBundleListener.java
+++ b/src/main/java/org/apache/sling/models/impl/ModelPackageBundleListener.java
@@ -16,6 +16,7 @@
*/
package org.apache.sling.models.impl;
+import java.lang.annotation.AnnotationFormatError;
import java.net.URL;
import java.util.ArrayList;
import java.util.Collections;
@@ -110,9 +111,7 @@
packageList = StringUtils.deleteWhitespace(packageList);
String[] packages = packageList.split(",");
for (String singlePackage : packages) {
- @SuppressWarnings("unchecked")
- Enumeration<URL> classUrls = bundle.findEntries("/" + singlePackage.replace('.', '/'), "*.class",
- true);
+ Enumeration<URL> classUrls = bundle.findEntries("/" + singlePackage.replace('.', '/'), "*.class", true);
if (classUrls == null) {
log.warn("No adaptable classes found in package {}, ignoring", singlePackage);
@@ -187,8 +186,8 @@
}
}
- } catch (ClassNotFoundException e) {
- log.warn("Unable to load class", e);
+ } catch (ClassNotFoundException|AnnotationFormatError e) {
+ log.warn("Unable to load class '{}' from bundle '{}': {}", className, bundle.getSymbolicName(), e.getLocalizedMessage(), e);
}
}
diff --git a/src/main/java/org/apache/sling/models/impl/ReflectionUtil.java b/src/main/java/org/apache/sling/models/impl/ReflectionUtil.java
index da985a4..456b1c7 100644
--- a/src/main/java/org/apache/sling/models/impl/ReflectionUtil.java
+++ b/src/main/java/org/apache/sling/models/impl/ReflectionUtil.java
@@ -70,6 +70,7 @@
}
}
+ @SuppressWarnings("unused")
public static <T extends AnnotatedElement> void addAnnotated(T[] elements, List<T> set) {
for (T element : elements) {
Inject injection = getAnnotation(element, Inject.class);
@@ -92,6 +93,7 @@
* @param annotationClass the annotation class
* @return the found annotation or null
*/
+ @SuppressWarnings("null")
public static <T extends Annotation> T getAnnotation(AnnotatedElement element, Class<T> annotationClass) {
T annotation = element.getAnnotation(annotationClass);
if (annotation != null) {
diff --git a/src/main/java/org/apache/sling/models/impl/ResourceTypeBasedResourcePicker.java b/src/main/java/org/apache/sling/models/impl/ResourceTypeBasedResourcePicker.java
index 7bf313a..00df685 100644
--- a/src/main/java/org/apache/sling/models/impl/ResourceTypeBasedResourcePicker.java
+++ b/src/main/java/org/apache/sling/models/impl/ResourceTypeBasedResourcePicker.java
@@ -31,7 +31,7 @@
public class ResourceTypeBasedResourcePicker implements ImplementationPicker {
@Override
- public Class<?> pick(@NotNull Class<?> adapterType, @NotNull Class<?>[] implementationsTypes, @NotNull Object adaptable) {
+ public Class<?> pick(@NotNull Class<?> adapterType, Class<?> @NotNull [] implementationsTypes, @NotNull Object adaptable) {
final Resource resource = findResource(adaptable);
if (resource == null) {
return null;
diff --git a/src/main/java/org/apache/sling/models/impl/Result.java b/src/main/java/org/apache/sling/models/impl/Result.java
index 26f3c7c..df9612c 100644
--- a/src/main/java/org/apache/sling/models/impl/Result.java
+++ b/src/main/java/org/apache/sling/models/impl/Result.java
@@ -18,6 +18,7 @@
*/
package org.apache.sling.models.impl;
+import org.apache.sling.models.factory.PostConstructException;
import org.jetbrains.annotations.NotNull;
/**
@@ -32,9 +33,10 @@
private final SuccessObjectType object;
/**
* instantiate with one throwable (i.e. failure)
- *
+ *
* @param throwable
*/
+ @SuppressWarnings("null")
public Result(RuntimeException throwable) {
this.t = throwable;
this.object = null;
@@ -42,7 +44,7 @@
/**
* instantate with a model (i.e. success)
- *
+ *
* @param object
*/
public Result(SuccessObjectType object) {
@@ -51,7 +53,7 @@
}
/**
- *
+ *
* @return the encapsulated exception
* @throws IllegalStateException
* in case this object does not represent a failure
@@ -64,11 +66,12 @@
}
/**
- *
+ *
* @return the encapsulated success value
* @throws IllegalStateException
* in case this object does not represent a success
*/
+ @SuppressWarnings("null")
public @NotNull SuccessObjectType getValue() {
if (object == null) {
throw new IllegalStateException(
@@ -78,7 +81,7 @@
}
/**
- *
+ *
* @return {@code true} in case this object represents a success, otherwise
* {@code false}
*/
@@ -86,5 +89,13 @@
return object != null;
}
+ public static final Result<Object> POST_CONSTRUCT_PREVENTED_MODEL_CONSTRUCTION = new Result<Object>((RuntimeException)null) {
+ @Override
+ public @NotNull RuntimeException getThrowable() {
+ // generate exception lazily
+ return new PostConstructException("PostConstruct method returned false", null);
+ }
+
+ };
}
diff --git a/src/main/java/org/apache/sling/models/impl/injectors/AbstractInjector.java b/src/main/java/org/apache/sling/models/impl/injectors/AbstractInjector.java
index 8ef3797..a2b8567 100644
--- a/src/main/java/org/apache/sling/models/impl/injectors/AbstractInjector.java
+++ b/src/main/java/org/apache/sling/models/impl/injectors/AbstractInjector.java
@@ -28,6 +28,7 @@
import org.apache.sling.api.resource.Resource;
import org.apache.sling.api.resource.ResourceResolver;
import org.apache.sling.api.resource.ValueMap;
+import org.jetbrains.annotations.Nullable;
/**
* Abstract base class for injectors to consolidate common functionality.
@@ -44,12 +45,30 @@
return resolver;
}
- protected ValueMap getValueMap(Object adaptable) {
+ /**
+ * Retrieve the ValueMap from the given adaptable. This succeeds, if the adaptable is either
+ * <ul>
+ * <li>a {@link ValueMap},</li>
+ * <li>a {@link SlingHttpServletRequest}, in which case the returned {@link ValueMap} is the one derived from the request's resource or</li>
+ * <li>adaptable to a {@link ValueMap}.</li>
+ * </ul>
+ * Otherwise {@code null} is returned.
+ * @param adaptable
+ * @return a ValueMap or {@code null}.
+ */
+ protected @Nullable ValueMap getValueMap(Object adaptable) {
if (adaptable instanceof ValueMap) {
return (ValueMap) adaptable;
+ } else if (adaptable instanceof SlingHttpServletRequest) {
+ final Resource resource = ((SlingHttpServletRequest)adaptable).getResource();
+ // resource may be null for mocked adaptables, therefore do a check here
+ if (resource != null) {
+ return resource.adaptTo(ValueMap.class);
+ } else {
+ return null;
+ }
} else if (adaptable instanceof Adaptable) {
- ValueMap map = ((Adaptable) adaptable).adaptTo(ValueMap.class);
- return map;
+ return ((Adaptable) adaptable).adaptTo(ValueMap.class);
} else {
return null;
}
diff --git a/src/main/java/org/apache/sling/models/impl/injectors/BindingsInjector.java b/src/main/java/org/apache/sling/models/impl/injectors/BindingsInjector.java
index 4562217..1fd5495 100644
--- a/src/main/java/org/apache/sling/models/impl/injectors/BindingsInjector.java
+++ b/src/main/java/org/apache/sling/models/impl/injectors/BindingsInjector.java
@@ -68,6 +68,7 @@
}
@Override
+ @SuppressWarnings("unused")
public InjectAnnotationProcessor2 createAnnotationProcessor(AnnotatedElement element) {
// check if the element has the expected annotation
ScriptVariable annotation = element.getAnnotation(ScriptVariable.class);
@@ -78,7 +79,7 @@
}
@Override
- public Object prepareValue(Object adaptable) {
+ public @NotNull Object prepareValue(@NotNull Object adaptable) {
Object prepared = getBindings(adaptable);
return prepared != null ? prepared : ObjectUtils.NULL;
}
diff --git a/src/main/java/org/apache/sling/models/impl/injectors/ChildResourceInjector.java b/src/main/java/org/apache/sling/models/impl/injectors/ChildResourceInjector.java
index 967a531..b32cf7e 100644
--- a/src/main/java/org/apache/sling/models/impl/injectors/ChildResourceInjector.java
+++ b/src/main/java/org/apache/sling/models/impl/injectors/ChildResourceInjector.java
@@ -89,6 +89,7 @@
@Override
+ @SuppressWarnings("unused")
public InjectAnnotationProcessor2 createAnnotationProcessor(Object adaptable, AnnotatedElement element) {
// check if the element has the expected annotation
ChildResource annotation = element.getAnnotation(ChildResource.class);
diff --git a/src/main/java/org/apache/sling/models/impl/injectors/OSGiServiceInjector.java b/src/main/java/org/apache/sling/models/impl/injectors/OSGiServiceInjector.java
index 5c02f73..08f6d35 100644
--- a/src/main/java/org/apache/sling/models/impl/injectors/OSGiServiceInjector.java
+++ b/src/main/java/org/apache/sling/models/impl/injectors/OSGiServiceInjector.java
@@ -81,6 +81,7 @@
* @param modelContext
* @return
*/
+ @SuppressWarnings({ "null", "unused" })
public Object getValue(@NotNull Object adaptable, String name, @NotNull Type type, @NotNull AnnotatedElement element,
@NotNull DisposalCallbackRegistry callbackRegistry, @Nullable BundleContext modelContext) {
OSGiService annotation = element.getAnnotation(OSGiService.class);
@@ -103,19 +104,22 @@
// cannot use SlingScriptHelper since it does not support ordering by service ranking due to https://issues.apache.org/jira/browse/SLING-5665
try {
ServiceReference<?>[] refs = modelContext.getServiceReferences(type.getName(), filter);
- if (refs == null || refs.length == 0) {
- return null;
- } else {
- // sort by service ranking (lowest first) (see ServiceReference.compareTo)
+ if (refs != null && refs.length > 0) {
+ // sort by reverse service ranking (highest first) (see ServiceReference.compareTo)
List<ServiceReference<?>> references = Arrays.asList(refs);
- Collections.sort(references);
- callbackRegistry.addDisposalCallback(new Callback(refs, modelContext));
- return modelContext.getService(references.get(references.size() - 1));
+ Collections.sort(references, Collections.reverseOrder());
+ for(final ServiceReference<?> ref : references) {
+ final Object obj = modelContext.getService(ref);
+ if ( obj != null ) {
+ callbackRegistry.addDisposalCallback(new Callback(new ServiceReference[] {ref}, modelContext));
+ return obj;
+ }
+ }
}
} catch (InvalidSyntaxException e) {
log.error("invalid filter expression", e);
- return null;
}
+ return null;
}
private <T> Object[] getServices(Object adaptable, Class<T> type, String filter,
@@ -123,28 +127,28 @@
// cannot use SlingScriptHelper since it does not support ordering by service ranking due to https://issues.apache.org/jira/browse/SLING-5665
try {
ServiceReference<?>[] refs = modelContext.getServiceReferences(type.getName(), filter);
- if (refs == null || refs.length == 0) {
- return null;
- } else {
- // sort by service ranking (lowest first) (see ServiceReference.compareTo)
+ if (refs != null && refs.length > 0) {
+ // sort by reverse service ranking (highest first) (see ServiceReference.compareTo)
List<ServiceReference<?>> references = Arrays.asList(refs);
- Collections.sort(references);
- // make highest service ranking being returned first
- Collections.reverse(references);
- callbackRegistry.addDisposalCallback(new Callback(refs, modelContext));
+ Collections.sort(references, Collections.reverseOrder());
List<Object> services = new ArrayList<>();
+ List<ServiceReference<?>> usedRefs = new ArrayList<>();
for (ServiceReference<?> ref : references) {
Object service = modelContext.getService(ref);
if (service != null) {
services.add(service);
+ usedRefs.add(ref);
}
}
- return services.toArray();
+ if ( !services.isEmpty() ) {
+ callbackRegistry.addDisposalCallback(new Callback(usedRefs.toArray(new ServiceReference[usedRefs.size()]), modelContext));
+ return services.toArray(new Object[services.size()]);
+ }
}
} catch (InvalidSyntaxException e) {
log.error("invalid filter expression", e);
- return null;
}
+ return null;
}
private Object getValue(Object adaptable, Type type, String filterString, DisposalCallbackRegistry callbackRegistry,
@@ -207,6 +211,7 @@
}
@Override
+ @SuppressWarnings({ "unused", "null" })
public InjectAnnotationProcessor2 createAnnotationProcessor(AnnotatedElement element) {
// check if the element has the expected annotation
OSGiService annotation = element.getAnnotation(OSGiService.class);
diff --git a/src/main/java/org/apache/sling/models/impl/injectors/RequestAttributeInjector.java b/src/main/java/org/apache/sling/models/impl/injectors/RequestAttributeInjector.java
index 93109dc..9df6b37 100644
--- a/src/main/java/org/apache/sling/models/impl/injectors/RequestAttributeInjector.java
+++ b/src/main/java/org/apache/sling/models/impl/injectors/RequestAttributeInjector.java
@@ -51,6 +51,7 @@
}
@Override
+ @SuppressWarnings({ "unused", "null" })
public InjectAnnotationProcessor2 createAnnotationProcessor(AnnotatedElement element) {
// check if the element has the expected annotation
RequestAttribute annotation = element.getAnnotation(RequestAttribute.class);
@@ -72,7 +73,7 @@
public InjectionStrategy getInjectionStrategy() {
return annotation.injectionStrategy();
}
-
+
@Override
@SuppressWarnings("deprecation")
public Boolean isOptional() {
@@ -90,5 +91,5 @@
}
}
-
+
}
diff --git a/src/main/java/org/apache/sling/models/impl/injectors/ResourcePathInjector.java b/src/main/java/org/apache/sling/models/impl/injectors/ResourcePathInjector.java
index 2b3ff71..f49a1d7 100644
--- a/src/main/java/org/apache/sling/models/impl/injectors/ResourcePathInjector.java
+++ b/src/main/java/org/apache/sling/models/impl/injectors/ResourcePathInjector.java
@@ -55,6 +55,7 @@
}
@Override
+ @SuppressWarnings({ "unused", "null" })
public Object getValue(@NotNull Object adaptable, String name, @NotNull Type declaredType, @NotNull AnnotatedElement element,
@NotNull DisposalCallbackRegistry callbackRegistry) {
String[] resourcePaths = null;
@@ -79,6 +80,7 @@
ResourceResolver resolver = getResourceResolver(adaptable);
if (resolver == null) {
+ LOG.debug("Could not get resolver from adaptable {}", adaptable);
return null;
}
List<Resource> resources = getResources(resolver, resourcePaths, name);
@@ -149,6 +151,7 @@
}
@Override
+ @SuppressWarnings({ "unused", "null" })
public InjectAnnotationProcessor2 createAnnotationProcessor(AnnotatedElement element) {
// check if the element has the expected annotation
ResourcePath annotation = element.getAnnotation(ResourcePath.class);
diff --git a/src/main/java/org/apache/sling/models/impl/injectors/SelfInjector.java b/src/main/java/org/apache/sling/models/impl/injectors/SelfInjector.java
index 9439d6d..d59192f 100644
--- a/src/main/java/org/apache/sling/models/impl/injectors/SelfInjector.java
+++ b/src/main/java/org/apache/sling/models/impl/injectors/SelfInjector.java
@@ -62,6 +62,7 @@
}
@Override
+ @SuppressWarnings({ "unused", "null" })
public InjectAnnotationProcessor2 createAnnotationProcessor(AnnotatedElement element) {
// check if the element has the expected annotation
Self annotation = element.getAnnotation(Self.class);
@@ -83,7 +84,7 @@
public InjectionStrategy getInjectionStrategy() {
return annotation.injectionStrategy();
}
-
+
@Override
@SuppressWarnings("deprecation")
public Boolean isOptional() {
diff --git a/src/main/java/org/apache/sling/models/impl/injectors/SlingObjectInjector.java b/src/main/java/org/apache/sling/models/impl/injectors/SlingObjectInjector.java
index 0f9124d..f582ad8 100644
--- a/src/main/java/org/apache/sling/models/impl/injectors/SlingObjectInjector.java
+++ b/src/main/java/org/apache/sling/models/impl/injectors/SlingObjectInjector.java
@@ -122,6 +122,7 @@
}
@Override
+ @SuppressWarnings({ "unused", "null" })
public InjectAnnotationProcessor2 createAnnotationProcessor(final AnnotatedElement element) {
// check if the element has the expected annotation
SlingObject annotation = element.getAnnotation(SlingObject.class);
@@ -143,7 +144,7 @@
public InjectionStrategy getInjectionStrategy() {
return annotation.injectionStrategy();
}
-
+
@Override
@SuppressWarnings("deprecation")
public Boolean isOptional() {
diff --git a/src/main/java/org/apache/sling/models/impl/injectors/ValueMapInjector.java b/src/main/java/org/apache/sling/models/impl/injectors/ValueMapInjector.java
index f24b367..1a36844 100644
--- a/src/main/java/org/apache/sling/models/impl/injectors/ValueMapInjector.java
+++ b/src/main/java/org/apache/sling/models/impl/injectors/ValueMapInjector.java
@@ -27,7 +27,6 @@
import org.apache.commons.lang3.ClassUtils;
import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.StringUtils;
-import org.apache.sling.api.SlingHttpServletRequest;
import org.apache.sling.api.resource.ValueMap;
import org.apache.sling.models.annotations.injectorspecific.InjectionStrategy;
import org.apache.sling.models.annotations.injectorspecific.ValueMapValue;
@@ -55,6 +54,7 @@
}
@Override
+ @SuppressWarnings({ "unused", "null" })
public Object getValue(@NotNull Object adaptable, String name, @NotNull Type type, @NotNull AnnotatedElement element,
@NotNull DisposalCallbackRegistry callbackRegistry) {
if (adaptable == ObjectUtils.NULL) {
@@ -135,12 +135,13 @@
}
@Override
- public Object prepareValue(final Object adaptable) {
+ public @NotNull Object prepareValue(final @NotNull Object adaptable) {
Object prepared = getValueMap(adaptable);
return prepared != null ? prepared : ObjectUtils.NULL;
}
@Override
+ @SuppressWarnings({ "unused", "null" })
public InjectAnnotationProcessor createAnnotationProcessor(Object adaptable, AnnotatedElement element) {
// check if the element has the expected annotation
ValueMapValue annotation = element.getAnnotation(ValueMapValue.class);
@@ -154,11 +155,8 @@
private final ValueMapValue annotation;
- private final Object adaptable;
-
public ValueAnnotationProcessor(ValueMapValue annotation, Object adaptable) {
this.annotation = annotation;
- this.adaptable = adaptable;
}
@Override
@@ -176,12 +174,7 @@
if (StringUtils.isNotBlank(annotation.via())) {
return annotation.via();
}
- // automatically go via resource, if this is the httprequest
- if (adaptable instanceof SlingHttpServletRequest) {
- return "resource";
- } else {
- return null;
- }
+ return null;
}
@Override
diff --git a/src/main/java/org/apache/sling/models/impl/model/AbstractInjectableElement.java b/src/main/java/org/apache/sling/models/impl/model/AbstractInjectableElement.java
index ebc0189..72ccb18 100644
--- a/src/main/java/org/apache/sling/models/impl/model/AbstractInjectableElement.java
+++ b/src/main/java/org/apache/sling/models/impl/model/AbstractInjectableElement.java
@@ -83,6 +83,7 @@
return null;
}
+ @SuppressWarnings("unused")
private static String getName(AnnotatedElement element, String defaultName, InjectAnnotationProcessor2 annotationProcessor) {
String name = null;
if (annotationProcessor != null) {
@@ -100,6 +101,7 @@
return name;
}
+ @SuppressWarnings("unused")
private static String getSource(AnnotatedElement element) {
Source source = ReflectionUtil.getAnnotation(element, Source.class);
if (source != null) {
@@ -133,6 +135,7 @@
return element.isAnnotationPresent(Default.class);
}
+ @SuppressWarnings("unused")
private static Object getDefaultValue(AnnotatedElement element, Type type, InjectAnnotationProcessor2 annotationProcessor) {
if (annotationProcessor != null && annotationProcessor.hasDefault()) {
return annotationProcessor.getDefault();
diff --git a/src/main/java/org/apache/sling/models/impl/model/ConstructorParameter.java b/src/main/java/org/apache/sling/models/impl/model/ConstructorParameter.java
index 72baeff..2eb525c 100644
--- a/src/main/java/org/apache/sling/models/impl/model/ConstructorParameter.java
+++ b/src/main/java/org/apache/sling/models/impl/model/ConstructorParameter.java
@@ -58,21 +58,21 @@
public boolean isPrimitive() {
return isPrimitive;
}
-
+
public int getParameterIndex() {
return this.parameterIndex;
}
-
+
@Override
public String toString() {
return "Parameter" + this.parameterIndex + "[" + this.genericType.toString() + "]";
}
public static class FakeAnnotatedElement implements AnnotatedElement {
-
+
private final Annotation[] annotations;
private final int parameterIndex;
-
+
public FakeAnnotatedElement(Annotation[] annotations, int parameterIndex) {
this.annotations = annotations;
this.parameterIndex = parameterIndex;
@@ -83,7 +83,7 @@
return getAnnotation(paramClass) != null;
}
- @SuppressWarnings("unchecked")
+ @SuppressWarnings({ "unchecked", "null" })
@Override
public <T extends Annotation> T getAnnotation(Class<T> paramClass) {
for (Annotation annotation : this.annotations) {
@@ -103,7 +103,7 @@
public Annotation[] getDeclaredAnnotations() {
return annotations;
}
-
+
public int getParameterIndex() {
return this.parameterIndex;
}
@@ -115,5 +115,5 @@
}
}
-
+
}
diff --git a/src/main/java/org/apache/sling/models/impl/model/InjectableField.java b/src/main/java/org/apache/sling/models/impl/model/InjectableField.java
index ccf17d6..161b369 100644
--- a/src/main/java/org/apache/sling/models/impl/model/InjectableField.java
+++ b/src/main/java/org/apache/sling/models/impl/model/InjectableField.java
@@ -37,20 +37,11 @@
}
public RuntimeException set(Object createdObject, Result<Object> result) {
- synchronized (field) {
- boolean accessible = field.isAccessible();
- try {
- if (!accessible) {
- field.setAccessible(true);
- }
- field.set(createdObject, result.getValue());
- } catch (Exception e) {
- return new ModelClassException("Could not inject field due to reflection issues", e);
- } finally {
- if (!accessible) {
- field.setAccessible(false);
- }
- }
+ try {
+ field.setAccessible(true);
+ field.set(createdObject, result.getValue());
+ } catch (Exception e) {
+ return new ModelClassException("Could not inject field due to reflection issues", e);
}
return null;
}
diff --git a/src/main/java/org/apache/sling/models/impl/model/ModelClass.java b/src/main/java/org/apache/sling/models/impl/model/ModelClass.java
index 6c17e47..4f81a62 100644
--- a/src/main/java/org/apache/sling/models/impl/model/ModelClass.java
+++ b/src/main/java/org/apache/sling/models/impl/model/ModelClass.java
@@ -34,7 +34,7 @@
private final Class<ModelType> type;
private final Model modelAnnotation;
final DefaultInjectionStrategy defaultInjectionStrategy;
- private volatile ModelClassConstructor<?>[] constructors;
+ private volatile ModelClassConstructor<ModelType>[] constructors;
private volatile InjectableField[] injectableFields;
private volatile InjectableMethod[] injectableMethods;
@@ -60,18 +60,18 @@
}
@SuppressWarnings("unchecked")
- private static ModelClassConstructor<?>[] getConstructors(Class<?> type, StaticInjectAnnotationProcessorFactory[] processorFactories, DefaultInjectionStrategy defaultInjectionStrategy) {
+ private static <T> ModelClassConstructor<T>[] getConstructors(Class<T> type, StaticInjectAnnotationProcessorFactory[] processorFactories, DefaultInjectionStrategy defaultInjectionStrategy) {
if (type.isInterface()) {
return new ModelClassConstructor[0];
}
- Constructor<?>[] constructors = type.getConstructors();
+ Constructor<T>[] constructors = (Constructor<T>[]) type.getDeclaredConstructors();
// sort the constructor list in order from most params to least params, and constructors with @Inject annotation first
Arrays.sort(constructors, new ParameterCountInjectComparator());
- ModelClassConstructor<?>[] array = new ModelClassConstructor[constructors.length];
+ ModelClassConstructor<T>[] array = new ModelClassConstructor[constructors.length];
for (int i=0; i<array.length; i++) {
- array[i] = new ModelClassConstructor(constructors[i], processorFactories, defaultInjectionStrategy);
+ array[i] = new ModelClassConstructor<>(constructors[i], processorFactories, defaultInjectionStrategy);
}
return array;
}
@@ -112,7 +112,7 @@
return this.modelAnnotation != null;
}
- public ModelClassConstructor[] getConstructors() {
+ public ModelClassConstructor<ModelType>[] getConstructors() {
return constructors;
}
diff --git a/src/main/java/org/apache/sling/models/impl/model/ModelClassConstructor.java b/src/main/java/org/apache/sling/models/impl/model/ModelClassConstructor.java
index 4e9a047..23460be 100644
--- a/src/main/java/org/apache/sling/models/impl/model/ModelClassConstructor.java
+++ b/src/main/java/org/apache/sling/models/impl/model/ModelClassConstructor.java
@@ -19,6 +19,7 @@
package org.apache.sling.models.impl.model;
import java.lang.reflect.Constructor;
+import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Type;
import javax.inject.Inject;
@@ -27,13 +28,13 @@
import org.apache.sling.models.impl.ReflectionUtil;
import org.apache.sling.models.spi.injectorspecific.StaticInjectAnnotationProcessorFactory;
-public class ModelClassConstructor<ModelType> {
+public class ModelClassConstructor<M> {
- private final Constructor<ModelType> constructor;
+ private final Constructor<M> constructor;
private final boolean hasInjectAnnotation;
private final ConstructorParameter[] constructorParametersArray;
- public ModelClassConstructor(Constructor<ModelType> constructor, StaticInjectAnnotationProcessorFactory[] processorFactories, DefaultInjectionStrategy defaultInjectionStrategy) {
+ public ModelClassConstructor(Constructor<M> constructor, StaticInjectAnnotationProcessorFactory[] processorFactories, DefaultInjectionStrategy defaultInjectionStrategy) {
this.constructor = constructor;
this.hasInjectAnnotation = constructor.isAnnotationPresent(Inject.class);
@@ -49,10 +50,32 @@
}
}
- public Constructor<ModelType> getConstructor() {
+ /**
+ * Proxies the call to {@link Constructor#newInstance(Object...)}, checking (and
+ * setting) accessibility first.
+ *
+ * @param parameters
+ * the constructor parameters that are passed to
+ * {@link Constructor#newInstance(Object...)}
+ * @return The constructed object
+ *
+ * @throws InstantiationException when {@link Constructor#newInstance(Object...)} would throw
+ * @throws IllegalAccessException when {@link Constructor#newInstance(Object...)} would throw
+ * @throws IllegalArgumentException when {@link Constructor#newInstance(Object...)} would throw
+ * @throws InvocationTargetException when {@link Constructor#newInstance(Object...)} would throw
+ *
+ * @see Constructor#newInstance(Object...)
+ */
+ @SuppressWarnings({"java:S3011","java:S1874"})
+ public M newInstance(Object... parameters) throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
+ constructor.setAccessible(true);
+ return constructor.newInstance(parameters);
+ }
+
+ public Constructor<M> getConstructor() {
return constructor;
}
-
+
public boolean hasInjectAnnotation() {
return hasInjectAnnotation;
}
@@ -60,5 +83,5 @@
public ConstructorParameter[] getConstructorParameters() {
return constructorParametersArray;
};
-
+
}
diff --git a/src/main/java/org/apache/sling/models/impl/via/AbstractResourceTypeViaProvider.java b/src/main/java/org/apache/sling/models/impl/via/AbstractResourceTypeViaProvider.java
index 8d09a7c..ecacb3d 100644
--- a/src/main/java/org/apache/sling/models/impl/via/AbstractResourceTypeViaProvider.java
+++ b/src/main/java/org/apache/sling/models/impl/via/AbstractResourceTypeViaProvider.java
@@ -18,8 +18,6 @@
import org.apache.sling.api.SlingHttpServletRequest;
import org.apache.sling.api.resource.Resource;
-import org.apache.sling.api.resource.ResourceWrapper;
-import org.apache.sling.api.wrappers.SlingHttpServletRequestWrapper;
import org.apache.sling.models.spi.ViaProvider;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -65,33 +63,4 @@
protected abstract @Nullable String getResourceType(@NotNull Resource resource, @NotNull String value);
- private class ResourceTypeForcingResourceWrapper extends ResourceWrapper {
-
- private final String resourceType;
-
- private ResourceTypeForcingResourceWrapper(Resource resource, String resourceType) {
- super(resource);
- this.resourceType = resourceType;
- }
-
- @Override
- public String getResourceType() {
- return resourceType;
- }
- }
-
- private class ResourceTypeForcingRequestWrapper extends SlingHttpServletRequestWrapper {
-
- private final Resource resource;
-
- private ResourceTypeForcingRequestWrapper(SlingHttpServletRequest request, Resource resource, String resourceType) {
- super(request);
- this.resource = new ResourceTypeForcingResourceWrapper(resource, resourceType);
- }
-
- @Override
- public Resource getResource() {
- return resource;
- }
- }
}
diff --git a/src/main/java/org/apache/sling/models/impl/via/OriginalResourceTypeViaProvider.java b/src/main/java/org/apache/sling/models/impl/via/OriginalResourceTypeViaProvider.java
new file mode 100644
index 0000000..00ef495
--- /dev/null
+++ b/src/main/java/org/apache/sling/models/impl/via/OriginalResourceTypeViaProvider.java
@@ -0,0 +1,62 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.sling.models.impl.via;
+
+import org.apache.sling.api.SlingHttpServletRequest;
+import org.apache.sling.api.resource.Resource;
+import org.apache.sling.models.annotations.ViaProviderType;
+import org.apache.sling.models.annotations.via.OriginalResourceType;
+import org.apache.sling.models.spi.ViaProvider;
+import org.osgi.service.component.annotations.Component;
+
+/**
+ * This {@link ViaProvider} implements the counterpart of the {@link ForcedResourceTypeViaProvider} and the
+ * {@link ResourceSuperTypeViaProvider}. It is in particular helpful in models that want to inject another model using the original
+ * {@link Resource}'s or {@link SlingHttpServletRequest}'s resource type instead of the one forced by either of the above-mentioned
+ * {@link ViaProvider}s
+ * <p>
+ * The implementation simply unwraps the {@link org.apache.sling.api.resource.ResourceWrapper} or
+ * {@link org.apache.sling.api.wrappers.SlingHttpServletRequestWrapper} used by the {@link ForcedResourceTypeViaProvider} and
+ * {@link ResourceSuperTypeViaProvider}.
+ */
+@Component
+public class OriginalResourceTypeViaProvider implements ViaProvider {
+
+ @Override
+ public Class<? extends ViaProviderType> getType() {
+ return OriginalResourceType.class;
+ }
+
+ @Override
+ public Object getAdaptable(Object original, String value) {
+ if (original instanceof SlingHttpServletRequest) {
+ SlingHttpServletRequest originalRequest = (SlingHttpServletRequest) original;
+ while (originalRequest instanceof ResourceTypeForcingRequestWrapper) {
+ originalRequest = ((ResourceTypeForcingRequestWrapper) originalRequest).getSlingRequest();
+ }
+ return originalRequest;
+ } else if (original instanceof Resource) {
+ Resource originalResource = (Resource) original;
+ while (originalResource instanceof ResourceTypeForcingResourceWrapper) {
+ originalResource = ((ResourceTypeForcingResourceWrapper) originalResource).getResource();
+ }
+ return originalResource;
+ } else {
+ return null;
+ }
+ }
+}
diff --git a/src/main/java/org/apache/sling/models/impl/via/ResourceTypeForcingRequestWrapper.java b/src/main/java/org/apache/sling/models/impl/via/ResourceTypeForcingRequestWrapper.java
new file mode 100644
index 0000000..9a57490
--- /dev/null
+++ b/src/main/java/org/apache/sling/models/impl/via/ResourceTypeForcingRequestWrapper.java
@@ -0,0 +1,36 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.sling.models.impl.via;
+
+import org.apache.sling.api.SlingHttpServletRequest;
+import org.apache.sling.api.resource.Resource;
+import org.apache.sling.api.wrappers.SlingHttpServletRequestWrapper;
+
+class ResourceTypeForcingRequestWrapper extends SlingHttpServletRequestWrapper {
+
+ private final Resource resource;
+
+ ResourceTypeForcingRequestWrapper(SlingHttpServletRequest request, Resource resource, String resourceType) {
+ super(request);
+ this.resource = new ResourceTypeForcingResourceWrapper(resource, resourceType);
+ }
+
+ @Override
+ public Resource getResource() {
+ return resource;
+ }
+}
diff --git a/src/main/java/org/apache/sling/models/impl/via/ResourceTypeForcingResourceWrapper.java b/src/main/java/org/apache/sling/models/impl/via/ResourceTypeForcingResourceWrapper.java
new file mode 100644
index 0000000..beff897
--- /dev/null
+++ b/src/main/java/org/apache/sling/models/impl/via/ResourceTypeForcingResourceWrapper.java
@@ -0,0 +1,35 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.sling.models.impl.via;
+
+import org.apache.sling.api.resource.Resource;
+import org.apache.sling.api.resource.ResourceWrapper;
+
+class ResourceTypeForcingResourceWrapper extends ResourceWrapper {
+
+ private final String resourceType;
+
+ ResourceTypeForcingResourceWrapper(Resource resource, String resourceType) {
+ super(resource);
+ this.resourceType = resourceType;
+ }
+
+ @Override
+ public String getResourceType() {
+ return resourceType;
+ }
+}
diff --git a/src/test/java/org/apache/sling/models/impl/AdapterFactoryTest.java b/src/test/java/org/apache/sling/models/impl/AdapterFactoryTest.java
index 409c449..8b20b31 100644
--- a/src/test/java/org/apache/sling/models/impl/AdapterFactoryTest.java
+++ b/src/test/java/org/apache/sling/models/impl/AdapterFactoryTest.java
@@ -19,8 +19,6 @@
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
-import java.lang.reflect.Field;
-import java.lang.reflect.Modifier;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
@@ -53,7 +51,7 @@
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.Mockito;
-import org.mockito.runners.MockitoJUnitRunner;
+import org.mockito.junit.MockitoJUnitRunner;
import org.osgi.framework.BundleContext;
import org.osgi.service.component.ComponentContext;
import org.osgi.util.converter.Converter;
@@ -74,7 +72,7 @@
BundleContext bundleContext = Mockito.mock(BundleContext.class);
return createModelAdapterFactory(bundleContext);
}
-
+
public static ModelAdapterFactory createModelAdapterFactory(BundleContext bundleContext) {
ComponentContext componentCtx = Mockito.mock(ComponentContext.class);
when(componentCtx.getBundleContext()).thenReturn(bundleContext);
@@ -292,7 +290,7 @@
}
}
- @Test
+ @Test
public void testCreateCachedModelWillNotCrashTheVMWithOOM() throws Exception {
/*
* LOAD_FACTOR is used to ensure the test will try create instances of the model to fill up
@@ -300,36 +298,27 @@
* exhausted, should this test fail.
*/
double LOAD_FACTOR = 2.0;
- long instanceSize = sizeOf(new CachedModelWithSelfReference());
+ /*
+ * SIZE_OF_LONG is the same as Long.BYTES, in Java 8. When Java 8 source & target are used, this
+ * can be removed and replaced with Long.BYTES.
+ */
+ long SIZE_OF_LONG = 8;
+ /*
+ * instanceSize is an underestimate of the actual size, based on the number of longs in the array.
+ * This works for this test, because we want it to try to OOM the VM, and having more instances is
+ * better. The smaller instanceSize is, the more instances we try to create (see the calculation for
+ * maxInstances below).
+ */
+ long instanceSize = SIZE_OF_LONG * CachedModelWithSelfReference.numberOfLongs;
long maxHeapSize = Runtime.getRuntime().maxMemory();
long maxInstances = (long) ((maxHeapSize / instanceSize) * LOAD_FACTOR);
-
+
for (long i = 0; i < maxInstances; i++) {
- factory.createModel(mock(SlingHttpServletRequest.class), CachedModelWithSelfReference.class);
- }
- }
-
- @SuppressWarnings({ "restriction", "rawtypes" })
- public static long sizeOf(Object o) throws Exception {
- Class<sun.misc.Unsafe> unsafeClass = sun.misc.Unsafe.class;
- Field unsafeField = unsafeClass.getDeclaredField("theUnsafe");
- unsafeField.setAccessible(true);
- sun.misc.Unsafe theUnsafe = (sun.misc.Unsafe) unsafeField.get(unsafeClass);
-
- long maxSize = 0;
- Class c = o.getClass();
- while (c != Object.class) {
- for (Field f : c.getDeclaredFields()) {
- if ((f.getModifiers() & Modifier.STATIC) == 0) {
- long offset = theUnsafe.objectFieldOffset(f);
- if (offset > maxSize) {
- maxSize = offset;
- }
- }
+ CachedModelWithSelfReference model =
+ factory.createModel(mock(SlingHttpServletRequest.class), CachedModelWithSelfReference.class);
+ for (int j = 0; j < model.longs.length; j++) {
+ model.longs[j] = j;
}
- c = c.getSuperclass();
}
-
- return ((maxSize/8) + 1) * 8;
}
}
diff --git a/src/test/java/org/apache/sling/models/impl/AdapterImplementationsTest.java b/src/test/java/org/apache/sling/models/impl/AdapterImplementationsTest.java
index 10c761c..ddb5071 100644
--- a/src/test/java/org/apache/sling/models/impl/AdapterImplementationsTest.java
+++ b/src/test/java/org/apache/sling/models/impl/AdapterImplementationsTest.java
@@ -20,6 +20,7 @@
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
+import static org.mockito.Mockito.lenient;
import static org.mockito.Mockito.when;
import java.util.Arrays;
@@ -29,18 +30,19 @@
import org.apache.sling.api.resource.ResourceResolver;
import org.apache.sling.models.spi.ImplementationPicker;
import org.apache.sling.testing.mock.osgi.MockOsgi;
+import org.jetbrains.annotations.NotNull;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
-import org.mockito.runners.MockitoJUnitRunner;
+import org.mockito.junit.MockitoJUnitRunner;
import org.osgi.framework.BundleContext;
@RunWith(MockitoJUnitRunner.class)
public class AdapterImplementationsTest {
private static final Class<?> SAMPLE_ADAPTER = Comparable.class;
- private static final Object SAMPLE_ADAPTABLE = new Object();
+ private static final Object SAMPLE_ADAPTABLE = new Object();
private AdapterImplementations underTest;
@@ -55,7 +57,7 @@
@Mock
private ResourceResolver resourceResolver;
-
+
@Before
public void setUp() {
underTest = new AdapterImplementations();
@@ -63,21 +65,21 @@
new FirstImplementationPicker()
}));
}
-
+
@Test
public void testNoMapping() {
assertNull(underTest.lookup(SAMPLE_ADAPTER, SAMPLE_ADAPTABLE));
-
+
// make sure this raises no exception
underTest.remove(SAMPLE_ADAPTER.getName(), String.class.getName());
}
-
+
@Test
public void testSingleMapping() {
underTest.addAll(String.class, SAMPLE_ADAPTER);
-
+
assertEquals(String.class, underTest.lookup(SAMPLE_ADAPTER, SAMPLE_ADAPTABLE).getType());
-
+
underTest.remove(SAMPLE_ADAPTER.getName(), String.class.getName());
assertNull(underTest.lookup(SAMPLE_ADAPTER, SAMPLE_ADAPTABLE));
@@ -88,30 +90,30 @@
underTest.addAll(String.class, SAMPLE_ADAPTER);
underTest.addAll(Integer.class, SAMPLE_ADAPTER);
underTest.addAll(Long.class, SAMPLE_ADAPTER);
-
+
assertEquals(Integer.class, underTest.lookup(SAMPLE_ADAPTER, SAMPLE_ADAPTABLE).getType());
-
+
underTest.remove(SAMPLE_ADAPTER.getName(), Integer.class.getName());
assertEquals(Long.class, underTest.lookup(SAMPLE_ADAPTER, SAMPLE_ADAPTABLE).getType());
underTest.remove(SAMPLE_ADAPTER.getName(), Long.class.getName());
underTest.remove(SAMPLE_ADAPTER.getName(), String.class.getName());
-
+
assertNull(underTest.lookup(SAMPLE_ADAPTER, SAMPLE_ADAPTABLE));
}
-
+
@Test
public void testRemoveAll() {
underTest.addAll(String.class, SAMPLE_ADAPTER);
underTest.addAll(Integer.class, SAMPLE_ADAPTER);
underTest.addAll(Long.class, SAMPLE_ADAPTER);
-
+
underTest.removeAll();
-
+
assertNull(underTest.lookup(SAMPLE_ADAPTER, SAMPLE_ADAPTABLE));
}
-
+
@Test
public void testMultipleImplementationPickers() {
underTest.setImplementationPickers(Arrays.asList(
@@ -123,14 +125,14 @@
underTest.addAll(String.class, SAMPLE_ADAPTER);
underTest.addAll(Integer.class, SAMPLE_ADAPTER);
underTest.addAll(Long.class, SAMPLE_ADAPTER);
-
+
assertEquals(String.class, underTest.lookup(SAMPLE_ADAPTER, SAMPLE_ADAPTABLE).getType());
}
-
+
@Test
public void testSimpleModel() {
underTest.addAll(SAMPLE_ADAPTER, SAMPLE_ADAPTER);
-
+
assertEquals(SAMPLE_ADAPTER, underTest.lookup(SAMPLE_ADAPTER, SAMPLE_ADAPTABLE).getType());
}
@@ -243,29 +245,29 @@
assertNull(underTest.getModelClassForRequest(request));
assertNull(underTest.getModelClassForResource(resource));
}
-
+
@Test
public void testResourceTypeRegistrationForResourceWithoutResourceType() {
- when(resource.getResourceType()).thenReturn(null);
- when(resource.getResourceResolver()).thenReturn(resourceResolver);
- when(resourceResolver.getSearchPath()).thenReturn(new String[] { "/apps/", "/libs/" });
+ lenient().when(resource.getResourceType()).thenReturn(null);
+ lenient().when(resource.getResourceResolver()).thenReturn(resourceResolver);
+ lenient().when(resourceResolver.getSearchPath()).thenReturn(new String[] { "/apps/", "/libs/" });
// ensure we don't have any registrations and no exception is thrown
assertNull(underTest.getModelClassForResource(resource));
}
-
+
static final class NoneImplementationPicker implements ImplementationPicker {
@Override
- public Class<?> pick(Class<?> adapterType, Class<?>[] implementationsTypes, Object adaptable) {
+ public Class<?> pick(@NotNull Class<?> adapterType, Class<?> @NotNull [] implementationsTypes, @NotNull Object adaptable) {
return null;
- }
+ }
}
-
+
static final class LastImplementationPicker implements ImplementationPicker {
@Override
- public Class<?> pick(Class<?> adapterType, Class<?>[] implementationsTypes, Object adaptable) {
+ public Class<?> pick(@NotNull Class<?> adapterType, Class<?> @NotNull [] implementationsTypes, @NotNull Object adaptable) {
return implementationsTypes[implementationsTypes.length - 1];
- }
+ }
}
-
+
}
diff --git a/src/test/java/org/apache/sling/models/impl/AnnotationConflictsTest.java b/src/test/java/org/apache/sling/models/impl/AnnotationConflictsTest.java
index f4e0a9d..7d74428 100644
--- a/src/test/java/org/apache/sling/models/impl/AnnotationConflictsTest.java
+++ b/src/test/java/org/apache/sling/models/impl/AnnotationConflictsTest.java
@@ -43,7 +43,7 @@
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
-import org.mockito.runners.MockitoJUnitRunner;
+import org.mockito.junit.MockitoJUnitRunner;
@SuppressWarnings("deprecation")
@RunWith(MockitoJUnitRunner.class)
diff --git a/src/test/java/org/apache/sling/models/impl/CachingTest.java b/src/test/java/org/apache/sling/models/impl/CachingTest.java
index f8d9d4a..e02eb44 100644
--- a/src/test/java/org/apache/sling/models/impl/CachingTest.java
+++ b/src/test/java/org/apache/sling/models/impl/CachingTest.java
@@ -17,26 +17,49 @@
package org.apache.sling.models.impl;
import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.assertNotSame;
+import static org.junit.Assert.assertSame;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
-import org.apache.sling.api.SlingHttpServletRequest;
+import java.util.Collections;
+import java.util.Enumeration;
+
+import org.apache.sling.api.resource.Resource;
+import org.apache.sling.api.resource.ValueMap;
+import org.apache.sling.api.wrappers.SlingHttpServletRequestWrapper;
+import org.apache.sling.api.wrappers.ValueMapDecorator;
import org.apache.sling.models.impl.injectors.RequestAttributeInjector;
+import org.apache.sling.models.impl.injectors.ValueMapInjector;
+import org.apache.sling.models.spi.ImplementationPicker;
import org.apache.sling.models.testmodels.classes.CachedModel;
+import org.apache.sling.models.testmodels.classes.CachedModelWithAdapterTypes12;
+import org.apache.sling.models.testmodels.classes.CachedModelWithAdapterTypes23;
import org.apache.sling.models.testmodels.classes.UncachedModel;
+import org.apache.sling.models.testmodels.interfaces.AdapterType1;
+import org.apache.sling.models.testmodels.interfaces.AdapterType2;
+import org.apache.sling.models.testmodels.interfaces.AdapterType3;
+import org.apache.sling.servlethelpers.MockSlingHttpServletRequest;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
-import org.mockito.runners.MockitoJUnitRunner;
+import org.mockito.Spy;
+import org.mockito.junit.MockitoJUnitRunner;
@RunWith(MockitoJUnitRunner.class)
public class CachingTest {
+ @Spy
+ private MockSlingHttpServletRequest request = new MockSlingHttpServletRequest(null);
+
+ private SlingHttpServletRequestWrapper requestWrapper;
+
@Mock
- private SlingHttpServletRequest request;
+ private Resource resource;
private ModelAdapterFactory factory;
@@ -44,10 +67,24 @@
public void setup() {
factory = AdapterFactoryTest.createModelAdapterFactory();
factory.bindInjector(new RequestAttributeInjector(), new ServicePropertiesMap(0, 0));
- factory.adapterImplementations.addClassesAsAdapterAndImplementation(CachedModel.class, UncachedModel.class,
- org.apache.sling.models.testmodels.interfaces.CachedModel.class, org.apache.sling.models.testmodels.interfaces.UncachedModel.class);
+ factory.bindInjector(new ValueMapInjector(), new ServicePropertiesMap(1, 1));
+ factory.adapterImplementations.addClassesAsAdapterAndImplementation(
+ CachedModel.class,
+ UncachedModel.class,
+ org.apache.sling.models.testmodels.interfaces.CachedModel.class,
+ org.apache.sling.models.testmodels.interfaces.UncachedModel.class);
+ factory.adapterImplementations.addAll(
+ CachedModelWithAdapterTypes12.class,
+ CachedModelWithAdapterTypes12.class, AdapterType1.class, AdapterType2.class);
+ factory.adapterImplementations.addAll(
+ CachedModelWithAdapterTypes23.class,
+ CachedModelWithAdapterTypes23.class, AdapterType2.class, AdapterType3.class);
when(request.getAttribute("testValue")).thenReturn("test");
+ requestWrapper = new SlingHttpServletRequestWrapper(request);
+
+ ValueMap vm = new ValueMapDecorator(Collections.singletonMap("testValue", "test"));
+ when(resource.adaptTo(ValueMap.class)).thenReturn(vm);
}
@Test
@@ -55,7 +92,7 @@
CachedModel cached1 = factory.getAdapter(request, CachedModel.class);
CachedModel cached2 = factory.getAdapter(request, CachedModel.class);
- assertTrue(cached1 == cached2);
+ assertSame(cached1, cached2);
assertEquals("test", cached1.getTestValue());
assertEquals("test", cached2.getTestValue());
@@ -63,11 +100,23 @@
}
@Test
+ public void testCachedClassWithResource() {
+ CachedModel cached1 = factory.getAdapter(resource, CachedModel.class);
+ CachedModel cached2 = factory.getAdapter(resource, CachedModel.class);
+
+ assertSame(cached1, cached2);
+ assertEquals("test", cached1.getTestValue());
+ assertEquals("test", cached2.getTestValue());
+
+ verify(resource, times(1)).adaptTo(ValueMap.class);
+ }
+
+ @Test
public void testNoCachedClass() {
UncachedModel uncached1 = factory.getAdapter(request, UncachedModel.class);
UncachedModel uncached2 = factory.getAdapter(request, UncachedModel.class);
- assertTrue(uncached1 != uncached2);
+ assertNotSame(uncached1, uncached2);
assertEquals("test", uncached1.getTestValue());
assertEquals("test", uncached2.getTestValue());
@@ -75,11 +124,25 @@
}
@Test
- public void testCachedInterface() {
- org.apache.sling.models.testmodels.interfaces.CachedModel cached1 = factory.getAdapter(request, org.apache.sling.models.testmodels.interfaces.CachedModel.class);
- org.apache.sling.models.testmodels.interfaces.CachedModel cached2 = factory.getAdapter(request, org.apache.sling.models.testmodels.interfaces.CachedModel.class);
+ public void testNoCachedClassWithResource() {
+ UncachedModel uncached1 = factory.getAdapter(resource, UncachedModel.class);
+ UncachedModel uncached2 = factory.getAdapter(resource, UncachedModel.class);
- assertTrue(cached1 == cached2);
+ assertNotSame(uncached1, uncached2);
+ assertEquals("test", uncached1.getTestValue());
+ assertEquals("test", uncached2.getTestValue());
+
+ verify(resource, times(2)).adaptTo(ValueMap.class);
+ }
+
+ @Test
+ public void testCachedInterface() {
+ org.apache.sling.models.testmodels.interfaces.CachedModel cached1 = factory.getAdapter(request,
+ org.apache.sling.models.testmodels.interfaces.CachedModel.class);
+ org.apache.sling.models.testmodels.interfaces.CachedModel cached2 = factory.getAdapter(request,
+ org.apache.sling.models.testmodels.interfaces.CachedModel.class);
+
+ assertSame(cached1, cached2);
assertEquals("test", cached1.getTestValue());
assertEquals("test", cached2.getTestValue());
@@ -88,13 +151,77 @@
@Test
public void testNoCachedInterface() {
- org.apache.sling.models.testmodels.interfaces.UncachedModel uncached1 = factory.getAdapter(request, org.apache.sling.models.testmodels.interfaces.UncachedModel.class);
- org.apache.sling.models.testmodels.interfaces.UncachedModel uncached2 = factory.getAdapter(request, org.apache.sling.models.testmodels.interfaces.UncachedModel.class);
+ org.apache.sling.models.testmodels.interfaces.UncachedModel uncached1 = factory.getAdapter(request,
+ org.apache.sling.models.testmodels.interfaces.UncachedModel.class);
+ org.apache.sling.models.testmodels.interfaces.UncachedModel uncached2 = factory.getAdapter(request,
+ org.apache.sling.models.testmodels.interfaces.UncachedModel.class);
- assertTrue(uncached1 != uncached2);
+ assertNotSame(uncached1, uncached2);
assertEquals("test", uncached1.getTestValue());
assertEquals("test", uncached2.getTestValue());
verify(request, times(2)).getAttribute("testValue");
}
+
+ @Test
+ public void testCachedClassWithRequestWrapper() {
+ CachedModel cached1 = factory.getAdapter(request, CachedModel.class);
+ CachedModel cached2 = factory.getAdapter(requestWrapper, CachedModel.class);
+
+ assertSame(cached1, cached2);
+ assertEquals("test", cached1.getTestValue());
+ assertEquals("test", cached2.getTestValue());
+
+ verify(request, times(1)).getAttribute("testValue");
+
+ // If we clear the request attributes, the sling model is no longer cached
+ Enumeration<String> attributeNames = request.getAttributeNames();
+ while (attributeNames.hasMoreElements()) {
+ request.removeAttribute(attributeNames.nextElement());
+ }
+ CachedModel cached3 = factory.getAdapter(request, CachedModel.class);
+ assertNotSame(cached1, cached3);
+ }
+
+ @Test
+ public void testCachedInterfaceWithRequestWrapper() {
+ org.apache.sling.models.testmodels.interfaces.CachedModel cached1 = factory.getAdapter(request,
+ org.apache.sling.models.testmodels.interfaces.CachedModel.class);
+ org.apache.sling.models.testmodels.interfaces.CachedModel cached2 = factory.getAdapter(requestWrapper,
+ org.apache.sling.models.testmodels.interfaces.CachedModel.class);
+
+ assertSame(cached1, cached2);
+ assertEquals("test", cached1.getTestValue());
+ assertEquals("test", cached2.getTestValue());
+
+ verify(request, times(1)).getAttribute("testValue");
+ }
+
+ @Test
+ public void testCachedModelWithAdapterTypes() {
+ // test 2 model implementations that share a common adapter type, with an implementation picker that selects exactly one of the
+ // implementations for the common adapter type. verify that the models are cached accordingly
+ factory.bindImplementationPicker(
+ (adapterType, impls, adaptable) -> {
+ if (AdapterType1.class.equals(adapterType)) {
+ return CachedModelWithAdapterTypes12.class;
+ } else if (AdapterType2.class.equals(adapterType) || AdapterType3.class.equals(adapterType)) {
+ return CachedModelWithAdapterTypes23.class;
+ } else {
+ return null;
+ }
+ },
+ new ServicePropertiesMap(2, 0));
+
+ CachedModelWithAdapterTypes12 byImpl12 = factory.getAdapter(request, CachedModelWithAdapterTypes12.class);
+ CachedModelWithAdapterTypes23 byImpl23 = factory.getAdapter(request, CachedModelWithAdapterTypes23.class);
+ AdapterType1 byAdapterType1 = factory.getAdapter(request, AdapterType1.class);
+ AdapterType2 byAdapterType2 = factory.getAdapter(request, AdapterType2.class);
+ AdapterType3 byAdapterType3 = factory.getAdapter(request, AdapterType3.class);
+
+ assertSame(byImpl12, byAdapterType1);
+ assertSame(byImpl23, byAdapterType2);
+ assertSame(byImpl23, byAdapterType3);
+ }
}
+
diff --git a/src/test/java/org/apache/sling/models/impl/ConstructorTest.java b/src/test/java/org/apache/sling/models/impl/ConstructorTest.java
index ec62954..5507a5c 100644
--- a/src/test/java/org/apache/sling/models/impl/ConstructorTest.java
+++ b/src/test/java/org/apache/sling/models/impl/ConstructorTest.java
@@ -16,8 +16,13 @@
*/
package org.apache.sling.models.impl;
-import static org.junit.Assert.*;
-import static org.mockito.Mockito.*;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.fail;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
import java.util.ArrayList;
import java.util.List;
@@ -47,7 +52,7 @@
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
-import org.mockito.runners.MockitoJUnitRunner;
+import org.mockito.junit.MockitoJUnitRunner;
@RunWith(MockitoJUnitRunner.class)
public class ConstructorTest {
@@ -63,7 +68,7 @@
@Before
public void setup() {
-
+
when(request.getAttribute("attribute")).thenReturn(INT_VALUE);
when(request.getAttribute("attribute2")).thenReturn(STRING_VALUE);
@@ -145,6 +150,7 @@
class ModelCreator implements Callable<String> {
@Override
+ @SuppressWarnings("unused")
public String call() throws Exception {
try {
WithOneConstructorModel model = factory.getAdapter(request, WithOneConstructorModel.class);
@@ -190,6 +196,7 @@
}
@Test
+ @SuppressWarnings("null")
public void testViaInjectionModel() throws Exception {
Resource suffixResource = mock(Resource.class);
when(suffixResource.getPath()).thenReturn("/the/suffix");
diff --git a/src/test/java/org/apache/sling/models/impl/ConstructorVisibilityTest.java b/src/test/java/org/apache/sling/models/impl/ConstructorVisibilityTest.java
new file mode 100644
index 0000000..b1c449f
--- /dev/null
+++ b/src/test/java/org/apache/sling/models/impl/ConstructorVisibilityTest.java
@@ -0,0 +1,65 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.sling.models.impl;
+
+import static org.junit.Assert.assertNotNull;
+
+import org.apache.sling.api.SlingHttpServletRequest;
+import org.apache.sling.models.impl.injectors.RequestAttributeInjector;
+import org.apache.sling.models.impl.injectors.SelfInjector;
+import org.apache.sling.models.testmodels.classes.constructorvisibility.PackagePrivateConstructorModel;
+import org.apache.sling.models.testmodels.classes.constructorvisibility.PrivateConstructorModel;
+import org.apache.sling.models.testmodels.classes.constructorvisibility.ProtectedConstructorModel;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.junit.MockitoJUnitRunner;
+
+@RunWith(MockitoJUnitRunner.class)
+public class ConstructorVisibilityTest {
+ private ModelAdapterFactory factory;
+
+ @Mock
+ private SlingHttpServletRequest request;
+
+ @Before
+ public void setup() {
+ factory = AdapterFactoryTest.createModelAdapterFactory();
+ factory.bindInjector(new RequestAttributeInjector(), new ServicePropertiesMap(1, 1));
+ factory.bindInjector(new SelfInjector(), new ServicePropertiesMap(2, 2));
+ factory.adapterImplementations.addClassesAsAdapterAndImplementation(ProtectedConstructorModel.class, PackagePrivateConstructorModel.class, PrivateConstructorModel.class);
+ }
+
+ @Test
+ public void testNonPublicConstructorProtectedModel() {
+ ProtectedConstructorModel model = factory.createModel(request, ProtectedConstructorModel.class);
+ assertNotNull(model);
+ }
+
+ @Test
+ public void testNonPublicConstructorPackagePrivateModel() {
+ PackagePrivateConstructorModel model = factory.createModel(request, PackagePrivateConstructorModel.class);
+ assertNotNull(model);
+ }
+
+ @Test
+ public void testNonPublicConstructorPrivateModel() {
+ PrivateConstructorModel model = factory.createModel(request, PrivateConstructorModel.class);
+ assertNotNull(model);
+ }
+}
diff --git a/src/test/java/org/apache/sling/models/impl/CustomInjectorTest.java b/src/test/java/org/apache/sling/models/impl/CustomInjectorTest.java
index d737674..c84c714 100644
--- a/src/test/java/org/apache/sling/models/impl/CustomInjectorTest.java
+++ b/src/test/java/org/apache/sling/models/impl/CustomInjectorTest.java
@@ -31,7 +31,7 @@
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
-import org.mockito.runners.MockitoJUnitRunner;
+import org.mockito.junit.MockitoJUnitRunner;
@SuppressWarnings("deprecation")
@RunWith(MockitoJUnitRunner.class)
diff --git a/src/test/java/org/apache/sling/models/impl/DefaultInterfaceMethodTest.java b/src/test/java/org/apache/sling/models/impl/DefaultInterfaceMethodTest.java
new file mode 100644
index 0000000..5798c67
--- /dev/null
+++ b/src/test/java/org/apache/sling/models/impl/DefaultInterfaceMethodTest.java
@@ -0,0 +1,66 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.sling.models.impl;
+
+import org.apache.sling.api.resource.Resource;
+import org.apache.sling.api.resource.ValueMap;
+import org.apache.sling.api.wrappers.ValueMapDecorator;
+import org.apache.sling.models.impl.injectors.ValueMapInjector;
+import org.apache.sling.models.testmodels.interfaces.ModelWithDefaultMethods;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.util.Collections;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+import static org.mockito.Mockito.lenient;
+import static org.mockito.Mockito.mock;
+
+public class DefaultInterfaceMethodTest {
+
+ private ModelAdapterFactory factory;
+
+ @Before
+ public void setup() {
+ factory = AdapterFactoryTest.createModelAdapterFactory();
+ factory.bindInjector(new ValueMapInjector(), new ServicePropertiesMap(0, 0));
+ factory.adapterImplementations.addClassesAsAdapterAndImplementation(ModelWithDefaultMethods.class);
+ }
+
+ @Test
+ public void testDefaultInterfaceMethodsCanBeInjected() {
+ ValueMap vm = new ValueMapDecorator(Collections.singletonMap("prop", "the prop"));
+ Resource res = mock(Resource.class);
+ lenient().when(res.adaptTo(ValueMap.class)).thenReturn(vm);
+
+ ModelWithDefaultMethods model = factory.getAdapter(res,ModelWithDefaultMethods.class);
+
+ assertEquals("the prop", model.getProp());
+ }
+
+ @Test
+ public void testDefaultInterfaceMethodsDefaultImplementationsAreIgnored() {
+ ValueMap vm = new ValueMapDecorator(Collections.<String, Object>emptyMap());
+ Resource res = mock(Resource.class);
+ lenient().when(res.adaptTo(ValueMap.class)).thenReturn(vm);
+
+ ModelWithDefaultMethods model = factory.getAdapter(res,ModelWithDefaultMethods.class);
+
+ assertNull(model.getProp());
+ }
+}
diff --git a/src/test/java/org/apache/sling/models/impl/DefaultTest.java b/src/test/java/org/apache/sling/models/impl/DefaultTest.java
index 57e130d..4963853 100644
--- a/src/test/java/org/apache/sling/models/impl/DefaultTest.java
+++ b/src/test/java/org/apache/sling/models/impl/DefaultTest.java
@@ -20,6 +20,7 @@
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
+import static org.mockito.Mockito.lenient;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
@@ -37,7 +38,7 @@
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
-import org.mockito.runners.MockitoJUnitRunner;
+import org.mockito.junit.MockitoJUnitRunner;
@RunWith(MockitoJUnitRunner.class)
public class DefaultTest {
@@ -119,7 +120,7 @@
ValueMap vm = new ValueMapDecorator(Collections.<String, Object>emptyMap());
Resource res = mock(Resource.class);
- when(res.adaptTo(ValueMap.class)).thenReturn(vm);
+ lenient().when(res.adaptTo(ValueMap.class)).thenReturn(vm);
org.apache.sling.models.testmodels.classes.constructorinjection.DefaultStringModel model
= factory.getAdapter(res, org.apache.sling.models.testmodels.classes.constructorinjection.DefaultStringModel.class);
@@ -133,7 +134,7 @@
ValueMap vm = new ValueMapDecorator(Collections.<String, Object>emptyMap());
Resource res = mock(Resource.class);
- when(res.adaptTo(ValueMap.class)).thenReturn(vm);
+ lenient().when(res.adaptTo(ValueMap.class)).thenReturn(vm);
org.apache.sling.models.testmodels.classes.constructorinjection.DefaultPrimitivesModel model
= factory.getAdapter(res, org.apache.sling.models.testmodels.classes.constructorinjection.DefaultPrimitivesModel.class);
@@ -152,7 +153,7 @@
ValueMap vm = new ValueMapDecorator(Collections.<String, Object>emptyMap());
Resource res = mock(Resource.class);
- when(res.adaptTo(ValueMap.class)).thenReturn(vm);
+ lenient().when(res.adaptTo(ValueMap.class)).thenReturn(vm);
org.apache.sling.models.testmodels.classes.constructorinjection.DefaultWrappersModel model
= factory.getAdapter(res, org.apache.sling.models.testmodels.classes.constructorinjection.DefaultWrappersModel.class);
diff --git a/src/test/java/org/apache/sling/models/impl/ExtraDefaultTests.java b/src/test/java/org/apache/sling/models/impl/ExtraDefaultTests.java
index b55520c..03576be 100644
--- a/src/test/java/org/apache/sling/models/impl/ExtraDefaultTests.java
+++ b/src/test/java/org/apache/sling/models/impl/ExtraDefaultTests.java
@@ -28,7 +28,7 @@
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
-import org.mockito.runners.MockitoJUnitRunner;
+import org.mockito.junit.MockitoJUnitRunner;
@RunWith(MockitoJUnitRunner.class)
public class ExtraDefaultTests {
diff --git a/src/test/java/org/apache/sling/models/impl/ImplementsExtendsTest.java b/src/test/java/org/apache/sling/models/impl/ImplementsExtendsTest.java
index 1cd6cd9..3520722 100644
--- a/src/test/java/org/apache/sling/models/impl/ImplementsExtendsTest.java
+++ b/src/test/java/org/apache/sling/models/impl/ImplementsExtendsTest.java
@@ -19,10 +19,9 @@
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
-import static org.mockito.Matchers.any;
-import static org.mockito.Matchers.anyBoolean;
-import static org.mockito.Matchers.anyObject;
-import static org.mockito.Matchers.anyString;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyBoolean;
+import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
@@ -56,7 +55,7 @@
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.invocation.InvocationOnMock;
-import org.mockito.runners.MockitoJUnitRunner;
+import org.mockito.junit.MockitoJUnitRunner;
import org.mockito.stubbing.Answer;
import org.osgi.framework.Bundle;
import org.osgi.framework.BundleContext;
@@ -87,7 +86,7 @@
@SuppressWarnings("unchecked")
@Before
public void setup() throws ClassNotFoundException, MalformedURLException {
- when(bundleContext.registerService(anyString(), anyObject(), any(Dictionary.class))).then(new Answer<ServiceRegistration>() {
+ when(bundleContext.registerService(anyString(), any(), any(Dictionary.class))).then(new Answer<ServiceRegistration>() {
@Override
public ServiceRegistration<?> answer(InvocationOnMock invocation) throws Throwable {
final Dictionary<String, Object> props = (Dictionary<String, Object>)invocation.getArguments()[2];
@@ -132,7 +131,7 @@
}
});
- registeredAdapterFactories = (ServiceRegistration[])factory.listener.addingBundle(bundle, bundleEvent);
+ registeredAdapterFactories = factory.listener.addingBundle(bundle, bundleEvent);
}
private URL getClassUrl(Class<?> clazz) throws MalformedURLException {
@@ -144,14 +143,14 @@
public void tearDown() {
// simulate bundle remove for ModelPackageBundleListener
factory.listener.removedBundle(bundle, bundleEvent, registeredAdapterFactories);
-
+
// make sure adaption is not longer possible: implementation class mapping is removed
Resource res = getMockResourceWithProps();
try {
factory.getAdapter(res, SampleServiceInterface.class);
Assert.fail("Getting the model for interface 'SampleServiceInterface' should fail after the accroding adapter factory has been unregistered");
} catch (ModelClassException e) {
-
+
}
}
@@ -177,13 +176,13 @@
factory.unbindImplementationPicker(firstImplementationPicker, firstImplementationPickerProps);
Resource res = getMockResourceWithProps();
-
+
SampleServiceInterface model = factory.getAdapter(res, ImplementsInterfacePropertyModel.class);
assertNotNull(model);
assertEquals("first-value|null|third-value", model.getAllProperties());
assertTrue(factory.canCreateFromAdaptable(res, ImplementsInterfacePropertyModel.class));
}
-
+
/**
* Try to adapt in a case where there is no picker available.
* The case where the class is the adapter still works.
diff --git a/src/test/java/org/apache/sling/models/impl/InjectorSpecificAnnotationTest.java b/src/test/java/org/apache/sling/models/impl/InjectorSpecificAnnotationTest.java
index 29e7335..2b96c43 100644
--- a/src/test/java/org/apache/sling/models/impl/InjectorSpecificAnnotationTest.java
+++ b/src/test/java/org/apache/sling/models/impl/InjectorSpecificAnnotationTest.java
@@ -45,7 +45,7 @@
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.Mockito;
-import org.mockito.runners.MockitoJUnitRunner;
+import org.mockito.junit.MockitoJUnitRunner;
import org.osgi.framework.BundleContext;
import org.osgi.framework.Constants;
import org.osgi.framework.InvalidSyntaxException;
@@ -54,6 +54,7 @@
import org.slf4j.LoggerFactory;
@RunWith(MockitoJUnitRunner.class)
+@SuppressWarnings("deprecation")
public class InjectorSpecificAnnotationTest {
@Mock
@@ -148,6 +149,7 @@
}
@Test
+ @SuppressWarnings({ "unchecked", "null" })
public void testOSGiServiceField() throws InvalidSyntaxException {
ServiceReference ref = mock(ServiceReference.class);
Logger log = mock(Logger.class);
@@ -236,6 +238,7 @@
}
@Test
+ @SuppressWarnings({ "unchecked", "null" })
public void testOSGiServiceConstructor() throws InvalidSyntaxException {
ServiceReference ref = mock(ServiceReference.class);
Logger log = mock(Logger.class);
diff --git a/src/test/java/org/apache/sling/models/impl/InterfaceInheritanceTest.java b/src/test/java/org/apache/sling/models/impl/InterfaceInheritanceTest.java
index e9b97c7..66a54b5 100644
--- a/src/test/java/org/apache/sling/models/impl/InterfaceInheritanceTest.java
+++ b/src/test/java/org/apache/sling/models/impl/InterfaceInheritanceTest.java
@@ -35,7 +35,7 @@
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
-import org.mockito.runners.MockitoJUnitRunner;
+import org.mockito.junit.MockitoJUnitRunner;
@SuppressWarnings("deprecation")
@RunWith(MockitoJUnitRunner.class)
diff --git a/src/test/java/org/apache/sling/models/impl/InvalidAdaptationsTest.java b/src/test/java/org/apache/sling/models/impl/InvalidAdaptationsTest.java
index 50b9fe7..eb6e151 100644
--- a/src/test/java/org/apache/sling/models/impl/InvalidAdaptationsTest.java
+++ b/src/test/java/org/apache/sling/models/impl/InvalidAdaptationsTest.java
@@ -17,8 +17,8 @@
package org.apache.sling.models.impl;
import static org.junit.Assert.assertNull;
+import static org.mockito.Mockito.lenient;
import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
import java.util.Collections;
import java.util.Map;
@@ -35,7 +35,7 @@
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
-import org.mockito.runners.MockitoJUnitRunner;
+import org.mockito.junit.MockitoJUnitRunner;
@RunWith(MockitoJUnitRunner.class)
public class InvalidAdaptationsTest {
@@ -54,7 +54,7 @@
Map<String, Object> emptyMap = Collections.<String, Object> emptyMap();
Resource res = mock(Resource.class);
- when(res.adaptTo(ValueMap.class)).thenReturn(new ValueMapDecorator(emptyMap));
+ lenient().when(res.adaptTo(ValueMap.class)).thenReturn(new ValueMapDecorator(emptyMap));
assertNull(factory.getAdapter(res, NonModel.class));
}
@@ -64,7 +64,7 @@
Map<String, Object> emptyMap = Collections.<String, Object> emptyMap();
Resource res = mock(Resource.class);
- when(res.adaptTo(ValueMap.class)).thenReturn(new ValueMapDecorator(emptyMap));
+ lenient().when(res.adaptTo(ValueMap.class)).thenReturn(new ValueMapDecorator(emptyMap));
assertNull(factory.createModel(res, NonModel.class));
}
@@ -74,7 +74,7 @@
Map<String, Object> emptyMap = Collections.<String, Object> emptyMap();
Resource res = mock(Resource.class);
- when(res.adaptTo(ValueMap.class)).thenReturn(new ValueMapDecorator(emptyMap));
+ lenient().when(res.adaptTo(ValueMap.class)).thenReturn(new ValueMapDecorator(emptyMap));
assertNull(factory.getAdapter(res, RequestModel.class));
}
@@ -84,7 +84,7 @@
Map<String, Object> emptyMap = Collections.<String, Object> emptyMap();
Resource res = mock(Resource.class);
- when(res.adaptTo(ValueMap.class)).thenReturn(new ValueMapDecorator(emptyMap));
+ lenient().when(res.adaptTo(ValueMap.class)).thenReturn(new ValueMapDecorator(emptyMap));
assertNull(factory.createModel(res, RequestModel.class));
}
diff --git a/src/test/java/org/apache/sling/models/impl/ModelPackageBundleListenerTest.java b/src/test/java/org/apache/sling/models/impl/ModelPackageBundleListenerTest.java
new file mode 100644
index 0000000..0872409
--- /dev/null
+++ b/src/test/java/org/apache/sling/models/impl/ModelPackageBundleListenerTest.java
@@ -0,0 +1,114 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.sling.models.impl;
+
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Dictionary;
+import java.util.Hashtable;
+
+import org.apache.sling.models.testmodels.classes.ChildModel;
+import org.apache.sling.models.testmodels.classes.SimpleModelWithInvalidSecondAnnotation;
+import org.apache.sling.models.testmodels.classes.annotations.Hidden;
+import org.junit.Assert;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.invocation.InvocationOnMock;
+import org.mockito.junit.MockitoJUnitRunner;
+import org.mockito.stubbing.Answer;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.BundleEvent;
+import org.springframework.core.OverridingClassLoader;
+
+@RunWith(MockitoJUnitRunner.class)
+public class ModelPackageBundleListenerTest {
+
+ @Mock
+ private BundleContext mockBundleContext;
+
+ @Mock
+ private ModelAdapterFactory mockModelAdapterFactory;
+
+ @Mock
+ private Bundle mockBundle;
+
+ final AdapterImplementations adapterImplementations = new AdapterImplementations();
+
+ /**
+ * ClassLoader which doesn't delegate to the parent. In addition it blocks loading certain classes.
+ */
+ private static final class HideClassesClassLoader extends OverridingClassLoader {
+
+ private final Collection<String> classNamesToHide;
+ public HideClassesClassLoader(ClassLoader parent, String... classNamesToHide) {
+ super(parent);
+ this.classNamesToHide = Arrays.asList(classNamesToHide);
+ //Exclude Hidden class since its loading via default class loader and throws ClassNotFoundException in line:70
+ this.excludeClass(Hidden.class.getName());
+ }
+
+ @Override
+ protected Class<?> loadClassForOverriding(String name) throws ClassNotFoundException {
+ if (classNamesToHide.contains(name)) {
+ throw new ClassNotFoundException("Could not find class " + name + " as it is hidden by this class loader!");
+ }
+ return super.loadClassForOverriding(name);
+ }
+ }
+
+ @Test
+ public void testAddingBundleWithResolvableModelAnnotation() throws ClassNotFoundException {
+ Assert.assertFalse("Model should not yet have been registered but was", adapterImplementations.isModelClass(ChildModel.class));
+ ModelPackageBundleListener listener = createListenerForBundleWithClass(ChildModel.class);
+ listener.addingBundle(mockBundle, new BundleEvent(BundleEvent.STARTED, mockBundle));
+ Assert.assertTrue("Model should have been registered but was not", adapterImplementations.isModelClass(ChildModel.class));
+ }
+
+ @Test
+ public void testAddingBundleWithNonResolvableNonModelAnnotation() throws ClassNotFoundException {
+ ClassLoader classLoader = new HideClassesClassLoader(this.getClass().getClassLoader(), Hidden.class.getName());
+ ModelPackageBundleListener listener = createListenerForBundleWithClass(classLoader, SimpleModelWithInvalidSecondAnnotation.class.getName());
+ listener.addingBundle(mockBundle, new BundleEvent(BundleEvent.STARTED, mockBundle));
+ Assert.assertFalse("Model should not yet have been registered but was", adapterImplementations.isModelClass(SimpleModelWithInvalidSecondAnnotation.class));
+ }
+
+ private ModelPackageBundleListener createListenerForBundleWithClass(Class<?> modelClass) throws ClassNotFoundException {
+ return createListenerForBundleWithClass(modelClass.getClassLoader(), modelClass.getName());
+ }
+
+ private ModelPackageBundleListener createListenerForBundleWithClass(ClassLoader classLoader, String className) throws ClassNotFoundException {
+ Dictionary<String, String> headers = new Hashtable<>();
+ headers.put(ModelPackageBundleListener.CLASSES_HEADER, className);
+ Mockito.when(mockBundle.getHeaders()).thenReturn(headers);
+ Mockito.when(mockBundle.loadClass(Mockito.anyString())).thenAnswer(new Answer<Class<?>>(){
+ @Override
+ public Class<?>answer(InvocationOnMock invocation) throws Throwable {
+ Object argument = invocation.getArguments()[0];
+ if (argument.equals(className)) {
+ return classLoader.loadClass(className);
+ } else {
+ throw new ClassNotFoundException("Could not find class with name " + argument);
+ }
+ }
+ });
+ return new ModelPackageBundleListener(mockBundleContext, mockModelAdapterFactory, adapterImplementations, null, null);
+ }
+
+}
diff --git a/src/test/java/org/apache/sling/models/impl/MultipleInjectorTest.java b/src/test/java/org/apache/sling/models/impl/MultipleInjectorTest.java
index 6b70827..64da4c8 100644
--- a/src/test/java/org/apache/sling/models/impl/MultipleInjectorTest.java
+++ b/src/test/java/org/apache/sling/models/impl/MultipleInjectorTest.java
@@ -19,6 +19,7 @@
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
+import static org.mockito.Mockito.lenient;
import static org.mockito.Mockito.when;
import javax.inject.Inject;
@@ -35,7 +36,7 @@
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.Spy;
-import org.mockito.runners.MockitoJUnitRunner;
+import org.mockito.junit.MockitoJUnitRunner;
@RunWith(MockitoJUnitRunner.class)
public class MultipleInjectorTest {
@@ -74,7 +75,7 @@
bindings.put("firstAttribute", bindingsValue);
String attributeValue = "attribute value";
- when(request.getAttribute("firstAttribute")).thenReturn(attributeValue);
+ lenient().when(request.getAttribute("firstAttribute")).thenReturn(attributeValue);
ForTwoInjectors obj = factory.getAdapter(request, ForTwoInjectors.class);
diff --git a/src/test/java/org/apache/sling/models/impl/OSGiInjectionTest.java b/src/test/java/org/apache/sling/models/impl/OSGiInjectionTest.java
index 2b8149e..044b7c6 100644
--- a/src/test/java/org/apache/sling/models/impl/OSGiInjectionTest.java
+++ b/src/test/java/org/apache/sling/models/impl/OSGiInjectionTest.java
@@ -16,12 +16,13 @@
*/
package org.apache.sling.models.impl;
+import static org.hamcrest.MatcherAssert.assertThat;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertThat;
-import static org.mockito.Matchers.any;
-import static org.mockito.Matchers.eq;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.lenient;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyNoMoreInteractions;
@@ -48,7 +49,7 @@
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
-import org.mockito.runners.MockitoJUnitRunner;
+import org.mockito.junit.MockitoJUnitRunner;
import org.osgi.framework.BundleContext;
import org.osgi.framework.BundleListener;
import org.osgi.framework.ServiceReference;
@@ -78,6 +79,7 @@
}
@Test
+ @SuppressWarnings({ "unchecked", "null" })
public void testSimpleOSGiModelField() throws Exception {
ServiceReference ref = mock(ServiceReference.class);
ServiceInterface service = mock(ServiceInterface.class);
@@ -96,6 +98,7 @@
}
@Test
+ @SuppressWarnings({ "unchecked", "null" })
public void testListOSGiModelField() throws Exception {
ServiceReference ref1 = mock(ServiceReference.class);
ServiceInterface service1 = mock(ServiceInterface.class);
@@ -120,6 +123,7 @@
}
@Test
+ @SuppressWarnings({ "unchecked", "null" })
public void testArrayOSGiModelField() throws Exception {
ServiceReference ref1 = mock(ServiceReference.class);
ServiceInterface service1 = mock(ServiceInterface.class);
@@ -144,6 +148,7 @@
}
@Test
+ @SuppressWarnings("null")
public void testOptionalArrayOSGiModelField() throws Exception {
Resource res = mock(Resource.class);
@@ -156,6 +161,7 @@
}
@Test
+ @SuppressWarnings("null")
public void testOptionalListOSGiModelField() throws Exception {
Resource res = mock(Resource.class);
@@ -167,6 +173,7 @@
}
@Test
+ @SuppressWarnings({ "unchecked", "null" })
public void testCollectionOSGiModelField() throws Exception {
ServiceReference ref1 = mock(ServiceReference.class);
ServiceInterface service1 = mock(ServiceInterface.class);
@@ -191,15 +198,16 @@
}
@Test
+ @SuppressWarnings({ "unused", "unchecked", "null" })
public void testSetOSGiModelField() throws Exception {
ServiceReference ref1 = mock(ServiceReference.class);
ServiceInterface service1 = mock(ServiceInterface.class);
- when(bundleContext.getService(ref1)).thenReturn(service1);
+ lenient().when(bundleContext.getService(ref1)).thenReturn(service1);
ServiceReference ref2 = mock(ServiceReference.class);
ServiceInterface service2 = mock(ServiceInterface.class);
- when(bundleContext.getService(ref2)).thenReturn(service2);
+ lenient().when(bundleContext.getService(ref2)).thenReturn(service2);
- when(bundleContext.getServiceReferences(ServiceInterface.class.getName(), null)).thenReturn(
+ lenient().when(bundleContext.getServiceReferences(ServiceInterface.class.getName(), null)).thenReturn(
new ServiceReference[] { ref1, ref2 });
Resource res = mock(Resource.class);
@@ -216,6 +224,7 @@
}
@Test
+ @SuppressWarnings({ "unchecked", "null" })
public void testSimpleOSGiModelConstructor() throws Exception {
ServiceReference ref = mock(ServiceReference.class);
ServiceInterface service = mock(ServiceInterface.class);
@@ -235,6 +244,7 @@
}
@Test
+ @SuppressWarnings({ "unchecked", "null" })
public void testListOSGiModelConstructor() throws Exception {
ServiceReference ref1 = mock(ServiceReference.class);
ServiceInterface service1 = mock(ServiceInterface.class);
diff --git a/src/test/java/org/apache/sling/models/impl/OptionalPrimitivesTest.java b/src/test/java/org/apache/sling/models/impl/OptionalPrimitivesTest.java
index 3c98943..c98e954 100644
--- a/src/test/java/org/apache/sling/models/impl/OptionalPrimitivesTest.java
+++ b/src/test/java/org/apache/sling/models/impl/OptionalPrimitivesTest.java
@@ -19,6 +19,7 @@
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
+import static org.mockito.Mockito.lenient;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
@@ -29,7 +30,7 @@
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
-import org.mockito.runners.MockitoJUnitRunner;
+import org.mockito.junit.MockitoJUnitRunner;
/**
* Validates that @Optional annotations works with primitive values which do not support null
@@ -84,7 +85,7 @@
ValueMap vm = ValueMap.EMPTY;
Resource res = mock(Resource.class);
- when(res.adaptTo(ValueMap.class)).thenReturn(vm);
+ lenient().when(res.adaptTo(ValueMap.class)).thenReturn(vm);
org.apache.sling.models.testmodels.classes.constructorinjection.OptionalPrimitivesModel model
= factory.getAdapter(res, org.apache.sling.models.testmodels.classes.constructorinjection.OptionalPrimitivesModel.class);
@@ -116,7 +117,7 @@
ValueMap vm = ValueMap.EMPTY;
Resource res = mock(Resource.class);
- when(res.adaptTo(ValueMap.class)).thenReturn(vm);
+ lenient().when(res.adaptTo(ValueMap.class)).thenReturn(vm);
org.apache.sling.models.testmodels.interfaces.OptionalPrimitivesModel model
= factory.getAdapter(res, org.apache.sling.models.testmodels.interfaces.OptionalPrimitivesModel.class);
diff --git a/src/test/java/org/apache/sling/models/impl/ParameterizedTypeFromRequestAttributeTest.java b/src/test/java/org/apache/sling/models/impl/ParameterizedTypeFromRequestAttributeTest.java
index 5396a64..6564e7b 100644
--- a/src/test/java/org/apache/sling/models/impl/ParameterizedTypeFromRequestAttributeTest.java
+++ b/src/test/java/org/apache/sling/models/impl/ParameterizedTypeFromRequestAttributeTest.java
@@ -35,7 +35,7 @@
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
-import org.mockito.runners.MockitoJUnitRunner;
+import org.mockito.junit.MockitoJUnitRunner;
@RunWith(MockitoJUnitRunner.class)
public class ParameterizedTypeFromRequestAttributeTest {
diff --git a/src/test/java/org/apache/sling/models/impl/PostConstructTest.java b/src/test/java/org/apache/sling/models/impl/PostConstructTest.java
index 5fb8045..a6eaeb3 100644
--- a/src/test/java/org/apache/sling/models/impl/PostConstructTest.java
+++ b/src/test/java/org/apache/sling/models/impl/PostConstructTest.java
@@ -19,20 +19,21 @@
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertSame;
import static org.junit.Assert.assertTrue;
import org.apache.sling.api.resource.Resource;
import org.apache.sling.models.factory.PostConstructException;
-import org.apache.sling.models.testmodels.classes.FailingPostConstuctModel;
-import org.apache.sling.models.testmodels.classes.FalsePostConstuctModel;
+import org.apache.sling.models.testmodels.classes.FailingPostConstructModel;
+import org.apache.sling.models.testmodels.classes.FalsePostConstructModel;
import org.apache.sling.models.testmodels.classes.SubClass;
import org.apache.sling.models.testmodels.classes.SubClassOverriddenPostConstruct;
-import org.apache.sling.models.testmodels.classes.TruePostConstuctModel;
+import org.apache.sling.models.testmodels.classes.TruePostConstructModel;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
-import org.mockito.runners.MockitoJUnitRunner;
+import org.mockito.junit.MockitoJUnitRunner;
@RunWith(MockitoJUnitRunner.class)
public class PostConstructTest {
@@ -46,7 +47,7 @@
public void setup() {
factory = AdapterFactoryTest.createModelAdapterFactory();
// no injectors are necessary
- factory.adapterImplementations.addClassesAsAdapterAndImplementation(SubClass.class, SubClassOverriddenPostConstruct.class, FailingPostConstuctModel.class, FalsePostConstuctModel.class, TruePostConstuctModel.class);
+ factory.adapterImplementations.addClassesAsAdapterAndImplementation(SubClass.class, SubClassOverriddenPostConstruct.class, FailingPostConstructModel.class, FalsePostConstructModel.class, TruePostConstructModel.class);
}
@Test
@@ -65,30 +66,34 @@
@Test
public void testPostConstructMethodWhichThrowsException() {
- FailingPostConstuctModel model = factory.getAdapter(resource, FailingPostConstuctModel.class);
+ FailingPostConstructModel model = factory.getAdapter(resource, FailingPostConstructModel.class);
assertNull(model);
}
@Test
public void testPostConstructMethodWhichReturnsFalse() {
- FalsePostConstuctModel model = factory.getAdapter(resource, FalsePostConstuctModel.class);
+ FalsePostConstructModel model = factory.getAdapter(resource, FalsePostConstructModel.class);
assertNull(model);
}
@Test
public void testPostConstructMethodWhichReturnsTrue() {
- TruePostConstuctModel model = factory.getAdapter(resource, TruePostConstuctModel.class);
+ TruePostConstructModel model = factory.getAdapter(resource, TruePostConstructModel.class);
assertNotNull(model);
}
- @Test(expected = IllegalStateException.class)
+ @Test(expected = PostConstructException.class)
public void testPostConstructMethodWhichReturnsFalseCreateModel() {
- factory.createModel(resource, FalsePostConstuctModel.class);
+ factory.createModel(resource, FalsePostConstructModel.class);
+ }
+
+ public void testPostConstructMethodWhichReturnsFalseInternalCreateModel() {
+ assertSame(Result.POST_CONSTRUCT_PREVENTED_MODEL_CONSTRUCTION, factory.internalCreateModel(resource, FalsePostConstructModel.class));
}
@Test
public void testPostConstructMethodWhichReturnsTrueCreateModel() {
- TruePostConstuctModel model = factory.createModel(resource, TruePostConstuctModel.class);
+ TruePostConstructModel model = factory.createModel(resource, TruePostConstructModel.class);
assertNotNull(model);
}
@@ -96,7 +101,7 @@
public void testPostConstructMethodWhichThrowsExceptionThrowingException() {
boolean thrown = false;
try {
- factory.createModel(resource, FailingPostConstuctModel.class);
+ factory.createModel(resource, FailingPostConstructModel.class);
} catch (PostConstructException e) {
assertTrue(e.getMessage().contains("Post-construct"));
assertEquals("FAIL", e.getCause().getMessage());
diff --git a/src/test/java/org/apache/sling/models/impl/RequestDisposalTest.java b/src/test/java/org/apache/sling/models/impl/RequestDisposalTest.java
index 6967c6d..61e3e0f 100644
--- a/src/test/java/org/apache/sling/models/impl/RequestDisposalTest.java
+++ b/src/test/java/org/apache/sling/models/impl/RequestDisposalTest.java
@@ -16,6 +16,24 @@
*/
package org.apache.sling.models.impl;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.doAnswer;
+import static org.mockito.Mockito.when;
+
+import java.lang.reflect.AnnotatedElement;
+import java.lang.reflect.Type;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+import javax.inject.Inject;
+import javax.servlet.ServletContext;
+import javax.servlet.ServletRequestEvent;
+
import org.apache.sling.api.SlingHttpServletRequest;
import org.apache.sling.api.resource.Resource;
import org.apache.sling.api.wrappers.SlingHttpServletRequestWrapper;
@@ -30,23 +48,9 @@
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.invocation.InvocationOnMock;
-import org.mockito.runners.MockitoJUnitRunner;
+import org.mockito.junit.MockitoJUnitRunner;
import org.mockito.stubbing.Answer;
-import javax.annotation.Nonnull;
-import javax.inject.Inject;
-import javax.servlet.ServletContext;
-import javax.servlet.ServletRequestEvent;
-import java.lang.reflect.AnnotatedElement;
-import java.lang.reflect.Type;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
-
-import static org.mockito.Mockito.*;
-import static org.junit.Assert.*;
-
@RunWith(MockitoJUnitRunner.class)
public class RequestDisposalTest {
@Mock
@@ -177,7 +181,7 @@
@Nullable
@Override
- public Object getValue(@Nonnull Object o, String s, @Nonnull Type type, @Nonnull AnnotatedElement annotatedElement, @Nonnull DisposalCallbackRegistry disposalCallbackRegistry) {
+ public Object getValue(@NotNull Object o, String s, @NotNull Type type, @NotNull AnnotatedElement annotatedElement, @NotNull DisposalCallbackRegistry disposalCallbackRegistry) {
TestDisposalCallback callback = new TestDisposalCallback();
callbacks.add(callback);
disposalCallbackRegistry.addDisposalCallback(callback);
diff --git a/src/test/java/org/apache/sling/models/impl/RequestInjectionTest.java b/src/test/java/org/apache/sling/models/impl/RequestInjectionTest.java
index 3b06844..41923a0 100644
--- a/src/test/java/org/apache/sling/models/impl/RequestInjectionTest.java
+++ b/src/test/java/org/apache/sling/models/impl/RequestInjectionTest.java
@@ -31,7 +31,7 @@
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
-import org.mockito.runners.MockitoJUnitRunner;
+import org.mockito.junit.MockitoJUnitRunner;
import org.slf4j.LoggerFactory;
@RunWith(MockitoJUnitRunner.class)
diff --git a/src/test/java/org/apache/sling/models/impl/RequestWrapperTest.java b/src/test/java/org/apache/sling/models/impl/RequestWrapperTest.java
index 68f7d3a..04bef4d 100644
--- a/src/test/java/org/apache/sling/models/impl/RequestWrapperTest.java
+++ b/src/test/java/org/apache/sling/models/impl/RequestWrapperTest.java
@@ -17,9 +17,9 @@
package org.apache.sling.models.impl;
import static org.junit.Assert.assertEquals;
-import static org.mockito.Matchers.any;
-import static org.mockito.Matchers.argThat;
-import static org.mockito.Matchers.eq;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.argThat;
+import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@@ -35,15 +35,13 @@
import org.apache.sling.api.scripting.SlingBindings;
import org.apache.sling.scripting.api.BindingsValuesProvider;
import org.apache.sling.scripting.api.BindingsValuesProvidersByContext;
-import org.hamcrest.Description;
-import org.hamcrest.Matcher;
-import org.hamcrest.TypeSafeMatcher;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
+import org.mockito.ArgumentMatcher;
import org.mockito.InjectMocks;
import org.mockito.Mock;
-import org.mockito.runners.MockitoJUnitRunner;
+import org.mockito.junit.MockitoJUnitRunner;
@RunWith(MockitoJUnitRunner.class)
public class RequestWrapperTest {
@@ -87,31 +85,21 @@
verify(bindingsValuesProvider, times(1)).addBindings(argThat(bindingsHasResource(resource)));
}
- private Matcher<Bindings> bindingsHasResource(final Resource resource) {
- return new TypeSafeMatcher<Bindings>() {
+ private ArgumentMatcher<Bindings> bindingsHasResource(final Resource resource) {
+ return new ArgumentMatcher<Bindings>() {
@Override
- protected boolean matchesSafely(Bindings bindings) {
+ public boolean matches(Bindings bindings) {
return bindings.get(SlingBindings.RESOURCE) == resource;
}
-
- @Override
- public void describeTo(Description description) {
- description.appendText("a bindings object with the resource " + resource);
- }
};
}
- private Matcher<SlingHttpServletRequest> requestHasResource(final Resource resource) {
- return new TypeSafeMatcher<SlingHttpServletRequest>() {
+ private ArgumentMatcher<SlingHttpServletRequest> requestHasResource(final Resource resource) {
+ return new ArgumentMatcher<SlingHttpServletRequest>() {
@Override
- protected boolean matchesSafely(SlingHttpServletRequest slingHttpServletRequest) {
+ public boolean matches(SlingHttpServletRequest slingHttpServletRequest) {
return slingHttpServletRequest.getResource().equals(resource);
}
-
- @Override
- public void describeTo(Description description) {
- description.appendText("a request with the resource " + resource);
- }
};
}
diff --git a/src/test/java/org/apache/sling/models/impl/ResourceModelClassesTest.java b/src/test/java/org/apache/sling/models/impl/ResourceModelClassesTest.java
index 96b62b7..8bbdbf8 100644
--- a/src/test/java/org/apache/sling/models/impl/ResourceModelClassesTest.java
+++ b/src/test/java/org/apache/sling/models/impl/ResourceModelClassesTest.java
@@ -20,6 +20,7 @@
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
+import static org.mockito.Mockito.lenient;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.times;
@@ -54,7 +55,7 @@
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.invocation.InvocationOnMock;
-import org.mockito.runners.MockitoJUnitRunner;
+import org.mockito.junit.MockitoJUnitRunner;
import org.mockito.stubbing.Answer;
@SuppressWarnings("deprecation")
@@ -166,6 +167,7 @@
assertEquals("hello", model.getStringList().get(0));
}
+ @SuppressWarnings({ "unused", "null" })
@Test
public void testRequiredPropertyModel() {
Map<String, Object> map = new HashMap<>();
@@ -204,6 +206,7 @@
verify(vm).get("required", String.class);
}
+ @SuppressWarnings({ "unused", "null" })
@Test
public void testRequiredPropertyMissingModelOptionalStrategy() {
Map<String, Object> map = new HashMap<>();
@@ -286,8 +289,8 @@
ValueMap firstMap = new ValueMapDecorator(Collections.singletonMap("property", firstValue));
final Resource firstChild = mock(Resource.class);
- when(firstChild.adaptTo(ValueMap.class)).thenReturn(firstMap);
- when(firstChild.adaptTo(ChildModel.class)).thenAnswer(new AdaptToChildModel());
+ lenient().when(firstChild.adaptTo(ValueMap.class)).thenReturn(firstMap);
+ lenient().when(firstChild.adaptTo(ChildModel.class)).thenAnswer(new AdaptToChildModel());
Object firstGrandChildValue = RandomStringUtils.randomAlphabetic(10);
ValueMap firstGrandChildMap = new ValueMapDecorator(Collections.singletonMap("property", firstGrandChildValue));
@@ -295,23 +298,23 @@
ValueMap secondGrandChildMap = new ValueMapDecorator(Collections.singletonMap("property", secondGrandChildValue));
final Resource firstGrandChild = mock(Resource.class);
- when(firstGrandChild.adaptTo(ValueMap.class)).thenReturn(firstGrandChildMap);
- when(firstGrandChild.adaptTo(ChildModel.class)).thenAnswer(new AdaptToChildModel());
+ lenient().when(firstGrandChild.adaptTo(ValueMap.class)).thenReturn(firstGrandChildMap);
+ lenient().when(firstGrandChild.adaptTo(ChildModel.class)).thenAnswer(new AdaptToChildModel());
final Resource secondGrandChild = mock(Resource.class);
- when(secondGrandChild.adaptTo(ValueMap.class)).thenReturn(secondGrandChildMap);
- when(secondGrandChild.adaptTo(ChildModel.class)).thenAnswer(new AdaptToChildModel());
+ lenient().when(secondGrandChild.adaptTo(ValueMap.class)).thenReturn(secondGrandChildMap);
+ lenient().when(secondGrandChild.adaptTo(ChildModel.class)).thenAnswer(new AdaptToChildModel());
Resource secondChild = mock(Resource.class);
- when(secondChild.listChildren()).thenReturn(Arrays.asList(firstGrandChild, secondGrandChild).iterator());
+ lenient().when(secondChild.listChildren()).thenReturn(Arrays.asList(firstGrandChild, secondGrandChild).iterator());
Resource emptyChild = mock(Resource.class);
- when(emptyChild.listChildren()).thenReturn(Collections.<Resource>emptySet().iterator());
+ lenient().when(emptyChild.listChildren()).thenReturn(Collections.<Resource>emptySet().iterator());
Resource res = mock(Resource.class);
- when(res.getChild("firstChild")).thenReturn(firstChild);
- when(res.getChild("secondChild")).thenReturn(secondChild);
- when(res.getChild("emptyChild")).thenReturn(emptyChild);
+ lenient().when(res.getChild("firstChild")).thenReturn(firstChild);
+ lenient().when(res.getChild("secondChild")).thenReturn(secondChild);
+ lenient().when(res.getChild("emptyChild")).thenReturn(emptyChild);
ParentModel model = factory.getAdapter(res, ParentModel.class);
assertNotNull(model);
diff --git a/src/test/java/org/apache/sling/models/impl/ResourceModelConstructorTest.java b/src/test/java/org/apache/sling/models/impl/ResourceModelConstructorTest.java
index 185671c..55164b9 100644
--- a/src/test/java/org/apache/sling/models/impl/ResourceModelConstructorTest.java
+++ b/src/test/java/org/apache/sling/models/impl/ResourceModelConstructorTest.java
@@ -18,8 +18,8 @@
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
+import static org.mockito.Mockito.lenient;
import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
import java.util.Arrays;
import java.util.Collections;
@@ -36,7 +36,7 @@
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.invocation.InvocationOnMock;
-import org.mockito.runners.MockitoJUnitRunner;
+import org.mockito.junit.MockitoJUnitRunner;
import org.mockito.stubbing.Answer;
@RunWith(MockitoJUnitRunner.class)
@@ -58,8 +58,8 @@
ValueMap firstMap = new ValueMapDecorator(Collections.singletonMap("property", firstValue));
final Resource firstChild = mock(Resource.class);
- when(firstChild.adaptTo(ValueMap.class)).thenReturn(firstMap);
- when(firstChild.adaptTo(ChildModel.class)).thenAnswer(new AdaptToChildModel());
+ lenient().when(firstChild.adaptTo(ValueMap.class)).thenReturn(firstMap);
+ lenient().when(firstChild.adaptTo(ChildModel.class)).thenAnswer(new AdaptToChildModel());
Object firstGrandChildValue = RandomStringUtils.randomAlphabetic(10);
ValueMap firstGrandChildMap = new ValueMapDecorator(Collections.singletonMap("property", firstGrandChildValue));
@@ -67,23 +67,23 @@
ValueMap secondGrandChildMap = new ValueMapDecorator(Collections.singletonMap("property", secondGrandChildValue));
final Resource firstGrandChild = mock(Resource.class);
- when(firstGrandChild.adaptTo(ValueMap.class)).thenReturn(firstGrandChildMap);
- when(firstGrandChild.adaptTo(ChildModel.class)).thenAnswer(new AdaptToChildModel());
+ lenient().when(firstGrandChild.adaptTo(ValueMap.class)).thenReturn(firstGrandChildMap);
+ lenient().when(firstGrandChild.adaptTo(ChildModel.class)).thenAnswer(new AdaptToChildModel());
final Resource secondGrandChild = mock(Resource.class);
- when(secondGrandChild.adaptTo(ValueMap.class)).thenReturn(secondGrandChildMap);
- when(secondGrandChild.adaptTo(ChildModel.class)).thenAnswer(new AdaptToChildModel());
+ lenient().when(secondGrandChild.adaptTo(ValueMap.class)).thenReturn(secondGrandChildMap);
+ lenient().when(secondGrandChild.adaptTo(ChildModel.class)).thenAnswer(new AdaptToChildModel());
Resource secondChild = mock(Resource.class);
- when(secondChild.listChildren()).thenReturn(Arrays.asList(firstGrandChild, secondGrandChild).iterator());
+ lenient().when(secondChild.listChildren()).thenReturn(Arrays.asList(firstGrandChild, secondGrandChild).iterator());
Resource emptyChild = mock(Resource.class);
- when(emptyChild.listChildren()).thenReturn(Collections.<Resource>emptySet().iterator());
+ lenient().when(emptyChild.listChildren()).thenReturn(Collections.<Resource>emptySet().iterator());
Resource res = mock(Resource.class);
- when(res.getChild("firstChild")).thenReturn(firstChild);
- when(res.getChild("secondChild")).thenReturn(secondChild);
- when(res.getChild("emptyChild")).thenReturn(emptyChild);
+ lenient().when(res.getChild("firstChild")).thenReturn(firstChild);
+ lenient().when(res.getChild("secondChild")).thenReturn(secondChild);
+ lenient().when(res.getChild("emptyChild")).thenReturn(emptyChild);
ParentModel model = factory.getAdapter(res, ParentModel.class);
assertNotNull(model);
diff --git a/src/test/java/org/apache/sling/models/impl/ResourceModelInterfacesTest.java b/src/test/java/org/apache/sling/models/impl/ResourceModelInterfacesTest.java
index 6ffcb5e..155aee9 100644
--- a/src/test/java/org/apache/sling/models/impl/ResourceModelInterfacesTest.java
+++ b/src/test/java/org/apache/sling/models/impl/ResourceModelInterfacesTest.java
@@ -20,6 +20,7 @@
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
+import static org.mockito.Mockito.lenient;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.times;
@@ -47,7 +48,7 @@
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.invocation.InvocationOnMock;
-import org.mockito.runners.MockitoJUnitRunner;
+import org.mockito.junit.MockitoJUnitRunner;
import org.mockito.stubbing.Answer;
@RunWith(MockitoJUnitRunner.class)
@@ -85,6 +86,7 @@
}
@Test
+ @SuppressWarnings({ "unused", "null" })
public void testRequiredPropertyModel() {
Map<String, Object> map = new HashMap<>();
map.put("first", "first-value");
@@ -134,8 +136,8 @@
ValueMap map = new ValueMapDecorator(props);
final Resource firstChild = mock(Resource.class);
- when(firstChild.adaptTo(ValueMap.class)).thenReturn(map);
- when(firstChild.adaptTo(ChildModel.class)).thenAnswer(new AdaptToChildModel());
+ lenient().when(firstChild.adaptTo(ValueMap.class)).thenReturn(map);
+ lenient().when(firstChild.adaptTo(ChildModel.class)).thenAnswer(new AdaptToChildModel());
Object firstGrandChildValue = RandomStringUtils.randomAlphabetic(10);
ValueMap firstGrandChildMap = new ValueMapDecorator(Collections.singletonMap("property", firstGrandChildValue));
@@ -143,23 +145,23 @@
ValueMap secondGrandChildMap = new ValueMapDecorator(Collections.singletonMap("property", secondGrandChildValue));
final Resource firstGrandChild = mock(Resource.class);
- when(firstGrandChild.adaptTo(ValueMap.class)).thenReturn(firstGrandChildMap);
- when(firstGrandChild.adaptTo(ChildModel.class)).thenAnswer(new AdaptToChildModel());
+ lenient().when(firstGrandChild.adaptTo(ValueMap.class)).thenReturn(firstGrandChildMap);
+ lenient().when(firstGrandChild.adaptTo(ChildModel.class)).thenAnswer(new AdaptToChildModel());
final Resource secondGrandChild = mock(Resource.class);
- when(secondGrandChild.adaptTo(ValueMap.class)).thenReturn(secondGrandChildMap);
- when(secondGrandChild.adaptTo(ChildModel.class)).thenAnswer(new AdaptToChildModel());
+ lenient().when(secondGrandChild.adaptTo(ValueMap.class)).thenReturn(secondGrandChildMap);
+ lenient().when(secondGrandChild.adaptTo(ChildModel.class)).thenAnswer(new AdaptToChildModel());
Resource secondChild = mock(Resource.class);
- when(secondChild.listChildren()).thenReturn(Arrays.asList(firstGrandChild, secondGrandChild).iterator());
+ lenient().when(secondChild.listChildren()).thenReturn(Arrays.asList(firstGrandChild, secondGrandChild).iterator());
Resource emptyChild = mock(Resource.class);
- when(emptyChild.listChildren()).thenReturn(Collections.<Resource>emptySet().iterator());
+ lenient().when(emptyChild.listChildren()).thenReturn(Collections.<Resource>emptySet().iterator());
Resource res = mock(Resource.class);
- when(res.getChild("firstChild")).thenReturn(firstChild);
- when(res.getChild("secondChild")).thenReturn(secondChild);
- when(res.getChild("emptyChild")).thenReturn(emptyChild);
+ lenient().when(res.getChild("firstChild")).thenReturn(firstChild);
+ lenient().when(res.getChild("secondChild")).thenReturn(secondChild);
+ lenient().when(res.getChild("emptyChild")).thenReturn(emptyChild);
ParentModel model = factory.getAdapter(res, ParentModel.class);
assertNotNull(model);
diff --git a/src/test/java/org/apache/sling/models/impl/ResourcePathInjectionTest.java b/src/test/java/org/apache/sling/models/impl/ResourcePathInjectionTest.java
index 686c23a..73d1d66 100644
--- a/src/test/java/org/apache/sling/models/impl/ResourcePathInjectionTest.java
+++ b/src/test/java/org/apache/sling/models/impl/ResourcePathInjectionTest.java
@@ -22,7 +22,9 @@
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
+import static org.mockito.Mockito.lenient;
import static org.mockito.Mockito.when;
+import static org.mockito.Mockito.doReturn;
import java.util.HashMap;
import java.util.List;
@@ -44,17 +46,17 @@
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
-import org.mockito.runners.MockitoJUnitRunner;
+import org.mockito.junit.MockitoJUnitRunner;
@RunWith(MockitoJUnitRunner.class)
public class ResourcePathInjectionTest {
private ModelAdapterFactory factory;
@Mock
- private Resource adaptable;
-
+ private Resource adaptableResource;
+
@Mock
- SlingHttpServletRequest nonResourceAdaptable;
+ SlingHttpServletRequest adaptableRequest;
@Mock
private Resource byPathResource;
@@ -79,7 +81,7 @@
String[] paths= new String[2];
paths[0]="/some/other/path";
paths[1]="/some/other/path2";
-
+
String[] invalidPaths= new String[3];
invalidPaths[0]="/does/not/exist";
invalidPaths[1]="/does/not/exist2";
@@ -89,14 +91,17 @@
ValueMap properties = new ValueMapDecorator(map);
- when(adaptable.getResourceResolver()).thenReturn(resourceResolver);
- when(adaptable.adaptTo(ValueMap.class)).thenReturn(properties);
+ when(adaptableResource.getResourceResolver()).thenReturn(resourceResolver);
+ when(adaptableResource.adaptTo(ValueMap.class)).thenReturn(properties);
when(resourceResolver.getResource("/some/path")).thenReturn(byPathResource);
when(resourceResolver.getResource("/some/path2")).thenReturn(byPathResource2);
when(resourceResolver.getResource("/some/other/path")).thenReturn(byPropertyValueResource);
when(resourceResolver.getResource("/some/other/path2")).thenReturn(byPropertyValueResource2);
+ when(adaptableRequest.getResource()).thenReturn(byPathResource);
+ when(adaptableRequest.getResourceResolver()).thenReturn(resourceResolver);
+
factory = AdapterFactoryTest.createModelAdapterFactory();
factory.bindInjector(new SelfInjector(), new ServicePropertiesMap(1, Integer.MAX_VALUE));
factory.bindInjector(new ValueMapInjector(), new ServicePropertiesMap(2, 2000));
@@ -107,8 +112,8 @@
}
@Test
- public void testPathInjection() {
- ResourcePathModel model = factory.getAdapter(adaptable, ResourcePathModel.class);
+ public void testPathInjectionFromResource() {
+ ResourcePathModel model = factory.getAdapter(adaptableResource, ResourcePathModel.class);
assertNotNull(model);
assertEquals(byPathResource, model.getFromPath());
assertEquals(byPropertyValueResource, model.getByDerefProperty());
@@ -117,15 +122,20 @@
}
@Test
- public void testPathInjectionWithNonResourceAdaptable() {
- ResourcePathModel model = factory.getAdapter(nonResourceAdaptable, ResourcePathModel.class);
- // should be null because mandatory fields could not be injected
- assertNull(model);
+ public void testPathInjectionFromRequest() {
+ // return the same properties through this request's resource, as through adaptableResource
+ doReturn(adaptableResource.adaptTo(ValueMap.class)).when(byPathResource).adaptTo(ValueMap.class);
+ ResourcePathModel model = factory.getAdapter(adaptableRequest, ResourcePathModel.class);
+ assertNotNull(model);
+ assertEquals(byPathResource, model.getFromPath());
+ assertEquals(byPropertyValueResource, model.getByDerefProperty());
+ assertEquals(byPathResource2, model.getFromPath2());
+ assertEquals(byPropertyValueResource2, model.getByDerefProperty2());
}
@Test
public void testOptionalPathInjectionWithNonResourceAdaptable() {
- ResourcePathAllOptionalModel model = factory.getAdapter(nonResourceAdaptable, ResourcePathAllOptionalModel.class);
+ ResourcePathAllOptionalModel model = factory.getAdapter(adaptableRequest, ResourcePathAllOptionalModel.class);
// should not be null because resource paths fields are optional
assertNotNull(model);
// but the field itself are null
@@ -137,7 +147,7 @@
@Test
public void testMultiplePathInjection() {
- ResourcePathModel model = factory.getAdapter(adaptable, ResourcePathModel.class);
+ ResourcePathModel model = factory.getAdapter(adaptableResource, ResourcePathModel.class);
assertNotNull(model);
List<Resource> resources=model.getMultipleResources();
assertNotNull(resources);
@@ -148,37 +158,37 @@
assertNotNull(resourcesFromPathAnnotation);
assertEquals(byPathResource, resourcesFromPathAnnotation.get(0));
assertEquals(byPathResource2, resourcesFromPathAnnotation.get(1));
-
+
List<Resource> resourcesFromResourcePathAnnotation= model.getManyFromPath2();
assertNotNull(resourcesFromResourcePathAnnotation);
assertEquals(byPathResource2, resourcesFromResourcePathAnnotation.get(0));
assertEquals(byPathResource, resourcesFromResourcePathAnnotation.get(1));
-
+
assertNotNull(model.getPropertyWithSeveralPaths());
assertEquals(byPropertyValueResource, model.getPropertyWithSeveralPaths().get(0));
assertEquals(byPropertyValueResource2, model.getPropertyWithSeveralPaths().get(1));
}
-
+
@Test
public void testPartialInjectionFailure1() {
when(resourceResolver.getResource("/some/other/path")).thenReturn(null);
-
- ResourcePathPartialModel model = factory.getAdapter(adaptable, ResourcePathPartialModel.class);
+
+ ResourcePathPartialModel model = factory.getAdapter(adaptableResource, ResourcePathPartialModel.class);
assertNull(model);
}
@Test
- public void testPartialInjectionFailure2() {
- when(resourceResolver.getResource("/some/other/path")).thenReturn(null);
- when(resourceResolver.getResource("/some/other/path2")).thenReturn(null);
-
- ResourcePathPartialModel model = factory.getAdapter(adaptable, ResourcePathPartialModel.class);
+ public void testPartialInjectionFailure2() {
+ lenient().when(resourceResolver.getResource("/some/other/path")).thenReturn(null);
+ lenient().when(resourceResolver.getResource("/some/other/path2")).thenReturn(null);
+
+ ResourcePathPartialModel model = factory.getAdapter(adaptableResource, ResourcePathPartialModel.class);
assertNull(model);
}
@Test
public void TestWithArrayWrapping() {
- ResourcePathModelWrapping model = factory.getAdapter(adaptable, ResourcePathModelWrapping.class);
+ ResourcePathModelWrapping model = factory.getAdapter(adaptableResource, ResourcePathModelWrapping.class);
assertNotNull(model);
assertTrue(model.getFromPath().length > 0);
assertTrue(model.getMultipleResources().length > 0);
diff --git a/src/test/java/org/apache/sling/models/impl/SelfDependencyTest.java b/src/test/java/org/apache/sling/models/impl/SelfDependencyTest.java
index 854bf5b..1f0973f 100644
--- a/src/test/java/org/apache/sling/models/impl/SelfDependencyTest.java
+++ b/src/test/java/org/apache/sling/models/impl/SelfDependencyTest.java
@@ -19,8 +19,8 @@
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertSame;
-import static org.mockito.Matchers.any;
-import static org.mockito.Mockito.when;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.lenient;
import org.apache.sling.api.SlingHttpServletRequest;
import org.apache.sling.models.impl.injectors.SelfInjector;
@@ -34,7 +34,7 @@
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.invocation.InvocationOnMock;
-import org.mockito.runners.MockitoJUnitRunner;
+import org.mockito.junit.MockitoJUnitRunner;
import org.mockito.stubbing.Answer;
@RunWith(MockitoJUnitRunner.class)
@@ -48,7 +48,7 @@
@SuppressWarnings("unchecked")
@Before
public void setup() {
- when(request.adaptTo(any(Class.class))).then(new Answer<Object>() {
+ lenient().when(request.adaptTo(any(Class.class))).then(new Answer<Object>() {
@Override
public Object answer(InvocationOnMock invocation) throws Throwable {
Class<?> clazz = (Class<?>) invocation.getArguments()[0];
diff --git a/src/test/java/org/apache/sling/models/impl/StaticInjectionAPFLoadOrderTest.java b/src/test/java/org/apache/sling/models/impl/StaticInjectionAPFLoadOrderTest.java
index 88ec8f3..24bcb63 100644
--- a/src/test/java/org/apache/sling/models/impl/StaticInjectionAPFLoadOrderTest.java
+++ b/src/test/java/org/apache/sling/models/impl/StaticInjectionAPFLoadOrderTest.java
@@ -37,7 +37,7 @@
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
-import org.mockito.runners.MockitoJUnitRunner;
+import org.mockito.junit.MockitoJUnitRunner;
/**
* Test load order behavior of StaticInjectionAnnotationProcesssorFactory instances (SLING-5010).
diff --git a/src/test/java/org/apache/sling/models/impl/ViaTest.java b/src/test/java/org/apache/sling/models/impl/ViaTest.java
index a72ac4e..e72a6b5 100644
--- a/src/test/java/org/apache/sling/models/impl/ViaTest.java
+++ b/src/test/java/org/apache/sling/models/impl/ViaTest.java
@@ -36,7 +36,7 @@
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
-import org.mockito.runners.MockitoJUnitRunner;
+import org.mockito.junit.MockitoJUnitRunner;
@RunWith(MockitoJUnitRunner.class)
public class ViaTest {
diff --git a/src/test/java/org/apache/sling/models/impl/injectors/BindingsInjectorTest.java b/src/test/java/org/apache/sling/models/impl/injectors/BindingsInjectorTest.java
index fe60ccb..b499079 100644
--- a/src/test/java/org/apache/sling/models/impl/injectors/BindingsInjectorTest.java
+++ b/src/test/java/org/apache/sling/models/impl/injectors/BindingsInjectorTest.java
@@ -32,7 +32,7 @@
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
-import org.mockito.runners.MockitoJUnitRunner;
+import org.mockito.junit.MockitoJUnitRunner;
@RunWith(MockitoJUnitRunner.class)
public class BindingsInjectorTest {
diff --git a/src/test/java/org/apache/sling/models/impl/injectors/RequestAttributeInjectorTest.java b/src/test/java/org/apache/sling/models/impl/injectors/RequestAttributeInjectorTest.java
index 5b9b581..a3ae8dc 100644
--- a/src/test/java/org/apache/sling/models/impl/injectors/RequestAttributeInjectorTest.java
+++ b/src/test/java/org/apache/sling/models/impl/injectors/RequestAttributeInjectorTest.java
@@ -31,7 +31,7 @@
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
-import org.mockito.runners.MockitoJUnitRunner;
+import org.mockito.junit.MockitoJUnitRunner;
@RunWith(MockitoJUnitRunner.class)
public class RequestAttributeInjectorTest {
diff --git a/src/test/java/org/apache/sling/models/impl/injectors/ResourceResolverInjectorTest.java b/src/test/java/org/apache/sling/models/impl/injectors/ResourceResolverInjectorTest.java
index a429e4c..f8776ce 100644
--- a/src/test/java/org/apache/sling/models/impl/injectors/ResourceResolverInjectorTest.java
+++ b/src/test/java/org/apache/sling/models/impl/injectors/ResourceResolverInjectorTest.java
@@ -31,7 +31,7 @@
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
-import org.mockito.runners.MockitoJUnitRunner;
+import org.mockito.junit.MockitoJUnitRunner;
/**
* This was a unit test for the ResourceResolverInjector which is now removed
diff --git a/src/test/java/org/apache/sling/models/impl/injectors/SelfInjectorTest.java b/src/test/java/org/apache/sling/models/impl/injectors/SelfInjectorTest.java
index 0d8b08b..02a790d 100644
--- a/src/test/java/org/apache/sling/models/impl/injectors/SelfInjectorTest.java
+++ b/src/test/java/org/apache/sling/models/impl/injectors/SelfInjectorTest.java
@@ -18,8 +18,10 @@
*/
package org.apache.sling.models.impl.injectors;
-import static org.junit.Assert.*;
-import static org.mockito.Mockito.*;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertSame;
+import static org.mockito.Mockito.lenient;
+import static org.mockito.Mockito.when;
import java.lang.annotation.Annotation;
import java.lang.reflect.AnnotatedElement;
@@ -38,7 +40,7 @@
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
-import org.mockito.runners.MockitoJUnitRunner;
+import org.mockito.junit.MockitoJUnitRunner;
@RunWith(MockitoJUnitRunner.class)
public class SelfInjectorTest {
@@ -50,19 +52,19 @@
@Mock
private AnnotatedElement annotatedElement;
-
+
@Mock
private Model modelAnnotation;
@Mock
private DisposalCallbackRegistry registry;
-
+
private ConstructorParameter firstConstructorParameter;
private ConstructorParameter secondConstructorParameter;
-
+
@Before
public void setup() {
- when(modelAnnotation.defaultInjectionStrategy()).thenReturn(DefaultInjectionStrategy.REQUIRED);
+ lenient().when(modelAnnotation.defaultInjectionStrategy()).thenReturn(DefaultInjectionStrategy.REQUIRED);
firstConstructorParameter = new ConstructorParameter(new Annotation[0], Object.class, Object.class, true, 0,
new StaticInjectAnnotationProcessorFactory[0], null);
secondConstructorParameter = new ConstructorParameter(new Annotation[0], Object.class, Object.class, true, 1,
diff --git a/src/test/java/org/apache/sling/models/impl/injectors/SlingObjectInjectorRequestTest.java b/src/test/java/org/apache/sling/models/impl/injectors/SlingObjectInjectorRequestTest.java
index e7a8cf3..93aab11 100644
--- a/src/test/java/org/apache/sling/models/impl/injectors/SlingObjectInjectorRequestTest.java
+++ b/src/test/java/org/apache/sling/models/impl/injectors/SlingObjectInjectorRequestTest.java
@@ -38,7 +38,7 @@
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
-import org.mockito.runners.MockitoJUnitRunner;
+import org.mockito.junit.MockitoJUnitRunner;
@RunWith(MockitoJUnitRunner.class)
public class SlingObjectInjectorRequestTest {
diff --git a/src/test/java/org/apache/sling/models/impl/injectors/SlingObjectInjectorResourceResolverTest.java b/src/test/java/org/apache/sling/models/impl/injectors/SlingObjectInjectorResourceResolverTest.java
index 5d8ee51..d2379a8 100644
--- a/src/test/java/org/apache/sling/models/impl/injectors/SlingObjectInjectorResourceResolverTest.java
+++ b/src/test/java/org/apache/sling/models/impl/injectors/SlingObjectInjectorResourceResolverTest.java
@@ -31,7 +31,7 @@
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
-import org.mockito.runners.MockitoJUnitRunner;
+import org.mockito.junit.MockitoJUnitRunner;
@RunWith(MockitoJUnitRunner.class)
public class SlingObjectInjectorResourceResolverTest {
diff --git a/src/test/java/org/apache/sling/models/impl/injectors/SlingObjectInjectorResourceTest.java b/src/test/java/org/apache/sling/models/impl/injectors/SlingObjectInjectorResourceTest.java
index 912112d..62ac700 100644
--- a/src/test/java/org/apache/sling/models/impl/injectors/SlingObjectInjectorResourceTest.java
+++ b/src/test/java/org/apache/sling/models/impl/injectors/SlingObjectInjectorResourceTest.java
@@ -34,7 +34,7 @@
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
-import org.mockito.runners.MockitoJUnitRunner;
+import org.mockito.junit.MockitoJUnitRunner;
@RunWith(MockitoJUnitRunner.class)
public class SlingObjectInjectorResourceTest {
diff --git a/src/test/java/org/apache/sling/models/impl/injectors/ValueMapInjectorTest.java b/src/test/java/org/apache/sling/models/impl/injectors/ValueMapInjectorTest.java
index c0081df..4b46789 100644
--- a/src/test/java/org/apache/sling/models/impl/injectors/ValueMapInjectorTest.java
+++ b/src/test/java/org/apache/sling/models/impl/injectors/ValueMapInjectorTest.java
@@ -31,7 +31,7 @@
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
-import org.mockito.runners.MockitoJUnitRunner;
+import org.mockito.junit.MockitoJUnitRunner;
@RunWith(MockitoJUnitRunner.class)
public class ValueMapInjectorTest {
diff --git a/src/test/java/org/apache/sling/models/impl/via/ChildResourceViaProviderTest.java b/src/test/java/org/apache/sling/models/impl/via/ChildResourceViaProviderTest.java
index 7f32b6e..0271c0b 100644
--- a/src/test/java/org/apache/sling/models/impl/via/ChildResourceViaProviderTest.java
+++ b/src/test/java/org/apache/sling/models/impl/via/ChildResourceViaProviderTest.java
@@ -25,7 +25,7 @@
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
-import org.mockito.runners.MockitoJUnitRunner;
+import org.mockito.junit.MockitoJUnitRunner;
@RunWith(MockitoJUnitRunner.class)
public class ChildResourceViaProviderTest {
diff --git a/src/test/java/org/apache/sling/models/impl/via/OriginalResourceTypeViaProviderTest.java b/src/test/java/org/apache/sling/models/impl/via/OriginalResourceTypeViaProviderTest.java
new file mode 100644
index 0000000..a793b0c
--- /dev/null
+++ b/src/test/java/org/apache/sling/models/impl/via/OriginalResourceTypeViaProviderTest.java
@@ -0,0 +1,107 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.sling.models.impl.via;
+
+import org.apache.sling.api.SlingHttpServletRequest;
+import org.apache.sling.api.resource.Resource;
+import org.apache.sling.api.resource.ResourceWrapper;
+import org.apache.sling.api.wrappers.SlingHttpServletRequestWrapper;
+import org.apache.sling.models.annotations.via.OriginalResourceType;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.junit.MockitoJUnitRunner;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+
+@RunWith(MockitoJUnitRunner.class)
+public class OriginalResourceTypeViaProviderTest {
+
+ private OriginalResourceTypeViaProvider provider = new OriginalResourceTypeViaProvider();
+
+ @Mock
+ private Resource resource;
+
+ @Mock
+ private SlingHttpServletRequest request;
+
+ @Test
+ public void testReturnsCorrectMarkerInterface() {
+ assertEquals(OriginalResourceType.class, provider.getType());
+ }
+
+ @Test
+ public void testReturnsOriginalResourceIfNotWrapped() {
+ Object projected = provider.getAdaptable(resource, null);
+ assertEquals(resource, projected);
+ }
+
+ @Test
+ public void testReturnsOriginalRequestIfNotWrapped() {
+ Object projected = provider.getAdaptable(request, null);
+ assertEquals(request, projected);
+ }
+
+ @Test
+ public void testReturnsNullIfNeitherRequestOrResource() {
+ Object projected = provider.getAdaptable(new Object(), null);
+ assertNull(projected);
+ }
+
+ @Test
+ public void testUnwrapsResource() {
+ // once
+ Resource testCase = new ResourceTypeForcingResourceWrapper(resource, "foo");
+ Object projected = provider.getAdaptable(testCase, null);
+ assertEquals(resource, projected);
+
+ // more than once
+ testCase = new ResourceTypeForcingResourceWrapper(testCase, "bar");
+ testCase = new ResourceTypeForcingResourceWrapper(testCase, "foobar");
+ projected = provider.getAdaptable(testCase, null);
+ assertEquals(resource, projected);
+ }
+
+ @Test
+ public void testUnwrapsRequest() {
+ // once
+ SlingHttpServletRequest testCase = new ResourceTypeForcingRequestWrapper(request, resource, "foo");
+ Object projected = provider.getAdaptable(testCase, null);
+ assertEquals(request, projected);
+
+ // more than once
+ testCase = new ResourceTypeForcingRequestWrapper(testCase, resource, "bar");
+ testCase = new ResourceTypeForcingRequestWrapper(testCase, resource, "foobar");
+ projected = provider.getAdaptable(testCase, null);
+ assertEquals(request, projected);
+ }
+
+ @Test
+ public void testDoesNotUnwrapOtherResourceWrappers() {
+ Resource testCase = new ResourceWrapper(resource);
+ Object projected = provider.getAdaptable(testCase, null);
+ assertEquals(testCase, projected);
+ }
+
+ @Test
+ public void testDoesNotUnwrapOtherRequestWrappers() {
+ SlingHttpServletRequest testCase = new SlingHttpServletRequestWrapper(request);
+ Object projected = provider.getAdaptable(testCase, null);
+ assertEquals(testCase, projected);
+ }
+}
diff --git a/src/test/java/org/apache/sling/models/testmodels/classes/CachedModel.java b/src/test/java/org/apache/sling/models/testmodels/classes/CachedModel.java
index 2e02526..2a10933 100644
--- a/src/test/java/org/apache/sling/models/testmodels/classes/CachedModel.java
+++ b/src/test/java/org/apache/sling/models/testmodels/classes/CachedModel.java
@@ -16,12 +16,13 @@
*/
package org.apache.sling.models.testmodels.classes;
-import org.apache.sling.api.SlingHttpServletRequest;
-import org.apache.sling.models.annotations.Model;
-
import javax.inject.Inject;
-@Model(adaptables = SlingHttpServletRequest.class, cache = true)
+import org.apache.sling.api.SlingHttpServletRequest;
+import org.apache.sling.api.resource.Resource;
+import org.apache.sling.models.annotations.Model;
+
+@Model(adaptables = {SlingHttpServletRequest.class, Resource.class}, cache = true)
public class CachedModel {
@Inject
diff --git a/src/test/java/org/apache/sling/models/testmodels/classes/CachedModelWithAdapterTypes12.java b/src/test/java/org/apache/sling/models/testmodels/classes/CachedModelWithAdapterTypes12.java
new file mode 100644
index 0000000..fbcef3f
--- /dev/null
+++ b/src/test/java/org/apache/sling/models/testmodels/classes/CachedModelWithAdapterTypes12.java
@@ -0,0 +1,32 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.sling.models.testmodels.classes;
+
+import org.apache.sling.api.SlingHttpServletRequest;
+import org.apache.sling.models.annotations.Model;
+import org.apache.sling.models.testmodels.interfaces.AdapterType1;
+import org.apache.sling.models.testmodels.interfaces.AdapterType2;
+
+@Model(
+ adaptables = SlingHttpServletRequest.class,
+ adapters = { AdapterType1.class, AdapterType2.class },
+ cache = true
+)
+public class CachedModelWithAdapterTypes12 implements AdapterType1, AdapterType2 {
+
+
+}
diff --git a/src/test/java/org/apache/sling/models/testmodels/classes/CachedModelWithAdapterTypes23.java b/src/test/java/org/apache/sling/models/testmodels/classes/CachedModelWithAdapterTypes23.java
new file mode 100644
index 0000000..3222b5c
--- /dev/null
+++ b/src/test/java/org/apache/sling/models/testmodels/classes/CachedModelWithAdapterTypes23.java
@@ -0,0 +1,34 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.sling.models.testmodels.classes;
+
+import org.apache.sling.api.SlingHttpServletRequest;
+import org.apache.sling.api.resource.Resource;
+import org.apache.sling.models.annotations.Model;
+import org.apache.sling.models.testmodels.interfaces.AdapterType1;
+import org.apache.sling.models.testmodels.interfaces.AdapterType2;
+import org.apache.sling.models.testmodels.interfaces.AdapterType3;
+
+@Model(
+ adaptables = SlingHttpServletRequest.class,
+ adapters = { AdapterType2.class, AdapterType3.class },
+ cache = true
+)
+public class CachedModelWithAdapterTypes23 implements AdapterType2, AdapterType3 {
+
+
+}
diff --git a/src/test/java/org/apache/sling/models/testmodels/classes/CachedModelWithSelfReference.java b/src/test/java/org/apache/sling/models/testmodels/classes/CachedModelWithSelfReference.java
index ff8e394..2ca8755 100644
--- a/src/test/java/org/apache/sling/models/testmodels/classes/CachedModelWithSelfReference.java
+++ b/src/test/java/org/apache/sling/models/testmodels/classes/CachedModelWithSelfReference.java
@@ -22,304 +22,13 @@
@Model(adaptables = SlingHttpServletRequest.class, cache = true)
public class CachedModelWithSelfReference {
+ // This can be tuned to make it run faster or slower.
+ // The larger this is, the fewer number of instances needed to test.
+ public static int numberOfLongs = 4000;
+
@Self
SlingHttpServletRequest request;
- // Add a bunch of longs to the class, to make it take fewer iterations to fill the heap
- long l1, l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12, l13, l14, l15, l16, l17, l18, l19, l20,
- l21, l22, l23, l24, l25, l26, l27, l28, l29, l30, l31, l32, l33, l34, l35, l36, l37, l38, l39,
- l40, l41, l42, l43, l44, l45, l46, l47, l48, l49, l50, l51, l52, l53, l54, l55, l56, l57, l58,
- l59, l60, l61, l62, l63, l64, l65, l66, l67, l68, l69, l70, l71, l72, l73, l74, l75, l76, l77,
- l78, l79, l80, l81, l82, l83, l84, l85, l86, l87, l88, l89, l90, l91, l92, l93, l94, l95, l96,
- l97, l98, l99, l100, l101, l102, l103, l104, l105, l106, l107, l108, l109, l110, l111, l112,
- l113, l114, l115, l116, l117, l118, l119, l120, l121, l122, l123, l124, l125, l126, l127,
- l128, l129, l130, l131, l132, l133, l134, l135, l136, l137, l138, l139, l140, l141, l142,
- l143, l144, l145, l146, l147, l148, l149, l150, l151, l152, l153, l154, l155, l156, l157,
- l158, l159, l160, l161, l162, l163, l164, l165, l166, l167, l168, l169, l170, l171, l172,
- l173, l174, l175, l176, l177, l178, l179, l180, l181, l182, l183, l184, l185, l186, l187,
- l188, l189, l190, l191, l192, l193, l194, l195, l196, l197, l198, l199, l200, l201, l202,
- l203, l204, l205, l206, l207, l208, l209, l210, l211, l212, l213, l214, l215, l216, l217,
- l218, l219, l220, l221, l222, l223, l224, l225, l226, l227, l228, l229, l230, l231, l232,
- l233, l234, l235, l236, l237, l238, l239, l240, l241, l242, l243, l244, l245, l246, l247,
- l248, l249, l250, l251, l252, l253, l254, l255, l256, l257, l258, l259, l260, l261, l262,
- l263, l264, l265, l266, l267, l268, l269, l270, l271, l272, l273, l274, l275, l276, l277,
- l278, l279, l280, l281, l282, l283, l284, l285, l286, l287, l288, l289, l290, l291, l292,
- l293, l294, l295, l296, l297, l298, l299, l300, l301, l302, l303, l304, l305, l306, l307,
- l308, l309, l310, l311, l312, l313, l314, l315, l316, l317, l318, l319, l320, l321, l322,
- l323, l324, l325, l326, l327, l328, l329, l330, l331, l332, l333, l334, l335, l336, l337,
- l338, l339, l340, l341, l342, l343, l344, l345, l346, l347, l348, l349, l350, l351, l352,
- l353, l354, l355, l356, l357, l358, l359, l360, l361, l362, l363, l364, l365, l366, l367,
- l368, l369, l370, l371, l372, l373, l374, l375, l376, l377, l378, l379, l380, l381, l382,
- l383, l384, l385, l386, l387, l388, l389, l390, l391, l392, l393, l394, l395, l396, l397,
- l398, l399, l400, l401, l402, l403, l404, l405, l406, l407, l408, l409, l410, l411, l412,
- l413, l414, l415, l416, l417, l418, l419, l420, l421, l422, l423, l424, l425, l426, l427,
- l428, l429, l430, l431, l432, l433, l434, l435, l436, l437, l438, l439, l440, l441, l442,
- l443, l444, l445, l446, l447, l448, l449, l450, l451, l452, l453, l454, l455, l456, l457,
- l458, l459, l460, l461, l462, l463, l464, l465, l466, l467, l468, l469, l470, l471, l472,
- l473, l474, l475, l476, l477, l478, l479, l480, l481, l482, l483, l484, l485, l486, l487,
- l488, l489, l490, l491, l492, l493, l494, l495, l496, l497, l498, l499, l500, l501, l502,
- l503, l504, l505, l506, l507, l508, l509, l510, l511, l512, l513, l514, l515, l516, l517,
- l518, l519, l520, l521, l522, l523, l524, l525, l526, l527, l528, l529, l530, l531, l532,
- l533, l534, l535, l536, l537, l538, l539, l540, l541, l542, l543, l544, l545, l546, l547,
- l548, l549, l550, l551, l552, l553, l554, l555, l556, l557, l558, l559, l560, l561, l562,
- l563, l564, l565, l566, l567, l568, l569, l570, l571, l572, l573, l574, l575, l576, l577,
- l578, l579, l580, l581, l582, l583, l584, l585, l586, l587, l588, l589, l590, l591, l592,
- l593, l594, l595, l596, l597, l598, l599, l600, l601, l602, l603, l604, l605, l606, l607,
- l608, l609, l610, l611, l612, l613, l614, l615, l616, l617, l618, l619, l620, l621, l622,
- l623, l624, l625, l626, l627, l628, l629, l630, l631, l632, l633, l634, l635, l636, l637,
- l638, l639, l640, l641, l642, l643, l644, l645, l646, l647, l648, l649, l650, l651, l652,
- l653, l654, l655, l656, l657, l658, l659, l660, l661, l662, l663, l664, l665, l666, l667,
- l668, l669, l670, l671, l672, l673, l674, l675, l676, l677, l678, l679, l680, l681, l682,
- l683, l684, l685, l686, l687, l688, l689, l690, l691, l692, l693, l694, l695, l696, l697,
- l698, l699, l700, l701, l702, l703, l704, l705, l706, l707, l708, l709, l710, l711, l712,
- l713, l714, l715, l716, l717, l718, l719, l720, l721, l722, l723, l724, l725, l726, l727,
- l728, l729, l730, l731, l732, l733, l734, l735, l736, l737, l738, l739, l740, l741, l742,
- l743, l744, l745, l746, l747, l748, l749, l750, l751, l752, l753, l754, l755, l756, l757,
- l758, l759, l760, l761, l762, l763, l764, l765, l766, l767, l768, l769, l770, l771, l772,
- l773, l774, l775, l776, l777, l778, l779, l780, l781, l782, l783, l784, l785, l786, l787,
- l788, l789, l790, l791, l792, l793, l794, l795, l796, l797, l798, l799, l800, l801, l802,
- l803, l804, l805, l806, l807, l808, l809, l810, l811, l812, l813, l814, l815, l816, l817,
- l818, l819, l820, l821, l822, l823, l824, l825, l826, l827, l828, l829, l830, l831, l832,
- l833, l834, l835, l836, l837, l838, l839, l840, l841, l842, l843, l844, l845, l846, l847,
- l848, l849, l850, l851, l852, l853, l854, l855, l856, l857, l858, l859, l860, l861, l862,
- l863, l864, l865, l866, l867, l868, l869, l870, l871, l872, l873, l874, l875, l876, l877,
- l878, l879, l880, l881, l882, l883, l884, l885, l886, l887, l888, l889, l890, l891, l892,
- l893, l894, l895, l896, l897, l898, l899, l900, l901, l902, l903, l904, l905, l906, l907,
- l908, l909, l910, l911, l912, l913, l914, l915, l916, l917, l918, l919, l920, l921, l922,
- l923, l924, l925, l926, l927, l928, l929, l930, l931, l932, l933, l934, l935, l936, l937,
- l938, l939, l940, l941, l942, l943, l944, l945, l946, l947, l948, l949, l950, l951, l952,
- l953, l954, l955, l956, l957, l958, l959, l960, l961, l962, l963, l964, l965, l966, l967,
- l968, l969, l970, l971, l972, l973, l974, l975, l976, l977, l978, l979, l980, l981, l982,
- l983, l984, l985, l986, l987, l988, l989, l990, l991, l992, l993, l994, l995, l996, l997,
- l998, l999, l1000, l1001, l1002, l1003, l1004, l1005, l1006, l1007, l1008, l1009, l1010,
- l1011, l1012, l1013, l1014, l1015, l1016, l1017, l1018, l1019, l1020, l1021, l1022, l1023,
- l1024, l1025, l1026, l1027, l1028, l1029, l1030, l1031, l1032, l1033, l1034, l1035, l1036,
- l1037, l1038, l1039, l1040, l1041, l1042, l1043, l1044, l1045, l1046, l1047, l1048, l1049,
- l1050, l1051, l1052, l1053, l1054, l1055, l1056, l1057, l1058, l1059, l1060, l1061, l1062,
- l1063, l1064, l1065, l1066, l1067, l1068, l1069, l1070, l1071, l1072, l1073, l1074, l1075,
- l1076, l1077, l1078, l1079, l1080, l1081, l1082, l1083, l1084, l1085, l1086, l1087, l1088,
- l1089, l1090, l1091, l1092, l1093, l1094, l1095, l1096, l1097, l1098, l1099, l1100, l1101,
- l1102, l1103, l1104, l1105, l1106, l1107, l1108, l1109, l1110, l1111, l1112, l1113, l1114,
- l1115, l1116, l1117, l1118, l1119, l1120, l1121, l1122, l1123, l1124, l1125, l1126, l1127,
- l1128, l1129, l1130, l1131, l1132, l1133, l1134, l1135, l1136, l1137, l1138, l1139, l1140,
- l1141, l1142, l1143, l1144, l1145, l1146, l1147, l1148, l1149, l1150, l1151, l1152, l1153,
- l1154, l1155, l1156, l1157, l1158, l1159, l1160, l1161, l1162, l1163, l1164, l1165, l1166,
- l1167, l1168, l1169, l1170, l1171, l1172, l1173, l1174, l1175, l1176, l1177, l1178, l1179,
- l1180, l1181, l1182, l1183, l1184, l1185, l1186, l1187, l1188, l1189, l1190, l1191, l1192,
- l1193, l1194, l1195, l1196, l1197, l1198, l1199, l1200, l1201, l1202, l1203, l1204, l1205,
- l1206, l1207, l1208, l1209, l1210, l1211, l1212, l1213, l1214, l1215, l1216, l1217, l1218,
- l1219, l1220, l1221, l1222, l1223, l1224, l1225, l1226, l1227, l1228, l1229, l1230, l1231,
- l1232, l1233, l1234, l1235, l1236, l1237, l1238, l1239, l1240, l1241, l1242, l1243, l1244,
- l1245, l1246, l1247, l1248, l1249, l1250, l1251, l1252, l1253, l1254, l1255, l1256, l1257,
- l1258, l1259, l1260, l1261, l1262, l1263, l1264, l1265, l1266, l1267, l1268, l1269, l1270,
- l1271, l1272, l1273, l1274, l1275, l1276, l1277, l1278, l1279, l1280, l1281, l1282, l1283,
- l1284, l1285, l1286, l1287, l1288, l1289, l1290, l1291, l1292, l1293, l1294, l1295, l1296,
- l1297, l1298, l1299, l1300, l1301, l1302, l1303, l1304, l1305, l1306, l1307, l1308, l1309,
- l1310, l1311, l1312, l1313, l1314, l1315, l1316, l1317, l1318, l1319, l1320, l1321, l1322,
- l1323, l1324, l1325, l1326, l1327, l1328, l1329, l1330, l1331, l1332, l1333, l1334, l1335,
- l1336, l1337, l1338, l1339, l1340, l1341, l1342, l1343, l1344, l1345, l1346, l1347, l1348,
- l1349, l1350, l1351, l1352, l1353, l1354, l1355, l1356, l1357, l1358, l1359, l1360, l1361,
- l1362, l1363, l1364, l1365, l1366, l1367, l1368, l1369, l1370, l1371, l1372, l1373, l1374,
- l1375, l1376, l1377, l1378, l1379, l1380, l1381, l1382, l1383, l1384, l1385, l1386, l1387,
- l1388, l1389, l1390, l1391, l1392, l1393, l1394, l1395, l1396, l1397, l1398, l1399, l1400,
- l1401, l1402, l1403, l1404, l1405, l1406, l1407, l1408, l1409, l1410, l1411, l1412, l1413,
- l1414, l1415, l1416, l1417, l1418, l1419, l1420, l1421, l1422, l1423, l1424, l1425, l1426,
- l1427, l1428, l1429, l1430, l1431, l1432, l1433, l1434, l1435, l1436, l1437, l1438, l1439,
- l1440, l1441, l1442, l1443, l1444, l1445, l1446, l1447, l1448, l1449, l1450, l1451, l1452,
- l1453, l1454, l1455, l1456, l1457, l1458, l1459, l1460, l1461, l1462, l1463, l1464, l1465,
- l1466, l1467, l1468, l1469, l1470, l1471, l1472, l1473, l1474, l1475, l1476, l1477, l1478,
- l1479, l1480, l1481, l1482, l1483, l1484, l1485, l1486, l1487, l1488, l1489, l1490, l1491,
- l1492, l1493, l1494, l1495, l1496, l1497, l1498, l1499, l1500, l1501, l1502, l1503, l1504,
- l1505, l1506, l1507, l1508, l1509, l1510, l1511, l1512, l1513, l1514, l1515, l1516, l1517,
- l1518, l1519, l1520, l1521, l1522, l1523, l1524, l1525, l1526, l1527, l1528, l1529, l1530,
- l1531, l1532, l1533, l1534, l1535, l1536, l1537, l1538, l1539, l1540, l1541, l1542, l1543,
- l1544, l1545, l1546, l1547, l1548, l1549, l1550, l1551, l1552, l1553, l1554, l1555, l1556,
- l1557, l1558, l1559, l1560, l1561, l1562, l1563, l1564, l1565, l1566, l1567, l1568, l1569,
- l1570, l1571, l1572, l1573, l1574, l1575, l1576, l1577, l1578, l1579, l1580, l1581, l1582,
- l1583, l1584, l1585, l1586, l1587, l1588, l1589, l1590, l1591, l1592, l1593, l1594, l1595,
- l1596, l1597, l1598, l1599, l1600, l1601, l1602, l1603, l1604, l1605, l1606, l1607, l1608,
- l1609, l1610, l1611, l1612, l1613, l1614, l1615, l1616, l1617, l1618, l1619, l1620, l1621,
- l1622, l1623, l1624, l1625, l1626, l1627, l1628, l1629, l1630, l1631, l1632, l1633, l1634,
- l1635, l1636, l1637, l1638, l1639, l1640, l1641, l1642, l1643, l1644, l1645, l1646, l1647,
- l1648, l1649, l1650, l1651, l1652, l1653, l1654, l1655, l1656, l1657, l1658, l1659, l1660,
- l1661, l1662, l1663, l1664, l1665, l1666, l1667, l1668, l1669, l1670, l1671, l1672, l1673,
- l1674, l1675, l1676, l1677, l1678, l1679, l1680, l1681, l1682, l1683, l1684, l1685, l1686,
- l1687, l1688, l1689, l1690, l1691, l1692, l1693, l1694, l1695, l1696, l1697, l1698, l1699,
- l1700, l1701, l1702, l1703, l1704, l1705, l1706, l1707, l1708, l1709, l1710, l1711, l1712,
- l1713, l1714, l1715, l1716, l1717, l1718, l1719, l1720, l1721, l1722, l1723, l1724, l1725,
- l1726, l1727, l1728, l1729, l1730, l1731, l1732, l1733, l1734, l1735, l1736, l1737, l1738,
- l1739, l1740, l1741, l1742, l1743, l1744, l1745, l1746, l1747, l1748, l1749, l1750, l1751,
- l1752, l1753, l1754, l1755, l1756, l1757, l1758, l1759, l1760, l1761, l1762, l1763, l1764,
- l1765, l1766, l1767, l1768, l1769, l1770, l1771, l1772, l1773, l1774, l1775, l1776, l1777,
- l1778, l1779, l1780, l1781, l1782, l1783, l1784, l1785, l1786, l1787, l1788, l1789, l1790,
- l1791, l1792, l1793, l1794, l1795, l1796, l1797, l1798, l1799, l1800, l1801, l1802, l1803,
- l1804, l1805, l1806, l1807, l1808, l1809, l1810, l1811, l1812, l1813, l1814, l1815, l1816,
- l1817, l1818, l1819, l1820, l1821, l1822, l1823, l1824, l1825, l1826, l1827, l1828, l1829,
- l1830, l1831, l1832, l1833, l1834, l1835, l1836, l1837, l1838, l1839, l1840, l1841, l1842,
- l1843, l1844, l1845, l1846, l1847, l1848, l1849, l1850, l1851, l1852, l1853, l1854, l1855,
- l1856, l1857, l1858, l1859, l1860, l1861, l1862, l1863, l1864, l1865, l1866, l1867, l1868,
- l1869, l1870, l1871, l1872, l1873, l1874, l1875, l1876, l1877, l1878, l1879, l1880, l1881,
- l1882, l1883, l1884, l1885, l1886, l1887, l1888, l1889, l1890, l1891, l1892, l1893, l1894,
- l1895, l1896, l1897, l1898, l1899, l1900, l1901, l1902, l1903, l1904, l1905, l1906, l1907,
- l1908, l1909, l1910, l1911, l1912, l1913, l1914, l1915, l1916, l1917, l1918, l1919, l1920,
- l1921, l1922, l1923, l1924, l1925, l1926, l1927, l1928, l1929, l1930, l1931, l1932, l1933,
- l1934, l1935, l1936, l1937, l1938, l1939, l1940, l1941, l1942, l1943, l1944, l1945, l1946,
- l1947, l1948, l1949, l1950, l1951, l1952, l1953, l1954, l1955, l1956, l1957, l1958, l1959,
- l1960, l1961, l1962, l1963, l1964, l1965, l1966, l1967, l1968, l1969, l1970, l1971, l1972,
- l1973, l1974, l1975, l1976, l1977, l1978, l1979, l1980, l1981, l1982, l1983, l1984, l1985,
- l1986, l1987, l1988, l1989, l1990, l1991, l1992, l1993, l1994, l1995, l1996, l1997, l1998,
- l1999, l2000, l2001, l2002, l2003, l2004, l2005, l2006, l2007, l2008, l2009, l2010, l2011,
- l2012, l2013, l2014, l2015, l2016, l2017, l2018, l2019, l2020, l2021, l2022, l2023, l2024,
- l2025, l2026, l2027, l2028, l2029, l2030, l2031, l2032, l2033, l2034, l2035, l2036, l2037,
- l2038, l2039, l2040, l2041, l2042, l2043, l2044, l2045, l2046, l2047, l2048, l2049, l2050,
- l2051, l2052, l2053, l2054, l2055, l2056, l2057, l2058, l2059, l2060, l2061, l2062, l2063,
- l2064, l2065, l2066, l2067, l2068, l2069, l2070, l2071, l2072, l2073, l2074, l2075, l2076,
- l2077, l2078, l2079, l2080, l2081, l2082, l2083, l2084, l2085, l2086, l2087, l2088, l2089,
- l2090, l2091, l2092, l2093, l2094, l2095, l2096, l2097, l2098, l2099, l2100, l2101, l2102,
- l2103, l2104, l2105, l2106, l2107, l2108, l2109, l2110, l2111, l2112, l2113, l2114, l2115,
- l2116, l2117, l2118, l2119, l2120, l2121, l2122, l2123, l2124, l2125, l2126, l2127, l2128,
- l2129, l2130, l2131, l2132, l2133, l2134, l2135, l2136, l2137, l2138, l2139, l2140, l2141,
- l2142, l2143, l2144, l2145, l2146, l2147, l2148, l2149, l2150, l2151, l2152, l2153, l2154,
- l2155, l2156, l2157, l2158, l2159, l2160, l2161, l2162, l2163, l2164, l2165, l2166, l2167,
- l2168, l2169, l2170, l2171, l2172, l2173, l2174, l2175, l2176, l2177, l2178, l2179, l2180,
- l2181, l2182, l2183, l2184, l2185, l2186, l2187, l2188, l2189, l2190, l2191, l2192, l2193,
- l2194, l2195, l2196, l2197, l2198, l2199, l2200, l2201, l2202, l2203, l2204, l2205, l2206,
- l2207, l2208, l2209, l2210, l2211, l2212, l2213, l2214, l2215, l2216, l2217, l2218, l2219,
- l2220, l2221, l2222, l2223, l2224, l2225, l2226, l2227, l2228, l2229, l2230, l2231, l2232,
- l2233, l2234, l2235, l2236, l2237, l2238, l2239, l2240, l2241, l2242, l2243, l2244, l2245,
- l2246, l2247, l2248, l2249, l2250, l2251, l2252, l2253, l2254, l2255, l2256, l2257, l2258,
- l2259, l2260, l2261, l2262, l2263, l2264, l2265, l2266, l2267, l2268, l2269, l2270, l2271,
- l2272, l2273, l2274, l2275, l2276, l2277, l2278, l2279, l2280, l2281, l2282, l2283, l2284,
- l2285, l2286, l2287, l2288, l2289, l2290, l2291, l2292, l2293, l2294, l2295, l2296, l2297,
- l2298, l2299, l2300, l2301, l2302, l2303, l2304, l2305, l2306, l2307, l2308, l2309, l2310,
- l2311, l2312, l2313, l2314, l2315, l2316, l2317, l2318, l2319, l2320, l2321, l2322, l2323,
- l2324, l2325, l2326, l2327, l2328, l2329, l2330, l2331, l2332, l2333, l2334, l2335, l2336,
- l2337, l2338, l2339, l2340, l2341, l2342, l2343, l2344, l2345, l2346, l2347, l2348, l2349,
- l2350, l2351, l2352, l2353, l2354, l2355, l2356, l2357, l2358, l2359, l2360, l2361, l2362,
- l2363, l2364, l2365, l2366, l2367, l2368, l2369, l2370, l2371, l2372, l2373, l2374, l2375,
- l2376, l2377, l2378, l2379, l2380, l2381, l2382, l2383, l2384, l2385, l2386, l2387, l2388,
- l2389, l2390, l2391, l2392, l2393, l2394, l2395, l2396, l2397, l2398, l2399, l2400, l2401,
- l2402, l2403, l2404, l2405, l2406, l2407, l2408, l2409, l2410, l2411, l2412, l2413, l2414,
- l2415, l2416, l2417, l2418, l2419, l2420, l2421, l2422, l2423, l2424, l2425, l2426, l2427,
- l2428, l2429, l2430, l2431, l2432, l2433, l2434, l2435, l2436, l2437, l2438, l2439, l2440,
- l2441, l2442, l2443, l2444, l2445, l2446, l2447, l2448, l2449, l2450, l2451, l2452, l2453,
- l2454, l2455, l2456, l2457, l2458, l2459, l2460, l2461, l2462, l2463, l2464, l2465, l2466,
- l2467, l2468, l2469, l2470, l2471, l2472, l2473, l2474, l2475, l2476, l2477, l2478, l2479,
- l2480, l2481, l2482, l2483, l2484, l2485, l2486, l2487, l2488, l2489, l2490, l2491, l2492,
- l2493, l2494, l2495, l2496, l2497, l2498, l2499, l2500, l2501, l2502, l2503, l2504, l2505,
- l2506, l2507, l2508, l2509, l2510, l2511, l2512, l2513, l2514, l2515, l2516, l2517, l2518,
- l2519, l2520, l2521, l2522, l2523, l2524, l2525, l2526, l2527, l2528, l2529, l2530, l2531,
- l2532, l2533, l2534, l2535, l2536, l2537, l2538, l2539, l2540, l2541, l2542, l2543, l2544,
- l2545, l2546, l2547, l2548, l2549, l2550, l2551, l2552, l2553, l2554, l2555, l2556, l2557,
- l2558, l2559, l2560, l2561, l2562, l2563, l2564, l2565, l2566, l2567, l2568, l2569, l2570,
- l2571, l2572, l2573, l2574, l2575, l2576, l2577, l2578, l2579, l2580, l2581, l2582, l2583,
- l2584, l2585, l2586, l2587, l2588, l2589, l2590, l2591, l2592, l2593, l2594, l2595, l2596,
- l2597, l2598, l2599, l2600, l2601, l2602, l2603, l2604, l2605, l2606, l2607, l2608, l2609,
- l2610, l2611, l2612, l2613, l2614, l2615, l2616, l2617, l2618, l2619, l2620, l2621, l2622,
- l2623, l2624, l2625, l2626, l2627, l2628, l2629, l2630, l2631, l2632, l2633, l2634, l2635,
- l2636, l2637, l2638, l2639, l2640, l2641, l2642, l2643, l2644, l2645, l2646, l2647, l2648,
- l2649, l2650, l2651, l2652, l2653, l2654, l2655, l2656, l2657, l2658, l2659, l2660, l2661,
- l2662, l2663, l2664, l2665, l2666, l2667, l2668, l2669, l2670, l2671, l2672, l2673, l2674,
- l2675, l2676, l2677, l2678, l2679, l2680, l2681, l2682, l2683, l2684, l2685, l2686, l2687,
- l2688, l2689, l2690, l2691, l2692, l2693, l2694, l2695, l2696, l2697, l2698, l2699, l2700,
- l2701, l2702, l2703, l2704, l2705, l2706, l2707, l2708, l2709, l2710, l2711, l2712, l2713,
- l2714, l2715, l2716, l2717, l2718, l2719, l2720, l2721, l2722, l2723, l2724, l2725, l2726,
- l2727, l2728, l2729, l2730, l2731, l2732, l2733, l2734, l2735, l2736, l2737, l2738, l2739,
- l2740, l2741, l2742, l2743, l2744, l2745, l2746, l2747, l2748, l2749, l2750, l2751, l2752,
- l2753, l2754, l2755, l2756, l2757, l2758, l2759, l2760, l2761, l2762, l2763, l2764, l2765,
- l2766, l2767, l2768, l2769, l2770, l2771, l2772, l2773, l2774, l2775, l2776, l2777, l2778,
- l2779, l2780, l2781, l2782, l2783, l2784, l2785, l2786, l2787, l2788, l2789, l2790, l2791,
- l2792, l2793, l2794, l2795, l2796, l2797, l2798, l2799, l2800, l2801, l2802, l2803, l2804,
- l2805, l2806, l2807, l2808, l2809, l2810, l2811, l2812, l2813, l2814, l2815, l2816, l2817,
- l2818, l2819, l2820, l2821, l2822, l2823, l2824, l2825, l2826, l2827, l2828, l2829, l2830,
- l2831, l2832, l2833, l2834, l2835, l2836, l2837, l2838, l2839, l2840, l2841, l2842, l2843,
- l2844, l2845, l2846, l2847, l2848, l2849, l2850, l2851, l2852, l2853, l2854, l2855, l2856,
- l2857, l2858, l2859, l2860, l2861, l2862, l2863, l2864, l2865, l2866, l2867, l2868, l2869,
- l2870, l2871, l2872, l2873, l2874, l2875, l2876, l2877, l2878, l2879, l2880, l2881, l2882,
- l2883, l2884, l2885, l2886, l2887, l2888, l2889, l2890, l2891, l2892, l2893, l2894, l2895,
- l2896, l2897, l2898, l2899, l2900, l2901, l2902, l2903, l2904, l2905, l2906, l2907, l2908,
- l2909, l2910, l2911, l2912, l2913, l2914, l2915, l2916, l2917, l2918, l2919, l2920, l2921,
- l2922, l2923, l2924, l2925, l2926, l2927, l2928, l2929, l2930, l2931, l2932, l2933, l2934,
- l2935, l2936, l2937, l2938, l2939, l2940, l2941, l2942, l2943, l2944, l2945, l2946, l2947,
- l2948, l2949, l2950, l2951, l2952, l2953, l2954, l2955, l2956, l2957, l2958, l2959, l2960,
- l2961, l2962, l2963, l2964, l2965, l2966, l2967, l2968, l2969, l2970, l2971, l2972, l2973,
- l2974, l2975, l2976, l2977, l2978, l2979, l2980, l2981, l2982, l2983, l2984, l2985, l2986,
- l2987, l2988, l2989, l2990, l2991, l2992, l2993, l2994, l2995, l2996, l2997, l2998, l2999,
- l3000, l3001, l3002, l3003, l3004, l3005, l3006, l3007, l3008, l3009, l3010, l3011, l3012,
- l3013, l3014, l3015, l3016, l3017, l3018, l3019, l3020, l3021, l3022, l3023, l3024, l3025,
- l3026, l3027, l3028, l3029, l3030, l3031, l3032, l3033, l3034, l3035, l3036, l3037, l3038,
- l3039, l3040, l3041, l3042, l3043, l3044, l3045, l3046, l3047, l3048, l3049, l3050, l3051,
- l3052, l3053, l3054, l3055, l3056, l3057, l3058, l3059, l3060, l3061, l3062, l3063, l3064,
- l3065, l3066, l3067, l3068, l3069, l3070, l3071, l3072, l3073, l3074, l3075, l3076, l3077,
- l3078, l3079, l3080, l3081, l3082, l3083, l3084, l3085, l3086, l3087, l3088, l3089, l3090,
- l3091, l3092, l3093, l3094, l3095, l3096, l3097, l3098, l3099, l3100, l3101, l3102, l3103,
- l3104, l3105, l3106, l3107, l3108, l3109, l3110, l3111, l3112, l3113, l3114, l3115, l3116,
- l3117, l3118, l3119, l3120, l3121, l3122, l3123, l3124, l3125, l3126, l3127, l3128, l3129,
- l3130, l3131, l3132, l3133, l3134, l3135, l3136, l3137, l3138, l3139, l3140, l3141, l3142,
- l3143, l3144, l3145, l3146, l3147, l3148, l3149, l3150, l3151, l3152, l3153, l3154, l3155,
- l3156, l3157, l3158, l3159, l3160, l3161, l3162, l3163, l3164, l3165, l3166, l3167, l3168,
- l3169, l3170, l3171, l3172, l3173, l3174, l3175, l3176, l3177, l3178, l3179, l3180, l3181,
- l3182, l3183, l3184, l3185, l3186, l3187, l3188, l3189, l3190, l3191, l3192, l3193, l3194,
- l3195, l3196, l3197, l3198, l3199, l3200, l3201, l3202, l3203, l3204, l3205, l3206, l3207,
- l3208, l3209, l3210, l3211, l3212, l3213, l3214, l3215, l3216, l3217, l3218, l3219, l3220,
- l3221, l3222, l3223, l3224, l3225, l3226, l3227, l3228, l3229, l3230, l3231, l3232, l3233,
- l3234, l3235, l3236, l3237, l3238, l3239, l3240, l3241, l3242, l3243, l3244, l3245, l3246,
- l3247, l3248, l3249, l3250, l3251, l3252, l3253, l3254, l3255, l3256, l3257, l3258, l3259,
- l3260, l3261, l3262, l3263, l3264, l3265, l3266, l3267, l3268, l3269, l3270, l3271, l3272,
- l3273, l3274, l3275, l3276, l3277, l3278, l3279, l3280, l3281, l3282, l3283, l3284, l3285,
- l3286, l3287, l3288, l3289, l3290, l3291, l3292, l3293, l3294, l3295, l3296, l3297, l3298,
- l3299, l3300, l3301, l3302, l3303, l3304, l3305, l3306, l3307, l3308, l3309, l3310, l3311,
- l3312, l3313, l3314, l3315, l3316, l3317, l3318, l3319, l3320, l3321, l3322, l3323, l3324,
- l3325, l3326, l3327, l3328, l3329, l3330, l3331, l3332, l3333, l3334, l3335, l3336, l3337,
- l3338, l3339, l3340, l3341, l3342, l3343, l3344, l3345, l3346, l3347, l3348, l3349, l3350,
- l3351, l3352, l3353, l3354, l3355, l3356, l3357, l3358, l3359, l3360, l3361, l3362, l3363,
- l3364, l3365, l3366, l3367, l3368, l3369, l3370, l3371, l3372, l3373, l3374, l3375, l3376,
- l3377, l3378, l3379, l3380, l3381, l3382, l3383, l3384, l3385, l3386, l3387, l3388, l3389,
- l3390, l3391, l3392, l3393, l3394, l3395, l3396, l3397, l3398, l3399, l3400, l3401, l3402,
- l3403, l3404, l3405, l3406, l3407, l3408, l3409, l3410, l3411, l3412, l3413, l3414, l3415,
- l3416, l3417, l3418, l3419, l3420, l3421, l3422, l3423, l3424, l3425, l3426, l3427, l3428,
- l3429, l3430, l3431, l3432, l3433, l3434, l3435, l3436, l3437, l3438, l3439, l3440, l3441,
- l3442, l3443, l3444, l3445, l3446, l3447, l3448, l3449, l3450, l3451, l3452, l3453, l3454,
- l3455, l3456, l3457, l3458, l3459, l3460, l3461, l3462, l3463, l3464, l3465, l3466, l3467,
- l3468, l3469, l3470, l3471, l3472, l3473, l3474, l3475, l3476, l3477, l3478, l3479, l3480,
- l3481, l3482, l3483, l3484, l3485, l3486, l3487, l3488, l3489, l3490, l3491, l3492, l3493,
- l3494, l3495, l3496, l3497, l3498, l3499, l3500, l3501, l3502, l3503, l3504, l3505, l3506,
- l3507, l3508, l3509, l3510, l3511, l3512, l3513, l3514, l3515, l3516, l3517, l3518, l3519,
- l3520, l3521, l3522, l3523, l3524, l3525, l3526, l3527, l3528, l3529, l3530, l3531, l3532,
- l3533, l3534, l3535, l3536, l3537, l3538, l3539, l3540, l3541, l3542, l3543, l3544, l3545,
- l3546, l3547, l3548, l3549, l3550, l3551, l3552, l3553, l3554, l3555, l3556, l3557, l3558,
- l3559, l3560, l3561, l3562, l3563, l3564, l3565, l3566, l3567, l3568, l3569, l3570, l3571,
- l3572, l3573, l3574, l3575, l3576, l3577, l3578, l3579, l3580, l3581, l3582, l3583, l3584,
- l3585, l3586, l3587, l3588, l3589, l3590, l3591, l3592, l3593, l3594, l3595, l3596, l3597,
- l3598, l3599, l3600, l3601, l3602, l3603, l3604, l3605, l3606, l3607, l3608, l3609, l3610,
- l3611, l3612, l3613, l3614, l3615, l3616, l3617, l3618, l3619, l3620, l3621, l3622, l3623,
- l3624, l3625, l3626, l3627, l3628, l3629, l3630, l3631, l3632, l3633, l3634, l3635, l3636,
- l3637, l3638, l3639, l3640, l3641, l3642, l3643, l3644, l3645, l3646, l3647, l3648, l3649,
- l3650, l3651, l3652, l3653, l3654, l3655, l3656, l3657, l3658, l3659, l3660, l3661, l3662,
- l3663, l3664, l3665, l3666, l3667, l3668, l3669, l3670, l3671, l3672, l3673, l3674, l3675,
- l3676, l3677, l3678, l3679, l3680, l3681, l3682, l3683, l3684, l3685, l3686, l3687, l3688,
- l3689, l3690, l3691, l3692, l3693, l3694, l3695, l3696, l3697, l3698, l3699, l3700, l3701,
- l3702, l3703, l3704, l3705, l3706, l3707, l3708, l3709, l3710, l3711, l3712, l3713, l3714,
- l3715, l3716, l3717, l3718, l3719, l3720, l3721, l3722, l3723, l3724, l3725, l3726, l3727,
- l3728, l3729, l3730, l3731, l3732, l3733, l3734, l3735, l3736, l3737, l3738, l3739, l3740,
- l3741, l3742, l3743, l3744, l3745, l3746, l3747, l3748, l3749, l3750, l3751, l3752, l3753,
- l3754, l3755, l3756, l3757, l3758, l3759, l3760, l3761, l3762, l3763, l3764, l3765, l3766,
- l3767, l3768, l3769, l3770, l3771, l3772, l3773, l3774, l3775, l3776, l3777, l3778, l3779,
- l3780, l3781, l3782, l3783, l3784, l3785, l3786, l3787, l3788, l3789, l3790, l3791, l3792,
- l3793, l3794, l3795, l3796, l3797, l3798, l3799, l3800, l3801, l3802, l3803, l3804, l3805,
- l3806, l3807, l3808, l3809, l3810, l3811, l3812, l3813, l3814, l3815, l3816, l3817, l3818,
- l3819, l3820, l3821, l3822, l3823, l3824, l3825, l3826, l3827, l3828, l3829, l3830, l3831,
- l3832, l3833, l3834, l3835, l3836, l3837, l3838, l3839, l3840, l3841, l3842, l3843, l3844,
- l3845, l3846, l3847, l3848, l3849, l3850, l3851, l3852, l3853, l3854, l3855, l3856, l3857,
- l3858, l3859, l3860, l3861, l3862, l3863, l3864, l3865, l3866, l3867, l3868, l3869, l3870,
- l3871, l3872, l3873, l3874, l3875, l3876, l3877, l3878, l3879, l3880, l3881, l3882, l3883,
- l3884, l3885, l3886, l3887, l3888, l3889, l3890, l3891, l3892, l3893, l3894, l3895, l3896,
- l3897, l3898, l3899, l3900, l3901, l3902, l3903, l3904, l3905, l3906, l3907, l3908, l3909,
- l3910, l3911, l3912, l3913, l3914, l3915, l3916, l3917, l3918, l3919, l3920, l3921, l3922,
- l3923, l3924, l3925, l3926, l3927, l3928, l3929, l3930, l3931, l3932, l3933, l3934, l3935,
- l3936, l3937, l3938, l3939, l3940, l3941, l3942, l3943, l3944, l3945, l3946, l3947, l3948,
- l3949, l3950, l3951, l3952, l3953, l3954, l3955, l3956, l3957, l3958, l3959, l3960, l3961,
- l3962, l3963, l3964, l3965, l3966, l3967, l3968, l3969, l3970, l3971, l3972, l3973, l3974,
- l3975, l3976, l3977, l3978, l3979, l3980, l3981, l3982, l3983, l3984, l3985, l3986, l3987,
- l3988, l3989, l3990, l3991, l3992, l3993, l3994, l3995, l3996, l3997, l3998, l3999, l4000;
+ // Add a big array of longs to the class, to make it take fewer iterations to fill the heap
+ public long[] longs = new long[numberOfLongs];
}
\ No newline at end of file
diff --git a/src/test/java/org/apache/sling/models/testmodels/classes/FailingPostConstuctModel.java b/src/test/java/org/apache/sling/models/testmodels/classes/FailingPostConstructModel.java
similarity index 96%
rename from src/test/java/org/apache/sling/models/testmodels/classes/FailingPostConstuctModel.java
rename to src/test/java/org/apache/sling/models/testmodels/classes/FailingPostConstructModel.java
index 7db3b92..186306f 100644
--- a/src/test/java/org/apache/sling/models/testmodels/classes/FailingPostConstuctModel.java
+++ b/src/test/java/org/apache/sling/models/testmodels/classes/FailingPostConstructModel.java
@@ -24,7 +24,7 @@
import org.apache.sling.models.annotations.Model;
@Model(adaptables=Resource.class)
-public class FailingPostConstuctModel {
+public class FailingPostConstructModel {
@PostConstruct
protected void pc() throws Exception {
diff --git a/src/test/java/org/apache/sling/models/testmodels/classes/FalsePostConstuctModel.java b/src/test/java/org/apache/sling/models/testmodels/classes/FalsePostConstructModel.java
similarity index 96%
rename from src/test/java/org/apache/sling/models/testmodels/classes/FalsePostConstuctModel.java
rename to src/test/java/org/apache/sling/models/testmodels/classes/FalsePostConstructModel.java
index 4c6b724..a1bd687 100644
--- a/src/test/java/org/apache/sling/models/testmodels/classes/FalsePostConstuctModel.java
+++ b/src/test/java/org/apache/sling/models/testmodels/classes/FalsePostConstructModel.java
@@ -24,7 +24,7 @@
import javax.annotation.PostConstruct;
@Model(adaptables=Resource.class)
-public class FalsePostConstuctModel {
+public class FalsePostConstructModel {
@PostConstruct
protected boolean pc() throws Exception {
diff --git a/src/test/java/org/apache/sling/models/testmodels/classes/ResourcePathAllOptionalModel.java b/src/test/java/org/apache/sling/models/testmodels/classes/ResourcePathAllOptionalModel.java
index a7dcb62..38fc7f9 100644
--- a/src/test/java/org/apache/sling/models/testmodels/classes/ResourcePathAllOptionalModel.java
+++ b/src/test/java/org/apache/sling/models/testmodels/classes/ResourcePathAllOptionalModel.java
@@ -32,7 +32,7 @@
public class ResourcePathAllOptionalModel {
@Inject
- @Path("/some/path")
+ @Path("/some/invalidpath")
@Optional
private Resource fromPath;
@@ -42,11 +42,11 @@
private Resource derefProperty;
@Inject
- @Path(paths={"/some/path", "/some/path2"})
+ @Path(paths={"/some/invalidpath", "/some/invalidpath2"})
@Optional
private Resource manyFromPathNonList;
- @ResourcePath(path = "/some/path2", optional=true)
+ @ResourcePath(path = "/some/invalidpath2", optional=true)
private Resource fromPath2;
@ResourcePath(name = "anotherPropertyContainingAPath", optional=true)
diff --git a/src/test/java/org/apache/sling/models/testmodels/classes/SimpleModelWithInvalidSecondAnnotation.java b/src/test/java/org/apache/sling/models/testmodels/classes/SimpleModelWithInvalidSecondAnnotation.java
new file mode 100644
index 0000000..03f7be1
--- /dev/null
+++ b/src/test/java/org/apache/sling/models/testmodels/classes/SimpleModelWithInvalidSecondAnnotation.java
@@ -0,0 +1,27 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.sling.models.testmodels.classes;
+
+import org.apache.sling.api.resource.Resource;
+import org.apache.sling.models.annotations.Model;
+import org.apache.sling.models.testmodels.classes.annotations.OtherAnnotation;
+
+@Model(adaptables = Resource.class)
+@OtherAnnotation()
+public class SimpleModelWithInvalidSecondAnnotation {
+
+}
diff --git a/src/test/java/org/apache/sling/models/testmodels/classes/TruePostConstuctModel.java b/src/test/java/org/apache/sling/models/testmodels/classes/TruePostConstructModel.java
similarity index 96%
rename from src/test/java/org/apache/sling/models/testmodels/classes/TruePostConstuctModel.java
rename to src/test/java/org/apache/sling/models/testmodels/classes/TruePostConstructModel.java
index 4198f5f..06d21db 100644
--- a/src/test/java/org/apache/sling/models/testmodels/classes/TruePostConstuctModel.java
+++ b/src/test/java/org/apache/sling/models/testmodels/classes/TruePostConstructModel.java
@@ -24,7 +24,7 @@
import javax.annotation.PostConstruct;
@Model(adaptables=Resource.class)
-public class TruePostConstuctModel {
+public class TruePostConstructModel {
@PostConstruct
protected boolean pc() throws Exception {
diff --git a/src/test/java/org/apache/sling/models/testmodels/classes/UncachedModel.java b/src/test/java/org/apache/sling/models/testmodels/classes/UncachedModel.java
index bd39352..06ae166 100644
--- a/src/test/java/org/apache/sling/models/testmodels/classes/UncachedModel.java
+++ b/src/test/java/org/apache/sling/models/testmodels/classes/UncachedModel.java
@@ -17,12 +17,13 @@
package org.apache.sling.models.testmodels.classes;
-import org.apache.sling.api.SlingHttpServletRequest;
-import org.apache.sling.models.annotations.Model;
-
import javax.inject.Inject;
-@Model(adaptables = SlingHttpServletRequest.class)
+import org.apache.sling.api.SlingHttpServletRequest;
+import org.apache.sling.api.resource.Resource;
+import org.apache.sling.models.annotations.Model;
+
+@Model(adaptables = {SlingHttpServletRequest.class, Resource.class})
public class UncachedModel {
@Inject
diff --git a/src/test/java/org/apache/sling/models/testmodels/classes/annotations/Hidden.java b/src/test/java/org/apache/sling/models/testmodels/classes/annotations/Hidden.java
new file mode 100644
index 0000000..0b09f8a
--- /dev/null
+++ b/src/test/java/org/apache/sling/models/testmodels/classes/annotations/Hidden.java
@@ -0,0 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.sling.models.testmodels.classes.annotations;
+
+public class Hidden {
+
+}
diff --git a/src/test/java/org/apache/sling/models/testmodels/classes/annotations/OtherAnnotation.java b/src/test/java/org/apache/sling/models/testmodels/classes/annotations/OtherAnnotation.java
new file mode 100644
index 0000000..52e7c6e
--- /dev/null
+++ b/src/test/java/org/apache/sling/models/testmodels/classes/annotations/OtherAnnotation.java
@@ -0,0 +1,29 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.sling.models.testmodels.classes.annotations;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+@Target({ElementType.TYPE})
+@Retention(RetentionPolicy.RUNTIME)
+public @interface OtherAnnotation {
+
+ Class<?> someClass() default Hidden.class;
+}
diff --git a/src/test/java/org/apache/sling/models/testmodels/classes/constructorvisibility/PackagePrivateConstructorModel.java b/src/test/java/org/apache/sling/models/testmodels/classes/constructorvisibility/PackagePrivateConstructorModel.java
new file mode 100644
index 0000000..cb3cdba
--- /dev/null
+++ b/src/test/java/org/apache/sling/models/testmodels/classes/constructorvisibility/PackagePrivateConstructorModel.java
@@ -0,0 +1,31 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.sling.models.testmodels.classes.constructorvisibility;
+
+import javax.inject.Inject;
+
+import org.apache.sling.api.SlingHttpServletRequest;
+import org.apache.sling.models.annotations.Model;
+
+@Model(adaptables = SlingHttpServletRequest.class)
+public class PackagePrivateConstructorModel {
+
+ @Inject
+ PackagePrivateConstructorModel() {
+ }
+
+}
diff --git a/src/test/java/org/apache/sling/models/testmodels/classes/constructorvisibility/PrivateConstructorModel.java b/src/test/java/org/apache/sling/models/testmodels/classes/constructorvisibility/PrivateConstructorModel.java
new file mode 100644
index 0000000..85eef0d
--- /dev/null
+++ b/src/test/java/org/apache/sling/models/testmodels/classes/constructorvisibility/PrivateConstructorModel.java
@@ -0,0 +1,31 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.sling.models.testmodels.classes.constructorvisibility;
+
+import javax.inject.Inject;
+
+import org.apache.sling.api.SlingHttpServletRequest;
+import org.apache.sling.models.annotations.Model;
+
+@Model(adaptables = SlingHttpServletRequest.class)
+public class PrivateConstructorModel {
+
+ @Inject
+ private PrivateConstructorModel() {
+ }
+
+}
diff --git a/src/test/java/org/apache/sling/models/testmodels/classes/constructorvisibility/ProtectedConstructorModel.java b/src/test/java/org/apache/sling/models/testmodels/classes/constructorvisibility/ProtectedConstructorModel.java
new file mode 100644
index 0000000..aa3f2de
--- /dev/null
+++ b/src/test/java/org/apache/sling/models/testmodels/classes/constructorvisibility/ProtectedConstructorModel.java
@@ -0,0 +1,31 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.sling.models.testmodels.classes.constructorvisibility;
+
+import javax.inject.Inject;
+
+import org.apache.sling.api.SlingHttpServletRequest;
+import org.apache.sling.models.annotations.Model;
+
+@Model(adaptables = SlingHttpServletRequest.class)
+public class ProtectedConstructorModel {
+
+ @Inject
+ protected ProtectedConstructorModel() {
+ }
+
+}
diff --git a/src/test/java/org/apache/sling/models/testmodels/interfaces/AdapterType1.java b/src/test/java/org/apache/sling/models/testmodels/interfaces/AdapterType1.java
new file mode 100644
index 0000000..74ba097
--- /dev/null
+++ b/src/test/java/org/apache/sling/models/testmodels/interfaces/AdapterType1.java
@@ -0,0 +1,20 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.sling.models.testmodels.interfaces;
+
+public interface AdapterType1 {
+}
diff --git a/src/test/java/org/apache/sling/models/testmodels/interfaces/AdapterType2.java b/src/test/java/org/apache/sling/models/testmodels/interfaces/AdapterType2.java
new file mode 100644
index 0000000..ccd9d75
--- /dev/null
+++ b/src/test/java/org/apache/sling/models/testmodels/interfaces/AdapterType2.java
@@ -0,0 +1,20 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.sling.models.testmodels.interfaces;
+
+public interface AdapterType2 {
+}
diff --git a/src/test/java/org/apache/sling/models/testmodels/interfaces/AdapterType3.java b/src/test/java/org/apache/sling/models/testmodels/interfaces/AdapterType3.java
new file mode 100644
index 0000000..c629012
--- /dev/null
+++ b/src/test/java/org/apache/sling/models/testmodels/interfaces/AdapterType3.java
@@ -0,0 +1,20 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.sling.models.testmodels.interfaces;
+
+public interface AdapterType3 {
+}
diff --git a/src/test/java/org/apache/sling/models/testmodels/interfaces/ModelWithDefaultMethods.java b/src/test/java/org/apache/sling/models/testmodels/interfaces/ModelWithDefaultMethods.java
new file mode 100644
index 0000000..6c254e8
--- /dev/null
+++ b/src/test/java/org/apache/sling/models/testmodels/interfaces/ModelWithDefaultMethods.java
@@ -0,0 +1,33 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.sling.models.testmodels.interfaces;
+
+import org.apache.sling.api.resource.Resource;
+import org.apache.sling.models.annotations.Model;
+import org.apache.sling.models.annotations.Optional;
+
+import javax.inject.Inject;
+
+@Model(adaptables = Resource.class)
+public interface ModelWithDefaultMethods {
+
+ @Inject @Optional
+ default public String getProp() {
+ return "default";
+ }
+
+}
diff --git a/src/test/java/org/apache/sling/models/testutil/ModelAdapterFactoryUtil.java b/src/test/java/org/apache/sling/models/testutil/ModelAdapterFactoryUtil.java
index bd3a133..898a998 100644
--- a/src/test/java/org/apache/sling/models/testutil/ModelAdapterFactoryUtil.java
+++ b/src/test/java/org/apache/sling/models/testutil/ModelAdapterFactoryUtil.java
@@ -44,7 +44,7 @@
* for registering sling model classes in ModelAdapterFactory.
*/
public final class ModelAdapterFactoryUtil {
-
+
private ModelAdapterFactoryUtil() {
// static methods only
}
@@ -77,14 +77,14 @@
}
@Override
- public Dictionary getHeaders() {
- Dictionary<String, Object> headers = new Hashtable<String, Object>();
+ public Dictionary<String,String> getHeaders() {
+ Dictionary<String, String> headers = new Hashtable<>();
headers.put("Sling-Model-Packages", "dummy.package");
return headers;
}
@Override
- public Enumeration findEntries(String path, String filePattern, boolean recurse) {
+ public Enumeration<URL> findEntries(String path, String filePattern, boolean recurse) {
Vector<URL> urls = new Vector<>(); // NOPMD
for (int i = 0; i < classes.length; i++) {
try {
@@ -98,7 +98,7 @@
}
@Override
- public Class loadClass(String name) throws ClassNotFoundException {
+ public Class<?> loadClass(String name) throws ClassNotFoundException {
return getClass().getClassLoader().loadClass(name);
}
@@ -153,12 +153,12 @@
}
@Override
- public ServiceReference[] getRegisteredServices() { // NOPMD
+ public ServiceReference<?>[] getRegisteredServices() { // NOPMD
return null;
}
@Override
- public ServiceReference[] getServicesInUse() { // NOPMD
+ public ServiceReference<?>[] getServicesInUse() { // NOPMD
return null;
}
@@ -173,7 +173,7 @@
}
@Override
- public Dictionary getHeaders(String locale) {
+ public Dictionary<String,String> getHeaders(String locale) {
return null;
}
@@ -183,12 +183,12 @@
}
@Override
- public Enumeration getResources(String name) throws IOException {
+ public Enumeration<URL> getResources(String name) throws IOException {
return null;
}
@Override
- public Enumeration getEntryPaths(String path) {
+ public Enumeration<String> getEntryPaths(String path) {
return null;
}