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/22 13:29:42 UTC

svn commit: r1222199 - in /openejb/trunk/openejb/container/openejb-osgi: ./ src/main/java/org/apache/openejb/core/osgi/impl/ src/main/resources/META-INF/services/

Author: rmannibucau
Date: Thu Dec 22 12:29:42 2011
New Revision: 1222199

URL: http://svn.apache.org/viewvc?rev=1222199&view=rev
Log:
fixing the way localbean are proxied for osgi world

Added:
    openejb/trunk/openejb/container/openejb-osgi/src/main/java/org/apache/openejb/core/osgi/impl/OpenEJBBundleContextHolder.java
    openejb/trunk/openejb/container/openejb-osgi/src/main/java/org/apache/openejb/core/osgi/impl/RegisterOSGIServicesExtension.java
    openejb/trunk/openejb/container/openejb-osgi/src/main/resources/META-INF/services/javax.enterprise.inject.spi.Extension
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

Modified: openejb/trunk/openejb/container/openejb-osgi/pom.xml
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-osgi/pom.xml?rev=1222199&r1=1222198&r2=1222199&view=diff
==============================================================================
--- openejb/trunk/openejb/container/openejb-osgi/pom.xml (original)
+++ openejb/trunk/openejb/container/openejb-osgi/pom.xml Thu Dec 22 12:29:42 2011
@@ -76,6 +76,12 @@
               javax.jms;resolution:=optional,
               javax.mail;resolution:=optional;version="[1.4,2)",
               javax.naming,
+              javax.enterprise.context,
+              javax.enterprise.context.spi,
+              javax.enterprise.event,
+              javax.enterprise.inject,
+              javax.enterprise.inject.spi,
+              javax.enterprise.util,
               javax.transaction;version="[1.1,1.2)",
               javax.transaction.xa;version="[1.1,1.2)",
               javax.xml.registry;resolution:=optional,
@@ -111,6 +117,7 @@
               org.apache.openejb.resource.quartz;resolution:=optional;version="[4.0,5.0)",
               org.apache.openejb.server;resolution:=optional;version="[4.0,5.0)",
               org.apache.openejb.util;version="[4.0,5.0)";resolution:=optional,
+              org.apache.openejb.util.proxy;version="[4.0,5.0)";resolution:=optional,
               org.apache.xerces;resolution:=optional,
               org.apache.xml.resolver;resolution:=optional,
               org.hsqldb.jdbc;resolution:=optional,

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=1222199&r1=1222198&r2=1222199&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 Thu Dec 22 12:29:42 2011
@@ -47,6 +47,7 @@ public class Activator implements Bundle
         Thread.currentThread().setContextClassLoader(getClass().getClassLoader());
 
         openejb = new OpenEJBInstance();
+        OpenEJBBundleContextHolder.set(context);
 
         Properties env = new Properties();
         // env.setProperty("openejb.embedded", "true");
@@ -68,8 +69,7 @@ public class Activator implements Bundle
         // should be registered through openejb-server
         checkServiceManager(context);
 
-        LOGGER.info("Registering OSGified OpenEJB Deployer");
-        context.addBundleListener(new Deployer(this, context));
+        context.addBundleListener(new Deployer(this));
     }
 
     public synchronized void checkServiceManager(BundleContext context) {

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=1222199&r1=1222198&r2=1222199&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 Thu Dec 22 12:29:42 2011
@@ -28,6 +28,7 @@ import org.apache.openejb.config.Configu
 import org.apache.openejb.config.DeploymentLoader;
 import org.apache.openejb.config.UnknownModuleTypeException;
 import org.apache.openejb.loader.SystemInstance;
+import org.apache.openejb.util.proxy.LocalBeanProxyFactory;
 import org.osgi.framework.Bundle;
 import org.osgi.framework.BundleContext;
 import org.osgi.framework.BundleEvent;
@@ -59,16 +60,14 @@ public class Deployer implements BundleL
     private final Map<Bundle, List<ServiceRegistration>> registrations = new ConcurrentHashMap<Bundle, List<ServiceRegistration>>();
     private final Map<Bundle, String> paths = new ConcurrentHashMap<Bundle, String>();
 
-    private final BundleContext openejbBundleContext;
     private final Activator openejbActivator;
 
-    public Deployer(Activator activator, BundleContext context) {
+    public Deployer(Activator activator) {
         openejbActivator = activator;
-        openejbBundleContext = context;
     }
 
     public void bundleChanged(BundleEvent event) {
-        openejbActivator.checkServiceManager(openejbBundleContext);
+        openejbActivator.checkServiceManager(OpenEJBBundleContextHolder.get());
         switch (event.getType()) {
             case BundleEvent.STARTED:
                 deploy(event.getBundle());
@@ -88,7 +87,7 @@ public class Deployer implements BundleL
 
     private void deploy(Bundle bundle) {
         final ClassLoader oldCl = Thread.currentThread().getContextClassLoader();
-        final ClassLoader osgiCl = new OSGIClassLoader(bundle, openejbBundleContext.getBundle());
+        final ClassLoader osgiCl = new OSGIClassLoader(bundle, OpenEJBBundleContextHolder.get().getBundle());
         Thread.currentThread().setContextClassLoader(osgiCl);
 
         try {
@@ -190,8 +189,12 @@ public class Deployer implements BundleL
      */
     private void registerService(Bundle bundle, AppContext appContext) {
         LOGGER.info("Registering remote EJBs as OSGi services");
-        BundleContext context = bundle.getBundleContext();
+        final BundleContext context = bundle.getBundleContext();
         for (BeanContext beanContext : appContext.getBeanContexts()) {
+            if (beanContext.getBeanClass().equals(BeanContext.Comp.class)) {
+                continue;
+            }
+
             try {
                 if (beanContext.getBusinessRemoteInterface() != null) {
                     LOGGER.info("registering remote bean: {}", beanContext.getEjbName());
@@ -215,7 +218,13 @@ public class Deployer implements BundleL
         if (!interfaces.isEmpty()) {
             Class<?>[] itfs = interfaces.toArray(new Class<?>[interfaces.size()]);
             try {
-                Object service = Proxy.newProxyInstance(itfs[0].getClassLoader(), itfs, new Handler(beanContext));
+                Object service;
+                if (!beanContext.isLocalbean()) {
+                    service = Proxy.newProxyInstance(itfs[0].getClassLoader(), itfs, new Handler(beanContext));
+                } else {
+                    service = LocalBeanProxyFactory.newProxyInstance(itfs[0].getClassLoader(), itfs[0], new Handler(beanContext));
+                }
+
                 registrations.get(context.getBundle()).add(context.registerService(str(itfs), service, new Properties()));
                 LOGGER.info("EJB registered: {} for interfaces {}", beanContext.getEjbName(), interfaces);
             } catch (IllegalArgumentException iae) {

Added: openejb/trunk/openejb/container/openejb-osgi/src/main/java/org/apache/openejb/core/osgi/impl/OpenEJBBundleContextHolder.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-osgi/src/main/java/org/apache/openejb/core/osgi/impl/OpenEJBBundleContextHolder.java?rev=1222199&view=auto
==============================================================================
--- openejb/trunk/openejb/container/openejb-osgi/src/main/java/org/apache/openejb/core/osgi/impl/OpenEJBBundleContextHolder.java (added)
+++ openejb/trunk/openejb/container/openejb-osgi/src/main/java/org/apache/openejb/core/osgi/impl/OpenEJBBundleContextHolder.java Thu Dec 22 12:29:42 2011
@@ -0,0 +1,15 @@
+package org.apache.openejb.core.osgi.impl;
+
+import org.osgi.framework.BundleContext;
+
+public class OpenEJBBundleContextHolder {
+    private static BundleContext openejbBundleContext;
+
+    public static BundleContext get() {
+        return openejbBundleContext;
+    }
+
+    public static void set(BundleContext openejbBundleContext) {
+        OpenEJBBundleContextHolder.openejbBundleContext = openejbBundleContext;
+    }
+}

Added: openejb/trunk/openejb/container/openejb-osgi/src/main/java/org/apache/openejb/core/osgi/impl/RegisterOSGIServicesExtension.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-osgi/src/main/java/org/apache/openejb/core/osgi/impl/RegisterOSGIServicesExtension.java?rev=1222199&view=auto
==============================================================================
--- openejb/trunk/openejb/container/openejb-osgi/src/main/java/org/apache/openejb/core/osgi/impl/RegisterOSGIServicesExtension.java (added)
+++ openejb/trunk/openejb/container/openejb-osgi/src/main/java/org/apache/openejb/core/osgi/impl/RegisterOSGIServicesExtension.java Thu Dec 22 12:29:42 2011
@@ -0,0 +1,130 @@
+package org.apache.openejb.core.osgi.impl;
+
+import org.osgi.framework.Bundle;
+import org.osgi.framework.Constants;
+import org.osgi.framework.ServiceReference;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import javax.enterprise.context.ApplicationScoped;
+import javax.enterprise.context.spi.CreationalContext;
+import javax.enterprise.event.Observes;
+import javax.enterprise.inject.Any;
+import javax.enterprise.inject.Default;
+import javax.enterprise.inject.spi.AfterBeanDiscovery;
+import javax.enterprise.inject.spi.AnnotatedType;
+import javax.enterprise.inject.spi.Bean;
+import javax.enterprise.inject.spi.BeanManager;
+import javax.enterprise.inject.spi.Extension;
+import javax.enterprise.inject.spi.InjectionPoint;
+import javax.enterprise.inject.spi.InjectionTarget;
+import javax.enterprise.util.AnnotationLiteral;
+import java.lang.annotation.Annotation;
+import java.lang.reflect.Type;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Set;
+
+public class RegisterOSGIServicesExtension implements Extension {
+    private static final Logger LOGGER = LoggerFactory.getLogger(RegisterOSGIServicesExtension.class);
+
+    public void afterBeanDiscovery(@Observes final AfterBeanDiscovery abd, final BeanManager bm) {
+        final Bundle[] bundles = OpenEJBBundleContextHolder.get().getBundles();
+        for (Bundle bundle : bundles) {
+            final ServiceReference[] services = bundle.getRegisteredServices();
+            if (services != null) {
+                for (ServiceReference service  : services) {
+                    final Class<?> clazz = serviceClass(service);
+                    final AnnotatedType<?> at = bm.createAnnotatedType(clazz);
+                    final InjectionTarget<?> it = bm.createInjectionTarget(at);
+                    abd.addBean(new OSGiServiceBean<Object>((InjectionTarget<Object>) it, service));
+                    LOGGER.debug("added service {} as a CDI Application scoped bean", clazz.getName());
+                }
+            }
+        }
+    }
+
+    private static Class<Object> serviceClass(ServiceReference service) {
+        return (Class<Object>) service.getBundle().getBundleContext().getService(service).getClass();
+    }
+
+    public static class OSGiServiceBean<T> implements Bean<T> {
+        private final ServiceReference service;
+        private final InjectionTarget<T> injectiontarget;
+
+        public OSGiServiceBean(final InjectionTarget<T> it, final ServiceReference srv) {
+            injectiontarget = it;
+            service = srv;
+        }
+
+        @Override
+        public T create(CreationalContext<T> ctx) {
+            final T instance = (T) service.getBundle().getBundleContext().getService(service);
+            injectiontarget.inject(instance, ctx);
+            injectiontarget.postConstruct(instance);
+            return instance;
+        }
+
+        @Override
+        public void destroy(T instance, CreationalContext<T> ctx) {
+            injectiontarget.preDestroy(instance);
+            ctx.release();
+        }
+
+        @Override
+        public Set<Type> getTypes() {
+            final Set<Type> types = new HashSet<Type>();
+            for (String clazz : (String[]) service.getProperty(Constants.OBJECTCLASS)) {
+                try {
+                    types.add(service.getBundle().loadClass(clazz));
+                } catch (ClassNotFoundException ignored) {
+                    // no-op
+                }
+            }
+            return types;
+        }
+
+        @Override
+        public Set<Annotation> getQualifiers() {
+            final Set<Annotation> qualifiers = new HashSet<Annotation>();
+            qualifiers.add( new AnnotationLiteral<Default>() {} );
+            qualifiers.add( new AnnotationLiteral<Any>() {} );
+            return qualifiers;
+        }
+
+        @Override
+        public Class<? extends Annotation> getScope() {
+            return ApplicationScoped.class;
+        }
+
+        @Override
+        public String getName() {
+            return "OSGiService_" + service.getProperty(Constants.SERVICE_ID);
+        }
+
+        @Override
+        public boolean isNullable() {
+            return false;
+        }
+
+        @Override
+        public Set<InjectionPoint> getInjectionPoints() {
+            return injectiontarget.getInjectionPoints();
+        }
+
+        @Override
+        public Class<?> getBeanClass() {
+            return service.getBundle().getBundleContext().getService(service).getClass();
+        }
+
+        @Override
+        public Set<Class<? extends Annotation>> getStereotypes() {
+            return Collections.emptySet();
+        }
+
+        @Override
+        public boolean isAlternative() {
+            return true;
+        }
+    }
+}

Added: openejb/trunk/openejb/container/openejb-osgi/src/main/resources/META-INF/services/javax.enterprise.inject.spi.Extension
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-osgi/src/main/resources/META-INF/services/javax.enterprise.inject.spi.Extension?rev=1222199&view=auto
==============================================================================
--- openejb/trunk/openejb/container/openejb-osgi/src/main/resources/META-INF/services/javax.enterprise.inject.spi.Extension (added)
+++ openejb/trunk/openejb/container/openejb-osgi/src/main/resources/META-INF/services/javax.enterprise.inject.spi.Extension Thu Dec 22 12:29:42 2011
@@ -0,0 +1 @@
+org.apache.openejb.core.osgi.impl.RegisterOSGIServicesExtension