Author: dain
Date: Wed Sep 19 18:26:10 2007
New Revision: 577492

URL: http://svn.apache.org/viewvc?rev=577492&view=rev
Log:
Merging 577073 from trunk
Fix Tomcat jndi enc lookups

Added:
    
openejb/branches/3.0-beta-1/assembly/openejb-tomcat/src/main/java/org/apache/openejb/tomcat/OpenEJBNamingContextListener.java
      - copied unchanged from r577073, 
openejb/trunk/openejb3/assembly/openejb-tomcat/src/main/java/org/apache/openejb/tomcat/OpenEJBNamingContextListener.java
Modified:
    
openejb/branches/3.0-beta-1/assembly/openejb-tomcat/src/main/java/org/apache/openejb/tomcat/TomcatWebAppBuilder.java
    
openejb/branches/3.0-beta-1/container/openejb-core/src/main/java/org/apache/openejb/config/AutoConfig.java

Modified: 
openejb/branches/3.0-beta-1/assembly/openejb-tomcat/src/main/java/org/apache/openejb/tomcat/TomcatWebAppBuilder.java
URL: 
http://svn.apache.org/viewvc/openejb/branches/3.0-beta-1/assembly/openejb-tomcat/src/main/java/org/apache/openejb/tomcat/TomcatWebAppBuilder.java?rev=577492&r1=577491&r2=577492&view=diff
==============================================================================
--- 
openejb/branches/3.0-beta-1/assembly/openejb-tomcat/src/main/java/org/apache/openejb/tomcat/TomcatWebAppBuilder.java
 (original)
+++ 
openejb/branches/3.0-beta-1/assembly/openejb-tomcat/src/main/java/org/apache/openejb/tomcat/TomcatWebAppBuilder.java
 Wed Sep 19 18:26:10 2007
@@ -18,11 +18,13 @@
 package org.apache.openejb.tomcat;
 
 import org.apache.catalina.ServerFactory;
+import org.apache.catalina.Container;
 import org.apache.catalina.util.DefaultAnnotationProcessor;
 import org.apache.catalina.core.StandardContext;
 import org.apache.catalina.core.StandardServer;
 import org.apache.naming.ContextAccessController;
 import org.apache.naming.ContextBindings;
+import org.apache.naming.NamingContext;
 import org.apache.openejb.assembler.classic.AppInfo;
 import org.apache.openejb.assembler.classic.Assembler;
 import org.apache.openejb.assembler.classic.JndiEncBuilder;
@@ -52,6 +54,8 @@
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Hashtable;
+import java.util.Stack;
 
 public class TomcatWebAppBuilder implements WebAppBuilder, ContextListener {
     private static final Logger logger = 
Logger.getInstance(LogCategory.OPENEJB.createChild("tomcat"), 
"org.apache.openejb.util.resources");
@@ -64,6 +68,7 @@
 
     public TomcatWebAppBuilder() {
         StandardServer standardServer = (StandardServer) 
ServerFactory.getServer();
+        standardServer.addLifecycleListener(new 
OpenEJBNamingContextListener(standardServer));
 
         globalListenerSupport = new GlobalListenerSupport(standardServer, 
this);
 
@@ -114,6 +119,8 @@
     //
 
     public void init(StandardContext standardContext) {
+        // turn off Tomcat's naming system
+        standardContext.setUseNaming(false);
     }
 
     public void beforeStart(StandardContext standardContext) {
@@ -247,12 +254,18 @@
     //
 
     private void bindEnc(StandardContext standardContext, Context enc) {
-        // turn off Tomcat's naming system
-        standardContext.setUseNaming(false);
+        Context rootContext = null;
+        try {
+            rootContext = new NamingContext(new Hashtable(), 
getNamingContextName(standardContext));
+            Context compCtx = rootContext.createSubcontext("comp");
+            compCtx.bind("env", enc);
+        } catch (NamingException e) {
+            // Never happens
+        }
 
         // Add enc to global map of named contexts
         ContextAccessController.setSecurityToken(standardContext.getName(), 
standardContext);
-        ContextBindings.bindContext(standardContext, enc, standardContext);
+        ContextBindings.bindContext(standardContext, rootContext, 
standardContext);
         if( logger.isDebugEnabled() ) {
             logger.debug("Bound enc for " + standardContext);
         }
@@ -270,9 +283,6 @@
     private void unbindEnc(StandardContext standardContext) {
         encs.remove(standardContext.getPath());
 
-        // turn Tomcat's naming system back on
-        standardContext.setUseNaming(true);
-
         ContextBindings.unbindContext(standardContext, standardContext);
 
         ContextBindings.unbindClassLoader(standardContext, standardContext, 
standardContext.getLoader().getClassLoader());
@@ -285,5 +295,24 @@
             assembler = (Assembler) 
SystemInstance.get().getComponent(org.apache.openejb.spi.Assembler.class);
         }
         return assembler;
+    }
+
+    private String getNamingContextName(StandardContext standardContext) {
+        Container parent = standardContext.getParent();
+        if (parent == null) {
+            return standardContext.getName();
+        } else {
+            Stack<String> stk = new Stack<String>();
+            StringBuffer buff = new StringBuffer();
+            while (parent != null) {
+                stk.push(parent.getName());
+                parent = parent.getParent();
+            }
+            while (!stk.empty()) {
+                buff.append("/").append(stk.pop());
+            }
+            buff.append(standardContext.getName());
+            return buff.toString();
+        }
     }
 }

Modified: 
openejb/branches/3.0-beta-1/container/openejb-core/src/main/java/org/apache/openejb/config/AutoConfig.java
URL: 
http://svn.apache.org/viewvc/openejb/branches/3.0-beta-1/container/openejb-core/src/main/java/org/apache/openejb/config/AutoConfig.java?rev=577492&r1=577491&r2=577492&view=diff
==============================================================================
--- 
openejb/branches/3.0-beta-1/container/openejb-core/src/main/java/org/apache/openejb/config/AutoConfig.java
 (original)
+++ 
openejb/branches/3.0-beta-1/container/openejb-core/src/main/java/org/apache/openejb/config/AutoConfig.java
 Wed Sep 19 18:26:10 2007
@@ -765,7 +765,11 @@
         // Auto create a resource using the first provider that can supply a 
resource of the desired type
         String providerId = ServiceUtils.getServiceProviderId(type);
         if (providerId == null) {
-                throw new OpenEJBException("No provider available for resource 
reference '" + resourceId + "' of type '" + type + "' for '" + beanName + "'.");
+            // if there are any existing resources of the desired type, use 
the first one
+            if (resourceIds.size() > 0) {
+                return resourceIds.get(0);
+            }
+            throw new OpenEJBException("No provider available for resource 
reference '" + resourceId + "' of type '" + type + "' for '" + beanName + "'.");
         }
 
         Resource resource = new Resource(resourceId, providerId, null);


Reply via email to