Merge branch 'SLING-7233'
diff --git a/src/main/java/org/apache/sling/testing/mock/osgi/MapMergeUtil.java b/src/main/java/org/apache/sling/testing/mock/osgi/MapMergeUtil.java
index d690752..d2f71d5 100644
--- a/src/main/java/org/apache/sling/testing/mock/osgi/MapMergeUtil.java
+++ b/src/main/java/org/apache/sling/testing/mock/osgi/MapMergeUtil.java
@@ -78,14 +78,15 @@
// merge with configuration from config admin
if (configAdmin != null) {
- Object pid = metadata.getPID();
- if (pid != null) {
- try {
- Configuration config = configAdmin.getConfiguration(pid.toString());
- mergedProperties.putAll(toMap(config.getProperties()));
- }
- catch (IOException ex) {
- throw new RuntimeException("Unable to read config for pid " + pid, ex);
+ for (String pid : metadata.getConfigurationPID()) {
+ if (pid != null) {
+ try {
+ Configuration config = configAdmin.getConfiguration(pid);
+ mergedProperties.putAll(toMap(config.getProperties()));
+ }
+ catch (IOException ex) {
+ throw new RuntimeException("Unable to read config for pid " + pid, ex);
+ }
}
}
}
diff --git a/src/main/java/org/apache/sling/testing/mock/osgi/OsgiMetadataUtil.java b/src/main/java/org/apache/sling/testing/mock/osgi/OsgiMetadataUtil.java
index a4c5a4b..1fca7a5 100644
--- a/src/main/java/org/apache/sling/testing/mock/osgi/OsgiMetadataUtil.java
+++ b/src/main/java/org/apache/sling/testing/mock/osgi/OsgiMetadataUtil.java
@@ -263,7 +263,20 @@
if (nodes != null && nodes.getLength() > 0) {
return getAttributeValue(nodes.item(0), "name");
}
- return null;
+ return clazz.getName();
+ }
+
+ private static String[] getConfigurationPID(Class clazz, Document metadata) {
+ String value = null;
+ String query = getComponentXPathQuery(clazz);
+ NodeList nodes = queryNodes(metadata, query);
+ if (nodes != null && nodes.getLength() > 0) {
+ value = getAttributeValue(nodes.item(0), "configuration-pid");
+ }
+ if (value == null) {
+ value = getComponentName(clazz, metadata);
+ }
+ return StringUtils.split(value);
}
private static Set<String> getServiceInterfaces(Class clazz, Document metadata) {
@@ -377,6 +390,7 @@
private final Class<?> clazz;
private final String name;
+ private final String[] configurationPID;
private final Set<String> serviceInterfaces;
private final Map<String, Object> properties;
private final List<Reference> references;
@@ -387,6 +401,7 @@
private OsgiMetadata(Class<?> clazz, Document metadataDocument) {
this.clazz = clazz;
this.name = OsgiMetadataUtil.getComponentName(clazz, metadataDocument);
+ this.configurationPID = OsgiMetadataUtil.getConfigurationPID(clazz, metadataDocument);
this.serviceInterfaces = OsgiMetadataUtil.getServiceInterfaces(clazz, metadataDocument);
this.properties = OsgiMetadataUtil.getProperties(clazz, metadataDocument);
this.references = OsgiMetadataUtil.getReferences(clazz, metadataDocument);
@@ -398,6 +413,7 @@
private OsgiMetadata() {
this.clazz = null;
this.name = null;
+ this.configurationPID = null;
this.serviceInterfaces = null;
this.properties = null;
this.references = null;
@@ -422,6 +438,10 @@
return StringUtils.defaultString(pid, name);
}
+ public String[] getConfigurationPID() {
+ return configurationPID;
+ }
+
public Set<String> getServiceInterfaces() {
return serviceInterfaces;
}
diff --git a/src/test/java/org/apache/sling/testing/mock/osgi/MockConfigurationAdminTest.java b/src/test/java/org/apache/sling/testing/mock/osgi/MockConfigurationAdminTest.java
index 857ebb7..187efbd 100644
--- a/src/test/java/org/apache/sling/testing/mock/osgi/MockConfigurationAdminTest.java
+++ b/src/test/java/org/apache/sling/testing/mock/osgi/MockConfigurationAdminTest.java
@@ -69,4 +69,39 @@
assertEquals("org.apache.sling.testing.mock.osgi.OsgiMetadataUtilTest$ServiceWithMetadata", reference.getProperty(Constants.SERVICE_PID));
}
+ @Test
+ public void testConfigurationPID() throws IOException {
+ MockOsgi.setConfigForPid(context.bundleContext(), ServiceWithConfigurationPID.class.getSimpleName(),
+ "prop1", 1);
+
+ context.registerInjectActivateService(new ServiceWithConfigurationPID(), ImmutableMap.<String, Object>builder()
+ .put("prop2", 2)
+ .build());
+
+ ServiceReference reference = context.bundleContext().getServiceReference(Comparable.class.getName());
+
+ assertEquals(1, reference.getProperty("prop1"));
+ assertEquals(2, reference.getProperty("prop2"));
+ }
+
+ @Test
+ public void testMultipleConfigurationPID() throws IOException {
+ MockOsgi.setConfigForPid(context.bundleContext(), "Configuration1",
+ "prop1", 1);
+ MockOsgi.setConfigForPid(context.bundleContext(), "Configuration2",
+ "prop1", 2);
+
+ context.registerInjectActivateService(new ServiceWithMultipleConfigurationPID(), ImmutableMap.<String, Object>builder()
+ .put("prop2", 2)
+ .build());
+
+ ServiceReference reference = context.bundleContext().getServiceReference(Comparable.class.getName());
+
+ assertEquals(2, reference.getProperty("prop1"));
+ assertEquals(2, reference.getProperty("prop2"));
+ }
+
+ static class ServiceWithConfigurationPID {}
+
+ static class ServiceWithMultipleConfigurationPID {}
}
diff --git a/src/test/resources/OSGI-INF/serviceComponents.xml b/src/test/resources/OSGI-INF/serviceComponents.xml
index f173b6b..db1c94a 100644
--- a/src/test/resources/OSGI-INF/serviceComponents.xml
+++ b/src/test/resources/OSGI-INF/serviceComponents.xml
@@ -18,10 +18,10 @@
under the License.
-->
<!-- This file follows the old SCR convention using a fixed name "serviceComponents.xml" -->
-<components xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0">
+<components xmlns:scr="http://www.osgi.org/xmlns/scr/v1.3.0">
<scr:component name="org.apache.sling.testing.mock.osgi.OsgiMetadataUtilTest$ServiceWithMetadata">
<implementation class="org.apache.sling.testing.mock.osgi.OsgiMetadataUtilTest$ServiceWithMetadata"/>
- <service servicefactory="false">
+ <service>
<provide interface="org.apache.sling.models.spi.Injector"/>
<provide interface="org.apache.sling.models.spi.injectorspecific.InjectAnnotationProcessorFactory"/>
<provide interface="java.lang.Comparable"/>
@@ -33,4 +33,18 @@
org.apache.sling.api.resource.ResourceResolver
</property>
</scr:component>
+ <scr:component name="org.apache.sling.testing.mock.osgi.MockConfigurationAdminTest$ServiceWithConfigurationPID"
+ configuration-pid="ServiceWithConfigurationPID">
+ <implementation class="org.apache.sling.testing.mock.osgi.MockConfigurationAdminTest$ServiceWithConfigurationPID"/>
+ <service>
+ <provide interface="java.lang.Comparable"/>
+ </service>
+ </scr:component>
+ <scr:component name="org.apache.sling.testing.mock.osgi.MockConfigurationAdminTest$ServiceWithMultipleConfigurationPID"
+ configuration-pid="Configuration1 Configuration2">
+ <implementation class="org.apache.sling.testing.mock.osgi.MockConfigurationAdminTest$ServiceWithMultipleConfigurationPID"/>
+ <service>
+ <provide interface="java.lang.Comparable"/>
+ </service>
+ </scr:component>
</components>