You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@aries.apache.org by ga...@apache.org on 2010/06/02 03:28:59 UTC

svn commit: r950331 - in /incubator/aries/trunk/jpa: jpa-api/src/main/java/org/apache/aries/jpa/container/ jpa-container/src/main/java/org/apache/aries/jpa/container/unit/impl/

Author: gawor
Date: Wed Jun  2 01:28:59 2010
New Revision: 950331

URL: http://svn.apache.org/viewvc?rev=950331&view=rev
Log:
ARIES-329: ManagedPersistenceUnitInfoFactory service-based listener

Added:
    incubator/aries/trunk/jpa/jpa-api/src/main/java/org/apache/aries/jpa/container/ManagedPersistenceUnitInfoFactoryListener.java   (with props)
Modified:
    incubator/aries/trunk/jpa/jpa-container/src/main/java/org/apache/aries/jpa/container/unit/impl/ManagedPersistenceUnitInfoFactoryImpl.java

Added: incubator/aries/trunk/jpa/jpa-api/src/main/java/org/apache/aries/jpa/container/ManagedPersistenceUnitInfoFactoryListener.java
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/jpa/jpa-api/src/main/java/org/apache/aries/jpa/container/ManagedPersistenceUnitInfoFactoryListener.java?rev=950331&view=auto
==============================================================================
--- incubator/aries/trunk/jpa/jpa-api/src/main/java/org/apache/aries/jpa/container/ManagedPersistenceUnitInfoFactoryListener.java (added)
+++ incubator/aries/trunk/jpa/jpa-api/src/main/java/org/apache/aries/jpa/container/ManagedPersistenceUnitInfoFactoryListener.java Wed Jun  2 01:28:59 2010
@@ -0,0 +1,66 @@
+/*
+ * 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 WARRANTIESOR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.aries.jpa.container;
+
+import java.util.Collection;
+
+import javax.persistence.EntityManagerFactory;
+import javax.persistence.spi.PersistenceProvider;
+
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceReference;
+
+/**
+ * The <tt>ManagedPersistenceUnitInfoFactoryListener</tt> service is called by 
+ * {@link ManagedPersistenceUnitInfoFactory} when persistence bundle is detected or is no longer being managed.
+ * The <tt>ManagedPersistenceUnitInfoFactoryListener</tt> can be used to performs additional actions
+ * when persistence bundles get installed or uninstalled, etc.
+ */
+public interface ManagedPersistenceUnitInfoFactoryListener {
+ 
+    /**
+     * This method will be called by the Aries JPA container when persistence descriptors have
+     * been located in a persistence bundle.
+     * 
+     * @param containerContext  The {@link BundleContext} for the container bundle. This can be
+     *                          used to get services from the service registry.
+     * @param persistenceBundle The {@link Bundle} defining the persistence units. This bundle may
+     *                          be in any state, and so may not have a usable {@link BundleContext}
+     *                          or be able to load classes.
+     * @param providerReference A {@link ServiceReference} for the {@link PersistenceProvider} service
+     *                          that will be used to create {@link EntityManagerFactory} objects from
+     *                          these persistence units.
+     */
+    public void persistenceUnitMetadataCreated(BundleContext containerContext, 
+                                               Bundle persistenceBundle, 
+                                               ServiceReference providerReference, 
+                                               Collection<ManagedPersistenceUnitInfo> managedUnits);
+  
+    /**
+     * This method will be called when the persistence bundle is no longer being managed. This may
+     * be because the bundle is being updated, or because the {@link PersistenceProvider} being
+     * used is no longer available.
+     * 
+     * @param containerContext  The {@link BundleContext} for the container bundle. 
+     * @param persistenceBundle The persistence bundle that is no longer valid.
+     */
+    public void persistenceBundleDestroyed(BundleContext containerContext, 
+                                           Bundle persistenceBundle);
+}

Propchange: incubator/aries/trunk/jpa/jpa-api/src/main/java/org/apache/aries/jpa/container/ManagedPersistenceUnitInfoFactoryListener.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/aries/trunk/jpa/jpa-api/src/main/java/org/apache/aries/jpa/container/ManagedPersistenceUnitInfoFactoryListener.java
------------------------------------------------------------------------------
    svn:keywords = Date Revision

Propchange: incubator/aries/trunk/jpa/jpa-api/src/main/java/org/apache/aries/jpa/container/ManagedPersistenceUnitInfoFactoryListener.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: 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=950331&r1=950330&r2=950331&view=diff
==============================================================================
--- incubator/aries/trunk/jpa/jpa-container/src/main/java/org/apache/aries/jpa/container/unit/impl/ManagedPersistenceUnitInfoFactoryImpl.java (original)
+++ incubator/aries/trunk/jpa/jpa-container/src/main/java/org/apache/aries/jpa/container/unit/impl/ManagedPersistenceUnitInfoFactoryImpl.java Wed Jun  2 01:28:59 2010
@@ -22,31 +22,33 @@ import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.List;
 import java.util.Map;
 
 import org.apache.aries.jpa.container.ManagedPersistenceUnitInfo;
 import org.apache.aries.jpa.container.ManagedPersistenceUnitInfoFactory;
+import org.apache.aries.jpa.container.ManagedPersistenceUnitInfoFactoryListener;
 import org.apache.aries.jpa.container.parsing.ParsedPersistenceUnit;
 import org.apache.aries.jpa.transformer.TransformerAgent;
 import org.osgi.framework.Bundle;
 import org.osgi.framework.BundleContext;
+import org.osgi.framework.InvalidSyntaxException;
 import org.osgi.framework.ServiceReference;
 
 public class ManagedPersistenceUnitInfoFactoryImpl implements ManagedPersistenceUnitInfoFactory {
 
   private Map<Bundle, PersistenceBundleInfo> map = 
       Collections.synchronizedMap(new HashMap<Bundle, PersistenceBundleInfo>());
-  
+    
   public Collection<ManagedPersistenceUnitInfo> createManagedPersistenceUnitMetadata(
       BundleContext containerContext, Bundle persistenceBundle,
       ServiceReference providerReference,
       Collection<ParsedPersistenceUnit> persistenceMetadata) {
     
-    //TODO add support for provider bundle imports (e.g. for weaving) here
-      
     // try to get TransformerAgent service
-    ServiceReference agentReference = containerContext.getServiceReference(TransformerAgent.class.getName());
     TransformerAgent agent = null;
+    ServiceReference agentReference = containerContext.getServiceReference(TransformerAgent.class.getName());   
     if (agentReference != null) {
         agent = (TransformerAgent) containerContext.getService(agentReference);
     }
@@ -55,16 +57,51 @@ public class ManagedPersistenceUnitInfoF
     for (ParsedPersistenceUnit unit : persistenceMetadata) {
       managedUnits.add(new ManagedPersistenceUnitInfoImpl(persistenceBundle, unit, providerReference, agent));
     }
+            
+    // try to get ManagedPersistenceUnitInfoFactoryListener service
+    ManagedPersistenceUnitInfoFactoryListener listener = null;
+    ServiceReference listenerReference = getManagedPersistenceUnitInfoFactoryListener(containerContext, providerReference);
+    if (listenerReference != null) {
+        listener = (ManagedPersistenceUnitInfoFactoryListener) containerContext.getService(listenerReference);
+    }
+        
+    if (listener != null) {
+        listener.persistenceUnitMetadataCreated(containerContext, persistenceBundle, providerReference, managedUnits);
+    }
     
     PersistenceBundleInfo info = new PersistenceBundleInfo();
     info.managedUnits = managedUnits;
-    info.agentReference = agentReference;
+    info.listener = listener;
+    info.references.add(agentReference);
+    info.references.add(listenerReference);
     
     map.put(persistenceBundle, info);
     
     return managedUnits;
   }
   
+  private ServiceReference getManagedPersistenceUnitInfoFactoryListener(BundleContext containerContext, 
+                                                                        ServiceReference providerReference) {
+     
+      if (providerReference != null) {
+          String providerName = (String) providerReference.getProperty("javax.persistence.provider");
+          if (providerName != null) {
+              String filter = "(javax.persistence.provider=" + providerName + ")";
+              try {
+                  ServiceReference[] refs = containerContext.getServiceReferences(ManagedPersistenceUnitInfoFactoryListener.class.getName(), filter);
+                  if (refs != null && refs.length > 0) {
+                      return refs[0];
+                  }
+              } catch (InvalidSyntaxException e) {
+                  // should not happen
+                  e.printStackTrace();
+              }
+          }
+      }
+      
+      return containerContext.getServiceReference(ManagedPersistenceUnitInfoFactoryListener.class.getName());
+  }
+  
   public void destroyPersistenceBundle(BundleContext containerContext, Bundle persistenceBundle) {
       PersistenceBundleInfo info = map.remove(persistenceBundle);
       if (info != null) {
@@ -73,9 +110,12 @@ public class ManagedPersistenceUnitInfoF
               ((ManagedPersistenceUnitInfoImpl) unit).destroy();
           }
           info.managedUnits.clear();
-          // unget agent service
-          if (info.agentReference != null) {
-              containerContext.ungetService(info.agentReference);
+          if (info.listener != null) {
+              info.listener.persistenceBundleDestroyed(containerContext, persistenceBundle);
+          }
+          // unget services
+          for (ServiceReference ref : info.references) {
+              containerContext.ungetService(ref);
           }
       }
   }
@@ -85,8 +125,9 @@ public class ManagedPersistenceUnitInfoF
   }
     
   private static class PersistenceBundleInfo {
+      private List<ServiceReference> references = new LinkedList<ServiceReference>();
       private Collection<ManagedPersistenceUnitInfo> managedUnits;
-      private ServiceReference agentReference;
+      private ManagedPersistenceUnitInfoFactoryListener listener;
   }
   
   //Code that can be used to attach a fragment for provider wiring