You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openjpa.apache.org by mi...@apache.org on 2011/02/08 22:28:31 UTC
svn commit: r1068588 - in /openjpa/trunk: openjpa-kernel/
openjpa-kernel/src/main/java/org/apache/openjpa/ee/
openjpa-kernel/src/test/java/org/apache/openjpa/ee/
openjpa-persistence/src/main/java/org/apache/openjpa/persistence/osgi/
Author: mikedd
Date: Tue Feb 8 21:28:30 2011
New Revision: 1068588
URL: http://svn.apache.org/viewvc?rev=1068588&view=rev
Log:
OPENJPA-1593: Add OSGi managed runtime.
Submitted By: Wolfgang Glas
Added:
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/ee/OSGiManagedRuntime.java (with props)
openjpa/trunk/openjpa-kernel/src/test/java/org/apache/openjpa/ee/TestOSGiManagedRuntime.java (with props)
Modified:
openjpa/trunk/openjpa-kernel/pom.xml
openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/osgi/PersistenceActivator.java
Modified: openjpa/trunk/openjpa-kernel/pom.xml
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-kernel/pom.xml?rev=1068588&r1=1068587&r2=1068588&view=diff
==============================================================================
--- openjpa/trunk/openjpa-kernel/pom.xml (original)
+++ openjpa/trunk/openjpa-kernel/pom.xml Tue Feb 8 21:28:30 2011
@@ -65,6 +65,14 @@
<artifactId>ant</artifactId>
<scope>provided</scope>
</dependency>
+ <!-- for osgi ManagedRuntime implementation, -->
+ <!-- we pull in OSGi core at the same level as Apache Aries -->
+ <dependency>
+ <groupId>org.osgi</groupId>
+ <artifactId>org.osgi.core</artifactId>
+ <version>4.2.0</version>
+ <scope>provided</scope>
+ </dependency>
</dependencies>
<build>
Added: openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/ee/OSGiManagedRuntime.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/ee/OSGiManagedRuntime.java?rev=1068588&view=auto
==============================================================================
--- openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/ee/OSGiManagedRuntime.java (added)
+++ openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/ee/OSGiManagedRuntime.java Tue Feb 8 21:28:30 2011
@@ -0,0 +1,178 @@
+/*
+ * 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.
+ */
+package org.apache.openjpa.ee;
+
+import javax.transaction.TransactionManager;
+
+import org.apache.openjpa.util.InternalException;
+import org.osgi.framework.BundleActivator;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.Constants;
+import org.osgi.framework.InvalidSyntaxException;
+import org.osgi.framework.ServiceEvent;
+import org.osgi.framework.ServiceListener;
+import org.osgi.framework.ServiceReference;
+
+/**
+ * <p>Implementation of the {@link ManagedRuntime} interface that listens
+ * for an OSGi service with interface <code>javax.transaction.TransactionManager</code>
+ * to create a {@link TransactionManager} for controlling transactions.</p>
+ *
+ * <p>The support for a transaction manager is usually activated inside an OSGi
+ * {@link BundleActivator} implementation using {@link #registerServiceListener(BundleContext)}
+ * and {@link #deregisterServiceListener(BundleContext)}.
+ * </p>
+ */
+public class OSGiManagedRuntime extends AbstractManagedRuntime {
+
+ /**
+ * a static instance, which is managed by the ServiceListener added to the bundle
+ * context by {@link #registerServiceListener(BundleContext)}.
+ */
+ private static TransactionManager transactionManager;
+ private static ServiceReference serviceReference;
+ private static ServiceListener listener;
+
+ private static final class Listener implements ServiceListener {
+
+ final BundleContext bundleContext;
+ // avoid the garbage collection of the OSGiManagedRuntime class itself,
+ // by holding a reference to it.
+ final Class<OSGiManagedRuntime> clazzRef;
+
+ public Listener(BundleContext bundleContext) {
+ this.bundleContext = bundleContext;
+ this.clazzRef = OSGiManagedRuntime.class;
+ }
+
+ @Override
+ public void serviceChanged(ServiceEvent event) {
+
+ synchronized (this.clazzRef) {
+
+ switch (event.getType()) {
+
+ case ServiceEvent.REGISTERED:
+ OSGiManagedRuntime.serviceReference = event.getServiceReference();
+ OSGiManagedRuntime.transactionManager =
+ (TransactionManager) this.bundleContext.getService(OSGiManagedRuntime.serviceReference);
+ break;
+
+ case ServiceEvent.UNREGISTERING:
+ OSGiManagedRuntime.transactionManager = null;
+ OSGiManagedRuntime.serviceReference = null;
+ this.bundleContext.ungetService(event.getServiceReference());
+ break;
+ }
+ }
+ }
+ }
+
+ /**
+ * <p>Register a service listener to the given bundle context by
+ * {@link BundleContext#addServiceListener(ServiceListener,String)} with a filter
+ * expression of <code>(objectClass=javax.transaction.TransactionManager)</code>.</p>
+ *
+ * <p>The caller is responsible for calling
+ * {@link #deregisterServiceListener(BundleContext)}, when
+ * the bundle context is being stopped.</p>
+ *
+ * @param bundle The bundle, which is currently being started.
+ * @throws InvalidSyntaxException When the filter expression is invalid.
+ */
+ public static synchronized void registerServiceListener(BundleContext bundleContext)
+ throws InvalidSyntaxException {
+
+ if (listener != null) {
+ throw new InternalException("Another OSGi service listener has already been registered.");
+ }
+
+ listener = new Listener(bundleContext);
+
+ bundleContext.addServiceListener(listener, "(" + Constants.OBJECTCLASS
+ + "=javax.transaction.TransactionManager)");
+
+ serviceReference = bundleContext.getServiceReference("javax.transaction.TransactionManager");
+
+ if (serviceReference != null) {
+ transactionManager = (TransactionManager)bundleContext.getService(serviceReference);
+ }
+ }
+
+ /**
+ * Remove a service listener previously started inside {@link #registerServiceListener(BundleContext)}.
+ *
+ * @param bundleContext The bundle context to call
+ * {@link BundleContext#removeServiceListener(ServiceListener)} on.
+ */
+ public static synchronized void deregisterServiceListener(BundleContext bundleContext) {
+
+ try {
+ if (serviceReference != null) {
+ bundleContext.ungetService(serviceReference);
+ transactionManager = null;
+ serviceReference = null;
+ }
+ }
+ finally {
+ // assure, that the service listener is removed, whatever happens above.
+ if (listener != null) {
+ bundleContext.removeServiceListener(listener);
+ listener = null;
+ }
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.apache.openjpa.ee.ManagedRuntime#getTransactionManager()
+ */
+ @Override
+ public TransactionManager getTransactionManager() throws Exception {
+ synchronized (OSGiManagedRuntime.class) {
+
+ if (transactionManager == null) {
+ throw new InternalException("No javax.transaction.TransactionManager " +
+ "service is currently registered as an OSGi service.");
+ }
+
+ return transactionManager;
+ }
+ }
+
+ /* (non-Javadoc)
+ *
+ * @see org.apache.openjpa.ee.ManagedRuntime#setRollbackOnly(java.lang.Throwable)
+ */
+ @Override
+ public void setRollbackOnly(Throwable cause) throws Exception {
+
+ // there is no generic support for setting the rollback cause
+ getTransactionManager().getTransaction().setRollbackOnly();
+ }
+
+ /* (non-Javadoc)
+ * @see org.apache.openjpa.ee.ManagedRuntime#getRollbackCause()
+ */
+ @Override
+ public Throwable getRollbackCause() throws Exception {
+ // there is no generic support for setting the rollback cause
+ return null;
+ }
+
+}
Propchange: openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/ee/OSGiManagedRuntime.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: openjpa/trunk/openjpa-kernel/src/test/java/org/apache/openjpa/ee/TestOSGiManagedRuntime.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-kernel/src/test/java/org/apache/openjpa/ee/TestOSGiManagedRuntime.java?rev=1068588&view=auto
==============================================================================
--- openjpa/trunk/openjpa-kernel/src/test/java/org/apache/openjpa/ee/TestOSGiManagedRuntime.java (added)
+++ openjpa/trunk/openjpa-kernel/src/test/java/org/apache/openjpa/ee/TestOSGiManagedRuntime.java Tue Feb 8 21:28:30 2011
@@ -0,0 +1,482 @@
+/*
+ * 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.
+ */
+package org.apache.openjpa.ee;
+
+import java.io.File;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.Dictionary;
+import java.util.List;
+
+import javax.transaction.HeuristicMixedException;
+import javax.transaction.HeuristicRollbackException;
+import javax.transaction.InvalidTransactionException;
+import javax.transaction.NotSupportedException;
+import javax.transaction.RollbackException;
+import javax.transaction.SystemException;
+import javax.transaction.Transaction;
+import javax.transaction.TransactionManager;
+
+import junit.framework.AssertionFailedError;
+import junit.framework.TestCase;
+
+import org.apache.openjpa.util.InternalException;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.BundleException;
+import org.osgi.framework.BundleListener;
+import org.osgi.framework.Filter;
+import org.osgi.framework.FrameworkListener;
+import org.osgi.framework.InvalidSyntaxException;
+import org.osgi.framework.ServiceEvent;
+import org.osgi.framework.ServiceListener;
+import org.osgi.framework.ServiceReference;
+import org.osgi.framework.ServiceRegistration;
+
+/**
+ * Test javax.transaction.TransactionManager OSGi service discovery.
+ */
+public class TestOSGiManagedRuntime extends TestCase {
+
+ private static final String TXN_MANAGER_CLASS_NAME = "javax.transaction.TransactionManager";
+
+ /**
+ * A transaction manager instance an nothing more.
+ */
+ private static final TransactionManager TXN_MANAGER = new TransactionManager() {
+
+ public void begin() throws NotSupportedException, SystemException {
+ }
+
+ public void commit() throws HeuristicMixedException,
+ HeuristicRollbackException, IllegalStateException,
+ RollbackException, SecurityException, SystemException {
+ }
+
+ public int getStatus() throws SystemException {
+ return 0;
+ }
+
+ public Transaction getTransaction() throws SystemException {
+ return null;
+ }
+
+ public void resume(Transaction tobj) throws IllegalStateException,
+ InvalidTransactionException, SystemException {
+ }
+
+ public void rollback() throws IllegalStateException, SecurityException,
+ SystemException {
+ }
+
+ public void setRollbackOnly() throws IllegalStateException,
+ SystemException {
+ }
+
+ public void setTransactionTimeout(int seconds) throws SystemException {
+ }
+
+ public Transaction suspend() throws SystemException {
+ return null;
+ }
+
+ public String toString() {
+ return TestOSGiManagedRuntime.class.getName()+"::TXN_MANAGER";
+ }
+ };
+
+ /**
+ * A service reference instance an nothing more.
+ */
+ private static final ServiceReference TXN_SVC_REFERENCE = new ServiceReference() {
+
+ @Override
+ public boolean isAssignableTo(Bundle bundle, String className) {
+ return false;
+ }
+
+ @Override
+ public Bundle[] getUsingBundles() {
+ return null;
+ }
+
+ @Override
+ public String[] getPropertyKeys() {
+ return null;
+ }
+
+ @Override
+ public Object getProperty(String key) {
+ return null;
+ }
+
+ @Override
+ public Bundle getBundle() {
+ return null;
+ }
+
+ @Override
+ public int compareTo(Object reference) {
+ return reference == TXN_SVC_REFERENCE ? 0 : 1;
+ }
+
+ public String toString() {
+ return TestOSGiManagedRuntime.class.getName()+"::TXN_SVC_REFERENCE";
+ }
+ };
+
+ /**
+ * A fake bundle context with a reference counter for a javax.transaction.TRansactionManager
+ */
+ private static final class TestBundleContext implements BundleContext {
+
+ private List<ServiceListener> serviceListeners;
+ private TransactionManager transactionManager;
+ private int txnRefCount;
+
+ public void setTransactionManager(TransactionManager transactionManager) {
+
+ if (transactionManager == null) {
+
+ if (this.serviceListeners != null) {
+ for (ServiceListener listener :this.serviceListeners) {
+ listener.serviceChanged(new ServiceEvent(ServiceEvent.UNREGISTERING,TXN_SVC_REFERENCE));
+ }
+ }
+ }
+
+ // test for properly calling ungetReference().
+ assertEquals(0,this.txnRefCount);
+ this.transactionManager = transactionManager;
+
+ if (transactionManager != null) {
+
+ if (this.serviceListeners != null) {
+ for (ServiceListener listener :this.serviceListeners) {
+ listener.serviceChanged(new ServiceEvent(ServiceEvent.REGISTERED,TXN_SVC_REFERENCE));
+ }
+ }
+ }
+ }
+
+ public int getServiceListenerCount() {
+
+ if (this.serviceListeners == null) {
+ return 0;
+ }
+ else {
+ return this.serviceListeners.size();
+ }
+ }
+
+ public int getTxnRefCount() {
+ return this.txnRefCount;
+ }
+
+ public String getProperty(String key) {
+ throw new UnsupportedOperationException();
+ }
+
+ public Bundle getBundle() {
+ throw new UnsupportedOperationException();
+ }
+
+ public Bundle installBundle(String location, InputStream input)
+ throws BundleException {
+ throw new UnsupportedOperationException();
+ }
+
+ public Bundle installBundle(String location) throws BundleException {
+ throw new UnsupportedOperationException();
+ }
+
+ public Bundle getBundle(long id) {
+ throw new UnsupportedOperationException();
+ }
+
+ public Bundle[] getBundles() {
+ throw new UnsupportedOperationException();
+ }
+
+ public void addServiceListener(ServiceListener listener, String filter)
+ throws InvalidSyntaxException {
+
+ assertEquals("(objectClass="+TXN_MANAGER_CLASS_NAME+")",filter);
+
+ if (this.serviceListeners == null)
+ this.serviceListeners = new ArrayList<ServiceListener>();
+
+ this.serviceListeners.add(listener);
+ }
+
+ public void addServiceListener(ServiceListener listener) {
+
+ throw new AssertionFailedError("service listener must be added using an objectClass filter.");
+ }
+
+ public void removeServiceListener(ServiceListener listener) {
+
+ if (this.serviceListeners == null || ! this.serviceListeners.remove(listener)) {
+ throw new AssertionFailedError("Try to remove service listener, which has not been added before.");
+ }
+
+ assertEquals(0,this.txnRefCount);
+ }
+
+ public void addBundleListener(BundleListener listener) {
+ throw new UnsupportedOperationException();
+ }
+
+ public void removeBundleListener(BundleListener listener) {
+ throw new UnsupportedOperationException();
+ }
+
+ public void addFrameworkListener(FrameworkListener listener) {
+ throw new UnsupportedOperationException();
+ }
+
+ public void removeFrameworkListener(FrameworkListener listener) {
+ throw new UnsupportedOperationException();
+ }
+
+ @SuppressWarnings("rawtypes")
+ public ServiceRegistration registerService(String[] clazzes,
+ Object service, Dictionary properties) {
+ throw new UnsupportedOperationException();
+ }
+
+ @SuppressWarnings("rawtypes")
+ public ServiceRegistration registerService(String clazz,
+ Object service, Dictionary properties) {
+ throw new UnsupportedOperationException();
+ }
+
+ public ServiceReference[] getServiceReferences(String clazz,
+ String filter) throws InvalidSyntaxException {
+ throw new UnsupportedOperationException();
+ }
+
+ public ServiceReference[] getAllServiceReferences(String clazz,
+ String filter) throws InvalidSyntaxException {
+ throw new UnsupportedOperationException();
+ }
+
+ public ServiceReference getServiceReference(String clazz) {
+
+ assertEquals(TXN_MANAGER_CLASS_NAME,clazz);
+
+ if (this.transactionManager == null) {
+ return null;
+ }
+
+ assertEquals(TXN_MANAGER_CLASS_NAME,clazz);
+ return TXN_SVC_REFERENCE;
+ }
+
+ @Override
+ public Object getService(ServiceReference reference) {
+
+ assertSame(TXN_SVC_REFERENCE,reference);
+ ++this.txnRefCount;
+ return this.transactionManager;
+ }
+
+ @Override
+ public boolean ungetService(ServiceReference reference) {
+
+ assertSame(TXN_SVC_REFERENCE,reference);
+ --this.txnRefCount;
+ return true;
+ }
+
+ public File getDataFile(String filename) {
+ throw new UnsupportedOperationException();
+ }
+
+ public Filter createFilter(String filter) throws InvalidSyntaxException {
+ throw new UnsupportedOperationException();
+ }
+
+ }
+
+ private static void assertTxnManagerAvailable(TestBundleContext context, ManagedRuntime mr) throws Exception {
+
+ assertSame(TXN_MANAGER,mr.getTransactionManager());
+ assertEquals(1,context.getTxnRefCount());
+ }
+
+ private static void assertTxnManagerUnavailable(TestBundleContext context, ManagedRuntime mr) throws Exception {
+
+ InternalException ie = null;
+
+ try {
+ mr.getTransactionManager();
+ } catch (InternalException e) {
+ ie = e;
+ }
+ assertNotNull(ie);
+ assertEquals(0,context.getTxnRefCount());
+ }
+
+ /**
+ * Test the discovery, when transaction manager is available before starting
+ * OSGiManagedRuntime and disappears after stopping the managed runtime.
+ *
+ * @throws Throwable
+ */
+ public void testTxnServiceDiscoveryPreStartPostStop() throws Throwable {
+
+ TestBundleContext context = new TestBundleContext();
+ context.setTransactionManager(TXN_MANAGER);
+
+ OSGiManagedRuntime.registerServiceListener(context);
+
+ ManagedRuntime mr = new OSGiManagedRuntime();
+
+ try {
+
+ assertEquals(1,context.getServiceListenerCount());
+
+ assertTxnManagerAvailable(context, mr);
+
+ context.setTransactionManager(null);
+
+ assertTxnManagerUnavailable(context, mr);
+
+ OSGiManagedRuntime.deregisterServiceListener(context);
+ }
+ catch(Throwable e) {
+ // this is her in order to make test repeatable in one JVM, because
+ // OSGiManagerRuntime has static properties.
+ OSGiManagedRuntime.deregisterServiceListener(context);
+ throw e;
+ }
+ assertEquals(0,context.getServiceListenerCount());
+
+ assertTxnManagerUnavailable(context, mr);
+ }
+
+ /**
+ * Test the discovery, when transaction manager is available before starting
+ * OSGiManagedRuntime and disappears before stopping the managed runtime.
+ *
+ * @throws Throwable
+ */
+ public void testTxnServiceDiscoveryPreStartPreStop() throws Throwable {
+
+ TestBundleContext context = new TestBundleContext();
+ context.setTransactionManager(TXN_MANAGER);
+
+ OSGiManagedRuntime.registerServiceListener(context);
+
+ ManagedRuntime mr = new OSGiManagedRuntime();
+
+ try {
+
+ assertEquals(1,context.getServiceListenerCount());
+
+ assertTxnManagerAvailable(context, mr);
+
+ OSGiManagedRuntime.deregisterServiceListener(context);
+ }
+ catch(Throwable e) {
+ // this is her in order to make test repeatable in one JVM, because
+ // OSGiManagerRuntime has static properties.
+ OSGiManagedRuntime.deregisterServiceListener(context);
+ throw e;
+ }
+ assertEquals(0,context.getServiceListenerCount());
+
+ assertTxnManagerUnavailable(context, mr);
+ }
+
+ /**
+ * Test the discovery, when transaction manager becomes available after starting
+ * OSGiManagedRuntime and disappears after stopping the managed runtime.
+ *
+ * @throws Throwable
+ */
+ public void testTxnServiceDiscoveryPostStartPostStop() throws Throwable {
+
+ TestBundleContext context = new TestBundleContext();
+
+ OSGiManagedRuntime.registerServiceListener(context);
+ ManagedRuntime mr = new OSGiManagedRuntime();
+
+ try{
+ assertEquals(1,context.getServiceListenerCount());
+
+ assertTxnManagerUnavailable(context, mr);
+
+ context.setTransactionManager(TXN_MANAGER);
+
+ assertTxnManagerAvailable(context, mr);
+
+ OSGiManagedRuntime.deregisterServiceListener(context);
+ }
+ catch(Throwable e) {
+ // this is her in order to make test repeatable in one JVM, because
+ // OSGiManagerRuntime has static proeprties.
+ OSGiManagedRuntime.deregisterServiceListener(context);
+ throw e;
+ }
+ assertEquals(0,context.getServiceListenerCount());
+
+ assertTxnManagerUnavailable(context, mr);
+ }
+
+ /**
+ * Test the discovery, when transaction manager becomes available after starting
+ * OSGiManagedRuntime and disappears before stopping the managed runtime.
+ *
+ * @throws Throwable
+ */
+ public void testTxnServiceDiscoveryPostStartPreStop() throws Throwable {
+
+ TestBundleContext context = new TestBundleContext();
+
+ OSGiManagedRuntime.registerServiceListener(context);
+ ManagedRuntime mr = new OSGiManagedRuntime();
+
+ try {
+ assertEquals(1,context.getServiceListenerCount());
+
+ assertTxnManagerUnavailable(context, mr);
+
+ context.setTransactionManager(TXN_MANAGER);
+
+ assertTxnManagerAvailable(context, mr);
+
+ context.setTransactionManager(null);
+
+ assertTxnManagerUnavailable(context, mr);
+
+ OSGiManagedRuntime.deregisterServiceListener(context);
+ }
+ catch(Throwable e) {
+ // this is her in order to make test repeatable in one JVM, because
+ // OSGiManagerRuntime has static proeprties.
+ OSGiManagedRuntime.deregisterServiceListener(context);
+ throw e;
+ }
+ assertEquals(0,context.getServiceListenerCount());
+
+ assertTxnManagerUnavailable(context, mr);
+ }
+}
Propchange: openjpa/trunk/openjpa-kernel/src/test/java/org/apache/openjpa/ee/TestOSGiManagedRuntime.java
------------------------------------------------------------------------------
svn:eol-style = native
Modified: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/osgi/PersistenceActivator.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/osgi/PersistenceActivator.java?rev=1068588&r1=1068587&r2=1068588&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/osgi/PersistenceActivator.java (original)
+++ openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/osgi/PersistenceActivator.java Tue Feb 8 21:28:30 2011
@@ -20,6 +20,7 @@ import java.util.Hashtable;
import javax.persistence.spi.PersistenceProvider;
+import org.apache.openjpa.ee.OSGiManagedRuntime;
import org.apache.openjpa.persistence.PersistenceProviderImpl;
import org.osgi.framework.Bundle;
import org.osgi.framework.BundleActivator;
@@ -50,12 +51,17 @@ public class PersistenceActivator implem
Hashtable<String, String> props = new Hashtable<String, String>();
props.put(PERSISTENCE_PROVIDER_ARIES, OSGI_PERSISTENCE_PROVIDER);
svcReg = ctx.registerService(PERSISTENCE_PROVIDER, provider, props);
+
+ OSGiManagedRuntime.registerServiceListener(ctx);
}
/* (non-Javadoc)
* @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext)
*/
public void stop(BundleContext ctx) throws Exception {
+
+ OSGiManagedRuntime.deregisterServiceListener(ctx);
+
if (svcReg != null) {
svcReg.unregister();
svcReg = null;