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/01/22 18:17:04 UTC

svn commit: r902180 - /incubator/aries/trunk/jpa/jpa-container-context/src/main/java/org/apache/aries/jpa/container/context/GlobalPersistenceManager.java

Author: mahrwald
Date: Fri Jan 22 17:17:04 2010
New Revision: 902180

URL: http://svn.apache.org/viewvc?rev=902180&view=rev
Log:
ARIES-118 Minor fixes to GlobalPersistenceManager

Modified:
    incubator/aries/trunk/jpa/jpa-container-context/src/main/java/org/apache/aries/jpa/container/context/GlobalPersistenceManager.java

Modified: incubator/aries/trunk/jpa/jpa-container-context/src/main/java/org/apache/aries/jpa/container/context/GlobalPersistenceManager.java
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/jpa/jpa-container-context/src/main/java/org/apache/aries/jpa/container/context/GlobalPersistenceManager.java?rev=902180&r1=902179&r2=902180&view=diff
==============================================================================
--- incubator/aries/trunk/jpa/jpa-container-context/src/main/java/org/apache/aries/jpa/container/context/GlobalPersistenceManager.java (original)
+++ incubator/aries/trunk/jpa/jpa-container-context/src/main/java/org/apache/aries/jpa/container/context/GlobalPersistenceManager.java Fri Jan 22 17:17:04 2010
@@ -23,7 +23,6 @@
 import java.util.HashSet;
 import java.util.Map;
 import java.util.Set;
-import java.util.WeakHashMap;
 
 import org.apache.aries.jpa.container.context.impl.PersistenceContextManager;
 import org.apache.aries.jpa.container.context.transaction.impl.JTAPersistenceContextRegistry;
@@ -31,12 +30,19 @@
 import org.osgi.framework.BundleEvent;
 import org.osgi.framework.SynchronousBundleListener;
 
+/**
+ * Class that coordinates PersistenceContextManagers across multiple (nested) OSGi frameworks.
+ */
 public class GlobalPersistenceManager implements PersistenceManager, SynchronousBundleListener {
 
   private JTAPersistenceContextRegistry registry;
   
+  /** The list of persistence context managers. Each is valid for exactly one framework
+   *    as identified by the respective system bundle. This allows us to work properly in 
+   *    a multi (nested) framework environment without using the (deprecated) CompositeBundle API.
+   */
   private Map<Bundle, PersistenceContextManager> managers = 
-    new WeakHashMap<Bundle, PersistenceContextManager>();
+    new HashMap<Bundle, PersistenceContextManager>();
   
   private Map<Bundle, Set<String>> persistenceContexts = 
     new HashMap<Bundle, Set<String>>();
@@ -49,15 +55,17 @@
   public void registerContext(String unitName, Bundle client, HashMap<String, Object> properties) {
     Bundle frameworkBundle = client.getBundleContext().getBundle(0);
     PersistenceContextManager manager = null;
+    boolean newManager = false;
     
     synchronized (this) {
       if (managers.containsKey(frameworkBundle)) {
         manager = managers.get(frameworkBundle);
       } else {
         manager = new PersistenceContextManager(frameworkBundle.getBundleContext(), registry);
-        manager.open();
         managers.put(frameworkBundle, manager);
         frameworkBundle.getBundleContext().addBundleListener(this);
+        
+        newManager = true;
       }
       
       if (!persistenceContexts.containsKey(client)) {
@@ -67,6 +75,9 @@
       persistenceContexts.get(client).add(unitName);
     }
     
+    if (newManager)
+      manager.open();
+    
     manager.registerContext(unitName, client, properties);
   }
 
@@ -86,7 +97,10 @@
           manager = managers.get(frameworkBundle);
           if (manager == null)
             throw new IllegalStateException();
-        }        
+        } else if (managers.containsKey(bundle)) {
+          managers.remove(bundle);
+          bundle.getBundleContext().removeBundleListener(this);
+        }
       }
       
       for (String context : contextsToBeRemoved) {