SLING-7496 Factory configurations get deleted on update()

The factory prefix was prepended twice which caused the installer to
think that the original configuration being updated was gone, which
triggered a callback to Configuration.delete();
diff --git a/pom.xml b/pom.xml
index c835e26..3ad5109 100644
--- a/pom.xml
+++ b/pom.xml
@@ -90,6 +90,13 @@
         <dependency>
             <groupId>junit</groupId>
             <artifactId>junit</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.mockito</groupId>
+            <artifactId>mockito-core</artifactId>
+            <version>2.15.0</version>
+            <scope>test</scope>
         </dependency>
     </dependencies>
 </project>
diff --git a/src/main/java/org/apache/sling/installer/factories/configuration/impl/ConfigTaskCreator.java b/src/main/java/org/apache/sling/installer/factories/configuration/impl/ConfigTaskCreator.java
index afa7293..6e0845c 100644
--- a/src/main/java/org/apache/sling/installer/factories/configuration/impl/ConfigTaskCreator.java
+++ b/src/main/java/org/apache/sling/installer/factories/configuration/impl/ConfigTaskCreator.java
@@ -106,7 +106,7 @@
             } else {
                 pid = (event.getPid().startsWith(event.getFactoryPid() + '.') ?
                         event.getPid().substring(event.getFactoryPid().length() + 1) : event.getPid());
-                id = event.getFactoryPid() + '.' + event.getPid();
+                id = event.getFactoryPid() + '.' + pid;
             }
             if ( event.getType() == ConfigurationEvent.CM_DELETED ) {
                 final Coordinator.Operation op = Coordinator.SHARED.get(event.getPid(), event.getFactoryPid(), true);
@@ -191,22 +191,7 @@
         final String configPid;
         int n = pid.indexOf('-');
         if (n > 0) {
-            // quick check if this is an existing configuration
-            final String fString = pid.substring(0, n);
-            final String cString = pid.substring(n + 1);
-            boolean useExtendedPid = false;
-            try {
-                if ( ConfigUtil.getConfiguration(this.configAdmin, fString, fString + '.' + cString) != null ) {
-                    useExtendedPid = true;
-                }
-            } catch ( final Exception ignore) {
-                // ignore this
-            }
-            if ( useExtendedPid ) {
-                configPid = fString + '.' + cString;
-            } else {
-                configPid = pid.substring(n + 1);
-            }
+            configPid = pid.substring(n + 1);
             factoryPid = pid.substring(0, n);
         } else {
             factoryPid = null;
diff --git a/src/main/java/org/apache/sling/installer/factories/configuration/impl/ConfigUtil.java b/src/main/java/org/apache/sling/installer/factories/configuration/impl/ConfigUtil.java
index 981d590..a9eba9f 100644
--- a/src/main/java/org/apache/sling/installer/factories/configuration/impl/ConfigUtil.java
+++ b/src/main/java/org/apache/sling/installer/factories/configuration/impl/ConfigUtil.java
@@ -194,6 +194,12 @@
                         + "))");
             }
             if (configs == null || configs.length == 0) {
+                configs = ca.listConfigurations("(&("
+                        + ConfigurationAdmin.SERVICE_FACTORYPID + "=" + encode(factoryPid)
+                        + ")(" + Constants.SERVICE_PID + "=" + encode(factoryPid + "." + configPid)
+                        + "))");
+            }
+            if (configs == null || configs.length == 0) {
                 // check for old style with alias pid
                 configs = ca.listConfigurations(
                         "(&(" + ConfigurationAdmin.SERVICE_FACTORYPID
diff --git a/src/test/java/org/apache/sling/installer/factories/configuration/impl/ConfigUtilTest.java b/src/test/java/org/apache/sling/installer/factories/configuration/impl/ConfigUtilTest.java
index 7ef7ca9..2b0c9a6 100644
--- a/src/test/java/org/apache/sling/installer/factories/configuration/impl/ConfigUtilTest.java
+++ b/src/test/java/org/apache/sling/installer/factories/configuration/impl/ConfigUtilTest.java
@@ -18,14 +18,19 @@
  */
 package org.apache.sling.installer.factories.configuration.impl;
 
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-
 import java.util.Dictionary;
 import java.util.Enumeration;
 import java.util.Hashtable;
 
 import org.junit.Test;
+import org.mockito.Mockito;
+import org.osgi.service.cm.Configuration;
+import org.osgi.service.cm.ConfigurationAdmin;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertSame;
+import static org.junit.Assert.assertTrue;
 
 public class ConfigUtilTest {
 
@@ -105,4 +110,44 @@
         assertTrue(ConfigUtil.isSameData(a, b));
         assertTrue(ConfigUtil.isSameData(b, a));
     }
+
+    @Test public void testGetOrCreateConfiguration() throws Exception {
+        Configuration c1 = Mockito.mock(Configuration.class);
+        Configuration c2 = Mockito.mock(Configuration.class);
+        ConfigurationAdmin cm = Mockito.mock(ConfigurationAdmin.class);
+        Mockito.when(cm.listConfigurations(
+                "(&(service.factoryPid=a.b.c)(service.pid=c1))"))
+                .thenReturn(new Configuration[] {c1});
+        Mockito.when(cm.listConfigurations(
+                "(&(service.factoryPid=a.b.c)(service.pid=a.b.c.c1))"))
+                .thenReturn(new Configuration[] {c2});
+        Configuration cfg = ConfigUtil.getConfiguration(cm, "a.b.c", "c1");
+        assertSame(c1, cfg);
+    }
+
+    @Test public void testGetOrCreateConfigurationFactoryPrefix() throws Exception {
+        Configuration c1 = Mockito.mock(Configuration.class);
+        Configuration c2 = Mockito.mock(Configuration.class);
+        ConfigurationAdmin cm = Mockito.mock(ConfigurationAdmin.class);
+        Mockito.when(cm.listConfigurations(
+                "(&(service.factoryPid=a.b.c)(service.pid=a.b.c.c1))"))
+                .thenReturn(new Configuration[] {c1});
+        Mockito.when(cm.listConfigurations(
+                "(&(service.factoryPid=a.b.c)(org.apache.sling.installer.osgi.factoryaliaspid=c1))"))
+                .thenReturn(new Configuration[] {c2});
+        Configuration cfg = ConfigUtil.getConfiguration(cm, "a.b.c", "c1");
+        assertSame(c1, cfg);
+
+        assertNull(ConfigUtil.getConfiguration(cm, "a.b.c", "c2"));
+    }
+
+    @Test public void testGetOrCreateConfigurationAliasKey() throws Exception {
+        Configuration c1 = Mockito.mock(Configuration.class);
+        ConfigurationAdmin cm = Mockito.mock(ConfigurationAdmin.class);
+        Mockito.when(cm.listConfigurations(
+                "(&(service.factoryPid=a.b.c)(org.apache.sling.installer.osgi.factoryaliaspid=c1))"))
+                .thenReturn(new Configuration[] {c1});
+        Configuration cfg = ConfigUtil.getConfiguration(cm, "a.b.c", "c1");
+        assertSame(c1, cfg);
+    }
 }