You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tomee.apache.org by rm...@apache.org on 2011/12/06 09:14:02 UTC
svn commit: r1210818 - in /openejb/trunk/openejb: container/openejb-osgi/
container/openejb-osgi/src/main/java/org/apache/openejb/core/osgi/impl/
server/openejb-server/src/main/java/org/apache/openejb/server/osgi/
Author: rmannibucau
Date: Tue Dec 6 08:14:01 2011
New Revision: 1210818
URL: http://svn.apache.org/viewvc?rev=1210818&view=rev
Log:
OPENEJB-1715 use of a service tracker to get the servicemanager in OSGi if the system property openejb.osgi.start-services is specified
Modified:
openejb/trunk/openejb/container/openejb-osgi/pom.xml
openejb/trunk/openejb/container/openejb-osgi/src/main/java/org/apache/openejb/core/osgi/impl/Activator.java
openejb/trunk/openejb/container/openejb-osgi/src/main/java/org/apache/openejb/core/osgi/impl/Deployer.java
openejb/trunk/openejb/server/openejb-server/src/main/java/org/apache/openejb/server/osgi/Activator.java
Modified: openejb/trunk/openejb/container/openejb-osgi/pom.xml
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-osgi/pom.xml?rev=1210818&r1=1210817&r2=1210818&view=diff
==============================================================================
--- openejb/trunk/openejb/container/openejb-osgi/pom.xml (original)
+++ openejb/trunk/openejb/container/openejb-osgi/pom.xml Tue Dec 6 08:14:01 2011
@@ -38,6 +38,10 @@
<artifactId>org.osgi.core</artifactId>
</dependency>
<dependency>
+ <groupId>org.osgi</groupId>
+ <artifactId>org.osgi.compendium</artifactId>
+ </dependency>
+ <dependency>
<groupId>org.apache.geronimo.components</groupId>
<artifactId>geronimo-transaction</artifactId>
</dependency>
Modified: openejb/trunk/openejb/container/openejb-osgi/src/main/java/org/apache/openejb/core/osgi/impl/Activator.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-osgi/src/main/java/org/apache/openejb/core/osgi/impl/Activator.java?rev=1210818&r1=1210817&r2=1210818&view=diff
==============================================================================
--- openejb/trunk/openejb/container/openejb-osgi/src/main/java/org/apache/openejb/core/osgi/impl/Activator.java (original)
+++ openejb/trunk/openejb/container/openejb-osgi/src/main/java/org/apache/openejb/core/osgi/impl/Activator.java Tue Dec 6 08:14:01 2011
@@ -22,7 +22,7 @@ import org.apache.openejb.loader.OpenEJB
import org.apache.openejb.loader.SystemInstance;
import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;
-import org.osgi.framework.ServiceReference;
+import org.osgi.util.tracker.ServiceTracker;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -35,8 +35,6 @@ import java.util.Properties;
*/
public class Activator implements BundleActivator {
private static final Logger LOGGER = LoggerFactory.getLogger(Activator.class);
- private static final String SERVICE_MANAGER_NAME = "org.apache.openejb.server.ServiceManager";
- private static final String OSGI_SERVICE_MANAGER_NAME = "org.apache.openejb.server.osgi.ServiceManagerExtender";
private OpenEJBInstance openejb;
@@ -66,59 +64,13 @@ public class Activator implements Bundle
throw e;
}
- // should be registered through openejb-server
- try {
- ServiceReference serviceManager = context.getServiceReference(SERVICE_MANAGER_NAME);
- if (serviceManager == null) { // register a new instance
- Object sm = context.getBundle().loadClass(OSGI_SERVICE_MANAGER_NAME)
- .getConstructor(BundleContext.class)
- .newInstance(context);
- context.registerService(SERVICE_MANAGER_NAME, sm, null);
- serviceManager = context.getServiceReference(SERVICE_MANAGER_NAME);
- }
-
- invoke(serviceManager, "init");
- invoke(serviceManager, "start");
- } catch (Exception e) {
- LOGGER.error("can't start OpenEJB services", e);
- }
-
LOGGER.info("Registering OSGified OpenEJB Deployer");
context.addBundleListener(new Deployer());
}
- private static void invoke(ServiceReference serviceManager, String name) throws OpenEJBException, InvocationTargetException, IllegalAccessException {
- if (serviceManager == null) {
- LOGGER.warn("can't invoke method {} since the service manager is null", name);
- }
-
- Class<?> current = serviceManager.getClass();
- Method mtd = null;
- while (mtd == null || !current.equals(Object.class)) {
- try {
- mtd = current.getDeclaredMethod(name);
- } catch (NoSuchMethodException e) {
- // ignored
- }
- }
-
- if (mtd == null) {
- throw new OpenEJBException("can't find method " + name + " on service " + serviceManager);
- }
- mtd.invoke(serviceManager);
- }
-
public void stop(BundleContext context) throws Exception {
LOGGER.info("Stopping OpenEJB; openejb.isInitialized(): " + openejb.isInitialized());
- // should be registered through openejb-server
- try {
- ServiceReference serviceManager = context.getServiceReference(SERVICE_MANAGER_NAME);
- invoke(serviceManager, "stop");
- } catch (Exception e) {
- LOGGER.error("can't stop OpenEJB services", e);
- }
-
openejb = null;
OpenEJB.destroy(); // todo: should it be static?
}
Modified: openejb/trunk/openejb/container/openejb-osgi/src/main/java/org/apache/openejb/core/osgi/impl/Deployer.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-osgi/src/main/java/org/apache/openejb/core/osgi/impl/Deployer.java?rev=1210818&r1=1210817&r2=1210818&view=diff
==============================================================================
--- openejb/trunk/openejb/container/openejb-osgi/src/main/java/org/apache/openejb/core/osgi/impl/Deployer.java (original)
+++ openejb/trunk/openejb/container/openejb-osgi/src/main/java/org/apache/openejb/core/osgi/impl/Deployer.java Tue Dec 6 08:14:01 2011
@@ -18,6 +18,7 @@ package org.apache.openejb.core.osgi.imp
import org.apache.openejb.AppContext;
import org.apache.openejb.BeanContext;
+import org.apache.openejb.OpenEJBException;
import org.apache.openejb.RpcContainer;
import org.apache.openejb.UndeployException;
import org.apache.openejb.assembler.classic.AppInfo;
@@ -31,12 +32,14 @@ import org.osgi.framework.BundleContext;
import org.osgi.framework.BundleEvent;
import org.osgi.framework.BundleListener;
import org.osgi.framework.ServiceRegistration;
+import org.osgi.util.tracker.ServiceTracker;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.File;
import java.io.IOException;
import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.net.URL;
@@ -53,8 +56,12 @@ import java.util.concurrent.ConcurrentHa
*/
public class Deployer implements BundleListener {
private static final Logger LOGGER = LoggerFactory.getLogger(Deployer.class);
+ private static final String SERVICE_MANAGER_NAME = "org.apache.openejb.server.ServiceManager";
+ public static final String OPENEJB_OSGI_START_SERVICES_PROP = "openejb.osgi.start-services";
+
private Map<Bundle, List<ServiceRegistration>> registrations = new ConcurrentHashMap<Bundle, List<ServiceRegistration>>();
private Map<Bundle, AppContext> appContexts = new ConcurrentHashMap<Bundle, AppContext>();
+ private ServiceTracker serviceManagerTracker;
public void bundleChanged(BundleEvent event) {
switch (event.getType()) {
@@ -111,6 +118,23 @@ public class Deployer implements BundleL
} catch (Exception ex1) {
LOGGER.error("can't deploy " + ejbJarUrl.toExternalForm(), ex1);
}
+
+ if (System.getProperty(OPENEJB_OSGI_START_SERVICES_PROP) != null) {
+ // should be registered through openejb-server
+ try {
+ serviceManagerTracker = new ServiceTracker(bundle.getBundleContext(), SERVICE_MANAGER_NAME, null);
+ serviceManagerTracker.open();
+ Object serviceManager = serviceManagerTracker.getService();
+ if (serviceManager == null) {
+ LOGGER.error("can't find service manager");
+ }
+
+ invoke(serviceManager, "init");
+ invoke(serviceManager, "start");
+ } catch (Exception sme) {
+ LOGGER.error("can't start OpenEJB services", sme);
+ }
+ }
}
} finally {
Thread.currentThread().setContextClassLoader(oldCl);
@@ -131,6 +155,17 @@ public class Deployer implements BundleL
} catch (UndeployException e) {
LOGGER.error("can't undeployer the bundle", e);
}
+
+ if (System.getProperty(OPENEJB_OSGI_START_SERVICES_PROP) != null) {
+ // should be registered through openejb-server
+ try {
+ Object serviceManager = serviceManagerTracker.getService();
+ invoke(serviceManager, "stop");
+ serviceManagerTracker.close();
+ } catch (Exception e) {
+ LOGGER.error("can't stop OpenEJB services", e);
+ }
+ }
}
LOGGER.info(String.format("[Deployer] Bundle %s has been stopped", bundle.getSymbolicName()));
}
@@ -242,4 +277,25 @@ public class Deployer implements BundleL
return "OSGIClassLoader for [" + backingBundle + "]";
}
}
+
+ private static void invoke(Object serviceManager, String name) throws OpenEJBException, InvocationTargetException, IllegalAccessException {
+ if (serviceManager == null) {
+ LOGGER.warn("can't invoke method {} since the service manager is null", name);
+ }
+
+ Class<?> current = serviceManager.getClass();
+ Method mtd = null;
+ while (mtd == null || !current.equals(Object.class)) {
+ try {
+ mtd = current.getDeclaredMethod(name);
+ } catch (NoSuchMethodException e) {
+ // ignored
+ }
+ }
+
+ if (mtd == null) {
+ throw new OpenEJBException("can't find method " + name + " on service " + serviceManager);
+ }
+ mtd.invoke(serviceManager);
+ }
}
Modified: openejb/trunk/openejb/server/openejb-server/src/main/java/org/apache/openejb/server/osgi/Activator.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/server/openejb-server/src/main/java/org/apache/openejb/server/osgi/Activator.java?rev=1210818&r1=1210817&r2=1210818&view=diff
==============================================================================
--- openejb/trunk/openejb/server/openejb-server/src/main/java/org/apache/openejb/server/osgi/Activator.java (original)
+++ openejb/trunk/openejb/server/openejb-server/src/main/java/org/apache/openejb/server/osgi/Activator.java Tue Dec 6 08:14:01 2011
@@ -30,10 +30,8 @@ public class Activator implements Bundle
private ServiceRegistration registration;
public void start(BundleContext bundleContext) throws Exception {
- if (bundleContext.getServiceReference(ServiceManager.class.getName()) == null) { // can be registered from openejb-server too
- manager = new ServiceManagerExtender(bundleContext);
- registration = bundleContext.registerService(ServiceManager.class.getName(), manager, null);
- }
+ manager = new ServiceManagerExtender(bundleContext);
+ registration = bundleContext.registerService(ServiceManager.class.getName(), manager, null);
}
public void stop(BundleContext bundleContext) throws Exception {