diff --git a/.gitignore b/.gitignore index 0a3f3d11..ea97cd3d 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,4 @@ -/target +target/ .vscode .idea .classpath diff --git a/.sling-module.json b/.sling-module.json index cfad4d23..12dc84ba 100644 --- a/.sling-module.json +++ b/.sling-module.json @@ -1,5 +1,6 @@ { "jenkins": { - "jdks": [17, 21] + "jdks": [17, 21], + "mavenGoal": "install" } } \ No newline at end of file diff --git a/bnd.bnd b/impl/bnd.bnd similarity index 100% rename from bnd.bnd rename to impl/bnd.bnd diff --git a/impl/pom.xml b/impl/pom.xml new file mode 100644 index 00000000..a338e039 --- /dev/null +++ b/impl/pom.xml @@ -0,0 +1,262 @@ + + + + 4.0.0 + + + org.apache.sling + org.apache.sling.models.impl.parent + 2.0.1-SNAPSHOT + ../parent/pom.xml + + + org.apache.sling.models.impl + 2.0.1-SNAPSHOT + Apache Sling Models Implementation + Apache Sling Models Implementation + + + 2025-08-27T03:14:05Z + 17 + + + + + org.apache.sling + org.apache.sling.models.api + provided + + + org.osgi + org.osgi.framework + provided + + + org.osgi + org.osgi.service.component + provided + + + org.osgi + org.osgi.util.tracker + provided + + + org.osgi + org.osgi.service.http.whiteboard + provided + + + + org.osgi + org.osgi.service.component.annotations + provided + + + org.osgi + org.osgi.service.metatype.annotations + provided + + + org.osgi + org.osgi.annotation.versioning + provided + + + + javax.servlet + javax.servlet-api + provided + + + jakarta.servlet + jakarta.servlet-api + provided + + + org.apache.felix + org.apache.felix.http.wrappers + 1.1.10 + provided + + + org.apache.commons + commons-lang3 + 3.18.0 + provided + + + org.apache.sling + org.apache.sling.api + 3.0.0 + provided + + + org.apache.sling + org.apache.sling.scripting.api + 2.2.0 + provided + + + org.slf4j + slf4j-api + provided + + + javax.inject + javax.inject + provided + + + org.osgi + org.osgi.util.converter + provided + + + + org.apache.sling + org.apache.sling.scripting.core + 3.0.0 + compile + + + org.apache.felix + org.apache.felix.utils + + + + + org.jetbrains + annotations + provided + + + + junit + junit + test + + + org.apache.sling + org.apache.sling.testing.osgi-mock.junit4 + 3.5.2 + test + + + org.mockito + mockito-core + 4.4.0 + test + + + org.hamcrest + hamcrest-junit + 2.0.0.0 + test + + + org.slf4j + slf4j-simple + test + + + org.apache.sling + org.apache.sling.servlet-helpers + 2.0.0 + test + + + + org.apache.commons + commons-collections4 + 4.1 + test + + + + org.springframework + spring-context + 5.3.39 + test + + + javax.annotation + javax.annotation-api + 1.3.2 + provided + + + + + + + org.apache.maven.plugins + maven-shade-plugin + + + + shade + + package + + true + true + + + org.apache.sling:org.apache.sling.scripting.core + + + + + org.apache.sling.scripting.core.impl.helper + slingmodelsimpl.org.apache.sling.scripting.core.impl.helper + + + + + org.apache.sling:org.apache.sling.scripting.core + + org/apache/sling/scripting/core/impl/helper/ProtectedBindings* + + + + + + + + + org.apache.rat + apache-rat-plugin + + + dependency-reduced-pom.xml + + + + + org.apache.maven.plugins + maven-source-plugin + + false + + + + + diff --git a/src/main/java/org/apache/sling/models/impl/AdapterImplementations.java b/impl/src/main/java/org/apache/sling/models/impl/AdapterImplementations.java similarity index 100% rename from src/main/java/org/apache/sling/models/impl/AdapterImplementations.java rename to impl/src/main/java/org/apache/sling/models/impl/AdapterImplementations.java diff --git a/src/main/java/org/apache/sling/models/impl/DisposalCallbackRegistryImpl.java b/impl/src/main/java/org/apache/sling/models/impl/DisposalCallbackRegistryImpl.java similarity index 100% rename from src/main/java/org/apache/sling/models/impl/DisposalCallbackRegistryImpl.java rename to impl/src/main/java/org/apache/sling/models/impl/DisposalCallbackRegistryImpl.java diff --git a/src/main/java/org/apache/sling/models/impl/ExportServlet.java b/impl/src/main/java/org/apache/sling/models/impl/ExportServlet.java similarity index 100% rename from src/main/java/org/apache/sling/models/impl/ExportServlet.java rename to impl/src/main/java/org/apache/sling/models/impl/ExportServlet.java diff --git a/src/main/java/org/apache/sling/models/impl/FirstImplementationPicker.java b/impl/src/main/java/org/apache/sling/models/impl/FirstImplementationPicker.java similarity index 100% rename from src/main/java/org/apache/sling/models/impl/FirstImplementationPicker.java rename to impl/src/main/java/org/apache/sling/models/impl/FirstImplementationPicker.java diff --git a/src/main/java/org/apache/sling/models/impl/MapBackedInvocationHandler.java b/impl/src/main/java/org/apache/sling/models/impl/MapBackedInvocationHandler.java similarity index 100% rename from src/main/java/org/apache/sling/models/impl/MapBackedInvocationHandler.java rename to impl/src/main/java/org/apache/sling/models/impl/MapBackedInvocationHandler.java diff --git a/src/main/java/org/apache/sling/models/impl/ModelAdapterFactory.java b/impl/src/main/java/org/apache/sling/models/impl/ModelAdapterFactory.java similarity index 100% rename from src/main/java/org/apache/sling/models/impl/ModelAdapterFactory.java rename to impl/src/main/java/org/apache/sling/models/impl/ModelAdapterFactory.java diff --git a/src/main/java/org/apache/sling/models/impl/ModelAdapterFactoryConfiguration.java b/impl/src/main/java/org/apache/sling/models/impl/ModelAdapterFactoryConfiguration.java similarity index 100% rename from src/main/java/org/apache/sling/models/impl/ModelAdapterFactoryConfiguration.java rename to impl/src/main/java/org/apache/sling/models/impl/ModelAdapterFactoryConfiguration.java diff --git a/src/main/java/org/apache/sling/models/impl/ModelConfigurationPrinter.java b/impl/src/main/java/org/apache/sling/models/impl/ModelConfigurationPrinter.java similarity index 100% rename from src/main/java/org/apache/sling/models/impl/ModelConfigurationPrinter.java rename to impl/src/main/java/org/apache/sling/models/impl/ModelConfigurationPrinter.java diff --git a/src/main/java/org/apache/sling/models/impl/ModelPackageBundleListener.java b/impl/src/main/java/org/apache/sling/models/impl/ModelPackageBundleListener.java similarity index 100% rename from src/main/java/org/apache/sling/models/impl/ModelPackageBundleListener.java rename to impl/src/main/java/org/apache/sling/models/impl/ModelPackageBundleListener.java diff --git a/src/main/java/org/apache/sling/models/impl/ReflectionUtil.java b/impl/src/main/java/org/apache/sling/models/impl/ReflectionUtil.java similarity index 100% rename from src/main/java/org/apache/sling/models/impl/ReflectionUtil.java rename to impl/src/main/java/org/apache/sling/models/impl/ReflectionUtil.java diff --git a/src/main/java/org/apache/sling/models/impl/ResourceOverridingJakartaRequestWrapper.java b/impl/src/main/java/org/apache/sling/models/impl/ResourceOverridingJakartaRequestWrapper.java similarity index 100% rename from src/main/java/org/apache/sling/models/impl/ResourceOverridingJakartaRequestWrapper.java rename to impl/src/main/java/org/apache/sling/models/impl/ResourceOverridingJakartaRequestWrapper.java diff --git a/src/main/java/org/apache/sling/models/impl/ResourceOverridingRequestWrapper.java b/impl/src/main/java/org/apache/sling/models/impl/ResourceOverridingRequestWrapper.java similarity index 100% rename from src/main/java/org/apache/sling/models/impl/ResourceOverridingRequestWrapper.java rename to impl/src/main/java/org/apache/sling/models/impl/ResourceOverridingRequestWrapper.java diff --git a/src/main/java/org/apache/sling/models/impl/ResourceTypeBasedResourcePicker.java b/impl/src/main/java/org/apache/sling/models/impl/ResourceTypeBasedResourcePicker.java similarity index 100% rename from src/main/java/org/apache/sling/models/impl/ResourceTypeBasedResourcePicker.java rename to impl/src/main/java/org/apache/sling/models/impl/ResourceTypeBasedResourcePicker.java diff --git a/src/main/java/org/apache/sling/models/impl/Result.java b/impl/src/main/java/org/apache/sling/models/impl/Result.java similarity index 100% rename from src/main/java/org/apache/sling/models/impl/Result.java rename to impl/src/main/java/org/apache/sling/models/impl/Result.java diff --git a/src/main/java/org/apache/sling/models/impl/SlingModelsScriptEngineFactory.java b/impl/src/main/java/org/apache/sling/models/impl/SlingModelsScriptEngineFactory.java similarity index 100% rename from src/main/java/org/apache/sling/models/impl/SlingModelsScriptEngineFactory.java rename to impl/src/main/java/org/apache/sling/models/impl/SlingModelsScriptEngineFactory.java diff --git a/src/main/java/org/apache/sling/models/impl/ThreadInvocationCounter.java b/impl/src/main/java/org/apache/sling/models/impl/ThreadInvocationCounter.java similarity index 100% rename from src/main/java/org/apache/sling/models/impl/ThreadInvocationCounter.java rename to impl/src/main/java/org/apache/sling/models/impl/ThreadInvocationCounter.java diff --git a/src/main/java/org/apache/sling/models/impl/injectors/AbstractInjector.java b/impl/src/main/java/org/apache/sling/models/impl/injectors/AbstractInjector.java similarity index 100% rename from src/main/java/org/apache/sling/models/impl/injectors/AbstractInjector.java rename to impl/src/main/java/org/apache/sling/models/impl/injectors/AbstractInjector.java diff --git a/src/main/java/org/apache/sling/models/impl/injectors/BindingsInjector.java b/impl/src/main/java/org/apache/sling/models/impl/injectors/BindingsInjector.java similarity index 100% rename from src/main/java/org/apache/sling/models/impl/injectors/BindingsInjector.java rename to impl/src/main/java/org/apache/sling/models/impl/injectors/BindingsInjector.java diff --git a/src/main/java/org/apache/sling/models/impl/injectors/ChildResourceInjector.java b/impl/src/main/java/org/apache/sling/models/impl/injectors/ChildResourceInjector.java similarity index 100% rename from src/main/java/org/apache/sling/models/impl/injectors/ChildResourceInjector.java rename to impl/src/main/java/org/apache/sling/models/impl/injectors/ChildResourceInjector.java diff --git a/src/main/java/org/apache/sling/models/impl/injectors/OSGiServiceInjector.java b/impl/src/main/java/org/apache/sling/models/impl/injectors/OSGiServiceInjector.java similarity index 100% rename from src/main/java/org/apache/sling/models/impl/injectors/OSGiServiceInjector.java rename to impl/src/main/java/org/apache/sling/models/impl/injectors/OSGiServiceInjector.java diff --git a/src/main/java/org/apache/sling/models/impl/injectors/RequestAttributeInjector.java b/impl/src/main/java/org/apache/sling/models/impl/injectors/RequestAttributeInjector.java similarity index 100% rename from src/main/java/org/apache/sling/models/impl/injectors/RequestAttributeInjector.java rename to impl/src/main/java/org/apache/sling/models/impl/injectors/RequestAttributeInjector.java diff --git a/src/main/java/org/apache/sling/models/impl/injectors/ResourcePathInjector.java b/impl/src/main/java/org/apache/sling/models/impl/injectors/ResourcePathInjector.java similarity index 100% rename from src/main/java/org/apache/sling/models/impl/injectors/ResourcePathInjector.java rename to impl/src/main/java/org/apache/sling/models/impl/injectors/ResourcePathInjector.java diff --git a/src/main/java/org/apache/sling/models/impl/injectors/SelfInjector.java b/impl/src/main/java/org/apache/sling/models/impl/injectors/SelfInjector.java similarity index 100% rename from src/main/java/org/apache/sling/models/impl/injectors/SelfInjector.java rename to impl/src/main/java/org/apache/sling/models/impl/injectors/SelfInjector.java diff --git a/src/main/java/org/apache/sling/models/impl/injectors/SlingObjectInjector.java b/impl/src/main/java/org/apache/sling/models/impl/injectors/SlingObjectInjector.java similarity index 100% rename from src/main/java/org/apache/sling/models/impl/injectors/SlingObjectInjector.java rename to impl/src/main/java/org/apache/sling/models/impl/injectors/SlingObjectInjector.java diff --git a/src/main/java/org/apache/sling/models/impl/injectors/ValueMapInjector.java b/impl/src/main/java/org/apache/sling/models/impl/injectors/ValueMapInjector.java similarity index 100% rename from src/main/java/org/apache/sling/models/impl/injectors/ValueMapInjector.java rename to impl/src/main/java/org/apache/sling/models/impl/injectors/ValueMapInjector.java diff --git a/src/main/java/org/apache/sling/models/impl/model/AbstractInjectableElement.java b/impl/src/main/java/org/apache/sling/models/impl/model/AbstractInjectableElement.java similarity index 100% rename from src/main/java/org/apache/sling/models/impl/model/AbstractInjectableElement.java rename to impl/src/main/java/org/apache/sling/models/impl/model/AbstractInjectableElement.java diff --git a/src/main/java/org/apache/sling/models/impl/model/ConstructorParameter.java b/impl/src/main/java/org/apache/sling/models/impl/model/ConstructorParameter.java similarity index 100% rename from src/main/java/org/apache/sling/models/impl/model/ConstructorParameter.java rename to impl/src/main/java/org/apache/sling/models/impl/model/ConstructorParameter.java diff --git a/src/main/java/org/apache/sling/models/impl/model/InjectableElement.java b/impl/src/main/java/org/apache/sling/models/impl/model/InjectableElement.java similarity index 100% rename from src/main/java/org/apache/sling/models/impl/model/InjectableElement.java rename to impl/src/main/java/org/apache/sling/models/impl/model/InjectableElement.java diff --git a/src/main/java/org/apache/sling/models/impl/model/InjectableField.java b/impl/src/main/java/org/apache/sling/models/impl/model/InjectableField.java similarity index 100% rename from src/main/java/org/apache/sling/models/impl/model/InjectableField.java rename to impl/src/main/java/org/apache/sling/models/impl/model/InjectableField.java diff --git a/src/main/java/org/apache/sling/models/impl/model/InjectableMethod.java b/impl/src/main/java/org/apache/sling/models/impl/model/InjectableMethod.java similarity index 100% rename from src/main/java/org/apache/sling/models/impl/model/InjectableMethod.java rename to impl/src/main/java/org/apache/sling/models/impl/model/InjectableMethod.java diff --git a/src/main/java/org/apache/sling/models/impl/model/ModelClass.java b/impl/src/main/java/org/apache/sling/models/impl/model/ModelClass.java similarity index 100% rename from src/main/java/org/apache/sling/models/impl/model/ModelClass.java rename to impl/src/main/java/org/apache/sling/models/impl/model/ModelClass.java diff --git a/src/main/java/org/apache/sling/models/impl/model/ModelClassConstructor.java b/impl/src/main/java/org/apache/sling/models/impl/model/ModelClassConstructor.java similarity index 100% rename from src/main/java/org/apache/sling/models/impl/model/ModelClassConstructor.java rename to impl/src/main/java/org/apache/sling/models/impl/model/ModelClassConstructor.java diff --git a/src/main/java/org/apache/sling/models/impl/model/OptionalTypedInjectableElement.java b/impl/src/main/java/org/apache/sling/models/impl/model/OptionalTypedInjectableElement.java similarity index 100% rename from src/main/java/org/apache/sling/models/impl/model/OptionalTypedInjectableElement.java rename to impl/src/main/java/org/apache/sling/models/impl/model/OptionalTypedInjectableElement.java diff --git a/src/main/java/org/apache/sling/models/impl/model/ParameterCountInjectComparator.java b/impl/src/main/java/org/apache/sling/models/impl/model/ParameterCountInjectComparator.java similarity index 100% rename from src/main/java/org/apache/sling/models/impl/model/ParameterCountInjectComparator.java rename to impl/src/main/java/org/apache/sling/models/impl/model/ParameterCountInjectComparator.java diff --git a/src/main/java/org/apache/sling/models/impl/via/AbstractResourceTypeViaProvider.java b/impl/src/main/java/org/apache/sling/models/impl/via/AbstractResourceTypeViaProvider.java similarity index 100% rename from src/main/java/org/apache/sling/models/impl/via/AbstractResourceTypeViaProvider.java rename to impl/src/main/java/org/apache/sling/models/impl/via/AbstractResourceTypeViaProvider.java diff --git a/src/main/java/org/apache/sling/models/impl/via/BeanPropertyViaProvider.java b/impl/src/main/java/org/apache/sling/models/impl/via/BeanPropertyViaProvider.java similarity index 100% rename from src/main/java/org/apache/sling/models/impl/via/BeanPropertyViaProvider.java rename to impl/src/main/java/org/apache/sling/models/impl/via/BeanPropertyViaProvider.java diff --git a/src/main/java/org/apache/sling/models/impl/via/ChildResourceViaProvider.java b/impl/src/main/java/org/apache/sling/models/impl/via/ChildResourceViaProvider.java similarity index 100% rename from src/main/java/org/apache/sling/models/impl/via/ChildResourceViaProvider.java rename to impl/src/main/java/org/apache/sling/models/impl/via/ChildResourceViaProvider.java diff --git a/src/main/java/org/apache/sling/models/impl/via/ForcedResourceTypeViaProvider.java b/impl/src/main/java/org/apache/sling/models/impl/via/ForcedResourceTypeViaProvider.java similarity index 100% rename from src/main/java/org/apache/sling/models/impl/via/ForcedResourceTypeViaProvider.java rename to impl/src/main/java/org/apache/sling/models/impl/via/ForcedResourceTypeViaProvider.java diff --git a/src/main/java/org/apache/sling/models/impl/via/OriginalResourceTypeViaProvider.java b/impl/src/main/java/org/apache/sling/models/impl/via/OriginalResourceTypeViaProvider.java similarity index 100% rename from src/main/java/org/apache/sling/models/impl/via/OriginalResourceTypeViaProvider.java rename to impl/src/main/java/org/apache/sling/models/impl/via/OriginalResourceTypeViaProvider.java diff --git a/src/main/java/org/apache/sling/models/impl/via/ResourceSuperTypeViaProvider.java b/impl/src/main/java/org/apache/sling/models/impl/via/ResourceSuperTypeViaProvider.java similarity index 100% rename from src/main/java/org/apache/sling/models/impl/via/ResourceSuperTypeViaProvider.java rename to impl/src/main/java/org/apache/sling/models/impl/via/ResourceSuperTypeViaProvider.java diff --git a/src/main/java/org/apache/sling/models/impl/via/ResourceTypeForcingJakartaRequestWrapper.java b/impl/src/main/java/org/apache/sling/models/impl/via/ResourceTypeForcingJakartaRequestWrapper.java similarity index 100% rename from src/main/java/org/apache/sling/models/impl/via/ResourceTypeForcingJakartaRequestWrapper.java rename to impl/src/main/java/org/apache/sling/models/impl/via/ResourceTypeForcingJakartaRequestWrapper.java diff --git a/src/main/java/org/apache/sling/models/impl/via/ResourceTypeForcingRequestWrapper.java b/impl/src/main/java/org/apache/sling/models/impl/via/ResourceTypeForcingRequestWrapper.java similarity index 100% rename from src/main/java/org/apache/sling/models/impl/via/ResourceTypeForcingRequestWrapper.java rename to impl/src/main/java/org/apache/sling/models/impl/via/ResourceTypeForcingRequestWrapper.java diff --git a/src/main/java/org/apache/sling/models/impl/via/ResourceTypeForcingResourceWrapper.java b/impl/src/main/java/org/apache/sling/models/impl/via/ResourceTypeForcingResourceWrapper.java similarity index 100% rename from src/main/java/org/apache/sling/models/impl/via/ResourceTypeForcingResourceWrapper.java rename to impl/src/main/java/org/apache/sling/models/impl/via/ResourceTypeForcingResourceWrapper.java diff --git a/src/test/java/org/apache/sling/models/impl/AdapterFactoryTest.java b/impl/src/test/java/org/apache/sling/models/impl/AdapterFactoryTest.java similarity index 100% rename from src/test/java/org/apache/sling/models/impl/AdapterFactoryTest.java rename to impl/src/test/java/org/apache/sling/models/impl/AdapterFactoryTest.java diff --git a/src/test/java/org/apache/sling/models/impl/AdapterImplementationsTest.java b/impl/src/test/java/org/apache/sling/models/impl/AdapterImplementationsTest.java similarity index 100% rename from src/test/java/org/apache/sling/models/impl/AdapterImplementationsTest.java rename to impl/src/test/java/org/apache/sling/models/impl/AdapterImplementationsTest.java diff --git a/src/test/java/org/apache/sling/models/impl/AnnotationConflictsTest.java b/impl/src/test/java/org/apache/sling/models/impl/AnnotationConflictsTest.java similarity index 100% rename from src/test/java/org/apache/sling/models/impl/AnnotationConflictsTest.java rename to impl/src/test/java/org/apache/sling/models/impl/AnnotationConflictsTest.java diff --git a/src/test/java/org/apache/sling/models/impl/CachingTest.java b/impl/src/test/java/org/apache/sling/models/impl/CachingTest.java similarity index 100% rename from src/test/java/org/apache/sling/models/impl/CachingTest.java rename to impl/src/test/java/org/apache/sling/models/impl/CachingTest.java diff --git a/src/test/java/org/apache/sling/models/impl/ConstructorTest.java b/impl/src/test/java/org/apache/sling/models/impl/ConstructorTest.java similarity index 100% rename from src/test/java/org/apache/sling/models/impl/ConstructorTest.java rename to impl/src/test/java/org/apache/sling/models/impl/ConstructorTest.java diff --git a/src/test/java/org/apache/sling/models/impl/ConstructorVisibilityTest.java b/impl/src/test/java/org/apache/sling/models/impl/ConstructorVisibilityTest.java similarity index 100% rename from src/test/java/org/apache/sling/models/impl/ConstructorVisibilityTest.java rename to impl/src/test/java/org/apache/sling/models/impl/ConstructorVisibilityTest.java diff --git a/src/test/java/org/apache/sling/models/impl/CustomInjectorTest.java b/impl/src/test/java/org/apache/sling/models/impl/CustomInjectorTest.java similarity index 100% rename from src/test/java/org/apache/sling/models/impl/CustomInjectorTest.java rename to impl/src/test/java/org/apache/sling/models/impl/CustomInjectorTest.java diff --git a/src/test/java/org/apache/sling/models/impl/DefaultInterfaceMethodTest.java b/impl/src/test/java/org/apache/sling/models/impl/DefaultInterfaceMethodTest.java similarity index 100% rename from src/test/java/org/apache/sling/models/impl/DefaultInterfaceMethodTest.java rename to impl/src/test/java/org/apache/sling/models/impl/DefaultInterfaceMethodTest.java diff --git a/src/test/java/org/apache/sling/models/impl/DefaultTest.java b/impl/src/test/java/org/apache/sling/models/impl/DefaultTest.java similarity index 100% rename from src/test/java/org/apache/sling/models/impl/DefaultTest.java rename to impl/src/test/java/org/apache/sling/models/impl/DefaultTest.java diff --git a/src/test/java/org/apache/sling/models/impl/ExtraDefaultTests.java b/impl/src/test/java/org/apache/sling/models/impl/ExtraDefaultTests.java similarity index 100% rename from src/test/java/org/apache/sling/models/impl/ExtraDefaultTests.java rename to impl/src/test/java/org/apache/sling/models/impl/ExtraDefaultTests.java diff --git a/src/test/java/org/apache/sling/models/impl/ImplementsExtendsTest.java b/impl/src/test/java/org/apache/sling/models/impl/ImplementsExtendsTest.java similarity index 100% rename from src/test/java/org/apache/sling/models/impl/ImplementsExtendsTest.java rename to impl/src/test/java/org/apache/sling/models/impl/ImplementsExtendsTest.java diff --git a/src/test/java/org/apache/sling/models/impl/InjectorSpecificAnnotationTest.java b/impl/src/test/java/org/apache/sling/models/impl/InjectorSpecificAnnotationTest.java similarity index 100% rename from src/test/java/org/apache/sling/models/impl/InjectorSpecificAnnotationTest.java rename to impl/src/test/java/org/apache/sling/models/impl/InjectorSpecificAnnotationTest.java diff --git a/src/test/java/org/apache/sling/models/impl/InterfaceInheritanceTest.java b/impl/src/test/java/org/apache/sling/models/impl/InterfaceInheritanceTest.java similarity index 100% rename from src/test/java/org/apache/sling/models/impl/InterfaceInheritanceTest.java rename to impl/src/test/java/org/apache/sling/models/impl/InterfaceInheritanceTest.java diff --git a/src/test/java/org/apache/sling/models/impl/InvalidAdaptationsTest.java b/impl/src/test/java/org/apache/sling/models/impl/InvalidAdaptationsTest.java similarity index 100% rename from src/test/java/org/apache/sling/models/impl/InvalidAdaptationsTest.java rename to impl/src/test/java/org/apache/sling/models/impl/InvalidAdaptationsTest.java diff --git a/src/test/java/org/apache/sling/models/impl/ModelAdapterFactoryTest.java b/impl/src/test/java/org/apache/sling/models/impl/ModelAdapterFactoryTest.java similarity index 100% rename from src/test/java/org/apache/sling/models/impl/ModelAdapterFactoryTest.java rename to impl/src/test/java/org/apache/sling/models/impl/ModelAdapterFactoryTest.java diff --git a/src/test/java/org/apache/sling/models/impl/ModelAdapterFactory_ImplementationPickerOrderTest.java b/impl/src/test/java/org/apache/sling/models/impl/ModelAdapterFactory_ImplementationPickerOrderTest.java similarity index 100% rename from src/test/java/org/apache/sling/models/impl/ModelAdapterFactory_ImplementationPickerOrderTest.java rename to impl/src/test/java/org/apache/sling/models/impl/ModelAdapterFactory_ImplementationPickerOrderTest.java diff --git a/src/test/java/org/apache/sling/models/impl/ModelAdapterFactory_InjectorOrderTest.java b/impl/src/test/java/org/apache/sling/models/impl/ModelAdapterFactory_InjectorOrderTest.java similarity index 100% rename from src/test/java/org/apache/sling/models/impl/ModelAdapterFactory_InjectorOrderTest.java rename to impl/src/test/java/org/apache/sling/models/impl/ModelAdapterFactory_InjectorOrderTest.java diff --git a/src/test/java/org/apache/sling/models/impl/ModelPackageBundleListenerTest.java b/impl/src/test/java/org/apache/sling/models/impl/ModelPackageBundleListenerTest.java similarity index 100% rename from src/test/java/org/apache/sling/models/impl/ModelPackageBundleListenerTest.java rename to impl/src/test/java/org/apache/sling/models/impl/ModelPackageBundleListenerTest.java diff --git a/src/test/java/org/apache/sling/models/impl/MultipleInjectorTest.java b/impl/src/test/java/org/apache/sling/models/impl/MultipleInjectorTest.java similarity index 100% rename from src/test/java/org/apache/sling/models/impl/MultipleInjectorTest.java rename to impl/src/test/java/org/apache/sling/models/impl/MultipleInjectorTest.java diff --git a/src/test/java/org/apache/sling/models/impl/OSGiInjectionTest.java b/impl/src/test/java/org/apache/sling/models/impl/OSGiInjectionTest.java similarity index 100% rename from src/test/java/org/apache/sling/models/impl/OSGiInjectionTest.java rename to impl/src/test/java/org/apache/sling/models/impl/OSGiInjectionTest.java diff --git a/src/test/java/org/apache/sling/models/impl/OptionalObjectsTest.java b/impl/src/test/java/org/apache/sling/models/impl/OptionalObjectsTest.java similarity index 100% rename from src/test/java/org/apache/sling/models/impl/OptionalObjectsTest.java rename to impl/src/test/java/org/apache/sling/models/impl/OptionalObjectsTest.java diff --git a/src/test/java/org/apache/sling/models/impl/OptionalPrimitivesTest.java b/impl/src/test/java/org/apache/sling/models/impl/OptionalPrimitivesTest.java similarity index 100% rename from src/test/java/org/apache/sling/models/impl/OptionalPrimitivesTest.java rename to impl/src/test/java/org/apache/sling/models/impl/OptionalPrimitivesTest.java diff --git a/src/test/java/org/apache/sling/models/impl/ParameterizedTypeFromRequestAttributeTest.java b/impl/src/test/java/org/apache/sling/models/impl/ParameterizedTypeFromRequestAttributeTest.java similarity index 100% rename from src/test/java/org/apache/sling/models/impl/ParameterizedTypeFromRequestAttributeTest.java rename to impl/src/test/java/org/apache/sling/models/impl/ParameterizedTypeFromRequestAttributeTest.java diff --git a/src/test/java/org/apache/sling/models/impl/PostConstructTest.java b/impl/src/test/java/org/apache/sling/models/impl/PostConstructTest.java similarity index 100% rename from src/test/java/org/apache/sling/models/impl/PostConstructTest.java rename to impl/src/test/java/org/apache/sling/models/impl/PostConstructTest.java diff --git a/src/test/java/org/apache/sling/models/impl/ReflectionUtilTest.java b/impl/src/test/java/org/apache/sling/models/impl/ReflectionUtilTest.java similarity index 100% rename from src/test/java/org/apache/sling/models/impl/ReflectionUtilTest.java rename to impl/src/test/java/org/apache/sling/models/impl/ReflectionUtilTest.java diff --git a/src/test/java/org/apache/sling/models/impl/RequestDisposalTest.java b/impl/src/test/java/org/apache/sling/models/impl/RequestDisposalTest.java similarity index 100% rename from src/test/java/org/apache/sling/models/impl/RequestDisposalTest.java rename to impl/src/test/java/org/apache/sling/models/impl/RequestDisposalTest.java diff --git a/src/test/java/org/apache/sling/models/impl/RequestInjectionTest.java b/impl/src/test/java/org/apache/sling/models/impl/RequestInjectionTest.java similarity index 100% rename from src/test/java/org/apache/sling/models/impl/RequestInjectionTest.java rename to impl/src/test/java/org/apache/sling/models/impl/RequestInjectionTest.java diff --git a/src/test/java/org/apache/sling/models/impl/RequestWrapperTest.java b/impl/src/test/java/org/apache/sling/models/impl/RequestWrapperTest.java similarity index 100% rename from src/test/java/org/apache/sling/models/impl/RequestWrapperTest.java rename to impl/src/test/java/org/apache/sling/models/impl/RequestWrapperTest.java diff --git a/src/test/java/org/apache/sling/models/impl/ResourceModelClassesTest.java b/impl/src/test/java/org/apache/sling/models/impl/ResourceModelClassesTest.java similarity index 100% rename from src/test/java/org/apache/sling/models/impl/ResourceModelClassesTest.java rename to impl/src/test/java/org/apache/sling/models/impl/ResourceModelClassesTest.java diff --git a/src/test/java/org/apache/sling/models/impl/ResourceModelConstructorTest.java b/impl/src/test/java/org/apache/sling/models/impl/ResourceModelConstructorTest.java similarity index 100% rename from src/test/java/org/apache/sling/models/impl/ResourceModelConstructorTest.java rename to impl/src/test/java/org/apache/sling/models/impl/ResourceModelConstructorTest.java diff --git a/src/test/java/org/apache/sling/models/impl/ResourceModelInterfacesTest.java b/impl/src/test/java/org/apache/sling/models/impl/ResourceModelInterfacesTest.java similarity index 100% rename from src/test/java/org/apache/sling/models/impl/ResourceModelInterfacesTest.java rename to impl/src/test/java/org/apache/sling/models/impl/ResourceModelInterfacesTest.java diff --git a/src/test/java/org/apache/sling/models/impl/ResourceOverridingJakartaRequestWrapperTest.java b/impl/src/test/java/org/apache/sling/models/impl/ResourceOverridingJakartaRequestWrapperTest.java similarity index 100% rename from src/test/java/org/apache/sling/models/impl/ResourceOverridingJakartaRequestWrapperTest.java rename to impl/src/test/java/org/apache/sling/models/impl/ResourceOverridingJakartaRequestWrapperTest.java diff --git a/src/test/java/org/apache/sling/models/impl/ResourceOverridingRequestWrapperTest.java b/impl/src/test/java/org/apache/sling/models/impl/ResourceOverridingRequestWrapperTest.java similarity index 100% rename from src/test/java/org/apache/sling/models/impl/ResourceOverridingRequestWrapperTest.java rename to impl/src/test/java/org/apache/sling/models/impl/ResourceOverridingRequestWrapperTest.java diff --git a/src/test/java/org/apache/sling/models/impl/ResourcePathInjectionTest.java b/impl/src/test/java/org/apache/sling/models/impl/ResourcePathInjectionTest.java similarity index 100% rename from src/test/java/org/apache/sling/models/impl/ResourcePathInjectionTest.java rename to impl/src/test/java/org/apache/sling/models/impl/ResourcePathInjectionTest.java diff --git a/src/test/java/org/apache/sling/models/impl/SelfDependencyTest.java b/impl/src/test/java/org/apache/sling/models/impl/SelfDependencyTest.java similarity index 100% rename from src/test/java/org/apache/sling/models/impl/SelfDependencyTest.java rename to impl/src/test/java/org/apache/sling/models/impl/SelfDependencyTest.java diff --git a/src/test/java/org/apache/sling/models/impl/ServicePropertiesMap.java b/impl/src/test/java/org/apache/sling/models/impl/ServicePropertiesMap.java similarity index 100% rename from src/test/java/org/apache/sling/models/impl/ServicePropertiesMap.java rename to impl/src/test/java/org/apache/sling/models/impl/ServicePropertiesMap.java diff --git a/src/test/java/org/apache/sling/models/impl/StaticInjectionAPFLoadOrderTest.java b/impl/src/test/java/org/apache/sling/models/impl/StaticInjectionAPFLoadOrderTest.java similarity index 100% rename from src/test/java/org/apache/sling/models/impl/StaticInjectionAPFLoadOrderTest.java rename to impl/src/test/java/org/apache/sling/models/impl/StaticInjectionAPFLoadOrderTest.java diff --git a/src/test/java/org/apache/sling/models/impl/ViaTest.java b/impl/src/test/java/org/apache/sling/models/impl/ViaTest.java similarity index 100% rename from src/test/java/org/apache/sling/models/impl/ViaTest.java rename to impl/src/test/java/org/apache/sling/models/impl/ViaTest.java diff --git a/src/test/java/org/apache/sling/models/impl/implpicker/FirstImplementationPickerTest.java b/impl/src/test/java/org/apache/sling/models/impl/implpicker/FirstImplementationPickerTest.java similarity index 100% rename from src/test/java/org/apache/sling/models/impl/implpicker/FirstImplementationPickerTest.java rename to impl/src/test/java/org/apache/sling/models/impl/implpicker/FirstImplementationPickerTest.java diff --git a/src/test/java/org/apache/sling/models/impl/injector/CustomAnnotation.java b/impl/src/test/java/org/apache/sling/models/impl/injector/CustomAnnotation.java similarity index 100% rename from src/test/java/org/apache/sling/models/impl/injector/CustomAnnotation.java rename to impl/src/test/java/org/apache/sling/models/impl/injector/CustomAnnotation.java diff --git a/src/test/java/org/apache/sling/models/impl/injector/CustomAnnotationInjector.java b/impl/src/test/java/org/apache/sling/models/impl/injector/CustomAnnotationInjector.java similarity index 100% rename from src/test/java/org/apache/sling/models/impl/injector/CustomAnnotationInjector.java rename to impl/src/test/java/org/apache/sling/models/impl/injector/CustomAnnotationInjector.java diff --git a/src/test/java/org/apache/sling/models/impl/injector/SimpleInjector.java b/impl/src/test/java/org/apache/sling/models/impl/injector/SimpleInjector.java similarity index 100% rename from src/test/java/org/apache/sling/models/impl/injector/SimpleInjector.java rename to impl/src/test/java/org/apache/sling/models/impl/injector/SimpleInjector.java diff --git a/src/test/java/org/apache/sling/models/impl/injectors/BindingsInjectorTest.java b/impl/src/test/java/org/apache/sling/models/impl/injectors/BindingsInjectorTest.java similarity index 100% rename from src/test/java/org/apache/sling/models/impl/injectors/BindingsInjectorTest.java rename to impl/src/test/java/org/apache/sling/models/impl/injectors/BindingsInjectorTest.java diff --git a/src/test/java/org/apache/sling/models/impl/injectors/RequestAttributeInjectorTest.java b/impl/src/test/java/org/apache/sling/models/impl/injectors/RequestAttributeInjectorTest.java similarity index 100% rename from src/test/java/org/apache/sling/models/impl/injectors/RequestAttributeInjectorTest.java rename to impl/src/test/java/org/apache/sling/models/impl/injectors/RequestAttributeInjectorTest.java diff --git a/src/test/java/org/apache/sling/models/impl/injectors/ResourcePathInjectorTest.java b/impl/src/test/java/org/apache/sling/models/impl/injectors/ResourcePathInjectorTest.java similarity index 100% rename from src/test/java/org/apache/sling/models/impl/injectors/ResourcePathInjectorTest.java rename to impl/src/test/java/org/apache/sling/models/impl/injectors/ResourcePathInjectorTest.java diff --git a/src/test/java/org/apache/sling/models/impl/injectors/ResourceResolverInjectorTest.java b/impl/src/test/java/org/apache/sling/models/impl/injectors/ResourceResolverInjectorTest.java similarity index 100% rename from src/test/java/org/apache/sling/models/impl/injectors/ResourceResolverInjectorTest.java rename to impl/src/test/java/org/apache/sling/models/impl/injectors/ResourceResolverInjectorTest.java diff --git a/src/test/java/org/apache/sling/models/impl/injectors/SelfInjectorTest.java b/impl/src/test/java/org/apache/sling/models/impl/injectors/SelfInjectorTest.java similarity index 100% rename from src/test/java/org/apache/sling/models/impl/injectors/SelfInjectorTest.java rename to impl/src/test/java/org/apache/sling/models/impl/injectors/SelfInjectorTest.java diff --git a/src/test/java/org/apache/sling/models/impl/injectors/SlingObjectInjectorRequestTest.java b/impl/src/test/java/org/apache/sling/models/impl/injectors/SlingObjectInjectorRequestTest.java similarity index 100% rename from src/test/java/org/apache/sling/models/impl/injectors/SlingObjectInjectorRequestTest.java rename to impl/src/test/java/org/apache/sling/models/impl/injectors/SlingObjectInjectorRequestTest.java diff --git a/src/test/java/org/apache/sling/models/impl/injectors/SlingObjectInjectorResourceResolverTest.java b/impl/src/test/java/org/apache/sling/models/impl/injectors/SlingObjectInjectorResourceResolverTest.java similarity index 100% rename from src/test/java/org/apache/sling/models/impl/injectors/SlingObjectInjectorResourceResolverTest.java rename to impl/src/test/java/org/apache/sling/models/impl/injectors/SlingObjectInjectorResourceResolverTest.java diff --git a/src/test/java/org/apache/sling/models/impl/injectors/SlingObjectInjectorResourceTest.java b/impl/src/test/java/org/apache/sling/models/impl/injectors/SlingObjectInjectorResourceTest.java similarity index 100% rename from src/test/java/org/apache/sling/models/impl/injectors/SlingObjectInjectorResourceTest.java rename to impl/src/test/java/org/apache/sling/models/impl/injectors/SlingObjectInjectorResourceTest.java diff --git a/src/test/java/org/apache/sling/models/impl/injectors/ValueMapInjectorTest.java b/impl/src/test/java/org/apache/sling/models/impl/injectors/ValueMapInjectorTest.java similarity index 100% rename from src/test/java/org/apache/sling/models/impl/injectors/ValueMapInjectorTest.java rename to impl/src/test/java/org/apache/sling/models/impl/injectors/ValueMapInjectorTest.java diff --git a/src/test/java/org/apache/sling/models/impl/via/AbstractResourceTypeViaProviderTest.java b/impl/src/test/java/org/apache/sling/models/impl/via/AbstractResourceTypeViaProviderTest.java similarity index 100% rename from src/test/java/org/apache/sling/models/impl/via/AbstractResourceTypeViaProviderTest.java rename to impl/src/test/java/org/apache/sling/models/impl/via/AbstractResourceTypeViaProviderTest.java diff --git a/src/test/java/org/apache/sling/models/impl/via/BeanPropertyViaProviderTest.java b/impl/src/test/java/org/apache/sling/models/impl/via/BeanPropertyViaProviderTest.java similarity index 100% rename from src/test/java/org/apache/sling/models/impl/via/BeanPropertyViaProviderTest.java rename to impl/src/test/java/org/apache/sling/models/impl/via/BeanPropertyViaProviderTest.java diff --git a/src/test/java/org/apache/sling/models/impl/via/ChildResourceViaProviderTest.java b/impl/src/test/java/org/apache/sling/models/impl/via/ChildResourceViaProviderTest.java similarity index 100% rename from src/test/java/org/apache/sling/models/impl/via/ChildResourceViaProviderTest.java rename to impl/src/test/java/org/apache/sling/models/impl/via/ChildResourceViaProviderTest.java diff --git a/src/test/java/org/apache/sling/models/impl/via/ForcedResourceTypeViaProviderTest.java b/impl/src/test/java/org/apache/sling/models/impl/via/ForcedResourceTypeViaProviderTest.java similarity index 100% rename from src/test/java/org/apache/sling/models/impl/via/ForcedResourceTypeViaProviderTest.java rename to impl/src/test/java/org/apache/sling/models/impl/via/ForcedResourceTypeViaProviderTest.java diff --git a/src/test/java/org/apache/sling/models/impl/via/OriginalResourceTypeViaProviderTest.java b/impl/src/test/java/org/apache/sling/models/impl/via/OriginalResourceTypeViaProviderTest.java similarity index 100% rename from src/test/java/org/apache/sling/models/impl/via/OriginalResourceTypeViaProviderTest.java rename to impl/src/test/java/org/apache/sling/models/impl/via/OriginalResourceTypeViaProviderTest.java diff --git a/src/test/java/org/apache/sling/models/impl/via/ResourceSuperTypeViaProviderTest.java b/impl/src/test/java/org/apache/sling/models/impl/via/ResourceSuperTypeViaProviderTest.java similarity index 100% rename from src/test/java/org/apache/sling/models/impl/via/ResourceSuperTypeViaProviderTest.java rename to impl/src/test/java/org/apache/sling/models/impl/via/ResourceSuperTypeViaProviderTest.java diff --git a/src/test/java/org/apache/sling/models/impl/via/ResourceTypeForcingJakartaRequestWrapperTest.java b/impl/src/test/java/org/apache/sling/models/impl/via/ResourceTypeForcingJakartaRequestWrapperTest.java similarity index 100% rename from src/test/java/org/apache/sling/models/impl/via/ResourceTypeForcingJakartaRequestWrapperTest.java rename to impl/src/test/java/org/apache/sling/models/impl/via/ResourceTypeForcingJakartaRequestWrapperTest.java diff --git a/src/test/java/org/apache/sling/models/impl/via/ResourceTypeForcingRequestWrapperTest.java b/impl/src/test/java/org/apache/sling/models/impl/via/ResourceTypeForcingRequestWrapperTest.java similarity index 100% rename from src/test/java/org/apache/sling/models/impl/via/ResourceTypeForcingRequestWrapperTest.java rename to impl/src/test/java/org/apache/sling/models/impl/via/ResourceTypeForcingRequestWrapperTest.java diff --git a/src/test/java/org/apache/sling/models/testmodels/classes/ArrayOSGiModel.java b/impl/src/test/java/org/apache/sling/models/testmodels/classes/ArrayOSGiModel.java similarity index 100% rename from src/test/java/org/apache/sling/models/testmodels/classes/ArrayOSGiModel.java rename to impl/src/test/java/org/apache/sling/models/testmodels/classes/ArrayOSGiModel.java diff --git a/src/test/java/org/apache/sling/models/testmodels/classes/ArrayPrimitivesModel.java b/impl/src/test/java/org/apache/sling/models/testmodels/classes/ArrayPrimitivesModel.java similarity index 100% rename from src/test/java/org/apache/sling/models/testmodels/classes/ArrayPrimitivesModel.java rename to impl/src/test/java/org/apache/sling/models/testmodels/classes/ArrayPrimitivesModel.java diff --git a/src/test/java/org/apache/sling/models/testmodels/classes/ArrayWrappersModel.java b/impl/src/test/java/org/apache/sling/models/testmodels/classes/ArrayWrappersModel.java similarity index 100% rename from src/test/java/org/apache/sling/models/testmodels/classes/ArrayWrappersModel.java rename to impl/src/test/java/org/apache/sling/models/testmodels/classes/ArrayWrappersModel.java diff --git a/src/test/java/org/apache/sling/models/testmodels/classes/BindingsModel.java b/impl/src/test/java/org/apache/sling/models/testmodels/classes/BindingsModel.java similarity index 100% rename from src/test/java/org/apache/sling/models/testmodels/classes/BindingsModel.java rename to impl/src/test/java/org/apache/sling/models/testmodels/classes/BindingsModel.java diff --git a/src/test/java/org/apache/sling/models/testmodels/classes/CachedModel.java b/impl/src/test/java/org/apache/sling/models/testmodels/classes/CachedModel.java similarity index 100% rename from src/test/java/org/apache/sling/models/testmodels/classes/CachedModel.java rename to impl/src/test/java/org/apache/sling/models/testmodels/classes/CachedModel.java diff --git a/src/test/java/org/apache/sling/models/testmodels/classes/CachedModelWithAdapterTypes12.java b/impl/src/test/java/org/apache/sling/models/testmodels/classes/CachedModelWithAdapterTypes12.java similarity index 100% rename from src/test/java/org/apache/sling/models/testmodels/classes/CachedModelWithAdapterTypes12.java rename to impl/src/test/java/org/apache/sling/models/testmodels/classes/CachedModelWithAdapterTypes12.java diff --git a/src/test/java/org/apache/sling/models/testmodels/classes/CachedModelWithAdapterTypes23.java b/impl/src/test/java/org/apache/sling/models/testmodels/classes/CachedModelWithAdapterTypes23.java similarity index 100% rename from src/test/java/org/apache/sling/models/testmodels/classes/CachedModelWithAdapterTypes23.java rename to impl/src/test/java/org/apache/sling/models/testmodels/classes/CachedModelWithAdapterTypes23.java diff --git a/src/test/java/org/apache/sling/models/testmodels/classes/CachedModelWithSelfReference.java b/impl/src/test/java/org/apache/sling/models/testmodels/classes/CachedModelWithSelfReference.java similarity index 100% rename from src/test/java/org/apache/sling/models/testmodels/classes/CachedModelWithSelfReference.java rename to impl/src/test/java/org/apache/sling/models/testmodels/classes/CachedModelWithSelfReference.java diff --git a/src/test/java/org/apache/sling/models/testmodels/classes/ChildModel.java b/impl/src/test/java/org/apache/sling/models/testmodels/classes/ChildModel.java similarity index 100% rename from src/test/java/org/apache/sling/models/testmodels/classes/ChildModel.java rename to impl/src/test/java/org/apache/sling/models/testmodels/classes/ChildModel.java diff --git a/src/test/java/org/apache/sling/models/testmodels/classes/ChildResourceModel.java b/impl/src/test/java/org/apache/sling/models/testmodels/classes/ChildResourceModel.java similarity index 100% rename from src/test/java/org/apache/sling/models/testmodels/classes/ChildResourceModel.java rename to impl/src/test/java/org/apache/sling/models/testmodels/classes/ChildResourceModel.java diff --git a/src/test/java/org/apache/sling/models/testmodels/classes/ChildResourceViaModel.java b/impl/src/test/java/org/apache/sling/models/testmodels/classes/ChildResourceViaModel.java similarity index 100% rename from src/test/java/org/apache/sling/models/testmodels/classes/ChildResourceViaModel.java rename to impl/src/test/java/org/apache/sling/models/testmodels/classes/ChildResourceViaModel.java diff --git a/src/test/java/org/apache/sling/models/testmodels/classes/ChildValueMapModel.java b/impl/src/test/java/org/apache/sling/models/testmodels/classes/ChildValueMapModel.java similarity index 100% rename from src/test/java/org/apache/sling/models/testmodels/classes/ChildValueMapModel.java rename to impl/src/test/java/org/apache/sling/models/testmodels/classes/ChildValueMapModel.java diff --git a/src/test/java/org/apache/sling/models/testmodels/classes/CollectionDefaultsModel.java b/impl/src/test/java/org/apache/sling/models/testmodels/classes/CollectionDefaultsModel.java similarity index 100% rename from src/test/java/org/apache/sling/models/testmodels/classes/CollectionDefaultsModel.java rename to impl/src/test/java/org/apache/sling/models/testmodels/classes/CollectionDefaultsModel.java diff --git a/src/test/java/org/apache/sling/models/testmodels/classes/CollectionOSGiModel.java b/impl/src/test/java/org/apache/sling/models/testmodels/classes/CollectionOSGiModel.java similarity index 100% rename from src/test/java/org/apache/sling/models/testmodels/classes/CollectionOSGiModel.java rename to impl/src/test/java/org/apache/sling/models/testmodels/classes/CollectionOSGiModel.java diff --git a/src/test/java/org/apache/sling/models/testmodels/classes/ConstructorWithExceptionModel.java b/impl/src/test/java/org/apache/sling/models/testmodels/classes/ConstructorWithExceptionModel.java similarity index 100% rename from src/test/java/org/apache/sling/models/testmodels/classes/ConstructorWithExceptionModel.java rename to impl/src/test/java/org/apache/sling/models/testmodels/classes/ConstructorWithExceptionModel.java diff --git a/src/test/java/org/apache/sling/models/testmodels/classes/DefaultPrimitivesModel.java b/impl/src/test/java/org/apache/sling/models/testmodels/classes/DefaultPrimitivesModel.java similarity index 100% rename from src/test/java/org/apache/sling/models/testmodels/classes/DefaultPrimitivesModel.java rename to impl/src/test/java/org/apache/sling/models/testmodels/classes/DefaultPrimitivesModel.java diff --git a/src/test/java/org/apache/sling/models/testmodels/classes/DefaultStringModel.java b/impl/src/test/java/org/apache/sling/models/testmodels/classes/DefaultStringModel.java similarity index 100% rename from src/test/java/org/apache/sling/models/testmodels/classes/DefaultStringModel.java rename to impl/src/test/java/org/apache/sling/models/testmodels/classes/DefaultStringModel.java diff --git a/src/test/java/org/apache/sling/models/testmodels/classes/DefaultWrappersModel.java b/impl/src/test/java/org/apache/sling/models/testmodels/classes/DefaultWrappersModel.java similarity index 100% rename from src/test/java/org/apache/sling/models/testmodels/classes/DefaultWrappersModel.java rename to impl/src/test/java/org/apache/sling/models/testmodels/classes/DefaultWrappersModel.java diff --git a/src/test/java/org/apache/sling/models/testmodels/classes/DirectCyclicSelfDependencyModel.java b/impl/src/test/java/org/apache/sling/models/testmodels/classes/DirectCyclicSelfDependencyModel.java similarity index 100% rename from src/test/java/org/apache/sling/models/testmodels/classes/DirectCyclicSelfDependencyModel.java rename to impl/src/test/java/org/apache/sling/models/testmodels/classes/DirectCyclicSelfDependencyModel.java diff --git a/src/test/java/org/apache/sling/models/testmodels/classes/FailingPostConstructModel.java b/impl/src/test/java/org/apache/sling/models/testmodels/classes/FailingPostConstructModel.java similarity index 100% rename from src/test/java/org/apache/sling/models/testmodels/classes/FailingPostConstructModel.java rename to impl/src/test/java/org/apache/sling/models/testmodels/classes/FailingPostConstructModel.java diff --git a/src/test/java/org/apache/sling/models/testmodels/classes/FalsePostConstructModel.java b/impl/src/test/java/org/apache/sling/models/testmodels/classes/FalsePostConstructModel.java similarity index 100% rename from src/test/java/org/apache/sling/models/testmodels/classes/FalsePostConstructModel.java rename to impl/src/test/java/org/apache/sling/models/testmodels/classes/FalsePostConstructModel.java diff --git a/src/test/java/org/apache/sling/models/testmodels/classes/IndirectCyclicSelfDependencyModelA.java b/impl/src/test/java/org/apache/sling/models/testmodels/classes/IndirectCyclicSelfDependencyModelA.java similarity index 100% rename from src/test/java/org/apache/sling/models/testmodels/classes/IndirectCyclicSelfDependencyModelA.java rename to impl/src/test/java/org/apache/sling/models/testmodels/classes/IndirectCyclicSelfDependencyModelA.java diff --git a/src/test/java/org/apache/sling/models/testmodels/classes/IndirectCyclicSelfDependencyModelB.java b/impl/src/test/java/org/apache/sling/models/testmodels/classes/IndirectCyclicSelfDependencyModelB.java similarity index 100% rename from src/test/java/org/apache/sling/models/testmodels/classes/IndirectCyclicSelfDependencyModelB.java rename to impl/src/test/java/org/apache/sling/models/testmodels/classes/IndirectCyclicSelfDependencyModelB.java diff --git a/src/test/java/org/apache/sling/models/testmodels/classes/InjectorSpecificAnnotationModel.java b/impl/src/test/java/org/apache/sling/models/testmodels/classes/InjectorSpecificAnnotationModel.java similarity index 100% rename from src/test/java/org/apache/sling/models/testmodels/classes/InjectorSpecificAnnotationModel.java rename to impl/src/test/java/org/apache/sling/models/testmodels/classes/InjectorSpecificAnnotationModel.java diff --git a/src/test/java/org/apache/sling/models/testmodels/classes/InvalidConstructorModel.java b/impl/src/test/java/org/apache/sling/models/testmodels/classes/InvalidConstructorModel.java similarity index 100% rename from src/test/java/org/apache/sling/models/testmodels/classes/InvalidConstructorModel.java rename to impl/src/test/java/org/apache/sling/models/testmodels/classes/InvalidConstructorModel.java diff --git a/src/test/java/org/apache/sling/models/testmodels/classes/InvalidModelWithMissingAnnotation.java b/impl/src/test/java/org/apache/sling/models/testmodels/classes/InvalidModelWithMissingAnnotation.java similarity index 100% rename from src/test/java/org/apache/sling/models/testmodels/classes/InvalidModelWithMissingAnnotation.java rename to impl/src/test/java/org/apache/sling/models/testmodels/classes/InvalidModelWithMissingAnnotation.java diff --git a/src/test/java/org/apache/sling/models/testmodels/classes/ListDefaultsModel.java b/impl/src/test/java/org/apache/sling/models/testmodels/classes/ListDefaultsModel.java similarity index 100% rename from src/test/java/org/apache/sling/models/testmodels/classes/ListDefaultsModel.java rename to impl/src/test/java/org/apache/sling/models/testmodels/classes/ListDefaultsModel.java diff --git a/src/test/java/org/apache/sling/models/testmodels/classes/ListModel.java b/impl/src/test/java/org/apache/sling/models/testmodels/classes/ListModel.java similarity index 100% rename from src/test/java/org/apache/sling/models/testmodels/classes/ListModel.java rename to impl/src/test/java/org/apache/sling/models/testmodels/classes/ListModel.java diff --git a/src/test/java/org/apache/sling/models/testmodels/classes/ListOSGiModel.java b/impl/src/test/java/org/apache/sling/models/testmodels/classes/ListOSGiModel.java similarity index 100% rename from src/test/java/org/apache/sling/models/testmodels/classes/ListOSGiModel.java rename to impl/src/test/java/org/apache/sling/models/testmodels/classes/ListOSGiModel.java diff --git a/src/test/java/org/apache/sling/models/testmodels/classes/OptionalArrayOSGiModel.java b/impl/src/test/java/org/apache/sling/models/testmodels/classes/OptionalArrayOSGiModel.java similarity index 100% rename from src/test/java/org/apache/sling/models/testmodels/classes/OptionalArrayOSGiModel.java rename to impl/src/test/java/org/apache/sling/models/testmodels/classes/OptionalArrayOSGiModel.java diff --git a/src/test/java/org/apache/sling/models/testmodels/classes/OptionalListOSGiModel.java b/impl/src/test/java/org/apache/sling/models/testmodels/classes/OptionalListOSGiModel.java similarity index 100% rename from src/test/java/org/apache/sling/models/testmodels/classes/OptionalListOSGiModel.java rename to impl/src/test/java/org/apache/sling/models/testmodels/classes/OptionalListOSGiModel.java diff --git a/src/test/java/org/apache/sling/models/testmodels/classes/OptionalObjectsModel.java b/impl/src/test/java/org/apache/sling/models/testmodels/classes/OptionalObjectsModel.java similarity index 100% rename from src/test/java/org/apache/sling/models/testmodels/classes/OptionalObjectsModel.java rename to impl/src/test/java/org/apache/sling/models/testmodels/classes/OptionalObjectsModel.java diff --git a/src/test/java/org/apache/sling/models/testmodels/classes/OptionalPrimitivesModel.java b/impl/src/test/java/org/apache/sling/models/testmodels/classes/OptionalPrimitivesModel.java similarity index 100% rename from src/test/java/org/apache/sling/models/testmodels/classes/OptionalPrimitivesModel.java rename to impl/src/test/java/org/apache/sling/models/testmodels/classes/OptionalPrimitivesModel.java diff --git a/src/test/java/org/apache/sling/models/testmodels/classes/ParentModel.java b/impl/src/test/java/org/apache/sling/models/testmodels/classes/ParentModel.java similarity index 100% rename from src/test/java/org/apache/sling/models/testmodels/classes/ParentModel.java rename to impl/src/test/java/org/apache/sling/models/testmodels/classes/ParentModel.java diff --git a/src/test/java/org/apache/sling/models/testmodels/classes/RequestOSGiModel.java b/impl/src/test/java/org/apache/sling/models/testmodels/classes/RequestOSGiModel.java similarity index 100% rename from src/test/java/org/apache/sling/models/testmodels/classes/RequestOSGiModel.java rename to impl/src/test/java/org/apache/sling/models/testmodels/classes/RequestOSGiModel.java diff --git a/src/test/java/org/apache/sling/models/testmodels/classes/ResourceModelWithRequiredField.java b/impl/src/test/java/org/apache/sling/models/testmodels/classes/ResourceModelWithRequiredField.java similarity index 100% rename from src/test/java/org/apache/sling/models/testmodels/classes/ResourceModelWithRequiredField.java rename to impl/src/test/java/org/apache/sling/models/testmodels/classes/ResourceModelWithRequiredField.java diff --git a/src/test/java/org/apache/sling/models/testmodels/classes/ResourceModelWithRequiredFieldOptionalStrategy.java b/impl/src/test/java/org/apache/sling/models/testmodels/classes/ResourceModelWithRequiredFieldOptionalStrategy.java similarity index 100% rename from src/test/java/org/apache/sling/models/testmodels/classes/ResourceModelWithRequiredFieldOptionalStrategy.java rename to impl/src/test/java/org/apache/sling/models/testmodels/classes/ResourceModelWithRequiredFieldOptionalStrategy.java diff --git a/src/test/java/org/apache/sling/models/testmodels/classes/ResourcePathAllOptionalModel.java b/impl/src/test/java/org/apache/sling/models/testmodels/classes/ResourcePathAllOptionalModel.java similarity index 100% rename from src/test/java/org/apache/sling/models/testmodels/classes/ResourcePathAllOptionalModel.java rename to impl/src/test/java/org/apache/sling/models/testmodels/classes/ResourcePathAllOptionalModel.java diff --git a/src/test/java/org/apache/sling/models/testmodels/classes/ResourcePathModel.java b/impl/src/test/java/org/apache/sling/models/testmodels/classes/ResourcePathModel.java similarity index 100% rename from src/test/java/org/apache/sling/models/testmodels/classes/ResourcePathModel.java rename to impl/src/test/java/org/apache/sling/models/testmodels/classes/ResourcePathModel.java diff --git a/src/test/java/org/apache/sling/models/testmodels/classes/ResourcePathModelWrapping.java b/impl/src/test/java/org/apache/sling/models/testmodels/classes/ResourcePathModelWrapping.java similarity index 100% rename from src/test/java/org/apache/sling/models/testmodels/classes/ResourcePathModelWrapping.java rename to impl/src/test/java/org/apache/sling/models/testmodels/classes/ResourcePathModelWrapping.java diff --git a/src/test/java/org/apache/sling/models/testmodels/classes/ResourcePathPartialModel.java b/impl/src/test/java/org/apache/sling/models/testmodels/classes/ResourcePathPartialModel.java similarity index 100% rename from src/test/java/org/apache/sling/models/testmodels/classes/ResourcePathPartialModel.java rename to impl/src/test/java/org/apache/sling/models/testmodels/classes/ResourcePathPartialModel.java diff --git a/src/test/java/org/apache/sling/models/testmodels/classes/SelfDependencyModelA.java b/impl/src/test/java/org/apache/sling/models/testmodels/classes/SelfDependencyModelA.java similarity index 100% rename from src/test/java/org/apache/sling/models/testmodels/classes/SelfDependencyModelA.java rename to impl/src/test/java/org/apache/sling/models/testmodels/classes/SelfDependencyModelA.java diff --git a/src/test/java/org/apache/sling/models/testmodels/classes/SelfDependencyModelB.java b/impl/src/test/java/org/apache/sling/models/testmodels/classes/SelfDependencyModelB.java similarity index 100% rename from src/test/java/org/apache/sling/models/testmodels/classes/SelfDependencyModelB.java rename to impl/src/test/java/org/apache/sling/models/testmodels/classes/SelfDependencyModelB.java diff --git a/src/test/java/org/apache/sling/models/testmodels/classes/SetOSGiModel.java b/impl/src/test/java/org/apache/sling/models/testmodels/classes/SetOSGiModel.java similarity index 100% rename from src/test/java/org/apache/sling/models/testmodels/classes/SetOSGiModel.java rename to impl/src/test/java/org/apache/sling/models/testmodels/classes/SetOSGiModel.java diff --git a/src/test/java/org/apache/sling/models/testmodels/classes/SimpleModelWithInvalidSecondAnnotation.java b/impl/src/test/java/org/apache/sling/models/testmodels/classes/SimpleModelWithInvalidSecondAnnotation.java similarity index 100% rename from src/test/java/org/apache/sling/models/testmodels/classes/SimpleModelWithInvalidSecondAnnotation.java rename to impl/src/test/java/org/apache/sling/models/testmodels/classes/SimpleModelWithInvalidSecondAnnotation.java diff --git a/src/test/java/org/apache/sling/models/testmodels/classes/SimpleOSGiModel.java b/impl/src/test/java/org/apache/sling/models/testmodels/classes/SimpleOSGiModel.java similarity index 100% rename from src/test/java/org/apache/sling/models/testmodels/classes/SimpleOSGiModel.java rename to impl/src/test/java/org/apache/sling/models/testmodels/classes/SimpleOSGiModel.java diff --git a/src/test/java/org/apache/sling/models/testmodels/classes/SimplePropertyModel.java b/impl/src/test/java/org/apache/sling/models/testmodels/classes/SimplePropertyModel.java similarity index 100% rename from src/test/java/org/apache/sling/models/testmodels/classes/SimplePropertyModel.java rename to impl/src/test/java/org/apache/sling/models/testmodels/classes/SimplePropertyModel.java diff --git a/src/test/java/org/apache/sling/models/testmodels/classes/SubClass.java b/impl/src/test/java/org/apache/sling/models/testmodels/classes/SubClass.java similarity index 100% rename from src/test/java/org/apache/sling/models/testmodels/classes/SubClass.java rename to impl/src/test/java/org/apache/sling/models/testmodels/classes/SubClass.java diff --git a/src/test/java/org/apache/sling/models/testmodels/classes/SubClassOverriddenPostConstruct.java b/impl/src/test/java/org/apache/sling/models/testmodels/classes/SubClassOverriddenPostConstruct.java similarity index 100% rename from src/test/java/org/apache/sling/models/testmodels/classes/SubClassOverriddenPostConstruct.java rename to impl/src/test/java/org/apache/sling/models/testmodels/classes/SubClassOverriddenPostConstruct.java diff --git a/src/test/java/org/apache/sling/models/testmodels/classes/SuperClass.java b/impl/src/test/java/org/apache/sling/models/testmodels/classes/SuperClass.java similarity index 100% rename from src/test/java/org/apache/sling/models/testmodels/classes/SuperClass.java rename to impl/src/test/java/org/apache/sling/models/testmodels/classes/SuperClass.java diff --git a/src/test/java/org/apache/sling/models/testmodels/classes/SuperclassConstructorModel.java b/impl/src/test/java/org/apache/sling/models/testmodels/classes/SuperclassConstructorModel.java similarity index 100% rename from src/test/java/org/apache/sling/models/testmodels/classes/SuperclassConstructorModel.java rename to impl/src/test/java/org/apache/sling/models/testmodels/classes/SuperclassConstructorModel.java diff --git a/src/test/java/org/apache/sling/models/testmodels/classes/TruePostConstructModel.java b/impl/src/test/java/org/apache/sling/models/testmodels/classes/TruePostConstructModel.java similarity index 100% rename from src/test/java/org/apache/sling/models/testmodels/classes/TruePostConstructModel.java rename to impl/src/test/java/org/apache/sling/models/testmodels/classes/TruePostConstructModel.java diff --git a/src/test/java/org/apache/sling/models/testmodels/classes/UncachedModel.java b/impl/src/test/java/org/apache/sling/models/testmodels/classes/UncachedModel.java similarity index 100% rename from src/test/java/org/apache/sling/models/testmodels/classes/UncachedModel.java rename to impl/src/test/java/org/apache/sling/models/testmodels/classes/UncachedModel.java diff --git a/src/test/java/org/apache/sling/models/testmodels/classes/ViaModel.java b/impl/src/test/java/org/apache/sling/models/testmodels/classes/ViaModel.java similarity index 100% rename from src/test/java/org/apache/sling/models/testmodels/classes/ViaModel.java rename to impl/src/test/java/org/apache/sling/models/testmodels/classes/ViaModel.java diff --git a/src/test/java/org/apache/sling/models/testmodels/classes/WithOneConstructorModel.java b/impl/src/test/java/org/apache/sling/models/testmodels/classes/WithOneConstructorModel.java similarity index 100% rename from src/test/java/org/apache/sling/models/testmodels/classes/WithOneConstructorModel.java rename to impl/src/test/java/org/apache/sling/models/testmodels/classes/WithOneConstructorModel.java diff --git a/src/test/java/org/apache/sling/models/testmodels/classes/WithThreeConstructorsModel.java b/impl/src/test/java/org/apache/sling/models/testmodels/classes/WithThreeConstructorsModel.java similarity index 100% rename from src/test/java/org/apache/sling/models/testmodels/classes/WithThreeConstructorsModel.java rename to impl/src/test/java/org/apache/sling/models/testmodels/classes/WithThreeConstructorsModel.java diff --git a/src/test/java/org/apache/sling/models/testmodels/classes/WithTwoConstructorsModel.java b/impl/src/test/java/org/apache/sling/models/testmodels/classes/WithTwoConstructorsModel.java similarity index 100% rename from src/test/java/org/apache/sling/models/testmodels/classes/WithTwoConstructorsModel.java rename to impl/src/test/java/org/apache/sling/models/testmodels/classes/WithTwoConstructorsModel.java diff --git a/src/test/java/org/apache/sling/models/testmodels/classes/annotations/Hidden.java b/impl/src/test/java/org/apache/sling/models/testmodels/classes/annotations/Hidden.java similarity index 100% rename from src/test/java/org/apache/sling/models/testmodels/classes/annotations/Hidden.java rename to impl/src/test/java/org/apache/sling/models/testmodels/classes/annotations/Hidden.java diff --git a/src/test/java/org/apache/sling/models/testmodels/classes/annotations/OtherAnnotation.java b/impl/src/test/java/org/apache/sling/models/testmodels/classes/annotations/OtherAnnotation.java similarity index 100% rename from src/test/java/org/apache/sling/models/testmodels/classes/annotations/OtherAnnotation.java rename to impl/src/test/java/org/apache/sling/models/testmodels/classes/annotations/OtherAnnotation.java diff --git a/src/test/java/org/apache/sling/models/testmodels/classes/constructorinjection/BindingsModel.java b/impl/src/test/java/org/apache/sling/models/testmodels/classes/constructorinjection/BindingsModel.java similarity index 100% rename from src/test/java/org/apache/sling/models/testmodels/classes/constructorinjection/BindingsModel.java rename to impl/src/test/java/org/apache/sling/models/testmodels/classes/constructorinjection/BindingsModel.java diff --git a/src/test/java/org/apache/sling/models/testmodels/classes/constructorinjection/DefaultPrimitivesModel.java b/impl/src/test/java/org/apache/sling/models/testmodels/classes/constructorinjection/DefaultPrimitivesModel.java similarity index 100% rename from src/test/java/org/apache/sling/models/testmodels/classes/constructorinjection/DefaultPrimitivesModel.java rename to impl/src/test/java/org/apache/sling/models/testmodels/classes/constructorinjection/DefaultPrimitivesModel.java diff --git a/src/test/java/org/apache/sling/models/testmodels/classes/constructorinjection/DefaultStringModel.java b/impl/src/test/java/org/apache/sling/models/testmodels/classes/constructorinjection/DefaultStringModel.java similarity index 100% rename from src/test/java/org/apache/sling/models/testmodels/classes/constructorinjection/DefaultStringModel.java rename to impl/src/test/java/org/apache/sling/models/testmodels/classes/constructorinjection/DefaultStringModel.java diff --git a/src/test/java/org/apache/sling/models/testmodels/classes/constructorinjection/DefaultWrappersModel.java b/impl/src/test/java/org/apache/sling/models/testmodels/classes/constructorinjection/DefaultWrappersModel.java similarity index 100% rename from src/test/java/org/apache/sling/models/testmodels/classes/constructorinjection/DefaultWrappersModel.java rename to impl/src/test/java/org/apache/sling/models/testmodels/classes/constructorinjection/DefaultWrappersModel.java diff --git a/src/test/java/org/apache/sling/models/testmodels/classes/constructorinjection/InjectorSpecificAnnotationModel.java b/impl/src/test/java/org/apache/sling/models/testmodels/classes/constructorinjection/InjectorSpecificAnnotationModel.java similarity index 100% rename from src/test/java/org/apache/sling/models/testmodels/classes/constructorinjection/InjectorSpecificAnnotationModel.java rename to impl/src/test/java/org/apache/sling/models/testmodels/classes/constructorinjection/InjectorSpecificAnnotationModel.java diff --git a/src/test/java/org/apache/sling/models/testmodels/classes/constructorinjection/ListOSGiModel.java b/impl/src/test/java/org/apache/sling/models/testmodels/classes/constructorinjection/ListOSGiModel.java similarity index 100% rename from src/test/java/org/apache/sling/models/testmodels/classes/constructorinjection/ListOSGiModel.java rename to impl/src/test/java/org/apache/sling/models/testmodels/classes/constructorinjection/ListOSGiModel.java diff --git a/src/test/java/org/apache/sling/models/testmodels/classes/constructorinjection/NoNameModel.java b/impl/src/test/java/org/apache/sling/models/testmodels/classes/constructorinjection/NoNameModel.java similarity index 100% rename from src/test/java/org/apache/sling/models/testmodels/classes/constructorinjection/NoNameModel.java rename to impl/src/test/java/org/apache/sling/models/testmodels/classes/constructorinjection/NoNameModel.java diff --git a/src/test/java/org/apache/sling/models/testmodels/classes/constructorinjection/OptionalPrimitivesModel.java b/impl/src/test/java/org/apache/sling/models/testmodels/classes/constructorinjection/OptionalPrimitivesModel.java similarity index 100% rename from src/test/java/org/apache/sling/models/testmodels/classes/constructorinjection/OptionalPrimitivesModel.java rename to impl/src/test/java/org/apache/sling/models/testmodels/classes/constructorinjection/OptionalPrimitivesModel.java diff --git a/src/test/java/org/apache/sling/models/testmodels/classes/constructorinjection/ParentModel.java b/impl/src/test/java/org/apache/sling/models/testmodels/classes/constructorinjection/ParentModel.java similarity index 100% rename from src/test/java/org/apache/sling/models/testmodels/classes/constructorinjection/ParentModel.java rename to impl/src/test/java/org/apache/sling/models/testmodels/classes/constructorinjection/ParentModel.java diff --git a/src/test/java/org/apache/sling/models/testmodels/classes/constructorinjection/SimpleOSGiModel.java b/impl/src/test/java/org/apache/sling/models/testmodels/classes/constructorinjection/SimpleOSGiModel.java similarity index 100% rename from src/test/java/org/apache/sling/models/testmodels/classes/constructorinjection/SimpleOSGiModel.java rename to impl/src/test/java/org/apache/sling/models/testmodels/classes/constructorinjection/SimpleOSGiModel.java diff --git a/src/test/java/org/apache/sling/models/testmodels/classes/constructorinjection/ViaRequestSuffixModel.java b/impl/src/test/java/org/apache/sling/models/testmodels/classes/constructorinjection/ViaRequestSuffixModel.java similarity index 100% rename from src/test/java/org/apache/sling/models/testmodels/classes/constructorinjection/ViaRequestSuffixModel.java rename to impl/src/test/java/org/apache/sling/models/testmodels/classes/constructorinjection/ViaRequestSuffixModel.java diff --git a/src/test/java/org/apache/sling/models/testmodels/classes/constructorinjection/WithThreeConstructorsOneInjectModel.java b/impl/src/test/java/org/apache/sling/models/testmodels/classes/constructorinjection/WithThreeConstructorsOneInjectModel.java similarity index 100% rename from src/test/java/org/apache/sling/models/testmodels/classes/constructorinjection/WithThreeConstructorsOneInjectModel.java rename to impl/src/test/java/org/apache/sling/models/testmodels/classes/constructorinjection/WithThreeConstructorsOneInjectModel.java diff --git a/src/test/java/org/apache/sling/models/testmodels/classes/constructorvisibility/PackagePrivateConstructorModel.java b/impl/src/test/java/org/apache/sling/models/testmodels/classes/constructorvisibility/PackagePrivateConstructorModel.java similarity index 100% rename from src/test/java/org/apache/sling/models/testmodels/classes/constructorvisibility/PackagePrivateConstructorModel.java rename to impl/src/test/java/org/apache/sling/models/testmodels/classes/constructorvisibility/PackagePrivateConstructorModel.java diff --git a/src/test/java/org/apache/sling/models/testmodels/classes/constructorvisibility/PrivateConstructorModel.java b/impl/src/test/java/org/apache/sling/models/testmodels/classes/constructorvisibility/PrivateConstructorModel.java similarity index 100% rename from src/test/java/org/apache/sling/models/testmodels/classes/constructorvisibility/PrivateConstructorModel.java rename to impl/src/test/java/org/apache/sling/models/testmodels/classes/constructorvisibility/PrivateConstructorModel.java diff --git a/src/test/java/org/apache/sling/models/testmodels/classes/constructorvisibility/ProtectedConstructorModel.java b/impl/src/test/java/org/apache/sling/models/testmodels/classes/constructorvisibility/ProtectedConstructorModel.java similarity index 100% rename from src/test/java/org/apache/sling/models/testmodels/classes/constructorvisibility/ProtectedConstructorModel.java rename to impl/src/test/java/org/apache/sling/models/testmodels/classes/constructorvisibility/ProtectedConstructorModel.java diff --git a/src/test/java/org/apache/sling/models/testmodels/classes/implextend/EvenSimplerPropertyModel.java b/impl/src/test/java/org/apache/sling/models/testmodels/classes/implextend/EvenSimplerPropertyModel.java similarity index 100% rename from src/test/java/org/apache/sling/models/testmodels/classes/implextend/EvenSimplerPropertyModel.java rename to impl/src/test/java/org/apache/sling/models/testmodels/classes/implextend/EvenSimplerPropertyModel.java diff --git a/src/test/java/org/apache/sling/models/testmodels/classes/implextend/ExtendsClassPropertyModel.java b/impl/src/test/java/org/apache/sling/models/testmodels/classes/implextend/ExtendsClassPropertyModel.java similarity index 100% rename from src/test/java/org/apache/sling/models/testmodels/classes/implextend/ExtendsClassPropertyModel.java rename to impl/src/test/java/org/apache/sling/models/testmodels/classes/implextend/ExtendsClassPropertyModel.java diff --git a/src/test/java/org/apache/sling/models/testmodels/classes/implextend/ImplementsInterfacePropertyModel.java b/impl/src/test/java/org/apache/sling/models/testmodels/classes/implextend/ImplementsInterfacePropertyModel.java similarity index 100% rename from src/test/java/org/apache/sling/models/testmodels/classes/implextend/ImplementsInterfacePropertyModel.java rename to impl/src/test/java/org/apache/sling/models/testmodels/classes/implextend/ImplementsInterfacePropertyModel.java diff --git a/src/test/java/org/apache/sling/models/testmodels/classes/implextend/ImplementsInterfacePropertyModel2.java b/impl/src/test/java/org/apache/sling/models/testmodels/classes/implextend/ImplementsInterfacePropertyModel2.java similarity index 100% rename from src/test/java/org/apache/sling/models/testmodels/classes/implextend/ImplementsInterfacePropertyModel2.java rename to impl/src/test/java/org/apache/sling/models/testmodels/classes/implextend/ImplementsInterfacePropertyModel2.java diff --git a/src/test/java/org/apache/sling/models/testmodels/classes/implextend/InvalidImplementsInterfacePropertyModel.java b/impl/src/test/java/org/apache/sling/models/testmodels/classes/implextend/InvalidImplementsInterfacePropertyModel.java similarity index 100% rename from src/test/java/org/apache/sling/models/testmodels/classes/implextend/InvalidImplementsInterfacePropertyModel.java rename to impl/src/test/java/org/apache/sling/models/testmodels/classes/implextend/InvalidImplementsInterfacePropertyModel.java diff --git a/src/test/java/org/apache/sling/models/testmodels/classes/implextend/InvalidSampleServiceInterface.java b/impl/src/test/java/org/apache/sling/models/testmodels/classes/implextend/InvalidSampleServiceInterface.java similarity index 100% rename from src/test/java/org/apache/sling/models/testmodels/classes/implextend/InvalidSampleServiceInterface.java rename to impl/src/test/java/org/apache/sling/models/testmodels/classes/implextend/InvalidSampleServiceInterface.java diff --git a/src/test/java/org/apache/sling/models/testmodels/classes/implextend/SampleServiceInterface.java b/impl/src/test/java/org/apache/sling/models/testmodels/classes/implextend/SampleServiceInterface.java similarity index 100% rename from src/test/java/org/apache/sling/models/testmodels/classes/implextend/SampleServiceInterface.java rename to impl/src/test/java/org/apache/sling/models/testmodels/classes/implextend/SampleServiceInterface.java diff --git a/src/test/java/org/apache/sling/models/testmodels/classes/implextend/SimplePropertyModel.java b/impl/src/test/java/org/apache/sling/models/testmodels/classes/implextend/SimplePropertyModel.java similarity index 100% rename from src/test/java/org/apache/sling/models/testmodels/classes/implextend/SimplePropertyModel.java rename to impl/src/test/java/org/apache/sling/models/testmodels/classes/implextend/SimplePropertyModel.java diff --git a/src/test/java/org/apache/sling/models/testmodels/interfaces/AdapterType1.java b/impl/src/test/java/org/apache/sling/models/testmodels/interfaces/AdapterType1.java similarity index 100% rename from src/test/java/org/apache/sling/models/testmodels/interfaces/AdapterType1.java rename to impl/src/test/java/org/apache/sling/models/testmodels/interfaces/AdapterType1.java diff --git a/src/test/java/org/apache/sling/models/testmodels/interfaces/AdapterType2.java b/impl/src/test/java/org/apache/sling/models/testmodels/interfaces/AdapterType2.java similarity index 100% rename from src/test/java/org/apache/sling/models/testmodels/interfaces/AdapterType2.java rename to impl/src/test/java/org/apache/sling/models/testmodels/interfaces/AdapterType2.java diff --git a/src/test/java/org/apache/sling/models/testmodels/interfaces/AdapterType3.java b/impl/src/test/java/org/apache/sling/models/testmodels/interfaces/AdapterType3.java similarity index 100% rename from src/test/java/org/apache/sling/models/testmodels/interfaces/AdapterType3.java rename to impl/src/test/java/org/apache/sling/models/testmodels/interfaces/AdapterType3.java diff --git a/src/test/java/org/apache/sling/models/testmodels/interfaces/CachedModel.java b/impl/src/test/java/org/apache/sling/models/testmodels/interfaces/CachedModel.java similarity index 100% rename from src/test/java/org/apache/sling/models/testmodels/interfaces/CachedModel.java rename to impl/src/test/java/org/apache/sling/models/testmodels/interfaces/CachedModel.java diff --git a/src/test/java/org/apache/sling/models/testmodels/interfaces/ChildModel.java b/impl/src/test/java/org/apache/sling/models/testmodels/interfaces/ChildModel.java similarity index 100% rename from src/test/java/org/apache/sling/models/testmodels/interfaces/ChildModel.java rename to impl/src/test/java/org/apache/sling/models/testmodels/interfaces/ChildModel.java diff --git a/src/test/java/org/apache/sling/models/testmodels/interfaces/ChildResourceModel.java b/impl/src/test/java/org/apache/sling/models/testmodels/interfaces/ChildResourceModel.java similarity index 100% rename from src/test/java/org/apache/sling/models/testmodels/interfaces/ChildResourceModel.java rename to impl/src/test/java/org/apache/sling/models/testmodels/interfaces/ChildResourceModel.java diff --git a/src/test/java/org/apache/sling/models/testmodels/interfaces/ChildValueMapModel.java b/impl/src/test/java/org/apache/sling/models/testmodels/interfaces/ChildValueMapModel.java similarity index 100% rename from src/test/java/org/apache/sling/models/testmodels/interfaces/ChildValueMapModel.java rename to impl/src/test/java/org/apache/sling/models/testmodels/interfaces/ChildValueMapModel.java diff --git a/src/test/java/org/apache/sling/models/testmodels/interfaces/ModelWithDefaultMethods.java b/impl/src/test/java/org/apache/sling/models/testmodels/interfaces/ModelWithDefaultMethods.java similarity index 100% rename from src/test/java/org/apache/sling/models/testmodels/interfaces/ModelWithDefaultMethods.java rename to impl/src/test/java/org/apache/sling/models/testmodels/interfaces/ModelWithDefaultMethods.java diff --git a/src/test/java/org/apache/sling/models/testmodels/interfaces/OptionalPrimitivesModel.java b/impl/src/test/java/org/apache/sling/models/testmodels/interfaces/OptionalPrimitivesModel.java similarity index 100% rename from src/test/java/org/apache/sling/models/testmodels/interfaces/OptionalPrimitivesModel.java rename to impl/src/test/java/org/apache/sling/models/testmodels/interfaces/OptionalPrimitivesModel.java diff --git a/src/test/java/org/apache/sling/models/testmodels/interfaces/ParentModel.java b/impl/src/test/java/org/apache/sling/models/testmodels/interfaces/ParentModel.java similarity index 100% rename from src/test/java/org/apache/sling/models/testmodels/interfaces/ParentModel.java rename to impl/src/test/java/org/apache/sling/models/testmodels/interfaces/ParentModel.java diff --git a/src/test/java/org/apache/sling/models/testmodels/interfaces/PropertyModelWithDefaults.java b/impl/src/test/java/org/apache/sling/models/testmodels/interfaces/PropertyModelWithDefaults.java similarity index 100% rename from src/test/java/org/apache/sling/models/testmodels/interfaces/PropertyModelWithDefaults.java rename to impl/src/test/java/org/apache/sling/models/testmodels/interfaces/PropertyModelWithDefaults.java diff --git a/src/test/java/org/apache/sling/models/testmodels/interfaces/ResourceModelWithRequiredField.java b/impl/src/test/java/org/apache/sling/models/testmodels/interfaces/ResourceModelWithRequiredField.java similarity index 100% rename from src/test/java/org/apache/sling/models/testmodels/interfaces/ResourceModelWithRequiredField.java rename to impl/src/test/java/org/apache/sling/models/testmodels/interfaces/ResourceModelWithRequiredField.java diff --git a/src/test/java/org/apache/sling/models/testmodels/interfaces/ServiceInterface.java b/impl/src/test/java/org/apache/sling/models/testmodels/interfaces/ServiceInterface.java similarity index 100% rename from src/test/java/org/apache/sling/models/testmodels/interfaces/ServiceInterface.java rename to impl/src/test/java/org/apache/sling/models/testmodels/interfaces/ServiceInterface.java diff --git a/src/test/java/org/apache/sling/models/testmodels/interfaces/SimplePropertyModel.java b/impl/src/test/java/org/apache/sling/models/testmodels/interfaces/SimplePropertyModel.java similarity index 100% rename from src/test/java/org/apache/sling/models/testmodels/interfaces/SimplePropertyModel.java rename to impl/src/test/java/org/apache/sling/models/testmodels/interfaces/SimplePropertyModel.java diff --git a/src/test/java/org/apache/sling/models/testmodels/interfaces/SubClassModel.java b/impl/src/test/java/org/apache/sling/models/testmodels/interfaces/SubClassModel.java similarity index 100% rename from src/test/java/org/apache/sling/models/testmodels/interfaces/SubClassModel.java rename to impl/src/test/java/org/apache/sling/models/testmodels/interfaces/SubClassModel.java diff --git a/src/test/java/org/apache/sling/models/testmodels/interfaces/SuperClassModel.java b/impl/src/test/java/org/apache/sling/models/testmodels/interfaces/SuperClassModel.java similarity index 100% rename from src/test/java/org/apache/sling/models/testmodels/interfaces/SuperClassModel.java rename to impl/src/test/java/org/apache/sling/models/testmodels/interfaces/SuperClassModel.java diff --git a/src/test/java/org/apache/sling/models/testmodels/interfaces/UncachedModel.java b/impl/src/test/java/org/apache/sling/models/testmodels/interfaces/UncachedModel.java similarity index 100% rename from src/test/java/org/apache/sling/models/testmodels/interfaces/UncachedModel.java rename to impl/src/test/java/org/apache/sling/models/testmodels/interfaces/UncachedModel.java diff --git a/src/test/java/org/apache/sling/models/testutil/ModelAdapterFactoryUtil.java b/impl/src/test/java/org/apache/sling/models/testutil/ModelAdapterFactoryUtil.java similarity index 100% rename from src/test/java/org/apache/sling/models/testutil/ModelAdapterFactoryUtil.java rename to impl/src/test/java/org/apache/sling/models/testutil/ModelAdapterFactoryUtil.java diff --git a/it/integration-tests/bnd.bnd b/it/integration-tests/bnd.bnd new file mode 100644 index 00000000..1aef1d37 --- /dev/null +++ b/it/integration-tests/bnd.bnd @@ -0,0 +1,7 @@ +Sling-Test-Regexp: .*Test + +Import-Package:\ + org.apache.commons.beanutils;resolution:=optional,\ + * + +-plugin: org.apache.sling.bnd.models.ModelsScannerPlugin diff --git a/it/integration-tests/pom.xml b/it/integration-tests/pom.xml new file mode 100644 index 00000000..ca989756 --- /dev/null +++ b/it/integration-tests/pom.xml @@ -0,0 +1,412 @@ + + + + 4.0.0 + + + org.apache.sling + org.apache.sling.models.impl.parent + 2.0.1-SNAPSHOT + ../../parent/pom.xml + + + org.apache.sling.models.impl.it.integration-tests + + Apache Sling Models Implementation - IT - Integration Tests + + + 14-SNAPSHOT + + 200 + 60 + info + + + + + + org.apache.sling + org.apache.sling.junit.core + 1.2.0 + provided + + + org.apache.sling + org.apache.sling.testing.rules + 2.0.2 + test + + + org.apache.sling + org.apache.sling.testing.clients + 3.1.0 + test + + + javax.servlet + servlet-api + + + + + org.apache.sling + org.apache.sling.junit.teleporter + 1.1.0 + test + + + org.apache.sling + org.apache.sling.commons.johnzon + 2.0.0 + provided + + + org.apache.sling + org.apache.sling.engine + 3.0.0 + provided + + + org.apache.sling + org.apache.sling.models.api + provided + + + org.apache.sling + org.apache.sling.models.impl + 2.0.1-SNAPSHOT + provided + + + org.apache.sling + org.apache.sling.models.impl.it.test-models + 2.0.1-SNAPSHOT + provided + + + + + javax.servlet + javax.servlet-api + provided + + + jakarta.servlet + jakarta.servlet-api + provided + + + org.apache.sling + org.apache.sling.api + 3.0.0 + provided + + + org.apache.commons + commons-lang3 + 3.18.0 + provided + + + org.slf4j + slf4j-api + provided + + + org.jetbrains + annotations + provided + + + + org.slf4j + slf4j-simple + test + + + junit + junit + test + + + + + + + + + biz.aQute.bnd + bnd-maven-plugin + + + org.apache.sling + org.apache.sling.bnd.models + 1.0.0 + + + + + + biz.aQute.bnd + bnd-baseline-maven-plugin + + true + + + + + org.codehaus.mojo + build-helper-maven-plugin + + + reserve-network-port + + reserve-network-port + + initialize + + + http.port + jacoco.port + + + + + + + + org.apache.sling + slingfeature-maven-plugin + 1.9.2 + true + + + models.api.version,models.log.level + true + + + app + *.json + + ${http.port} + + + org.apache.sling:org.apache.sling.models.api:HIGHEST + org.apache.sling:org.apache.sling.models.impl:HIGHEST + + + org.apache.sling + org.apache.sling.starter + nosample_base + ${sling.starter.version} + slingosgifeature + + + org.apache.sling + org.apache.sling.starter + oak_persistence_sns + ${sling.starter.version} + slingosgifeature + + + org.apache.sling + org.apache.sling.starter + junit + ${sling.starter.version} + slingosgifeature + + + + + + app + + + + + + prepare-features + + aggregate-features + analyse-features + attach-features + + prepare-package + + + + + + org.jacoco + jacoco-maven-plugin + + + + prepare-agent-integration-launcher + + prepare-agent-integration + + + jacoco.launcher.command + tcpserver +
localhost
+ ${jacoco.port} +
+
+ + dump-coverage-launcher + + dump + + post-integration-test + +
localhost
+ ${jacoco.port} + ${project.build.directory}/jacoco-launcher.exec + true +
+
+ + + merge-it-and-launcher + + merge + + post-integration-test + + ${project.build.directory}/jacoco-merged.exec + + + ${project.build.directory} + + jacoco-it.exec + jacoco-launcher.exec + + + + + + + + report-aggregate-merged + + report-aggregate + + verify + + ${project.build.directory}/jacoco-merged.exec + ${project.reporting.outputDirectory}/jacoco-merged + + +
+
+ + + org.apache.sling + feature-launcher-maven-plugin + 1.0.1-SNAPSHOT + + + + sling-starter-oak-tar + + org.apache.sling + org.apache.sling.models.impl.it.integration-tests + ${project.version} + app + slingosgifeature + + + + --add-opens java.base/java.lang=ALL-UNNAMED + ${jacoco.launcher.command} + + + ${http.port} + 5000000 + + + ${it.startTimeoutSeconds} + + + + + + launcher-start + + start + stop + + + + + + + maven-failsafe-plugin + + + http://localhost:${http.port} + false:${http.port} + ${starter.min.bundles.count} + + /system/console/bundles, + + + + + integration-test + + integration-test + verify + + + + + +
+
+ + + + + debug + + 8080 + true + debug + + + + +
diff --git a/it/integration-tests/src/main/features/launcher-repoinit.txt b/it/integration-tests/src/main/features/launcher-repoinit.txt new file mode 100644 index 00000000..7d361180 --- /dev/null +++ b/it/integration-tests/src/main/features/launcher-repoinit.txt @@ -0,0 +1,23 @@ +# +# 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. +# + +create service user models-it +set ACL for models-it + allow jcr:all on / +end \ No newline at end of file diff --git a/it/integration-tests/src/main/features/launcher.json b/it/integration-tests/src/main/features/launcher.json new file mode 100644 index 00000000..2a20fcf6 --- /dev/null +++ b/it/integration-tests/src/main/features/launcher.json @@ -0,0 +1,30 @@ +{ + "bundles": [ + { + "id": "org.apache.sling/org.apache.sling.models.api/${models.api.version}", + "start-order": 20 + }, + { + "id": "org.apache.sling/org.apache.sling.models.impl/${project.version}", + "start-order": 20 + }, + { + "id": "org.apache.sling/org.apache.sling.models.impl.it.test-models/${project.version}", + "start-order": 20 + } + ], + "configurations": { + "org.apache.sling.serviceusermapping.impl.ServiceUserMapperImpl.amended~integration-tests": { + "user.mapping": [ + "org.apache.sling.junit.core=models-it" + ] + }, + "org.apache.sling.commons.log.LogManager.factory.config~integration-tests": { + "org.apache.sling.commons.log.names": [ + "org.apache.sling.models" + ], + "org.apache.sling.commons.log.level": "${models.log.level}" + } + }, + "repoinit:TEXT|true": "@file" +} \ No newline at end of file diff --git a/it/integration-tests/src/test/java/org/apache/sling/junit/teleporter/customizers/SM_TeleporterCustomizer.java b/it/integration-tests/src/test/java/org/apache/sling/junit/teleporter/customizers/SM_TeleporterCustomizer.java new file mode 100644 index 00000000..ed041054 --- /dev/null +++ b/it/integration-tests/src/test/java/org/apache/sling/junit/teleporter/customizers/SM_TeleporterCustomizer.java @@ -0,0 +1,60 @@ +/* + * 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.junit.teleporter.customizers; + +import java.io.IOException; +import java.net.URI; +import java.util.concurrent.TimeoutException; + +import org.apache.sling.junit.rules.TeleporterRule; +import org.apache.sling.models.impl.ModelAdapterFactory; +import org.apache.sling.testing.clients.ClientException; +import org.apache.sling.testing.clients.osgi.OsgiConsoleClient; +import org.apache.sling.testing.serversetup.instance.SlingTestBase; +import org.apache.sling.testing.teleporter.client.ClientSideTeleporter; +import org.apache.sling.testing.timeouts.TimeoutsProvider; + +/** This is required by the TeleporterRule, to setup the client-side + * teleporter with (at least) the test server URL. + */ +public class SM_TeleporterCustomizer implements TeleporterRule.Customizer { + + private static final SlingTestBase S = new SlingTestBase(); + + private static final Class[] EXPECTED_COMPONENTS = new Class[] {ModelAdapterFactory.class}; + + @Override + public void customize(TeleporterRule t, String options) { + final ClientSideTeleporter cst = (ClientSideTeleporter) t; + cst.setBaseUrl(S.getServerBaseUrl()); + cst.setServerCredentials(S.getServerUsername(), S.getServerPassword()); + cst.setTestReadyTimeoutSeconds(TimeoutsProvider.getInstance().getTimeout(5)); + cst.includeDependencyPrefix("org.apache.sling.models.testing"); + + // additionally check for the registration of mandatory sling models components + try (OsgiConsoleClient osgiClient = + new OsgiConsoleClient(URI.create(S.getServerBaseUrl()), S.getServerUsername(), S.getServerPassword())) { + for (Class clazz : EXPECTED_COMPONENTS) { + osgiClient.waitComponentRegistered(clazz.getName(), 20000, 200); + } + } catch (ClientException | TimeoutException | InterruptedException | IOException ex) { + throw new RuntimeException("Error waiting for expected components.", ex); + } + } +} diff --git a/it/integration-tests/src/test/java/org/apache/sling/models/testing/DecoratedIT.java b/it/integration-tests/src/test/java/org/apache/sling/models/testing/DecoratedIT.java new file mode 100644 index 00000000..8c0a39b1 --- /dev/null +++ b/it/integration-tests/src/test/java/org/apache/sling/models/testing/DecoratedIT.java @@ -0,0 +1,96 @@ +/* + * 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.testing; + +import javax.jcr.Node; +import javax.jcr.Session; + +import org.apache.commons.lang3.RandomStringUtils; +import org.apache.sling.api.resource.Resource; +import org.apache.sling.api.resource.ResourceResolver; +import org.apache.sling.api.resource.ResourceResolverFactory; +import org.apache.sling.api.resource.ResourceWrapper; +import org.apache.sling.junit.rules.TeleporterRule; +import org.apache.sling.models.factory.ModelFactory; +import org.apache.sling.models.it.models.SelfModel; +import org.junit.After; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; + +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; + +public class DecoratedIT { + + @Rule + public final TeleporterRule teleporter = TeleporterRule.forClass(getClass(), "SM_Teleporter"); + + private ModelFactory modelFactory; + + private ResourceResolver resolver; + private Resource resourceWithDefaultWrapperBehavior; + private Resource resourceWithCustomAdaptToWrapper; + + @Before + @SuppressWarnings("null") + public void setUp() throws Exception { + ResourceResolverFactory rrFactory = teleporter.getService(ResourceResolverFactory.class); + modelFactory = teleporter.getService(ModelFactory.class); + resolver = rrFactory.getServiceResourceResolver(null); + Session session = resolver.adaptTo(Session.class); + Node rootNode = session.getRootNode(); + Node createdNode = rootNode.addNode("test_" + RandomStringUtils.randomAlphanumeric(10)); + createdNode.setProperty("decorate", true); + session.save(); + + resourceWithDefaultWrapperBehavior = resolver.getResource(createdNode.getPath()); + + createdNode = rootNode.addNode("test_" + RandomStringUtils.randomAlphanumeric(10)); + createdNode.setProperty("decorate", "customAdaptTo"); + session.save(); + + resourceWithCustomAdaptToWrapper = resolver.getResource(createdNode.getPath()); + } + + @After + public void tearDown() throws Exception { + resolver.delete(resourceWithDefaultWrapperBehavior); + resolver.delete(resourceWithCustomAdaptToWrapper); + resolver.close(); + } + + @Test + public void testInjectDecoratedResourceUsingCreateModel() { + assertTrue("Resource is not wrapped", resourceWithDefaultWrapperBehavior instanceof ResourceWrapper); + SelfModel model = modelFactory.createModel(resourceWithDefaultWrapperBehavior, SelfModel.class); + + assertNotNull("Model is null", model); + assertTrue("Model is not wrapped", model.getResource() instanceof ResourceWrapper); + } + + @Test + public void testInjectDecoratedResourceUsingAdaptTo() { + assertTrue("Resource is not wrapped", resourceWithCustomAdaptToWrapper instanceof ResourceWrapper); + SelfModel model = resourceWithCustomAdaptToWrapper.adaptTo(SelfModel.class); + + assertNotNull("Model is null", model); + assertTrue("Model is not wrapped", model.getResource() instanceof ResourceWrapper); + } +} diff --git a/it/integration-tests/src/test/java/org/apache/sling/models/testing/ImplementsExtendsIT.java b/it/integration-tests/src/test/java/org/apache/sling/models/testing/ImplementsExtendsIT.java new file mode 100644 index 00000000..cc42661a --- /dev/null +++ b/it/integration-tests/src/test/java/org/apache/sling/models/testing/ImplementsExtendsIT.java @@ -0,0 +1,150 @@ +/* + * 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.testing; + +import javax.jcr.Node; +import javax.jcr.RepositoryException; +import javax.jcr.Session; + +import org.apache.commons.lang3.RandomStringUtils; +import org.apache.sling.api.adapter.AdapterManager; +import org.apache.sling.api.resource.Resource; +import org.apache.sling.api.resource.ResourceResolver; +import org.apache.sling.api.resource.ResourceResolverFactory; +import org.apache.sling.junit.rules.TeleporterRule; +import org.apache.sling.models.it.implpicker.CustomLastImplementationPicker; +import org.apache.sling.models.it.models.implextend.ImplementsInterfacePropertyModel; +import org.apache.sling.models.it.models.implextend.ImplementsInterfacePropertyModel2; +import org.apache.sling.models.it.models.implextend.InvalidSampleServiceInterface; +import org.apache.sling.models.it.models.implextend.SampleServiceInterface; +import org.apache.sling.models.it.models.implextend.SimplePropertyModel; +import org.junit.After; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; + +public class ImplementsExtendsIT { + + @Rule + public final TeleporterRule teleporter = TeleporterRule.forClass(getClass(), "SM_Teleporter"); + + private AdapterManager adapterManager; + + private String firstValue; + private String secondValue; + private String thirdValue; + private ResourceResolver resolver; + private Resource resource; + private Node createdNode; + + @Before + @SuppressWarnings("null") + public void setUp() throws Exception { + ResourceResolverFactory rrFactory = teleporter.getService(ResourceResolverFactory.class); + adapterManager = teleporter.getService(AdapterManager.class); + firstValue = RandomStringUtils.randomAlphanumeric(10); + thirdValue = RandomStringUtils.randomAlphanumeric(10); + + resolver = rrFactory.getServiceResourceResolver(null); + Session session = resolver.adaptTo(Session.class); + Node rootNode = session.getRootNode(); + createdNode = rootNode.addNode("test_" + RandomStringUtils.randomAlphanumeric(10)); + createdNode.setProperty("first", firstValue); + createdNode.setProperty("third", thirdValue); + session.save(); + + resource = resolver.getResource(createdNode.getPath()); + } + + @After + public void after() throws Exception { + if (resolver != null) { + resolver.close(); + } + } + + /** + * Try to adapt to interface, with an different implementation class that has the @Model annotation + */ + @Test + public void testImplementsInterfaceModel() { + SampleServiceInterface model = adapterManager.getAdapter(resource, SampleServiceInterface.class); + assertNotNull(model); + assertEquals(ImplementsInterfacePropertyModel.class, model.getClass()); + assertEquals(firstValue + "|" + secondValue + "|" + thirdValue, model.getAllProperties()); + } + + /** + * Ensure that the implementation class itself can be adapted to, even if it is not part of the "adapter" property in the annotation. + */ + @Test + public void testImplementsInterfaceModel_ImplClassImplicitlyMapped() { + ImplementsInterfacePropertyModel model = + adapterManager.getAdapter(resource, ImplementsInterfacePropertyModel.class); + assertNotNull(model); + } + + /** + * Test implementation class with a mapping that is not valid (an interface that is not implemented). + */ + @Test + public void testInvalidImplementsInterfaceModel() { + InvalidSampleServiceInterface model = adapterManager.getAdapter(resource, InvalidSampleServiceInterface.class); + assertNull(model); + } + + /** + * Test to adapt to a superclass of the implementation class with the appropriate mapping in the @Model annotation. + */ + @Test + public void testExtendsClassModel() { + SimplePropertyModel model = adapterManager.getAdapter(resource, SimplePropertyModel.class); + assertNotNull(model); + assertEquals("!" + firstValue + "|" + secondValue + "|" + thirdValue + "!", model.getAllProperties()); + } + + /** + * Try to adapt to interface, with an different implementation class that has the @Model annotation + */ + @Test + @SuppressWarnings("null") + public void testImplementsInterfaceModelWithPickLastImplementationPicker() throws RepositoryException { + + Session session = resolver.adaptTo(Session.class); + Node node = resource.adaptTo(Node.class); + Node childNode = node.addNode(CustomLastImplementationPicker.CUSTOM_NAME); + childNode.setProperty("first", firstValue); + childNode.setProperty("third", thirdValue); + session.save(); + + Resource childResource = resolver.getResource(childNode.getPath()); + + SampleServiceInterface model = adapterManager.getAdapter(childResource, SampleServiceInterface.class); + assertNotNull(model); + assertEquals(ImplementsInterfacePropertyModel2.class, model.getClass()); + assertEquals(firstValue + "|" + secondValue + "|" + thirdValue, model.getAllProperties()); + + childNode.remove(); + session.save(); + } +} diff --git a/it/integration-tests/src/test/java/org/apache/sling/models/testing/InjectorSpecificAnnotationIT.java b/it/integration-tests/src/test/java/org/apache/sling/models/testing/InjectorSpecificAnnotationIT.java new file mode 100644 index 00000000..3764dbc0 --- /dev/null +++ b/it/integration-tests/src/test/java/org/apache/sling/models/testing/InjectorSpecificAnnotationIT.java @@ -0,0 +1,72 @@ +/* + * 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.testing; + +import javax.jcr.Node; +import javax.jcr.Session; + +import org.apache.commons.lang3.RandomStringUtils; +import org.apache.sling.api.resource.Resource; +import org.apache.sling.api.resource.ResourceResolver; +import org.apache.sling.api.resource.ResourceResolverFactory; +import org.apache.sling.junit.rules.TeleporterRule; +import org.apache.sling.models.it.models.SlingPropertyAnnotationTestModel; +import org.junit.Rule; +import org.junit.Test; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + +public class InjectorSpecificAnnotationIT { + + @Rule + public final TeleporterRule teleporter = TeleporterRule.forClass(getClass(), "SM_Teleporter"); + + @Test + @SuppressWarnings("null") + public void test() throws Exception { + ResourceResolverFactory rrFactory = teleporter.getService(ResourceResolverFactory.class); + String value = RandomStringUtils.randomAlphanumeric(10); + + ResourceResolver resolver = null; + Node createdNode = null; + try { + resolver = rrFactory.getServiceResourceResolver(null); + Session session = resolver.adaptTo(Session.class); + Node rootNode = session.getRootNode(); + createdNode = rootNode.addNode("test_" + RandomStringUtils.randomAlphanumeric(10)); + createdNode.setProperty("testProperty", value); + session.save(); + + Resource resource = resolver.getResource(createdNode.getPath()); + + SlingPropertyAnnotationTestModel model = resource.adaptTo(SlingPropertyAnnotationTestModel.class); + + assertNotNull("Model is null", model); + assertEquals("Test Property is not set correctly", value, model.getTestProperty()); + } finally { + if (createdNode != null) { + createdNode.remove(); + } + if (resolver != null) { + resolver.close(); + } + } + } +} diff --git a/it/integration-tests/src/test/java/org/apache/sling/models/testing/ModelFactorySimpleIT.java b/it/integration-tests/src/test/java/org/apache/sling/models/testing/ModelFactorySimpleIT.java new file mode 100644 index 00000000..54681137 --- /dev/null +++ b/it/integration-tests/src/test/java/org/apache/sling/models/testing/ModelFactorySimpleIT.java @@ -0,0 +1,130 @@ +/* + * 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.testing; + +import javax.jcr.Node; +import javax.jcr.Session; + +import org.apache.commons.lang3.RandomStringUtils; +import org.apache.sling.api.resource.Resource; +import org.apache.sling.api.resource.ResourceResolver; +import org.apache.sling.api.resource.ResourceResolverFactory; +import org.apache.sling.junit.rules.TeleporterRule; +import org.apache.sling.models.factory.ModelFactory; +import org.apache.sling.models.it.models.ConstructorInjectionTestModel; +import org.apache.sling.models.it.models.FieldInjectionTestModel; +import org.apache.sling.models.it.models.implextend.InvalidImplementsInterfacePropertyModel; +import org.apache.sling.models.it.models.implextend.SampleServiceInterface; +import org.junit.After; +import org.junit.Before; +import org.junit.Ignore; +import org.junit.Rule; +import org.junit.Test; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertSame; +import static org.junit.Assert.assertTrue; + +public class ModelFactorySimpleIT { + + @Rule + public final TeleporterRule teleporter = TeleporterRule.forClass(getClass(), "SM_Teleporter"); + + private ModelFactory modelFactory; + + private String value; + private ResourceResolver resolver; + private Resource resource; + private Node createdNode; + + @Before + @SuppressWarnings("null") + public void setUp() throws Exception { + ResourceResolverFactory rrFactory = teleporter.getService(ResourceResolverFactory.class); + modelFactory = teleporter.getService(ModelFactory.class); + value = RandomStringUtils.randomAlphanumeric(10); + + resolver = rrFactory.getServiceResourceResolver(null); + Session session = resolver.adaptTo(Session.class); + Node rootNode = session.getRootNode(); + createdNode = rootNode.addNode("test_" + RandomStringUtils.randomAlphanumeric(10)); + createdNode.setProperty("testProperty", value); + session.save(); + + resource = resolver.getResource(createdNode.getPath()); + } + + @After + public void tearDown() throws Exception { + if (createdNode != null) { + createdNode.remove(); + } + if (resolver != null) { + resolver.close(); + } + } + + @Test + public void testCreateModel() { + FieldInjectionTestModel model = modelFactory.createModel(resource, FieldInjectionTestModel.class); + + assertNotNull("Model is null", model); + assertEquals("Test Property is not set correctly", value, model.getTestProperty()); + assertNotNull("Filters is null", model.getFilters()); + assertSame("Adaptable is not injected", resource, model.getResource()); + } + + @Ignore + private static final class DummyClass {} + + @Test + public void testIsModelClass() { + assertTrue("Model is not detected as such", modelFactory.isModelClass(ConstructorInjectionTestModel.class)); + assertFalse("Dummy class incorrectly detected as model class", modelFactory.isModelClass(DummyClass.class)); + assertFalse( + "Model with invalid adaptable incorrectly detected as model class", + modelFactory.isModelClass(InvalidImplementsInterfacePropertyModel.class)); + assertTrue( + "Model is not detected as such", + modelFactory.isModelClass(SampleServiceInterface.class)); // being provided by two adapters + } + + @Test + public void testCanCreateFromAdaptable() { + assertTrue( + "Model is not detected as such", + modelFactory.canCreateFromAdaptable(resource, ConstructorInjectionTestModel.class)); + assertTrue( + "Model is not detected as such", + modelFactory.canCreateFromAdaptable(resource, SampleServiceInterface.class)); + assertFalse( + "Model is incorrectly detected", + modelFactory.canCreateFromAdaptable( + new String(), ConstructorInjectionTestModel.class)); // invalid adaptable + } + + @Test() + public void testCanCreateFromAdaptableWithModelExceptin() { + assertFalse( + "Model is incorrectly detected", + modelFactory.canCreateFromAdaptable(resource, DummyClass.class)); // no model class + } +} diff --git a/it/integration-tests/src/test/java/org/apache/sling/models/testing/PathBoundServletIT.java b/it/integration-tests/src/test/java/org/apache/sling/models/testing/PathBoundServletIT.java new file mode 100644 index 00000000..bec53f8b --- /dev/null +++ b/it/integration-tests/src/test/java/org/apache/sling/models/testing/PathBoundServletIT.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.testing; + +import org.apache.sling.api.resource.ResourceResolver; +import org.apache.sling.api.resource.ResourceResolverFactory; +import org.apache.sling.engine.SlingRequestProcessor; +import org.apache.sling.junit.rules.TeleporterRule; +import org.apache.sling.models.testing.helper.FakeRequest; +import org.apache.sling.models.testing.helper.FakeResponse; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; + +public class PathBoundServletIT { + + @Rule + public final TeleporterRule teleporter = TeleporterRule.forClass(getClass(), "SM_Teleporter"); + + private ResourceResolverFactory rrFactory; + private SlingRequestProcessor slingRequestProcessor; + + @Before + @SuppressWarnings("null") + public void setup() { + rrFactory = teleporter.getService(ResourceResolverFactory.class); + slingRequestProcessor = teleporter.getService(SlingRequestProcessor.class); + } + + @Test + public void testDoubledServlets() throws Exception { + try (ResourceResolver resolver = rrFactory.getServiceResourceResolver(null); ) { + FakeResponse response = new FakeResponse(); + slingRequestProcessor.processRequest(new FakeRequest("/apps/rtpickerrequest"), response, resolver); + + Assert.assertEquals(200, response.getStatus()); + } + } + + @Test + public void testDoubledServletsJakarta() throws Exception { + try (ResourceResolver resolver = rrFactory.getServiceResourceResolver(null); ) { + FakeResponse response = new FakeResponse(); + slingRequestProcessor.processRequest(new FakeRequest("/apps/rtpickerrequest-jakarta"), response, resolver); + + Assert.assertEquals(200, response.getStatus()); + } + } +} diff --git a/it/integration-tests/src/test/java/org/apache/sling/models/testing/ServiceInjectionWithDifferentRankingIT.java b/it/integration-tests/src/test/java/org/apache/sling/models/testing/ServiceInjectionWithDifferentRankingIT.java new file mode 100644 index 00000000..7a9b1a08 --- /dev/null +++ b/it/integration-tests/src/test/java/org/apache/sling/models/testing/ServiceInjectionWithDifferentRankingIT.java @@ -0,0 +1,147 @@ +/* + * 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.testing; + +import javax.jcr.Node; +import javax.jcr.Session; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Dictionary; +import java.util.Hashtable; + +import org.apache.commons.lang3.RandomStringUtils; +import org.apache.sling.api.resource.Resource; +import org.apache.sling.api.resource.ResourceResolver; +import org.apache.sling.api.resource.ResourceResolverFactory; +import org.apache.sling.junit.Activator; +import org.apache.sling.junit.rules.TeleporterRule; +import org.apache.sling.models.factory.ModelFactory; +import org.apache.sling.models.it.models.ServiceInjectionTestModel; +import org.apache.sling.models.it.services.SimpleService; +import org.apache.sling.models.it.services.SimpleServiceWithCustomRanking; +import org.junit.After; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.osgi.framework.BundleContext; +import org.osgi.framework.Constants; +import org.osgi.framework.ServiceRegistration; + +import static org.junit.Assert.assertArrayEquals; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + +public class ServiceInjectionWithDifferentRankingIT { + + @Rule + public final TeleporterRule teleporter = TeleporterRule.forClass(getClass(), "SM_Teleporter"); + + private ModelFactory modelFactory; + + private String value; + private ResourceResolver resolver; + private Resource resource; + private Node createdNode; + private BundleContext bundleContext; + private Collection serviceRegistrations; + + @Before + @SuppressWarnings("null") + public void setUp() throws Exception { + ResourceResolverFactory rrFactory = teleporter.getService(ResourceResolverFactory.class); + modelFactory = teleporter.getService(ModelFactory.class); + value = RandomStringUtils.randomAlphanumeric(10); + + resolver = rrFactory.getServiceResourceResolver(null); + Session session = resolver.adaptTo(Session.class); + Node rootNode = session.getRootNode(); + createdNode = rootNode.addNode("test_" + RandomStringUtils.randomAlphanumeric(10)); + createdNode.setProperty("testProperty", value); + session.save(); + + resource = resolver.getResource(createdNode.getPath()); + + bundleContext = Activator.getBundleContext(); + serviceRegistrations = new ArrayList(); + } + + @After + public void tearDown() throws Exception { + if (createdNode != null) { + createdNode.remove(); + } + if (resolver != null) { + resolver.close(); + } + + for (ServiceRegistration serviceRegistration : serviceRegistrations) { + serviceRegistration.unregister(); + } + } + + @SuppressWarnings("unchecked") + private void registerSimpleService(int ranking) { + @SuppressWarnings("rawtypes") + Dictionary serviceProps = new Hashtable(); + serviceProps.put(Constants.SERVICE_RANKING, new Integer(ranking)); + ServiceRegistration serviceRegistration = bundleContext.registerService( + SimpleService.class.getName(), new SimpleServiceWithCustomRanking(ranking), serviceProps); + serviceRegistrations.add(serviceRegistration); + } + + @Test + public void testServiceInjectionConsideringRankingWithResource() throws IOException { + + registerSimpleService(0); + // cannot use adaptTo due to adaptersCache + ServiceInjectionTestModel model = modelFactory.createModel(resource, ServiceInjectionTestModel.class); + assertNotNull("Model is null", model); + // only the default service with ranking 0 is known + assertEquals( + "The service with the highest ranking was not returned", + 0, + model.getSimpleService().getRanking()); + assertArrayEquals("Order on injected services is wrong", model.getSimpleServicesRankings(), new Integer[] {0}); + + registerSimpleService(-1000); + model = modelFactory.createModel(resource, ServiceInjectionTestModel.class); + assertNotNull("Model is null", model); + // ranking 0 is still the highest one + assertEquals( + "The service with the highest ranking was not returned", + 0, + model.getSimpleService().getRanking()); + assertArrayEquals( + "Order on injected services is wrong", model.getSimpleServicesRankings(), new Integer[] {0, -1000}); + + registerSimpleService(1000); + model = modelFactory.createModel(resource, ServiceInjectionTestModel.class); + assertNotNull("Model is null", model); + // now ranking 1000 is the highest + assertEquals( + "The service with the highest ranking was not returned", + 1000, + model.getSimpleService().getRanking()); + assertArrayEquals( + "Order on injected services is wrong", model.getSimpleServicesRankings(), new Integer[] {1000, 0, -1000 + }); + } +} diff --git a/it/integration-tests/src/test/java/org/apache/sling/models/testing/SimpleIT.java b/it/integration-tests/src/test/java/org/apache/sling/models/testing/SimpleIT.java new file mode 100644 index 00000000..7ab3c7f5 --- /dev/null +++ b/it/integration-tests/src/test/java/org/apache/sling/models/testing/SimpleIT.java @@ -0,0 +1,111 @@ +/* + * 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.testing; + +import javax.jcr.Node; +import javax.jcr.Session; + +import org.apache.commons.lang3.RandomStringUtils; +import org.apache.sling.api.resource.Resource; +import org.apache.sling.api.resource.ResourceResolver; +import org.apache.sling.api.resource.ResourceResolverFactory; +import org.apache.sling.junit.rules.TeleporterRule; +import org.apache.sling.models.it.models.ConstructorInjectionTestModel; +import org.apache.sling.models.it.models.FieldInjectionTestModel; +import org.apache.sling.models.it.models.InterfaceInjectionTestModel; +import org.junit.After; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertSame; + +public class SimpleIT { + + @Rule + public final TeleporterRule teleporter = TeleporterRule.forClass(getClass(), "SM_Teleporter"); + + private String value; + private String childValue; + private ResourceResolver resolver; + private Resource resource; + private Node createdNode; + + @Before + @SuppressWarnings("null") + public void setUp() throws Exception { + ResourceResolverFactory rrFactory = teleporter.getService(ResourceResolverFactory.class); + value = RandomStringUtils.randomAlphanumeric(10); + childValue = RandomStringUtils.randomAlphanumeric(10); + + resolver = rrFactory.getServiceResourceResolver(null); + Session session = resolver.adaptTo(Session.class); + Node rootNode = session.getRootNode(); + createdNode = rootNode.addNode("test_" + RandomStringUtils.randomAlphanumeric(10)); + createdNode.setProperty("testProperty", value); + Node child = createdNode.addNode("child"); + child.setProperty("childProperty", childValue); + session.save(); + + resource = resolver.getResource(createdNode.getPath()); + } + + @After + public void tearDown() throws Exception { + if (createdNode != null) { + createdNode.remove(); + } + if (resolver != null) { + resolver.close(); + } + } + + @Test + public void testFieldInjection() { + FieldInjectionTestModel model = resource.adaptTo(FieldInjectionTestModel.class); + + assertNotNull("Model is null", model); + assertEquals("Test Property is not set correctly", value, model.getTestProperty()); + assertEquals("Child Test Property is not set correctly", childValue, model.getChildProperty()); + assertNotNull("Filters is null", model.getFilters()); + assertSame("Adaptable is not injected", resource, model.getResource()); + } + + @Test + public void testInterfaceInjection() { + InterfaceInjectionTestModel model = resource.adaptTo(InterfaceInjectionTestModel.class); + + assertNotNull("Model is null", model); + assertEquals("Test Property is not set correctly", value, model.getTestProperty()); + assertNotNull("Filters is null", model.getFilters()); + assertSame("Adaptable is not injected", resource, model.getResource()); + } + + @Test + public void testConstructorInjection() { + ConstructorInjectionTestModel model = resource.adaptTo(ConstructorInjectionTestModel.class); + + assertNotNull("Model is null", model); + assertEquals("Test Property is not set correctly", value, model.getTestProperty()); + assertNotNull("Filters is null", model.getFilters()); + assertSame("Adaptable is not injected", resource, model.getResource()); + } +} diff --git a/it/integration-tests/src/test/java/org/apache/sling/models/testing/ViaIT.java b/it/integration-tests/src/test/java/org/apache/sling/models/testing/ViaIT.java new file mode 100644 index 00000000..07f973e2 --- /dev/null +++ b/it/integration-tests/src/test/java/org/apache/sling/models/testing/ViaIT.java @@ -0,0 +1,77 @@ +/* + * 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.testing; + +import javax.jcr.Node; +import javax.jcr.Session; + +import org.apache.commons.lang3.RandomStringUtils; +import org.apache.sling.api.adapter.AdapterManager; +import org.apache.sling.api.resource.Resource; +import org.apache.sling.api.resource.ResourceResolver; +import org.apache.sling.api.resource.ResourceResolverFactory; +import org.apache.sling.junit.rules.TeleporterRule; +import org.apache.sling.models.it.models.SourceObject; +import org.apache.sling.models.it.models.ViaModel; +import org.junit.Rule; +import org.junit.Test; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + +public class ViaIT { + + @Rule + public final TeleporterRule teleporter = TeleporterRule.forClass(getClass(), "SM_Teleporter"); + + @Test + @SuppressWarnings("null") + public void test() throws Exception { + ResourceResolverFactory rrFactory = teleporter.getService(ResourceResolverFactory.class); + AdapterManager adapterManager = teleporter.getService(AdapterManager.class); + + String value = RandomStringUtils.randomAlphanumeric(10); + + ResourceResolver resolver = null; + Node createdNode = null; + try { + resolver = rrFactory.getServiceResourceResolver(null); + Session session = resolver.adaptTo(Session.class); + Node rootNode = session.getRootNode(); + createdNode = rootNode.addNode("test_" + RandomStringUtils.randomAlphanumeric(10)); + createdNode.setProperty("testProperty", value); + session.save(); + + Resource resource = resolver.getResource(createdNode.getPath()); + SourceObject obj = new SourceObject(resource); + + ViaModel model = adapterManager.getAdapter(obj, ViaModel.class); + + assertNotNull("Model is null", model); + assertEquals("Test Property is not set correctly", value, model.getTestProperty()); + } finally { + if (createdNode != null) { + createdNode.remove(); + } + if (resolver != null) { + resolver.close(); + } + } + } +} diff --git a/it/integration-tests/src/test/java/org/apache/sling/models/testing/delegate/DelegateRequestIT.java b/it/integration-tests/src/test/java/org/apache/sling/models/testing/delegate/DelegateRequestIT.java new file mode 100644 index 00000000..a6b494a7 --- /dev/null +++ b/it/integration-tests/src/test/java/org/apache/sling/models/testing/delegate/DelegateRequestIT.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.testing.delegate; + +import java.util.HashMap; +import java.util.Map; + +import org.apache.sling.api.SlingConstants; +import org.apache.sling.api.resource.LoginException; +import org.apache.sling.api.resource.PersistenceException; +import org.apache.sling.api.resource.Resource; +import org.apache.sling.api.resource.ResourceResolver; +import org.apache.sling.api.resource.ResourceResolverFactory; +import org.apache.sling.api.resource.ResourceUtil; +import org.apache.sling.junit.rules.TeleporterRule; +import org.apache.sling.models.factory.ModelFactory; +import org.apache.sling.models.it.delegate.request.DelegateBaseModel; +import org.apache.sling.models.it.delegate.request.DelegateExtendedModel; +import org.apache.sling.models.it.delegate.request.DelegateInterface; +import org.apache.sling.models.testing.rtbound.FakeRequest; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; + +public class DelegateRequestIT { + + @Rule + public final TeleporterRule teleporter = TeleporterRule.forClass(getClass(), "SM_Teleporter"); + + private ResourceResolverFactory rrFactory; + + private ModelFactory modelFactory; + + private final String baseComponentPath = "/content/delegate/baseComponent"; + private final String extendedComponentPath = "/content/delegate/extendedComponent"; + + @Before + @SuppressWarnings("null") + public void setup() throws LoginException, PersistenceException { + rrFactory = teleporter.getService(ResourceResolverFactory.class); + modelFactory = teleporter.getService(ModelFactory.class); + try (ResourceResolver adminResolver = rrFactory.getServiceResourceResolver(null); ) { + + Map properties = new HashMap(); + properties.put("text", "baseTESTValue"); + properties.put("other", "baseOther"); + properties.put( + SlingConstants.NAMESPACE_PREFIX + ":" + SlingConstants.PROPERTY_RESOURCE_TYPE, + "sling/delegate/base"); + ResourceUtil.getOrCreateResource(adminResolver, baseComponentPath, properties, null, false); + properties.clear(); + + properties.put("text", "extendedTESTValue"); + properties.put("other", "extendedOther"); + properties.put( + SlingConstants.NAMESPACE_PREFIX + ":" + SlingConstants.PROPERTY_RESOURCE_TYPE, + "sling/delegate/extended"); + ResourceUtil.getOrCreateResource(adminResolver, extendedComponentPath, properties, null, false); + properties.clear(); + + properties.put( + SlingConstants.NAMESPACE_PREFIX + ":" + SlingConstants.PROPERTY_RESOURCE_SUPER_TYPE, + "sling/delegate/base"); + ResourceUtil.getOrCreateResource(adminResolver, "/apps/sling/delegate/extended", properties, null, false); + properties.clear(); + + adminResolver.commit(); + } + } + + @Test + public void testCreateDelegateModel() throws LoginException { + try (ResourceResolver resolver = rrFactory.getServiceResourceResolver(null); ) { + final Resource baseComponentResource = resolver.getResource(baseComponentPath); + assertNotNull(baseComponentResource); + final FakeRequest baseRequest = new FakeRequest(baseComponentResource); + final DelegateInterface modelFromBase = modelFactory.createModel(baseRequest, DelegateInterface.class); + assertNotNull("Base Model should not be null", modelFromBase); + assertTrue("Model should be DelegateBaseModel", modelFromBase instanceof DelegateBaseModel); + assertEquals("baseTESTValue", modelFromBase.getText()); + assertEquals("baseOther", modelFromBase.getOther()); + + final Resource extendedComponentResource = resolver.getResource(extendedComponentPath); + assertNotNull(extendedComponentResource); + final FakeRequest extendedRequest = new FakeRequest(extendedComponentResource); + final DelegateInterface modelFromExtended = + modelFactory.createModel(extendedRequest, DelegateInterface.class); + assertNotNull("Extended Model should not be null", modelFromExtended); + assertTrue("Model should be DelegateExtendedModel", modelFromExtended instanceof DelegateExtendedModel); + assertEquals("EXTENDEDTESTVALUE", modelFromExtended.getText()); + assertEquals("extendedOther", modelFromExtended.getOther()); + } + } +} diff --git a/it/integration-tests/src/test/java/org/apache/sling/models/testing/delegate/DelegateResourceIT.java b/it/integration-tests/src/test/java/org/apache/sling/models/testing/delegate/DelegateResourceIT.java new file mode 100644 index 00000000..97f80949 --- /dev/null +++ b/it/integration-tests/src/test/java/org/apache/sling/models/testing/delegate/DelegateResourceIT.java @@ -0,0 +1,105 @@ +/* + * 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.testing.delegate; + +import java.util.HashMap; +import java.util.Map; + +import org.apache.sling.api.SlingConstants; +import org.apache.sling.api.resource.LoginException; +import org.apache.sling.api.resource.PersistenceException; +import org.apache.sling.api.resource.Resource; +import org.apache.sling.api.resource.ResourceResolver; +import org.apache.sling.api.resource.ResourceResolverFactory; +import org.apache.sling.api.resource.ResourceUtil; +import org.apache.sling.junit.rules.TeleporterRule; +import org.apache.sling.models.it.delegate.resource.DelegateBaseModel; +import org.apache.sling.models.it.delegate.resource.DelegateExtendedModel; +import org.apache.sling.models.it.delegate.resource.DelegateInterface; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; + +public class DelegateResourceIT { + + @Rule + public final TeleporterRule teleporter = TeleporterRule.forClass(getClass(), "SM_Teleporter"); + + private ResourceResolverFactory rrFactory; + + private final String baseComponentPath = "/content/delegate/baseComponent"; + private final String extendedComponentPath = "/content/delegate/extendedComponent"; + + @Before + @SuppressWarnings("null") + public void setup() throws LoginException, PersistenceException { + rrFactory = teleporter.getService(ResourceResolverFactory.class); + try (ResourceResolver adminResolver = rrFactory.getServiceResourceResolver(null); ) { + Map properties = new HashMap(); + properties.put("text", "baseTESTValue"); + properties.put("other", "baseOther"); + properties.put( + SlingConstants.NAMESPACE_PREFIX + ":" + SlingConstants.PROPERTY_RESOURCE_TYPE, + "sling/delegate/base"); + ResourceUtil.getOrCreateResource(adminResolver, baseComponentPath, properties, null, false); + properties.clear(); + + properties.put("text", "extendedTESTValue"); + properties.put("other", "extendedOther"); + properties.put( + SlingConstants.NAMESPACE_PREFIX + ":" + SlingConstants.PROPERTY_RESOURCE_TYPE, + "sling/delegate/extended"); + ResourceUtil.getOrCreateResource(adminResolver, extendedComponentPath, properties, null, false); + properties.clear(); + + properties.put( + SlingConstants.NAMESPACE_PREFIX + ":" + SlingConstants.PROPERTY_RESOURCE_SUPER_TYPE, + "sling/delegate/base"); + ResourceUtil.getOrCreateResource(adminResolver, "/apps/sling/delegate/extended", properties, null, false); + properties.clear(); + + adminResolver.commit(); + } + } + + @Test + public void testCreateDelegateModel() throws LoginException { + try (ResourceResolver resolver = rrFactory.getServiceResourceResolver(null); ) { + final Resource baseComponentResource = resolver.getResource(baseComponentPath); + assertNotNull(baseComponentResource); + final DelegateInterface modelFromBase = baseComponentResource.adaptTo(DelegateInterface.class); + assertNotNull("Model should not be null", modelFromBase); + assertTrue("Model should be DelegateBaseModel", modelFromBase instanceof DelegateBaseModel); + assertEquals("baseTESTValue", modelFromBase.getText()); + assertEquals("baseOther", modelFromBase.getOther()); + + final Resource extendedComponentResource = resolver.getResource(extendedComponentPath); + assertNotNull(extendedComponentResource); + final DelegateInterface modelFromExtended = extendedComponentResource.adaptTo(DelegateInterface.class); + assertNotNull("Model should not be null", modelFromExtended); + assertTrue("Model should be DelegateExtendedModel", modelFromExtended instanceof DelegateExtendedModel); + assertEquals("EXTENDEDTESTVALUE", modelFromExtended.getText()); + assertEquals("extendedOther", modelFromExtended.getOther()); + } + } +} diff --git a/it/integration-tests/src/test/java/org/apache/sling/models/testing/delegate/viaoriginalresource/ViaOriginalResourceDelegationIT.java b/it/integration-tests/src/test/java/org/apache/sling/models/testing/delegate/viaoriginalresource/ViaOriginalResourceDelegationIT.java new file mode 100644 index 00000000..ee119b77 --- /dev/null +++ b/it/integration-tests/src/test/java/org/apache/sling/models/testing/delegate/viaoriginalresource/ViaOriginalResourceDelegationIT.java @@ -0,0 +1,139 @@ +/* + * 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.testing.delegate.viaoriginalresource; + +import java.util.HashMap; +import java.util.Map; + +import org.apache.sling.api.resource.LoginException; +import org.apache.sling.api.resource.PersistenceException; +import org.apache.sling.api.resource.Resource; +import org.apache.sling.api.resource.ResourceResolver; +import org.apache.sling.api.resource.ResourceResolverFactory; +import org.apache.sling.api.resource.ResourceUtil; +import org.apache.sling.junit.rules.TeleporterRule; +import org.apache.sling.models.factory.ModelFactory; +import org.apache.sling.models.it.delegate.viaoriginalresource.A; +import org.apache.sling.models.it.delegate.viaoriginalresource.models.A1Impl; +import org.apache.sling.models.it.delegate.viaoriginalresource.models.AImpl; +import org.apache.sling.models.it.delegate.viaoriginalresource.models.B1Impl; +import org.apache.sling.models.it.delegate.viaoriginalresource.models.BImpl; +import org.apache.sling.models.testing.rtbound.FakeRequest; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; + +import static org.junit.Assert.assertSame; +import static org.junit.Assert.assertTrue; + +public class ViaOriginalResourceDelegationIT { + + @Rule + public final TeleporterRule teleporter = TeleporterRule.forClass(getClass(), "SM_Teleporter"); + + private ResourceResolverFactory rrFactory; + + private ModelFactory modelFactory; + + private final String genericComponent = "/apps/delegate/nestedrtbound/generic"; + private final String specificComponent = "/apps/delegate/nestedrtbound/specific"; + private final String genericContent = "/content/delegate/nestedrtbound/generic"; + private final String specificContent = "/content/delegate/nestedrtbound/specific"; + + @Before + @SuppressWarnings("null") + public void setup() throws LoginException, PersistenceException { + rrFactory = teleporter.getService(ResourceResolverFactory.class); + modelFactory = teleporter.getService(ModelFactory.class); + try (ResourceResolver adminResolver = rrFactory.getServiceResourceResolver(null); ) { + + Map properties = new HashMap(); + ResourceUtil.getOrCreateResource(adminResolver, genericComponent, properties, null, false); + properties.clear(); + + properties.put("sling:resourceSuperType", "delegate/nestedrtbound/generic"); + ResourceUtil.getOrCreateResource(adminResolver, specificComponent, properties, null, false); + properties.clear(); + + properties.put("sling:resourceType", "delegate/nestedrtbound/generic"); + ResourceUtil.getOrCreateResource(adminResolver, genericContent, properties, null, false); + properties.clear(); + + properties.put("sling:resourceType", "delegate/nestedrtbound/specific"); + ResourceUtil.getOrCreateResource(adminResolver, specificContent, properties, null, false); + properties.clear(); + + adminResolver.commit(); + } + } + + @Test + public void testGenericModelFromRequest() throws LoginException { + try (ResourceResolver resolver = rrFactory.getServiceResourceResolver(null); ) { + final Resource content = resolver.getResource(genericContent); + final FakeRequest baseRequest = new FakeRequest(content); + + final A model = modelFactory.createModel(baseRequest, A.class); + assertTrue(model instanceof AImpl); + assertTrue(((AImpl) model).other instanceof BImpl); + } + } + + @Test + public void testSpecificModelFromRequest() throws LoginException { + try (ResourceResolver resolver = rrFactory.getServiceResourceResolver(null); ) { + final Resource content = resolver.getResource(specificContent); + final FakeRequest baseRequest = new FakeRequest(content); + + final A model = modelFactory.createModel(baseRequest, A.class); + assertTrue(model instanceof A1Impl); + assertTrue(((A1Impl) model).other instanceof B1Impl); + assertTrue(((A1Impl) model).delegate instanceof AImpl); + assertTrue(((AImpl) ((A1Impl) model).delegate).other instanceof B1Impl); + // Since SLING-11133 and cache = true + assertSame(((A1Impl) model).other, ((AImpl) ((A1Impl) model).delegate).other); + } + } + + @Test + public void testGenericModelFromResource() throws LoginException { + try (ResourceResolver resolver = rrFactory.getServiceResourceResolver(null); ) { + final Resource content = resolver.getResource(genericContent); + + final A model = modelFactory.createModel(content, A.class); + assertTrue(model instanceof AImpl); + assertTrue(((AImpl) model).other instanceof BImpl); + } + } + + @Test + public void testSpecificModelFromResource() throws LoginException { + try (ResourceResolver resolver = rrFactory.getServiceResourceResolver(null); ) { + final Resource content = resolver.getResource(specificContent); + + final A model = modelFactory.createModel(content, A.class); + assertTrue(model instanceof A1Impl); + assertTrue(((A1Impl) model).other instanceof B1Impl); + assertTrue(((A1Impl) model).delegate instanceof AImpl); + assertTrue(((AImpl) ((A1Impl) model).delegate).other instanceof B1Impl); + // Since SLING-11133 and cache = true + assertSame(((A1Impl) model).other, ((AImpl) ((A1Impl) model).delegate).other); + } + } +} diff --git a/it/integration-tests/src/test/java/org/apache/sling/models/testing/helper/FakeRequest.java b/it/integration-tests/src/test/java/org/apache/sling/models/testing/helper/FakeRequest.java new file mode 100644 index 00000000..1290f8ac --- /dev/null +++ b/it/integration-tests/src/test/java/org/apache/sling/models/testing/helper/FakeRequest.java @@ -0,0 +1,400 @@ +/* + * 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.testing.helper; + +import javax.servlet.AsyncContext; +import javax.servlet.DispatcherType; +import javax.servlet.RequestDispatcher; +import javax.servlet.ServletContext; +import javax.servlet.ServletException; +import javax.servlet.ServletInputStream; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import javax.servlet.http.Cookie; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpSession; +import javax.servlet.http.HttpUpgradeHandler; +import javax.servlet.http.Part; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.security.Principal; +import java.util.Collection; +import java.util.Collections; +import java.util.Enumeration; +import java.util.HashMap; +import java.util.Locale; +import java.util.Map; + +public class FakeRequest implements HttpServletRequest { + + private final String path; + + private final StringBuffer requestUrl; + + private final Map attributes = new HashMap(); + + public FakeRequest(String path) { + this.path = path; + this.requestUrl = new StringBuffer("http://notarealhost").append(path); + } + + @Override + public String getAuthType() { + return null; + } + + @Override + public Cookie[] getCookies() { + return new Cookie[0]; + } + + @Override + public long getDateHeader(String name) { + return 0; + } + + @Override + public String getHeader(String name) { + return null; + } + + @Override + public Enumeration getHeaders(String name) { + return null; + } + + @Override + public Enumeration getHeaderNames() { + return null; + } + + @Override + public int getIntHeader(String name) { + return 0; + } + + @Override + public String getMethod() { + return "GET"; + } + + @Override + public String getPathInfo() { + return path; + } + + @Override + public String getPathTranslated() { + return null; + } + + @Override + public String getContextPath() { + return null; + } + + @Override + public String getQueryString() { + return null; + } + + @Override + public String getRemoteUser() { + return null; + } + + @Override + public boolean isUserInRole(String role) { + return false; + } + + @Override + public Principal getUserPrincipal() { + return null; + } + + @Override + public String getRequestedSessionId() { + return null; + } + + @Override + public String getRequestURI() { + return null; + } + + @Override + public StringBuffer getRequestURL() { + return requestUrl; + } + + @Override + public String getServletPath() { + return ""; + } + + @Override + public HttpSession getSession(boolean create) { + return null; + } + + @Override + public HttpSession getSession() { + return null; + } + + @Override + public boolean isRequestedSessionIdValid() { + return false; + } + + @Override + public boolean isRequestedSessionIdFromCookie() { + return false; + } + + @Override + public boolean isRequestedSessionIdFromURL() { + return false; + } + + @Override + public boolean isRequestedSessionIdFromUrl() { + return false; + } + + @Override + public Object getAttribute(String name) { + return attributes.get(name); + } + + @Override + public Enumeration getAttributeNames() { + return null; + } + + @Override + public String getCharacterEncoding() { + return null; + } + + @Override + public void setCharacterEncoding(String env) throws UnsupportedEncodingException {} + + @Override + public int getContentLength() { + return 0; + } + + @Override + public String getContentType() { + return null; + } + + @Override + public ServletInputStream getInputStream() throws IOException { + return null; + } + + @Override + public String getParameter(String name) { + return null; + } + + @Override + public Enumeration getParameterNames() { + return null; + } + + @Override + public String[] getParameterValues(String name) { + return new String[0]; + } + + @Override + public Map getParameterMap() { + return Collections.emptyMap(); + } + + @Override + public String getProtocol() { + return null; + } + + @Override + public String getScheme() { + return null; + } + + @Override + public String getServerName() { + return null; + } + + @Override + public int getServerPort() { + return 0; + } + + @Override + public BufferedReader getReader() throws IOException { + return null; + } + + @Override + public String getRemoteAddr() { + return null; + } + + @Override + public String getRemoteHost() { + return null; + } + + @Override + public void setAttribute(String name, Object o) { + attributes.put(name, o); + } + + @Override + public void removeAttribute(String name) { + attributes.remove(name); + } + + @Override + public Locale getLocale() { + return null; + } + + @Override + public Enumeration getLocales() { + return Collections.emptyEnumeration(); + } + + @Override + public boolean isSecure() { + return false; + } + + @Override + public RequestDispatcher getRequestDispatcher(String path) { + return null; + } + + @Override + public String getRealPath(String path) { + return null; + } + + @Override + public int getRemotePort() { + return 0; + } + + @Override + public String getLocalName() { + return null; + } + + @Override + public String getLocalAddr() { + return null; + } + + @Override + public int getLocalPort() { + return 0; + } + + @Override + public long getContentLengthLong() { + return 0; + } + + @Override + public ServletContext getServletContext() { + return null; + } + + @Override + public AsyncContext startAsync() throws IllegalStateException { + return null; + } + + @Override + public AsyncContext startAsync(ServletRequest servletRequest, ServletResponse servletResponse) + throws IllegalStateException { + return null; + } + + @Override + public boolean isAsyncStarted() { + return false; + } + + @Override + public boolean isAsyncSupported() { + return false; + } + + @Override + public AsyncContext getAsyncContext() { + return null; + } + + @Override + public DispatcherType getDispatcherType() { + return null; + } + + @Override + public String changeSessionId() { + return null; + } + + @Override + public boolean authenticate(HttpServletResponse response) throws IOException, ServletException { + return false; + } + + @Override + public void login(String username, String password) throws ServletException {} + + @Override + public void logout() throws ServletException {} + + @Override + public Collection getParts() throws IOException, ServletException { + return null; + } + + @Override + public Part getPart(String name) throws IOException, ServletException { + return null; + } + + @Override + @SuppressWarnings("null") + public T upgrade(Class handlerClass) throws IOException, ServletException { + return null; + } +} diff --git a/it/integration-tests/src/test/java/org/apache/sling/models/testing/helper/FakeResponse.java b/it/integration-tests/src/test/java/org/apache/sling/models/testing/helper/FakeResponse.java new file mode 100644 index 00000000..fa474aab --- /dev/null +++ b/it/integration-tests/src/test/java/org/apache/sling/models/testing/helper/FakeResponse.java @@ -0,0 +1,191 @@ +/* + * 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.testing.helper; + +import javax.servlet.ServletOutputStream; +import javax.servlet.http.Cookie; +import javax.servlet.http.HttpServletResponse; + +import java.io.IOException; +import java.io.PrintWriter; +import java.io.StringWriter; +import java.util.Collection; +import java.util.Locale; + +public class FakeResponse implements HttpServletResponse { + + private StringWriter stringWriter = new StringWriter(); + private String contentType = null; + private String characterEncoding = null; + private int status = -1; + + @Override + public void addCookie(Cookie cookie) {} + + @Override + public boolean containsHeader(String name) { + return false; + } + + @Override + public String encodeURL(String url) { + return null; + } + + @Override + public String encodeRedirectURL(String url) { + return null; + } + + @Override + public String encodeUrl(String url) { + return null; + } + + @Override + public String encodeRedirectUrl(String url) { + return null; + } + + @Override + public void sendError(int sc, String msg) throws IOException {} + + @Override + public void sendError(int sc) throws IOException {} + + @Override + public void sendRedirect(String location) throws IOException {} + + @Override + public void setDateHeader(String name, long date) {} + + @Override + public void addDateHeader(String name, long date) {} + + @Override + public void setHeader(String name, String value) {} + + @Override + public void addHeader(String name, String value) {} + + @Override + public void setIntHeader(String name, int value) {} + + @Override + public void addIntHeader(String name, int value) {} + + @Override + public void setStatus(int sc) { + this.status = sc; + } + + @Override + public void setStatus(int sc, String sm) { + setStatus(sc); + } + + @Override + public String getCharacterEncoding() { + return characterEncoding; + } + + @Override + public String getContentType() { + return contentType; + } + + @Override + public ServletOutputStream getOutputStream() throws IOException { + return null; + } + + @Override + public PrintWriter getWriter() throws IOException { + return new PrintWriter(stringWriter); + } + + @Override + public void setCharacterEncoding(String charset) { + this.characterEncoding = charset; + } + + @Override + public void setContentLength(int len) {} + + @Override + public void setContentType(String type) { + this.contentType = type; + } + + @Override + public void setBufferSize(int size) {} + + @Override + public int getBufferSize() { + return 0; + } + + @Override + public void flushBuffer() throws IOException {} + + @Override + public void resetBuffer() {} + + @Override + public boolean isCommitted() { + return false; + } + + @Override + public void reset() {} + + @Override + public void setLocale(Locale loc) {} + + @Override + public Locale getLocale() { + return null; + } + + public StringWriter getStringWriter() { + return stringWriter; + } + + public int getStatus() { + return status; + } + + @Override + public void setContentLengthLong(long len) {} + + @Override + public String getHeader(String name) { + return null; + } + + @Override + public Collection getHeaders(String name) { + return null; + } + + @Override + public Collection getHeaderNames() { + return null; + } +} diff --git a/it/integration-tests/src/test/java/org/apache/sling/models/testing/rtbound/FakeRequest.java b/it/integration-tests/src/test/java/org/apache/sling/models/testing/rtbound/FakeRequest.java new file mode 100644 index 00000000..56a8a78b --- /dev/null +++ b/it/integration-tests/src/test/java/org/apache/sling/models/testing/rtbound/FakeRequest.java @@ -0,0 +1,498 @@ +/* + * 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.testing.rtbound; + +import javax.servlet.AsyncContext; +import javax.servlet.DispatcherType; +import javax.servlet.RequestDispatcher; +import javax.servlet.ServletContext; +import javax.servlet.ServletException; +import javax.servlet.ServletInputStream; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import javax.servlet.http.Cookie; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpSession; +import javax.servlet.http.HttpUpgradeHandler; +import javax.servlet.http.Part; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.security.Principal; +import java.util.Collection; +import java.util.Enumeration; +import java.util.HashMap; +import java.util.List; +import java.util.Locale; +import java.util.Map; +import java.util.ResourceBundle; + +import org.apache.sling.api.SlingHttpServletRequest; +import org.apache.sling.api.request.RequestDispatcherOptions; +import org.apache.sling.api.request.RequestParameter; +import org.apache.sling.api.request.RequestParameterMap; +import org.apache.sling.api.request.RequestPathInfo; +import org.apache.sling.api.request.RequestProgressTracker; +import org.apache.sling.api.resource.Resource; +import org.apache.sling.api.resource.ResourceResolver; +import org.jetbrains.annotations.NotNull; + +public class FakeRequest implements SlingHttpServletRequest { + + private final Resource resource; + private final Map attributes = new HashMap<>(); + + public FakeRequest(Resource r) { + this.resource = r; + } + + @Override + public @NotNull Resource getResource() { + return resource; + } + + @Override + @SuppressWarnings("null") + public @NotNull ResourceResolver getResourceResolver() { + return null; + } + + @Override + @SuppressWarnings("null") + public @NotNull RequestPathInfo getRequestPathInfo() { + return null; + } + + @Override + public RequestParameter getRequestParameter(@NotNull String s) { + return null; + } + + @Override + public RequestParameter[] getRequestParameters(@NotNull String s) { + return new RequestParameter[0]; + } + + @Override + @SuppressWarnings("null") + public @NotNull RequestParameterMap getRequestParameterMap() { + return null; + } + + @Override + public RequestDispatcher getRequestDispatcher( + @NotNull String s, RequestDispatcherOptions requestDispatcherOptions) { + return null; + } + + @Override + public RequestDispatcher getRequestDispatcher( + @NotNull Resource resource, RequestDispatcherOptions requestDispatcherOptions) { + return null; + } + + @Override + public RequestDispatcher getRequestDispatcher(@NotNull Resource resource) { + return null; + } + + @Override + public Cookie getCookie(String s) { + return null; + } + + @Override + public String getResponseContentType() { + return null; + } + + @Override + @SuppressWarnings("null") + public @NotNull Enumeration getResponseContentTypes() { + return null; + } + + @Override + public ResourceBundle getResourceBundle(Locale locale) { + return null; + } + + @Override + public ResourceBundle getResourceBundle(String s, Locale locale) { + return null; + } + + @Override + @SuppressWarnings("null") + public RequestProgressTracker getRequestProgressTracker() { + return null; + } + + @Override + public String getAuthType() { + return null; + } + + @Override + public Cookie[] getCookies() { + return new Cookie[0]; + } + + @Override + public long getDateHeader(String s) { + return 0; + } + + @Override + public String getHeader(String s) { + return null; + } + + @Override + public Enumeration getHeaders(String s) { + return null; + } + + @Override + public Enumeration getHeaderNames() { + return null; + } + + @Override + public int getIntHeader(String s) { + return 0; + } + + @Override + public String getMethod() { + return null; + } + + @Override + public String getPathInfo() { + return null; + } + + @Override + public String getPathTranslated() { + return null; + } + + @Override + public String getContextPath() { + return null; + } + + @Override + public String getQueryString() { + return null; + } + + @Override + public String getRemoteUser() { + return null; + } + + @Override + public boolean isUserInRole(String s) { + return false; + } + + @Override + public Principal getUserPrincipal() { + return null; + } + + @Override + public String getRequestedSessionId() { + return null; + } + + @Override + public String getRequestURI() { + return null; + } + + @Override + public StringBuffer getRequestURL() { + return null; + } + + @Override + public String getServletPath() { + return null; + } + + @Override + public HttpSession getSession(boolean b) { + return null; + } + + @Override + public HttpSession getSession() { + return null; + } + + @Override + public boolean isRequestedSessionIdValid() { + return false; + } + + @Override + public boolean isRequestedSessionIdFromCookie() { + return false; + } + + @Override + public boolean isRequestedSessionIdFromURL() { + return false; + } + + @Override + public boolean isRequestedSessionIdFromUrl() { + return false; + } + + @Override + public Object getAttribute(String s) { + return attributes.get(s); + } + + @Override + public Enumeration getAttributeNames() { + return null; + } + + @Override + public String getCharacterEncoding() { + return null; + } + + @Override + public void setCharacterEncoding(String s) throws UnsupportedEncodingException {} + + @Override + public int getContentLength() { + return 0; + } + + @Override + public String getContentType() { + return null; + } + + @Override + public ServletInputStream getInputStream() throws IOException { + return null; + } + + @Override + public String getParameter(String s) { + return null; + } + + @Override + public Enumeration getParameterNames() { + return null; + } + + @Override + public String[] getParameterValues(String s) { + return new String[0]; + } + + @Override + public Map getParameterMap() { + return null; + } + + @Override + public String getProtocol() { + return null; + } + + @Override + public String getScheme() { + return null; + } + + @Override + public String getServerName() { + return null; + } + + @Override + public int getServerPort() { + return 0; + } + + @Override + public BufferedReader getReader() throws IOException { + return null; + } + + @Override + public String getRemoteAddr() { + return null; + } + + @Override + public String getRemoteHost() { + return null; + } + + @Override + public void setAttribute(String s, Object o) { + attributes.put(s, o); + } + + @Override + public void removeAttribute(String s) {} + + @Override + public Locale getLocale() { + return null; + } + + @Override + public Enumeration getLocales() { + return null; + } + + @Override + public boolean isSecure() { + return false; + } + + @Override + public RequestDispatcher getRequestDispatcher(String s) { + return null; + } + + @Override + public String getRealPath(String s) { + return null; + } + + @Override + public int getRemotePort() { + return 0; + } + + @Override + public String getLocalName() { + return null; + } + + @Override + public String getLocalAddr() { + return null; + } + + @Override + public int getLocalPort() { + return 0; + } + + @Override + @SuppressWarnings("null") + public AdapterType adaptTo(@NotNull Class aClass) { + return null; + } + + @Override + public String changeSessionId() { + return null; + } + + @Override + public boolean authenticate(HttpServletResponse response) throws IOException, ServletException { + return false; + } + + @Override + public void login(String username, String password) throws ServletException {} + + @Override + public void logout() throws ServletException {} + + @Override + public Collection getParts() throws IOException, ServletException { + return null; + } + + @Override + public Part getPart(String name) throws IOException, ServletException { + return null; + } + + @Override + @SuppressWarnings("null") + public T upgrade(Class handlerClass) throws IOException, ServletException { + return null; + } + + @Override + public long getContentLengthLong() { + return 0; + } + + @Override + public ServletContext getServletContext() { + return null; + } + + @Override + public AsyncContext startAsync() throws IllegalStateException { + return null; + } + + @Override + public AsyncContext startAsync(ServletRequest servletRequest, ServletResponse servletResponse) + throws IllegalStateException { + return null; + } + + @Override + public boolean isAsyncStarted() { + return false; + } + + @Override + public boolean isAsyncSupported() { + return false; + } + + @Override + public AsyncContext getAsyncContext() { + return null; + } + + @Override + public DispatcherType getDispatcherType() { + return null; + } + + @Override + @SuppressWarnings("null") + public List getRequestParameterList() { + return null; + } +} diff --git a/it/integration-tests/src/test/java/org/apache/sling/models/testing/rtbound/ResourceTypeBindingIT.java b/it/integration-tests/src/test/java/org/apache/sling/models/testing/rtbound/ResourceTypeBindingIT.java new file mode 100644 index 00000000..74ec3303 --- /dev/null +++ b/it/integration-tests/src/test/java/org/apache/sling/models/testing/rtbound/ResourceTypeBindingIT.java @@ -0,0 +1,146 @@ +/* + * 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.testing.rtbound; + +import java.util.HashMap; +import java.util.Map; + +import org.apache.sling.api.SlingConstants; +import org.apache.sling.api.resource.LoginException; +import org.apache.sling.api.resource.PersistenceException; +import org.apache.sling.api.resource.Resource; +import org.apache.sling.api.resource.ResourceResolver; +import org.apache.sling.api.resource.ResourceResolverFactory; +import org.apache.sling.api.resource.ResourceUtil; +import org.apache.sling.junit.rules.TeleporterRule; +import org.apache.sling.models.factory.ModelFactory; +import org.apache.sling.models.it.rtbound.BaseComponent; +import org.apache.sling.models.it.rtbound.ExtendedComponent; +import org.apache.sling.models.it.rtbound.FromRequestComponent; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; + +public class ResourceTypeBindingIT { + + @Rule + public final TeleporterRule teleporter = TeleporterRule.forClass(getClass(), "SM_Teleporter"); + + private ResourceResolverFactory rrFactory; + + private ModelFactory modelFactory; + + private final String baseComponentPath = "/content/rt/baseComponent"; + private final String childComponentPath = "/content/rt/childComponent"; + private final String child2ComponentPath = "/content/rt/child2Component"; + private final String extendedComponentPath = "/content/rt/extendedComponent"; + private final String fromRequestComponentPath = "/content/rt/fromRequest"; + + @Before + @SuppressWarnings("null") + public void setup() throws LoginException, PersistenceException { + rrFactory = teleporter.getService(ResourceResolverFactory.class); + modelFactory = teleporter.getService(ModelFactory.class); + + try (ResourceResolver adminResolver = rrFactory.getServiceResourceResolver(null); ) { + Map properties = new HashMap(); + properties.put("sampleValue", "baseTESTValue"); + properties.put( + SlingConstants.NAMESPACE_PREFIX + ":" + SlingConstants.PROPERTY_RESOURCE_TYPE, "sling/rt/base"); + ResourceUtil.getOrCreateResource(adminResolver, baseComponentPath, properties, null, false); + properties.clear(); + + properties.put("sampleValue", "childTESTValue"); + properties.put( + SlingConstants.NAMESPACE_PREFIX + ":" + SlingConstants.PROPERTY_RESOURCE_TYPE, "sling/rt/child"); + properties.put( + SlingConstants.NAMESPACE_PREFIX + ":" + SlingConstants.PROPERTY_RESOURCE_SUPER_TYPE, + "sling/rt/base"); + ResourceUtil.getOrCreateResource(adminResolver, childComponentPath, properties, null, false); + properties.clear(); + + properties.put("sampleValue", "childTESTValue2"); + properties.put( + SlingConstants.NAMESPACE_PREFIX + ":" + SlingConstants.PROPERTY_RESOURCE_TYPE, "sling/rt/child"); + ResourceUtil.getOrCreateResource(adminResolver, child2ComponentPath, properties, null, false); + properties.clear(); + + properties.put( + SlingConstants.NAMESPACE_PREFIX + ":" + SlingConstants.PROPERTY_RESOURCE_SUPER_TYPE, + "sling/rt/base"); + ResourceUtil.getOrCreateResource(adminResolver, "/apps/sling/rt/child", properties, null, false); + properties.clear(); + + properties.put("sampleValue", "extendedTESTValue"); + properties.put( + SlingConstants.NAMESPACE_PREFIX + ":" + SlingConstants.PROPERTY_RESOURCE_TYPE, "sling/rt/extended"); + ResourceUtil.getOrCreateResource(adminResolver, extendedComponentPath, properties, null, false); + + properties.clear(); + properties.put( + SlingConstants.NAMESPACE_PREFIX + ":" + SlingConstants.PROPERTY_RESOURCE_TYPE, + "sling/rt/fromRequest"); + ResourceUtil.getOrCreateResource(adminResolver, fromRequestComponentPath, properties, null, false); + + adminResolver.commit(); + } + } + + @Test + public void testClientModelCreateFromResource() throws LoginException { + try (ResourceResolver resolver = rrFactory.getServiceResourceResolver(null); ) { + final Resource baseComponentResource = resolver.getResource(baseComponentPath); + Assert.assertNotNull(baseComponentResource); + final Object baseModel = modelFactory.getModelFromResource(baseComponentResource); + Assert.assertNotNull("Model should not be null", baseModel); + Assert.assertTrue("Model should be a BaseComponent", baseModel instanceof BaseComponent); + + final Resource childComponentResource = resolver.getResource(childComponentPath); + Assert.assertNotNull(childComponentResource); + final Object childModel = modelFactory.getModelFromResource(childComponentResource); + Assert.assertNotNull("Model should not be null", childModel); + Assert.assertTrue("Model should be a BaseComponent", childModel instanceof BaseComponent); + + final Resource child2ComponentResource = resolver.getResource(child2ComponentPath); + Assert.assertNotNull(child2ComponentResource); + final Object child2Model = modelFactory.getModelFromResource(child2ComponentResource); + Assert.assertNotNull("Model should not be null", child2Model); + Assert.assertTrue("Model should be a BaseComponent", child2Model instanceof BaseComponent); + + final Resource extendedComponentResource = resolver.getResource(extendedComponentPath); + Assert.assertNotNull(extendedComponentResource); + final Object extendedModel = modelFactory.getModelFromResource(extendedComponentResource); + Assert.assertNotNull("Model should not be null", extendedModel); + Assert.assertTrue("Model should be a BaseComponent", extendedModel instanceof BaseComponent); + Assert.assertTrue("Model should be an ExtendedComponent", extendedModel instanceof ExtendedComponent); + } + } + + @Test + public void testClientModelCreateFromRequest() throws LoginException { + try (ResourceResolver resolver = rrFactory.getServiceResourceResolver(null); ) { + final Resource baseComponentResource = resolver.getResource(fromRequestComponentPath); + Assert.assertNotNull(baseComponentResource); + final Object baseModel = modelFactory.getModelFromRequest(new FakeRequest(baseComponentResource)); + Assert.assertNotNull("Model should not be null", baseModel); + Assert.assertTrue("Model should be a FromRequestComponent", baseModel instanceof FromRequestComponent); + } + } +} diff --git a/it/integration-tests/src/test/java/org/apache/sling/models/testing/rtboundpicker/ResourceTypePickerIT.java b/it/integration-tests/src/test/java/org/apache/sling/models/testing/rtboundpicker/ResourceTypePickerIT.java new file mode 100644 index 00000000..3faa6e98 --- /dev/null +++ b/it/integration-tests/src/test/java/org/apache/sling/models/testing/rtboundpicker/ResourceTypePickerIT.java @@ -0,0 +1,91 @@ +/* + * 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.testing.rtboundpicker; + +import java.util.HashMap; +import java.util.Map; + +import org.apache.sling.api.SlingConstants; +import org.apache.sling.api.resource.LoginException; +import org.apache.sling.api.resource.PersistenceException; +import org.apache.sling.api.resource.Resource; +import org.apache.sling.api.resource.ResourceResolver; +import org.apache.sling.api.resource.ResourceResolverFactory; +import org.apache.sling.api.resource.ResourceUtil; +import org.apache.sling.junit.rules.TeleporterRule; +import org.apache.sling.models.it.rtboundpicker.BaseComponent; +import org.apache.sling.models.it.rtboundpicker.SubRTComponent; +import org.apache.sling.models.it.rtboundpicker.TestComponent; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; + +public class ResourceTypePickerIT { + + @Rule + public final TeleporterRule teleporter = TeleporterRule.forClass(getClass(), "SM_Teleporter"); + + private ResourceResolverFactory rrFactory; + + private final String baseComponentPath = "/content/rtpicker/baseComponent"; + private final String childComponentPath = "/content/rtpicker/childComponent"; + + @Before + @SuppressWarnings("null") + public void setup() throws LoginException, PersistenceException { + rrFactory = teleporter.getService(ResourceResolverFactory.class); + try (ResourceResolver adminResolver = rrFactory.getServiceResourceResolver(null); ) { + Map properties = new HashMap(); + properties.put( + SlingConstants.NAMESPACE_PREFIX + ":" + SlingConstants.PROPERTY_RESOURCE_TYPE, + "sling/rtpicker/base"); + ResourceUtil.getOrCreateResource(adminResolver, baseComponentPath, properties, null, false); + properties.clear(); + + properties.put( + SlingConstants.NAMESPACE_PREFIX + ":" + SlingConstants.PROPERTY_RESOURCE_TYPE, + "sling/rtpicker/sub"); + properties.put( + SlingConstants.NAMESPACE_PREFIX + ":" + SlingConstants.PROPERTY_RESOURCE_SUPER_TYPE, + "sling/rtpicker/base"); + ResourceUtil.getOrCreateResource(adminResolver, childComponentPath, properties, null, false); + properties.clear(); + + adminResolver.commit(); + } + } + + @Test + public void testClientModelCreateFromResource() throws LoginException { + try (ResourceResolver resolver = rrFactory.getServiceResourceResolver(null); ) { + final Resource baseComponentResource = resolver.getResource(baseComponentPath); + Assert.assertNotNull(baseComponentResource); + TestComponent baseModel = baseComponentResource.adaptTo(TestComponent.class); + Assert.assertNotNull("Model should not be null", baseModel); + Assert.assertTrue("Model should be a BaseComponent", baseModel instanceof BaseComponent); + + final Resource childComponentResource = resolver.getResource(childComponentPath); + Assert.assertNotNull(childComponentResource); + baseModel = childComponentResource.adaptTo(TestComponent.class); + Assert.assertNotNull("Model should not be null", baseModel); + Assert.assertTrue("Model should be a SubRTComponent", baseModel instanceof SubRTComponent); + } + } +} diff --git a/it/test-models/bnd.bnd b/it/test-models/bnd.bnd new file mode 100644 index 00000000..1aef1d37 --- /dev/null +++ b/it/test-models/bnd.bnd @@ -0,0 +1,7 @@ +Sling-Test-Regexp: .*Test + +Import-Package:\ + org.apache.commons.beanutils;resolution:=optional,\ + * + +-plugin: org.apache.sling.bnd.models.ModelsScannerPlugin diff --git a/it/test-models/pom.xml b/it/test-models/pom.xml new file mode 100644 index 00000000..4d8b2f7e --- /dev/null +++ b/it/test-models/pom.xml @@ -0,0 +1,151 @@ + + + + 4.0.0 + + + org.apache.sling + org.apache.sling.models.impl.parent + 2.0.1-SNAPSHOT + ../../parent/pom.xml + + + org.apache.sling.models.impl.it.test-models + + Apache Sling Models Implementation - IT - Test Models + + + + org.osgi + org.osgi.service.component + provided + + + org.osgi + org.osgi.annotation.versioning + provided + + + org.osgi + org.osgi.service.component.annotations + provided + + + org.osgi + org.osgi.service.metatype.annotations + provided + + + org.apache.sling + org.apache.sling.servlets.annotations + provided + + + + + javax.servlet + javax.servlet-api + provided + + + jakarta.servlet + jakarta.servlet-api + provided + + + javax.jcr + jcr + provided + + + org.apache.sling + org.apache.sling.models.api + provided + + + org.apache.sling + org.apache.sling.api + 3.0.0 + provided + + + org.apache.commons + commons-lang3 + 3.18.0 + provided + + + org.apache.geronimo.specs + geronimo-atinject_1.0_spec + 1.0 + provided + + + org.jetbrains + annotations + provided + + + + + commons-beanutils + commons-beanutils + 1.9.4 + provided + + + + + + + + biz.aQute.bnd + bnd-maven-plugin + + + org.apache.sling + org.apache.sling.bnd.models + 1.0.0 + + + + + + biz.aQute.bnd + bnd-baseline-maven-plugin + + true + + + + + org.apache.rat + apache-rat-plugin + + + src/main/resources/org/apache/sling/models/it/noclasses/foo.txt + + + + + + + + diff --git a/it/test-models/src/main/java/org/apache/sling/models/it/delegate/request/DelegateBaseModel.java b/it/test-models/src/main/java/org/apache/sling/models/it/delegate/request/DelegateBaseModel.java new file mode 100644 index 00000000..1e4369e1 --- /dev/null +++ b/it/test-models/src/main/java/org/apache/sling/models/it/delegate/request/DelegateBaseModel.java @@ -0,0 +1,50 @@ +/* + * 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.it.delegate.request; + +import javax.inject.Inject; + +import org.apache.sling.api.SlingHttpServletRequest; +import org.apache.sling.models.annotations.Model; +import org.apache.sling.models.annotations.Via; + +@Model( + adaptables = SlingHttpServletRequest.class, + adapters = DelegateInterface.class, + resourceType = "sling/delegate/base") +public class DelegateBaseModel implements DelegateInterface { + + @Inject + @Via("resource") + private String text; + + @Inject + @Via("resource") + private String other; + + @Override + public String getText() { + return text; + } + + @Override + public String getOther() { + return other; + } +} diff --git a/it/test-models/src/main/java/org/apache/sling/models/it/delegate/request/DelegateExtendedModel.java b/it/test-models/src/main/java/org/apache/sling/models/it/delegate/request/DelegateExtendedModel.java new file mode 100644 index 00000000..c2a01a7a --- /dev/null +++ b/it/test-models/src/main/java/org/apache/sling/models/it/delegate/request/DelegateExtendedModel.java @@ -0,0 +1,46 @@ +/* + * 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.it.delegate.request; + +import org.apache.sling.api.SlingHttpServletRequest; +import org.apache.sling.models.annotations.Model; +import org.apache.sling.models.annotations.Via; +import org.apache.sling.models.annotations.injectorspecific.Self; +import org.apache.sling.models.annotations.via.ResourceSuperType; + +@Model( + adaptables = SlingHttpServletRequest.class, + adapters = DelegateInterface.class, + resourceType = "sling/delegate/extended") +public class DelegateExtendedModel implements DelegateInterface { + + @Self + @Via(type = ResourceSuperType.class) + private DelegateInterface delegate; + + @Override + public String getOther() { + return delegate.getOther(); + } + + @Override + public String getText() { + return delegate.getText().toUpperCase(); + } +} diff --git a/it/test-models/src/main/java/org/apache/sling/models/it/delegate/request/DelegateInterface.java b/it/test-models/src/main/java/org/apache/sling/models/it/delegate/request/DelegateInterface.java new file mode 100644 index 00000000..9826052d --- /dev/null +++ b/it/test-models/src/main/java/org/apache/sling/models/it/delegate/request/DelegateInterface.java @@ -0,0 +1,26 @@ +/* + * 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.it.delegate.request; + +public interface DelegateInterface { + + String getText(); + + String getOther(); +} diff --git a/it/test-models/src/main/java/org/apache/sling/models/it/delegate/request/package-info.java b/it/test-models/src/main/java/org/apache/sling/models/it/delegate/request/package-info.java new file mode 100644 index 00000000..3e7e7013 --- /dev/null +++ b/it/test-models/src/main/java/org/apache/sling/models/it/delegate/request/package-info.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. + */ + +@Version("1.0") +package org.apache.sling.models.it.delegate.request; + +import org.osgi.annotation.versioning.Version; diff --git a/it/test-models/src/main/java/org/apache/sling/models/it/delegate/resource/DelegateBaseModel.java b/it/test-models/src/main/java/org/apache/sling/models/it/delegate/resource/DelegateBaseModel.java new file mode 100644 index 00000000..0b2031be --- /dev/null +++ b/it/test-models/src/main/java/org/apache/sling/models/it/delegate/resource/DelegateBaseModel.java @@ -0,0 +1,44 @@ +/* + * 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.it.delegate.resource; + +import javax.inject.Inject; + +import org.apache.sling.api.resource.Resource; +import org.apache.sling.models.annotations.Model; + +@Model(adaptables = Resource.class, adapters = DelegateInterface.class, resourceType = "sling/delegate/base") +public class DelegateBaseModel implements DelegateInterface { + + @Inject + private String text; + + @Inject + private String other; + + @Override + public String getText() { + return text; + } + + @Override + public String getOther() { + return other; + } +} diff --git a/it/test-models/src/main/java/org/apache/sling/models/it/delegate/resource/DelegateExtendedModel.java b/it/test-models/src/main/java/org/apache/sling/models/it/delegate/resource/DelegateExtendedModel.java new file mode 100644 index 00000000..df901f5c --- /dev/null +++ b/it/test-models/src/main/java/org/apache/sling/models/it/delegate/resource/DelegateExtendedModel.java @@ -0,0 +1,43 @@ +/* + * 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.it.delegate.resource; + +import org.apache.sling.api.resource.Resource; +import org.apache.sling.models.annotations.Model; +import org.apache.sling.models.annotations.Via; +import org.apache.sling.models.annotations.injectorspecific.Self; +import org.apache.sling.models.annotations.via.ResourceSuperType; + +@Model(adaptables = Resource.class, adapters = DelegateInterface.class, resourceType = "sling/delegate/extended") +public class DelegateExtendedModel implements DelegateInterface { + + @Self + @Via(type = ResourceSuperType.class) + private DelegateInterface delegate; + + @Override + public String getOther() { + return delegate.getOther(); + } + + @Override + public String getText() { + return delegate.getText().toUpperCase(); + } +} diff --git a/it/test-models/src/main/java/org/apache/sling/models/it/delegate/resource/DelegateInterface.java b/it/test-models/src/main/java/org/apache/sling/models/it/delegate/resource/DelegateInterface.java new file mode 100644 index 00000000..2b208e2e --- /dev/null +++ b/it/test-models/src/main/java/org/apache/sling/models/it/delegate/resource/DelegateInterface.java @@ -0,0 +1,26 @@ +/* + * 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.it.delegate.resource; + +public interface DelegateInterface { + + String getText(); + + String getOther(); +} diff --git a/it/test-models/src/main/java/org/apache/sling/models/it/delegate/resource/package-info.java b/it/test-models/src/main/java/org/apache/sling/models/it/delegate/resource/package-info.java new file mode 100644 index 00000000..a0f5c5bd --- /dev/null +++ b/it/test-models/src/main/java/org/apache/sling/models/it/delegate/resource/package-info.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. + */ + +@Version("1.0") +package org.apache.sling.models.it.delegate.resource; + +import org.osgi.annotation.versioning.Version; diff --git a/it/test-models/src/main/java/org/apache/sling/models/it/delegate/viaoriginalresource/A.java b/it/test-models/src/main/java/org/apache/sling/models/it/delegate/viaoriginalresource/A.java new file mode 100644 index 00000000..7581feaa --- /dev/null +++ b/it/test-models/src/main/java/org/apache/sling/models/it/delegate/viaoriginalresource/A.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.it.delegate.viaoriginalresource; + +public interface A {} diff --git a/it/test-models/src/main/java/org/apache/sling/models/it/delegate/viaoriginalresource/A1.java b/it/test-models/src/main/java/org/apache/sling/models/it/delegate/viaoriginalresource/A1.java new file mode 100644 index 00000000..6d3048b6 --- /dev/null +++ b/it/test-models/src/main/java/org/apache/sling/models/it/delegate/viaoriginalresource/A1.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.it.delegate.viaoriginalresource; + +public interface A1 extends A {} diff --git a/it/test-models/src/main/java/org/apache/sling/models/it/delegate/viaoriginalresource/B.java b/it/test-models/src/main/java/org/apache/sling/models/it/delegate/viaoriginalresource/B.java new file mode 100644 index 00000000..8fbbdab4 --- /dev/null +++ b/it/test-models/src/main/java/org/apache/sling/models/it/delegate/viaoriginalresource/B.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.it.delegate.viaoriginalresource; + +public interface B {} diff --git a/it/test-models/src/main/java/org/apache/sling/models/it/delegate/viaoriginalresource/B1.java b/it/test-models/src/main/java/org/apache/sling/models/it/delegate/viaoriginalresource/B1.java new file mode 100644 index 00000000..50fb27c8 --- /dev/null +++ b/it/test-models/src/main/java/org/apache/sling/models/it/delegate/viaoriginalresource/B1.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.it.delegate.viaoriginalresource; + +public interface B1 extends B {} diff --git a/it/test-models/src/main/java/org/apache/sling/models/it/delegate/viaoriginalresource/models/A1Impl.java b/it/test-models/src/main/java/org/apache/sling/models/it/delegate/viaoriginalresource/models/A1Impl.java new file mode 100644 index 00000000..62e4b63b --- /dev/null +++ b/it/test-models/src/main/java/org/apache/sling/models/it/delegate/viaoriginalresource/models/A1Impl.java @@ -0,0 +1,43 @@ +/* + * 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.it.delegate.viaoriginalresource.models; + +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.annotations.Via; +import org.apache.sling.models.annotations.injectorspecific.Self; +import org.apache.sling.models.annotations.via.ResourceSuperType; +import org.apache.sling.models.it.delegate.viaoriginalresource.A; +import org.apache.sling.models.it.delegate.viaoriginalresource.A1; +import org.apache.sling.models.it.delegate.viaoriginalresource.B1; + +@Model( + adaptables = {SlingHttpServletRequest.class, Resource.class}, + adapters = {A1.class, A.class}, + resourceType = "delegate/nestedrtbound/specific") +public class A1Impl implements A1 { + + @Self + @Via(type = ResourceSuperType.class) + public A delegate; + + @Self + public B1 other; +} diff --git a/it/test-models/src/main/java/org/apache/sling/models/it/delegate/viaoriginalresource/models/AImpl.java b/it/test-models/src/main/java/org/apache/sling/models/it/delegate/viaoriginalresource/models/AImpl.java new file mode 100644 index 00000000..9622bdbb --- /dev/null +++ b/it/test-models/src/main/java/org/apache/sling/models/it/delegate/viaoriginalresource/models/AImpl.java @@ -0,0 +1,39 @@ +/* + * 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.it.delegate.viaoriginalresource.models; + +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.annotations.Via; +import org.apache.sling.models.annotations.injectorspecific.Self; +import org.apache.sling.models.annotations.via.OriginalResourceType; +import org.apache.sling.models.it.delegate.viaoriginalresource.A; +import org.apache.sling.models.it.delegate.viaoriginalresource.B; + +@Model( + adaptables = {SlingHttpServletRequest.class, Resource.class}, + adapters = {A.class}, + resourceType = "delegate/nestedrtbound/generic") +public class AImpl implements A { + + @Self + @Via(type = OriginalResourceType.class) + public B other; +} diff --git a/it/test-models/src/main/java/org/apache/sling/models/it/delegate/viaoriginalresource/models/B1Impl.java b/it/test-models/src/main/java/org/apache/sling/models/it/delegate/viaoriginalresource/models/B1Impl.java new file mode 100644 index 00000000..85e744f9 --- /dev/null +++ b/it/test-models/src/main/java/org/apache/sling/models/it/delegate/viaoriginalresource/models/B1Impl.java @@ -0,0 +1,40 @@ +/* + * 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.it.delegate.viaoriginalresource.models; + +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.annotations.Via; +import org.apache.sling.models.annotations.injectorspecific.Self; +import org.apache.sling.models.annotations.via.ResourceSuperType; +import org.apache.sling.models.it.delegate.viaoriginalresource.B; +import org.apache.sling.models.it.delegate.viaoriginalresource.B1; + +@Model( + adaptables = {SlingHttpServletRequest.class, Resource.class}, + adapters = {B1.class, B.class}, + resourceType = "delegate/nestedrtbound/specific", + cache = true) +public class B1Impl implements B1 { + + @Self + @Via(type = ResourceSuperType.class) + public B delegate; +} diff --git a/it/test-models/src/main/java/org/apache/sling/models/it/delegate/viaoriginalresource/models/BImpl.java b/it/test-models/src/main/java/org/apache/sling/models/it/delegate/viaoriginalresource/models/BImpl.java new file mode 100644 index 00000000..e3b8569e --- /dev/null +++ b/it/test-models/src/main/java/org/apache/sling/models/it/delegate/viaoriginalresource/models/BImpl.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.it.delegate.viaoriginalresource.models; + +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.it.delegate.viaoriginalresource.B; + +@Model( + adaptables = {SlingHttpServletRequest.class, Resource.class}, + adapters = {B.class}, + resourceType = "delegate/nestedrtbound/generic", + cache = true) +public class BImpl implements B {} diff --git a/it/test-models/src/main/java/org/apache/sling/models/it/delegate/viaoriginalresource/models/package-info.java b/it/test-models/src/main/java/org/apache/sling/models/it/delegate/viaoriginalresource/models/package-info.java new file mode 100644 index 00000000..88f82b02 --- /dev/null +++ b/it/test-models/src/main/java/org/apache/sling/models/it/delegate/viaoriginalresource/models/package-info.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. + */ + +@Version("1.0") +package org.apache.sling.models.it.delegate.viaoriginalresource.models; + +import org.osgi.annotation.versioning.Version; diff --git a/it/test-models/src/main/java/org/apache/sling/models/it/delegate/viaoriginalresource/package-info.java b/it/test-models/src/main/java/org/apache/sling/models/it/delegate/viaoriginalresource/package-info.java new file mode 100644 index 00000000..fa049a57 --- /dev/null +++ b/it/test-models/src/main/java/org/apache/sling/models/it/delegate/viaoriginalresource/package-info.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. + */ + +@Version("1.0") +package org.apache.sling.models.it.delegate.viaoriginalresource; + +import org.osgi.annotation.versioning.Version; diff --git a/it/test-models/src/main/java/org/apache/sling/models/it/implpicker/CustomLastImplementationPicker.java b/it/test-models/src/main/java/org/apache/sling/models/it/implpicker/CustomLastImplementationPicker.java new file mode 100644 index 00000000..59798477 --- /dev/null +++ b/it/test-models/src/main/java/org/apache/sling/models/it/implpicker/CustomLastImplementationPicker.java @@ -0,0 +1,44 @@ +/* + * 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.it.implpicker; + +import org.apache.commons.lang3.StringUtils; +import org.apache.sling.api.resource.Resource; +import org.apache.sling.models.spi.ImplementationPicker; +import org.jetbrains.annotations.NotNull; +import org.osgi.service.component.annotations.Component; +import org.osgi.service.component.propertytypes.ServiceRanking; + +/** + * This is a curious {@link ImplementationPicker} implementation for integration test + * that picks the last implementation if the resource has the name "custom"; + */ +@Component(service = ImplementationPicker.class) +@ServiceRanking(100) +public class CustomLastImplementationPicker implements ImplementationPicker { + + public static final String CUSTOM_NAME = "custom"; + + public Class pick(@NotNull Class adapterType, Class[] implementationsTypes, @NotNull Object adaptable) { + if (adaptable instanceof Resource && StringUtils.equals(((Resource) adaptable).getName(), CUSTOM_NAME)) { + return implementationsTypes[implementationsTypes.length - 1]; + } + return null; + } +} diff --git a/it/test-models/src/main/java/org/apache/sling/models/it/implpicker/package-info.java b/it/test-models/src/main/java/org/apache/sling/models/it/implpicker/package-info.java new file mode 100644 index 00000000..c8a5b3e5 --- /dev/null +++ b/it/test-models/src/main/java/org/apache/sling/models/it/implpicker/package-info.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. + */ + +@Version("1.0") +package org.apache.sling.models.it.implpicker; + +import org.osgi.annotation.versioning.Version; diff --git a/it/test-models/src/main/java/org/apache/sling/models/it/models/ConstructorInjectionTestModel.java b/it/test-models/src/main/java/org/apache/sling/models/it/models/ConstructorInjectionTestModel.java new file mode 100644 index 00000000..c80b1c59 --- /dev/null +++ b/it/test-models/src/main/java/org/apache/sling/models/it/models/ConstructorInjectionTestModel.java @@ -0,0 +1,59 @@ +/* + * 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.it.models; + +import javax.inject.Inject; +import javax.inject.Named; +import javax.servlet.Filter; + +import java.util.List; + +import org.apache.sling.api.resource.Resource; +import org.apache.sling.models.annotations.Model; +import org.apache.sling.models.annotations.injectorspecific.Self; + +@Model(adaptables = Resource.class) +public class ConstructorInjectionTestModel { + + private final String testProperty; + private final List filters; + private final Resource resource; + + @Inject + public ConstructorInjectionTestModel( + @Named("testProperty") String testProperty, + @Named("filters") List filters, + @Self Resource resource) { + this.testProperty = testProperty; + this.filters = filters; + this.resource = resource; + } + + public String getTestProperty() { + return testProperty; + } + + public List getFilters() { + return filters; + } + + public Resource getResource() { + return resource; + } +} diff --git a/it/test-models/src/main/java/org/apache/sling/models/it/models/FieldInjectionTestModel.java b/it/test-models/src/main/java/org/apache/sling/models/it/models/FieldInjectionTestModel.java new file mode 100644 index 00000000..f8ed3a80 --- /dev/null +++ b/it/test-models/src/main/java/org/apache/sling/models/it/models/FieldInjectionTestModel.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.it.models; + +import javax.inject.Inject; +import javax.inject.Named; +import javax.servlet.Filter; + +import java.util.List; + +import org.apache.sling.api.resource.Resource; +import org.apache.sling.models.annotations.Model; +import org.apache.sling.models.annotations.Optional; + +@Model(adaptables = Resource.class) +public class FieldInjectionTestModel { + + @Inject + private String testProperty; + + @Inject + @Optional + @Named("child/childProperty") + private String childProperty; + + @Inject + private List filters; + + private final Resource resource; + + public FieldInjectionTestModel(Resource pResource) { + this.resource = pResource; + } + + public String getTestProperty() { + return testProperty; + } + + public String getChildProperty() { + return childProperty; + } + + public List getFilters() { + return filters; + } + + public Resource getResource() { + return resource; + } +} diff --git a/it/test-models/src/main/java/org/apache/sling/models/it/models/InterfaceInjectionTestModel.java b/it/test-models/src/main/java/org/apache/sling/models/it/models/InterfaceInjectionTestModel.java new file mode 100644 index 00000000..52e2e403 --- /dev/null +++ b/it/test-models/src/main/java/org/apache/sling/models/it/models/InterfaceInjectionTestModel.java @@ -0,0 +1,41 @@ +/* + * 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.it.models; + +import javax.inject.Inject; +import javax.servlet.Filter; + +import java.util.List; + +import org.apache.sling.api.resource.Resource; +import org.apache.sling.models.annotations.Model; +import org.apache.sling.models.annotations.injectorspecific.Self; + +@Model(adaptables = Resource.class) +public interface InterfaceInjectionTestModel { + + @Inject + String getTestProperty(); + + @Inject + List getFilters(); + + @Self + Resource getResource(); +} diff --git a/it/test-models/src/main/java/org/apache/sling/models/it/models/JakartaRequestSelfModel.java b/it/test-models/src/main/java/org/apache/sling/models/it/models/JakartaRequestSelfModel.java new file mode 100644 index 00000000..24282aff --- /dev/null +++ b/it/test-models/src/main/java/org/apache/sling/models/it/models/JakartaRequestSelfModel.java @@ -0,0 +1,26 @@ +/* + * 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.it.models; + +import org.apache.sling.api.SlingJakartaHttpServletRequest; + +public interface JakartaRequestSelfModel { + + SlingJakartaHttpServletRequest getRequest(); +} diff --git a/it/test-models/src/main/java/org/apache/sling/models/it/models/JakartaRequestSelfModelImpl.java b/it/test-models/src/main/java/org/apache/sling/models/it/models/JakartaRequestSelfModelImpl.java new file mode 100644 index 00000000..ab7261a1 --- /dev/null +++ b/it/test-models/src/main/java/org/apache/sling/models/it/models/JakartaRequestSelfModelImpl.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.it.models; + +import org.apache.sling.api.SlingJakartaHttpServletRequest; +import org.apache.sling.models.annotations.Model; +import org.apache.sling.models.annotations.injectorspecific.Self; + +@Model(adaptables = SlingJakartaHttpServletRequest.class, adapters = RequestSelfModel.class) +public class JakartaRequestSelfModelImpl implements JakartaRequestSelfModel { + + @Self + private SlingJakartaHttpServletRequest request; + + public SlingJakartaHttpServletRequest getRequest() { + return request; + } +} diff --git a/it/test-models/src/main/java/org/apache/sling/models/it/models/ModelWithOptionalImport.java b/it/test-models/src/main/java/org/apache/sling/models/it/models/ModelWithOptionalImport.java new file mode 100644 index 00000000..d33b05b4 --- /dev/null +++ b/it/test-models/src/main/java/org/apache/sling/models/it/models/ModelWithOptionalImport.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.it.models; + +import org.apache.commons.beanutils.BeanUtils; +import org.apache.sling.api.resource.Resource; +import org.apache.sling.models.annotations.Model; + +@Model(adaptables = Resource.class) +public class ModelWithOptionalImport { + + // this class is not available at runtime. The containing package has an optional import so the bundle + // still resolves + @SuppressWarnings("unused") + private BeanUtils beanUtils = new BeanUtils(); +} diff --git a/it/test-models/src/main/java/org/apache/sling/models/it/models/RequestSelfModel.java b/it/test-models/src/main/java/org/apache/sling/models/it/models/RequestSelfModel.java new file mode 100644 index 00000000..b711431b --- /dev/null +++ b/it/test-models/src/main/java/org/apache/sling/models/it/models/RequestSelfModel.java @@ -0,0 +1,26 @@ +/* + * 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.it.models; + +import org.apache.sling.api.SlingHttpServletRequest; + +public interface RequestSelfModel { + + SlingHttpServletRequest getRequest(); +} diff --git a/it/test-models/src/main/java/org/apache/sling/models/it/models/RequestSelfModelImpl.java b/it/test-models/src/main/java/org/apache/sling/models/it/models/RequestSelfModelImpl.java new file mode 100644 index 00000000..de9e83fb --- /dev/null +++ b/it/test-models/src/main/java/org/apache/sling/models/it/models/RequestSelfModelImpl.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.it.models; + +import org.apache.sling.api.SlingHttpServletRequest; +import org.apache.sling.models.annotations.Model; +import org.apache.sling.models.annotations.injectorspecific.Self; + +@Model(adaptables = SlingHttpServletRequest.class, adapters = RequestSelfModel.class) +public class RequestSelfModelImpl implements RequestSelfModel { + + @Self + private SlingHttpServletRequest request; + + public SlingHttpServletRequest getRequest() { + return request; + } +} diff --git a/it/test-models/src/main/java/org/apache/sling/models/it/models/SelfModel.java b/it/test-models/src/main/java/org/apache/sling/models/it/models/SelfModel.java new file mode 100644 index 00000000..c635c4e1 --- /dev/null +++ b/it/test-models/src/main/java/org/apache/sling/models/it/models/SelfModel.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.it.models; + +import org.apache.sling.api.resource.Resource; +import org.apache.sling.models.annotations.Model; +import org.apache.sling.models.annotations.injectorspecific.Self; + +@Model(adaptables = Resource.class) +public class SelfModel { + + @Self + private Resource resource; + + public Resource getResource() { + return resource; + } +} diff --git a/it/test-models/src/main/java/org/apache/sling/models/it/models/ServiceInjectionTestModel.java b/it/test-models/src/main/java/org/apache/sling/models/it/models/ServiceInjectionTestModel.java new file mode 100644 index 00000000..c9f2cf32 --- /dev/null +++ b/it/test-models/src/main/java/org/apache/sling/models/it/models/ServiceInjectionTestModel.java @@ -0,0 +1,49 @@ +/* + * 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.it.models; + +import java.util.ArrayList; +import java.util.List; + +import org.apache.sling.api.resource.Resource; +import org.apache.sling.models.annotations.Model; +import org.apache.sling.models.annotations.injectorspecific.OSGiService; +import org.apache.sling.models.it.services.SimpleService; + +@Model(adaptables = Resource.class) +public class ServiceInjectionTestModel { + + @OSGiService + private SimpleService simpleService; // must return the service impl with the highest ranking + + @OSGiService + private List simpleServices; + + public SimpleService getSimpleService() { + return simpleService; + } + + public Integer[] getSimpleServicesRankings() { + List serviceRankings = new ArrayList(); + for (SimpleService service : simpleServices) { + serviceRankings.add(service.getRanking()); + } + return serviceRankings.toArray(new Integer[serviceRankings.size()]); + } +} diff --git a/it/test-models/src/main/java/org/apache/sling/models/it/models/SlingPropertyAnnotationTestModel.java b/it/test-models/src/main/java/org/apache/sling/models/it/models/SlingPropertyAnnotationTestModel.java new file mode 100644 index 00000000..abda77ac --- /dev/null +++ b/it/test-models/src/main/java/org/apache/sling/models/it/models/SlingPropertyAnnotationTestModel.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.it.models; + +import org.apache.sling.api.resource.Resource; +import org.apache.sling.models.annotations.Model; +import org.apache.sling.models.annotations.injectorspecific.ValueMapValue; + +@Model(adaptables = Resource.class) +public class SlingPropertyAnnotationTestModel { + + @ValueMapValue + private String testProperty; + + public String getTestProperty() { + return testProperty; + } +} diff --git a/it/test-models/src/main/java/org/apache/sling/models/it/models/SourceObject.java b/it/test-models/src/main/java/org/apache/sling/models/it/models/SourceObject.java new file mode 100644 index 00000000..d31d57f1 --- /dev/null +++ b/it/test-models/src/main/java/org/apache/sling/models/it/models/SourceObject.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.it.models; + +import org.apache.sling.api.resource.Resource; + +public class SourceObject { + + public SourceObject(Resource resource) { + this.resource = resource; + } + + private Resource resource; + + public Resource getResource() { + return resource; + } +} diff --git a/it/test-models/src/main/java/org/apache/sling/models/it/models/ViaModel.java b/it/test-models/src/main/java/org/apache/sling/models/it/models/ViaModel.java new file mode 100644 index 00000000..a33c24e3 --- /dev/null +++ b/it/test-models/src/main/java/org/apache/sling/models/it/models/ViaModel.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.it.models; + +import javax.inject.Inject; + +import org.apache.sling.models.annotations.Model; +import org.apache.sling.models.annotations.Via; + +@Model(adaptables = SourceObject.class) +public class ViaModel { + + @Inject + @Via("resource") + private String testProperty; + + public String getTestProperty() { + return testProperty; + } +} diff --git a/it/test-models/src/main/java/org/apache/sling/models/it/models/implextend/ExtendsClassPropertyModel.java b/it/test-models/src/main/java/org/apache/sling/models/it/models/implextend/ExtendsClassPropertyModel.java new file mode 100644 index 00000000..4dbb0dc1 --- /dev/null +++ b/it/test-models/src/main/java/org/apache/sling/models/it/models/implextend/ExtendsClassPropertyModel.java @@ -0,0 +1,37 @@ +/* + * 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.it.models.implextend; + +import org.apache.sling.api.resource.Resource; +import org.apache.sling.models.annotations.Model; + +/** + * This is an example for a model that can not be adapted itself, but only + * to a superclass it extends. This superclass is defined as "adapters". + */ +@Model( + adaptables = Resource.class, + adapters = {SimplePropertyModel.class}) +public class ExtendsClassPropertyModel extends SimplePropertyModel { + + @Override + public String getAllProperties() { + return "!" + super.getAllProperties() + "!"; + } +} diff --git a/it/test-models/src/main/java/org/apache/sling/models/it/models/implextend/ImplementsInterfacePropertyModel.java b/it/test-models/src/main/java/org/apache/sling/models/it/models/implextend/ImplementsInterfacePropertyModel.java new file mode 100644 index 00000000..033d184e --- /dev/null +++ b/it/test-models/src/main/java/org/apache/sling/models/it/models/implextend/ImplementsInterfacePropertyModel.java @@ -0,0 +1,53 @@ +/* + * 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.it.models.implextend; + +import javax.inject.Inject; +import javax.inject.Named; + +import org.apache.sling.api.resource.Resource; +import org.apache.sling.models.annotations.Model; +import org.apache.sling.models.annotations.Optional; + +/** + * This is an example for a model that can not be adapted itself, but only + * to an interface it implements. This interfaces is defined as "adapters". + */ +@Model( + adaptables = Resource.class, + adapters = {SampleServiceInterface.class}) +public class ImplementsInterfacePropertyModel implements SampleServiceInterface { + + @Inject + private String first; + + @Inject + @Optional + private String second; + + @Inject + @Named("third") + private String thirdProperty; + + public String getAllProperties() { + StringBuilder sb = new StringBuilder(); + sb.append(first).append("|").append(second).append("|").append(thirdProperty); + return sb.toString(); + } +} diff --git a/it/test-models/src/main/java/org/apache/sling/models/it/models/implextend/ImplementsInterfacePropertyModel2.java b/it/test-models/src/main/java/org/apache/sling/models/it/models/implextend/ImplementsInterfacePropertyModel2.java new file mode 100644 index 00000000..40d05ec4 --- /dev/null +++ b/it/test-models/src/main/java/org/apache/sling/models/it/models/implextend/ImplementsInterfacePropertyModel2.java @@ -0,0 +1,52 @@ +/* + * 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.it.models.implextend; + +import javax.inject.Inject; +import javax.inject.Named; + +import org.apache.sling.api.resource.Resource; +import org.apache.sling.models.annotations.Model; +import org.apache.sling.models.annotations.Optional; + +/** + * Additional model class that implements the same interface as {@link ImplementsInterfacePropertyModel}. + */ +@Model( + adaptables = Resource.class, + adapters = {SampleServiceInterface.class}) +public class ImplementsInterfacePropertyModel2 implements SampleServiceInterface { + + @Inject + private String first; + + @Inject + @Optional + private String second; + + @Inject + @Named("third") + private String thirdProperty; + + public String getAllProperties() { + StringBuilder sb = new StringBuilder(); + sb.append(first).append("|").append(second).append("|").append(thirdProperty); + return sb.toString(); + } +} diff --git a/it/test-models/src/main/java/org/apache/sling/models/it/models/implextend/InvalidImplementsInterfacePropertyModel.java b/it/test-models/src/main/java/org/apache/sling/models/it/models/implextend/InvalidImplementsInterfacePropertyModel.java new file mode 100644 index 00000000..6f0dfdf5 --- /dev/null +++ b/it/test-models/src/main/java/org/apache/sling/models/it/models/implextend/InvalidImplementsInterfacePropertyModel.java @@ -0,0 +1,52 @@ +/* + * 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.it.models.implextend; + +import javax.inject.Inject; +import javax.inject.Named; + +import org.apache.sling.api.resource.Resource; +import org.apache.sling.models.annotations.Model; +import org.apache.sling.models.annotations.Optional; + +/** + * This model defines an invalid adapters property containing an interface it does not implement. + */ +@Model( + adaptables = Resource.class, + adapters = {InvalidSampleServiceInterface.class}) +public class InvalidImplementsInterfacePropertyModel implements SampleServiceInterface { + + @Inject + private String first; + + @Inject + @Optional + private String second; + + @Inject + @Named("third") + private String thirdProperty; + + public String getAllProperties() { + StringBuilder sb = new StringBuilder(); + sb.append(first).append("|").append(second).append("|").append(thirdProperty); + return sb.toString(); + } +} diff --git a/it/test-models/src/main/java/org/apache/sling/models/it/models/implextend/InvalidSampleServiceInterface.java b/it/test-models/src/main/java/org/apache/sling/models/it/models/implextend/InvalidSampleServiceInterface.java new file mode 100644 index 00000000..18f26cbc --- /dev/null +++ b/it/test-models/src/main/java/org/apache/sling/models/it/models/implextend/InvalidSampleServiceInterface.java @@ -0,0 +1,30 @@ +/* + * 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.it.models.implextend; + +/** + * Example "service" interface to which sling models can adapt. + */ +public interface InvalidSampleServiceInterface { + + /** + * @return concanated string with all properties + */ + String getAllProperties(); +} diff --git a/it/test-models/src/main/java/org/apache/sling/models/it/models/implextend/SampleServiceInterface.java b/it/test-models/src/main/java/org/apache/sling/models/it/models/implextend/SampleServiceInterface.java new file mode 100644 index 00000000..84f1155e --- /dev/null +++ b/it/test-models/src/main/java/org/apache/sling/models/it/models/implextend/SampleServiceInterface.java @@ -0,0 +1,30 @@ +/* + * 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.it.models.implextend; + +/** + * Example "service" interface to which sling models can adapt. + */ +public interface SampleServiceInterface { + + /** + * @return concatenated string with all properties + */ + String getAllProperties(); +} diff --git a/it/test-models/src/main/java/org/apache/sling/models/it/models/implextend/SimplePropertyModel.java b/it/test-models/src/main/java/org/apache/sling/models/it/models/implextend/SimplePropertyModel.java new file mode 100644 index 00000000..a942c083 --- /dev/null +++ b/it/test-models/src/main/java/org/apache/sling/models/it/models/implextend/SimplePropertyModel.java @@ -0,0 +1,47 @@ +/* + * 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.it.models.implextend; + +import javax.inject.Inject; +import javax.inject.Named; + +import org.apache.sling.models.annotations.Optional; + +/** + * Base class without @Model annotation. + */ +public class SimplePropertyModel { + + @Inject + private String first; + + @Inject + @Optional + private String second; + + @Inject + @Named("third") + private String thirdProperty; + + public String getAllProperties() { + StringBuilder sb = new StringBuilder(); + sb.append(first).append("|").append(second).append("|").append(thirdProperty); + return sb.toString(); + } +} diff --git a/it/test-models/src/main/java/org/apache/sling/models/it/models/implextend/package-info.java b/it/test-models/src/main/java/org/apache/sling/models/it/models/implextend/package-info.java new file mode 100644 index 00000000..3d4840c2 --- /dev/null +++ b/it/test-models/src/main/java/org/apache/sling/models/it/models/implextend/package-info.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. + */ + +@Version("1.0") +package org.apache.sling.models.it.models.implextend; + +import org.osgi.annotation.versioning.Version; diff --git a/it/test-models/src/main/java/org/apache/sling/models/it/models/package-info.java b/it/test-models/src/main/java/org/apache/sling/models/it/models/package-info.java new file mode 100644 index 00000000..d387b59b --- /dev/null +++ b/it/test-models/src/main/java/org/apache/sling/models/it/models/package-info.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. + */ + +@Version("1.0") +package org.apache.sling.models.it.models; + +import org.osgi.annotation.versioning.Version; diff --git a/it/test-models/src/main/java/org/apache/sling/models/it/rtbound/BaseComponent.java b/it/test-models/src/main/java/org/apache/sling/models/it/rtbound/BaseComponent.java new file mode 100644 index 00000000..b15f9f39 --- /dev/null +++ b/it/test-models/src/main/java/org/apache/sling/models/it/rtbound/BaseComponent.java @@ -0,0 +1,51 @@ +/* + * 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.it.rtbound; + +import javax.inject.Inject; + +import org.apache.sling.api.resource.Resource; +import org.apache.sling.models.annotations.Model; + +@Model( + adaptables = {Resource.class}, + resourceType = "sling/rt/base") +public class BaseComponent { + + private final Resource resource; + + @Inject + private String sampleValue; + + public BaseComponent(Resource resource) { + this.resource = resource; + } + + public String getId() { + return this.resource.getPath(); + } + + public String getSampleValue() { + return sampleValue; + } + + public String getSampleValueToUpperCase() { + return sampleValue.toUpperCase(); + } +} diff --git a/it/test-models/src/main/java/org/apache/sling/models/it/rtbound/ExtendedComponent.java b/it/test-models/src/main/java/org/apache/sling/models/it/rtbound/ExtendedComponent.java new file mode 100644 index 00000000..43cbed78 --- /dev/null +++ b/it/test-models/src/main/java/org/apache/sling/models/it/rtbound/ExtendedComponent.java @@ -0,0 +1,48 @@ +/* + * 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.it.rtbound; + +import java.util.Calendar; +import java.util.Date; +import java.util.GregorianCalendar; + +import org.apache.sling.api.resource.Resource; +import org.apache.sling.models.annotations.Model; + +@Model( + adaptables = {Resource.class}, + resourceType = "sling/rt/extended") +public class ExtendedComponent extends BaseComponent { + + private final Date d = new Date(); + + public ExtendedComponent(Resource resource) { + super(resource); + } + + public Calendar getDateByCalendar() { + Calendar cal = new GregorianCalendar(); + cal.setTime(d); + return cal; + } + + public Date getDate() { + return d; + } +} diff --git a/it/test-models/src/main/java/org/apache/sling/models/it/rtbound/FromRequestComponent.java b/it/test-models/src/main/java/org/apache/sling/models/it/rtbound/FromRequestComponent.java new file mode 100644 index 00000000..c39b7548 --- /dev/null +++ b/it/test-models/src/main/java/org/apache/sling/models/it/rtbound/FromRequestComponent.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.it.rtbound; + +import org.apache.sling.api.SlingHttpServletRequest; +import org.apache.sling.models.annotations.Model; + +@Model( + adaptables = {SlingHttpServletRequest.class}, + resourceType = "sling/rt/fromRequest") +public class FromRequestComponent {} diff --git a/it/test-models/src/main/java/org/apache/sling/models/it/rtbound/package-info.java b/it/test-models/src/main/java/org/apache/sling/models/it/rtbound/package-info.java new file mode 100644 index 00000000..19332e31 --- /dev/null +++ b/it/test-models/src/main/java/org/apache/sling/models/it/rtbound/package-info.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. + */ + +@Version("1.0") +package org.apache.sling.models.it.rtbound; + +import org.osgi.annotation.versioning.Version; diff --git a/it/test-models/src/main/java/org/apache/sling/models/it/rtboundpicker/BaseComponent.java b/it/test-models/src/main/java/org/apache/sling/models/it/rtboundpicker/BaseComponent.java new file mode 100644 index 00000000..292cef06 --- /dev/null +++ b/it/test-models/src/main/java/org/apache/sling/models/it/rtboundpicker/BaseComponent.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.it.rtboundpicker; + +import org.apache.sling.api.resource.Resource; +import org.apache.sling.models.annotations.Model; + +@Model(adaptables = Resource.class, adapters = TestComponent.class, resourceType = "sling/rtpicker/base") +public class BaseComponent implements TestComponent { + + @Override + public String getSampleValue() { + return "base"; + } +} diff --git a/it/test-models/src/main/java/org/apache/sling/models/it/rtboundpicker/SubRTComponent.java b/it/test-models/src/main/java/org/apache/sling/models/it/rtboundpicker/SubRTComponent.java new file mode 100644 index 00000000..32011b2b --- /dev/null +++ b/it/test-models/src/main/java/org/apache/sling/models/it/rtboundpicker/SubRTComponent.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.it.rtboundpicker; + +import org.apache.sling.api.resource.Resource; +import org.apache.sling.models.annotations.Model; + +@Model(adaptables = Resource.class, adapters = TestComponent.class, resourceType = "sling/rtpicker/sub") +public class SubRTComponent implements TestComponent { + + @Override + public String getSampleValue() { + return "sub"; + } +} diff --git a/it/test-models/src/main/java/org/apache/sling/models/it/rtboundpicker/TestComponent.java b/it/test-models/src/main/java/org/apache/sling/models/it/rtboundpicker/TestComponent.java new file mode 100644 index 00000000..3d97aea2 --- /dev/null +++ b/it/test-models/src/main/java/org/apache/sling/models/it/rtboundpicker/TestComponent.java @@ -0,0 +1,24 @@ +/* + * 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.it.rtboundpicker; + +public interface TestComponent { + + String getSampleValue(); +} diff --git a/it/test-models/src/main/java/org/apache/sling/models/it/rtboundpicker/package-info.java b/it/test-models/src/main/java/org/apache/sling/models/it/rtboundpicker/package-info.java new file mode 100644 index 00000000..950815c2 --- /dev/null +++ b/it/test-models/src/main/java/org/apache/sling/models/it/rtboundpicker/package-info.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. + */ + +@Version("1.0") +package org.apache.sling.models.it.rtboundpicker; + +import org.osgi.annotation.versioning.Version; diff --git a/it/test-models/src/main/java/org/apache/sling/models/it/services/AnotherTestBindingsValuesProvider.java b/it/test-models/src/main/java/org/apache/sling/models/it/services/AnotherTestBindingsValuesProvider.java new file mode 100644 index 00000000..9dcce319 --- /dev/null +++ b/it/test-models/src/main/java/org/apache/sling/models/it/services/AnotherTestBindingsValuesProvider.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.it.services; + +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; + +import org.osgi.service.component.annotations.Component; + +@Component( + service = Map.class, + property = {"javax.script.name=sling-models-exporter"}) +public class AnotherTestBindingsValuesProvider extends HashMap { + private static final long serialVersionUID = 1L; + + public AnotherTestBindingsValuesProvider() { + super.put("testBindingsObject2", Collections.singletonMap("name2", "value2")); + } +} diff --git a/it/test-models/src/main/java/org/apache/sling/models/it/services/SimpleService.java b/it/test-models/src/main/java/org/apache/sling/models/it/services/SimpleService.java new file mode 100644 index 00000000..aeb4ee15 --- /dev/null +++ b/it/test-models/src/main/java/org/apache/sling/models/it/services/SimpleService.java @@ -0,0 +1,23 @@ +/* + * 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.it.services; + +public interface SimpleService { + int getRanking(); +} diff --git a/it/test-models/src/main/java/org/apache/sling/models/it/services/SimpleServiceWithCustomRanking.java b/it/test-models/src/main/java/org/apache/sling/models/it/services/SimpleServiceWithCustomRanking.java new file mode 100644 index 00000000..33a8068d --- /dev/null +++ b/it/test-models/src/main/java/org/apache/sling/models/it/services/SimpleServiceWithCustomRanking.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.it.services; + +public class SimpleServiceWithCustomRanking implements SimpleService { + + private final int ranking; + + public SimpleServiceWithCustomRanking(int ranking) { + this.ranking = ranking; + } + + public int getRanking() { + return ranking; + } +} diff --git a/it/test-models/src/main/java/org/apache/sling/models/it/services/TestBindingsValuesProvider.java b/it/test-models/src/main/java/org/apache/sling/models/it/services/TestBindingsValuesProvider.java new file mode 100644 index 00000000..a7dcb68d --- /dev/null +++ b/it/test-models/src/main/java/org/apache/sling/models/it/services/TestBindingsValuesProvider.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.it.services; + +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; + +import org.osgi.service.component.annotations.Component; + +@Component( + service = Map.class, + property = {"javax.script.name=*"}) +public class TestBindingsValuesProvider extends HashMap { + private static final long serialVersionUID = -5029445376678233701L; + + public TestBindingsValuesProvider() { + super.put("testBindingsObject", Collections.singletonMap("name", "value")); + } +} diff --git a/it/test-models/src/main/java/org/apache/sling/models/it/services/TestResourceDecorator.java b/it/test-models/src/main/java/org/apache/sling/models/it/services/TestResourceDecorator.java new file mode 100644 index 00000000..8d2a0a1c --- /dev/null +++ b/it/test-models/src/main/java/org/apache/sling/models/it/services/TestResourceDecorator.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.it.services; + +import javax.servlet.http.HttpServletRequest; + +import org.apache.sling.api.adapter.AdapterManager; +import org.apache.sling.api.resource.Resource; +import org.apache.sling.api.resource.ResourceDecorator; +import org.apache.sling.api.resource.ResourceWrapper; +import org.apache.sling.api.resource.ValueMap; +import org.jetbrains.annotations.NotNull; +import org.osgi.service.component.annotations.Component; +import org.osgi.service.component.annotations.Reference; + +@Component(service = ResourceDecorator.class) +public class TestResourceDecorator implements ResourceDecorator { + + @Reference + private AdapterManager adapterManager; + + @Override + @SuppressWarnings("null") + public Resource decorate(@NotNull Resource resource) { + ValueMap map = resource.adaptTo(ValueMap.class); + if (map != null && map.containsKey("decorate")) { + if (map.get("decorate", "default").equals("customAdaptTo")) { + return new ResourceWrapper(resource) { + @Override + public AdapterType adaptTo(Class type) { + AdapterType adapter = adapterManager.getAdapter(this, type); + if (adapter != null) { + return adapter; + } else { + return super.adaptTo(type); + } + } + }; + } else { + return new ResourceWrapper(resource); + } + } + return null; + } + + @Override + public Resource decorate(@NotNull Resource resource, @NotNull HttpServletRequest request) { + return decorate(resource); + } +} diff --git a/it/test-models/src/main/java/org/apache/sling/models/it/services/package-info.java b/it/test-models/src/main/java/org/apache/sling/models/it/services/package-info.java new file mode 100644 index 00000000..1f5740a8 --- /dev/null +++ b/it/test-models/src/main/java/org/apache/sling/models/it/services/package-info.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. + */ + +@Version("1.0") +package org.apache.sling.models.it.services; + +import org.osgi.annotation.versioning.Version; diff --git a/it/test-models/src/main/java/org/apache/sling/models/it/servlets/PathBoundJakartaServlet.java b/it/test-models/src/main/java/org/apache/sling/models/it/servlets/PathBoundJakartaServlet.java new file mode 100644 index 00000000..4900f294 --- /dev/null +++ b/it/test-models/src/main/java/org/apache/sling/models/it/servlets/PathBoundJakartaServlet.java @@ -0,0 +1,46 @@ +/* + * 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.it.servlets; + +import java.io.IOException; + +import jakarta.servlet.Servlet; +import jakarta.servlet.ServletException; +import org.apache.sling.api.SlingJakartaHttpServletRequest; +import org.apache.sling.api.SlingJakartaHttpServletResponse; +import org.apache.sling.api.servlets.SlingJakartaSafeMethodsServlet; +import org.apache.sling.models.it.models.JakartaRequestSelfModel; +import org.apache.sling.servlets.annotations.SlingServletPaths; +import org.jetbrains.annotations.NotNull; +import org.osgi.service.component.annotations.Component; + +@Component(service = Servlet.class) +@SlingServletPaths("/apps/rtpickerrequest-jakarta") +public class PathBoundJakartaServlet extends SlingJakartaSafeMethodsServlet { + private static final long serialVersionUID = 1L; + + @Override + @SuppressWarnings("unused") + protected void doGet( + @NotNull SlingJakartaHttpServletRequest request, @NotNull SlingJakartaHttpServletResponse response) + throws ServletException, IOException { + JakartaRequestSelfModel model = request.adaptTo(JakartaRequestSelfModel.class); + response.setStatus(200); + } +} diff --git a/it/test-models/src/main/java/org/apache/sling/models/it/servlets/PathBoundServlet.java b/it/test-models/src/main/java/org/apache/sling/models/it/servlets/PathBoundServlet.java new file mode 100644 index 00000000..7657275a --- /dev/null +++ b/it/test-models/src/main/java/org/apache/sling/models/it/servlets/PathBoundServlet.java @@ -0,0 +1,46 @@ +/* + * 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.it.servlets; + +import javax.servlet.Servlet; +import javax.servlet.ServletException; + +import java.io.IOException; + +import org.apache.sling.api.SlingHttpServletRequest; +import org.apache.sling.api.SlingHttpServletResponse; +import org.apache.sling.api.servlets.SlingSafeMethodsServlet; +import org.apache.sling.models.it.models.RequestSelfModel; +import org.apache.sling.servlets.annotations.SlingServletPaths; +import org.jetbrains.annotations.NotNull; +import org.osgi.service.component.annotations.Component; + +@Component(service = Servlet.class) +@SlingServletPaths("/apps/rtpickerrequest") +public class PathBoundServlet extends SlingSafeMethodsServlet { + private static final long serialVersionUID = 1L; + + @Override + @SuppressWarnings("unused") + protected void doGet(@NotNull SlingHttpServletRequest request, @NotNull SlingHttpServletResponse response) + throws ServletException, IOException { + RequestSelfModel model = request.adaptTo(RequestSelfModel.class); + response.setStatus(200); + } +} diff --git a/it/test-models/src/main/resources/org/apache/sling/models/it/noclasses/foo.txt b/it/test-models/src/main/resources/org/apache/sling/models/it/noclasses/foo.txt new file mode 100644 index 00000000..dd50685b --- /dev/null +++ b/it/test-models/src/main/resources/org/apache/sling/models/it/noclasses/foo.txt @@ -0,0 +1 @@ +text file to ensure the package gets created, but without class files \ No newline at end of file diff --git a/parent/pom.xml b/parent/pom.xml new file mode 100644 index 00000000..b2bf6aa1 --- /dev/null +++ b/parent/pom.xml @@ -0,0 +1,58 @@ + + + + 4.0.0 + + + org.apache.sling + sling-bundle-parent + 65 + + + + org.apache.sling.models.impl.parent + 2.0.1-SNAPSHOT + pom + Apache Sling Models Implementation - Parent + + + scm:git:https://gitbox.apache.org/repos/asf/sling-org-apache-sling-models-impl.git + scm:git:https://gitbox.apache.org/repos/asf/sling-org-apache-sling-models-impl.git + HEAD + https://github.com/apache/sling-org-apache-sling-models-impl.git + + + + 17 + 2025-08-27T03:14:05Z + 2.0.0 + + + + + + org.apache.sling + org.apache.sling.models.api + ${models.api.version} + provided + + + + diff --git a/pom.xml b/pom.xml index 2e3f5c22..461dcc11 100644 --- a/pom.xml +++ b/pom.xml @@ -19,250 +19,23 @@ --> 4.0.0 + org.apache.sling - sling-bundle-parent - 62 - + org.apache.sling.models.impl.parent + 2.0.1-SNAPSHOT + parent/pom.xml - org.apache.sling.models.impl - 2.0.1-SNAPSHOT - Apache Sling Models Implementation - Apache Sling Models Implementation - - scm:git:https://gitbox.apache.org/repos/asf/sling-org-apache-sling-models-impl.git - scm:git:https://gitbox.apache.org/repos/asf/sling-org-apache-sling-models-impl.git - org.apache.sling.models.impl-1.7.2 - https://github.com/apache/sling-org-apache-sling-models-impl.git - - - 2025-08-27T03:14:05Z - 17 - + org.apache.sling.models.impl.reactor + 2.0.1-SNAPSHOT + pom + Apache Sling Models Implementation - Reactor - - - org.apache.sling - org.apache.sling.models.api - 2.0.0 - provided - - - org.osgi - org.osgi.framework - provided - - - org.osgi - org.osgi.service.component - provided - - - org.osgi - org.osgi.util.tracker - provided - - - org.osgi - org.osgi.service.http.whiteboard - provided - - - - org.osgi - org.osgi.service.component.annotations - provided - - - org.osgi - org.osgi.service.metatype.annotations - provided - - - org.osgi - org.osgi.annotation.versioning - provided - - - - javax.servlet - javax.servlet-api - 4.0.1 - provided - - - jakarta.servlet - jakarta.servlet-api - 6.0.0 - provided - - - org.apache.felix - org.apache.felix.http.wrappers - 1.1.10 - provided - - - org.apache.commons - commons-lang3 - 3.18.0 - provided - - - org.apache.sling - org.apache.sling.api - 3.0.0 - provided - - - org.apache.sling - org.apache.sling.scripting.api - 2.2.0 - provided - - - org.slf4j - slf4j-api - provided - - - javax.inject - javax.inject - provided - - - org.osgi - org.osgi.util.converter - provided - - - - org.apache.sling - org.apache.sling.scripting.core - 3.0.0 - compile - - - org.apache.felix - org.apache.felix.utils - - - - - org.jetbrains - annotations - provided - - - - junit - junit - test - - - org.apache.sling - org.apache.sling.testing.osgi-mock.junit4 - 3.5.2 - test - - - org.mockito - mockito-core - 4.4.0 - test - - - org.hamcrest - hamcrest-junit - 2.0.0.0 - test - - - org.slf4j - slf4j-simple - test - - - org.apache.sling - org.apache.sling.servlet-helpers - 2.0.0 - test - - - - org.apache.commons - commons-collections4 - 4.1 - test - - - - org.springframework - spring-context - 5.3.39 - test - - - javax.annotation - javax.annotation-api - 1.3.2 - provided - - - - - - org.apache.maven.plugins - maven-shade-plugin - - - - shade - - package - - true - true - - - org.apache.sling:org.apache.sling.scripting.core - - - - - org.apache.sling.scripting.core.impl.helper - slingmodelsimpl.org.apache.sling.scripting.core.impl.helper - - - - - org.apache.sling:org.apache.sling.scripting.core - - org/apache/sling/scripting/core/impl/helper/ProtectedBindings* - - - - - - - - - org.apache.rat - apache-rat-plugin - - - dependency-reduced-pom.xml - - - - - org.apache.maven.plugins - maven-source-plugin - - false - - - - + + parent + impl + it/test-models + it/integration-tests +