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 2012/06/08 11:01:30 UTC

svn commit: r1347952 - in /openejb/trunk/openejb: container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ container/openejb-core/src/main/java/org/apache/openejb/config/ server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/c...

Author: rmannibucau
Date: Fri Jun  8 09:01:29 2012
New Revision: 1347952

URL: http://svn.apache.org/viewvc?rev=1347952&view=rev
Log:
global datsource shouldn't be bound for each application, managind @ManagedBean like pojo for rest (we keep injections and lifecycle and don't need to create/destroy it - the issue is mainly the destroy method which is not always here since not mandatory by the spec)

Modified:
    openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
    openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/JndiEncBuilder.java
    openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ResourceInfo.java
    openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/AutoConfig.java
    openejb/trunk/openejb/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/CxfRsHttpListener.java
    openejb/trunk/openejb/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/OpenEJBEJBInvoker.java
    openejb/trunk/openejb/server/openejb-rest/src/main/java/org/apache/openejb/server/rest/RESTService.java

Modified: openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java?rev=1347952&r1=1347951&r2=1347952&view=diff
==============================================================================
--- openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java (original)
+++ openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java Fri Jun  8 09:01:29 2012
@@ -549,7 +549,7 @@ public class Assembler extends Assembler
         injections.addAll(injectionBuilder.buildInjections(appInfo.globalJndiEnc));
         injections.addAll(injectionBuilder.buildInjections(appInfo.appJndiEnc));
 
-        final JndiEncBuilder globalBuilder = new JndiEncBuilder(appInfo.globalJndiEnc, injections, null, null, GLOBAL_UNIQUE_ID, classLoader);
+        final JndiEncBuilder globalBuilder = new JndiEncBuilder(appInfo.globalJndiEnc, injections, appInfo.appId, null, GLOBAL_UNIQUE_ID, classLoader);
         final Map<String, Object> globalBindings = globalBuilder.buildBindings(JndiEncBuilder.JndiScope.global);
         final Context globalJndiContext = globalBuilder.build(globalBindings);
 

Modified: openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/JndiEncBuilder.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/JndiEncBuilder.java?rev=1347952&r1=1347951&r2=1347952&view=diff
==============================================================================
--- openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/JndiEncBuilder.java (original)
+++ openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/JndiEncBuilder.java Fri Jun  8 09:01:29 2012
@@ -154,7 +154,7 @@ public class JndiEncBuilder {
     }
 
     public Map<String, Object> buildBindings(JndiScope type) throws OpenEJBException {
-        Map<String, Object> bindings = buildMap();
+        Map<String, Object> bindings = buildMap(type);
         switch (type) {
             case comp:
                 addSpecialCompBindings(bindings);
@@ -172,7 +172,7 @@ public class JndiEncBuilder {
         return bindings;
     }
 
-    public Map<String, Object> buildMap() throws OpenEJBException {
+    public Map<String, Object> buildMap(final JndiScope scope) throws OpenEJBException {
         Map<String, Object> bindings = new TreeMap<String, Object>(); // let it be sorted for real binding
 
         // get JtaEntityManagerRegistry
@@ -472,7 +472,7 @@ public class JndiEncBuilder {
 
             for (ResourceInfo resource : config.facilities.resources) {
                 String jndiName = resource.jndiName;
-                if (jndiName != null && !jndiName.isEmpty()) {
+                if (jndiName != null && !jndiName.isEmpty() && isNotGobalOrIsHoldByThisApp(resource, scope)) {
                     String refName = "openejb/Resource/" + resource.id;
                     Object reference = new IntraVmJndiReference(refName);
                     String boundName = normalize(jndiName);
@@ -484,6 +484,13 @@ public class JndiEncBuilder {
         return bindings;
     }
 
+    // we don't want to bind globally a global resource multiple times in the Assembler
+    // if the datasource if defined globally in the currently deployed app originAppname hould not be null
+    private boolean isNotGobalOrIsHoldByThisApp(final ResourceInfo info, final JndiScope scope) {
+        return !info.jndiName.startsWith("global/")
+                || (info.originAppName != null && info.originAppName.equals(moduleId) && JndiScope.global.equals(scope));
+    }
+
     private void addSpecialCompBindings(Map<String, Object> bindings) {
         // bind TransactionManager
         TransactionManager transactionManager = SystemInstance.get().getComponent(TransactionManager.class);

Modified: openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ResourceInfo.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ResourceInfo.java?rev=1347952&r1=1347951&r2=1347952&view=diff
==============================================================================
--- openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ResourceInfo.java (original)
+++ openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ResourceInfo.java Fri Jun  8 09:01:29 2012
@@ -18,4 +18,5 @@ package org.apache.openejb.assembler.cla
 
 public class ResourceInfo extends ServiceInfo {
     public String jndiName = "";
+    public String originAppName = null; // if define by an app
 }

Modified: openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/AutoConfig.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/AutoConfig.java?rev=1347952&r1=1347951&r2=1347952&view=diff
==============================================================================
--- openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/AutoConfig.java (original)
+++ openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/AutoConfig.java Fri Jun  8 09:01:29 2012
@@ -874,6 +874,7 @@ public class AutoConfig implements Dynam
             }
 
             ResourceInfo resourceInfo = configFactory.configureService(resource, ResourceInfo.class);
+            resourceInfo.originAppName = module.getModuleId();
             final ResourceRef resourceRef = new ResourceRef();
             resourceRef.setResType(resource.getType());
 
@@ -1341,6 +1342,9 @@ public class AutoConfig implements Dynam
 
                     ResourceInfo jtaResourceInfo = configFactory.configureService(jtaResource, ResourceInfo.class);
                     ResourceInfo nonJtaResourceInfo = configFactory.configureService(nonJtaResource, ResourceInfo.class);
+                    if (jtaDataSourceId != null && nonJtaDataSourceId == null) {
+                        nonJtaResourceInfo.originAppName = jtaResourceInfo.originAppName;
+                    }
 
                     logAutoCreateResource(jtaResourceInfo, "DataSource", unit.getName());
                     jtaDataSourceId = installResource(unit.getName(), jtaResourceInfo);
@@ -1457,6 +1461,7 @@ public class AutoConfig implements Dynam
                     if (nonJtaDataSourceId == null) {
                         ResourceInfo nonJtaResourceInfo = copy(jtaResourceInfo);
                         nonJtaResourceInfo.id = jtaResourceInfo.id + "NonJta";
+                        nonJtaResourceInfo.originAppName = jtaResourceInfo.originAppName;
 
                         Properties overrides = ConfigurationFactory.getSystemProperties(nonJtaResourceInfo.id, nonJtaResourceInfo.service);
                         nonJtaResourceInfo.properties.putAll(overrides);
@@ -1602,6 +1607,7 @@ public class AutoConfig implements Dynam
         b.description = a.description;
         b.factoryMethod = a.factoryMethod;
         b.constructorArgs.addAll(a.constructorArgs);
+        b.originAppName = a.originAppName;
         b.types.addAll(a.types);
         b.properties = new SuperProperties();
         b.properties.putAll(a.properties);

Modified: openejb/trunk/openejb/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/CxfRsHttpListener.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/CxfRsHttpListener.java?rev=1347952&r1=1347951&r2=1347952&view=diff
==============================================================================
--- openejb/trunk/openejb/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/CxfRsHttpListener.java (original)
+++ openejb/trunk/openejb/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/CxfRsHttpListener.java Fri Jun  8 09:01:29 2012
@@ -37,6 +37,7 @@ import org.apache.cxf.service.invoker.In
 import org.apache.cxf.transport.http.AbstractHTTPDestination;
 import org.apache.cxf.transport.http.HTTPTransportFactory;
 import org.apache.openejb.BeanContext;
+import org.apache.openejb.BeanType;
 import org.apache.openejb.Injection;
 import org.apache.openejb.loader.Options;
 import org.apache.openejb.loader.SystemInstance;

Modified: openejb/trunk/openejb/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/OpenEJBEJBInvoker.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/OpenEJBEJBInvoker.java?rev=1347952&r1=1347951&r2=1347952&view=diff
==============================================================================
--- openejb/trunk/openejb/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/OpenEJBEJBInvoker.java (original)
+++ openejb/trunk/openejb/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/OpenEJBEJBInvoker.java Fri Jun  8 09:01:29 2012
@@ -16,35 +16,28 @@
  */
 package org.apache.openejb.server.cxf.rs;
 
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
 import java.rmi.RemoteException;
-import javax.ejb.EJBLocalHome;
-import javax.xml.ws.WebFault;
+import java.util.List;
+import javax.ws.rs.core.HttpHeaders;
+import javax.ws.rs.core.Request;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.SecurityContext;
+import javax.ws.rs.core.UriInfo;
+import javax.ws.rs.ext.ContextResolver;
 import org.apache.cxf.helpers.CastUtils;
 import org.apache.cxf.jaxrs.JAXRSInvoker;
 import org.apache.cxf.jaxrs.model.ClassResourceInfo;
 import org.apache.cxf.jaxrs.model.OperationResourceInfo;
 import org.apache.cxf.jaxrs.utils.JAXRSUtils;
 import org.apache.cxf.message.Exchange;
-import org.apache.cxf.message.FaultMode;
 import org.apache.cxf.message.MessageContentsList;
 import org.apache.openejb.BeanContext;
-import org.apache.openejb.InterfaceType;
 import org.apache.openejb.OpenEJBException;
-import org.apache.openejb.ProxyInfo;
 import org.apache.openejb.RpcContainer;
-import org.apache.openejb.core.managed.ManagedContainer;
 import org.apache.openejb.rest.ThreadLocalContextManager;
 
-import javax.ws.rs.core.HttpHeaders;
-import javax.ws.rs.core.Request;
-import javax.ws.rs.core.Response;
-import javax.ws.rs.core.SecurityContext;
-import javax.ws.rs.core.UriInfo;
-import javax.ws.rs.ext.ContextResolver;
-import java.lang.reflect.Field;
-import java.lang.reflect.Method;
-import java.util.List;
-
 public class OpenEJBEJBInvoker extends JAXRSInvoker {
     private BeanContext context;
 
@@ -94,33 +87,10 @@ public class OpenEJBEJBInvoker extends J
         }
 
         // invoking the EJB
-        final boolean  createAndDestroy = container instanceof ManagedContainer;
-        Object primKey = null;
         try {
-            if (createAndDestroy) {
-                Method create = null;
-                try {
-                    create = BeanContext.BusinessLocalBeanHome.class.getMethod("create");
-                } catch (NoSuchMethodException e) {
-                    // shouldn't occur
-                }
-
-                primKey = ((ProxyInfo) container.invoke(context.getDeploymentID(),
-                        InterfaceType.BUSINESS_LOCALBEAN_HOME,
-                        create.getDeclaringClass(), create, null, null)).getPrimaryKey();
-            }
-
             Object result = container.invoke(context.getDeploymentID(),
                 context.getInterfaceType(method.getDeclaringClass()),
-                method.getDeclaringClass(), method, parameters, primKey);
-
-            if (createAndDestroy && !context.getRemoveMethods().isEmpty()) {
-                // should we cache such information?
-                final Method remove = context.getRemoveMethods().iterator().next();
-                container.invoke(context.getDeploymentID(),
-                        context.getInterfaceType(remove.getDeclaringClass()),
-                        remove.getDeclaringClass(), remove, null, primKey);
-            }
+                method.getDeclaringClass(), method, parameters, null);
 
             return new MessageContentsList(result);
         } catch (OpenEJBException e) {

Modified: openejb/trunk/openejb/server/openejb-rest/src/main/java/org/apache/openejb/server/rest/RESTService.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/server/openejb-rest/src/main/java/org/apache/openejb/server/rest/RESTService.java?rev=1347952&r1=1347951&r2=1347952&view=diff
==============================================================================
--- openejb/trunk/openejb/server/openejb-rest/src/main/java/org/apache/openejb/server/rest/RESTService.java (original)
+++ openejb/trunk/openejb/server/openejb-rest/src/main/java/org/apache/openejb/server/rest/RESTService.java Fri Jun  8 09:01:29 2012
@@ -38,6 +38,7 @@ import javax.ws.rs.Path;
 import javax.ws.rs.core.Application;
 import javax.ws.rs.core.UriBuilder;
 import org.apache.openejb.BeanContext;
+import org.apache.openejb.BeanType;
 import org.apache.openejb.Injection;
 import org.apache.openejb.assembler.classic.AppInfo;
 import org.apache.openejb.assembler.classic.Assembler;
@@ -153,8 +154,8 @@ public abstract class RESTService implem
                     continue;
                 }
 
-                if (restEjbs.containsKey(o.getClass().getName())) {
-                    // no more a singleton if the ejb i not a singleton...but it is a weird case
+                if (hasEjbAndIsNotAManagedBean(restEjbs, o.getClass())) {
+                    // no more a singleton if the ejb is not a singleton...but it is a weird case
                     deployEJB(appPrefix, restEjbs.get(o.getClass().getName()).context, additionalProviders);
                 } else {
                     deploySingleton(appPrefix, o, appInstance, classLoader, additionalProviders);
@@ -162,7 +163,7 @@ public abstract class RESTService implem
             }
             Set<Class<?>> classes = appInstance.getClasses();
             for (Class<?> clazz : classes) {
-                if (restEjbs.containsKey(clazz.getName())) {
+                if (hasEjbAndIsNotAManagedBean(restEjbs, clazz)) {
                     deployEJB(appPrefix, restEjbs.get(clazz.getName()).context, additionalProviders);
                 } else {
                     deployPojo(appPrefix, clazz, appInstance, classLoader, injections, context, owbCtx, additionalProviders);
@@ -179,7 +180,12 @@ public abstract class RESTService implem
 
             for (String clazz : restClasses) {
                 if (restEjbs.containsKey(clazz)) {
-                    deployEJB(appPrefix, restEjbs.get(clazz).context, additionalProviders);
+                    final BeanContext ctx = restEjbs.get(clazz).context;
+                    if (BeanType.MANAGED.equals(ctx.getComponentType())) {
+                        deployPojo(appPrefix, ctx.getBeanClass(), null, ctx.getClassLoader(), ctx.getInjections(), context, owbCtx, additionalProviders);
+                    } else {
+                        deployEJB(appPrefix, restEjbs.get(clazz).context, additionalProviders);
+                    }
                 } else {
                     try {
                         Class<?> loadedClazz = classLoader.loadClass(clazz);
@@ -194,6 +200,10 @@ public abstract class RESTService implem
         restEjbs.clear();
     }
 
+    private boolean hasEjbAndIsNotAManagedBean(final Map<String, EJBRestServiceInfo> restEjbs, final Class<?> clazz) {
+        return restEjbs.containsKey(clazz.getName()) && !BeanType.MANAGED.equals(restEjbs.get(clazz.getName()).context.getComponentType());
+    }
+
     private boolean useDiscoveredProviders() {
         return SystemInstance.get().getOptions().get(OPENEJB_JAXRS_PROVIDERS_AUTO_PROP, false);
     }
@@ -222,7 +232,15 @@ public abstract class RESTService implem
                 }
 
                 for (Map.Entry<String, EJBRestServiceInfo> ejb : restEjbs.entrySet()) {
-                    deployEJB(ejb.getValue().path, ejb.getValue().context, providers);
+                    final BeanContext ctx = ejb.getValue().context;
+                    if (BeanType.MANAGED.equals(ctx.getComponentType())) {
+                        deployPojo(ejb.getValue().path, ctx.getBeanClass(), null, ctx.getClassLoader(), ctx.getInjections(),
+                                ctx.getJndiContext(),
+                                containerSystem.getAppContext(appInfo.appId).getWebBeansContext(),
+                                providers);
+                    } else {
+                        deployEJB(ejb.getValue().path, ctx, providers);
+                    }
                 }
                 restEjbs.clear();
             } else {