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) {