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>