You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by ss...@apache.org on 2017/05/24 13:02:55 UTC

svn commit: r1796055 - in /sling/trunk/testing/mocks/caconfig-mock-plugin/src: main/java/org/apache/sling/testing/mock/caconfig/ test/java/org/apache/sling/testing/mock/caconfig/

Author: sseifert
Date: Wed May 24 13:02:55 2017
New Revision: 1796055

URL: http://svn.apache.org/viewvc?rev=1796055&view=rev
Log:
SLING-6881 CAConfig Mock Plugin: Register configuration classes via package name

Modified:
    sling/trunk/testing/mocks/caconfig-mock-plugin/src/main/java/org/apache/sling/testing/mock/caconfig/ConfigurationMetadataUtil.java
    sling/trunk/testing/mocks/caconfig-mock-plugin/src/main/java/org/apache/sling/testing/mock/caconfig/MockContextAwareConfig.java
    sling/trunk/testing/mocks/caconfig-mock-plugin/src/test/java/org/apache/sling/testing/mock/caconfig/MockContextAwareConfigTest.java

Modified: sling/trunk/testing/mocks/caconfig-mock-plugin/src/main/java/org/apache/sling/testing/mock/caconfig/ConfigurationMetadataUtil.java
URL: http://svn.apache.org/viewvc/sling/trunk/testing/mocks/caconfig-mock-plugin/src/main/java/org/apache/sling/testing/mock/caconfig/ConfigurationMetadataUtil.java?rev=1796055&r1=1796054&r2=1796055&view=diff
==============================================================================
--- sling/trunk/testing/mocks/caconfig-mock-plugin/src/main/java/org/apache/sling/testing/mock/caconfig/ConfigurationMetadataUtil.java (original)
+++ sling/trunk/testing/mocks/caconfig-mock-plugin/src/main/java/org/apache/sling/testing/mock/caconfig/ConfigurationMetadataUtil.java Wed May 24 13:02:55 2017
@@ -25,6 +25,7 @@ import java.io.IOException;
 import java.io.InputStream;
 import java.net.URL;
 import java.security.cert.X509Certificate;
+import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Dictionary;
 import java.util.Enumeration;
@@ -32,8 +33,11 @@ import java.util.Hashtable;
 import java.util.List;
 import java.util.Map;
 import java.util.Vector;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
 
 import org.apache.commons.lang3.StringUtils;
+import org.apache.sling.caconfig.annotation.Configuration;
 import org.apache.sling.testing.mock.osgi.ManifestScanner;
 import org.apache.sling.testing.mock.osgi.MockOsgi;
 import org.osgi.framework.Bundle;
@@ -42,6 +46,7 @@ import org.osgi.framework.BundleEvent;
 import org.osgi.framework.BundleException;
 import org.osgi.framework.ServiceReference;
 import org.osgi.framework.Version;
+import org.reflections.Reflections;
 
 /**
  * Helper methods for registering Configuration annotation classes from the classpath.
@@ -49,12 +54,16 @@ import org.osgi.framework.Version;
 final class ConfigurationMetadataUtil {
     
     private static final String[] CONFIGURATION_CLASSES_FROM_MANIFEST;
-    
+    private static final ConcurrentMap<String, List<Class>> CONFIGURATION_CLASSES_FOR_PACKAGES = new ConcurrentHashMap<String, List<Class>>();
+        
     static {
+        // suppress log entries from Reflections library
+        Reflections.log = null;
+        
         // scan classpath for configuration classes bundle header entries only once
         CONFIGURATION_CLASSES_FROM_MANIFEST = toArray(ManifestScanner.getValues(CONFIGURATION_CLASSES_HEADER));
     }
-    
+
     private ConfigurationMetadataUtil() {
         // static methods only
     }
@@ -97,7 +106,29 @@ final class ConfigurationMetadataUtil {
         }
     }
     
-
+    /**
+     * Get configuration classes in list of packages (and subpackages), and cache result in static map.
+     * @param packageNames Package names
+     * @return List of classes
+     */
+    public static Collection<Class> getConfigurationClassesForPackages(String packageNames) {
+        List<Class> classes = CONFIGURATION_CLASSES_FOR_PACKAGES.get(packageNames);
+        if (classes == null) {
+            classes = new ArrayList<Class>();
+            String[] packageNameArray = StringUtils.split(packageNames, ",");
+            // add "." to each package name because it's a prefix, not a package name
+            Object[] prefixArray = new Object[packageNameArray.length];
+            for (int i = 0; i < packageNameArray.length; i++) {
+                prefixArray[i] = packageNameArray[i] + ".";
+            }
+            Reflections reflections = new Reflections(prefixArray);
+            classes.addAll(reflections.getTypesAnnotatedWith(Configuration.class));
+            CONFIGURATION_CLASSES_FOR_PACKAGES.putIfAbsent(packageNames, classes);
+        }
+        return classes;
+    }
+    
+    
     private static class RegisterConfigurationMetadataBundle implements Bundle {
         
         private final BundleContext bundleContext;

Modified: sling/trunk/testing/mocks/caconfig-mock-plugin/src/main/java/org/apache/sling/testing/mock/caconfig/MockContextAwareConfig.java
URL: http://svn.apache.org/viewvc/sling/trunk/testing/mocks/caconfig-mock-plugin/src/main/java/org/apache/sling/testing/mock/caconfig/MockContextAwareConfig.java?rev=1796055&r1=1796054&r2=1796055&view=diff
==============================================================================
--- sling/trunk/testing/mocks/caconfig-mock-plugin/src/main/java/org/apache/sling/testing/mock/caconfig/MockContextAwareConfig.java (original)
+++ sling/trunk/testing/mocks/caconfig-mock-plugin/src/main/java/org/apache/sling/testing/mock/caconfig/MockContextAwareConfig.java Wed May 24 13:02:55 2017
@@ -23,6 +23,7 @@ import java.util.Collection;
 import java.util.List;
 import java.util.Map;
 
+import org.apache.commons.lang3.StringUtils;
 import org.apache.sling.api.resource.Resource;
 import org.apache.sling.caconfig.management.ConfigurationManager;
 import org.apache.sling.caconfig.spi.ConfigurationCollectionPersistData;
@@ -60,6 +61,16 @@ public final class MockContextAwareConfi
     }
 
     /**
+     * Search classpath for given class names to scan for and register all classes with @Configuration annotation.
+     * @param context Sling context
+     * @param packageNames Java package names
+     */
+    public static void registerAnnotationPackages(SlingContextImpl context, String... packageNames) {
+        Collection<Class> classes = ConfigurationMetadataUtil.getConfigurationClassesForPackages(StringUtils.join(packageNames, ","));
+        registerAnnotationClasses(context, classes.toArray(new Class[classes.size()]));
+    }
+
+    /**
      * Writes configuration parameters using the primary configured persistence
      * provider.
      * @param context Sling context

Modified: sling/trunk/testing/mocks/caconfig-mock-plugin/src/test/java/org/apache/sling/testing/mock/caconfig/MockContextAwareConfigTest.java
URL: http://svn.apache.org/viewvc/sling/trunk/testing/mocks/caconfig-mock-plugin/src/test/java/org/apache/sling/testing/mock/caconfig/MockContextAwareConfigTest.java?rev=1796055&r1=1796054&r2=1796055&view=diff
==============================================================================
--- sling/trunk/testing/mocks/caconfig-mock-plugin/src/test/java/org/apache/sling/testing/mock/caconfig/MockContextAwareConfigTest.java (original)
+++ sling/trunk/testing/mocks/caconfig-mock-plugin/src/test/java/org/apache/sling/testing/mock/caconfig/MockContextAwareConfigTest.java Wed May 24 13:02:55 2017
@@ -48,7 +48,7 @@ public class MockContextAwareConfigTest
 
     @Before
     public void setUp() {
-        MockContextAwareConfig.registerAnnotationClasses(context, SimpleConfig.class, ListConfig.class);
+        MockContextAwareConfig.registerAnnotationPackages(context, "org.apache.sling.testing.mock.caconfig.example");
 
         context.create().resource("/content/region/site", "sling:configRef", "/conf/region/site");