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/14 10:29:10 UTC

svn commit: r899131 [1/2] - in /incubator/aries/trunk/jpa/jpa-container/src: main/java/org/apache/aries/jpa/container/impl/ test/java/org/apache/aries/jpa/container/ test/java/org/apache/aries/jpa/container/util/ test/resources/file10/META-INF/ test/re...

Author: timothyjward
Date: Thu Jan 14 09:29:09 2010
New Revision: 899131

URL: http://svn.apache.org/viewvc?rev=899131&view=rev
Log:
ARIES-79: Create and manage EntityManagerFactory services for persistence units

Added:
    incubator/aries/trunk/jpa/jpa-container/src/test/java/org/apache/aries/jpa/container/util/
    incubator/aries/trunk/jpa/jpa-container/src/test/java/org/apache/aries/jpa/container/util/FakeManagedPersistenceUnitFactory.java
    incubator/aries/trunk/jpa/jpa-container/src/test/resources/file21/
    incubator/aries/trunk/jpa/jpa-container/src/test/resources/file21/META-INF/
    incubator/aries/trunk/jpa/jpa-container/src/test/resources/file21/META-INF/persistence.xml
    incubator/aries/trunk/jpa/jpa-container/src/test/resources/file21/OSGI-INF/
    incubator/aries/trunk/jpa/jpa-container/src/test/resources/file21/OSGI-INF/found.xml
    incubator/aries/trunk/jpa/jpa-container/src/test/resources/file21/OSGI-INF/not-found.xml
    incubator/aries/trunk/jpa/jpa-container/src/test/resources/file21/persistence/
    incubator/aries/trunk/jpa/jpa-container/src/test/resources/file21/persistence/another.xml
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/test/java/org/apache/aries/jpa/container/PersistenceBundleLifecycleTest.java
    incubator/aries/trunk/jpa/jpa-container/src/test/resources/file10/META-INF/persistence.xml
    incubator/aries/trunk/jpa/jpa-container/src/test/resources/file11/META-INF/persistence.xml
    incubator/aries/trunk/jpa/jpa-container/src/test/resources/file12/META-INF/persistence.xml
    incubator/aries/trunk/jpa/jpa-container/src/test/resources/file13/META-INF/persistence.xml
    incubator/aries/trunk/jpa/jpa-container/src/test/resources/file14/META-INF/persistence.xml
    incubator/aries/trunk/jpa/jpa-container/src/test/resources/file15/META-INF/persistence.xml
    incubator/aries/trunk/jpa/jpa-container/src/test/resources/file16/META-INF/persistence.xml
    incubator/aries/trunk/jpa/jpa-container/src/test/resources/file17/META-INF/persistence.xml
    incubator/aries/trunk/jpa/jpa-container/src/test/resources/file18/META-INF/persistence.xml
    incubator/aries/trunk/jpa/jpa-container/src/test/resources/file19/META-INF/persistence.xml
    incubator/aries/trunk/jpa/jpa-container/src/test/resources/file20/META-INF/persistence.xml
    incubator/aries/trunk/jpa/jpa-container/src/test/resources/file9/META-INF/persistence.xml

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=899131&r1=899130&r2=899131&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 Thu Jan 14 09:29:09 2010
@@ -65,6 +65,10 @@
     
     switch(bundle.getState()) {
       case Bundle.RESOLVED :
+        //If we are Resolved as a result of having stopped
+        //and missed the STOPPING event we need to unregister
+        unregisterEntityManagerFactories();
+        //Create the EMF objects if necessary
         createEntityManagerFactories();
         break;
       case Bundle.STARTING :
@@ -74,6 +78,8 @@
       case Bundle.STOPPING :
         unregisterEntityManagerFactories();
         break;
+      case Bundle.INSTALLED :
+        destroyEntityManagerFactories();
     }
   }
 
@@ -91,17 +97,26 @@
   }
 
   private void registerEntityManagerFactories() throws InvalidPersistenceUnitException {
-    if(provider != null) {
+    if(provider != null && registrations == null) {
       if(emfs == null)
         createEntityManagerFactories();
       
       registrations = new ArrayList<ServiceRegistration>();
       String providerName = (String) provider.getProperty("javax.persistence.provider");
-      
+      if(providerName == null) {
+        //TODO log this
+        throw new InvalidPersistenceUnitException();
+      }
       for(Entry<String, EntityManagerFactory> entry : emfs.entrySet())
       {
         Properties props = new Properties();
         String unitName = entry.getKey();
+        
+        if(unitName == null) {
+          //TODO log
+          throw new InvalidPersistenceUnitException();
+        }
+          
         props.put("osgi.unit.name", unitName);
         props.put("osgi.unit.provider", providerName);
         props.put("org.apache.aries.jpa.container.managed", Boolean.TRUE);

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=899131&r1=899130&r2=899131&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 Thu Jan 14 09:29:09 2010
@@ -122,7 +122,7 @@
       URL url = bundle.getEntry(location.substring(0, bangIndex));
       
       if(url != null) {
-        String toLocate = location.substring(bangIndex + 1);
+        String toLocate = location.substring(bangIndex + 2);
         
         try {
           JarInputStream jis = new JarInputStream(url.openStream());

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=899131&r1=899130&r2=899131&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 Thu Jan 14 09:29:09 2010
@@ -73,7 +73,7 @@
 
   private static final String DEFAULT_PU_INFO_FACTORY = "";
   
-  private static final String DEFAULT_PU_INFO_FACTORY_KEY = "org.apache.aries.jpa.container.PersistenceUnitInfoFactory";
+  private static final String DEFAULT_PU_INFO_FACTORY_KEY = "org.apache.aries.jpa.container.ManagedPersistenceUnitInfoFactory";
   
   /**
    * Create the extender. Note that it will not start tracking 
@@ -167,16 +167,17 @@
       
       if(!!!pUnits.isEmpty()) {
         ServiceReference ref = getProviderServiceReference(pUnits);
-          
-        Collection<ManagedPersistenceUnitInfo> infos = persistenceUnitFactory.
-            createManagedPersistenceUnitMetadata(ctx, bundle, ref, pUnits);
-        if(mgr != null)
-          mgr.manage(ref, infos);
-        else {
-          synchronized (this) {
-            if(persistenceProviders.contains(ref)) {
-                mgr = new EntityManagerFactoryManager(ctx, bundle, ref, infos);
-                bundleToManagerMap.put(bundle, mgr);
+        if(ref != null) {  
+          Collection<ManagedPersistenceUnitInfo> infos = persistenceUnitFactory.
+              createManagedPersistenceUnitMetadata(ctx, bundle, ref, pUnits);
+          if(mgr != null)
+            mgr.manage(ref, infos);
+          else {
+            synchronized (this) {
+              if(persistenceProviders.contains(ref)) {
+                  mgr = new EntityManagerFactoryManager(ctx, bundle, ref, infos);
+                  bundleToManagerMap.put(bundle, mgr);
+              }
             }
           }
         }
@@ -336,13 +337,15 @@
     }
     //If we have too many provider class names or incompatible version ranges specified then blow up
     
-    VersionRange range;
-    try {
-      range = combineVersionRanges(versionRanges);
-    } catch (InvalidRangeCombination e) {
-      // TODO Log this error
-      e.printStackTrace();
-      return null;
+    VersionRange range = null;
+    if(!!!versionRanges.isEmpty()) {
+      try {
+        range = combineVersionRanges(versionRanges);
+      } catch (InvalidRangeCombination e) {
+        // TODO Log this error
+        e.printStackTrace();
+        return null;
+      }
     }
     
     if(ppClassNames.size() > 1)
@@ -408,7 +411,7 @@
       rangeString.insert(0, minExclusive ? "(" : "[");
       rangeString.append(",");
       rangeString.append(maxVersion);
-      rangeString.append(maxExclusive ? ")" : "[");
+      rangeString.append(maxExclusive ? ")" : "]");
     }
     
     return ManifestHeaderProcessor.parseVersionRange(rangeString.toString());
@@ -420,37 +423,47 @@
    * @param matchingCriteria
    * @return
    */
+  @SuppressWarnings("unchecked")
   private synchronized ServiceReference getBestProvider(String providerClass, VersionRange matchingCriteria)
   {
     if(!!!persistenceProviders.isEmpty()) {
-
+      
       List<ServiceReference> refs = new ArrayList<ServiceReference>();
       
-      for(ServiceReference reference : persistenceProviders) {
+      if((providerClass != null && !!!"".equals(providerClass))
+          || matchingCriteria != null) {
+        for(ServiceReference reference : persistenceProviders) {
+          
+          if(providerClass != null && !!!providerClass.equals(
+              reference.getProperty("javax.persistence.provider")))
+            continue;
+            
+          if(matchingCriteria == null || matchingCriteria.
+              matches(reference.getBundle().getVersion()))
+            refs.add(reference);
+        }
         
-        if(providerClass != null && !!!providerClass.equals(
-            reference.getProperty("javax.persistence.provider")))
-          continue;
+        if(!!!refs.isEmpty()) {
+          //Sort the list in DESCENDING ORDER
+          Collections.sort(refs, new Comparator<ServiceReference>() {
+  
+            //TODO we may wish to use Ranking, then versions for equal ranks
+            public int compare(ServiceReference object1, ServiceReference object2)
+            {
+              Version v1 = object1.getBundle().getVersion();
+              Version v2 = object2.getBundle().getVersion();
+              return v2.compareTo(v1);
+            }
+          });
           
-        if(matchingCriteria.matches(reference.getBundle().getVersion()))
-          refs.add(reference);
-      }
-      
-      if(!!!refs.isEmpty()) {
-        //Sort the list in DESCENDING ORDER
-        Collections.sort(refs, new Comparator<ServiceReference>() {
-
-          //TODO we may wish to use Ranking, then versions for equal ranks
-          public int compare(ServiceReference object1, ServiceReference object2)
-          {
-            Version v1 = object1.getBundle().getVersion();
-            Version v2 = object2.getBundle().getVersion();
-            return v2.compareTo(v1);
-          }
-        });
-        return refs.get(0);
+          return refs.get(0);
+        } else {
+          //TODO no matching providers for matching criteria
+        }
       } else {
-        //TODO no matching providers for matching criteria
+        refs.addAll(persistenceProviders);
+        Collections.sort(refs);
+        return refs.get(0);
       }
     } else {
       //TODO log no matching Providers for impl class

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=899131&r1=899130&r2=899131&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 Thu Jan 14 09:29:09 2010
@@ -21,24 +21,30 @@
 package org.apache.aries.jpa.container;
 
 import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertSame;
+import static org.junit.Assert.assertTrue;
 
+import java.io.BufferedWriter;
 import java.io.File;
-import java.io.InputStream;
+import java.io.FileOutputStream;
+import java.io.OutputStreamWriter;
+import java.io.Writer;
 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 java.util.jar.JarOutputStream;
+import java.util.zip.ZipEntry;
 
 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.jpa.container.util.FakeManagedPersistenceUnitFactory;
 import org.apache.aries.mocks.BundleContextMock;
 import org.apache.aries.mocks.BundleMock;
 import org.apache.aries.unittest.mocks.MethodCall;
@@ -66,6 +72,11 @@
   private Bundle providerBundleP101;
   private Bundle providerBundleP110;
   private Bundle providerBundleP111;
+
+  private PersistenceProvider providerP100;
+  private PersistenceProvider providerP101;
+  private PersistenceProvider providerP110;
+  private PersistenceProvider providerP111;
   
   private Bundle extenderBundle;
   
@@ -78,21 +89,23 @@
     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"));
+    pp = Skeleton.newMock(PersistenceProvider.class);
+    
+    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());
@@ -107,15 +120,15 @@
   
   private BundleContext preExistingBundleSetup() {
     
-    BundleContext ctx = extenderBundle.getBundleContext();
+    BundleContext extenderContext = extenderBundle.getBundleContext();
 
-    Skeleton.getSkeleton(ctx).setReturnValue(
+    Skeleton.getSkeleton(extenderContext).setReturnValue(
         new MethodCall(BundleContext.class, "getBundles"),
         new Bundle[] {persistenceBundle});
     
-    mgr = new PersistenceBundleManager(ctx);
+    mgr = new PersistenceBundleManager(extenderContext);
     mgr.setConfig(new Properties());
-    return ctx;
+    return extenderContext;
   }
   
   @Test
@@ -131,6 +144,8 @@
     //Check we don't have an EMF
     BundleContextMock.assertNoServiceExists(EntityManagerFactory.class.getName());
     
+    assertNull("We should not have an EntityManagerFactoryManager", mgr.getObject(persistenceBundle));
+    
   }
   
   @Test
@@ -150,14 +165,13 @@
     //Check we don't have an EMF
     BundleContextMock.assertNoServiceExists(EntityManagerFactory.class.getName());
     
+    assertNull("We should not have an EntityManagerFactoryManager", mgr.getObject(persistenceBundle));
   }
 
   @Test
   public void testManager_OnePreExistingPersistenceBundle_OneExistingProvider() throws Exception
   {
-    BundleContext ctx = preExistingBundleSetup();
-    
-    pp = Skeleton.newMock(PersistenceProvider.class);
+    BundleContext extenderContext = preExistingBundleSetup();
     
     Hashtable<String,String> hash1 = new Hashtable<String, String>();
     hash1.put("javax.persistence.provider", "no.such.Provider");
@@ -175,12 +189,9 @@
     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());
+    testSuccessfulCreationEvent(ref, extenderContext, 1);
+    testSuccessfulRegistrationEvent(ref, extenderContext, 1);
   }
   
   @Test
@@ -194,735 +205,668 @@
     BundleContextMock.assertNoServiceExists(EntityManagerFactory.class.getName());
   }
 
-//  @Test
-//  public void testBundleChangedInstalledOnePreexistingProvider() throws Exception
-//  {
-//    //Check we correctly parse and register Persistence Units
-//
-//    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);
-//  }
-//  
-//  @Test
-//  public void testBundleChangedUninstalled() 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();
-//    
-//    Bundle fragment = Skeleton.newMock(Bundle.class);
-//    
-//    Skeleton.getSkeleton(ctx).setReturnValue(new MethodCall(BundleContext.class, "installBundle",
-//        FRAGMENT_SYM_NAME, InputStream.class), fragment);
-//    
-//    setupPersistenceBundle("unittest/resources/file4/");
-//    mgr.start(ctx);
-//
-//    testSuccessfulInstalledEvent(mgr, ctx, 1);
-//    
-//    mgr.bundleChanged(new BundleEvent(BundleEvent.UNINSTALLED, persistenceBundle));
-//    
-//    BundleContextMock.assertNoServiceExists(PersistenceUnitInfoService.class.getName());
-//    
-//    Skeleton.getSkeleton(fragment).assertCalled(new MethodCall(Bundle.class, "uninstall"));
-//  }
-//  
-//  @Test
-//  public void testBundleChangedUpdated() 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();
-//    
-//    Bundle fragment = Skeleton.newMock(Bundle.class);
-//    
-//    Skeleton.getSkeleton(ctx).setReturnValue(new MethodCall(BundleContext.class, "installBundle",
-//        FRAGMENT_SYM_NAME, InputStream.class), fragment);
-//    
-//    setupPersistenceBundle("unittest/resources/file4/");
-//    mgr.start(ctx);
-//
-//    testSuccessfulInstalledEvent(mgr, ctx, 1);
-//    
-//    Skeleton.getSkeleton(ctx).clearMethodCalls();
-//    
-//    mgr.bundleChanged(new BundleEvent(BundleEvent.UPDATED, persistenceBundle));
-//    
-//    BundleContextMock.assertServiceExists(PersistenceUnitInfoService.class.getName());
-//    
-//    ServiceReference[] refs = ctx.getServiceReferences(PersistenceUnitInfoService.class.getName(), null);
-//    
-//    assertEquals("Too many persistence units registered", 1, refs.length);
-//    
-//    Skeleton.getSkeleton(fragment).assertCalled(new MethodCall(Bundle.class, "uninstall"));
-//    Skeleton.getSkeleton(ctx).assertCalled(new MethodCall(BundleContext.class, "installBundle",
-//        FRAGMENT_SYM_NAME, InputStream.class));
-//  }
-//  
-//  @Test
-//  public void testBundleChangedUnresolved() 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();
-//    
-//    Bundle fragment = Skeleton.newMock(Bundle.class);
-//    
-//    Skeleton.getSkeleton(ctx).setReturnValue(new MethodCall(BundleContext.class, "installBundle",
-//        FRAGMENT_SYM_NAME, InputStream.class), fragment);
-//    
-//    setupPersistenceBundle("unittest/resources/file4/");
-//    mgr.start(ctx);
-//
-//    testSuccessfulInstalledEvent(mgr, ctx, 1);
-//    
-//    Skeleton.getSkeleton(ctx).clearMethodCalls();
-//    
-//    mgr.bundleChanged(new BundleEvent(BundleEvent.UNRESOLVED, persistenceBundle));
-//    
-//    BundleContextMock.assertServiceExists(PersistenceUnitInfoService.class.getName());
-//    
-//    ServiceReference[] refs = ctx.getServiceReferences(PersistenceUnitInfoService.class.getName(), null);
-//    
-//    assertEquals("Too many persistence units registered", 1, refs.length);
-//    
-//    Skeleton.getSkeleton(fragment).assertCalled(new MethodCall(Bundle.class, "uninstall"));
-//    Skeleton.getSkeleton(ctx).assertCalled(new MethodCall(BundleContext.class, "installBundle",
-//        FRAGMENT_SYM_NAME, InputStream.class));
-//  }
-//  
-//  @Test
-//  public void testBundleChangedInstalledOnePostRegisteredProvider() throws Exception
-//  {
-//    //Check we correctly parse and register Persistence Units
-//    
-//    PersistenceBundleManager mgr = new PersistenceBundleManager();
-//    
-//    BundleContext ctx = extenderBundle.getBundleContext();
-//    
-//    setupPersistenceBundle("unittest/resources/file4/");
-//    mgr.start(ctx);
-//
-//    BundleContextMock.assertNoServiceExists(PersistenceUnitInfoService.class.getName());
-//
-//    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 );
-//    
-//    testSuccessfulInstalledEvent(mgr, ctx, 1);
-//  }
-//  
-//  @Test
-//  public void testBundleChangedInstalledNoProvider() throws Exception
-//  {
-//    //Check we correctly parse and register Persistence Units
-//    
-//    PersistenceBundleManager mgr = new PersistenceBundleManager();
-//    
-//    BundleContext ctx = extenderBundle.getBundleContext();
-//    
-//    setupPersistenceBundle("unittest/resources/file4/");
-//    mgr.start(ctx);
-//
-//    testUnsuccessfulInstalledEvent(mgr, ctx);
-//  }
-//  
-//  @Test
-//  public void testInstalledWithBadXML() throws Exception
-//  {
-//    //Check we correctly parse and register EMFactories
-//
-//    PersistenceBundleManager mgr = new PersistenceBundleManager();
-//    
-//    BundleContext ctx = extenderBundle.getBundleContext();
-//    
-//    setupPersistenceBundle("unittest/resources/file3/");
-//    
-//    mgr.start(ctx);
-//    
-//    testUnsuccessfulInstalledEvent(mgr, ctx);
-//  }
-//
-//  
-//  @Test
-//  public void testBundleChangedStarting() throws Exception
-//  {
-//    //Check we correctly don't do anything on the started event
-//
-//    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.bundleChanged(new BundleEvent(BundleEvent.STARTING, persistenceBundle));
-//
-//    BundleContextMock.assertServiceExists(PersistenceUnitInfoService.class.getName());
-//    
-//    ServiceReference[] refs = persistenceBundle.getBundleContext().getServiceReferences(PersistenceUnitInfoService.class.getName(), null);
-//    
-//    assertEquals("The wrong number of persistence units were registered", 1, refs.length);
-// 
-//  }
-//
-//  @Test
-//  public void testBundleChangedLazyActivation() throws Exception
-//  {
-//  //Check we correctly don't do anything on the LAZY event
-//
-//    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.bundleChanged(new BundleEvent(BundleEvent.LAZY_ACTIVATION, persistenceBundle));
-//
-//    BundleContextMock.assertServiceExists(PersistenceUnitInfoService.class.getName());
-//    
-//    ServiceReference[] refs = persistenceBundle.getBundleContext().getServiceReferences(PersistenceUnitInfoService.class.getName(), null);
-//    
-//    assertEquals("The wrong number of persistence units were registered", 1, refs.length);
-//   }
-//    
-//  @Test
-//  public void testNoProviderInstalled() throws Exception
-//  {
-//    //Check we do not register a service when there is no Provider
-//    
-//    PersistenceBundleManager mgr = new PersistenceBundleManager();
-//    
-//    BundleContext ctx = extenderBundle.getBundleContext();
-//    
-//    setupPersistenceBundle("unittest/resources/file5/");
-//    
-//    mgr.start(ctx);
-//    
-//    testUnsuccessfulInstalledEvent(mgr, ctx);
-//  }
-//
-//  @Test
-//  public void testdefaultProvider() throws Exception
-//  {
-//    //Check we correctly parse and register EMFactories
-//
-//    PersistenceProvider pp = Skeleton.newMock(PersistenceProvider.class);
-//    
-//    Hashtable<String,String> hash1 = new Hashtable<String, String>();
-//    persistenceBundle.getBundleContext().registerService(new String[] {PersistenceBundleManager.DEFAULT_JPA_PROVIDER} ,
-//        pp, hash1 );
-//    
-//    PersistenceBundleManager mgr = new PersistenceBundleManager();
-//    
-//    BundleContext ctx = extenderBundle.getBundleContext();
-//    
-//    setupPersistenceBundle("unittest/resources/file5/");
-//    
-//    mgr.start(ctx);
-//    
-//    testSuccessfulInstalledEvent(mgr, ctx, 1);
-//
-//  }
-//  
-//  @Test
-//  public void testdefaultProviderWithWAR() throws Exception
-//  {
-//    //Check we correctly parse and register EMFactories
-//
-//    PersistenceProvider pp = Skeleton.newMock(PersistenceProvider.class);
-//    
-//    Hashtable<String,String> hash1 = new Hashtable<String, String>();
-//    persistenceBundle.getBundleContext().registerService(new String[] {PersistenceBundleManager.DEFAULT_JPA_PROVIDER} ,
-//        pp, hash1 );
-//    
-//    PersistenceBundleManager mgr = new PersistenceBundleManager();
-//    
-//    BundleContext ctx = extenderBundle.getBundleContext();
-//    
-//    Skeleton skel = Skeleton.getSkeleton(persistenceBundle);
-//    
-//    skel.setReturnValue(new MethodCall(Bundle.class, "getState"), Bundle.ACTIVE);
-//    
-//    URL root = new File("unittest/resources/file5/").toURI().toURL();
-//    URL xml = new File("unittest/resources/file5/META-INF/persistence.xml").toURI().toURL();
-//    
-//    skel.setReturnValue(new MethodCall(Bundle.class, "getEntry", "WEB-INF/classes/"), root);
-//    skel.setReturnValue(new MethodCall(Bundle.class, "getEntry", "WEB-INF/classes/META-INF/persistence.xml"), xml);
-//    skel.setReturnValue(new MethodCall(Bundle.class, "getVersion"), new Version("0.0.0"));
-//
-//    mgr.start(ctx);
-//    
-//    testSuccessfulInstalledEvent(mgr, ctx, 1);
-//  }
-//
-//  @Test
-//  public void testdefaultProviderWithWARLib() throws Exception
-//  {
-//    //Check we correctly parse and register EMFactories
-//
-//    PersistenceProvider pp = Skeleton.newMock(PersistenceProvider.class);
-//    
-//    Hashtable<String,String> hash1 = new Hashtable<String, String>();
-//    persistenceBundle.getBundleContext().registerService(new String[] {PersistenceBundleManager.DEFAULT_JPA_PROVIDER} ,
-//        pp, hash1 );
-//    
-//    PersistenceBundleManager mgr = new PersistenceBundleManager();
-//    
-//    BundleContext ctx = extenderBundle.getBundleContext();
-//    
-//    Skeleton skel = Skeleton.getSkeleton(persistenceBundle);
-//    
-//    skel.setReturnValue(new MethodCall(Bundle.class, "getState"), Bundle.ACTIVE);
-//    
-//    Vector<String> v = new Vector<String>();
-//      v.add("WEB-INF/lib/jarfile.jar");
-//    
-//    skel.setReturnValue(new MethodCall(Bundle.class, "getEntryPaths", "WEB-INF/lib"), v.elements());
-//    skel.setReturnValue(new MethodCall(Bundle.class, "getVersion"), new Version("0.0.0"));
-//    skel.setReturnValue(new MethodCall(Bundle.class, "getEntry", "WEB-INF/lib/jarfile.jar"), new File("unittest/resources/jarfile.jar").toURI().toURL());
-//
-//    mgr.start(ctx);
-//    
-//    testSuccessfulInstalledEvent(mgr, ctx, 1);
-//  }
-//  
-//  @Test
-//  public void testdefaultProviderWithBundledJar() throws Exception
-//  {
-//    //Check we correctly parse and register EMFactories
-//
-//    PersistenceProvider pp = Skeleton.newMock(PersistenceProvider.class);
-//    
-//    Hashtable<String,String> hash1 = new Hashtable<String, String>();
-//    persistenceBundle.getBundleContext().registerService(new String[] {PersistenceBundleManager.DEFAULT_JPA_PROVIDER} ,
-//        pp, hash1 );
-//    
-//    PersistenceBundleManager mgr = new PersistenceBundleManager();
-//    
-//    BundleContext ctx = extenderBundle.getBundleContext();
-//    
-//    Skeleton skel = Skeleton.getSkeleton(persistenceBundle);
-//    
-//    skel.setReturnValue(new MethodCall(Bundle.class, "getState"), Bundle.ACTIVE);
-//    
-//    URL u = new File("unittest/resources/jarfile.jar").toURI().toURL();
-//    
-//    skel.setReturnValue(new MethodCall(Bundle.class, "getEntry", "unittest/resources/jarfile.jar"), u);
-//    skel.setReturnValue(new MethodCall(Bundle.class, "getVersion"), new Version("0.0.0"));
-//    persistenceBundle.getHeaders().put(Constants.BUNDLE_CLASSPATH, "., unittest/resources/jarfile.jar");
-//
-//    mgr.start(ctx);
-//    
-//    testSuccessfulInstalledEvent(mgr, ctx, 1);
-//
-//  }
-//  
-//  @Test
-//  public void testSameProviders() throws Exception
-//  {
-//    //Check we behave correctly when two persistence units define the same
-//    //provder name
-//
-//    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/file6/");
-//    
-//    mgr.start(ctx);
-//    
-//    testSuccessfulInstalledEvent(mgr, ctx, 2);
-//  }
-//
-//  @Test
-//  public void testOneWithProviderOneWithout() throws Exception
-//  {
-//    //Check we behave correctly when two persistence units define different
-//    //provder names
-//
-//    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/file7/");
-//    
-//    mgr.start(ctx);
-//    
-//    BundleContextMock.assertNoServiceExists(PersistenceUnitInfoService.class.getName());
-//    
-//    mgr.bundleChanged(new BundleEvent(BundleEvent.INSTALLED, persistenceBundle));
-//    
-//    BundleContextMock.assertServiceExists(PersistenceUnitInfoService.class.getName());
-//    
-//    ServiceReference[] refs = persistenceBundle.getBundleContext().getServiceReferences(
-//        PersistenceUnitInfoService.class.getName(), null);
-//       
-//    assertEquals("The wrong number of EMFs were registered", 2, refs.length);
-//    
-//    Skeleton.getSkeleton(ctx).assertCalled(new MethodCall(BundleContext.class, "installBundle",
-//        FRAGMENT_SYM_NAME, InputStream.class));
-//  }
-//
-//  @Test
-//  public void testTwoProviders() throws Exception
-//  {
-//    //Check we correctly parse and register EMFactories
-//
-//    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 skel = Skeleton.getSkeleton(persistenceBundle);
-//    
-//    skel.setReturnValue(new MethodCall(Bundle.class, "getState"), Bundle.ACTIVE);
-//    
-//    Vector<URL> v = new Vector<URL>();
-//    v.add(new File("unittest/resources/file8/META-INF/persistence.xml").toURI().toURL());
-//    
-//    skel.setReturnValue(new MethodCall(Bundle.class, "findEntries", "/", "persistence.xml", true), v.elements());
-//    skel.setReturnValue(new MethodCall(Bundle.class, "getVersion"), new Version("0.0.0"));
-//    
-//    mgr.start(ctx);
-//    
-//    BundleContextMock.assertNoServiceExists(PersistenceUnitInfoService.class.getName());
-//    
-//    mgr.bundleChanged(new BundleEvent(BundleEvent.INSTALLED, persistenceBundle));
-//    
-//    BundleContextMock.assertNoServiceExists(PersistenceUnitInfoService.class.getName());
-//    
-//    Skeleton.getSkeleton(ctx).assertNotCalled(new MethodCall(BundleContext.class, "installBundle",
-//        FRAGMENT_SYM_NAME, InputStream.class));
-//  }
-//  
-//  @Test
-//  public void testpp100() throws Exception
-//  {
-//    PersistenceBundleManager mgr = new PersistenceBundleManager();
-//     
-//    PersistenceProvider pp100 = Skeleton.newMock(PersistenceProvider.class);
-//    PersistenceProvider pp101 = Skeleton.newMock(PersistenceProvider.class);
-//    PersistenceProvider pp110 = Skeleton.newMock(PersistenceProvider.class);
-//    PersistenceProvider pp111 = Skeleton.newMock(PersistenceProvider.class);
-//    
-//    registerVersionedPersistenceProviders(pp100, pp101, pp110, pp111);
-//    
-//    BundleContext ctx = extenderBundle.getBundleContext();
-//    
-//    setupPersistenceBundle("unittest/resources/file9/");
-//
-//    assertCorrectPersistenceProviderUsed(mgr, ctx, pp100);
-//  }
-//
-//  @Test
-//  public void testpp101() throws Exception
-//  {
-//    PersistenceBundleManager mgr = new PersistenceBundleManager();
-//    
-//    PersistenceProvider pp100 = Skeleton.newMock(PersistenceProvider.class);
-//    PersistenceProvider pp101 = Skeleton.newMock(PersistenceProvider.class);
-//    PersistenceProvider pp110 = Skeleton.newMock(PersistenceProvider.class);
-//    PersistenceProvider pp111 = Skeleton.newMock(PersistenceProvider.class);
-//    
-//    registerVersionedPersistenceProviders(pp100, pp101, pp110, pp111);
-//    
-//    BundleContext ctx = extenderBundle.getBundleContext();
-//    
-//    setupPersistenceBundle("unittest/resources/file10/");
-//    
-//    mgr.start(ctx);
-//    
-//    assertCorrectPersistenceProviderUsed(mgr, ctx, pp101);
-//  }
-//  
-//  @Test
-//  public void testpp101b() throws Exception
-//  {
-//    PersistenceBundleManager mgr = new PersistenceBundleManager();
-//    
-//    PersistenceProvider pp100 = Skeleton.newMock(PersistenceProvider.class);
-//    PersistenceProvider pp101 = Skeleton.newMock(PersistenceProvider.class);
-//    PersistenceProvider pp110 = Skeleton.newMock(PersistenceProvider.class);
-//    PersistenceProvider pp111 = Skeleton.newMock(PersistenceProvider.class);
-//    
-//    registerVersionedPersistenceProviders(pp100, pp101, pp110, pp111);
-//    
-//    BundleContext ctx = extenderBundle.getBundleContext();
-//    
-//    setupPersistenceBundle("unittest/resources/file11/");
-//
-//    assertCorrectPersistenceProviderUsed(mgr, ctx, pp101);
-//
-//  }
-//
-//  @Test
-//  public void testpp111() throws Exception
-//  {
-//    PersistenceBundleManager mgr = new PersistenceBundleManager();
-//    
-//    PersistenceProvider pp100 = Skeleton.newMock(PersistenceProvider.class);
-//    PersistenceProvider pp101 = Skeleton.newMock(PersistenceProvider.class);
-//    PersistenceProvider pp110 = Skeleton.newMock(PersistenceProvider.class);
-//    PersistenceProvider pp111 = Skeleton.newMock(PersistenceProvider.class);
-//    
-//    registerVersionedPersistenceProviders(pp100, pp101, pp110, pp111);
-//    
-//    BundleContext ctx = extenderBundle.getBundleContext();
-//    
-//    setupPersistenceBundle("unittest/resources/file12/");
-//
-//    assertCorrectPersistenceProviderUsed(mgr, ctx, pp111);
-//  }
-//
-//  @Test
-//  public void testppNoMatch() throws Exception
-//  {
-//    PersistenceBundleManager mgr = new PersistenceBundleManager();
-//    
-//    PersistenceProvider pp100 = Skeleton.newMock(PersistenceProvider.class);
-//    PersistenceProvider pp101 = Skeleton.newMock(PersistenceProvider.class);
-//    PersistenceProvider pp110 = Skeleton.newMock(PersistenceProvider.class);
-//    PersistenceProvider pp111 = Skeleton.newMock(PersistenceProvider.class);
-//    
-//    registerVersionedPersistenceProviders(pp100, pp101, pp110, pp111);
-//    
-//    BundleContext ctx = extenderBundle.getBundleContext();
-//    
-//    setupPersistenceBundle("unittest/resources/file13/");
-//    
-//    mgr.start(ctx);
-//    
-//    testUnsuccessfulInstalledEvent(mgr,ctx);
-//    
-//  }
-//
-//  @Test
-//  public void testTwoProvidersMatch() throws Exception
-//  {
-//    PersistenceBundleManager mgr = new PersistenceBundleManager();
-//    
-//    PersistenceProvider pp100 = Skeleton.newMock(PersistenceProvider.class);
-//    PersistenceProvider pp101 = Skeleton.newMock(PersistenceProvider.class);
-//    PersistenceProvider pp110 = Skeleton.newMock(PersistenceProvider.class);
-//    PersistenceProvider pp111 = Skeleton.newMock(PersistenceProvider.class);
-//    
-//    registerVersionedPersistenceProviders(pp100, pp101, pp110, pp111);
-//    
-//    BundleContext ctx = extenderBundle.getBundleContext();
-//    
-//    setupPersistenceBundle("unittest/resources/file14/");
-//    
-//    mgr.start(ctx);
-//    assertCorrectPersistenceProviderUsed(mgr, ctx, pp101);
-//  }
-//
-//  @Test
-//  public void testTwoProvidersNoVersionMatch() throws Exception
-//  {
-//    PersistenceBundleManager mgr = new PersistenceBundleManager();
-//    
-//    PersistenceProvider pp100 = Skeleton.newMock(PersistenceProvider.class);
-//    PersistenceProvider pp101 = Skeleton.newMock(PersistenceProvider.class);
-//    PersistenceProvider pp110 = Skeleton.newMock(PersistenceProvider.class);
-//    PersistenceProvider pp111 = Skeleton.newMock(PersistenceProvider.class);
-//    
-//    registerVersionedPersistenceProviders(pp100, pp101, pp110, pp111);
-//    
-//    BundleContext ctx = extenderBundle.getBundleContext();
-//    
-//    setupPersistenceBundle("unittest/resources/file15/");
-//    
-//    mgr.start(ctx);
-//    
-//    testUnsuccessfulInstalledEvent(mgr,ctx);
-//    
-//  }
-//
-//  @Test
-//  public void testTwoProvidersExistNoCommonVersion() throws Exception
-//  {
-//    PersistenceBundleManager mgr = new PersistenceBundleManager();
-//    
-//    PersistenceProvider pp100 = Skeleton.newMock(PersistenceProvider.class);
-//    PersistenceProvider pp101 = Skeleton.newMock(PersistenceProvider.class);
-//    PersistenceProvider pp110 = Skeleton.newMock(PersistenceProvider.class);
-//    PersistenceProvider pp111 = Skeleton.newMock(PersistenceProvider.class);
-//    
-//    registerVersionedPersistenceProviders(pp100, pp101, pp110, pp111);
-//    
-//    BundleContext ctx = extenderBundle.getBundleContext();
-//    
-//    setupPersistenceBundle("unittest/resources/file17/");
-//    
-//    mgr.start(ctx);
-//    
-//    testUnsuccessfulInstalledEvent(mgr,ctx);
-//    
-//  }
-//  
-//  @Test
-//  public void testThreeProvidersNoVersionMatch() throws Exception
-//  {
-//    PersistenceBundleManager mgr = new PersistenceBundleManager();
-//    
-//    PersistenceProvider pp100 = Skeleton.newMock(PersistenceProvider.class);
-//    PersistenceProvider pp101 = Skeleton.newMock(PersistenceProvider.class);
-//    PersistenceProvider pp110 = Skeleton.newMock(PersistenceProvider.class);
-//    PersistenceProvider pp111 = Skeleton.newMock(PersistenceProvider.class);
-//    
-//    registerVersionedPersistenceProviders(pp100, pp101, pp110, pp111);
-//    
-//    BundleContext ctx = extenderBundle.getBundleContext();
-//    
-//    setupPersistenceBundle("unittest/resources/file16/");
-//   
-//    mgr.start(ctx);
-//    
-//    testUnsuccessfulInstalledEvent(mgr,ctx);
-//    
-//  }
-//
-//  @Test
-//  public void testTwoProvidersNoVersionMatchOneExists() throws Exception
-//  {
-//    PersistenceBundleManager mgr = new PersistenceBundleManager();
-//    
-//    PersistenceProvider pp100 = Skeleton.newMock(PersistenceProvider.class);
-//    PersistenceProvider pp101 = Skeleton.newMock(PersistenceProvider.class);
-//    PersistenceProvider pp110 = Skeleton.newMock(PersistenceProvider.class);
-//    PersistenceProvider pp111 = Skeleton.newMock(PersistenceProvider.class);
-//    
-//    registerVersionedPersistenceProviders(pp100, pp101, pp110, pp111);
-//    
-//    BundleContext ctx = extenderBundle.getBundleContext();
-//    
-//    setupPersistenceBundle("unittest/resources/file18/");
-//
-//    mgr.start(ctx);
-//    
-//    testUnsuccessfulInstalledEvent(mgr,ctx);
-//  }
-//
-//  @Test
-//  public void testThreeProvidersNoVersionMatchOneExists() throws Exception
-//  {
-//    PersistenceBundleManager mgr = new PersistenceBundleManager();
-//    
-//    PersistenceProvider pp100 = Skeleton.newMock(PersistenceProvider.class);
-//    PersistenceProvider pp101 = Skeleton.newMock(PersistenceProvider.class);
-//    PersistenceProvider pp110 = Skeleton.newMock(PersistenceProvider.class);
-//    PersistenceProvider pp111 = Skeleton.newMock(PersistenceProvider.class);
-//    
-//    registerVersionedPersistenceProviders(pp100, pp101, pp110, pp111);
-//    
-//    BundleContext ctx = extenderBundle.getBundleContext();
-//    
-//    Skeleton skel = Skeleton.getSkeleton(persistenceBundle);
-//    
-//    skel.setReturnValue(new MethodCall(Bundle.class, "getState"), Bundle.ACTIVE);
-//    
-//    setupPersistenceBundle("unittest/resources/file19/");
-//
-//    mgr.start(ctx);
-//    
-//    testUnsuccessfulInstalledEvent(mgr,ctx);
-//    
-//  }
-//
-//  @Test
-//  public void testThreeProvidersNoVersionMatchTwoExist() throws Exception
-//  {
-//    PersistenceBundleManager mgr = new PersistenceBundleManager();
-//    
-//    PersistenceProvider pp100 = Skeleton.newMock(PersistenceProvider.class);
-//    PersistenceProvider pp101 = Skeleton.newMock(PersistenceProvider.class);
-//    PersistenceProvider pp110 = Skeleton.newMock(PersistenceProvider.class);
-//    PersistenceProvider pp111 = Skeleton.newMock(PersistenceProvider.class);
-//    
-//    registerVersionedPersistenceProviders(pp100, pp101, pp110, pp111);
-//    
-//    BundleContext ctx = extenderBundle.getBundleContext();
-//    
-//    Skeleton skel = Skeleton.getSkeleton(persistenceBundle);
-//    
-//    skel.setReturnValue(new MethodCall(Bundle.class, "getState"), Bundle.ACTIVE);
-//    
-//    setupPersistenceBundle("unittest/resources/file20/");
-//
-//    mgr.start(ctx);
-//
-//    testUnsuccessfulInstalledEvent(mgr, ctx);
-//  }
-// 
+  @Test
+  public void testManager_BundleInstalled_OnePreexistingProvider() throws Exception
+  {
+    //Check we correctly parse and register Persistence Units
+    
+    BundleContext extenderContext = extenderBundle.getBundleContext();
+    
+    mgr = new PersistenceBundleManager(extenderContext);
+    mgr.setConfig(new Properties());
+    mgr.open();
+    
+    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(), "no.such.Provider"} ,
+        pp, hash1 );
+    ServiceReference ref = reg.getReference();
+    mgr.addingProvider(ref);
+    
+    setupPersistenceBundle("file4", "");
+    
+    //INSTALL the bundle
+    
+    Skeleton.getSkeleton(persistenceBundle).setReturnValue(new MethodCall(Bundle.class, "getState"), Bundle.INSTALLED);
+    
+    Object o = mgr.addingBundle(persistenceBundle, new BundleEvent(BundleEvent.INSTALLED, persistenceBundle));
+
+    //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 didn't get the Provider, register a service or create an EMF
+    Skeleton.getSkeleton(extenderContext).assertNotCalled(new MethodCall(BundleContext.class, "getService", ServiceReference.class));
+    Skeleton.getSkeleton(persistenceBundleContext).assertNotCalled(new MethodCall(BundleContext.class, "registerService", EntityManagerFactory.class.getName(), EntityManagerFactory.class, Dictionary.class));
+    Skeleton.getSkeleton(pp).assertNotCalled(new MethodCall(PersistenceProvider.class, "createContainerEntityManagerFactory", PersistenceUnitInfo.class, Map.class));
+    BundleContextMock.assertNoServiceExists(EntityManagerFactory.class.getName());
+    
+    
+    //Now try Resolving
+    Skeleton.getSkeleton(persistenceBundle).setReturnValue(new MethodCall(Bundle.class, "getState"), Bundle.RESOLVED);
+    mgr.modifiedBundle(persistenceBundle, new BundleEvent(BundleEvent.RESOLVED, persistenceBundle), o);
+    
+    testSuccessfulCreationEvent(ref, extenderContext, 1);
+    BundleContextMock.assertNoServiceExists(EntityManagerFactory.class.getName());
+    
+    
+    //Now try starting (This should not create again, so check we only called 1 time)
+    Skeleton.getSkeleton(persistenceBundle).setReturnValue(new MethodCall(Bundle.class, "getState"), Bundle.STARTING);
+    mgr.modifiedBundle(persistenceBundle, new BundleEvent(BundleEvent.STARTING, persistenceBundle), o);
+    
+    testSuccessfulCreationEvent(ref, extenderContext, 1);
+    testSuccessfulRegistrationEvent(ref, extenderContext, 1);
+    
+    //Now try active (This should not create again, so check we only called 1 time)
+    Skeleton.getSkeleton(persistenceBundle).setReturnValue(new MethodCall(Bundle.class, "getState"), Bundle.ACTIVE);
+    mgr.modifiedBundle(persistenceBundle, new BundleEvent(BundleEvent.STARTED, persistenceBundle), o);
+    
+    testSuccessfulCreationEvent(ref, extenderContext, 1);
+    testSuccessfulRegistrationEvent(ref, extenderContext, 1);
+    
+    //Now stop the bundle, check no extra calls, and the EMFs are still open
+    Skeleton.getSkeleton(persistenceBundle).setReturnValue(new MethodCall(Bundle.class, "getState"), Bundle.STOPPING);
+    mgr.modifiedBundle(persistenceBundle, new BundleEvent(BundleEvent.STOPPING, persistenceBundle), o);
+    
+    testSuccessfulCreationEvent(ref, extenderContext, 1);
+    BundleContextMock.assertNoServiceExists(EntityManagerFactory.class.getName());
+    Skeleton.getSkeleton(pp).assertNotCalled(new MethodCall(EntityManagerFactory.class, "close"));
+    
+    //Now Mark the bundle stopped, check no extra calls, and the EMFs are still open
+    Skeleton.getSkeleton(persistenceBundle).setReturnValue(new MethodCall(Bundle.class, "getState"), Bundle.RESOLVED);
+    mgr.modifiedBundle(persistenceBundle, new BundleEvent(BundleEvent.STOPPING, persistenceBundle), o);
+    
+    testSuccessfulCreationEvent(ref, extenderContext, 1);
+    BundleContextMock.assertNoServiceExists(EntityManagerFactory.class.getName());
+    Skeleton.getSkeleton(pp).assertNotCalled(new MethodCall(EntityManagerFactory.class, "close"));
+    
+    //Now Uninstall, check no extra calls, and the EMFs are closed
+    Skeleton.getSkeleton(persistenceBundle).setReturnValue(new MethodCall(Bundle.class, "getState"), Bundle.UNINSTALLED);
+    mgr.removedBundle(persistenceBundle, new BundleEvent(BundleEvent.UNINSTALLED, persistenceBundle), o);
+    
+    testSuccessfulCreationEvent(ref, extenderContext, 1);
+    BundleContextMock.assertNoServiceExists(EntityManagerFactory.class.getName());
+    Skeleton.getSkeleton(pp).assertCalled(new MethodCall(EntityManagerFactory.class, "close"));
+  }
+  
+  @Test
+  public void testBundleChangedUpdated() throws Exception
+  {
+    setupPersistenceBundle("file4", "");
+    BundleContext extenderContext = preExistingBundleSetup();
+    
+    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(), "no.such.Provider"} ,
+        pp, hash1 );
+    
+    ServiceReference ref = reg.getReference();
+    mgr.addingProvider(ref);
+    mgr.open();
+
+    testSuccessfulCreationEvent(ref, extenderContext, 1);
+    testSuccessfulRegistrationEvent(ref, extenderContext, 1);
+    
+    //Clear the extender context to remove the previous get for the PersistenceProvider.
+    Skeleton.getSkeleton(extenderContext).clearMethodCalls();
+    
+    //Update the bundle
+    Skeleton.getSkeleton(persistenceBundle).setReturnValue(new MethodCall(Bundle.class, "getState"), Bundle.INSTALLED);
+    mgr.modifiedBundle(persistenceBundle, new BundleEvent(BundleEvent.UPDATED, persistenceBundle), mgr.getObject(persistenceBundle));
+    
+    //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 didn't get the Provider, and there is no Service in the registry
+    Skeleton.getSkeleton(extenderContext).assertNotCalled(new MethodCall(BundleContext.class, "getService", ServiceReference.class));
+    Skeleton.getSkeleton(pp).assertCalled(new MethodCall(EntityManagerFactory.class, "close"));
+    BundleContextMock.assertNoServiceExists(EntityManagerFactory.class.getName());
+    
+    //Now resolve the bundle again and check we get another EMF created
+    Skeleton.getSkeleton(persistenceBundle).setReturnValue(new MethodCall(Bundle.class, "getState"), Bundle.RESOLVED);
+    mgr.modifiedBundle(persistenceBundle, new BundleEvent(BundleEvent.RESOLVED, persistenceBundle), mgr.getObject(persistenceBundle));
+    
+    //We will have created the EMF a total of 2 times
+    testSuccessfulCreationEvent(ref, extenderContext, 2);
+    BundleContextMock.assertNoServiceExists(EntityManagerFactory.class.getName());
+  }
+  
+  @Test
+  public void testBundleChangedUnresolved() throws Exception
+  {
+    setupPersistenceBundle("file4", "");
+    BundleContext extenderContext = preExistingBundleSetup();
+    
+    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(), "no.such.Provider"} ,
+        pp, hash1 );
+    
+    ServiceReference ref = reg.getReference();
+    mgr.addingProvider(ref);
+    mgr.open();
+
+    testSuccessfulCreationEvent(ref, extenderContext, 1);
+    testSuccessfulRegistrationEvent(ref, extenderContext, 1);
+    
+    Skeleton.getSkeleton(extenderContext).clearMethodCalls();
+    Skeleton.getSkeleton(persistenceBundle).clearMethodCalls();
+    
+    Skeleton.getSkeleton(persistenceBundle).setReturnValue(new MethodCall(Bundle.class, "getState"), Bundle.INSTALLED);
+    mgr.modifiedBundle(persistenceBundle, new BundleEvent(BundleEvent.UNRESOLVED, persistenceBundle), mgr.getObject(persistenceBundle));
+    
+    //Check we don't re-parse the xml
+    Skeleton.getSkeleton(persistenceBundle).assertNotCalled(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 didn't get the Provider, and there is no Service in the registry
+    Skeleton.getSkeleton(extenderContext).assertNotCalled(new MethodCall(BundleContext.class, "getService", ServiceReference.class));
+    Skeleton.getSkeleton(pp).assertCalled(new MethodCall(EntityManagerFactory.class, "close"));
+    BundleContextMock.assertNoServiceExists(EntityManagerFactory.class.getName());
+  }
+  
+  @Test
+  public void testBundle_ProviderRemoved() throws Exception
+  {
+    BundleContext extenderContext = preExistingBundleSetup();
+    
+    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();
+    testSuccessfulCreationEvent(ref, extenderContext, 1);
+    testSuccessfulRegistrationEvent(ref, extenderContext, 1);
+    
+    mgr.removingProvider(ref);
+    
+    Skeleton.getSkeleton(pp).assertCalled(new MethodCall(EntityManagerFactory.class, "close"));
+    BundleContextMock.assertNoServiceExists(EntityManagerFactory.class.getName());    
+    
+    mgr.modifiedBundle(persistenceBundle, null, mgr.getObject(persistenceBundle));
+  }
+  
+  @Test
+  public void testInstalledWithBadXML() throws Exception
+  {
+  
+    BundleContext extenderContext = extenderBundle.getBundleContext();
+    
+    mgr = new PersistenceBundleManager(extenderContext);
+    mgr.setConfig(new Properties());
+    
+    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("file3", "");
+    
+    mgr.open();
+    
+    Object o = mgr.addingBundle(persistenceBundle, null);
+    
+    assertNull("We should not have received a manager", o);
+    //Check we didn't get the Provider, and there is no Service in the registry
+    Skeleton.getSkeleton(extenderContext).assertNotCalled(new MethodCall(BundleContext.class, "getService", ServiceReference.class));
+    BundleContextMock.assertNoServiceExists(EntityManagerFactory.class.getName());
+  }
+
+  @Test
+  public void testdefaultProvider() throws Exception
+  {
+    BundleContext extenderContext = preExistingBundleSetup();
+    
+    Hashtable<String,Object> hash1 = new Hashtable<String, Object>();
+    hash1.put("javax.persistence.provider", "use.this.Provider");
+    hash1.put(Constants.SERVICE_RANKING, Integer.MAX_VALUE);
+    ServiceRegistration reg = persistenceBundle.getBundleContext().registerService(new String[] {PersistenceProvider.class.getName()} ,
+        pp, hash1 );
+    ServiceReference ppRef = reg.getReference();
+    
+    PersistenceProvider pp2 = Skeleton.newMock(PersistenceProvider.class);
+    Hashtable<String,Object> hash2 = new Hashtable<String, Object>();
+    hash2.put("javax.persistence.provider", "do.not.use.this.Provider");
+    hash2.put(Constants.SERVICE_RANKING, Integer.MIN_VALUE);
+    ServiceRegistration reg2 = persistenceBundle.getBundleContext().registerService(new String[] {PersistenceProvider.class.getName()} ,
+        pp2, hash2 );
+    
+    mgr.addingProvider(ppRef);
+    mgr.addingProvider(reg2.getReference());
+    
+    setupPersistenceBundle("file5", "");
+    
+    mgr.open();
+    testSuccessfulCreationEvent(ppRef, extenderContext, 1);
+    testSuccessfulRegistrationEvent(ppRef, extenderContext, 1);
+
+  }
+  
+  @Test
+  public void testdefaultProviderFromManagedPersistenceUnitFactory() throws Exception
+  {
+    BundleContext extenderContext = preExistingBundleSetup();
+    
+    Hashtable<String,Object> hash1 = new Hashtable<String, Object>();
+    hash1.put("javax.persistence.provider", "use.this.Provider");
+    hash1.put(Constants.SERVICE_RANKING, Integer.MIN_VALUE);
+    ServiceRegistration reg = persistenceBundle.getBundleContext().registerService(new String[] {PersistenceProvider.class.getName()} ,
+        pp, hash1 );
+    ServiceReference ppRef = reg.getReference();
+    
+    PersistenceProvider pp2 = Skeleton.newMock(PersistenceProvider.class);
+    Hashtable<String,Object> hash2 = new Hashtable<String, Object>();
+    hash2.put("javax.persistence.provider", "do.not.use.this.Provider");
+    hash2.put(Constants.SERVICE_RANKING, Integer.MAX_VALUE);
+    ServiceRegistration reg2 = persistenceBundle.getBundleContext().registerService(new String[] {PersistenceProvider.class.getName()} ,
+        pp2, hash2 );
+    ServiceReference pp2Ref = reg2.getReference();
+    
+    mgr.addingProvider(ppRef);
+    mgr.addingProvider(reg2.getReference());
+    
+    setupPersistenceBundle("file5", "");
+    
+    Properties props = new Properties();
+    props.put("org.apache.aries.jpa.container.ManagedPersistenceUnitInfoFactory", FakeManagedPersistenceUnitFactory.class.getName());
+    
+    mgr.setConfig(props);
+    
+    mgr.open();
+    testSuccessfulCreationEvent(ppRef, extenderContext, 1);
+    testSuccessfulRegistrationEvent(ppRef, extenderContext, 1);
+  }
+
+  @Test
+  public void testSameProviders() throws Exception
+  {
+    BundleContext extenderContext = preExistingBundleSetup();
+    
+    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();
+
+    PersistenceProvider pp2 = Skeleton.newMock(PersistenceProvider.class);
+    Hashtable<String,Object> hash2 = new Hashtable<String, Object>();
+    hash2.put("javax.persistence.provider", "do.not.use.this.Provider");
+    hash2.put(Constants.SERVICE_RANKING, Integer.MAX_VALUE);
+    ServiceRegistration reg2 = persistenceBundle.getBundleContext().registerService(new String[] {PersistenceProvider.class.getName()} ,
+        pp2, hash2 );
+    
+    mgr.addingProvider(ref);
+    mgr.addingProvider(reg2.getReference());
+    
+    setupPersistenceBundle("file6", "");
+    
+    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));
+    
+    testSuccessfulCreationEvent(ref, extenderContext, 2);
+    testSuccessfulRegistrationEvent(ref, extenderContext, 2, "alpha", "bravo");
+  }
+
+  @Test
+  public void testOneWithProviderOneWithout() throws Exception
+  {
+    //Check we behave correctly when one persistence unit defines a provder
+    //and another doesn't 
+    
+    BundleContext extenderContext = preExistingBundleSetup();
+    
+    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();
+
+    PersistenceProvider pp2 = Skeleton.newMock(PersistenceProvider.class);
+    Hashtable<String,Object> hash2 = new Hashtable<String, Object>();
+    hash2.put("javax.persistence.provider", "do.not.use.this.Provider");
+    hash2.put(Constants.SERVICE_RANKING, Integer.MAX_VALUE);
+    ServiceRegistration reg2 = persistenceBundle.getBundleContext().registerService(new String[] {PersistenceProvider.class.getName()} ,
+        pp2, hash2 );
+    
+    mgr.addingProvider(ref);
+    mgr.addingProvider(reg2.getReference());
+    
+    setupPersistenceBundle("file7", "");
+    
+    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));
+    
+    testSuccessfulCreationEvent(ref, extenderContext, 2);
+    testSuccessfulRegistrationEvent(ref, extenderContext, 2, "alpha", "bravo");
+  }
+
+  @Test
+  public void testTwoProviders() throws Exception
+  {
+    //Check we behave correctly when two persistence units define different providers
+    
+    BundleContext extenderContext = preExistingBundleSetup();
+    
+    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();
+
+    PersistenceProvider pp2 = Skeleton.newMock(PersistenceProvider.class);
+    Hashtable<String,Object> hash2 = new Hashtable<String, Object>();
+    hash2.put("javax.persistence.provider", "do.not.use.this.Provider");
+    hash2.put(Constants.SERVICE_RANKING, Integer.MAX_VALUE);
+    ServiceRegistration reg2 = persistenceBundle.getBundleContext().registerService(new String[] {PersistenceProvider.class.getName()} ,
+        pp2, hash2 );
+    ServiceReference ref2 = reg2.getReference();
+    
+    mgr.addingProvider(ref);
+    mgr.addingProvider(ref2);
+    
+    setupPersistenceBundle("file8", "");
+    
+    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));
+    
+    Skeleton.getSkeleton(extenderContext).assertNotCalled(new MethodCall(BundleContext.class, "getService", ServiceReference.class));
+    Skeleton.getSkeleton(extenderContext).assertNotCalled(new MethodCall(BundleContext.class, "ungetService", ServiceReference.class));
+    Skeleton.getSkeleton(pp).assertNotCalled(new MethodCall(PersistenceProvider.class, "createContainerEntityManagerFactory", PersistenceUnitInfo.class, Map.class));
+    Skeleton.getSkeleton(pp2).assertNotCalled(new MethodCall(PersistenceProvider.class, "createContainerEntityManagerFactory", PersistenceUnitInfo.class, Map.class));
+
+    
+  
+  }
+  
+  @Test
+  public void testpp100() throws Exception
+  {
+    BundleContext extenderContext = preExistingBundleSetup();
+    
+    registerVersionedPersistenceProviders();
+    
+    setupPersistenceBundle("file9", "");
+
+    mgr.open();
+    
+    assertCorrectPersistenceProviderUsed(extenderContext, providerP100);
+  }
+
+  @Test
+  public void testpp101() throws Exception
+  {
+    BundleContext extenderContext = preExistingBundleSetup();
+    
+    registerVersionedPersistenceProviders();
+    
+    setupPersistenceBundle("file10", "");
+
+    mgr.open();
+    
+    assertCorrectPersistenceProviderUsed(extenderContext, providerP101);
+  }
+  
+  @Test
+  public void testpp101b() throws Exception
+  {
+    BundleContext extenderContext = preExistingBundleSetup();
+    
+    registerVersionedPersistenceProviders();
+    
+    setupPersistenceBundle("file11", "");
+
+    mgr.open();
+    
+    assertCorrectPersistenceProviderUsed(extenderContext, providerP101);
+  }
+
+  @Test
+  public void testpp111() throws Exception
+  {
+    BundleContext extenderContext = preExistingBundleSetup();
+    
+    registerVersionedPersistenceProviders();
+    
+    setupPersistenceBundle("file12", "");
+
+    mgr.open();
+    
+    assertCorrectPersistenceProviderUsed(extenderContext, providerP111);
+  }
+
+  @Test
+  public void testppNoMatch() throws Exception
+  {
+    BundleContext extenderContext = preExistingBundleSetup();
+    
+    registerVersionedPersistenceProviders();
+    
+    setupPersistenceBundle("file13", "");
+
+    mgr.open();
+
+    BundleContextMock.assertNoServiceExists(EntityManagerFactory.class.getName());
+
+    //A provider was instantiated
+    Skeleton.getSkeleton(extenderContext).assertNotCalled(new MethodCall(BundleContext.class, "getService", ServiceReference.class));
+  }
+
+  @Test
+  public void testTwoProvidersMatch() throws Exception
+  {
+    BundleContext extenderContext = preExistingBundleSetup();
+    
+    registerVersionedPersistenceProviders();
+    
+    setupPersistenceBundle("file14", "");
+
+    mgr.open();
+    
+    assertCorrectPersistenceProviderUsed(extenderContext, providerP101, 2);
+  }
+
+  @Test
+  public void testTwoProvidersNoVersionMatch() throws Exception
+  {
+    BundleContext extenderContext = preExistingBundleSetup();
+    
+    registerVersionedPersistenceProviders();
+    
+    setupPersistenceBundle("file15", "");
+
+    mgr.open();
+
+    BundleContextMock.assertNoServiceExists(EntityManagerFactory.class.getName());
+
+    //A provider was instantiated
+    Skeleton.getSkeleton(extenderContext).assertNotCalled(new MethodCall(BundleContext.class, "getService", ServiceReference.class));
+  }
+
+  @Test
+  public void testThreeProvidersNoVersionMatch() throws Exception
+  {
+    BundleContext extenderContext = preExistingBundleSetup();
+    
+    registerVersionedPersistenceProviders();
+    
+    setupPersistenceBundle("file16", "");
+
+    mgr.open();
+
+    BundleContextMock.assertNoServiceExists(EntityManagerFactory.class.getName());
+
+    //A provider was instantiated
+    Skeleton.getSkeleton(extenderContext).assertNotCalled(new MethodCall(BundleContext.class, "getService", ServiceReference.class));
+  }
+  
+  @Test
+  public void testTwoProvidersExistNoCommonVersion() throws Exception
+  {
+    BundleContext extenderContext = preExistingBundleSetup();
+    
+    registerVersionedPersistenceProviders();
+    
+    setupPersistenceBundle("file17", "");
+
+    mgr.open();
+
+    BundleContextMock.assertNoServiceExists(EntityManagerFactory.class.getName());
+
+    //A provider was instantiated
+    Skeleton.getSkeleton(extenderContext).assertNotCalled(new MethodCall(BundleContext.class, "getService", ServiceReference.class));
+  }
+  
+
+  @Test
+  public void testTwoProvidersNoVersionMatchOneExists() throws Exception
+  {
+    BundleContext extenderContext = preExistingBundleSetup();
+    
+    registerVersionedPersistenceProviders();
+    
+    setupPersistenceBundle("file18", "");
+
+    mgr.open();
+
+    BundleContextMock.assertNoServiceExists(EntityManagerFactory.class.getName());
+
+    //A provider was instantiated
+    Skeleton.getSkeleton(extenderContext).assertNotCalled(new MethodCall(BundleContext.class, "getService", ServiceReference.class));    
+  }
+  
+  @Test
+  public void testThreeProvidersNoVersionMatchOneExists() throws Exception
+  {
+    BundleContext extenderContext = preExistingBundleSetup();
+    
+    registerVersionedPersistenceProviders();
+    
+    setupPersistenceBundle("file19", "");
+
+    mgr.open();
+
+    BundleContextMock.assertNoServiceExists(EntityManagerFactory.class.getName());
+
+    //A provider was instantiated
+    Skeleton.getSkeleton(extenderContext).assertNotCalled(new MethodCall(BundleContext.class, "getService", ServiceReference.class));
+  }
+
+  @Test
+  public void testThreeProvidersNoVersionMatchTwoExist() throws Exception
+  {
+    BundleContext extenderContext = preExistingBundleSetup();
+    
+    registerVersionedPersistenceProviders();
+    
+    setupPersistenceBundle("file20", "");
+
+    mgr.open();
+
+    BundleContextMock.assertNoServiceExists(EntityManagerFactory.class.getName());
+
+    //A provider was instantiated
+    Skeleton.getSkeleton(extenderContext).assertNotCalled(new MethodCall(BundleContext.class, "getService", ServiceReference.class));
+  }
+  
+  @Test
+  public void testMultipleLocations() throws Exception
+  {
+    //Check we correctly parse and register EMFactories according to the Meta-Persistence Header
+    BundleContext extenderContext = preExistingBundleSetup();
+    
+    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();
+    setupPersistenceBundle21();
+    
+    mgr.addingProvider(ref);
+    mgr.open();
+    
+    testSuccessfulCreationEvent(ref, extenderContext, 4);
+    testSuccessfulRegistrationEvent(ref, extenderContext, 4, "persistence", "found", "jar", "another");
+    
+  }
+
+  private void setupPersistenceBundle21() throws Exception {
+    persistenceBundle.getHeaders().put("Meta-Persistence", "OSGI-INF/found.xml, jarfile.jar!/jar.xml,persistence/another.xml, does-not-exist.xml");
+    
+    Skeleton skel = Skeleton.getSkeleton(persistenceBundle);
+    skel.setReturnValue(new MethodCall(Bundle.class, "getState"), Bundle.ACTIVE);
+
+    URL xml = getClass().getClassLoader().getResource("file21/META-INF/persistence.xml");
+    skel.setReturnValue(new MethodCall(Bundle.class, "getEntry", "META-INF/persistence.xml"), xml);
+    
+    xml = getClass().getClassLoader().getResource("file21/OSGI-INF/found.xml");
+    skel.setReturnValue(new MethodCall(Bundle.class, "getEntry", "OSGI-INF/found.xml"), xml);
+    
+    URL root = getClass().getClassLoader().getResource("file21");
+    
+    File f = new File(new File(root.toURI()), "jarfile.jar");
+    
+    JarOutputStream jos = new JarOutputStream(new FileOutputStream(f));
+    
+    jos.putNextEntry(new ZipEntry("jar.xml"));
+    
+    BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(jos));
+    writer.write("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
+    writer.newLine();
+    writer.write("<persistence xmlns=\"http://java.sun.com/xml/ns/persistence\"");
+    writer.newLine();
+    writer.write("xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"");
+    writer.newLine();    
+    writer.write("xsi:schemaLocation=\"http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd\"");
+    writer.newLine();
+    writer.write("version=\"1.0\">");
+    writer.newLine();
+    writer.write("<persistence-unit name=\"jar\"/>");
+    writer.newLine();
+    writer.write("</persistence>");
+    
+    writer.close();
+    
+    xml = getClass().getClassLoader().getResource("file21/jarfile.jar");
+    skel.setReturnValue(new MethodCall(Bundle.class, "getEntry", "jarfile.jar"), xml);
+
+    xml = getClass().getClassLoader().getResource("file21/persistence/another.xml");
+    skel.setReturnValue(new MethodCall(Bundle.class, "getEntry", "persistence/another.xml"), xml);
+
+    xml = getClass().getClassLoader().getResource("file21/OSGI-INF/not-found.xml");
+    skel.setReturnValue(new MethodCall(Bundle.class, "getEntry", "OSGI-INF/not-found.xml"), xml);
+    
+    skel.setReturnValue(new MethodCall(Bundle.class, "getEntry", "does-not-exist.xml"), null);
+    
+    skel.setReturnValue(new MethodCall(Bundle.class, "getVersion"), new Version("0.0.0"));
+    
+  }
+
   private void setupPersistenceBundle(String root, String header) throws MalformedURLException
   {
     persistenceBundle.getHeaders().put("Meta-Persistence", header);
@@ -938,96 +882,96 @@
     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,
-//      PersistenceProvider pp101, PersistenceProvider pp110,
-//      PersistenceProvider pp111) {
-//    Hashtable<String,String> hash1 = new Hashtable<String, String>();
-//    hash1.put("osgi.jpa.provider.version", "1.0.0");
-//    providerBundleP100.getBundleContext().registerService(new String[] {PersistenceProvider.class.getName(), "no.such.Provider"} ,
-//        pp100, hash1 );
-//    
-//    hash1 = new Hashtable<String, String>();
-//    hash1.put("osgi.jpa.provider.version", "1.0.1");
-//    providerBundleP101.getBundleContext().registerService(new String[] {PersistenceProvider.class.getName(), "no.such.Provider"} ,
-//        pp101, hash1 );
-//    
-//    hash1 = new Hashtable<String, String>();
-//    hash1.put("osgi.jpa.provider.version", "1.1.0");
-//    providerBundleP110.getBundleContext().registerService(new String[] {PersistenceProvider.class.getName(), "no.such.Provider"} ,
-//        pp110, hash1 );
-//    
-//    hash1 = new Hashtable<String, String>();
-//    hash1.put("osgi.jpa.provider.version", "1.1.1");
-//    providerBundleP111.getBundleContext().registerService(new String[] {PersistenceProvider.class.getName(), "no.such.Provider"} ,
-//        pp111, hash1 );
-//  }
-//  
-//
-//  private void testSuccessfulInstalledEvent(PersistenceBundleManager mgr, BundleContext ctx, int numberOfPersistenceUnits) throws InvalidSyntaxException
-//  {
-//    BundleContextMock.assertNoServiceExists(PersistenceUnitInfoService.class.getName());
-//    
-//    mgr.bundleChanged(new BundleEvent(BundleEvent.INSTALLED, persistenceBundle));
-//    
-//    BundleContextMock.assertServiceExists(PersistenceUnitInfoService.class.getName());
-//    
-//    ServiceReference[] refs = persistenceBundle.getBundleContext().getServiceReferences(PersistenceUnitInfoService.class.getName(), null);
-//    
-//    assertEquals("The wrong number of persistence units were registered", numberOfPersistenceUnits, refs.length);
-//    
-//    for(ServiceReference ref : refs) {
-//      assertEquals("Incorrect properties registerered", "scooby.doo", ref.getProperty(PersistenceUnitInfoService.PERSISTENCE_BUNDLE_SYMBOLIC_NAME));
-//      assertEquals("Incorrect properties registerered", Version.emptyVersion, ref.getProperty(PersistenceUnitInfoService.PERSISTENCE_BUNDLE_VERSION));
-//      assertNotNull("Incorrect properties registerered", ref.getProperty(PersistenceUnitInfoService.PERSISTENCE_UNIT_NAME));
-//    }
-//    
-//    Skeleton.getSkeleton(ctx).assertCalled(new MethodCall(BundleContext.class, "installBundle",
-//        FRAGMENT_SYM_NAME, InputStream.class));
-//  }
-//  
-//  private void testUnsuccessfulInstalledEvent(PersistenceBundleManager mgr, BundleContext ctx)
-//  {
-//    BundleContextMock.assertNoServiceExists(PersistenceUnitInfoService.class.getName());
-//    
-//    mgr.bundleChanged(new BundleEvent(BundleEvent.INSTALLED, persistenceBundle));
-//    
-//    BundleContextMock.assertNoServiceExists(PersistenceUnitInfoService.class.getName());
-//    
-//    Skeleton.getSkeleton(ctx).assertNotCalled(new MethodCall(BundleContext.class, "installBundle",
-//        String.class, InputStream.class));
-//  }
-//  
-//  private void assertCorrectPersistenceProviderUsed (PersistenceBundleManager mgr, BundleContext ctx, PersistenceProvider provider)
-//  {
-//    try {
-//      mgr.start(ctx);
-//      
-//      BundleContextMock.assertNoServiceExists(PersistenceUnitInfoService.class.getName());
-//      
-//      mgr.bundleChanged(new BundleEvent(BundleEvent.INSTALLED, persistenceBundle));
-//      
-//      BundleContextMock.assertServiceExists(PersistenceUnitInfoService.class.getName());
-//      ServiceReference[] refs = persistenceBundle.getBundleContext().getServiceReferences(PersistenceUnitInfoService.class.getName(), null);
-//    
-//      for(ServiceReference ref : refs) {
-//        PersistenceUnitInfoService pu = (PersistenceUnitInfoService) persistenceBundle.getBundleContext().getService(ref);
-//    
-//        assertNotNull("No PersistenceUnit was registered", pu);
-//    
-//        Object pp = persistenceBundle.getBundleContext().getService(pu.getProviderReference());
-//    
-//        assertSame("The perstistnce unit was associated with the wrong persistence provider",
-//        pp, provider);
-//      }
-//      
-//      Skeleton.getSkeleton(ctx).assertCalled(new MethodCall(BundleContext.class, "installBundle",
-//          FRAGMENT_SYM_NAME, InputStream.class));
-//      
-//    } catch (Exception e) {
-//      throw new RuntimeException(e);
-//    }
-//  }
+  
+  private void registerVersionedPersistenceProviders() {
+    
+    providerP100 = Skeleton.newMock(PersistenceProvider.class);
+    providerP101 = Skeleton.newMock(PersistenceProvider.class);
+    providerP110 = Skeleton.newMock(PersistenceProvider.class);
+    providerP111 = Skeleton.newMock(PersistenceProvider.class);
+    
+    ServiceRegistration reg;
+    
+    Hashtable<String,String> hash1 = new Hashtable<String, String>();
+    hash1.put("javax.persistence.provider", "no.such.Provider");
+    reg = providerBundleP100.getBundleContext().registerService(new String[] {PersistenceProvider.class.getName()},
+            providerP100, hash1 );
+    mgr.addingProvider(reg.getReference());    
+    
+    reg = providerBundleP101.getBundleContext().registerService(new String[] {PersistenceProvider.class.getName()},
+            providerP101, hash1 );
+    mgr.addingProvider(reg.getReference());
+    
+    reg = providerBundleP110.getBundleContext().registerService(new String[] {PersistenceProvider.class.getName()},
+            providerP110, hash1 );
+    mgr.addingProvider(reg.getReference());
+    
+    reg = providerBundleP111.getBundleContext().registerService(new String[] {PersistenceProvider.class.getName()},
+            providerP111, hash1 );
+    mgr.addingProvider(reg.getReference());
+  }
+  
+
+  private void testSuccessfulCreationEvent(ServiceReference providerRef, BundleContext extenderContext, int numberOfPersistenceUnits)
+  {
+  //Check we loaded the Provider service
+    Skeleton.getSkeleton(extenderContext).assertCalledExactNumberOfTimes(new MethodCall(BundleContext.class, "getService", providerRef), 1);
+    Skeleton.getSkeleton(extenderContext).assertCalledExactNumberOfTimes(new MethodCall(BundleContext.class, "ungetService", providerRef), 1);
+    Skeleton.getSkeleton(pp).assertCalledExactNumberOfTimes(new MethodCall(PersistenceProvider.class, "createContainerEntityManagerFactory", PersistenceUnitInfo.class, Map.class), numberOfPersistenceUnits);
+  }
+  
+  private void testSuccessfulRegistrationEvent(ServiceReference providerRef, BundleContext extenderContext, int numberOfPersistenceUnits, String... names) throws InvalidSyntaxException
+  {
+    Skeleton.getSkeleton(persistenceBundleContext).assertCalledExactNumberOfTimes(new MethodCall(BundleContext.class, "registerService", EntityManagerFactory.class.getName(), EntityManagerFactory.class, Dictionary.class), numberOfPersistenceUnits);
+    
+    BundleContextMock.assertServiceExists(EntityManagerFactory.class.getName());
+    
+    ServiceReference[] emfs = extenderContext.getServiceReferences(EntityManagerFactory.class.getName(), null);
+    
+    assertEquals("Too many services registered", numberOfPersistenceUnits, emfs.length);
+    
+    if(names.length == 0)
+      names = new String[]{"alpha"};
+    
+    for(int i = 0; i < numberOfPersistenceUnits; i++) {
+      ServiceReference emf = emfs[i]; 
+      
+      boolean found = false;
+      for(int j = 0; j < names.length; j++) {
+        found = emf.getProperty("osgi.unit.name").equals(names[j]);
+        if(found) {
+          names[j] = null;
+          break;
+        }
+      }
+      assertTrue("No emf expected with the name " + emf.getProperty("osgi.unit.name"), found);
+      
+      assertEquals("Wrong unit provider name registered", providerRef.getProperty("javax.persistence.provider"), emf.getProperty("osgi.unit.provider"));
+      
+      assertEquals("Wrong unit name registered", Boolean.TRUE, emf.getProperty("org.apache.aries.jpa.container.managed"));
+    }
+  }
+  
+  private void assertCorrectPersistenceProviderUsed (BundleContext extenderContext, PersistenceProvider provider, int numEMFs) throws InvalidSyntaxException
+  {
+      BundleContextMock.assertServiceExists(EntityManagerFactory.class.getName());
+
+      ServiceReference[] refs = persistenceBundleContext.getServiceReferences(EntityManagerFactory.class.getCanonicalName(), null);
+      
+      assertEquals("Too many EMFs", numEMFs, refs.length);
+      
+      Skeleton.getSkeleton(provider).assertCalledExactNumberOfTimes(new MethodCall(PersistenceProvider.class, "createContainerEntityManagerFactory", PersistenceUnitInfo.class, Map.class), numEMFs);
+      
+      for(ServiceReference emf : refs)
+        assertSame("The EMF came from the wrong provider", Skeleton.getSkeleton(provider), Skeleton.getSkeleton(persistenceBundleContext.getService(emf)));
+      
+      //More than one provider was instantiated
+      Skeleton.getSkeleton(extenderContext).assertCalledExactNumberOfTimes(new MethodCall(BundleContext.class, "getService", ServiceReference.class), 1);
+  }
 
+  private void assertCorrectPersistenceProviderUsed (BundleContext extenderContext, PersistenceProvider provider) throws InvalidSyntaxException
+  {
+    assertCorrectPersistenceProviderUsed(extenderContext, provider, 1); 
+  }
 }