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/11 15:21:47 UTC

svn commit: r897874 - in /incubator/aries/trunk/jpa/jpa-container: ./ src/main/java/org/apache/aries/jpa/container/ src/main/java/org/apache/aries/jpa/container/impl/ src/main/java/org/apache/aries/jpa/container/parsing/ src/main/java/org/apache/aries/...

Author: timothyjward
Date: Mon Jan 11 14:21:47 2010
New Revision: 897874

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

Added:
    incubator/aries/trunk/jpa/jpa-container/src/main/java/org/apache/aries/jpa/container/ManagedPersistenceUnitInfo.java
    incubator/aries/trunk/jpa/jpa-container/src/main/java/org/apache/aries/jpa/container/ManagedPersistenceUnitInfoFactory.java
    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/InvalidPersistenceUnitException.java
    incubator/aries/trunk/jpa/jpa-container/src/main/java/org/apache/aries/jpa/container/impl/InvalidRangeCombination.java
    incubator/aries/trunk/jpa/jpa-container/src/main/java/org/apache/aries/jpa/container/unit/
    incubator/aries/trunk/jpa/jpa-container/src/main/java/org/apache/aries/jpa/container/unit/impl/
    incubator/aries/trunk/jpa/jpa-container/src/main/java/org/apache/aries/jpa/container/unit/impl/ManagedPersistenceUnitInfoFactoryImpl.java
    incubator/aries/trunk/jpa/jpa-container/src/main/java/org/apache/aries/jpa/container/unit/impl/ManagedPersistenceUnitInfoImpl.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/
    incubator/aries/trunk/jpa/jpa-container/src/main/resources/OSGI-INF/blueprint/
    incubator/aries/trunk/jpa/jpa-container/src/main/resources/OSGI-INF/blueprint/jpa.xml
Modified:
    incubator/aries/trunk/jpa/jpa-container/pom.xml
    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/parsing/ParsedPersistenceUnit.java
    incubator/aries/trunk/jpa/jpa-container/src/main/java/org/apache/aries/jpa/container/parsing/impl/PersistenceUnitImpl.java

Modified: incubator/aries/trunk/jpa/jpa-container/pom.xml
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/jpa/jpa-container/pom.xml?rev=897874&r1=897873&r2=897874&view=diff
==============================================================================
--- incubator/aries/trunk/jpa/jpa-container/pom.xml (original)
+++ incubator/aries/trunk/jpa/jpa-container/pom.xml Mon Jan 11 14:21:47 2010
@@ -22,6 +22,22 @@
       <scope>provided</scope>
     </dependency>
     <dependency>
+      <artifactId>org.apache.aries.application.api</artifactId>
+      <groupId>org.apache.aries.application</groupId>
+      <version>1.0.0-incubating-SNAPSHOT</version>
+    </dependency>
+    <dependency>
+      <artifactId>org.apache.aries.application.utils</artifactId>
+      <groupId>org.apache.aries.application</groupId>
+      <version>1.0.0-incubating-SNAPSHOT</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.geronimo.specs</groupId>
+      <artifactId>geronimo-jpa_2.0_spec</artifactId>
+      <version>1.0-SNAPSHOT</version>
+    </dependency> 
+    
+    <dependency>
       <groupId>org.apache.aries.testsupport</groupId>
       <artifactId>org.apache.aries.testsupport.unit</artifactId>
       <scope>test</scope>
@@ -36,6 +52,16 @@
   
   
       <build>
+       <resources>
+            <resource>
+                <targetPath>OSGI-INF/blueprint</targetPath>
+                <filtering>false</filtering>
+                <directory>${basedir}/src/main/resources/OSGI-INF/blueprint</directory>
+                <includes>
+                    <include>*.xml</include>
+                </includes>
+            </resource>
+        </resources>
         <plugins>
             <plugin>
                 <groupId>org.apache.felix</groupId>
@@ -45,7 +71,8 @@
                     <instructions>
                         <Bundle-SymbolicName>${pom.groupId}.container</Bundle-SymbolicName>
                         <Export-Package>
-                            org.apache.aries.jpa.container.parsing;version="${pom.version}", 
+                            org.apache.aries.jpa.container.parsing;version="${pom.version}",
+                            org.apache.aries.jpa.container;version="${pom.version}"
                         </Export-Package>
                         <_versionpolicy>[$(version;==;$(@)),$(version;+;$(@)))</_versionpolicy>
                         <_removeheaders>Ignore-Package,Include-Resource,Private-Package,Bundle-DocURL</_removeheaders>

Added: incubator/aries/trunk/jpa/jpa-container/src/main/java/org/apache/aries/jpa/container/ManagedPersistenceUnitInfo.java
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/jpa/jpa-container/src/main/java/org/apache/aries/jpa/container/ManagedPersistenceUnitInfo.java?rev=897874&view=auto
==============================================================================
--- incubator/aries/trunk/jpa/jpa-container/src/main/java/org/apache/aries/jpa/container/ManagedPersistenceUnitInfo.java (added)
+++ incubator/aries/trunk/jpa/jpa-container/src/main/java/org/apache/aries/jpa/container/ManagedPersistenceUnitInfo.java Mon Jan 11 14:21:47 2010
@@ -0,0 +1,13 @@
+package org.apache.aries.jpa.container;
+
+import java.util.Map;
+
+import javax.persistence.spi.PersistenceUnitInfo;
+
+public interface ManagedPersistenceUnitInfo {
+
+  PersistenceUnitInfo getPersistenceUnitInfo();
+  
+  Map<String, Object> getContainerProperties();
+  
+}

Added: incubator/aries/trunk/jpa/jpa-container/src/main/java/org/apache/aries/jpa/container/ManagedPersistenceUnitInfoFactory.java
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/jpa/jpa-container/src/main/java/org/apache/aries/jpa/container/ManagedPersistenceUnitInfoFactory.java?rev=897874&view=auto
==============================================================================
--- incubator/aries/trunk/jpa/jpa-container/src/main/java/org/apache/aries/jpa/container/ManagedPersistenceUnitInfoFactory.java (added)
+++ incubator/aries/trunk/jpa/jpa-container/src/main/java/org/apache/aries/jpa/container/ManagedPersistenceUnitInfoFactory.java Mon Jan 11 14:21:47 2010
@@ -0,0 +1,17 @@
+package org.apache.aries.jpa.container;
+
+import java.util.Collection;
+
+import org.apache.aries.jpa.container.parsing.ParsedPersistenceUnit;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceReference;
+
+public interface ManagedPersistenceUnitInfoFactory {
+
+  Collection<ManagedPersistenceUnitInfo> createManagedPersistenceUnitMetadata(BundleContext containerContext, Bundle persistenceBundle, ServiceReference providerReference, Collection<ParsedPersistenceUnit> persistenceMetadata);
+  
+  String getDefaultProviderClassName();
+
+  void destroyPersistenceBundle(Bundle bundle);
+}

Added: 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=897874&view=auto
==============================================================================
--- incubator/aries/trunk/jpa/jpa-container/src/main/java/org/apache/aries/jpa/container/impl/EntityManagerFactoryManager.java (added)
+++ incubator/aries/trunk/jpa/jpa-container/src/main/java/org/apache/aries/jpa/container/impl/EntityManagerFactoryManager.java Mon Jan 11 14:21:47 2010
@@ -0,0 +1,186 @@
+package org.apache.aries.jpa.container.impl;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Properties;
+import java.util.Map.Entry;
+
+import javax.persistence.EntityManagerFactory;
+import javax.persistence.spi.PersistenceProvider;
+import javax.persistence.spi.PersistenceUnitInfo;
+
+import org.apache.aries.jpa.container.ManagedPersistenceUnitInfo;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceReference;
+import org.osgi.framework.ServiceRegistration;
+
+public class EntityManagerFactoryManager {
+
+  private final BundleContext containerContext;
+  
+  private final Bundle bundle;
+  
+  private ServiceReference provider;
+  
+  private Collection<ManagedPersistenceUnitInfo> persistenceUnits;
+  
+  private Map<String, EntityManagerFactory> emfs = null;
+  
+  private Collection<ServiceRegistration> registrations = null;
+
+  /**
+   * Create an {@link EntityManagerFactoryManager} for
+   * the supplied persistence bundle.
+   * 
+   * This constructor should only be used by a 
+   * {@link PersistenceBundleManager} that is synchronized
+   * on itself, and the resulting manager should be immediately
+   * stored in the bundleToManager Map
+   * 
+   * @param b
+   * @param infos 
+   * @param ref 
+   */
+  public EntityManagerFactoryManager(BundleContext containerCtx, Bundle b, ServiceReference ref, Collection<ManagedPersistenceUnitInfo> infos) {
+    containerContext = containerCtx;
+    bundle = b;
+    provider = ref;
+    persistenceUnits = infos;
+  }
+
+  public synchronized boolean providerRemoved(ServiceReference ref) {
+    
+    boolean toReturn = ref == provider;
+    
+    if(toReturn)
+      destroy();
+    
+    return toReturn;
+  }
+
+  public synchronized void bundleStateChange() throws InvalidPersistenceUnitException {
+    
+    switch(bundle.getState()) {
+      case Bundle.RESOLVED :
+        createEntityManagerFactories();
+        break;
+      case Bundle.STARTING :
+      case Bundle.ACTIVE :
+        registerEntityManagerFactories();
+        break;
+      case Bundle.STOPPING :
+        unregisterEntityManagerFactories();
+        break;
+    }
+  }
+
+  private void unregisterEntityManagerFactories() {
+    if(registrations != null) {
+      for(ServiceRegistration reg : registrations) {
+        try {
+          reg.unregister();
+        } catch (Exception e) {
+          //TODO log this
+        }
+      }
+      registrations = null;
+    }
+  }
+
+  private void registerEntityManagerFactories() throws InvalidPersistenceUnitException {
+    if(provider != null) {
+      if(emfs == null)
+        createEntityManagerFactories();
+      
+      registrations = new ArrayList<ServiceRegistration>();
+      String providerName = (String) provider.getProperty("javax.persistence.provider");
+      
+      for(Entry<String, EntityManagerFactory> entry : emfs.entrySet())
+      {
+        Properties props = new Properties();
+        String unitName = entry.getKey();
+        props.put("osgi.unit.name", unitName);
+        props.put("osgi.unit.provider", providerName);
+        props.put("org.apache.aries.jpa.container.managed", Boolean.TRUE);
+        try {
+          registrations.add(bundle.getBundleContext().registerService(EntityManagerFactory.class.getCanonicalName(), entry.getValue(), props));
+        } catch (Exception e) {
+          //TODO log
+          throw new InvalidPersistenceUnitException(e);
+        }
+      }
+    }
+  }
+
+  private void createEntityManagerFactories() throws InvalidPersistenceUnitException {
+    if(provider != null) {
+      if(emfs == null) {
+        try {
+          emfs = new HashMap<String, EntityManagerFactory>();
+        
+          PersistenceProvider providerService = (PersistenceProvider) containerContext.getService(provider);
+
+          if(providerService == null) throw new InvalidPersistenceUnitException();
+      
+          for(ManagedPersistenceUnitInfo info : persistenceUnits){
+            PersistenceUnitInfo pUnitInfo = info.getPersistenceUnitInfo();
+        
+            emfs.put(pUnitInfo.getPersistenceUnitName(), 
+                providerService.createContainerEntityManagerFactory(
+                    pUnitInfo, info.getContainerProperties()));
+          }
+        } finally {
+          containerContext.ungetService(provider);
+        }
+      }
+    }
+  }
+
+  /**
+   * Manage the EntityManagerFactories for the following
+   * provider and {@link PersistenceUnitInfo}s
+   * 
+   * This method should only be called when not holding any locks
+   * 
+   * @param ref The {@link PersistenceProvider} {@link ServiceReference}
+   * @param infos The {@link PersistenceUnitInfo}s defined by our bundle
+   */
+  public synchronized void manage(ServiceReference ref,
+      Collection<ManagedPersistenceUnitInfo> infos)  throws IllegalStateException{
+    provider = ref;
+    persistenceUnits = infos;
+  }
+
+  /**
+   * Stop managing any {@link EntityManagerFactory}s 
+   * 
+   * This method should only be called when not holding any locks
+   */
+  public synchronized void destroy() {
+    unregisterEntityManagerFactories();
+    destroyEntityManagerFactories();
+    
+    provider = null;
+    persistenceUnits = null;
+  }
+
+  private void destroyEntityManagerFactories() {
+    if(registrations != null)
+      unregisterEntityManagerFactories();
+    if(emfs != null) {
+      for(Entry<String, EntityManagerFactory> entry : emfs.entrySet()) {
+        try {
+          entry.getValue().close();
+        } catch (Exception e) {
+          //TODO log this error
+        }
+      }
+    }
+    emfs = null;
+  }
+
+
+}

Added: incubator/aries/trunk/jpa/jpa-container/src/main/java/org/apache/aries/jpa/container/impl/InvalidPersistenceUnitException.java
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/jpa/jpa-container/src/main/java/org/apache/aries/jpa/container/impl/InvalidPersistenceUnitException.java?rev=897874&view=auto
==============================================================================
--- incubator/aries/trunk/jpa/jpa-container/src/main/java/org/apache/aries/jpa/container/impl/InvalidPersistenceUnitException.java (added)
+++ incubator/aries/trunk/jpa/jpa-container/src/main/java/org/apache/aries/jpa/container/impl/InvalidPersistenceUnitException.java Mon Jan 11 14:21:47 2010
@@ -0,0 +1,13 @@
+package org.apache.aries.jpa.container.impl;
+
+public class InvalidPersistenceUnitException extends Exception {
+
+  public InvalidPersistenceUnitException(Exception e) {
+    super(e);
+  }
+
+  public InvalidPersistenceUnitException() {
+    // TODO Auto-generated constructor stub
+  }
+
+}

Added: incubator/aries/trunk/jpa/jpa-container/src/main/java/org/apache/aries/jpa/container/impl/InvalidRangeCombination.java
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/jpa/jpa-container/src/main/java/org/apache/aries/jpa/container/impl/InvalidRangeCombination.java?rev=897874&view=auto
==============================================================================
--- incubator/aries/trunk/jpa/jpa-container/src/main/java/org/apache/aries/jpa/container/impl/InvalidRangeCombination.java (added)
+++ incubator/aries/trunk/jpa/jpa-container/src/main/java/org/apache/aries/jpa/container/impl/InvalidRangeCombination.java Mon Jan 11 14:21:47 2010
@@ -0,0 +1,12 @@
+package org.apache.aries.jpa.container.impl;
+
+import org.osgi.framework.Version;
+
+public class InvalidRangeCombination extends Exception {
+
+  public InvalidRangeCombination(Version minVersion, boolean minExclusive,
+      Version maxVersion, boolean maxExclusive) {
+    // TODO Auto-generated constructor stub
+  }
+
+}

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=897874&r1=897873&r2=897874&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 Mon Jan 11 14:21:47 2010
@@ -19,12 +19,34 @@
 
 package org.apache.aries.jpa.container.impl;
 
+import java.io.IOException;
+import java.net.URL;
+import java.util.ArrayList;
 import java.util.Collection;
-
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+import java.util.Set;
+import java.util.Map.Entry;
+
+import org.apache.aries.application.VersionRange;
+import org.apache.aries.application.utils.manifest.ManifestHeaderProcessor;
+import org.apache.aries.jpa.container.ManagedPersistenceUnitInfo;
+import org.apache.aries.jpa.container.ManagedPersistenceUnitInfoFactory;
+import org.apache.aries.jpa.container.parsing.ParsedPersistenceUnit;
 import org.apache.aries.jpa.container.parsing.PersistenceDescriptor;
+import org.apache.aries.jpa.container.parsing.PersistenceDescriptorParser;
+import org.apache.aries.jpa.container.parsing.PersistenceDescriptorParserException;
+import org.apache.aries.jpa.container.unit.impl.ManagedPersistenceUnitInfoFactoryImpl;
 import org.osgi.framework.Bundle;
 import org.osgi.framework.BundleContext;
 import org.osgi.framework.BundleEvent;
+import org.osgi.framework.ServiceReference;
+import org.osgi.framework.Version;
 import org.osgi.util.tracker.BundleTracker;
 
 
@@ -35,14 +57,24 @@
 {
   /** The bundle context for this bundle */
   private BundleContext ctx = null;
-  /** A map of bundles to generated fragments */
-//  private final ConcurrentMap<Bundle, Bundle> hostToFragmentMap = new ConcurrentHashMap<Bundle, Bundle>();
-//  /** A map of persistence bundles to sets of persistence metadata */
-//  private final ConcurrentMap<Bundle, Set<ServiceRegistration>> hostToPersistenceUnitMap = new ConcurrentHashMap<Bundle, Set<ServiceRegistration>>();
-  //TODO pull this from config
-  /** The default JPA provider to use */
-  public static final String DEFAULT_JPA_PROVIDER ="org.apache.openjpa.persistence.PersistenceProviderImpl";
+  /** 
+   * A map of providers to persistence bundles this is used to guarantee that 
+   * when a provider service is removed we can access all of the bundles that
+   * might possibly be using it. The map should only ever be accessed when
+   * synchronized on {@code this}.
+   */
+  private final Map<Bundle, EntityManagerFactoryManager> bundleToManagerMap = new HashMap<Bundle, EntityManagerFactoryManager>();
+  /** The PersistenceProviders.  */
+  private Set<ServiceReference> persistenceProviders = new HashSet<ServiceReference>();
+  /** Plug-point for persistence unit providers */
+  private ManagedPersistenceUnitInfoFactory persistenceUnitFactory; 
+  /** Configuration for this extender */
+  private Properties config;
 
+  private static final String DEFAULT_PU_INFO_FACTORY = "";
+  
+  private static final String DEFAULT_PU_INFO_FACTORY_KEY = "org.apache.aries.jpa.container.PersistenceUnitInfoFactory";
+  
   /**
    * Create the extender. Note that it will not start tracking 
    * until the {@code open()} method is called
@@ -55,6 +87,28 @@
     this.ctx = ctx;
   }
   
+  @Override
+  public void open() {
+    String className = (String) config.get(DEFAULT_PU_INFO_FACTORY_KEY);
+    Class<? extends ManagedPersistenceUnitInfoFactory> clazz = null;
+    
+    if(className != null) {
+      try {
+        clazz = ctx.getBundle().loadClass(className);
+        persistenceUnitFactory = clazz.newInstance();
+      } catch (Exception e) {
+        // TODO Log the error
+        e.printStackTrace();
+        //clazz = default;
+      }
+    }
+    
+    if(persistenceUnitFactory == null)
+      persistenceUnitFactory = new ManagedPersistenceUnitInfoFactoryImpl();
+
+    
+    super.open();
+  }
 //  /**
 //   * If we have generated a resources for the supplied bundle, then
 //   * tidy them  up.
@@ -88,23 +142,89 @@
     if(bundle.getState() == Bundle.ACTIVE) {
       //TODO LOG WARNING HERE
     }
+    EntityManagerFactoryManager mgr = null;
+    mgr = setupManager(bundle, mgr);
+    return mgr;
+  }
 
-    Collection <PersistenceDescriptor> persistenceXmls = PersistenceBundleHelper.findPersistenceXmlFiles(bundle);
+  private EntityManagerFactoryManager setupManager(Bundle bundle,
+    EntityManagerFactoryManager mgr) {
+  Collection <PersistenceDescriptor> persistenceXmls = PersistenceBundleHelper.findPersistenceXmlFiles(bundle);
 
     //If we have no persistence units then our job is done
     if (!!!persistenceXmls.isEmpty()) {
-      //TODO parse these
+      Collection<ParsedPersistenceUnit> pUnits = new ArrayList<ParsedPersistenceUnit>();
+      
+      for(PersistenceDescriptor descriptor : persistenceXmls) {
+        try {
+          pUnits.addAll(PersistenceDescriptorParser.parse(bundle, descriptor));
+        } catch (PersistenceDescriptorParserException e) {
+          // TODO Auto-generated catch block
+          e.printStackTrace();
+        }
+      }
+      
+      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);
+            }
+          }
+        }
+        try {
+          mgr.bundleStateChange();
+        } catch (InvalidPersistenceUnitException e) {
+          // TODO Log this error
+          mgr.destroy();
+        }
+      }
     }
-    return null;
+    return mgr;
+}
+  
+  public synchronized void addingProvider(ServiceReference ref)
+  {
+    persistenceProviders.add(ref);
   }
-//      //Get the persistence units defined, and a provider for them to use
-//      Collection<PersistenceUnitImpl> parsedPersistenceUnits = parseXmlFiles(persistenceXmls, b);
-//      ServiceReference providerRef = getProviderServiceReference(parsedPersistenceUnits);
-//      
+  
+  public void removingProvider(ServiceReference ref)
+  {
+    Map<Bundle, EntityManagerFactoryManager> mgrs;
+    synchronized (this) {
+      persistenceProviders.remove(ref);
+      mgrs = new HashMap<Bundle, EntityManagerFactoryManager>(bundleToManagerMap);
+    }
+    for(Entry<Bundle, EntityManagerFactoryManager> entry : mgrs.entrySet()) {
+      if(entry.getValue().providerRemoved(ref))
+        persistenceUnitFactory.destroyPersistenceBundle(entry.getKey());
+    }
+  }
+  
+  public void setConfig(Properties props) {
+    config = props;
+    URL u = ctx.getBundle().getResource("org.apache.aries.jpa.container.properties");
+    
+    if(u != null)
+      try {
+        config.load(u.openStream());
+      } catch (IOException e) {
+        // TODO Log this error
+        e.printStackTrace();
+      }
+  }
+     
 //      //If we can't find a provider then bomb out
 //      if (providerRef != null)
 //      {
-//        try {
+//        try 
 //          FragmentBuilder builder = new FragmentBuilder(b, ".jpa.fragment");
 //          builder.addImportsFromExports(providerRef.getBundle());
 //          fragment = builder.install(ctx);
@@ -148,13 +268,31 @@
 
 
   public void modifiedBundle(Bundle bundle, BundleEvent event, Object object) {
-      // TODO Auto-generated method stub
-      
+
+    EntityManagerFactoryManager mgr = (EntityManagerFactoryManager) object;
+    
+    if(event != null && event.getType() == BundleEvent.UPDATED) {
+      mgr.destroy();
+      persistenceUnitFactory.destroyPersistenceBundle(bundle);
+      setupManager(bundle, mgr);
+    } else {
+      try {
+        mgr.bundleStateChange();
+      } catch (InvalidPersistenceUnitException e) {
+        // TODO log this
+        mgr.destroy();
+      }
+    }
   }
 
   public void removedBundle(Bundle bundle, BundleEvent event, Object object) {
-      // TODO Auto-generated method stub
-      
+    EntityManagerFactoryManager mgr = (EntityManagerFactoryManager) object;   
+    mgr.destroy();
+    persistenceUnitFactory.destroyPersistenceBundle(bundle);
+    
+    synchronized (this) {
+      bundleToManagerMap.remove(bundle);
+    }
   }
   
 
@@ -164,161 +302,155 @@
    * @param parsedPersistenceUnits
    * @return A service reference or null if no suitable reference is available
    */
-//  private ServiceReference getProviderServiceReference(Collection<PersistenceUnitImpl> parsedPersistenceUnits)
-//  {
-//    Set<String> ppClassNames = new HashSet<String>();
-//    Set<Filter> versionFilters = new HashSet<Filter>();
-//    //Fill the set of class names and version Filters
-//    for(PersistenceUnitImpl unit : parsedPersistenceUnits)
-//    {
-//      Map<String, Object> metadata = unit.getPersistenceXmlMetadata();
-//      String provider = (String) metadata.get(PersistenceUnitInfoService.PROVIDER_CLASSNAME);
-//      //get providers specified in the persistence units
-//      if(provider != null && !!!provider.equals(""))
-//      {
-//        ppClassNames.add(provider);
-//        
-//        Properties props = (Properties) metadata.get(PersistenceUnitInfoService.PROPERTIES);
-//        
-//        if(props != null && props.containsKey(PersistenceUnitInfoService.JPA_PROVIDER_VERSION)) {
-//         
-//          try {
-//            Filter f = getFilter(props.getProperty(PersistenceUnitInfoService.JPA_PROVIDER_VERSION, "0.0.0"));
-//            versionFilters.add(f);
-//          } catch (InvalidSyntaxException e) {
-//            // TODO Log error and ignore, This should never happen
-//            e.printStackTrace();
-//          }
-//        }
-//      }
-//    }
-//    
-//    //If we have too many provider class names specified then blow up
-//    if(ppClassNames.size() > 1)
-//    {
-//      //TODO log this error (too many persistence providers specified)
-//    } else {
-//      //Get the best provider for the given filters
-//      String provider = (ppClassNames.isEmpty()) ?
-//          DEFAULT_JPA_PROVIDER : ppClassNames.iterator().next();
-//          return getBestProvider(provider, versionFilters);
-//    }
-//    return null;
-//  }
+  private ServiceReference getProviderServiceReference(Collection<ParsedPersistenceUnit> parsedPersistenceUnits)
+  {
+    Set<String> ppClassNames = new HashSet<String>();
+    List<VersionRange> versionRanges = new ArrayList<VersionRange>();
+    //Fill the set of class names and version Filters
+    for(ParsedPersistenceUnit unit : parsedPersistenceUnits)
+    {
+      Map<String, Object> metadata = unit.getPersistenceXmlMetadata();
+      String provider = (String) metadata.get(ParsedPersistenceUnit.PROVIDER_CLASSNAME);
+      //get providers specified in the persistence units
+      if(provider != null && !!!provider.equals(""))
+      {
+        ppClassNames.add(provider);
+        
+        Properties props = (Properties) metadata.get(ParsedPersistenceUnit.PROPERTIES);
+        
+        if(props != null && props.containsKey(ParsedPersistenceUnit.JPA_PROVIDER_VERSION)) {
+         
+          try {
+            String versionRangeString = props.getProperty(ParsedPersistenceUnit.JPA_PROVIDER_VERSION, "0.0.0");
+            versionRanges.add(ManifestHeaderProcessor.parseVersionRange(versionRangeString));
+          } catch (IllegalArgumentException e) {
+            // TODO Log error. This is an invalid range and will be ignored.
+            e.printStackTrace();
+          }
+        }
+      }
+    }
+    //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;
+    }
+    
+    if(ppClassNames.size() > 1)
+    {
+      //TODO log this error then(too many persistence providers specified)
+      return null;
+    } else {
+      //Get the best provider for the given filters
+      String provider = (ppClassNames.isEmpty()) ?
+          persistenceUnitFactory.getDefaultProviderClassName() : ppClassNames.iterator().next();
+          return getBestProvider(provider, range);
+    }
+  }
  
-//  /**
-//   * Locate the best provider for the given criteria
-//   * @param providerClass
-//   * @param matchingCriteria
-//   * @return
-//   */
-//  private ServiceReference getBestProvider(String providerClass, Set<Filter> matchingCriteria)
-//  {
-//    ServiceReference[] array = null;
-//    try {
-//      array = ctx.getAllServiceReferences(providerClass, null);
-//    } catch (InvalidSyntaxException e) {
-//      //TODO this can never happen
-//    }
-//    
-//    if(array != null) {
-//      //A linked list is faster for large numbers of ServiceReferences
-//      //Note we cannot use Arrays.asList() as we need to remove items
-//      //via an iterator, and this would throw UnsupportedOperationException.
-//      List<ServiceReference> refs = new LinkedList<ServiceReference>();
-//      
-//      for(ServiceReference reference : array)
-//        refs.add(reference);
-//      
-//      Iterator<ServiceReference> it = refs.iterator();
-//      
-//      //Remove anything that doesn't match the filter
-//      while(it.hasNext())
-//      {
-//        ServiceReference ref = it.next();
-//        for(Filter f : matchingCriteria)
-//        {
-//          if(!!!f.match(ref)) {
-//            it.remove();
-//            break;
-//          }
-//        }
-//      }
-//      
-//      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);
-//      } else {
-//        //TODO no matching providers for matching criteria
-//      }
-//    } else {
-//      //TODO log no matching Providers for impl class
-//    }
-//    
-//    return null;
-//  }
-//  
-//  /**
-//   * Create a filter for the supplied version range string
-//   * @param providerVersion
-//   * @return
-//   * @throws InvalidSyntaxException
-//   */
-//  private Filter getFilter(String providerVersion)
-//      throws InvalidSyntaxException
-//  {
-//    String toReturn = null;
-//    
-//    //TODO NLS enable the messages in the exceptions below (Invalid version range specified...)
-//    //Create a filter to match the required provider version range
-//    if(providerVersion != null) {
-//      if(!!!providerVersion.contains(","))
-//        toReturn = ("(osgi.jpa.provider.version>=" + providerVersion + ")");
-//      else {
-//        String[] versionArray = providerVersion.split(",");
-//        
-//        if(versionArray.length == 2) {
-//          
-//          versionArray[0] = versionArray[0].trim();
-//          versionArray[1] = versionArray[1].trim();
-//          
-//          char bracket1 = versionArray[0].charAt(0);
-//          char bracket2 = versionArray[1].charAt(versionArray[1].length() - 1);
-//          
-//          String version1 = versionArray[0].substring(1);
-//          String version2 = versionArray[1].substring(0, versionArray[1].length() -1);
-//
-//          if(version1.compareTo(version2) > 0)
-//            throw new InvalidSyntaxException("Invalid version range specified. " + providerVersion, providerVersion);
-//          
-//          String compare1 = "(osgi.jpa.provider.version>=" + version1 + ")";
-//          String compare2 = "(osgi.jpa.provider.version<=" + version2 + ")";
-//          
-//          if('(' == bracket1)
-//             compare1 = compare1 + "(!(osgi.jpa.provider.version=" + version1 + "))";
-//          else if('[' != bracket1) throw new InvalidSyntaxException("Invalid version range specified. " + providerVersion, providerVersion);
-//          
-//
-//          if(')' == bracket2)
-//            compare2 = compare2 + "(!(osgi.jpa.provider.version=" + version2 + "))";
-//          else if(']' != bracket2) throw new InvalidSyntaxException("Invalid version range specified. " + providerVersion, providerVersion);
-//         
-//         
-//          toReturn = "(&" + compare1 + compare2 + ")";
-//        } else throw new InvalidSyntaxException("Invalid version range specified. " + providerVersion, providerVersion);
-//        
-//      }
-//    }
-//    return FrameworkUtil.createFilter(toReturn);
-//  }
+  private VersionRange combineVersionRanges(List<VersionRange> versionRanges) throws InvalidRangeCombination {
+
+    Version minVersion = new Version(0,0,0);
+    Version maxVersion = null;
+    boolean minExclusive = false;
+    boolean maxExclusive = false;
+    
+    for(VersionRange range : versionRanges) {
+      int minComparison = minVersion.compareTo(range.getMinimumVersion());
+      //If minVersion is smaller then we have a new, larger, minimum
+      if(minComparison < 0) {
+        minVersion = range.getMinimumVersion();
+        minExclusive = range.isMinimumExclusive();
+      }
+      //Only update if it is the same version but more restrictive
+      else if(minComparison == 0 && range.isMaximumExclusive())
+        minExclusive = true;
+    
+      if(range.isMaximumUnbounded())
+        continue;
+      else if (maxVersion == null) {
+        maxVersion = range.getMaximumVersion();
+        maxExclusive = range.isMaximumExclusive();
+      } else {
+        int maxComparison = maxVersion.compareTo(range.getMaximumVersion());
+        
+        //We have a new, lower maximum
+        if(maxComparison > 0) {
+          maxVersion = range.getMaximumVersion();
+          maxExclusive = range.isMaximumExclusive();
+          //If the maximum is the same then make sure we set the exclusivity properly
+        } else if (maxComparison == 0 && range.isMaximumExclusive())
+          maxExclusive = true;
+      }
+    }
+    
+    //Now check that we have valid values
+    int check = 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))) {
+      throw new InvalidRangeCombination(minVersion, minExclusive, maxVersion, maxExclusive);
+    }
+    
+    StringBuilder rangeString = new StringBuilder();
+    rangeString.append(minVersion);
+    
+    if(maxVersion != null) {
+      rangeString.insert(0, minExclusive ? "(" : "[");
+      rangeString.append(",");
+      rangeString.append(maxVersion);
+      rangeString.append(maxExclusive ? ")" : "[");
+    }
+    
+    return ManifestHeaderProcessor.parseVersionRange(rangeString.toString());
+  }
+
+  /**
+   * Locate the best provider for the given criteria
+   * @param providerClass
+   * @param matchingCriteria
+   * @return
+   */
+  private synchronized ServiceReference getBestProvider(String providerClass, VersionRange matchingCriteria)
+  {
+    if(!!!persistenceProviders.isEmpty()) {
+
+      List<ServiceReference> refs = new ArrayList<ServiceReference>();
+      
+      for(ServiceReference reference : persistenceProviders) {
+        
+        if(providerClass != null && !!!providerClass.equals(
+            reference.getProperty("javax.persistence.provider")))
+          continue;
+          
+        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);
+      } else {
+        //TODO no matching providers for matching criteria
+      }
+    } else {
+      //TODO log no matching Providers for impl class
+    }
+    return null;
+  }
 }

Modified: incubator/aries/trunk/jpa/jpa-container/src/main/java/org/apache/aries/jpa/container/parsing/ParsedPersistenceUnit.java
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/jpa/jpa-container/src/main/java/org/apache/aries/jpa/container/parsing/ParsedPersistenceUnit.java?rev=897874&r1=897873&r2=897874&view=diff
==============================================================================
--- incubator/aries/trunk/jpa/jpa-container/src/main/java/org/apache/aries/jpa/container/parsing/ParsedPersistenceUnit.java (original)
+++ incubator/aries/trunk/jpa/jpa-container/src/main/java/org/apache/aries/jpa/container/parsing/ParsedPersistenceUnit.java Mon Jan 11 14:21:47 2010
@@ -54,6 +54,11 @@
   public static final String NON_JTA_DATASOURCE = "org.apache.aries.jpa.non.jta.datasource";
   /** A Boolean indicating whether unlisted classes should be excluded */
   public static final String EXCLUDE_UNLISTED_CLASSES = "org.apache.aries.jpa.exclude.unlisted";
+  
+  /* End of Map keys */
+  
+  /** This property is used in the JPA properties to indicate a provider version range */
+  public static final String JPA_PROVIDER_VERSION = "org.apache.aries.jpa.provider.version";
 
   /**
    * Return the bundle that defines the persistence unit

Modified: incubator/aries/trunk/jpa/jpa-container/src/main/java/org/apache/aries/jpa/container/parsing/impl/PersistenceUnitImpl.java
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/jpa/jpa-container/src/main/java/org/apache/aries/jpa/container/parsing/impl/PersistenceUnitImpl.java?rev=897874&r1=897873&r2=897874&view=diff
==============================================================================
--- incubator/aries/trunk/jpa/jpa-container/src/main/java/org/apache/aries/jpa/container/parsing/impl/PersistenceUnitImpl.java (original)
+++ incubator/aries/trunk/jpa/jpa-container/src/main/java/org/apache/aries/jpa/container/parsing/impl/PersistenceUnitImpl.java Mon Jan 11 14:21:47 2010
@@ -67,13 +67,11 @@
   }
   
   
-  @Override
   public Bundle getDefiningBundle()
   {
     return bundle;
   }
 
-  @Override
   public Map<String, Object> getPersistenceXmlMetadata()
   {
     Map<String, Object> data = new HashMap<String, Object>(metadata);

Added: incubator/aries/trunk/jpa/jpa-container/src/main/java/org/apache/aries/jpa/container/unit/impl/ManagedPersistenceUnitInfoFactoryImpl.java
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/jpa/jpa-container/src/main/java/org/apache/aries/jpa/container/unit/impl/ManagedPersistenceUnitInfoFactoryImpl.java?rev=897874&view=auto
==============================================================================
--- incubator/aries/trunk/jpa/jpa-container/src/main/java/org/apache/aries/jpa/container/unit/impl/ManagedPersistenceUnitInfoFactoryImpl.java (added)
+++ incubator/aries/trunk/jpa/jpa-container/src/main/java/org/apache/aries/jpa/container/unit/impl/ManagedPersistenceUnitInfoFactoryImpl.java Mon Jan 11 14:21:47 2010
@@ -0,0 +1,38 @@
+package org.apache.aries.jpa.container.unit.impl;
+
+import java.util.ArrayList;
+import java.util.Collection;
+
+import org.apache.aries.jpa.container.ManagedPersistenceUnitInfo;
+import org.apache.aries.jpa.container.ManagedPersistenceUnitInfoFactory;
+import org.apache.aries.jpa.container.parsing.ParsedPersistenceUnit;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceReference;
+
+public class ManagedPersistenceUnitInfoFactoryImpl implements
+    ManagedPersistenceUnitInfoFactory {
+
+  public Collection<ManagedPersistenceUnitInfo> createManagedPersistenceUnitMetadata(
+      BundleContext containerContext, Bundle persistenceBundle,
+      ServiceReference providerReference,
+      Collection<ParsedPersistenceUnit> persistenceMetadata) {
+    
+    Collection<ManagedPersistenceUnitInfo> managedUnits = new ArrayList<ManagedPersistenceUnitInfo>();
+    
+    for(ParsedPersistenceUnit unit : persistenceMetadata)
+      managedUnits.add(new ManagedPersistenceUnitInfoImpl(persistenceBundle, unit));
+    
+    return managedUnits;
+  }
+
+  public void destroyPersistenceBundle(Bundle bundle) {
+    // TODO Auto-generated method stub
+
+  }
+
+  public String getDefaultProviderClassName() {
+    return null;
+  }
+
+}

Added: incubator/aries/trunk/jpa/jpa-container/src/main/java/org/apache/aries/jpa/container/unit/impl/ManagedPersistenceUnitInfoImpl.java
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/jpa/jpa-container/src/main/java/org/apache/aries/jpa/container/unit/impl/ManagedPersistenceUnitInfoImpl.java?rev=897874&view=auto
==============================================================================
--- incubator/aries/trunk/jpa/jpa-container/src/main/java/org/apache/aries/jpa/container/unit/impl/ManagedPersistenceUnitInfoImpl.java (added)
+++ incubator/aries/trunk/jpa/jpa-container/src/main/java/org/apache/aries/jpa/container/unit/impl/ManagedPersistenceUnitInfoImpl.java Mon Jan 11 14:21:47 2010
@@ -0,0 +1,29 @@
+package org.apache.aries.jpa.container.unit.impl;
+
+import java.util.Map;
+
+import javax.persistence.spi.PersistenceUnitInfo;
+
+import org.apache.aries.jpa.container.ManagedPersistenceUnitInfo;
+import org.apache.aries.jpa.container.parsing.ParsedPersistenceUnit;
+import org.osgi.framework.Bundle;
+
+public class ManagedPersistenceUnitInfoImpl implements
+    ManagedPersistenceUnitInfo {
+
+  private final PersistenceUnitInfo info;
+  public ManagedPersistenceUnitInfoImpl(Bundle persistenceBundle,
+      ParsedPersistenceUnit unit) {
+    info = new PersistenceUnitInfoImpl(persistenceBundle, unit);
+  }
+
+  public Map<String, Object> getContainerProperties() {
+    return null;
+  }
+
+  public PersistenceUnitInfo getPersistenceUnitInfo() {
+    return info;
+  }
+
+
+}

Added: 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=897874&view=auto
==============================================================================
--- incubator/aries/trunk/jpa/jpa-container/src/main/java/org/apache/aries/jpa/container/unit/impl/PersistenceUnitInfoImpl.java (added)
+++ incubator/aries/trunk/jpa/jpa-container/src/main/java/org/apache/aries/jpa/container/unit/impl/PersistenceUnitInfoImpl.java Mon Jan 11 14:21:47 2010
@@ -0,0 +1,134 @@
+package org.apache.aries.jpa.container.unit.impl;
+
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Properties;
+
+import javax.naming.InitialContext;
+import javax.naming.NamingException;
+import javax.persistence.SharedCacheMode;
+import javax.persistence.ValidationMode;
+import javax.persistence.spi.ClassTransformer;
+import javax.persistence.spi.PersistenceUnitInfo;
+import javax.persistence.spi.PersistenceUnitTransactionType;
+import javax.sql.DataSource;
+
+import org.apache.aries.jpa.container.parsing.ParsedPersistenceUnit;
+import org.osgi.framework.Bundle;
+
+public class PersistenceUnitInfoImpl implements PersistenceUnitInfo {
+  
+  private final Bundle bundle;
+
+  private final ParsedPersistenceUnit unit;
+  
+  public PersistenceUnitInfoImpl (Bundle b, ParsedPersistenceUnit parsedData)
+  {
+    bundle = b;
+    unit = parsedData;
+  }
+  
+  public void addTransformer(ClassTransformer arg0) {
+    // TODO Auto-generated method stub
+  }
+
+  public boolean excludeUnlistedClasses() {
+    Boolean result = (Boolean) unit.getPersistenceXmlMetadata().get(ParsedPersistenceUnit.EXCLUDE_UNLISTED_CLASSES);
+    return (result == null) ? false : result;
+  }
+
+  public ClassLoader getClassLoader() {
+    // TODO Auto-generated method stub
+    return null;
+  }
+
+  @SuppressWarnings("unchecked")
+  public List<URL> getJarFileUrls() {
+    List<String> jarFiles = (List<String>) unit.getPersistenceXmlMetadata().get(ParsedPersistenceUnit.JAR_FILES);
+    List<URL> urls = new ArrayList<URL>();
+    
+    for(String jarFile : jarFiles)
+      urls.add(bundle.getResource(jarFile));
+    
+    return urls;
+  }
+
+  public DataSource getJtaDataSource() {
+    String jndiString = (String) unit.getPersistenceXmlMetadata().get(ParsedPersistenceUnit.NON_JTA_DATASOURCE);
+    DataSource toReturn = null;
+    try {
+      InitialContext ctx = new InitialContext();
+      toReturn = (DataSource) ctx.lookup(jndiString);
+    } catch (NamingException e) {
+      // TODO Auto-generated catch block
+      e.printStackTrace();
+    }
+    return toReturn;
+  }
+
+  @SuppressWarnings("unchecked")
+  public List<String> getManagedClassNames() {
+    return (List<String>) unit.getPersistenceXmlMetadata().get(ParsedPersistenceUnit.MANAGED_CLASSES);
+  }
+
+  @SuppressWarnings("unchecked")
+  public List<String> getMappingFileNames() {
+    return (List<String>) unit.getPersistenceXmlMetadata().get(ParsedPersistenceUnit.MAPPING_FILES);
+  }
+
+  public ClassLoader getNewTempClassLoader() {
+    // TODO Auto-generated method stub
+    return null;
+  }
+
+  public DataSource getNonJtaDataSource() {
+    
+    String jndiString = (String) unit.getPersistenceXmlMetadata().get(ParsedPersistenceUnit.NON_JTA_DATASOURCE);
+    DataSource toReturn = null;
+    try {
+      InitialContext ctx = new InitialContext();
+      toReturn = (DataSource) ctx.lookup(jndiString);
+    } catch (NamingException e) {
+      // TODO Auto-generated catch block
+      e.printStackTrace();
+    }
+    return toReturn;
+  }
+
+  public String getPersistenceProviderClassName() {
+    return (String) unit.getPersistenceXmlMetadata().get(ParsedPersistenceUnit.PROVIDER_CLASSNAME);
+  }
+
+  public String getPersistenceUnitName() {
+    return (String) unit.getPersistenceXmlMetadata().get(ParsedPersistenceUnit.UNIT_NAME);
+  }
+
+  public URL getPersistenceUnitRootUrl() {
+    return bundle.getResource("");
+  }
+
+  public String getPersistenceXMLSchemaVersion() {
+    return (String) unit.getPersistenceXmlMetadata().get(ParsedPersistenceUnit.SCHEMA_VERSION);
+  }
+
+  public Properties getProperties() {
+    return (Properties) unit.getPersistenceXmlMetadata().get(ParsedPersistenceUnit.PROPERTIES);
+  }
+
+  public SharedCacheMode getSharedCacheMode() {
+    // TODO Auto-generated method stub
+    return null;
+  }
+
+  public PersistenceUnitTransactionType getTransactionType() {
+    return PersistenceUnitTransactionType.valueOf(
+        (String) unit.getPersistenceXmlMetadata().get(ParsedPersistenceUnit.TRANSACTION_TYPE));
+  }
+
+  public ValidationMode getValidationMode() {
+    // TODO Auto-generated method stub
+    return null;
+  }
+  
+}
\ No newline at end of file

Added: 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=897874&view=auto
==============================================================================
--- incubator/aries/trunk/jpa/jpa-container/src/main/resources/OSGI-INF/blueprint/jpa.xml (added)
+++ incubator/aries/trunk/jpa/jpa-container/src/main/resources/OSGI-INF/blueprint/jpa.xml Mon Jan 11 14:21:47 2010
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+    Licensed to the Apache Software Foundation (ASF) under one or more
+    contributor license agreements.  See the NOTICE file distributed with
+    this work for additional information regarding copyright ownership.
+    The ASF licenses this file to You under the Apache License, Version 2.0
+    (the "License"); you may not use this file except in compliance with
+    the License.  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+-->
+<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">
+      <argument ref="blueprintBundleContext"/>
+    </bean>
+
+	<reference-list interface="javax.persistence.spi.PersistenceProvider">
+	  <reference-listener ref="container" bind-method="addingProvider" unbind-method="removingProvider"/>
+	</reference-list>
+    
+</blueprint>