Author: rmannibucau
Date: Tue Nov 20 19:51:38 2012
New Revision: 1411822

URL: http://svn.apache.org/viewvc?rev=1411822&view=rev
Log:
TOMEE-597 merging (what is possible) of java:comp/env/app and java:app - 
probably user usage from JBoss

Modified:
    
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/ConfigurationFactory.java
    
openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/OpenEJBContextConfig.java
    
openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatJavaJndiBinder.java
    
openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatJndiBuilder.java

Modified: 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/ConfigurationFactory.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/ConfigurationFactory.java?rev=1411822&r1=1411821&r2=1411822&view=diff
==============================================================================
--- 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/ConfigurationFactory.java
 (original)
+++ 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/ConfigurationFactory.java
 Tue Nov 20 19:51:38 2012
@@ -1308,7 +1308,7 @@ public class ConfigurationFactory implem
         return null;
     }
 
-    private boolean isResourceType(final String service, final List<String> 
types, final String type) {
+    public static boolean isResourceType(final String service, final 
List<String> types, final String type) {
         return type == null || service != null && types.contains(type);
     }
 

Modified: 
openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/OpenEJBContextConfig.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/OpenEJBContextConfig.java?rev=1411822&r1=1411821&r2=1411822&view=diff
==============================================================================
--- 
openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/OpenEJBContextConfig.java
 (original)
+++ 
openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/OpenEJBContextConfig.java
 Tue Nov 20 19:51:38 2012
@@ -18,11 +18,17 @@ package org.apache.tomee.catalina;
 
 import org.apache.catalina.Context;
 import org.apache.catalina.core.StandardContext;
+import org.apache.catalina.deploy.ContextResource;
+import org.apache.catalina.deploy.NamingResources;
 import org.apache.catalina.deploy.WebXml;
 import org.apache.catalina.startup.ContextConfig;
 import org.apache.openejb.assembler.classic.ClassListInfo;
+import org.apache.openejb.assembler.classic.OpenEjbConfiguration;
+import org.apache.openejb.assembler.classic.ResourceInfo;
 import org.apache.openejb.assembler.classic.WebAppBuilder;
 import org.apache.openejb.assembler.classic.WebAppInfo;
+import org.apache.openejb.config.ConfigurationFactory;
+import org.apache.openejb.config.ServiceUtils;
 import org.apache.openejb.loader.IO;
 import org.apache.openejb.loader.SystemInstance;
 import org.apache.openejb.util.LogCategory;
@@ -35,9 +41,12 @@ import java.io.IOException;
 import java.io.InputStream;
 import java.net.MalformedURLException;
 import java.net.URL;
+import java.util.ArrayList;
 import java.util.Collection;
 import java.util.HashSet;
+import java.util.List;
 import java.util.Map;
+import java.util.Properties;
 import java.util.Set;
 
 public class OpenEJBContextConfig extends ContextConfig {
@@ -46,6 +55,7 @@ public class OpenEJBContextConfig extend
 
     private static final String MYFACES_TOMEEM_CONTAINER_INITIALIZER = 
"org.apache.tomee.myfaces.TomEEMyFacesContainerInitializer";
     private static final String TOMEE_MYFACES_CONTEXT_LISTENER = 
"org.apache.tomee.myfaces.TomEEMyFacesContextListener";
+    private static final String ADJUST_DATASOURCE_JNDI_NAMES = 
SystemInstance.get().getProperty("tomee.resources.adjust-web-xml-jndi-name", 
"true");
 
     private TomcatWebAppBuilder.StandardContextInfo info;
     private boolean configureStartOk = false;
@@ -65,9 +75,68 @@ public class OpenEJBContextConfig extend
             return;
         }
         super.configureStart();
+
+        adjustDataSourceNameIfNecessary(); // doing it here to potentially 
factorize resource id resolution
+
         configureStartOk = true;
     }
 
+    private void adjustDataSourceNameIfNecessary() {
+        if (context == null || 
"false".equalsIgnoreCase(ADJUST_DATASOURCE_JNDI_NAMES)) {
+            return;
+        }
+
+        final NamingResources resources = context.getNamingResources();
+        if (resources == null) {
+            return;
+        }
+
+        final ContextResource[] foundResources = resources.findResources();
+        String[] ids = null;
+        if (foundResources != null) {
+            for (ContextResource resource : foundResources) {
+                if ("javax.sql.DataSource".equals(resource.getType())) {
+                    String jndiName = (String) 
resource.getProperty("mappedName");
+                    if (jndiName == null) {
+                        jndiName = resource.getName();
+                    }
+                    if (jndiName == null) {
+                        continue;
+                    }
+
+                    if (ids == null) {
+                        final Properties props = new Properties();
+                        final OpenEjbConfiguration runningConfig = 
SystemInstance.get().getComponent(OpenEjbConfiguration.class);
+                        final List<String> resourceIds = new 
ArrayList<String>();
+                        if (runningConfig != null) {
+                            for (final ResourceInfo resourceInfo : 
runningConfig.facilities.resources) {
+                                if 
(ConfigurationFactory.isResourceType(resourceInfo.service, resourceInfo.types, 
"javax.sql.DataSource")
+                                        && ServiceUtils.implies(props, 
resourceInfo.properties)) {
+                                    resourceIds.add(resourceInfo.id);
+                                }
+                            }
+                        }
+                        ids = resourceIds.toArray(new 
String[resourceIds.size()]);
+                    }
+
+                    String mostMatchingId = null;
+                    for (String id : ids) {
+                        if (id.equals(jndiName)) {
+                            mostMatchingId = jndiName;
+                            break;
+                        } else if (jndiName.endsWith("/" + id) && 
mostMatchingId == null) {
+                            mostMatchingId = id;
+                        }
+                    }
+
+                    if (mostMatchingId != null) {
+                        resource.setProperty("mappedName", "java:" + 
mostMatchingId);
+                    }
+                }
+            }
+        }
+    }
+
     @Override
     protected WebXml createWebXml() {
         String prefix = "";

Modified: 
openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatJavaJndiBinder.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatJavaJndiBinder.java?rev=1411822&r1=1411821&r2=1411822&view=diff
==============================================================================
--- 
openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatJavaJndiBinder.java
 (original)
+++ 
openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatJavaJndiBinder.java
 Tue Nov 20 19:51:38 2012
@@ -25,7 +25,7 @@ public class TomcatJavaJndiBinder implem
     @Override public void lifecycleEvent(LifecycleEvent event) {
         Object source = event.getSource();
         if (source instanceof StandardContext) {
-            StandardContext context = (StandardContext) source;
+            final StandardContext context = (StandardContext) source;
             if (Lifecycle.CONFIGURE_START_EVENT.equals(event.getType())) {
                 TomcatJndiBuilder.mergeJava(context);
             }

Modified: 
openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatJndiBuilder.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatJndiBuilder.java?rev=1411822&r1=1411821&r2=1411822&view=diff
==============================================================================
--- 
openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatJndiBuilder.java
 (original)
+++ 
openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatJndiBuilder.java
 Tue Nov 20 19:51:38 2012
@@ -67,6 +67,7 @@ import org.apache.tomee.common.WsFactory
 import org.omg.CORBA.ORB;
 
 import javax.ejb.spi.HandleDelegate;
+import javax.naming.Binding;
 import javax.naming.Context;
 import javax.naming.LinkRef;
 import javax.naming.NamingException;
@@ -82,6 +83,7 @@ import java.net.URISyntaxException;
 import java.net.URL;
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 
@@ -292,6 +294,22 @@ public class TomcatJndiBuilder {
             // no-op
         }
 
+        // merge comp/env in app if available (some users are doing it, JBoss 
habit?)
+        try {
+            final Context app = (Context) 
ContextBindings.getClassLoader().lookup("app");
+            final Context ctx = (Context) 
ContextBindings.getClassLoader().lookup("comp/env");
+            final List<Binding> bindings = 
Collections.list(ctx.listBindings("app"));
+            for (Binding binding : bindings) {
+                try {
+                    app.bind(binding.getName(), binding.getObject());
+                } catch (NamingException ne) { // we don't want to rebind
+                    // no-op
+                }
+            }
+        } catch (Exception ne) {
+            // no-op
+        }
+
         
ContextAccessController.setReadOnly(standardContext.getNamingContextListener().getName());
     }
 


Reply via email to