Merge pull request #12 from bosschaert/SLING-9575
SLING-9575 Existing API Regions with factory Pids are not found
diff --git a/src/main/java/org/apache/sling/feature/apiregions/impl/Activator.java b/src/main/java/org/apache/sling/feature/apiregions/impl/Activator.java
index b3a6701..7082979 100644
--- a/src/main/java/org/apache/sling/feature/apiregions/impl/Activator.java
+++ b/src/main/java/org/apache/sling/feature/apiregions/impl/Activator.java
@@ -278,7 +278,7 @@
});
final ServiceRegistration<?> reg = bundleContext.registerService(CFG_LISTENER_CLASS_NAME, msf, null);
// get existing configurations
- final Object result = caListConfigcMethod.invoke(cfgAdmin, "(service.factoryPid= " + FACTORY_PID + ")");
+ final Object result = caListConfigcMethod.invoke(cfgAdmin, "(service.factoryPid=" + FACTORY_PID + ")");
if ( result != null ) {
for(int i=0; i<Array.getLength(result); i++) {
final Object cfg = Array.get(result, i);
diff --git a/src/test/java/org/apache/sling/feature/apiregions/impl/ActivatorTest.java b/src/test/java/org/apache/sling/feature/apiregions/impl/ActivatorTest.java
index 6b0a984..c52b0ce 100644
--- a/src/test/java/org/apache/sling/feature/apiregions/impl/ActivatorTest.java
+++ b/src/test/java/org/apache/sling/feature/apiregions/impl/ActivatorTest.java
@@ -28,12 +28,14 @@
import static org.junit.Assert.assertNull;
import java.io.File;
+import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Dictionary;
import java.util.Hashtable;
import java.util.List;
+import java.util.Map;
import java.util.Properties;
import org.junit.After;
@@ -45,6 +47,7 @@
import org.osgi.framework.Bundle;
import org.osgi.framework.BundleContext;
import org.osgi.framework.FrameworkEvent;
+import org.osgi.framework.ServiceReference;
import org.osgi.framework.ServiceRegistration;
import org.osgi.framework.hooks.resolver.ResolverHookFactory;
import org.osgi.framework.namespace.PackageNamespace;
@@ -53,7 +56,11 @@
import org.osgi.framework.wiring.BundleWiring;
import org.osgi.framework.wiring.FrameworkWiring;
import org.osgi.resource.Requirement;
+import org.osgi.service.cm.Configuration;
+import org.osgi.service.cm.ConfigurationAdmin;
import org.osgi.service.cm.ManagedService;
+import org.osgi.util.tracker.ServiceTracker;
+import org.osgi.util.tracker.ServiceTrackerCustomizer;
public class ActivatorTest {
private Properties savedProps;
@@ -276,4 +283,64 @@
assertEquals(0, req.getAttributes().size());
assertNull(req.getResource());
}
+
+ @SuppressWarnings("unchecked")
+ @Test
+ public void testConfigAdminListener() throws Exception {
+ String i = getClass().getResource("/idbsnver1.properties").toURI().toString();
+ String b = getClass().getResource("/bundles1.properties").toURI().toString();
+ String f = getClass().getResource("/features1.properties").toURI().toString();
+ String r = getClass().getResource("/regions1.properties").toURI().toString();
+
+ BundleContext bc = Mockito.mock(BundleContext.class);
+ Mockito.when(bc.getBundle()).thenReturn(Mockito.mock(Bundle.class));
+ Mockito.when(bc.getProperty(Activator.REGIONS_PROPERTY_NAME)).thenReturn("*");
+ Mockito.when(bc.getProperty(PROPERTIES_RESOURCE_PREFIX + IDBSNVER_FILENAME)).
+ thenReturn(i);
+ Mockito.when(bc.getProperty(PROPERTIES_RESOURCE_PREFIX + BUNDLE_FEATURE_FILENAME)).
+ thenReturn(b);
+ Mockito.when(bc.getProperty(PROPERTIES_RESOURCE_PREFIX + FEATURE_REGION_FILENAME)).
+ thenReturn(f);
+ Mockito.when(bc.getProperty(PROPERTIES_RESOURCE_PREFIX + REGION_PACKAGE_FILENAME)).
+ thenReturn(r);
+
+ ConfigurationAdmin cm = Mockito.mock(ConfigurationAdmin.class);
+ Mockito.when(cm.listConfigurations("(service.factoryPid=org.apache.sling.feature.apiregions.factory)")).
+ thenAnswer(new Answer<Configuration[]>() {
+ @Override
+ public Configuration[] answer(InvocationOnMock invocation) throws Throwable {
+ Dictionary<String, Object> props = new Hashtable<>();
+ props.put("foo", "bar");
+
+ Configuration cfg = Mockito.mock(Configuration.class);
+ Mockito.when(cfg.getPid()).thenReturn("org.apache.sling.feature.apiregions.factory~123");
+ Mockito.when(cfg.getProperties()).thenReturn(props);
+
+ return new Configuration[] {cfg};
+ }
+ });
+
+ ServiceReference<Object> caRef = Mockito.mock(ServiceReference.class);
+ Mockito.when(bc.getService(caRef)).thenReturn(cm);
+
+
+ Activator a = new Activator();
+ a.start(bc);
+ ServiceTracker<Object, Object> st = a.configAdminTracker;
+ Field custField = st.getClass().getDeclaredField("customizer");
+ custField.setAccessible(true);
+
+ @SuppressWarnings("rawtypes")
+ ServiceTrackerCustomizer customizer = (ServiceTrackerCustomizer) custField.get(st);
+
+ Field fcf = a.configuration.getClass().getDeclaredField("factoryConfigs");
+ fcf.setAccessible(true);
+ @SuppressWarnings("rawtypes")
+ Map<String, Dictionary<String, Object>> factoryConfigs = (Map) fcf.get(a.configuration);
+ assertEquals("Precondition", 0, factoryConfigs.size());
+
+ customizer.addingService(caRef);
+ Dictionary<String, Object> dict = factoryConfigs.get("org.apache.sling.feature.apiregions.factory~123");
+ assertEquals("bar", dict.get("foo"));
+ }
}