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