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("");