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.0.0 in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-testing-caconfig-mock-plugin.git
commit 92df07f4bce9bdf5ab59927a554217d0a73aabc3 Author: Stefan Seifert <[email protected]> AuthorDate: Tue Dec 6 11:33:47 2016 +0000 SLING-6360 support both impl 1.1 und 1.2 git-svn-id: https://svn.apache.org/repos/asf/sling/trunk/contrib/extensions/contextaware-config/testing/mocks/caconfig-mock-plugin@1772869 13f79535-47bb-0310-9956-ffa450edef68 --- pom.xml | 29 ++++ .../testing/mock/caconfig/ContextPlugins.java | 188 ++++++++++++--------- .../testing/mock/caconfig/ContextPluginsTest.java | 44 ++++- 3 files changed, 175 insertions(+), 86 deletions(-) diff --git a/pom.xml b/pom.xml index e061212..6208b00 100644 --- a/pom.xml +++ b/pom.xml @@ -87,5 +87,34 @@ <scope>compile</scope> </dependency> </dependencies> + + <profiles> + + <!-- Test with Sling CAConfig Impl/SPI 1.1 --> + <profile> + <id>caconfig-1.1</id> + <dependencies> + <dependency> + <groupId>org.apache.sling</groupId> + <artifactId>org.apache.sling.caconfig.api</artifactId> + <version>1.0.0</version> + <scope>compile</scope> + </dependency> + <dependency> + <groupId>org.apache.sling</groupId> + <artifactId>org.apache.sling.caconfig.spi</artifactId> + <version>1.1.0</version> + <scope>compile</scope> + </dependency> + <dependency> + <groupId>org.apache.sling</groupId> + <artifactId>org.apache.sling.caconfig.impl</artifactId> + <version>1.1.0</version> + <scope>compile</scope> + </dependency> + </dependencies> + </profile> + + </profiles> </project> diff --git a/src/main/java/org/apache/sling/testing/mock/caconfig/ContextPlugins.java b/src/main/java/org/apache/sling/testing/mock/caconfig/ContextPlugins.java index d2b908d..3df9aad 100644 --- a/src/main/java/org/apache/sling/testing/mock/caconfig/ContextPlugins.java +++ b/src/main/java/org/apache/sling/testing/mock/caconfig/ContextPlugins.java @@ -19,16 +19,12 @@ package org.apache.sling.testing.mock.caconfig; import org.apache.sling.caconfig.impl.ConfigurationBuilderAdapterFactory; -import org.apache.sling.caconfig.impl.ConfigurationInheritanceStrategyMultiplexer; import org.apache.sling.caconfig.impl.ConfigurationResolverImpl; -import org.apache.sling.caconfig.impl.def.DefaultConfigurationInheritanceStrategy; import org.apache.sling.caconfig.impl.def.DefaultConfigurationPersistenceStrategy; import org.apache.sling.caconfig.impl.metadata.AnnotationClassConfigurationMetadataProvider; import org.apache.sling.caconfig.impl.metadata.ConfigurationMetadataProviderMultiplexer; -import org.apache.sling.caconfig.impl.override.ConfigurationOverrideManager; import org.apache.sling.caconfig.management.impl.ConfigurationManagerImpl; import org.apache.sling.caconfig.management.impl.ConfigurationPersistenceStrategyMultiplexer; -import org.apache.sling.caconfig.management.impl.ContextPathStrategyMultiplexerImpl; import org.apache.sling.caconfig.resource.impl.ConfigurationResourceResolverImpl; import org.apache.sling.caconfig.resource.impl.ConfigurationResourceResolvingStrategyMultiplexer; import org.apache.sling.caconfig.resource.impl.def.DefaultConfigurationResourceResolvingStrategy; @@ -40,88 +36,118 @@ import org.osgi.annotation.versioning.ProviderType; /** * Mock context plugins. + * The plugin supports both 1.0/1.1 and 1.2+ version of the Impl/SPI. */ @ProviderType public final class ContextPlugins { - private ContextPlugins() { - // constants only - } - - /** - * Context plugin for Sling Context-Aware Configuration. - */ - public static final ContextPlugin<? extends SlingContextImpl> CACONFIG = new AbstractContextPlugin<SlingContextImpl>() { - @Override - public void afterSetUp(SlingContextImpl context) throws Exception { - registerConfigurationResourceResolver(context); - registerConfigurationResolver(context); - registerConfigurationManagement(context); - registerConfigurationResourceResolverDefaultImpl(context); - registerConfigurationResolverDefaultImpl(context); + private ContextPlugins() { + // constants only + } + + /** + * Context plugin for Sling Context-Aware Configuration. + */ + public static final ContextPlugin<? extends SlingContextImpl> CACONFIG = new AbstractContextPlugin<SlingContextImpl>() { + @Override + public void afterSetUp(SlingContextImpl context) throws Exception { + registerConfigurationResourceResolver(context); + registerConfigurationResolver(context); + registerConfigurationManagement(context); + registerConfigurationResourceResolverDefaultImpl(context); + registerConfigurationResolverDefaultImpl(context); + + // Scan MANIFEST.MF in the classpath and automatically register all Configuration annotation classes found. + ConfigurationMetadataUtil.addAnnotationClassesForManifestEntries(context.bundleContext()); + } + }; + + /** + * Context plugin for Sling Context-Aware Configuration (without the default implementations). + */ + public static final ContextPlugin<? extends SlingContextImpl> CACONFIG_NODEF = new AbstractContextPlugin<SlingContextImpl>() { + @Override + public void afterSetUp(SlingContextImpl context) throws Exception { + registerConfigurationResourceResolver(context); + registerConfigurationResolver(context); + registerConfigurationManagement(context); + } + }; + + /** + * Register all services for ConfigurationResourceResolver (without the default implementations). + * @param context Sling context + */ + private static void registerConfigurationResourceResolver(SlingContextImpl context) { + + if (!registerByClassName(context, "org.apache.sling.caconfig.management.impl.ContextPathStrategyMultiplexerImpl")) { + // fallback to impl 1.1 + registerByClassName(context, "org.apache.sling.caconfig.resource.impl.ContextPathStrategyMultiplexer"); + } - // Scan MANIFEST.MF in the classpath and automatically register all Configuration annotation classes found. - ConfigurationMetadataUtil.addAnnotationClassesForManifestEntries(context.bundleContext()); + context.registerInjectActivateService(new ConfigurationResourceResolvingStrategyMultiplexer()); + context.registerInjectActivateService(new ConfigurationResourceResolverImpl()); } - }; - - /** - * Context plugin for Sling Context-Aware Configuration (without the default implentations). - */ - public static final ContextPlugin<? extends SlingContextImpl> CACONFIG_NODEF = new AbstractContextPlugin<SlingContextImpl>() { - @Override - public void afterSetUp(SlingContextImpl context) throws Exception { - registerConfigurationResourceResolver(context); - registerConfigurationResolver(context); - registerConfigurationManagement(context); + + /** + * Register default implementations for for ConfigurationResourceResolver. + * @param context Sling context + */ + private static void registerConfigurationResourceResolverDefaultImpl(SlingContextImpl context) { + context.registerInjectActivateService(new DefaultContextPathStrategy()); + context.registerInjectActivateService(new DefaultConfigurationResourceResolvingStrategy()); } - }; - - /** - * Register all services for ConfigurationResourceResolver (without the default implementations). - * @param context Sling context - */ - private static void registerConfigurationResourceResolver(SlingContextImpl context) { - context.registerInjectActivateService(new ContextPathStrategyMultiplexerImpl()); - context.registerInjectActivateService(new ConfigurationResourceResolvingStrategyMultiplexer()); - context.registerInjectActivateService(new ConfigurationResourceResolverImpl()); - } - - /** - * Register default implementations for for ConfigurationResourceResolver. - * @param context Sling context - */ - private static void registerConfigurationResourceResolverDefaultImpl(SlingContextImpl context) { - context.registerInjectActivateService(new DefaultContextPathStrategy()); - context.registerInjectActivateService(new DefaultConfigurationResourceResolvingStrategy()); - } - - - /** - * Register all services for ConfigurationResolver (without the default implementations). - * @param context Sling context - */ - private static void registerConfigurationResolver(SlingContextImpl context) { - context.registerInjectActivateService(new ConfigurationPersistenceStrategyMultiplexer()); - context.registerInjectActivateService(new ConfigurationInheritanceStrategyMultiplexer()); - context.registerInjectActivateService(new ConfigurationOverrideManager()); - context.registerInjectActivateService(new ConfigurationResolverImpl()); - context.registerInjectActivateService(new ConfigurationBuilderAdapterFactory()); - } - - /** - * Register default implementations for for ConfigurationResolver. - * @param context Sling context - */ - private static void registerConfigurationResolverDefaultImpl(SlingContextImpl context) { - context.registerInjectActivateService(new DefaultConfigurationPersistenceStrategy()); - context.registerInjectActivateService(new DefaultConfigurationInheritanceStrategy()); - } - - private static void registerConfigurationManagement(SlingContextImpl context) { - context.registerInjectActivateService(new ConfigurationMetadataProviderMultiplexer()); - context.registerInjectActivateService(new ConfigurationManagerImpl()); - context.registerInjectActivateService(new AnnotationClassConfigurationMetadataProvider()); - } - + + /** + * Register all services for ConfigurationResolver (without the default implementations). + * @param context Sling context + */ + private static void registerConfigurationResolver(SlingContextImpl context) { + context.registerInjectActivateService(new ConfigurationPersistenceStrategyMultiplexer()); + + // only required for impl 1.2+ + registerByClassName(context, "org.apache.sling.caconfig.impl.ConfigurationInheritanceStrategyMultiplexer"); + + // only required for impl 1.2+ + registerByClassName(context, "org.apache.sling.caconfig.impl.override.ConfigurationOverrideManager"); + + context.registerInjectActivateService(new ConfigurationResolverImpl()); + context.registerInjectActivateService(new ConfigurationBuilderAdapterFactory()); + } + + /** + * Register default implementations for for ConfigurationResolver. + * @param context Sling context + */ + private static void registerConfigurationResolverDefaultImpl(SlingContextImpl context) { + context.registerInjectActivateService(new DefaultConfigurationPersistenceStrategy()); + + // only required for impl 1.2+ + registerByClassName(context,"org.apache.sling.caconfig.impl.def.DefaultConfigurationInheritanceStrategy"); + } + + private static void registerConfigurationManagement(SlingContextImpl context) { + context.registerInjectActivateService(new ConfigurationMetadataProviderMultiplexer()); + context.registerInjectActivateService(new ConfigurationManagerImpl()); + context.registerInjectActivateService(new AnnotationClassConfigurationMetadataProvider()); + } + + private static boolean registerByClassName(SlingContextImpl context, String className) { + try { + Class<?> clazz = Class.forName(className); + context.registerInjectActivateService(clazz.newInstance()); + return true; + } + catch (ClassNotFoundException ex) { + return false; + } + catch (InstantiationException ex) { + throw new RuntimeException(ex); + } + catch (IllegalAccessException ex) { + throw new RuntimeException(ex); + } + + } + } diff --git a/src/test/java/org/apache/sling/testing/mock/caconfig/ContextPluginsTest.java b/src/test/java/org/apache/sling/testing/mock/caconfig/ContextPluginsTest.java index 2a69ebd..7f4c127 100644 --- a/src/test/java/org/apache/sling/testing/mock/caconfig/ContextPluginsTest.java +++ b/src/test/java/org/apache/sling/testing/mock/caconfig/ContextPluginsTest.java @@ -22,11 +22,13 @@ import static org.apache.sling.testing.mock.caconfig.ContextPlugins.CACONFIG; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; +import java.lang.reflect.Method; +import java.util.Map; + import org.apache.sling.api.resource.Resource; import org.apache.sling.api.resource.ValueMap; import org.apache.sling.caconfig.ConfigurationBuilder; import org.apache.sling.caconfig.management.ConfigurationManager; -import org.apache.sling.caconfig.spi.ConfigurationPersistData; import org.apache.sling.testing.mock.caconfig.example.SimpleConfig; import org.apache.sling.testing.mock.sling.junit.SlingContext; import org.apache.sling.testing.mock.sling.junit.SlingContextBuilder; @@ -54,12 +56,44 @@ public class ContextPluginsTest { MockContextAwareConfig.registerAnnotationClasses(context.bundleContext(), SimpleConfig.class); // write config - ConfigurationManager configManager = context.getService(ConfigurationManager.class); - configManager.persistConfiguration(contextResource, CONFIG_NAME, - new ConfigurationPersistData(ImmutableMap.<String, Object>of( + writeConfig(contextResource, CONFIG_NAME, ImmutableMap.<String, Object>of( "stringParam", "value1", "intParam", 123, - "boolParam", true))); + "boolParam", true)); + } + + /** + * Write configuration for impl 1.2 + */ + private void writeConfig(Resource contextResource, String configName, Map<String,Object> props) { + try { + Class<?> configurationPersistDataClass; + try { + configurationPersistDataClass = Class.forName("org.apache.sling.caconfig.spi.ConfigurationPersistData"); + } + catch (ClassNotFoundException e) { + // fallback to caconfig impl 1.1 + writeConfigImpl11(contextResource, configName, props); + return; + } + + Object persistData = configurationPersistDataClass.getConstructor(Map.class).newInstance(props); + ConfigurationManager configManager = context.getService(ConfigurationManager.class); + Method persistMethod = ConfigurationManager.class.getMethod("persistConfiguration", Resource.class, String.class, configurationPersistDataClass); + persistMethod.invoke(configManager, contextResource, configName, persistData); + } + catch (Exception ex) { + throw new RuntimeException(ex); + } + } + + /** + * Fallback: Write configuration for impl 1.1 + */ + private void writeConfigImpl11(Resource contextResource, String configName, Map<String,Object> props) throws Exception { + ConfigurationManager configManager = context.getService(ConfigurationManager.class); + Method persistMethod = ConfigurationManager.class.getMethod("persist", Resource.class, String.class, Map.class); + persistMethod.invoke(configManager, contextResource, configName, props); } @Test -- To stop receiving notification emails like this one, please contact "[email protected]" <[email protected]>.
