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,