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 2011/09/01 07:42:09 UTC

svn commit: r1163909 - in /openejb/trunk/openejb3/assembly/openejb-tomcat/openejb-tomcat-catalina/src/main/java/org/apache/openejb/tomcat/catalina: ContextValue.java TomcatJndiBuilder.java

Author: rmannibucau
Date: Thu Sep  1 05:42:08 2011
New Revision: 1163909

URL: http://svn.apache.org/viewvc?rev=1163909&view=rev
Log:
adding a previous support for module - still to enhance -> see ContextValue

Added:
    openejb/trunk/openejb3/assembly/openejb-tomcat/openejb-tomcat-catalina/src/main/java/org/apache/openejb/tomcat/catalina/ContextValue.java
Modified:
    openejb/trunk/openejb3/assembly/openejb-tomcat/openejb-tomcat-catalina/src/main/java/org/apache/openejb/tomcat/catalina/TomcatJndiBuilder.java

Added: openejb/trunk/openejb3/assembly/openejb-tomcat/openejb-tomcat-catalina/src/main/java/org/apache/openejb/tomcat/catalina/ContextValue.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/assembly/openejb-tomcat/openejb-tomcat-catalina/src/main/java/org/apache/openejb/tomcat/catalina/ContextValue.java?rev=1163909&view=auto
==============================================================================
--- openejb/trunk/openejb3/assembly/openejb-tomcat/openejb-tomcat-catalina/src/main/java/org/apache/openejb/tomcat/catalina/ContextValue.java (added)
+++ openejb/trunk/openejb3/assembly/openejb-tomcat/openejb-tomcat-catalina/src/main/java/org/apache/openejb/tomcat/catalina/ContextValue.java Thu Sep  1 05:42:08 2011
@@ -0,0 +1,45 @@
+package org.apache.openejb.tomcat.catalina;
+
+import org.apache.openejb.BeanContext;
+import org.apache.openejb.core.ThreadContext;
+
+import javax.naming.LinkRef;
+import javax.naming.NamingException;
+import java.util.ArrayList;
+import java.util.Collection;
+
+/**
+ * @author rmannibucau
+ */
+public class ContextValue extends LinkRef {
+    public static final String MODULES_PREFIX = "openejb/modules/";
+
+    private final Collection<String> links = new ArrayList<String>();
+
+    public ContextValue(String linkName) {
+        super(linkName);
+    }
+
+    public synchronized String getLinkName() throws NamingException {
+	    if (links.size() == 1) {
+            return "java:" + links.iterator().next();
+        }
+
+        // else try to get BeanContextN to get linkname
+        ThreadContext tc = ThreadContext.getThreadContext();
+        if (tc != null && tc.getBeanContext() != null) {
+            return "java:" + linkName(tc.getBeanContext().getModuleID(), super.getLinkName());
+        }
+
+        // TODO: should we parse a stacktrace to get the module?
+        throw new NamingException("more than one module binding match this name " + super.getLinkName());
+    }
+
+    public void addValue(String link) {
+        links.add(link);
+    }
+
+    public static String linkName(String moduleId, String name) {
+        return MODULES_PREFIX + moduleId + "/" + name;
+    }
+}

Modified: openejb/trunk/openejb3/assembly/openejb-tomcat/openejb-tomcat-catalina/src/main/java/org/apache/openejb/tomcat/catalina/TomcatJndiBuilder.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/assembly/openejb-tomcat/openejb-tomcat-catalina/src/main/java/org/apache/openejb/tomcat/catalina/TomcatJndiBuilder.java?rev=1163909&r1=1163908&r2=1163909&view=diff
==============================================================================
--- openejb/trunk/openejb3/assembly/openejb-tomcat/openejb-tomcat-catalina/src/main/java/org/apache/openejb/tomcat/catalina/TomcatJndiBuilder.java (original)
+++ openejb/trunk/openejb3/assembly/openejb-tomcat/openejb-tomcat-catalina/src/main/java/org/apache/openejb/tomcat/catalina/TomcatJndiBuilder.java Thu Sep  1 05:42:08 2011
@@ -95,6 +95,7 @@ import static org.apache.openejb.tomcat.
 
 public class TomcatJndiBuilder {
     private static final Collection<BeanContext> ALREADY_BOUND = new ArrayList<BeanContext>();
+    private static final Map<Context, Map<String, ContextValue>> CONTEXT_VALUES = new HashMap<Context, Map<String, ContextValue>>();
 
     private final StandardContext standardContext;
     private final WebAppInfo webAppInfo;
@@ -181,18 +182,22 @@ public class TomcatJndiBuilder {
             AppContext ac = mc.getAppContext();
 
             Context moduleContext = mc.getModuleJndiContext();
-            // copyContext("", moduleContext, root); // TODO: manage map<????, context> + a facade context?
+            try {
+                copyContext("", moduleContext, root, mc.getUniqueId());
+            } catch (NamingException ignored) {
+                // no-op
+            }
 
             Context appContext = ac.getAppJndiContext();
             try {
-                copyContext("", appContext, root);
+                copyContext("", appContext, root, null);
             } catch (NamingException ignored) {
                 // no-op
             }
 
             Context globalContext = ac.getGlobalJndiContext();
             try {
-                copyContext("", globalContext, root);
+                copyContext("", globalContext, root, null);
             } catch (NamingException ignored) {
                 // no-op
             }
@@ -200,7 +205,7 @@ public class TomcatJndiBuilder {
         ContextAccessController.setReadOnly(standardContext.getNamingContextListener().getName());
     }
 
-    private static void copyContext(String prefix, Context from, Context to) throws NamingException {
+    private static void copyContext(String prefix, Context from, Context to, String linkPrefix) throws NamingException {
         String usedPrefix;
         if (prefix.isEmpty()) {
             usedPrefix = prefix;
@@ -219,13 +224,53 @@ public class TomcatJndiBuilder {
                 } catch (NameAlreadyBoundException ne) {
                     // ignored
                 }
-                copyContext(contextPrefix, (Context) object, to);
+                copyContext(contextPrefix, (Context) object, to, linkPrefix);
             } else {
                 String name = usedPrefix + binding.getName();
-                try {
-                    to.bind(name, object);
-                } catch (NamingException ne) {
-                    // ignored
+                if (linkPrefix == null) {
+                    try {
+                        to.bind(name, object);
+                    } catch (NamingException ne) {
+                        // ignored
+                    }
+                } else {
+                    String link = ContextValue.linkName(linkPrefix, name);
+
+                    // create subcontexts if necessary
+                    String[] contexts = link.split("/");
+                    String current = "";
+                    for (int i = 0; i < contexts.length - 1; i++) {
+                        if (current.isEmpty()) {
+                            current += contexts[i];
+                        } else {
+                            current += "/" + contexts[i];
+                        }
+                        try {
+                            to.createSubcontext(current);
+                        } catch (NameAlreadyBoundException ne) {
+                            // ignored
+                        }
+                    }
+
+                    to.bind(link, object);
+
+                    // don't do a lookup here because it is a link!
+                    Map<String, ContextValue> contextValues = CONTEXT_VALUES.get(to);
+                    if (contextValues == null) {
+                        contextValues = new HashMap<String, ContextValue>();
+                        CONTEXT_VALUES.put(to, contextValues);
+                    }
+                    ContextValue cv = contextValues.get(name);
+                    if (cv == null) {
+                        cv = new ContextValue(name);
+                        try {
+                            to.bind(name, cv);
+                            contextValues.put(name, cv);
+                        } catch (NamingException ignored) {
+                            // ignored
+                        }
+                    }
+                    cv.addValue(link);
                 }
             }
         }