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/01 23:41:49 UTC
svn commit: r1209285 -
/openejb/trunk/openejb/container/openejb-osgi/src/main/java/org/apache/openejb/core/osgi/impl/Deployer.java
Author: rmannibucau
Date: Thu Dec 1 22:41:48 2011
New Revision: 1209285
URL: http://svn.apache.org/viewvc?rev=1209285&view=rev
Log:
trying to register EJB as OSGi services
Modified:
openejb/trunk/openejb/container/openejb-osgi/src/main/java/org/apache/openejb/core/osgi/impl/Deployer.java
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=1209285&r1=1209284&r2=1209285&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 1 22:41:48 2011
@@ -16,10 +16,11 @@
*/
package org.apache.openejb.core.osgi.impl;
+import org.apache.openejb.AppContext;
+import org.apache.openejb.BeanContext;
+import org.apache.openejb.RpcContainer;
import org.apache.openejb.assembler.classic.AppInfo;
import org.apache.openejb.assembler.classic.Assembler;
-import org.apache.openejb.assembler.classic.EjbJarInfo;
-import org.apache.openejb.assembler.classic.EnterpriseBeanInfo;
import org.apache.openejb.config.AppModule;
import org.apache.openejb.config.ConfigurationFactory;
import org.apache.openejb.config.DeploymentLoader;
@@ -33,8 +34,13 @@ import org.slf4j.LoggerFactory;
import java.io.File;
import java.io.IOException;
+import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.Method;
+import java.lang.reflect.Proxy;
import java.net.URL;
+import java.util.Arrays;
import java.util.Enumeration;
+import java.util.List;
import java.util.Properties;
/**
@@ -84,11 +90,11 @@ public class Deployer implements BundleL
Assembler assembler = SystemInstance.get().getComponent(Assembler.class);
LOGGER.debug("Assembler : " + assembler);
LOGGER.debug("AppInfo id: " + appInfo.appId);
- assembler.createApplication(appInfo);
+ AppContext appContext = assembler.createApplication(appInfo);
LOGGER.info("[Deployer] Application deployed: " + appInfo.path);
- registerService(bundle, appInfo);
+ registerService(bundle, appContext);
} catch (Exception ex) {
LOGGER.error("can't deploy " + ejbJarUrl.toExternalForm(), ex);
@@ -117,27 +123,66 @@ public class Deployer implements BundleL
* Register OSGi Service for EJB so calling the service will actually call the EJB
*
* @param bundle
- * @param appInfo
+ * @param appContext
*/
- private void registerService(Bundle bundle, AppInfo appInfo) {
+ private void registerService(Bundle bundle, AppContext appContext) {
LOGGER.info("[Deployer] Registering a service for the EJB");
BundleContext context = bundle.getBundleContext();
- for (EjbJarInfo ejbJarInfo : appInfo.ejbJars) {
- for (EnterpriseBeanInfo ejbInfo : ejbJarInfo.enterpriseBeans) {
- try {
- context.registerService(ejbInfo.businessRemote.toArray(new String[ejbInfo.businessRemote.size()]), bundle.loadClass(
- ejbInfo.ejbClass).newInstance(), new Properties());
- LOGGER.info(String.format(
- "[Deployer] Service object %s registered under the class names: %s", ejbInfo.ejbClass,
- ejbInfo.businessRemote));
- } catch (Exception e) {
- e.printStackTrace();
+ for (BeanContext beanContext : appContext.getBeanContexts()) {
+ try {
+ if (beanContext.getBusinessLocalInterface() != null) {
+ registerService(beanContext, context, beanContext.getBusinessLocalInterfaces());
+ }
+ if (beanContext.getBusinessRemoteInterface() != null) {
+ registerService(beanContext, context, beanContext.getBusinessRemoteInterfaces());
}
+ if (beanContext.isLocalbean()) {
+ registerService(beanContext, context, Arrays.asList(beanContext.getBusinessLocalBeanInterface()));
+ }
+ } catch (Exception e) {
+ LOGGER.error(String.format("[Deployer] can't register: %s", beanContext.getEjbName()));
+ }
+ }
+ }
+
+ private void registerService(BeanContext beanContext, BundleContext context, List<Class> interfaces) {
+ if (!interfaces.isEmpty()) {
+ Class<?>[] itfs = interfaces.toArray(new Class<?>[interfaces.size()]);
+ try {
+ Object service = Proxy.newProxyInstance(itfs[0].getClassLoader(), itfs, new Handler(beanContext));
+ context.registerService(str(itfs), service, new Properties());
+ LOGGER.info(String.format("[Deployer] EJB registered: %s for interfaces %s", beanContext.getEjbName(), interfaces));
+ } catch (IllegalArgumentException iae) {
+ LOGGER.error(String.format("[Deployer] can't register: %s for interfaces %s", beanContext.getEjbName(), interfaces));
}
}
}
- private class OSGIClassLoader extends ClassLoader {
+ private String[] str(Class<?>[] itfs) {
+ String[] itfsStr = new String[itfs.length];
+ for (int i = 0; i < itfs.length; i++) {
+ itfsStr[i] = itfs[i].getName();
+ }
+ return itfsStr;
+ }
+
+ private static class Handler implements InvocationHandler {
+ private BeanContext beanContext;
+
+ public Handler(BeanContext bc) {
+ beanContext = bc;
+ }
+
+ @Override
+ public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
+ final RpcContainer container = RpcContainer.class.cast(beanContext.getContainer());
+ return container.invoke(beanContext.getDeploymentID(),
+ beanContext.getInterfaceType(method.getDeclaringClass()),
+ method.getDeclaringClass(), method, args, null);
+ }
+ }
+
+ private static class OSGIClassLoader extends ClassLoader {
private final Bundle backingBundle;
public OSGIClassLoader(Bundle bundle) {