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 {