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/06/09 15:11:28 UTC

svn commit: r782992 - in /geronimo/sandbox/blueprint: blueprint-cm/src/main/java/org/apache/geronimo/blueprint/compendium/cm/ blueprint-core/src/main/java/org/apache/geronimo/blueprint/container/ blueprint-core/src/main/java/org/apache/geronimo/bluepri...

Author: gnodet
Date: Tue Jun  9 13:11:27 2009
New Revision: 782992

URL: http://svn.apache.org/viewvc?rev=782992&view=rev
Log:
Fix various problems mostly with references and services

Modified:
    geronimo/sandbox/blueprint/blueprint-cm/src/main/java/org/apache/geronimo/blueprint/compendium/cm/CmNamespaceHandler.java
    geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/container/AbstractServiceReferenceRecipe.java
    geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/container/BlueprintContainerImpl.java
    geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/container/Parser.java
    geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/container/RecipeBuilder.java
    geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/container/RefListRecipe.java
    geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/container/ReferenceRecipe.java
    geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/container/ServiceListener.java
    geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/container/ServiceRecipe.java
    geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/di/DefaultExecutionContext.java
    geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/di/ExecutionContext.java
    geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/ext/AbstractPropertyPlaceholder.java
    geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/ext/ExtNamespaceHandler.java
    geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/ext/PlaceholdersUtils.java
    geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/ext/PropertyPlaceholder.java
    geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/mutable/MutableRefListMetadata.java
    geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/mutable/MutableServiceReferenceMetadata.java
    geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/namespace/ComponentDefinitionRegistryImpl.java
    geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/reflect/ComponentMetadataImpl.java
    geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/reflect/RefListMetadataImpl.java
    geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/utils/ConversionUtils.java
    geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/utils/DynamicCollection.java
    geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/utils/ReflectionUtils.java
    geronimo/sandbox/blueprint/blueprint-core/src/main/resources/org/apache/geronimo/blueprint/blueprint.xsd
    geronimo/sandbox/blueprint/blueprint-core/src/test/java/org/apache/geronimo/blueprint/TestBlueprintContainer.java
    geronimo/sandbox/blueprint/blueprint-core/src/test/java/org/apache/geronimo/blueprint/WiringTest.java

Modified: geronimo/sandbox/blueprint/blueprint-cm/src/main/java/org/apache/geronimo/blueprint/compendium/cm/CmNamespaceHandler.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/blueprint/blueprint-cm/src/main/java/org/apache/geronimo/blueprint/compendium/cm/CmNamespaceHandler.java?rev=782992&r1=782991&r2=782992&view=diff
==============================================================================
--- geronimo/sandbox/blueprint/blueprint-cm/src/main/java/org/apache/geronimo/blueprint/compendium/cm/CmNamespaceHandler.java (original)
+++ geronimo/sandbox/blueprint/blueprint-cm/src/main/java/org/apache/geronimo/blueprint/compendium/cm/CmNamespaceHandler.java Tue Jun  9 13:11:27 2009
@@ -380,11 +380,14 @@
         metadata.addProperty("configAdmin", createRef(context, CONFIG_ADMIN_REFERENCE_NAME));
         metadata.addProperty("managedObjectManager", createRef(context, MANAGED_OBJECT_MANAGER_NAME));
         metadata.addProperty("persistentId", createValue(context, persistentId));
-        if (element.hasAttribute(UPDATE_STRATEGY_ATTRIBUTE)) {
-            metadata.addProperty("updateStrategy", createValue(context, element.getAttribute(UPDATE_STRATEGY_ATTRIBUTE)));
+        String updateStrategy = element.getAttribute(UPDATE_STRATEGY_ATTRIBUTE);
+        if (updateStrategy != null) {
+            metadata.addProperty("updateStrategy", createValue(context, updateStrategy));
         }
         if (element.hasAttribute(UPDATE_METHOD_ATTRIBUTE)) {
             metadata.addProperty("updateMethod", createValue(context, element.getAttribute(UPDATE_METHOD_ATTRIBUTE)));
+        } else if ("component-managed".equals(updateStrategy)) {
+            throw new ComponentDefinitionException(UPDATE_METHOD_ATTRIBUTE + " attribute must be set when " + UPDATE_STRATEGY_ATTRIBUTE + " is set to 'component-managed'");
         }
         metadata.addProperty("beanName", createIdRef(context, component.getId()));
         context.getComponentDefinitionRegistry().registerComponentDefinition(metadata);

Modified: geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/container/AbstractServiceReferenceRecipe.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/container/AbstractServiceReferenceRecipe.java?rev=782992&r1=782991&r2=782992&view=diff
==============================================================================
--- geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/container/AbstractServiceReferenceRecipe.java (original)
+++ geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/container/AbstractServiceReferenceRecipe.java Tue Jun  9 13:11:27 2009
@@ -18,19 +18,20 @@
  */
 package org.apache.geronimo.blueprint.container;
 
+import java.lang.reflect.InvocationHandler;
 import java.lang.reflect.Method;
 import java.lang.reflect.Proxy;
-import java.lang.reflect.InvocationHandler;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
+import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
-import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.Callable;
+import java.util.concurrent.atomic.AtomicBoolean;
 
 import net.sf.cglib.proxy.Dispatcher;
 import net.sf.cglib.proxy.Enhancer;
@@ -67,6 +68,7 @@
     protected final ExtendedBlueprintContainer blueprintContainer;
     protected final ServiceReferenceMetadata metadata;
     protected final Recipe listenersRecipe;
+    protected final List<Recipe> explicitDependencies;
     protected final ClassLoader proxyClassLoader;
     protected final boolean optional;
     /** The OSGi filter for tracking references */
@@ -83,12 +85,14 @@
     protected AbstractServiceReferenceRecipe(String name,
                                              ExtendedBlueprintContainer blueprintContainer,
                                              ServiceReferenceMetadata metadata,
-                                             Recipe listenersRecipe) {
+                                             Recipe listenersRecipe,
+                                             List<Recipe> explicitDependencies) {
         super(name);
         this.prototype = false;
         this.blueprintContainer = blueprintContainer;
         this.metadata = metadata;
         this.listenersRecipe = listenersRecipe;
+        this.explicitDependencies = explicitDependencies;
         // Create a ClassLoader delegating to the bundle, but also being able to see our bundle classes
         // so that the created proxy can access cglib classes.
         this.proxyClassLoader = new BundleDelegatingClassLoader(blueprintContainer.getBundleContext().getBundle(),
@@ -125,7 +129,11 @@
         if (started.compareAndSet(true, false)) {
             synchronized (references) {
                 blueprintContainer.getBundleContext().removeServiceListener(this);
-                references.clear();
+                for (Iterator<ServiceReference> it = references.iterator(); it.hasNext();) {
+                    ServiceReference ref = it.next();
+                    it.remove();
+                    untrack(ref);
+                }
                 satisfied.set(false);
             }
         }
@@ -145,6 +153,9 @@
         if (listenersRecipe != null) {
             recipes.add(listenersRecipe);
         }
+        if (explicitDependencies != null) {
+            recipes.addAll(explicitDependencies);
+        }
         return recipes;
     }
 

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=782992&r1=782991&r2=782992&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 Tue Jun  9 13:11:27 2009
@@ -70,7 +70,6 @@
 import org.osgi.service.blueprint.reflect.MapMetadata;
 import org.osgi.service.blueprint.reflect.Metadata;
 import org.osgi.service.blueprint.reflect.PropsMetadata;
-import org.osgi.service.blueprint.reflect.RefListMetadata;
 import org.osgi.service.blueprint.reflect.RefMetadata;
 import org.osgi.service.blueprint.reflect.RegistrationListener;
 import org.osgi.service.blueprint.reflect.ServiceMetadata;
@@ -246,7 +245,7 @@
                         break;
                     }
                     case Populated:
-                        instantiator = new BlueprintObjectInstantiator(this, new RecipeBuilder(this).createRepository());
+                        getInstantiator();
                         trackServiceReferences();
                         Runnable r = new Runnable() {
                             public void run() {
@@ -288,7 +287,7 @@
                     case Create:
                         timeoutFuture.cancel(false);
                         registerServices();
-                        instantiateEagerSingletonBeans();
+                        instantiateEagerComponents();
 
                         // Register the BlueprintContainer in the OSGi registry
                         if (registration == null) {
@@ -320,6 +319,13 @@
         }
     }
 
+    protected BlueprintObjectInstantiator getInstantiator() throws Exception {
+        if (instantiator == null) {
+            instantiator = new BlueprintObjectInstantiator(this, new RecipeBuilder(this).createRepository());
+        }
+        return instantiator;
+    }
+
     private void processTypeConverters() throws Exception {
         List<String> typeConverters = new ArrayList<String>();
         for (Target target : componentDefinitionRegistry.getTypeConverters()) {
@@ -437,9 +443,7 @@
     public void notifySatisfaction(SatisfiableRecipe satisfiable) {
         LOGGER.debug("Notified satisfaction {} in bundle {}: {}",
                 new Object[] { satisfiable.getName(), bundleContext.getBundle().getSymbolicName(), satisfiable.isSatisfied() });
-        if (state == State.WaitForInitialReferences) {
-            schedule();
-        } else if (state == State.Created) {
+        if (state == State.Create || state == State.Created ) {
             Map<String, List<SatisfiableRecipe>> dependencies = getSatisfiableDependenciesMap();
             for (String name : dependencies.keySet()) {
                 ComponentMetadata metadata = componentDefinitionRegistry.getComponentDefinition(name);
@@ -463,10 +467,12 @@
                     }
                 }
             }
+        } else {
+            schedule();
         }
     }
 
-    private void instantiateEagerSingletonBeans() {
+    private void instantiateEagerComponents() {
         List<String> components = new ArrayList<String>();
         for (String name : componentDefinitionRegistry.getComponentDefinitionNames()) {
             ComponentMetadata component = componentDefinitionRegistry.getComponentDefinition(name);

Modified: geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/container/Parser.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/container/Parser.java?rev=782992&r1=782991&r2=782992&view=diff
==============================================================================
--- geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/container/Parser.java (original)
+++ geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/container/Parser.java Tue Jun  9 13:11:27 2009
@@ -23,11 +23,11 @@
 import java.net.URI;
 import java.net.URL;
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.Collections;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
-import java.util.Collection;
 
 import javax.xml.XMLConstants;
 import javax.xml.parsers.DocumentBuilder;
@@ -74,6 +74,7 @@
 import org.osgi.service.blueprint.reflect.BeanProperty;
 import org.osgi.service.blueprint.reflect.CollectionMetadata;
 import org.osgi.service.blueprint.reflect.ComponentMetadata;
+import org.osgi.service.blueprint.reflect.IdRefMetadata;
 import org.osgi.service.blueprint.reflect.Listener;
 import org.osgi.service.blueprint.reflect.MapEntry;
 import org.osgi.service.blueprint.reflect.MapMetadata;
@@ -82,14 +83,13 @@
 import org.osgi.service.blueprint.reflect.NullMetadata;
 import org.osgi.service.blueprint.reflect.PropsMetadata;
 import org.osgi.service.blueprint.reflect.RefListMetadata;
+import org.osgi.service.blueprint.reflect.RefMetadata;
+import org.osgi.service.blueprint.reflect.ReferenceMetadata;
 import org.osgi.service.blueprint.reflect.RegistrationListener;
 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.IdRefMetadata;
-import org.osgi.service.blueprint.reflect.RefMetadata;
 import org.osgi.service.blueprint.reflect.ValueMetadata;
-import org.osgi.service.blueprint.reflect.ReferenceMetadata;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.xml.sax.InputSource;
@@ -791,8 +791,19 @@
         if (element.hasAttribute(REF_ATTRIBUTE)) {
             listenerComponent = new RefMetadataImpl(element.getAttribute(REF_ATTRIBUTE));
         }
-        String registrationMethod = element.getAttribute(REGISTRATION_METHOD_ATTRIBUTE);
-        String unregistrationMethod = element.getAttribute(UNREGISTRATION_METHOD_ATTRIBUTE);
+        String registrationMethod = null;
+        if (element.hasAttribute(REGISTRATION_METHOD_ATTRIBUTE)) {
+            registrationMethod = element.getAttribute(REGISTRATION_METHOD_ATTRIBUTE);
+            listener.setRegistrationMethodName(registrationMethod);
+        }
+        String unregistrationMethod = null;
+        if (element.hasAttribute(UNREGISTRATION_METHOD_ATTRIBUTE)) {
+            unregistrationMethod = element.getAttribute(UNREGISTRATION_METHOD_ATTRIBUTE);
+            listener.setUnregistrationMethodName(unregistrationMethod);
+        }
+        if (registrationMethod == null && unregistrationMethod == null) {
+            throw new ComponentDefinitionException("One of " + REGISTRATION_METHOD_ATTRIBUTE + " or " + UNREGISTRATION_METHOD_ATTRIBUTE + " must be set");
+        }
         // Parse elements
         NodeList nl = element.getChildNodes();
         for (int i = 0; i < nl.getLength(); i++) {
@@ -837,14 +848,6 @@
             throw new ComponentDefinitionException("One of " + REF_ATTRIBUTE + " attribute, " + REF_ELEMENT + ", " + BEAN_ELEMENT + ", " + REFERENCE_ELEMENT + ", " + SERVICE_ELEMENT + " or custom element must be set");
         }
         listener.setListenerComponent((Target) listenerComponent);
-        if (registrationMethod == null || registrationMethod.length() == 0) {
-            throw new ComponentDefinitionException("Attribute " + REGISTRATION_METHOD_ATTRIBUTE + " must be set");
-        }
-        listener.setRegistrationMethodName(registrationMethod);
-        if (unregistrationMethod == null || unregistrationMethod.length() == 0) {
-            throw new ComponentDefinitionException("Attribute " + UNREGISTRATION_METHOD_ATTRIBUTE + " must be set");
-        }
-        listener.setUnregistrationMethodName(unregistrationMethod);
         return listener;
     }
 
@@ -959,8 +962,19 @@
         if (element.hasAttribute(REF_ATTRIBUTE)) {
             listenerComponent = new RefMetadataImpl(element.getAttribute(REF_ATTRIBUTE));
         }
-        listener.setBindMethodName(element.getAttribute(BIND_METHOD_ATTRIBUTE));
-        listener.setUnbindMethodName(element.getAttribute(UNBIND_METHOD_ATTRIBUTE));
+        String bindMethodName = null;
+        String unbindMethodName = null;
+        if (element.hasAttribute(BIND_METHOD_ATTRIBUTE)) {
+            bindMethodName = element.getAttribute(BIND_METHOD_ATTRIBUTE);
+            listener.setBindMethodName(bindMethodName);
+        }
+        if (element.hasAttribute(UNBIND_METHOD_ATTRIBUTE)) {
+            unbindMethodName = element.getAttribute(UNBIND_METHOD_ATTRIBUTE);
+            listener.setUnbindMethodName(unbindMethodName);
+        }
+        if (bindMethodName == null && unbindMethodName == null) {
+            throw new ComponentDefinitionException("One of " + BIND_METHOD_ATTRIBUTE + " or " + UNBIND_METHOD_ATTRIBUTE + " must be set");
+        }
         // Parse elements
         NodeList nl = element.getChildNodes();
         for (int i = 0; i < nl.getLength(); i++) {

Modified: geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/container/RecipeBuilder.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/container/RecipeBuilder.java?rev=782992&r1=782991&r2=782992&view=diff
==============================================================================
--- geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/container/RecipeBuilder.java (original)
+++ geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/container/RecipeBuilder.java Tue Jun  9 13:11:27 2009
@@ -20,7 +20,6 @@
 
 import java.util.ArrayList;
 import java.util.Collections;
-import java.util.Comparator;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
@@ -121,10 +120,15 @@
                 listenersRecipe.add(createRecipe(listener));
             }
         }
+        List<Recipe> deps = new ArrayList<Recipe>();
+        for (String name : metadata.getDependsOn()) {
+            deps.add(new RefRecipe(getName(null), name));
+        }
         RefListRecipe recipe = new RefListRecipe(getName(metadata.getId()),
                                                  blueprintContainer,
                                                  metadata,
-                                                 listenersRecipe);
+                                                 listenersRecipe,
+                                                 deps);
         return recipe;
     }
 
@@ -136,10 +140,15 @@
                 listenersRecipe.add(createRecipe(listener));
             }
         }
+        List<Recipe> deps = new ArrayList<Recipe>();
+        for (String name : metadata.getDependsOn()) {
+            deps.add(new RefRecipe(getName(null), name));
+        }
         ReferenceRecipe recipe = new ReferenceRecipe(getName(metadata.getId()),
                                                      blueprintContainer,
                                                      metadata,
-                                                     listenersRecipe);
+                                                     listenersRecipe,
+                                                     deps);
         return recipe;
     }
 
@@ -226,8 +235,12 @@
     private Recipe createRecipe(RegistrationListener listener) throws Exception {
         BeanRecipe recipe = new BeanRecipe(getName(null), blueprintContainer, ServiceListener.class);
         recipe.setProperty("listener", getValue(listener.getListenerComponent(), null));
-        recipe.setProperty("registerMethod", listener.getRegistrationMethodName());
-        recipe.setProperty("unregisterMethod", listener.getUnregistrationMethodName());
+        if (listener.getRegistrationMethodName() != null) {
+            recipe.setProperty("registerMethod", listener.getRegistrationMethodName());
+        }
+        if (listener.getUnregistrationMethodName() != null) {
+            recipe.setProperty("unregisterMethod", listener.getUnregistrationMethodName());
+        }
         return recipe;
     }
 

Modified: geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/container/RefListRecipe.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/container/RefListRecipe.java?rev=782992&r1=782991&r2=782992&view=diff
==============================================================================
--- geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/container/RefListRecipe.java (original)
+++ geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/container/RefListRecipe.java Tue Jun  9 13:11:27 2009
@@ -24,12 +24,10 @@
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
-import java.util.Comparator;
 import java.util.Iterator;
 import java.util.List;
 import java.util.ListIterator;
 import java.util.RandomAccess;
-import java.util.Set;
 import java.util.concurrent.Callable;
 
 import org.apache.geronimo.blueprint.ExtendedBlueprintContainer;
@@ -58,28 +56,32 @@
 
     private final RefListMetadata metadata;
     private final List<ManagedCollection> collections = new ArrayList<ManagedCollection>();
-    private DynamicCollection<ServiceDispatcher> storage;
+    private final DynamicCollection<ServiceDispatcher> storage = new DynamicCollection<ServiceDispatcher>();
     private final List<ServiceDispatcher> unboundDispatchers = new ArrayList<ServiceDispatcher>();
 
     public RefListRecipe(String name,
                          ExtendedBlueprintContainer blueprintContainer,
                          RefListMetadata metadata,
-                         Recipe listenersRecipe) {
-        super(name, blueprintContainer, metadata, listenersRecipe);
+                         Recipe listenersRecipe,
+                         List<Recipe> explicitDependencies) {
+        super(name, blueprintContainer, metadata, listenersRecipe, explicitDependencies);
         this.metadata = metadata;
     }
 
     @Override
     protected Object internalCreate() throws ComponentDefinitionException {
-        Comparator comparator = null;
         try {
-            storage = new DynamicCollection<ServiceDispatcher>();
-
+            if (explicitDependencies != null) {
+                for (Recipe recipe : explicitDependencies) {
+                    recipe.create();
+                }
+            }
+            ProvidedObject object = new ProvidedObject();
+            addObject(object, true);
             // Handle initial references
             createListeners();
             retrack();
-
-            return new ProvidedObject();
+            return object;
         } catch (ComponentDefinitionException t) {
             throw t;
         } catch (Throwable t) {
@@ -224,55 +226,6 @@
             return service;
         }
 
-        @Override
-        public boolean equals(Object o) {
-            if (this == o) return true;
-            if (o == null || getClass() != o.getClass()) return false;
-            ServiceDispatcher that = (ServiceDispatcher) o;
-            if (this.proxy != null ? !this.proxy.equals(that.proxy) : that.proxy != null) return false;
-            return true;
-        }
-
-        @Override
-        public int hashCode() {
-            return proxy != null ? proxy.hashCode() : 0;
-        }
-    }
-
-    /**
-     * A natural order comparator working on objects implementing Comparable
-     * and simply delegating to Comparable.compareTo()
-     */
-    public static class NaturalOrderComparator implements Comparator<Comparable> {
-
-        public int compare(Comparable o1, Comparable o2) {
-            return o1.compareTo(o2);
-        }
-
-    }
-
-    /**
-     * A comparator to order ServiceDispatchers, sorting on references or proxies
-     * depending of the configuration of the <ref-list/> or <ref-set/>
-     */
-    public static class DispatcherComparator implements Comparator<ServiceDispatcher> {
-
-        private final Comparator comparator;
-        private final boolean orderingReferences;
-
-        public DispatcherComparator(Comparator comparator, boolean orderingReferences) {
-            this.comparator = comparator;
-            this.orderingReferences = orderingReferences;
-        }
-
-        public int compare(ServiceDispatcher d1, ServiceDispatcher d2) {
-            return comparator.compare(getOrdering(d1), getOrdering(d2));
-        }
-
-        protected Object getOrdering(ServiceDispatcher d) {
-            return orderingReferences ? d.reference : d.proxy;
-        }
-
     }
 
     public class ProvidedObject implements ConversionUtils.Convertible {

Modified: geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/container/ReferenceRecipe.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/container/ReferenceRecipe.java?rev=782992&r1=782991&r2=782992&view=diff
==============================================================================
--- geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/container/ReferenceRecipe.java (original)
+++ geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/container/ReferenceRecipe.java Tue Jun  9 13:11:27 2009
@@ -19,6 +19,7 @@
 package org.apache.geronimo.blueprint.container;
 
 import java.lang.reflect.Type;
+import java.util.List;
 import java.util.concurrent.Callable;
 
 import org.apache.geronimo.blueprint.ExtendedBlueprintContainer;
@@ -54,26 +55,36 @@
     public ReferenceRecipe(String name,
                            ExtendedBlueprintContainer blueprintContainer,
                            ReferenceMetadata metadata,
-                           Recipe listenersRecipe) {
-        super(name, blueprintContainer, metadata, listenersRecipe);
+                           Recipe listenersRecipe,
+                           List<Recipe> explicitDependencies) {
+        super(name, blueprintContainer, metadata, listenersRecipe, explicitDependencies);
         this.metadata = metadata;
     }
 
     @Override
     protected Object internalCreate() throws ComponentDefinitionException {
         try {
+            if (explicitDependencies != null) {
+                for (Recipe recipe : explicitDependencies) {
+                    recipe.create();
+                }
+            }
             // Create the proxy
             proxy = createProxy(new ServiceDispatcher(), this.metadata.getInterfaceNames());
 
             // Add partially created proxy to the context
-            addObject(proxy, true);
+            ServiceProxyWrapper wrapper = new ServiceProxyWrapper();
+
+            addObject(wrapper, true);
 
             // Handle initial references
             createListeners();
             retrack();
 
             // Return a ServiceProxy that can injection of references or proxies can be done correctly
-            return new ServiceProxyWrapper();
+            return wrapper;
+        } catch (ComponentDefinitionException e) {
+            throw e;
         } catch (Throwable t) {
             throw new ComponentDefinitionException(t);
         }

Modified: geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/container/ServiceListener.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/container/ServiceListener.java?rev=782992&r1=782991&r2=782992&view=diff
==============================================================================
--- geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/container/ServiceListener.java (original)
+++ geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/container/ServiceListener.java Tue Jun  9 13:11:27 2009
@@ -62,16 +62,20 @@
         if (initialized) {
             return;
         }
-        Class[] paramTypes = new Class[] { service.getClass(), Map.class };
+        Class[] paramTypes = new Class[] { service != null ? service.getClass() : null, Map.class };
         Class listenerClass = listener.getClass();
 
-        registerMethods = ReflectionUtils.findCompatibleMethods(listenerClass, registerMethod, paramTypes);
-        if (registerMethods.size() == 0) {
-            throw new ComponentDefinitionException("No matching methods found for listener registration method: " + registerMethod);
+        if (registerMethod != null) {
+            registerMethods = ReflectionUtils.findCompatibleMethods(listenerClass, registerMethod, paramTypes);
+            if (registerMethods.size() == 0) {
+                throw new ComponentDefinitionException("No matching methods found for listener registration method: " + registerMethod);
+            }
         }
-        unregisterMethods = ReflectionUtils.findCompatibleMethods(listenerClass, unregisterMethod, paramTypes);
-        if (unregisterMethods.size() == 0) {
-            throw new ComponentDefinitionException("No matching methods found for listener unregistration method: " + unregisterMethod);
+        if (unregisterMethod != null) {
+            unregisterMethods = ReflectionUtils.findCompatibleMethods(listenerClass, unregisterMethod, paramTypes);
+            if (unregisterMethods.size() == 0) {
+                throw new ComponentDefinitionException("No matching methods found for listener unregistration method: " + unregisterMethod);
+            }
         }
         initialized = true;
     }

Modified: geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/container/ServiceRecipe.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/container/ServiceRecipe.java?rev=782992&r1=782991&r2=782992&view=diff
==============================================================================
--- geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/container/ServiceRecipe.java (original)
+++ geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/container/ServiceRecipe.java Tue Jun  9 13:11:27 2009
@@ -30,9 +30,6 @@
 import org.apache.geronimo.blueprint.ServiceProcessor;
 import org.apache.geronimo.blueprint.di.AbstractRecipe;
 import org.apache.geronimo.blueprint.di.CollectionRecipe;
-import org.apache.geronimo.blueprint.di.DefaultExecutionContext;
-import org.apache.geronimo.blueprint.di.DefaultRepository;
-import org.apache.geronimo.blueprint.di.ExecutionContext;
 import org.apache.geronimo.blueprint.di.MapRecipe;
 import org.apache.geronimo.blueprint.di.Recipe;
 import org.apache.geronimo.blueprint.di.RefRecipe;
@@ -56,9 +53,6 @@
 /**
  * A <code>Recipe</code> to export services into the OSGi registry.
  *
- * TODO: refactor the bundle scope stuff
- * TODO: if the bean is a prototype or a ServiceFactory, a null service should be sent to listeners
- *
  * @author <a href="mailto:dev@geronimo.apache.org">Apache Geronimo Project</a>
  * @version $Rev: 776360 $, $Date: 2009-05-19 17:40:47 +0200 (Tue, 19 May 2009) $
  */
@@ -74,11 +68,12 @@
     private List<Recipe> explicitDependencies;
 
     private Map properties;
+    private boolean registered;
     private ServiceRegistration registration;
     private Map registrationProperties;
     private List<ServiceListener> listeners;
     private Object service;
-    private boolean bundleScope;
+    private boolean prototypeService;
 
     public ServiceRecipe(String name,
                          ExtendedBlueprintContainer blueprintContainer,
@@ -121,39 +116,44 @@
                 recipe.create();
             }
         }
-        return new ServiceRegistrationProxy();
+        ServiceRegistrationProxy proxy = new ServiceRegistrationProxy();
+        addObject(proxy, true);
+        getService();
+        return proxy;
     }
 
     public synchronized void register() {
-        if (registration != null) {
-            return;
-        }
-        
-        Hashtable props = new Hashtable();
-        if (properties == null) {
-            properties = (Map) createSimpleRecipe(propertiesRecipe);
-        }
-        props.putAll(properties);
-        props.put(Constants.SERVICE_RANKING, metadata.getRanking());
-        String componentName = getComponentName();
-        if (componentName != null) {
-            props.put(BlueprintConstants.COMPONENT_NAME_PROPERTY, componentName);
-        }
-        for (ServiceProcessor processor : blueprintContainer.getProcessors(ServiceProcessor.class)) {
-            processor.updateProperties(new PropertiesUpdater(), props);
-        }
-        
-        Set<String> classes = getClasses();
-        String[] classArray = classes.toArray(new String[classes.size()]);
-        registration = blueprintContainer.getBundleContext().registerService(classArray, new TriggerServiceFactory(), props);
-        registrationProperties = props;
+        if (!isRegistered()) {
+            registered = true;
+            Hashtable props = new Hashtable();
+            if (properties == null) {
+                properties = (Map) createSimpleRecipe(propertiesRecipe);
+            }
+            props.putAll(properties);
+            props.put(Constants.SERVICE_RANKING, metadata.getRanking());
+            String componentName = getComponentName();
+            if (componentName != null) {
+                props.put(BlueprintConstants.COMPONENT_NAME_PROPERTY, componentName);
+            } else {
+                props.remove(BlueprintConstants.COMPONENT_NAME_PROPERTY);
+            }
+            for (ServiceProcessor processor : blueprintContainer.getProcessors(ServiceProcessor.class)) {
+                processor.updateProperties(new PropertiesUpdater(), props);
+            }
 
-        LOGGER.debug("Service {} registered with interfaces {} and properties {}",
-                     new Object[] { name, classes, props });
+            Set<String> classes = getClasses();
+            String[] classArray = classes.toArray(new String[classes.size()]);
+
+            LOGGER.debug("Registering service {} with interfaces {} and properties {}",
+                         new Object[] { name, classes, props });
+
+            registration = blueprintContainer.getBundleContext().registerService(classArray, new TriggerServiceFactory(), props);
+            registrationProperties = props;
+        }
     }
 
     public synchronized boolean isRegistered() {
-        return registration != null;
+        return registered;
     }
 
     public synchronized ServiceReference getReference() {
@@ -175,20 +175,23 @@
 
 
     public synchronized void unregister() {
-        if (registration != null) {
+        if (isRegistered()) {
+            registered = false;
+            LOGGER.debug("Unregistering service {}", name);
             // This method needs to allow reentrance, so if we need to make sure the registration is
             // set to null before actually unregistering the service
             ServiceRegistration reg = registration;
-            registration = null;
-            // TODO: shouldn't listeners be called before unregistering the service?
-            reg.unregister();
             if (listeners != null) {
                 LOGGER.debug("Calling listeners for service unregistration");
                 for (ServiceListener listener : listeners) {
-                    listener.unregister(getService(), registrationProperties);
+                    listener.unregister(prototypeService || service instanceof ServiceFactory ? null : service, registrationProperties);
                 }
             }
-            LOGGER.debug("Service {} unregistered", name);
+            reg.unregister();
+            // We need to do this hack in order to support reantrancy
+            if (registration == reg) {
+                registration = null;
+            }
         }
     }
     
@@ -202,9 +205,9 @@
         synchronized (this) {
             if (this.service == null) {
                 try {
-                    bundleScope = isBundleScope(metadata.getServiceComponent());
-                    LOGGER.debug("Creating service instance (bundle scope = {})", bundleScope);
-                    this.service = createInstance(false);
+                    prototypeService = isPrototypeService(metadata.getServiceComponent());
+                    LOGGER.debug("Creating service instance");
+                    this.service = createInstance();
                     LOGGER.debug("Service created: {}", this.service);
                     // When the service is first requested, we need to create listeners and call them
                     if (listeners == null) {
@@ -217,7 +220,8 @@
                         LOGGER.debug("Listeners created: {}", listeners);
                         LOGGER.debug("Calling listeners for service registration");
                         for (ServiceListener listener : listeners) {
-                            listener.register(service, registrationProperties);
+                            listener.register(prototypeService || service instanceof ServiceFactory ? null : service,
+                                              registrationProperties);
                         }
                     }
                 } catch (RuntimeException e) {
@@ -229,8 +233,8 @@
         Object service = this.service;
         if (service instanceof ServiceFactory) {
             service = ((ServiceFactory) service).getService(bundle, registration);
-        } else if (bundleScope) {
-            service = createInstance(true);
+        } else {
+            service = createInstance();
             LOGGER.debug("Created service instance for bundle: " + bundle + " " + service.hashCode());
         }
         if (service == null) {
@@ -240,7 +244,10 @@
     }
 
     public void ungetService(Bundle bundle, ServiceRegistration registration, Object service) {
-        if (bundleScope) {
+        if (this.service instanceof ServiceFactory) {
+            ((ServiceFactory) this.service).ungetService(bundle, registration, service);
+        }
+        if (prototypeService) {
             destroyInstance(service);
             LOGGER.debug("Destroyed service instance for bundle: " + bundle);
         }
@@ -266,22 +273,8 @@
         return classes;
     }
 
-    private Object createInstance(boolean scoped) {
-        if (scoped) {
-            Recipe recipe = serviceRecipe;
-            Repository repo = blueprintContainer.getRepository();
-            if (recipe instanceof RefRecipe) {
-                recipe = repo.getRecipe(((RefRecipe) recipe).getIdRef());
-            }
-            DefaultRepository repository = new DefaultRepository((DefaultRepository) repo);
-            if (repository.getRecipe(recipe.getName()) != recipe) {
-                repository.putRecipe(recipe.getName(), recipe);
-            }
-            BlueprintObjectInstantiator graph = new BlueprintObjectInstantiator(blueprintContainer, repository);
-            return graph.create(recipe.getName());
-        } else {
-            return createSimpleRecipe(serviceRecipe);
-        }
+    private Object createInstance() {
+        return createSimpleRecipe(serviceRecipe);
     }
 
     private Object createSimpleRecipe(Recipe recipe) {
@@ -303,7 +296,7 @@
         ((BeanRecipe) recipe).destroyInstance(instance);
     }
 
-    private boolean isBundleScope(Metadata value) {
+    private boolean isPrototypeService(Metadata value) {
         ComponentMetadata metadata = null;
         if (value instanceof RefMetadata) {
             RefMetadata ref = (RefMetadata) value;
@@ -313,22 +306,7 @@
         }
         if (metadata instanceof BeanMetadata) {
             BeanMetadata bean = (BeanMetadata) metadata;
-            Class clazz = bean.getRuntimeClass();
-            // Try to get the class from the className attribute
-            if (clazz == null && bean.getClassName() != null) {
-                ExecutionContext oldContext = ExecutionContext.setContext(new DefaultExecutionContext(blueprintContainer, blueprintContainer.getRepository()));
-                try {
-                    clazz = loadClass(bean.getClassName());
-                } finally {
-                    ExecutionContext.setContext(oldContext);
-                }
-            }
-            // TODO: if clazz == null, we must be using a factory, just ignore it for now
-            if (clazz != null && ServiceFactory.class.isAssignableFrom(clazz)) {
-                return false;
-            } else {
-                return BeanMetadata.SCOPE_BUNDLE.equals(bean.getScope());
-            }
+            return BeanMetadata.SCOPE_PROTOTYPE.equals(bean.getScope());
         } else {
             return false;
         }
@@ -366,7 +344,7 @@
         }
 
         public void unregister() {
-            ServiceRecipe.this.unregister();
+            throw new UnsupportedOperationException();
         }
     }
 

Modified: geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/di/DefaultExecutionContext.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/di/DefaultExecutionContext.java?rev=782992&r1=782991&r2=782992&view=diff
==============================================================================
--- geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/di/DefaultExecutionContext.java (original)
+++ geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/di/DefaultExecutionContext.java Tue Jun  9 13:11:27 2009
@@ -58,6 +58,10 @@
         this.repository = repository;
     }
 
+    public Object getContextKey() {
+        return this.blueprintContainer;
+    }
+
     public void push(Recipe recipe) {
         if (stack.contains(recipe)) {
             ArrayList<Recipe> circularity = new ArrayList<Recipe>(stack.subList(stack.indexOf(recipe), stack.size()));

Modified: geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/di/ExecutionContext.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/di/ExecutionContext.java?rev=782992&r1=782991&r2=782992&view=diff
==============================================================================
--- geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/di/ExecutionContext.java (original)
+++ geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/di/ExecutionContext.java Tue Jun  9 13:11:27 2009
@@ -38,10 +38,14 @@
 
     public static ExecutionContext setContext(ExecutionContext newContext) {
         ExecutionContext oldContext = context.get();
-        context.set(newContext);
+        if (oldContext == null || newContext == null || oldContext.getContextKey() != newContext.getContextKey()) {
+            context.set(newContext);
+        }
         return oldContext;
     }
 
+    public abstract Object getContextKey();
+
     /**
      * Adds a recipe to the top of the execution stack.  If the recipe is already on
      * the stack, a CircularDependencyException is thrown.

Modified: geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/ext/AbstractPropertyPlaceholder.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/ext/AbstractPropertyPlaceholder.java?rev=782992&r1=782991&r2=782992&view=diff
==============================================================================
--- geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/ext/AbstractPropertyPlaceholder.java (original)
+++ geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/ext/AbstractPropertyPlaceholder.java Tue Jun  9 13:11:27 2009
@@ -33,7 +33,6 @@
 import org.apache.geronimo.blueprint.mutable.MutableMapEntry;
 import org.apache.geronimo.blueprint.mutable.MutableMapMetadata;
 import org.apache.geronimo.blueprint.mutable.MutablePropsMetadata;
-import org.apache.geronimo.blueprint.mutable.MutableRefListMetadata;
 import org.apache.geronimo.blueprint.mutable.MutableRegistrationListener;
 import org.apache.geronimo.blueprint.mutable.MutableServiceMetadata;
 import org.osgi.service.blueprint.container.ComponentDefinitionException;

Modified: geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/ext/ExtNamespaceHandler.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/ext/ExtNamespaceHandler.java?rev=782992&r1=782991&r2=782992&view=diff
==============================================================================
--- geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/ext/ExtNamespaceHandler.java (original)
+++ geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/ext/ExtNamespaceHandler.java Tue Jun  9 13:11:27 2009
@@ -19,38 +19,38 @@
 package org.apache.geronimo.blueprint.ext;
 
 import java.net.URL;
-import java.util.List;
 import java.util.ArrayList;
+import java.util.List;
 
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
 import org.w3c.dom.Attr;
 import org.w3c.dom.CharacterData;
 import org.w3c.dom.Comment;
+import org.w3c.dom.Element;
 import org.w3c.dom.EntityReference;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
 
-import org.osgi.service.blueprint.reflect.Metadata;
-import org.osgi.service.blueprint.reflect.ComponentMetadata;
-import org.osgi.service.blueprint.reflect.BeanMetadata;
-import org.osgi.service.blueprint.reflect.ValueMetadata;
-import org.osgi.service.blueprint.reflect.RefMetadata;
-import org.osgi.service.blueprint.reflect.IdRefMetadata;
-import org.osgi.service.blueprint.reflect.CollectionMetadata;
-import org.osgi.service.blueprint.reflect.BeanProperty;
-import org.osgi.service.blueprint.reflect.ServiceReferenceMetadata;
-import org.osgi.service.blueprint.reflect.RefListMetadata;
-import org.osgi.service.blueprint.container.ComponentDefinitionException;
-import org.apache.geronimo.blueprint.ParserContext;
 import org.apache.geronimo.blueprint.ExtendedRefListMetadata;
+import org.apache.geronimo.blueprint.ParserContext;
 import org.apache.geronimo.blueprint.mutable.MutableBeanMetadata;
+import org.apache.geronimo.blueprint.mutable.MutableCollectionMetadata;
 import org.apache.geronimo.blueprint.mutable.MutableComponentMetadata;
-import org.apache.geronimo.blueprint.mutable.MutableValueMetadata;
-import org.apache.geronimo.blueprint.mutable.MutableRefMetadata;
 import org.apache.geronimo.blueprint.mutable.MutableIdRefMetadata;
-import org.apache.geronimo.blueprint.mutable.MutableCollectionMetadata;
 import org.apache.geronimo.blueprint.mutable.MutableMapMetadata;
+import org.apache.geronimo.blueprint.mutable.MutableRefMetadata;
 import org.apache.geronimo.blueprint.mutable.MutableServiceReferenceMetadata;
+import org.apache.geronimo.blueprint.mutable.MutableValueMetadata;
+import org.osgi.service.blueprint.container.ComponentDefinitionException;
+import org.osgi.service.blueprint.reflect.BeanMetadata;
+import org.osgi.service.blueprint.reflect.BeanProperty;
+import org.osgi.service.blueprint.reflect.CollectionMetadata;
+import org.osgi.service.blueprint.reflect.ComponentMetadata;
+import org.osgi.service.blueprint.reflect.IdRefMetadata;
+import org.osgi.service.blueprint.reflect.Metadata;
+import org.osgi.service.blueprint.reflect.RefListMetadata;
+import org.osgi.service.blueprint.reflect.RefMetadata;
+import org.osgi.service.blueprint.reflect.ServiceReferenceMetadata;
+import org.osgi.service.blueprint.reflect.ValueMetadata;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 

Modified: geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/ext/PlaceholdersUtils.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/ext/PlaceholdersUtils.java?rev=782992&r1=782991&r2=782992&view=diff
==============================================================================
--- geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/ext/PlaceholdersUtils.java (original)
+++ geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/ext/PlaceholdersUtils.java Tue Jun  9 13:11:27 2009
@@ -18,13 +18,13 @@
  */
 package org.apache.geronimo.blueprint.ext;
 
-import org.apache.geronimo.blueprint.mutable.MutableBeanMetadata;
 import org.apache.geronimo.blueprint.ComponentDefinitionRegistry;
-import org.osgi.service.blueprint.reflect.ComponentMetadata;
+import org.apache.geronimo.blueprint.mutable.MutableBeanMetadata;
+import org.osgi.service.blueprint.container.ComponentDefinitionException;
 import org.osgi.service.blueprint.reflect.BeanMetadata;
 import org.osgi.service.blueprint.reflect.BeanProperty;
+import org.osgi.service.blueprint.reflect.ComponentMetadata;
 import org.osgi.service.blueprint.reflect.ValueMetadata;
-import org.osgi.service.blueprint.container.ComponentDefinitionException;
 
 /**
  * Utility for placeholders parsing / validation

Modified: geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/ext/PropertyPlaceholder.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/ext/PropertyPlaceholder.java?rev=782992&r1=782991&r2=782992&view=diff
==============================================================================
--- geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/ext/PropertyPlaceholder.java (original)
+++ geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/ext/PropertyPlaceholder.java Tue Jun  9 13:11:27 2009
@@ -18,16 +18,15 @@
  */
 package org.apache.geronimo.blueprint.ext;
 
-import java.util.Map;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URL;
 import java.util.List;
+import java.util.Map;
 import java.util.Properties;
-import java.net.URL;
-import java.io.InputStream;
-import java.io.IOException;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.osgi.service.blueprint.container.ComponentDefinitionException;
 
 /**
  * Property placeholder that looks for properties in the System properties.

Modified: geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/mutable/MutableRefListMetadata.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/mutable/MutableRefListMetadata.java?rev=782992&r1=782991&r2=782992&view=diff
==============================================================================
--- geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/mutable/MutableRefListMetadata.java (original)
+++ geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/mutable/MutableRefListMetadata.java Tue Jun  9 13:11:27 2009
@@ -18,7 +18,6 @@
  */
 package org.apache.geronimo.blueprint.mutable;
 
-import org.osgi.service.blueprint.reflect.Target;
 import org.apache.geronimo.blueprint.ExtendedRefListMetadata;
 
 /**

Modified: geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/mutable/MutableServiceReferenceMetadata.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/mutable/MutableServiceReferenceMetadata.java?rev=782992&r1=782991&r2=782992&view=diff
==============================================================================
--- geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/mutable/MutableServiceReferenceMetadata.java (original)
+++ geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/mutable/MutableServiceReferenceMetadata.java Tue Jun  9 13:11:27 2009
@@ -18,10 +18,9 @@
  */
 package org.apache.geronimo.blueprint.mutable;
 
+import org.apache.geronimo.blueprint.ExtendedServiceReferenceMetadata;
 import org.osgi.service.blueprint.reflect.Listener;
-import org.osgi.service.blueprint.reflect.ServiceReferenceMetadata;
 import org.osgi.service.blueprint.reflect.Target;
-import org.apache.geronimo.blueprint.ExtendedServiceReferenceMetadata;
 
 /**
  * A mutable version of the <code>ServiceReferenceMetadata</code> that allows modifications.

Modified: geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/namespace/ComponentDefinitionRegistryImpl.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/namespace/ComponentDefinitionRegistryImpl.java?rev=782992&r1=782991&r2=782992&view=diff
==============================================================================
--- geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/namespace/ComponentDefinitionRegistryImpl.java (original)
+++ geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/namespace/ComponentDefinitionRegistryImpl.java Tue Jun  9 13:11:27 2009
@@ -19,11 +19,10 @@
 package org.apache.geronimo.blueprint.namespace;
 
 import java.util.Collections;
+import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
-import java.util.LinkedHashMap;
-import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.CopyOnWriteArrayList;
 
 import org.apache.geronimo.blueprint.ComponentDefinitionRegistry;

Modified: geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/reflect/ComponentMetadataImpl.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/reflect/ComponentMetadataImpl.java?rev=782992&r1=782991&r2=782992&view=diff
==============================================================================
--- geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/reflect/ComponentMetadataImpl.java (original)
+++ geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/reflect/ComponentMetadataImpl.java Tue Jun  9 13:11:27 2009
@@ -18,9 +18,9 @@
  */
 package org.apache.geronimo.blueprint.reflect;
 
-import java.util.List;
-import java.util.Collections;
 import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
 
 import org.apache.geronimo.blueprint.mutable.MutableComponentMetadata;
 import org.osgi.service.blueprint.reflect.ComponentMetadata;

Modified: geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/reflect/RefListMetadataImpl.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/reflect/RefListMetadataImpl.java?rev=782992&r1=782991&r2=782992&view=diff
==============================================================================
--- geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/reflect/RefListMetadataImpl.java (original)
+++ geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/reflect/RefListMetadataImpl.java Tue Jun  9 13:11:27 2009
@@ -20,7 +20,6 @@
 
 import org.apache.geronimo.blueprint.mutable.MutableRefListMetadata;
 import org.osgi.service.blueprint.reflect.RefListMetadata;
-import org.osgi.service.blueprint.reflect.Target;
 
 /**
  * Implementation of RefCollectionMetadata 

Modified: geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/utils/ConversionUtils.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/utils/ConversionUtils.java?rev=782992&r1=782991&r2=782992&view=diff
==============================================================================
--- geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/utils/ConversionUtils.java (original)
+++ geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/utils/ConversionUtils.java Tue Jun  9 13:11:27 2009
@@ -20,7 +20,6 @@
 
 import java.lang.reflect.Array;
 import java.lang.reflect.GenericArrayType;
-import java.lang.reflect.ParameterizedType;
 import java.lang.reflect.Type;
 import java.util.ArrayList;
 import java.util.Collection;
@@ -33,7 +32,6 @@
 import java.util.SortedSet;
 import java.util.TreeMap;
 import java.util.TreeSet;
-import java.util.Arrays;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
 

Modified: geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/utils/DynamicCollection.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/utils/DynamicCollection.java?rev=782992&r1=782991&r2=782992&view=diff
==============================================================================
--- geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/utils/DynamicCollection.java (original)
+++ geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/utils/DynamicCollection.java Tue Jun  9 13:11:27 2009
@@ -110,12 +110,8 @@
             throw new NullPointerException();
         }
         synchronized (lock) {
-            if (!storage.contains(o)) {
-                internalAdd(storage.size(), o);
-                return true;
-            } else {
-                return false;
-            }
+            internalAdd(storage.size(), o);
+            return true;
         }
     }
 

Modified: geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/utils/ReflectionUtils.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/utils/ReflectionUtils.java?rev=782992&r1=782991&r2=782992&view=diff
==============================================================================
--- geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/utils/ReflectionUtils.java (original)
+++ geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/utils/ReflectionUtils.java Tue Jun  9 13:11:27 2009
@@ -83,7 +83,7 @@
             if (name.equals(method.getName()) && Void.TYPE.equals(method.getReturnType()) && methodParams.length == paramTypes.length) {
                 boolean assignable = true;
                 for (int i = 0; i < paramTypes.length && assignable; i++) {
-                    assignable = methodParams[i].isAssignableFrom(paramTypes[i]);
+                    assignable &= paramTypes[i] == null || methodParams[i].isAssignableFrom(paramTypes[i]);
                 }
                 if (assignable) {
                     methods.add(method);

Modified: geronimo/sandbox/blueprint/blueprint-core/src/main/resources/org/apache/geronimo/blueprint/blueprint.xsd
URL: http://svn.apache.org/viewvc/geronimo/sandbox/blueprint/blueprint-core/src/main/resources/org/apache/geronimo/blueprint/blueprint.xsd?rev=782992&r1=782991&r2=782992&view=diff
==============================================================================
--- geronimo/sandbox/blueprint/blueprint-core/src/main/resources/org/apache/geronimo/blueprint/blueprint.xsd (original)
+++ geronimo/sandbox/blueprint/blueprint-core/src/main/resources/org/apache/geronimo/blueprint/blueprint.xsd Tue Jun  9 13:11:27 2009
@@ -131,8 +131,8 @@
                 <xsd:documentation>
                   <![CDATA[
                   Specifies the default initialization setting that will be defined
-                  for <bean> components.  If not specified, the global
-                  default is "eager".  Individual <bean> components may
+                  for components.  If not specified, the global
+                  default is "eager".  Individual components may
                   override the default
                   ]]>
                 </xsd:documentation>

Modified: geronimo/sandbox/blueprint/blueprint-core/src/test/java/org/apache/geronimo/blueprint/TestBlueprintContainer.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/blueprint/blueprint-core/src/test/java/org/apache/geronimo/blueprint/TestBlueprintContainer.java?rev=782992&r1=782991&r2=782992&view=diff
==============================================================================
--- geronimo/sandbox/blueprint/blueprint-core/src/test/java/org/apache/geronimo/blueprint/TestBlueprintContainer.java (original)
+++ geronimo/sandbox/blueprint/blueprint-core/src/test/java/org/apache/geronimo/blueprint/TestBlueprintContainer.java Tue Jun  9 13:11:27 2009
@@ -19,6 +19,7 @@
 package org.apache.geronimo.blueprint;
 
 import org.apache.geronimo.blueprint.container.BlueprintContainerImpl;
+import org.apache.geronimo.blueprint.container.BlueprintObjectInstantiator;
 import org.apache.geronimo.blueprint.namespace.ComponentDefinitionRegistryImpl;
 
 public class TestBlueprintContainer extends BlueprintContainerImpl {
@@ -39,5 +40,9 @@
     public ComponentDefinitionRegistryImpl getComponentDefinitionRegistry() {
         return registry;
     }
+
+    public BlueprintObjectInstantiator getInstantiator() throws Exception {
+        return super.getInstantiator();
+    }
     
 }

Modified: geronimo/sandbox/blueprint/blueprint-core/src/test/java/org/apache/geronimo/blueprint/WiringTest.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/blueprint/blueprint-core/src/test/java/org/apache/geronimo/blueprint/WiringTest.java?rev=782992&r1=782991&r2=782992&view=diff
==============================================================================
--- geronimo/sandbox/blueprint/blueprint-core/src/test/java/org/apache/geronimo/blueprint/WiringTest.java (original)
+++ geronimo/sandbox/blueprint/blueprint-core/src/test/java/org/apache/geronimo/blueprint/WiringTest.java Tue Jun  9 13:11:27 2009
@@ -46,9 +46,7 @@
 
     public void testWiring() throws Exception {
         ComponentDefinitionRegistryImpl registry = parse("/test-wiring.xml");
-        RecipeBuilder i = new RecipeBuilder(new TestBlueprintContainer(registry));
-        Repository repository = i.createRepository();
-        BlueprintObjectInstantiator graph = new BlueprintObjectInstantiator(new TestBlueprintContainer(registry), repository);
+        BlueprintObjectInstantiator graph = new TestBlueprintContainer(registry).getInstantiator();
         
         Object obj1 = graph.create("pojoA");
         assertNotNull(obj1);
@@ -128,17 +126,15 @@
         
         assertTrue(obj4 != graph.create("pojoC"));
         
-        repository.destroy();       
+        graph.getRepository().destroy();
         
         // test destroy-method
         assertEquals(true, pojob.getDestroyCalled());
     }
     
     public void testCompoundProperties() throws Exception {
-        ComponentDefinitionRegistryImpl registry = parse("/test-wiring.xml");
-        RecipeBuilder i = new RecipeBuilder(new TestBlueprintContainer(registry));
-        Repository repository = i.createRepository();
-        BlueprintObjectInstantiator graph = new BlueprintObjectInstantiator(new TestBlueprintContainer(registry), repository);
+        ComponentDefinitionRegistryImpl registry = parse("/test-wiring-on.xml");
+        BlueprintObjectInstantiator graph = new TestBlueprintContainer(registry).getInstantiator();
         
         Object obj5 = graph.create("compound");
         assertNotNull(obj5);
@@ -173,9 +169,7 @@
         CallbackTracker.clear();
 
         ComponentDefinitionRegistryImpl registry = parse("/test-depends-on.xml");
-        RecipeBuilder i = new RecipeBuilder(new TestBlueprintContainer(registry));
-        Repository repository = i.createRepository();
-        BlueprintObjectInstantiator graph = new BlueprintObjectInstantiator(new TestBlueprintContainer(registry), repository);
+        BlueprintObjectInstantiator graph = new TestBlueprintContainer(registry).getInstantiator();
         Map instances = graph.createAll("c", "d", "e");
         
         List<Callback> callback = CallbackTracker.getCallbacks();
@@ -184,7 +178,7 @@
         checkInitCallback(instances.get("c"), callback.get(1));
         checkInitCallback(instances.get("e"), callback.get(2));
                 
-        repository.destroy();
+        graph.getRepository().destroy();
         
         assertEquals(6, callback.size());
         checkDestroyCallback(instances.get("e"), callback.get(3));
@@ -204,9 +198,7 @@
     
     public void testConstructor() throws Exception {
         ComponentDefinitionRegistryImpl registry = parse("/test-constructor.xml");
-        RecipeBuilder i = new RecipeBuilder(new TestBlueprintContainer(registry));
-        Repository repository = i.createRepository();
-        BlueprintObjectInstantiator graph = new BlueprintObjectInstantiator(new TestBlueprintContainer(registry), repository);
+        BlueprintObjectInstantiator graph = new TestBlueprintContainer(registry).getInstantiator();
 
         Object obj1 = graph.create("pojoA");
         assertNotNull(obj1);
@@ -296,10 +288,8 @@
 
     public void testGenerics() throws Exception {
         ComponentDefinitionRegistryImpl registry = parse("/test-generics.xml");
-        RecipeBuilder i = new RecipeBuilder(new TestBlueprintContainer(registry));
-        Repository repository = i.createRepository();
-        BlueprintObjectInstantiator graph = new BlueprintObjectInstantiator(new TestBlueprintContainer(registry), repository);
-        
+        BlueprintObjectInstantiator graph = new TestBlueprintContainer(registry).getInstantiator();
+
         List<Integer> expectedList = new ArrayList<Integer>();
         expectedList.add(new Integer(10));
         expectedList.add(new Integer(20));
@@ -347,9 +337,7 @@
     
     public void testCircular() throws Exception {
         ComponentDefinitionRegistryImpl registry = parse("/test-circular.xml");
-        RecipeBuilder i = new RecipeBuilder(new TestBlueprintContainer(registry));
-        Repository repository = i.createRepository();
-        BlueprintObjectInstantiator graph = new BlueprintObjectInstantiator(new TestBlueprintContainer(registry), repository);
+        BlueprintObjectInstantiator graph = new TestBlueprintContainer(registry).getInstantiator();
 
         // this should pass (we allow circular dependencies for components without init method)
         Object obj1 = graph.create("a");