You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@aries.apache.org by ma...@apache.org on 2010/03/11 14:45:28 UTC

svn commit: r921845 - in /incubator/aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint: container/ di/

Author: mahrwald
Date: Thu Mar 11 13:45:28 2010
New Revision: 921845

URL: http://svn.apache.org/viewvc?rev=921845&view=rev
Log:
ARIES-246: Fix duplicate anon component recipe problem with CompDefRegProcessors

Added:
    incubator/aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/container/IdSpace.java
Modified:
    incubator/aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/container/BlueprintContainerImpl.java
    incubator/aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/container/BlueprintRepository.java
    incubator/aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/container/RecipeBuilder.java
    incubator/aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/di/Repository.java

Modified: incubator/aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/container/BlueprintContainerImpl.java
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/container/BlueprintContainerImpl.java?rev=921845&r1=921844&r2=921845&view=diff
==============================================================================
--- incubator/aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/container/BlueprintContainerImpl.java (original)
+++ incubator/aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/container/BlueprintContainerImpl.java Thu Mar 11 13:45:28 2010
@@ -138,7 +138,8 @@ public class BlueprintContainerImpl impl
     private final AtomicBoolean running = new AtomicBoolean();
     private List<ServiceRecipe> services;
     private AccessControlContext accessControlContext;
-
+    private final IdSpace tempRecipeIdSpace = new IdSpace();
+    
     public BlueprintContainerImpl(BundleContext bundleContext, Bundle extenderBundle, BlueprintListener eventDispatcher, NamespaceHandlerRegistry handlers, ScheduledExecutorService executors, List<Object> pathList) {
         this.bundleContext = bundleContext;
         this.extenderBundle = extenderBundle;
@@ -427,7 +428,7 @@ public class BlueprintContainerImpl impl
     
     public BlueprintRepository getRepository() {
         if (repository == null) {
-            repository = new RecipeBuilder(this).createRepository();
+            repository = new RecipeBuilder(this, tempRecipeIdSpace).createRepository();
         }
         return repository;
     }
@@ -484,15 +485,31 @@ public class BlueprintContainerImpl impl
             }
             // Update repository with recipes processed by the processors
             untrackServiceReferences();
-            Repository tmpRepo = new RecipeBuilder(this).createRepository();
+            Repository tmpRepo = new RecipeBuilder(this, tempRecipeIdSpace).createRepository();
+            
+            LOGGER.debug("Updating blueprint repository");
+            
+            for (String name : repository.getNames()) {
+                if (repository.getInstance(name) == null) {
+                    LOGGER.debug("Removing uninstantiated recipe {}", new Object[] { name });
+                    repository.removeRecipe(name);
+                } else {
+                    LOGGER.debug("Recipe {} is already instantiated", new Object[] { name });
+                }
+            }
+            
             for (String name : tmpRepo.getNames()) {
                 if (repository.getInstance(name) == null) {
+                    LOGGER.debug("Adding new recipe {}", new Object[] { name });
                     Recipe r = tmpRepo.getRecipe(name);
                     if (r != null) {
                         repository.putRecipe(name, r);
                     }
+                } else {
+                    LOGGER.debug("Recipe {} is already instantiated and cannot be updated", new Object[] { name });
                 }
             }
+            
             getSatisfiableDependenciesMap(true);
             trackServiceReferences();
         }

Modified: incubator/aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/container/BlueprintRepository.java
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/container/BlueprintRepository.java?rev=921845&r1=921844&r2=921845&view=diff
==============================================================================
--- incubator/aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/container/BlueprintRepository.java (original)
+++ incubator/aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/container/BlueprintRepository.java Thu Mar 11 13:45:28 2010
@@ -114,6 +114,13 @@ public class BlueprintRepository impleme
         }
         recipes.put(name, recipe);
     }
+    
+    public void removeRecipe(String name) {
+        if (instances.get(name) != null)
+            throw new ComponentDefinitionException("Name " + name + " is already instanciated as " + instances.get(name) + " and cannot be removed.");
+
+        recipes.remove(name);
+    }
 
     private Object convert(String name, Object instance) throws ComponentDefinitionException {
         try {

Added: incubator/aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/container/IdSpace.java
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/container/IdSpace.java?rev=921845&view=auto
==============================================================================
--- incubator/aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/container/IdSpace.java (added)
+++ incubator/aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/container/IdSpace.java Thu Mar 11 13:45:28 2010
@@ -0,0 +1,11 @@
+package org.apache.aries.blueprint.container;
+
+import java.util.concurrent.atomic.AtomicLong;
+
+public class IdSpace {
+    private AtomicLong currentId = new AtomicLong(0);
+    
+    public long nextId() {
+        return currentId.getAndIncrement();
+    }
+}

Modified: incubator/aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/container/RecipeBuilder.java
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/container/RecipeBuilder.java?rev=921845&r1=921844&r2=921845&view=diff
==============================================================================
--- incubator/aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/container/RecipeBuilder.java (original)
+++ incubator/aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/container/RecipeBuilder.java Thu Mar 11 13:45:28 2010
@@ -70,12 +70,13 @@ import org.osgi.service.blueprint.reflec
  */
 public class RecipeBuilder {
 
-    private Set<String> names = new HashSet<String>();
-    private int nameCounter;
-    private ExtendedBlueprintContainer blueprintContainer;
-    private ComponentDefinitionRegistry registry;
+    private final Set<String> names = new HashSet<String>();
+    private final ExtendedBlueprintContainer blueprintContainer;
+    private final ComponentDefinitionRegistry registry;
+    private final IdSpace recipeIdSpace;
 
-    public RecipeBuilder(ExtendedBlueprintContainer blueprintContainer) {
+    public RecipeBuilder(ExtendedBlueprintContainer blueprintContainer, IdSpace recipeIdSpace) {
+        this.recipeIdSpace = recipeIdSpace;
         this.blueprintContainer = blueprintContainer;
         this.registry = blueprintContainer.getComponentDefinitionRegistry();
     }
@@ -349,7 +350,7 @@ public class RecipeBuilder {
     private String getName(String name) {
         if (name == null) {
             do {
-                name = "#recipe-" + ++nameCounter;
+                name = "#recipe-" + recipeIdSpace.nextId();
             } while (names.contains(name) || registry.containsComponentDefinition(name));
         }
         names.add(name);

Modified: incubator/aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/di/Repository.java
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/di/Repository.java?rev=921845&r1=921844&r2=921845&view=diff
==============================================================================
--- incubator/aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/di/Repository.java (original)
+++ incubator/aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/di/Repository.java Thu Mar 11 13:45:28 2010
@@ -50,6 +50,13 @@ public interface Repository {
     Recipe getRecipe(String name);
 
     void putRecipe(String name, Recipe recipe);
+    
+    /**
+     * Remove an uninstantiated recipe
+     * @param name
+     * @throws ComponentDefinitionException if the recipe is already instantiated
+     */
+    void removeRecipe(String name);
 
     Object create(String name) throws ComponentDefinitionException;
 



Re: svn commit: r921845 - in /incubator/aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint: container/ di/

Posted by Valentin Mahrwald <vm...@googlemail.com>.
Oops, new Eclipse workspace -> settings gone.

Thanks for your watchful eye :)

Valentin

On 13 Mar 2010, at 03:39, Donald Woods wrote:

> Looks like a file was added without the required license header, which
> will cause mvn rat:check to fail at release time....
>
> incubator/aries/trunk/blueprint/blueprint-core/src/main/java/org/ 
> apache/aries/blueprint/container/IdSpace.java
>
>
> -Donald
>
>
> On 3/11/10 8:45 AM, mahrwald@apache.org wrote:
>> Author: mahrwald
>> Date: Thu Mar 11 13:45:28 2010
>> New Revision: 921845
>>
>> URL: http://svn.apache.org/viewvc?rev=921845&view=rev
>> Log:
>> ARIES-246: Fix duplicate anon component recipe problem with  
>> CompDefRegProcessors
>>
>> Added:
>>    incubator/aries/trunk/blueprint/blueprint-core/src/main/java/org/ 
>> apache/aries/blueprint/container/IdSpace.java
>> Modified:
>>    incubator/aries/trunk/blueprint/blueprint-core/src/main/java/org/ 
>> apache/aries/blueprint/container/BlueprintContainerImpl.java
>>    incubator/aries/trunk/blueprint/blueprint-core/src/main/java/org/ 
>> apache/aries/blueprint/container/BlueprintRepository.java
>>    incubator/aries/trunk/blueprint/blueprint-core/src/main/java/org/ 
>> apache/aries/blueprint/container/RecipeBuilder.java
>>    incubator/aries/trunk/blueprint/blueprint-core/src/main/java/org/ 
>> apache/aries/blueprint/di/Repository.java
>>
>> Modified: incubator/aries/trunk/blueprint/blueprint-core/src/main/ 
>> java/org/apache/aries/blueprint/container/BlueprintContainerImpl.java
>> URL: http://svn.apache.org/viewvc/incubator/aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/container/BlueprintContainerImpl.java?rev=921845&r1=921844&r2=921845&view=diff
>> = 
>> = 
>> = 
>> = 
>> = 
>> = 
>> = 
>> = 
>> = 
>> =====================================================================
>> --- incubator/aries/trunk/blueprint/blueprint-core/src/main/java/ 
>> org/apache/aries/blueprint/container/BlueprintContainerImpl.java  
>> (original)
>> +++ incubator/aries/trunk/blueprint/blueprint-core/src/main/java/ 
>> org/apache/aries/blueprint/container/BlueprintContainerImpl.java  
>> Thu Mar 11 13:45:28 2010
>> @@ -138,7 +138,8 @@ public class BlueprintContainerImpl impl
>>     private final AtomicBoolean running = new AtomicBoolean();
>>     private List<ServiceRecipe> services;
>>     private AccessControlContext accessControlContext;
>> -
>> +    private final IdSpace tempRecipeIdSpace = new IdSpace();
>> +
>>     public BlueprintContainerImpl(BundleContext bundleContext,  
>> Bundle extenderBundle, BlueprintListener eventDispatcher,  
>> NamespaceHandlerRegistry handlers, ScheduledExecutorService  
>> executors, List<Object> pathList) {
>>         this.bundleContext = bundleContext;
>>         this.extenderBundle = extenderBundle;
>> @@ -427,7 +428,7 @@ public class BlueprintContainerImpl impl
>>
>>     public BlueprintRepository getRepository() {
>>         if (repository == null) {
>> -            repository = new RecipeBuilder(this).createRepository();
>> +            repository = new RecipeBuilder(this,  
>> tempRecipeIdSpace).createRepository();
>>         }
>>         return repository;
>>     }
>> @@ -484,15 +485,31 @@ public class BlueprintContainerImpl impl
>>             }
>>             // Update repository with recipes processed by the  
>> processors
>>             untrackServiceReferences();
>> -            Repository tmpRepo = new  
>> RecipeBuilder(this).createRepository();
>> +            Repository tmpRepo = new RecipeBuilder(this,  
>> tempRecipeIdSpace).createRepository();
>> +
>> +            LOGGER.debug("Updating blueprint repository");
>> +
>> +            for (String name : repository.getNames()) {
>> +                if (repository.getInstance(name) == null) {
>> +                    LOGGER.debug("Removing uninstantiated recipe  
>> {}", new Object[] { name });
>> +                    repository.removeRecipe(name);
>> +                } else {
>> +                    LOGGER.debug("Recipe {} is already  
>> instantiated", new Object[] { name });
>> +                }
>> +            }
>> +
>>             for (String name : tmpRepo.getNames()) {
>>                 if (repository.getInstance(name) == null) {
>> +                    LOGGER.debug("Adding new recipe {}", new  
>> Object[] { name });
>>                     Recipe r = tmpRepo.getRecipe(name);
>>                     if (r != null) {
>>                         repository.putRecipe(name, r);
>>                     }
>> +                } else {
>> +                    LOGGER.debug("Recipe {} is already  
>> instantiated and cannot be updated", new Object[] { name });
>>                 }
>>             }
>> +
>>             getSatisfiableDependenciesMap(true);
>>             trackServiceReferences();
>>         }
>>
>> Modified: incubator/aries/trunk/blueprint/blueprint-core/src/main/ 
>> java/org/apache/aries/blueprint/container/BlueprintRepository.java
>> URL: http://svn.apache.org/viewvc/incubator/aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/container/BlueprintRepository.java?rev=921845&r1=921844&r2=921845&view=diff
>> = 
>> = 
>> = 
>> = 
>> = 
>> = 
>> = 
>> = 
>> = 
>> =====================================================================
>> --- incubator/aries/trunk/blueprint/blueprint-core/src/main/java/ 
>> org/apache/aries/blueprint/container/BlueprintRepository.java  
>> (original)
>> +++ incubator/aries/trunk/blueprint/blueprint-core/src/main/java/ 
>> org/apache/aries/blueprint/container/BlueprintRepository.java Thu  
>> Mar 11 13:45:28 2010
>> @@ -114,6 +114,13 @@ public class BlueprintRepository impleme
>>         }
>>         recipes.put(name, recipe);
>>     }
>> +
>> +    public void removeRecipe(String name) {
>> +        if (instances.get(name) != null)
>> +            throw new ComponentDefinitionException("Name " + name  
>> + " is already instanciated as " + instances.get(name) + " and  
>> cannot be removed.");
>> +
>> +        recipes.remove(name);
>> +    }
>>
>>     private Object convert(String name, Object instance) throws  
>> ComponentDefinitionException {
>>         try {
>>
>> Added: incubator/aries/trunk/blueprint/blueprint-core/src/main/java/ 
>> org/apache/aries/blueprint/container/IdSpace.java
>> URL: http://svn.apache.org/viewvc/incubator/aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/container/IdSpace.java?rev=921845&view=auto
>> = 
>> = 
>> = 
>> = 
>> = 
>> = 
>> = 
>> = 
>> = 
>> =====================================================================
>> --- incubator/aries/trunk/blueprint/blueprint-core/src/main/java/ 
>> org/apache/aries/blueprint/container/IdSpace.java (added)
>> +++ incubator/aries/trunk/blueprint/blueprint-core/src/main/java/ 
>> org/apache/aries/blueprint/container/IdSpace.java Thu Mar 11  
>> 13:45:28 2010
>> @@ -0,0 +1,11 @@
>> +package org.apache.aries.blueprint.container;
>> +
>> +import java.util.concurrent.atomic.AtomicLong;
>> +
>> +public class IdSpace {
>> +    private AtomicLong currentId = new AtomicLong(0);
>> +
>> +    public long nextId() {
>> +        return currentId.getAndIncrement();
>> +    }
>> +}
>>
>> Modified: incubator/aries/trunk/blueprint/blueprint-core/src/main/ 
>> java/org/apache/aries/blueprint/container/RecipeBuilder.java
>> URL: http://svn.apache.org/viewvc/incubator/aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/container/RecipeBuilder.java?rev=921845&r1=921844&r2=921845&view=diff
>> = 
>> = 
>> = 
>> = 
>> = 
>> = 
>> = 
>> = 
>> = 
>> =====================================================================
>> --- incubator/aries/trunk/blueprint/blueprint-core/src/main/java/ 
>> org/apache/aries/blueprint/container/RecipeBuilder.java (original)
>> +++ incubator/aries/trunk/blueprint/blueprint-core/src/main/java/ 
>> org/apache/aries/blueprint/container/RecipeBuilder.java Thu Mar 11  
>> 13:45:28 2010
>> @@ -70,12 +70,13 @@ import org.osgi.service.blueprint.reflec
>>  */
>> public class RecipeBuilder {
>>
>> -    private Set<String> names = new HashSet<String>();
>> -    private int nameCounter;
>> -    private ExtendedBlueprintContainer blueprintContainer;
>> -    private ComponentDefinitionRegistry registry;
>> +    private final Set<String> names = new HashSet<String>();
>> +    private final ExtendedBlueprintContainer blueprintContainer;
>> +    private final ComponentDefinitionRegistry registry;
>> +    private final IdSpace recipeIdSpace;
>>
>> -    public RecipeBuilder(ExtendedBlueprintContainer  
>> blueprintContainer) {
>> +    public RecipeBuilder(ExtendedBlueprintContainer  
>> blueprintContainer, IdSpace recipeIdSpace) {
>> +        this.recipeIdSpace = recipeIdSpace;
>>         this.blueprintContainer = blueprintContainer;
>>         this.registry =  
>> blueprintContainer.getComponentDefinitionRegistry();
>>     }
>> @@ -349,7 +350,7 @@ public class RecipeBuilder {
>>     private String getName(String name) {
>>         if (name == null) {
>>             do {
>> -                name = "#recipe-" + ++nameCounter;
>> +                name = "#recipe-" + recipeIdSpace.nextId();
>>             } while (names.contains(name) ||  
>> registry.containsComponentDefinition(name));
>>         }
>>         names.add(name);
>>
>> Modified: incubator/aries/trunk/blueprint/blueprint-core/src/main/ 
>> java/org/apache/aries/blueprint/di/Repository.java
>> URL: http://svn.apache.org/viewvc/incubator/aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/di/Repository.java?rev=921845&r1=921844&r2=921845&view=diff
>> = 
>> = 
>> = 
>> = 
>> = 
>> = 
>> = 
>> = 
>> = 
>> =====================================================================
>> --- incubator/aries/trunk/blueprint/blueprint-core/src/main/java/ 
>> org/apache/aries/blueprint/di/Repository.java (original)
>> +++ incubator/aries/trunk/blueprint/blueprint-core/src/main/java/ 
>> org/apache/aries/blueprint/di/Repository.java Thu Mar 11 13:45:28  
>> 2010
>> @@ -50,6 +50,13 @@ public interface Repository {
>>     Recipe getRecipe(String name);
>>
>>     void putRecipe(String name, Recipe recipe);
>> +
>> +    /**
>> +     * Remove an uninstantiated recipe
>> +     * @param name
>> +     * @throws ComponentDefinitionException if the recipe is  
>> already instantiated
>> +     */
>> +    void removeRecipe(String name);
>>
>>     Object create(String name) throws ComponentDefinitionException;
>>
>>
>>
>>


Re: svn commit: r921845 - in /incubator/aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint: container/ di/

Posted by Donald Woods <dw...@apache.org>.
Looks like a file was added without the required license header, which
will cause mvn rat:check to fail at release time....

incubator/aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/container/IdSpace.java


-Donald


On 3/11/10 8:45 AM, mahrwald@apache.org wrote:
> Author: mahrwald
> Date: Thu Mar 11 13:45:28 2010
> New Revision: 921845
> 
> URL: http://svn.apache.org/viewvc?rev=921845&view=rev
> Log:
> ARIES-246: Fix duplicate anon component recipe problem with CompDefRegProcessors
> 
> Added:
>     incubator/aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/container/IdSpace.java
> Modified:
>     incubator/aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/container/BlueprintContainerImpl.java
>     incubator/aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/container/BlueprintRepository.java
>     incubator/aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/container/RecipeBuilder.java
>     incubator/aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/di/Repository.java
> 
> Modified: incubator/aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/container/BlueprintContainerImpl.java
> URL: http://svn.apache.org/viewvc/incubator/aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/container/BlueprintContainerImpl.java?rev=921845&r1=921844&r2=921845&view=diff
> ==============================================================================
> --- incubator/aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/container/BlueprintContainerImpl.java (original)
> +++ incubator/aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/container/BlueprintContainerImpl.java Thu Mar 11 13:45:28 2010
> @@ -138,7 +138,8 @@ public class BlueprintContainerImpl impl
>      private final AtomicBoolean running = new AtomicBoolean();
>      private List<ServiceRecipe> services;
>      private AccessControlContext accessControlContext;
> -
> +    private final IdSpace tempRecipeIdSpace = new IdSpace();
> +    
>      public BlueprintContainerImpl(BundleContext bundleContext, Bundle extenderBundle, BlueprintListener eventDispatcher, NamespaceHandlerRegistry handlers, ScheduledExecutorService executors, List<Object> pathList) {
>          this.bundleContext = bundleContext;
>          this.extenderBundle = extenderBundle;
> @@ -427,7 +428,7 @@ public class BlueprintContainerImpl impl
>      
>      public BlueprintRepository getRepository() {
>          if (repository == null) {
> -            repository = new RecipeBuilder(this).createRepository();
> +            repository = new RecipeBuilder(this, tempRecipeIdSpace).createRepository();
>          }
>          return repository;
>      }
> @@ -484,15 +485,31 @@ public class BlueprintContainerImpl impl
>              }
>              // Update repository with recipes processed by the processors
>              untrackServiceReferences();
> -            Repository tmpRepo = new RecipeBuilder(this).createRepository();
> +            Repository tmpRepo = new RecipeBuilder(this, tempRecipeIdSpace).createRepository();
> +            
> +            LOGGER.debug("Updating blueprint repository");
> +            
> +            for (String name : repository.getNames()) {
> +                if (repository.getInstance(name) == null) {
> +                    LOGGER.debug("Removing uninstantiated recipe {}", new Object[] { name });
> +                    repository.removeRecipe(name);
> +                } else {
> +                    LOGGER.debug("Recipe {} is already instantiated", new Object[] { name });
> +                }
> +            }
> +            
>              for (String name : tmpRepo.getNames()) {
>                  if (repository.getInstance(name) == null) {
> +                    LOGGER.debug("Adding new recipe {}", new Object[] { name });
>                      Recipe r = tmpRepo.getRecipe(name);
>                      if (r != null) {
>                          repository.putRecipe(name, r);
>                      }
> +                } else {
> +                    LOGGER.debug("Recipe {} is already instantiated and cannot be updated", new Object[] { name });
>                  }
>              }
> +            
>              getSatisfiableDependenciesMap(true);
>              trackServiceReferences();
>          }
> 
> Modified: incubator/aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/container/BlueprintRepository.java
> URL: http://svn.apache.org/viewvc/incubator/aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/container/BlueprintRepository.java?rev=921845&r1=921844&r2=921845&view=diff
> ==============================================================================
> --- incubator/aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/container/BlueprintRepository.java (original)
> +++ incubator/aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/container/BlueprintRepository.java Thu Mar 11 13:45:28 2010
> @@ -114,6 +114,13 @@ public class BlueprintRepository impleme
>          }
>          recipes.put(name, recipe);
>      }
> +    
> +    public void removeRecipe(String name) {
> +        if (instances.get(name) != null)
> +            throw new ComponentDefinitionException("Name " + name + " is already instanciated as " + instances.get(name) + " and cannot be removed.");
> +
> +        recipes.remove(name);
> +    }
>  
>      private Object convert(String name, Object instance) throws ComponentDefinitionException {
>          try {
> 
> Added: incubator/aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/container/IdSpace.java
> URL: http://svn.apache.org/viewvc/incubator/aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/container/IdSpace.java?rev=921845&view=auto
> ==============================================================================
> --- incubator/aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/container/IdSpace.java (added)
> +++ incubator/aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/container/IdSpace.java Thu Mar 11 13:45:28 2010
> @@ -0,0 +1,11 @@
> +package org.apache.aries.blueprint.container;
> +
> +import java.util.concurrent.atomic.AtomicLong;
> +
> +public class IdSpace {
> +    private AtomicLong currentId = new AtomicLong(0);
> +    
> +    public long nextId() {
> +        return currentId.getAndIncrement();
> +    }
> +}
> 
> Modified: incubator/aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/container/RecipeBuilder.java
> URL: http://svn.apache.org/viewvc/incubator/aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/container/RecipeBuilder.java?rev=921845&r1=921844&r2=921845&view=diff
> ==============================================================================
> --- incubator/aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/container/RecipeBuilder.java (original)
> +++ incubator/aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/container/RecipeBuilder.java Thu Mar 11 13:45:28 2010
> @@ -70,12 +70,13 @@ import org.osgi.service.blueprint.reflec
>   */
>  public class RecipeBuilder {
>  
> -    private Set<String> names = new HashSet<String>();
> -    private int nameCounter;
> -    private ExtendedBlueprintContainer blueprintContainer;
> -    private ComponentDefinitionRegistry registry;
> +    private final Set<String> names = new HashSet<String>();
> +    private final ExtendedBlueprintContainer blueprintContainer;
> +    private final ComponentDefinitionRegistry registry;
> +    private final IdSpace recipeIdSpace;
>  
> -    public RecipeBuilder(ExtendedBlueprintContainer blueprintContainer) {
> +    public RecipeBuilder(ExtendedBlueprintContainer blueprintContainer, IdSpace recipeIdSpace) {
> +        this.recipeIdSpace = recipeIdSpace;
>          this.blueprintContainer = blueprintContainer;
>          this.registry = blueprintContainer.getComponentDefinitionRegistry();
>      }
> @@ -349,7 +350,7 @@ public class RecipeBuilder {
>      private String getName(String name) {
>          if (name == null) {
>              do {
> -                name = "#recipe-" + ++nameCounter;
> +                name = "#recipe-" + recipeIdSpace.nextId();
>              } while (names.contains(name) || registry.containsComponentDefinition(name));
>          }
>          names.add(name);
> 
> Modified: incubator/aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/di/Repository.java
> URL: http://svn.apache.org/viewvc/incubator/aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/di/Repository.java?rev=921845&r1=921844&r2=921845&view=diff
> ==============================================================================
> --- incubator/aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/di/Repository.java (original)
> +++ incubator/aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/di/Repository.java Thu Mar 11 13:45:28 2010
> @@ -50,6 +50,13 @@ public interface Repository {
>      Recipe getRecipe(String name);
>  
>      void putRecipe(String name, Recipe recipe);
> +    
> +    /**
> +     * Remove an uninstantiated recipe
> +     * @param name
> +     * @throws ComponentDefinitionException if the recipe is already instantiated
> +     */
> +    void removeRecipe(String name);
>  
>      Object create(String name) throws ComponentDefinitionException;
>  
> 
> 
>