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