SLING-6670 Support CAConfig Impl 1.3.0

git-svn-id: https://svn.apache.org/repos/asf/sling/trunk@1787628 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/pom.xml b/pom.xml
index d8ada57..9164f43 100644
--- a/pom.xml
+++ b/pom.xml
@@ -53,18 +53,21 @@
         <dependency>
             <groupId>org.apache.sling</groupId>
             <artifactId>org.apache.sling.caconfig.api</artifactId>
+            <!-- Stick with dependency version 1.1.0 as it was released with caconfig-mock-plugin 1.0.0 -->
             <version>1.1.0</version>
             <scope>compile</scope>
         </dependency>
         <dependency>
             <groupId>org.apache.sling</groupId>
             <artifactId>org.apache.sling.caconfig.spi</artifactId>
+            <!-- Stick with dependency version 1.2.0 as it was released with caconfig-mock-plugin 1.0.0 -->
             <version>1.2.0</version>
             <scope>compile</scope>
         </dependency>
         <dependency>
             <groupId>org.apache.sling</groupId>
             <artifactId>org.apache.sling.caconfig.impl</artifactId>
+            <!-- Stick with dependency version 1.2.0 as it was released with caconfig-mock-plugin 1.0.0 -->
             <version>1.2.0</version>
             <scope>compile</scope>
         </dependency>
@@ -115,6 +118,56 @@
             </dependencies>
         </profile>
 
+        <!-- Test with Sling CAConfig Impl/SPI 1.2 -->
+        <profile>
+            <id>caconfig-1.2</id>
+            <dependencies>
+                <dependency>
+                    <groupId>org.apache.sling</groupId>
+                    <artifactId>org.apache.sling.caconfig.api</artifactId>
+                    <version>1.1.0</version>
+                    <scope>compile</scope>
+                </dependency>
+                <dependency>
+                    <groupId>org.apache.sling</groupId>
+                    <artifactId>org.apache.sling.caconfig.spi</artifactId>
+                    <version>1.2.0</version>
+                    <scope>compile</scope>
+                </dependency>
+                <dependency>
+                    <groupId>org.apache.sling</groupId>
+                    <artifactId>org.apache.sling.caconfig.impl</artifactId>
+                    <version>1.2.0</version>
+                    <scope>compile</scope>
+                </dependency>
+            </dependencies>
+        </profile>
+
+        <!-- Test with Sling CAConfig Impl/SPI 1.3 -->
+        <profile>
+            <id>caconfig-1.3</id>
+            <dependencies>
+                <dependency>
+                    <groupId>org.apache.sling</groupId>
+                    <artifactId>org.apache.sling.caconfig.api</artifactId>
+                    <version>1.1.0</version>
+                    <scope>compile</scope>
+                </dependency>
+                <dependency>
+                    <groupId>org.apache.sling</groupId>
+                    <artifactId>org.apache.sling.caconfig.spi</artifactId>
+                    <version>1.2.1-SNAPSHOT</version>
+                    <scope>compile</scope>
+                </dependency>
+                <dependency>
+                    <groupId>org.apache.sling</groupId>
+                    <artifactId>org.apache.sling.caconfig.impl</artifactId>
+                    <version>1.2.1-SNAPSHOT</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 dc06a59..6a24e0a 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
@@ -24,7 +24,6 @@
 import org.apache.sling.caconfig.impl.metadata.AnnotationClassConfigurationMetadataProvider;
 import org.apache.sling.caconfig.impl.metadata.ConfigurationMetadataProviderMultiplexer;
 import org.apache.sling.caconfig.management.impl.ConfigurationManagerImpl;
-import org.apache.sling.caconfig.management.impl.ConfigurationPersistenceStrategyMultiplexer;
 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;
@@ -36,7 +35,7 @@
 
 /**
  * Mock context plugins.
- * The plugin supports both 1.0/1.1 and 1.2+ version of the Impl/SPI.
+ * The plugin supports all versions from 1.0 to the most recent versions of the Impl/SPI.
  */
 @ProviderType
 public final class ContextPlugins {
@@ -82,7 +81,7 @@
         
         if (!registerByClassName(context, "org.apache.sling.caconfig.management.impl.ContextPathStrategyMultiplexerImpl")) {
             // fallback to impl 1.1
-            registerByClassName(context, "org.apache.sling.caconfig.resource.impl.ContextPathStrategyMultiplexer");
+            registerByClassName(context, "org.apache.sling.caconfig.resource.impl.ContextPathStrategyMultiplexer", true);
         }
         
         context.registerInjectActivateService(new ConfigurationResourceResolvingStrategyMultiplexer());
@@ -103,7 +102,12 @@
      * @param context Sling context
      */
     private static void registerConfigurationResolver(SlingContextImpl context) {
-        context.registerInjectActivateService(new ConfigurationPersistenceStrategyMultiplexer());
+        
+        if (!registerByClassName(context, "org.apache.sling.caconfig.management.impl.ConfigurationPersistenceStrategyMultiplexerImpl")) {
+            // fallback to impl 1.2
+            registerByClassName(context, "org.apache.sling.caconfig.management.impl.ConfigurationPersistenceStrategyMultiplexer", true);
+        }
+
         context.registerInjectActivateService(new ConfigurationMetadataProviderMultiplexer());
         
         // only required for impl 1.2+
@@ -133,13 +137,22 @@
     }
 
     private static boolean registerByClassName(SlingContextImpl context, String className) {
+        return registerByClassName(context, className, false);
+    }
+
+    private static boolean registerByClassName(SlingContextImpl context, String className, boolean mandatory) {
         try {
             Class<?> clazz = Class.forName(className);
             context.registerInjectActivateService(clazz.newInstance());
             return true;
         }
         catch (ClassNotFoundException ex) {
-            return false;
+            if (mandatory) {
+                throw new RuntimeException(ex.getMessage(), ex);
+            }
+            else {
+                return false;
+            }
         }
         catch (InstantiationException ex) {
             throw new RuntimeException(ex);