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/18 22:41:00 UTC
svn commit: r786256 -
/geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/container/BlueprintRepository.java
Author: gnodet
Date: Thu Jun 18 20:41:00 2009
New Revision: 786256
URL: http://svn.apache.org/viewvc?rev=786256&view=rev
Log:
Fix destruction order
Modified:
geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/container/BlueprintRepository.java
Modified: geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/container/BlueprintRepository.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/container/BlueprintRepository.java?rev=786256&r1=786255&r2=786256&view=diff
==============================================================================
--- geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/container/BlueprintRepository.java (original)
+++ geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/container/BlueprintRepository.java Thu Jun 18 20:41:00 2009
@@ -29,6 +29,7 @@
import java.util.LinkedList;
import java.util.Iterator;
import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.CopyOnWriteArrayList;
import java.lang.reflect.Type;
import org.osgi.service.blueprint.container.ComponentDefinitionException;
@@ -71,6 +72,11 @@
private final Map<String, Object> instances = new ConcurrentHashMap<String, Object>();
/**
+ * Keep track of creation order
+ */
+ private final List<String> creationOrder = new CopyOnWriteArrayList<String>();
+
+ /**
* Lock for object instance creation
*/
private final Object instanceLock = new Object();
@@ -232,15 +238,16 @@
public void destroy() {
// destroy objects in reverse creation order
- List<Map.Entry<String, Object>> entries = new ArrayList<Map.Entry<String, Object>>(instances.entrySet());
- Collections.reverse(entries);
- for (Map.Entry<String, Object> entry : entries) {
- Recipe recipe = recipes.get(entry.getKey());
+ List<String> order = new ArrayList<String>(creationOrder);
+ Collections.reverse(order);
+ for (String name : order) {
+ Recipe recipe = recipes.get(name);
if (recipe != null) {
- recipe.destroy(entry.getValue());
+ recipe.destroy(instances.get(name));
}
}
instances.clear();
+ creationOrder.clear();
}
public Object getInstanceLock() {
@@ -300,6 +307,7 @@
throw new ComponentDefinitionException("Name " + name + " is already registered to instance " + instances.get(name));
}
instances.put(name, object);
+ creationOrder.add(name);
partialObjects.remove(name);
}
}