You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by ro...@apache.org on 2017/11/07 10:17:25 UTC
[sling-org-apache-sling-testing-caconfig-mock-plugin] 05/08:
SLING-6881 CAConfig Mock Plugin: Register configuration classes via package
name
This is an automated email from the ASF dual-hosted git repository.
rombert pushed a commit to annotated tag org.apache.sling.testing.caconfig-mock-plugin-1.3.0
in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-testing-caconfig-mock-plugin.git
commit c7e643de479edbfcd372c64e4050509c586fc986
Author: Stefan Seifert <ss...@apache.org>
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/testing/mocks/caconfig-mock-plugin@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
"commits@sling.apache.org" <co...@sling.apache.org>.