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;
     }