You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by ju...@apache.org on 2016/11/19 22:09:27 UTC
svn commit: r1770520 - in /sling/trunk/bundles/extensions/models:
impl/src/main/java/org/apache/sling/models/impl/ModelPackageBundleListener.java
impl/src/test/java/org/apache/sling/models/impl/ImplementsExtendsTest.java
integration-tests/pom.xml
Author: justin
Date: Sat Nov 19 22:09:27 2016
New Revision: 1770520
URL: http://svn.apache.org/viewvc?rev=1770520&view=rev
Log:
SLING-6308 - support explicit class names in bundle header
Modified:
sling/trunk/bundles/extensions/models/impl/src/main/java/org/apache/sling/models/impl/ModelPackageBundleListener.java
sling/trunk/bundles/extensions/models/impl/src/test/java/org/apache/sling/models/impl/ImplementsExtendsTest.java
sling/trunk/bundles/extensions/models/integration-tests/pom.xml
Modified: sling/trunk/bundles/extensions/models/impl/src/main/java/org/apache/sling/models/impl/ModelPackageBundleListener.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/models/impl/src/main/java/org/apache/sling/models/impl/ModelPackageBundleListener.java?rev=1770520&r1=1770519&r2=1770520&view=diff
==============================================================================
--- sling/trunk/bundles/extensions/models/impl/src/main/java/org/apache/sling/models/impl/ModelPackageBundleListener.java (original)
+++ sling/trunk/bundles/extensions/models/impl/src/main/java/org/apache/sling/models/impl/ModelPackageBundleListener.java Sat Nov 19 22:09:27 2016
@@ -49,7 +49,8 @@ import javax.servlet.Servlet;
public class ModelPackageBundleListener implements BundleTrackerCustomizer {
- static final String HEADER = "Sling-Model-Packages";
+ static final String PACKAGE_HEADER = "Sling-Model-Packages";
+ static final String CLASSES_HEADER = "Sling-Model-Classes";
/**
* Service registration property for the adapter condition.
@@ -86,9 +87,8 @@ public class ModelPackageBundleListener
List<ServiceRegistration> regs = new ArrayList<ServiceRegistration>();
Dictionary<?, ?> headers = bundle.getHeaders();
- String packageList = PropertiesUtil.toString(headers.get(HEADER), null);
+ String packageList = PropertiesUtil.toString(headers.get(PACKAGE_HEADER), null);
if (packageList != null) {
-
packageList = StringUtils.deleteWhitespace(packageList);
String[] packages = packageList.split(",");
for (String singlePackage : packages) {
@@ -104,60 +104,73 @@ public class ModelPackageBundleListener
while (classUrls.hasMoreElements()) {
URL url = classUrls.nextElement();
String className = toClassName(url);
- try {
- Class<?> implType = bundle.loadClass(className);
- Model annotation = implType.getAnnotation(Model.class);
- if (annotation != null) {
-
- // get list of adapters from annotation - if not given use annotated class itself
- Class<?>[] adapterTypes = annotation.adapters();
- if (adapterTypes.length == 0) {
- adapterTypes = new Class<?>[] { implType };
- }
- // register adapter only if given adapters are valid
- if (validateAdapterClasses(implType, adapterTypes)) {
- for (Class<?> adapterType : adapterTypes) {
- adapterImplementations.add(adapterType, implType);
- }
- ServiceRegistration reg = registerAdapterFactory(adapterTypes, annotation.adaptables(), implType, annotation.condition());
- regs.add(reg);
+ analyzeClass(bundle, className, regs);
- String[] resourceTypes = annotation.resourceType();
- for (String resourceType : resourceTypes) {
- if (StringUtils.isNotEmpty(resourceType)) {
- for (Class<?> adaptable : annotation.adaptables()) {
- adapterImplementations.registerModelToResourceType(bundle, resourceType, adaptable, adapterTypes[0]);
- ExportServlet.ExportedObjectAccessor accessor = null;
- if (adaptable == Resource.class) {
- accessor = ExportServlet.RESOURCE;
- } else if (adaptable == SlingHttpServletRequest.class) {
- accessor = ExportServlet.REQUEST;
- }
- Exporter exporterAnnotation = implType.getAnnotation(Exporter.class);
- if (exporterAnnotation != null) {
- registerExporter(bundle, implType, resourceType, exporterAnnotation, regs, accessor);
- }
- Exporters exportersAnnotation = implType.getAnnotation(Exporters.class);
- if (exportersAnnotation != null) {
- for (Exporter ann : exportersAnnotation.value()) {
- registerExporter(bundle, implType, resourceType, ann, regs, accessor);
- }
- }
+ }
+ }
+ }
+ String classesList = PropertiesUtil.toString(headers.get(CLASSES_HEADER), null);
+ if (classesList != null) {
+ classesList = StringUtils.deleteWhitespace(classesList);
+ String[] classes = classesList.split(",");
+ for (String className : classes) {
+ analyzeClass(bundle, className, regs);
+ }
+ }
+
+ return regs.toArray(new ServiceRegistration[0]);
+ }
- }
+ private void analyzeClass(Bundle bundle, String className, List<ServiceRegistration> regs) {
+ try {
+ Class<?> implType = bundle.loadClass(className);
+ Model annotation = implType.getAnnotation(Model.class);
+ if (annotation != null) {
+
+ // get list of adapters from annotation - if not given use annotated class itself
+ Class<?>[] adapterTypes = annotation.adapters();
+ if (adapterTypes.length == 0) {
+ adapterTypes = new Class<?>[] { implType };
+ }
+ // register adapter only if given adapters are valid
+ if (validateAdapterClasses(implType, adapterTypes)) {
+ for (Class<?> adapterType : adapterTypes) {
+ adapterImplementations.add(adapterType, implType);
+ }
+ ServiceRegistration reg = registerAdapterFactory(adapterTypes, annotation.adaptables(), implType, annotation.condition());
+ regs.add(reg);
+
+ String[] resourceTypes = annotation.resourceType();
+ for (String resourceType : resourceTypes) {
+ if (StringUtils.isNotEmpty(resourceType)) {
+ for (Class<?> adaptable : annotation.adaptables()) {
+ adapterImplementations.registerModelToResourceType(bundle, resourceType, adaptable, adapterTypes[0]);
+ ExportServlet.ExportedObjectAccessor accessor = null;
+ if (adaptable == Resource.class) {
+ accessor = ExportServlet.RESOURCE;
+ } else if (adaptable == SlingHttpServletRequest.class) {
+ accessor = ExportServlet.REQUEST;
+ }
+ Exporter exporterAnnotation = implType.getAnnotation(Exporter.class);
+ if (exporterAnnotation != null) {
+ registerExporter(bundle, implType, resourceType, exporterAnnotation, regs, accessor);
+ }
+ Exporters exportersAnnotation = implType.getAnnotation(Exporters.class);
+ if (exportersAnnotation != null) {
+ for (Exporter ann : exportersAnnotation.value()) {
+ registerExporter(bundle, implType, resourceType, ann, regs, accessor);
}
}
- }
+ }
}
- } catch (ClassNotFoundException e) {
- log.warn("Unable to load class", e);
}
-
}
+
}
+ } catch (ClassNotFoundException e) {
+ log.warn("Unable to load class", e);
}
- return regs.toArray(new ServiceRegistration[0]);
}
@Override
Modified: sling/trunk/bundles/extensions/models/impl/src/test/java/org/apache/sling/models/impl/ImplementsExtendsTest.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/models/impl/src/test/java/org/apache/sling/models/impl/ImplementsExtendsTest.java?rev=1770520&r1=1770519&r2=1770520&view=diff
==============================================================================
--- sling/trunk/bundles/extensions/models/impl/src/test/java/org/apache/sling/models/impl/ImplementsExtendsTest.java (original)
+++ sling/trunk/bundles/extensions/models/impl/src/test/java/org/apache/sling/models/impl/ImplementsExtendsTest.java Sat Nov 19 22:09:27 2016
@@ -117,7 +117,7 @@ public class ImplementsExtendsTest {
// simulate bundle add for ModelPackageBundleListener
Dictionary<String, String> headers = new Hashtable<String,String>();
- headers.put(ModelPackageBundleListener.HEADER, "org.apache.sling.models.testmodels.classes.implextend");
+ headers.put(ModelPackageBundleListener.PACKAGE_HEADER, "org.apache.sling.models.testmodels.classes.implextend");
when(bundle.getHeaders()).thenReturn(headers);
Vector<URL> classUrls = new Vector<URL>();
Modified: sling/trunk/bundles/extensions/models/integration-tests/pom.xml
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/models/integration-tests/pom.xml?rev=1770520&r1=1770519&r2=1770520&view=diff
==============================================================================
--- sling/trunk/bundles/extensions/models/integration-tests/pom.xml (original)
+++ sling/trunk/bundles/extensions/models/integration-tests/pom.xml Sat Nov 19 22:09:27 2016
@@ -115,9 +115,13 @@
org.apache.sling.models.it.noclasses,
org.apache.sling.models.it.models,
org.apache.sling.models.it.rtbound,
- org.apache.sling.models.it.rtboundpicker,
- org.apache.sling.models.it.exporter
+ org.apache.sling.models.it.rtboundpicker
</Sling-Model-Packages>
+ <Sling-Model-Classes>
+ org.apache.sling.models.it.exporter.BaseComponent,
+ org.apache.sling.models.it.exporter.ComponentImpl,
+ org.apache.sling.models.it.exporter.ExtendedComponent
+ </Sling-Model-Classes>
<Sling-Test-Regexp>.*Test</Sling-Test-Regexp>
<Export-Package>org.apache.sling.models.it</Export-Package>
</instructions>
@@ -299,7 +303,7 @@
<dependency>
<groupId>org.apache.sling</groupId>
<artifactId>org.apache.sling.models.impl</artifactId>
- <version>1.3.1-SNAPSHOT</version>
+ <version>1.3.3-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
<dependency>