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 {