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 2013/02/17 21:30:43 UTC
svn commit: r1447070 - in /tomee/tomee/trunk:
container/openejb-core/src/main/java/org/apache/openejb/config/AutoConfig.java
tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/OpenEJBNamingResource.java
Author: rmannibucau
Date: Sun Feb 17 20:30:43 2013
New Revision: 1447070
URL: http://svn.apache.org/r1447070
Log:
TOMEE-774 trying to make app resources a bit more app scoped
Modified:
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/config/AutoConfig.java
tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/OpenEJBNamingResource.java
Modified: tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/config/AutoConfig.java
URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/config/AutoConfig.java?rev=1447070&r1=1447069&r2=1447070&view=diff
==============================================================================
--- tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/config/AutoConfig.java (original)
+++ tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/config/AutoConfig.java Sun Feb 17 20:30:43 2013
@@ -83,6 +83,7 @@ import java.net.URI;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
+import java.util.Comparator;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
@@ -882,7 +883,8 @@ public class AutoConfig implements Dynam
final List<ResourceInfo> resourceInfos = new ArrayList<ResourceInfo>();
final Map<ResourceInfo, Resource> resourcesMap = new HashMap<ResourceInfo, Resource>(resources.size());
for (Resource resource : resources) {
- resource.setId(value(resource.getId()));
+ final String originalId = value(resource.getId());
+ resource.setId(module.getModuleId() + "/" + replaceJavaAndSlash(originalId));
resource.setJndi(value(resource.getJndi()));
resource.getProperties().putAll(holds(resource.getProperties()));
@@ -921,13 +923,12 @@ public class AutoConfig implements Dynam
resourceRef.setMappedName(resourceInfo.id);
+ final ResourceRef strictRef = new ResourceRef(OPENEJB_RESOURCE_JNDI_PREFIX + originalId, resourceRef.getResType(), resourceRef.getResAuth(), resourceRef.getResSharingScope());
+ strictRef.setMappedName(resourceInfo.id);
+
for (JndiConsumer consumer : jndiConsumers) {
- final ResourceRef existing = consumer.getResourceRefMap().get(resourceRef.getKey());
- if (existing != null) {
- existing.setMappedName(resourceRef.getMappedName());
- } else {
- consumer.getResourceRef().add(resourceRef);
- }
+ addResource(consumer, resourceRef); // for injections etc...
+ addResource(consumer, strictRef); // for lookups (without prefix)
}
resourceInfos.add(resourceInfo);
@@ -944,6 +945,15 @@ public class AutoConfig implements Dynam
// resources.clear(); // don't clear it since we want to keep this to be able to undeploy resources with the app
}
+ private static void addResource(final JndiConsumer consumer, final ResourceRef resourceRef) {
+ final ResourceRef existing = consumer.getResourceRefMap().get(resourceRef.getKey());
+ if (existing != null) {
+ existing.setMappedName(resourceRef.getMappedName());
+ } else {
+ consumer.getResourceRef().add(resourceRef);
+ }
+ }
+
private static String chooseType(final ClassLoader classLoader, final List<String> types, final String defaultType) {
if (types != null) {
for (String type : types) {
@@ -1258,11 +1268,19 @@ public class AutoConfig implements Dynam
}
}
+ final String prefix = app.getModuleId() + "/";
+
required.put("JtaManaged", "true");
- String jtaDataSourceId = findResourceId(replaceJavaAndSlash(unit.getJtaDataSource()), "DataSource", required, null);
+ String jtaDataSourceId = findResourceId(prefix + replaceJavaAndSlash(unit.getJtaDataSource()), "DataSource", required, null);
+ if (jtaDataSourceId == null) {
+ jtaDataSourceId = findResourceId(replaceJavaAndSlash(unit.getJtaDataSource()), "DataSource", required, null);
+ }
required.put("JtaManaged", "false");
- String nonJtaDataSourceId = findResourceId(replaceJavaAndSlash(unit.getNonJtaDataSource()), "DataSource", required, null);
+ String nonJtaDataSourceId = findResourceId(prefix + replaceJavaAndSlash(unit.getNonJtaDataSource()), "DataSource", required, null);
+ if (nonJtaDataSourceId == null) {
+ nonJtaDataSourceId = findResourceId(replaceJavaAndSlash(unit.getNonJtaDataSource()), "DataSource", required, null);
+ }
if (jtaDataSourceId != null && nonJtaDataSourceId != null){
// Both DataSources were explicitly configured.
@@ -1271,18 +1289,6 @@ public class AutoConfig implements Dynam
continue;
}
- // another try prefixing datasource name with app moduleid, case of datasourcedefinition for instance
- final String prefix = app.getModuleId() + "/";
- if (jtaDataSourceId == null) {
- required.put("JtaManaged", "true");
- jtaDataSourceId = findResourceId(prefix + replaceJavaAndSlash(unit.getJtaDataSource()), "DataSource", required, null);
- }
-
- if (nonJtaDataSourceId == null) {
- required.put("JtaManaged", "false");
- nonJtaDataSourceId = findResourceId(prefix + replaceJavaAndSlash(unit.getNonJtaDataSource()), "DataSource", required, null);
- }
-
if (jtaDataSourceId != null && nonJtaDataSourceId != null){
// Both DataSources were explicitly configured.
setJtaDataSource(unit, jtaDataSourceId);
@@ -1454,12 +1460,12 @@ public class AutoConfig implements Dynam
required.clear();
required.put("JtaManaged", "true");
- jtaDataSourceId = firstMatching("DataSource", required, null);
+ jtaDataSourceId = firstMatching(prefix, "DataSource", required, null);
if (jtaDataSourceId == null){
required.clear();
required.put("JtaManaged", "false");
- nonJtaDataSourceId = firstMatching("DataSource", required, null);
+ nonJtaDataSourceId = firstMatching(prefix, "DataSource", required, null);
}
}
@@ -1494,7 +1500,7 @@ public class AutoConfig implements Dynam
if (jtaProperties.containsKey(key)) required.put(key, jtaProperties.get(key));
}
- nonJtaDataSourceId = firstMatching("DataSource", required, null);
+ nonJtaDataSourceId = firstMatching(prefix, "DataSource", required, null);
// Strategy 2: Copy
@@ -1551,7 +1557,7 @@ public class AutoConfig implements Dynam
if (nonJtaProperties.containsKey(key)) required.put(key, nonJtaProperties.get(key));
}
- jtaDataSourceId = firstMatching("DataSource", required, null);
+ jtaDataSourceId = firstMatching(prefix, "DataSource", required, null);
// Strategy 2: Copy
@@ -1757,7 +1763,10 @@ public class AutoConfig implements Dynam
// check for existing resource with specified resourceId and type and properties
- String id = findResourceId(resourceId, type, required, appResources);
+ String id = findResourceId(beanName + '/' + resourceId, type, required, appResources); // check first in app namespace
+ if (id != null) return id;
+
+ id = findResourceId(resourceId, type, required, appResources);
if (id != null) return id;
// expand search to any type -- may be asking for a reference to a sub-type
@@ -1783,7 +1792,7 @@ public class AutoConfig implements Dynam
}
// if there are any resources of the desired type, use the first one
- id = firstMatching(type, required, appResources);
+ id = firstMatching(beanName, type, required, appResources);
if (id != null) return id;
// Auto create a resource using the first provider that can supply a resource of the desired type
@@ -1806,8 +1815,21 @@ public class AutoConfig implements Dynam
logger.info("Auto-creating a Resource with id '" + resourceInfo.id + "' of type '" + type + " for '" + beanName + "'.");
}
- private String firstMatching(String type, Properties required, AppResources appResources) {
+ private String firstMatching(final String prefix, String type, Properties required, AppResources appResources) {
List<String> resourceIds = getResourceIds(appResources, type, required);
+ Collections.sort(resourceIds, new Comparator<String>() { // sort from webapp to global resources
+ @Override
+ public int compare(String o1, String o2) {
+ if (o1.startsWith(prefix) && o2.startsWith(prefix)) {
+ return o1.compareTo(o2);
+ } else if (o1.startsWith(prefix)) {
+ return 1;
+ } else if (o2.startsWith(prefix)) {
+ return -1;
+ }
+ return o1.compareTo(o2);
+ }
+ });
String idd = null;
if (resourceIds.size() > 0) {
idd = resourceIds.get(0);
Modified: tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/OpenEJBNamingResource.java
URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/OpenEJBNamingResource.java?rev=1447070&r1=1447069&r2=1447070&view=diff
==============================================================================
--- tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/OpenEJBNamingResource.java (original)
+++ tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/OpenEJBNamingResource.java Sun Feb 17 20:30:43 2013
@@ -135,7 +135,12 @@ public class OpenEJBNamingResource exten
if (name.startsWith(JAVA_PREFIX)) { // tomcat adds mbeans and a ":" in a mbean is not very cool for the objectname
ref.setName(name.substring(JAVA_PREFIX.length()));
} else if (name.startsWith("openejb/Resource/")) {
- ref.setProperty(NamingUtil.JNDI_NAME, "openejb:" + name.substring("openejb/".length()));
+ final String id = (String) ref.getProperty(NamingUtil.RESOURCE_ID);
+ if (id != null) { // id can be != substring (else) in case of app resource scope
+ ref.setProperty(NamingUtil.JNDI_NAME, "openejb:Resource/" + id);
+ } else {
+ ref.setProperty(NamingUtil.JNDI_NAME, "openejb:" + name.substring("openejb/".length()));
+ }
}
if (ref.getType() == null) {
ref.setType("");