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;