You are viewing a plain text version of this content. The canonical link for it is here.
Posted to scm@geronimo.apache.org by gn...@apache.org on 2009/05/20 17:05:12 UTC

svn commit: r776723 - /geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/container/BlueprintContainerImpl.java

Author: gnodet
Date: Wed May 20 15:05:12 2009
New Revision: 776723

URL: http://svn.apache.org/viewvc?rev=776723&view=rev
Log:
Calling getComponentsMetadata should return all the metadatas, not just the top level ones

Modified:
    geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/container/BlueprintContainerImpl.java

Modified: geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/container/BlueprintContainerImpl.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/container/BlueprintContainerImpl.java?rev=776723&r1=776722&r2=776723&view=diff
==============================================================================
--- geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/container/BlueprintContainerImpl.java (original)
+++ geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/container/BlueprintContainerImpl.java Wed May 20 15:05:12 2009
@@ -72,6 +72,18 @@
 import org.osgi.service.blueprint.reflect.ServiceMetadata;
 import org.osgi.service.blueprint.reflect.ServiceReferenceMetadata;
 import org.osgi.service.blueprint.reflect.Target;
+import org.osgi.service.blueprint.reflect.Metadata;
+import org.osgi.service.blueprint.reflect.BeanArgument;
+import org.osgi.service.blueprint.reflect.BeanProperty;
+import org.osgi.service.blueprint.reflect.ValueMetadata;
+import org.osgi.service.blueprint.reflect.CollectionMetadata;
+import org.osgi.service.blueprint.reflect.MapMetadata;
+import org.osgi.service.blueprint.reflect.MapEntry;
+import org.osgi.service.blueprint.reflect.PropsMetadata;
+import org.osgi.service.blueprint.reflect.RefCollectionMetadata;
+import org.osgi.service.blueprint.reflect.Listener;
+import org.osgi.service.blueprint.reflect.ReferenceMetadata;
+import org.osgi.service.blueprint.reflect.RegistrationListener;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -582,7 +594,6 @@
             ExecutionContext.setContext(new DefaultExecutionContext(conversionService, instantiator.getRepository()));
         }
         try {
-            // TODO: right now this only returns top-level services
             for (ServiceMetadata service : getExportedServicesMetadata()) {
                 // Trigger services are only created for services without listeners and explicitly defined interface classes
                 if (service.getRegistrationListeners().isEmpty() && !service.getInterfaceNames().isEmpty()) {
@@ -670,13 +681,63 @@
         List<T> metadatas = new ArrayList<T>();
         for (String name : componentDefinitionRegistry.getComponentDefinitionNames()) {
             ComponentMetadata component = componentDefinitionRegistry.getComponentDefinition(name);
-            if (clazz.isInstance(component)) {
-                metadatas.add(clazz.cast(component));
-            }
+            getComponentsMetadata(clazz, component, metadatas);
         }
         metadatas = Collections.unmodifiableList(metadatas);
         return metadatas;
+    }
 
+    private <T extends ComponentMetadata> void getComponentsMetadata(Class<T> clazz, Metadata component, List<T> metadatas) {
+        if (component == null) {
+            return;
+        }
+        if (clazz.isInstance(component)) {
+            metadatas.add(clazz.cast(component));
+        }
+        if (component instanceof BeanMetadata) {
+            getComponentsMetadata(clazz, ((BeanMetadata) component).getFactoryComponent(), metadatas);
+            for (BeanArgument arg : ((BeanMetadata) component).getArguments()) {
+                getComponentsMetadata(clazz, arg.getValue(), metadatas);
+            }
+            for (BeanProperty prop : ((BeanMetadata) component).getProperties()) {
+                getComponentsMetadata(clazz, prop.getValue(), metadatas);
+            }
+        }
+        if (component instanceof CollectionMetadata) {
+            for (Metadata m : ((CollectionMetadata) component).getValues()) {
+                getComponentsMetadata(clazz, m, metadatas);
+            }
+        }
+        if (component instanceof MapMetadata) {
+            for (MapEntry m : ((MapMetadata) component).getEntries()) {
+                getComponentsMetadata(clazz, m.getKey(), metadatas);
+                getComponentsMetadata(clazz, m.getValue(), metadatas);
+            }
+        }
+        if (component instanceof PropsMetadata) {
+            for (MapEntry m : ((PropsMetadata) component).getEntries()) {
+                getComponentsMetadata(clazz, m.getKey(), metadatas);
+                getComponentsMetadata(clazz, m.getValue(), metadatas);
+            }
+        }
+        if (component instanceof ServiceReferenceMetadata) {
+            for (Listener l : ((ServiceReferenceMetadata) component).getServiceListeners()) {
+                getComponentsMetadata(clazz, l.getListenerComponent(), metadatas);
+            }
+        }
+        if (component instanceof RefCollectionMetadata) {
+            getComponentsMetadata(clazz, ((RefCollectionMetadata) component).getComparator(), metadatas);
+        }
+        if (component instanceof ServiceMetadata) {
+            getComponentsMetadata(clazz, ((ServiceMetadata) component).getServiceComponent(), metadatas);
+            for (MapEntry m : ((ServiceMetadata) component).getServiceProperties()) {
+                getComponentsMetadata(clazz, m.getKey(), metadatas);
+                getComponentsMetadata(clazz, m.getValue(), metadatas);
+            }
+            for (RegistrationListener l : ((ServiceMetadata) component).getRegistrationListeners()) {
+                getComponentsMetadata(clazz, l.getListenerComponent(), metadatas);
+            }
+        }
     }
 
     protected Repository getRepository() {