Composite Architecture displays internal services.
git-svn-id: https://svn.apache.org/repos/asf/felix/trunk@903326 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/ipojo/composite/src/main/java/org/apache/felix/ipojo/composite/CompositeInstanceDescription.java b/ipojo/composite/src/main/java/org/apache/felix/ipojo/composite/CompositeInstanceDescription.java
index ef085be..f451686 100644
--- a/ipojo/composite/src/main/java/org/apache/felix/ipojo/composite/CompositeInstanceDescription.java
+++ b/ipojo/composite/src/main/java/org/apache/felix/ipojo/composite/CompositeInstanceDescription.java
@@ -18,14 +18,20 @@
*/
package org.apache.felix.ipojo.composite;
+import java.util.Arrays;
+import java.util.List;
+
+import org.apache.felix.ipojo.Factory;
import org.apache.felix.ipojo.ServiceContext;
import org.apache.felix.ipojo.architecture.Architecture;
import org.apache.felix.ipojo.architecture.ComponentTypeDescription;
import org.apache.felix.ipojo.architecture.InstanceDescription;
+import org.apache.felix.ipojo.metadata.Attribute;
import org.apache.felix.ipojo.metadata.Element;
import org.osgi.framework.InvalidSyntaxException;
import org.osgi.framework.ServiceReference;
+
/**
* Composite Instance Description.
*
@@ -68,6 +74,36 @@
return new InstanceDescription[0];
}
+ /**
+ * Gets the list of internally published services.
+ * @return the list of published services.
+ */
+ public Element getInternalServices() {
+ Element services = new Element("services", "");
+ ServiceContext internal = ((CompositeManager) m_instance)
+ .getServiceContext();
+ try {
+ ServiceReference[] refs = internal.getServiceReferences(null, "(!(objectclass=" + Factory.class.getName() + "))");
+ for (int i = 0; refs != null && i < refs.length; i++) {
+ Element svc = new Element("service", "");
+ String[] keys = refs[i].getPropertyKeys();
+ for (int j = 0; j < keys.length; j++) {
+ Object v = refs[i].getProperty(keys[j]);
+ if (v instanceof String[]) {
+ List l = Arrays.asList((String[]) v);
+ svc.addAttribute(new Attribute(keys[j], l.toString()));
+ } else {
+ svc.addAttribute(new Attribute(keys[j], v.toString()));
+ }
+ }
+ services.addElement(svc);
+ }
+
+ } catch (InvalidSyntaxException e) {
+ // Cannot happen
+ }
+ return services;
+ }
/**
* Gets the instance description.
@@ -76,7 +112,8 @@
*/
public Element getDescription() {
Element elem = super.getDescription();
- // Contained instance (exposing architecture) (empty if primitive)
+ elem.addElement(getInternalServices());
+
InstanceDescription[] descs = getContainedInstances();
if (descs.length > 0) {
Element inst = new Element("ContainedInstances", "");
@@ -85,6 +122,7 @@
}
elem.addElement(inst);
}
+
return elem;
}