You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@aries.apache.org by ti...@apache.org on 2010/01/12 08:09:39 UTC
svn commit: r898196 - in /incubator/aries/trunk/jpa/jpa-container/src:
main/java/org/apache/aries/jpa/container/impl/
main/java/org/apache/aries/jpa/container/unit/impl/
main/resources/OSGI-INF/blueprint/ test/java/org/apache/aries/jpa/container/
Author: timothyjward
Date: Tue Jan 12 07:09:38 2010
New Revision: 898196
URL: http://svn.apache.org/viewvc?rev=898196&view=rev
Log:
ARIES-79: Create and manage EntityManagerFactory services for persistence units
Modified:
incubator/aries/trunk/jpa/jpa-container/src/main/java/org/apache/aries/jpa/container/impl/EntityManagerFactoryManager.java
incubator/aries/trunk/jpa/jpa-container/src/main/java/org/apache/aries/jpa/container/impl/PersistenceBundleHelper.java
incubator/aries/trunk/jpa/jpa-container/src/main/java/org/apache/aries/jpa/container/impl/PersistenceBundleManager.java
incubator/aries/trunk/jpa/jpa-container/src/main/java/org/apache/aries/jpa/container/unit/impl/PersistenceUnitInfoImpl.java
incubator/aries/trunk/jpa/jpa-container/src/main/resources/OSGI-INF/blueprint/jpa.xml
incubator/aries/trunk/jpa/jpa-container/src/test/java/org/apache/aries/jpa/container/PersistenceBundleLifecycleTest.java
Modified: incubator/aries/trunk/jpa/jpa-container/src/main/java/org/apache/aries/jpa/container/impl/EntityManagerFactoryManager.java
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/jpa/jpa-container/src/main/java/org/apache/aries/jpa/container/impl/EntityManagerFactoryManager.java?rev=898196&r1=898195&r2=898196&view=diff
==============================================================================
--- incubator/aries/trunk/jpa/jpa-container/src/main/java/org/apache/aries/jpa/container/impl/EntityManagerFactoryManager.java (original)
+++ incubator/aries/trunk/jpa/jpa-container/src/main/java/org/apache/aries/jpa/container/impl/EntityManagerFactoryManager.java Tue Jan 12 07:09:38 2010
@@ -160,7 +160,6 @@
* This method should only be called when not holding any locks
*/
public synchronized void destroy() {
- unregisterEntityManagerFactories();
destroyEntityManagerFactories();
provider = null;
Modified: incubator/aries/trunk/jpa/jpa-container/src/main/java/org/apache/aries/jpa/container/impl/PersistenceBundleHelper.java
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/jpa/jpa-container/src/main/java/org/apache/aries/jpa/container/impl/PersistenceBundleHelper.java?rev=898196&r1=898195&r2=898196&view=diff
==============================================================================
--- incubator/aries/trunk/jpa/jpa-container/src/main/java/org/apache/aries/jpa/container/impl/PersistenceBundleHelper.java (original)
+++ incubator/aries/trunk/jpa/jpa-container/src/main/java/org/apache/aries/jpa/container/impl/PersistenceBundleHelper.java Tue Jan 12 07:09:38 2010
@@ -67,24 +67,25 @@
//Split apart the header to get the individual entries
List<String> headerLocations = Arrays.asList(header.split(","));
locations.addAll(headerLocations);
- }
- try {
- for(String location : locations) {
- InputStream file = locateFile(bundle, location.trim());
- if(file != null)
- persistenceXmlFiles.add(new PersistenceDescriptorImpl(location, file));
- }
- } catch (Exception e) {
- //TODO log
- for (PersistenceDescriptor desc : persistenceXmlFiles) {
- try {
- desc.getInputStream().close();
- } catch (IOException ioe) {
- // TODO: log ioe
+
+ try {
+ for(String location : locations) {
+ InputStream file = locateFile(bundle, location.trim());
+ if(file != null)
+ persistenceXmlFiles.add(new PersistenceDescriptorImpl(location, file));
+ }
+ } catch (Exception e) {
+ //TODO log
+ for (PersistenceDescriptor desc : persistenceXmlFiles) {
+ try {
+ desc.getInputStream().close();
+ } catch (IOException ioe) {
+ // TODO: log ioe
+ }
}
+ persistenceXmlFiles = Collections.emptySet();
}
- persistenceXmlFiles = Collections.emptySet();
}
return persistenceXmlFiles;
}
@@ -100,7 +101,7 @@
private static InputStream locateFile(Bundle bundle, String location)
{
InputStream is = null;
- if(location != "") {
+ if(location == "") {
return null;
}
@@ -114,6 +115,7 @@
is = url.openStream();
} catch (IOException e) {
// TODO log this
+ e.printStackTrace();
}
}
} else {
Modified: incubator/aries/trunk/jpa/jpa-container/src/main/java/org/apache/aries/jpa/container/impl/PersistenceBundleManager.java
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/jpa/jpa-container/src/main/java/org/apache/aries/jpa/container/impl/PersistenceBundleManager.java?rev=898196&r1=898195&r2=898196&view=diff
==============================================================================
--- incubator/aries/trunk/jpa/jpa-container/src/main/java/org/apache/aries/jpa/container/impl/PersistenceBundleManager.java (original)
+++ incubator/aries/trunk/jpa/jpa-container/src/main/java/org/apache/aries/jpa/container/impl/PersistenceBundleManager.java Tue Jan 12 07:09:38 2010
@@ -105,10 +105,12 @@
if(persistenceUnitFactory == null)
persistenceUnitFactory = new ManagedPersistenceUnitInfoFactoryImpl();
-
super.open();
}
+
+
+
// /**
// * If we have generated a resources for the supplied bundle, then
// * tidy them up.
@@ -134,8 +136,7 @@
// }
// }
// }
-
-
+
public Object addingBundle(Bundle bundle, BundleEvent event)
{
@@ -179,16 +180,19 @@
}
}
}
- try {
- mgr.bundleStateChange();
- } catch (InvalidPersistenceUnitException e) {
- // TODO Log this error
- mgr.destroy();
+ if(mgr != null) {
+ try {
+ mgr.bundleStateChange();
+ } catch (InvalidPersistenceUnitException e) {
+ // TODO Log this error
+ mgr.destroy();
+ persistenceUnitFactory.destroyPersistenceBundle(bundle);
+ }
}
}
}
return mgr;
-}
+ }
public synchronized void addingProvider(ServiceReference ref)
{
@@ -390,7 +394,7 @@
}
//Now check that we have valid values
- int check = minVersion.compareTo(maxVersion);
+ int check = (maxVersion == null) ? -1 : minVersion.compareTo(maxVersion);
//If min is greater than max, or min is equal to max and one of the exclusive
//flags is set then we have a problem!
if(check > 0 || (check == 0 && (minExclusive || maxExclusive))) {
Modified: incubator/aries/trunk/jpa/jpa-container/src/main/java/org/apache/aries/jpa/container/unit/impl/PersistenceUnitInfoImpl.java
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/jpa/jpa-container/src/main/java/org/apache/aries/jpa/container/unit/impl/PersistenceUnitInfoImpl.java?rev=898196&r1=898195&r2=898196&view=diff
==============================================================================
--- incubator/aries/trunk/jpa/jpa-container/src/main/java/org/apache/aries/jpa/container/unit/impl/PersistenceUnitInfoImpl.java (original)
+++ incubator/aries/trunk/jpa/jpa-container/src/main/java/org/apache/aries/jpa/container/unit/impl/PersistenceUnitInfoImpl.java Tue Jan 12 07:09:38 2010
@@ -105,7 +105,7 @@
}
public URL getPersistenceUnitRootUrl() {
- return bundle.getResource("");
+ return bundle.getResource("/");
}
public String getPersistenceXMLSchemaVersion() {
Modified: incubator/aries/trunk/jpa/jpa-container/src/main/resources/OSGI-INF/blueprint/jpa.xml
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/jpa/jpa-container/src/main/resources/OSGI-INF/blueprint/jpa.xml?rev=898196&r1=898195&r2=898196&view=diff
==============================================================================
--- incubator/aries/trunk/jpa/jpa-container/src/main/resources/OSGI-INF/blueprint/jpa.xml (original)
+++ incubator/aries/trunk/jpa/jpa-container/src/main/resources/OSGI-INF/blueprint/jpa.xml Tue Jan 12 07:09:38 2010
@@ -17,8 +17,9 @@
-->
<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">
- <bean id="container" class="org.apache.aries.jpa.container.impl.PersistenceBundleManager" init-method="open">
+ <bean id="container" class="org.apache.aries.jpa.container.impl.PersistenceBundleManager" init-method="open" destroy-method="close">
<argument ref="blueprintBundleContext"/>
+ <property name="config"><props/></property>
</bean>
<reference-list interface="javax.persistence.spi.PersistenceProvider">
Modified: incubator/aries/trunk/jpa/jpa-container/src/test/java/org/apache/aries/jpa/container/PersistenceBundleLifecycleTest.java
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/jpa/jpa-container/src/test/java/org/apache/aries/jpa/container/PersistenceBundleLifecycleTest.java?rev=898196&r1=898195&r2=898196&view=diff
==============================================================================
--- incubator/aries/trunk/jpa/jpa-container/src/test/java/org/apache/aries/jpa/container/PersistenceBundleLifecycleTest.java (original)
+++ incubator/aries/trunk/jpa/jpa-container/src/test/java/org/apache/aries/jpa/container/PersistenceBundleLifecycleTest.java Tue Jan 12 07:09:38 2010
@@ -28,11 +28,15 @@
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
+import java.util.Dictionary;
import java.util.Hashtable;
+import java.util.Map;
+import java.util.Properties;
import java.util.Vector;
import javax.persistence.EntityManagerFactory;
import javax.persistence.spi.PersistenceProvider;
+import javax.persistence.spi.PersistenceUnitInfo;
import org.apache.aries.jpa.container.impl.PersistenceBundleManager;
import org.apache.aries.mocks.BundleContextMock;
@@ -48,6 +52,7 @@
import org.osgi.framework.Constants;
import org.osgi.framework.InvalidSyntaxException;
import org.osgi.framework.ServiceReference;
+import org.osgi.framework.ServiceRegistration;
import org.osgi.framework.Version;
public class PersistenceBundleLifecycleTest
@@ -55,6 +60,7 @@
private static final String FRAGMENT_SYM_NAME = "scooby.doo.jpa.fragment";
private Bundle persistenceBundle;
+ private BundleContext persistenceBundleContext;
private Bundle providerBundleP100;
private Bundle providerBundleP101;
@@ -63,102 +69,131 @@
private Bundle extenderBundle;
+ private PersistenceBundleManager mgr;
+ private PersistenceProvider pp;
+
@Before
public void setUp() throws Exception
{
persistenceBundle = Skeleton.newMock(new BundleMock("scooby.doo", new Hashtable<String, Object>()), Bundle.class);
+ persistenceBundleContext = persistenceBundle.getBundleContext();
- providerBundleP100 = Skeleton.newMock(new BundleMock("no.such.Provider", new Hashtable<String, Object>()), Bundle.class);
- Skeleton skel = Skeleton.getSkeleton(providerBundleP100);
- skel.setReturnValue(new MethodCall(Bundle.class, "getVersion"), new Version("1.0.0"));
-
- providerBundleP101 = Skeleton.newMock(new BundleMock("no.such.Provider", new Hashtable<String, Object>()), Bundle.class);
- skel = Skeleton.getSkeleton(providerBundleP101);
- skel.setReturnValue(new MethodCall(Bundle.class, "getVersion"), new Version("1.0.1"));
-
- providerBundleP110 = Skeleton.newMock(new BundleMock("no.such.Provider", new Hashtable<String, Object>()), Bundle.class);
- skel = Skeleton.getSkeleton(providerBundleP110);
- skel.setReturnValue(new MethodCall(Bundle.class, "getVersion"), new Version("1.1.0"));
-
- providerBundleP111 = Skeleton.newMock(new BundleMock("no.such.Provider", new Hashtable<String, Object>()), Bundle.class);
- skel = Skeleton.getSkeleton(providerBundleP111);
- skel.setReturnValue(new MethodCall(Bundle.class, "getVersion"), new Version("1.1.1"));
+// providerBundleP100 = Skeleton.newMock(new BundleMock("no.such.Provider", new Hashtable<String, Object>()), Bundle.class);
+// Skeleton skel = Skeleton.getSkeleton(providerBundleP100);
+// skel.setReturnValue(new MethodCall(Bundle.class, "getVersion"), new Version("1.0.0"));
+//
+// providerBundleP101 = Skeleton.newMock(new BundleMock("no.such.Provider", new Hashtable<String, Object>()), Bundle.class);
+// skel = Skeleton.getSkeleton(providerBundleP101);
+// skel.setReturnValue(new MethodCall(Bundle.class, "getVersion"), new Version("1.0.1"));
+//
+// providerBundleP110 = Skeleton.newMock(new BundleMock("no.such.Provider", new Hashtable<String, Object>()), Bundle.class);
+// skel = Skeleton.getSkeleton(providerBundleP110);
+// skel.setReturnValue(new MethodCall(Bundle.class, "getVersion"), new Version("1.1.0"));
+//
+// providerBundleP111 = Skeleton.newMock(new BundleMock("no.such.Provider", new Hashtable<String, Object>()), Bundle.class);
+// skel = Skeleton.getSkeleton(providerBundleP111);
+// skel.setReturnValue(new MethodCall(Bundle.class, "getVersion"), new Version("1.1.1"));
extenderBundle = Skeleton.newMock(new BundleMock("extender", new Hashtable<String, Object>()), Bundle.class);
- Skeleton.getSkeleton(extenderBundle).setReturnValue(new MethodCall(Bundle.class, "getResource", "schemas/persistence_1_0.xsd"), new File("unittest/resources/persistence_1_0.xsd").toURI().toURL());
- persistenceBundle = Skeleton.newMock(new BundleMock("scooby.doo", new Hashtable<String, Object>()), Bundle.class);
+// Skeleton.getSkeleton(extenderBundle).setReturnValue(new MethodCall(Bundle.class, "getResource", "schemas/persistence_1_0.xsd"), new File("unittest/resources/persistence_1_0.xsd").toURI().toURL());
}
@After
public void destroy() throws Exception
{
+ mgr = null;
BundleContextMock.clear();
}
+ private BundleContext preExistingBundleSetup() {
+
+ BundleContext ctx = extenderBundle.getBundleContext();
+
+ Skeleton.getSkeleton(ctx).setReturnValue(
+ new MethodCall(BundleContext.class, "getBundles"),
+ new Bundle[] {persistenceBundle});
+
+ mgr = new PersistenceBundleManager(ctx);
+ mgr.setConfig(new Properties());
+ return ctx;
+ }
+
@Test
- public void testManager_OnePreExistingPersistenceBundle_NoProvider() throws Exception
+ public void testManager_NonPersistenceBundle() throws Exception
{
- BundleContext ctx = extenderBundle.getBundleContext();
+ preExistingBundleSetup();
+ mgr.open();
- PersistenceBundleManager mgr = new PersistenceBundleManager(ctx);
+ //Check the persistence.xml was not looked for
+ Skeleton.getSkeleton(persistenceBundle).assertNotCalled(new MethodCall(Bundle.class, "getEntry", String.class));
+ //Check we didn't use getResource()
+ Skeleton.getSkeleton(persistenceBundle).assertNotCalled(new MethodCall(Bundle.class, "getResource", String.class));
+ //Check we don't have an EMF
+ BundleContextMock.assertNoServiceExists(EntityManagerFactory.class.getName());
- setupPersistenceBundle("unittest/resources/file4/");
+ }
+
+ @Test
+ public void testManager_OnePreExistingPersistenceBundle_NoProvider() throws Exception
+ {
+ preExistingBundleSetup();
- mgr.addingBundle(persistenceBundle, null);
+ //Set the persistence.xml etc
+ setupPersistenceBundle("file4", "");
+ mgr.open();
+
+ //Check the persistence.xml was looked for
+ Skeleton.getSkeleton(persistenceBundle).assertCalled(new MethodCall(Bundle.class, "getEntry", "META-INF/persistence.xml"));
+ //Check we didn't use getResource()
+ Skeleton.getSkeleton(persistenceBundle).assertNotCalled(new MethodCall(Bundle.class, "getResource", String.class));
+ //Check we don't have an EMF
BundleContextMock.assertNoServiceExists(EntityManagerFactory.class.getName());
}
-//
-// @Test
-// public void testManagerStartOneExistingPersistenceBundleOneExistingProvider() throws Exception
-// {
-// //Check we don't register anything (the bundle was installed before we started)
-//
-// PersistenceProvider pp = Skeleton.newMock(PersistenceProvider.class);
-//
-// Hashtable<String,String> hash1 = new Hashtable<String, String>();
-// persistenceBundle.getBundleContext().registerService(new String[] {PersistenceProvider.class.getName(), "no.such.Provider"} ,
-// pp, hash1 );
-//
-// PersistenceBundleManager mgr = new PersistenceBundleManager();
-//
-// BundleContext ctx = extenderBundle.getBundleContext();
-//
-// Skeleton.getSkeleton(ctx).setReturnValue(
-// new MethodCall(BundleContext.class, "getBundles"),
-// new Bundle[] {persistenceBundle});
-//
-// setupPersistenceBundle("unittest/resources/file4/");
-//
-// mgr.start(ctx);
-//
-// BundleContextMock.assertNoServiceExists(PersistenceUnitInfoService.class.getName());
-// }
-//
-// @Test
-// public void testManagerStopUnregistersUnits() throws Exception
-// {
-// PersistenceProvider pp = Skeleton.newMock(PersistenceProvider.class);
-//
-// Hashtable<String,String> hash1 = new Hashtable<String, String>();
-// persistenceBundle.getBundleContext().registerService(new String[] {PersistenceProvider.class.getName(), "no.such.Provider"} ,
-// pp, hash1 );
-//
-// PersistenceBundleManager mgr = new PersistenceBundleManager();
-//
-// BundleContext ctx = extenderBundle.getBundleContext();
-//
-// setupPersistenceBundle("unittest/resources/file4/");
-// mgr.start(ctx);
-//
-// testSuccessfulInstalledEvent(mgr, ctx, 1);
-//
-// mgr.stop(ctx);
-//
-// BundleContextMock.assertNoServiceExists(PersistenceUnitInfoService.class.getName());
-// }
-//
+
+ @Test
+ public void testManager_OnePreExistingPersistenceBundle_OneExistingProvider() throws Exception
+ {
+ BundleContext ctx = preExistingBundleSetup();
+
+ pp = Skeleton.newMock(PersistenceProvider.class);
+
+ Hashtable<String,String> hash1 = new Hashtable<String, String>();
+ hash1.put("javax.persistence.provider", "no.such.Provider");
+ ServiceRegistration reg = persistenceBundle.getBundleContext().registerService(new String[] {PersistenceProvider.class.getName()} ,
+ pp, hash1 );
+ ServiceReference ref = reg.getReference();
+
+ mgr.addingProvider(ref);
+
+ setupPersistenceBundle("file4", "");
+
+ mgr.open();
+
+ //Check the persistence.xml was looked for
+ Skeleton.getSkeleton(persistenceBundle).assertCalled(new MethodCall(Bundle.class, "getEntry", "META-INF/persistence.xml"));
+ //Check we didn't use getResource()
+ Skeleton.getSkeleton(persistenceBundle).assertNotCalled(new MethodCall(Bundle.class, "getResource", String.class));
+ //Check we loaded the Provider service
+ Skeleton.getSkeleton(ctx).assertCalled(new MethodCall(BundleContext.class, "getService", ref));
+ Skeleton.getSkeleton(persistenceBundleContext).assertCalled(new MethodCall(BundleContext.class, "registerService", EntityManagerFactory.class.getName(), EntityManagerFactory.class, Dictionary.class));
+ Skeleton.getSkeleton(pp).assertCalled(new MethodCall(PersistenceProvider.class, "createContainerEntityManagerFactory", PersistenceUnitInfo.class, Map.class));
+
+ BundleContextMock.assertServiceExists(EntityManagerFactory.class.getName());
+ }
+
+ @Test
+ public void testManagerStopUnregistersUnits() throws Exception
+ {
+ testManager_OnePreExistingPersistenceBundle_OneExistingProvider();
+
+ mgr.close();
+
+ Skeleton.getSkeleton(pp).assertCalled(new MethodCall(EntityManagerFactory.class, "close"));
+ BundleContextMock.assertNoServiceExists(EntityManagerFactory.class.getName());
+ }
+
// @Test
// public void testBundleChangedInstalledOnePreexistingProvider() throws Exception
// {
@@ -888,20 +923,20 @@
// testUnsuccessfulInstalledEvent(mgr, ctx);
// }
//
- private void setupPersistenceBundle(String s) throws MalformedURLException
+ private void setupPersistenceBundle(String root, String header) throws MalformedURLException
{
+ persistenceBundle.getHeaders().put("Meta-Persistence", header);
+
Skeleton skel = Skeleton.getSkeleton(persistenceBundle);
skel.setReturnValue(new MethodCall(Bundle.class, "getState"), Bundle.ACTIVE);
- URL root = new File(s).toURI().toURL();
+ URL rootURL = getClass().getClassLoader().getResource(root);
+ URL xml = getClass().getClassLoader().getResource(root + "/META-INF/persistence.xml");
- URL xml = new File(s + "META-INF/persistence.xml").toURI().toURL();
-
- skel.setReturnValue(new MethodCall(Bundle.class, "getEntry", "/"), root);
- skel.setReturnValue(new MethodCall(Bundle.class, "getEntry", "/META-INF/persistence.xml"), xml);
+ skel.setReturnValue(new MethodCall(Bundle.class, "getResource", "/"), rootURL);
+ skel.setReturnValue(new MethodCall(Bundle.class, "getEntry", "META-INF/persistence.xml"), xml);
skel.setReturnValue(new MethodCall(Bundle.class, "getVersion"), new Version("0.0.0"));
-
}
//
// private void registerVersionedPersistenceProviders(PersistenceProvider pp100,