This is an automated email from the ASF dual-hosted git repository. rombert pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-testing-caconfig-mock-plugin.git
commit 4af96afe75a33100f87ba4774bf96dabab2ee214 Author: Stefan Seifert <[email protected]> AuthorDate: Wed May 24 13:02:55 2017 +0000 SLING-6881 CAConfig Mock Plugin: Register configuration classes via package name git-svn-id: https://svn.apache.org/repos/asf/sling/trunk@1796055 13f79535-47bb-0310-9956-ffa450edef68 --- .../mock/caconfig/ConfigurationMetadataUtil.java | 37 ++++++++++++++++++++-- .../mock/caconfig/MockContextAwareConfig.java | 11 +++++++ .../mock/caconfig/MockContextAwareConfigTest.java | 2 +- 3 files changed, 46 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/apache/sling/testing/mock/caconfig/ConfigurationMetadataUtil.java b/src/main/java/org/apache/sling/testing/mock/caconfig/ConfigurationMetadataUtil.java index a14bf81..d12d9e5 100644 --- a/src/main/java/org/apache/sling/testing/mock/caconfig/ConfigurationMetadataUtil.java +++ b/src/main/java/org/apache/sling/testing/mock/caconfig/ConfigurationMetadataUtil.java @@ -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; diff --git a/src/main/java/org/apache/sling/testing/mock/caconfig/MockContextAwareConfig.java b/src/main/java/org/apache/sling/testing/mock/caconfig/MockContextAwareConfig.java index d5a539b..46e4135 100644 --- a/src/main/java/org/apache/sling/testing/mock/caconfig/MockContextAwareConfig.java +++ b/src/main/java/org/apache/sling/testing/mock/caconfig/MockContextAwareConfig.java @@ -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 MockContextAwareConfig { } /** + * 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 diff --git a/src/test/java/org/apache/sling/testing/mock/caconfig/MockContextAwareConfigTest.java b/src/test/java/org/apache/sling/testing/mock/caconfig/MockContextAwareConfigTest.java index 916b025..da190c2 100644 --- a/src/test/java/org/apache/sling/testing/mock/caconfig/MockContextAwareConfigTest.java +++ b/src/test/java/org/apache/sling/testing/mock/caconfig/MockContextAwareConfigTest.java @@ -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"); -- To stop receiving notification emails like this one, please contact "[email protected]" <[email protected]>.
