Author: djencks
Date: Thu Jul 22 17:12:03 2010
New Revision: 966757

URL: http://svn.apache.org/viewvc?rev=966757&view=rev
Log:
OPENEJB-1311 Make binding a context work like federation

Modified:
    
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/ivm/naming/NameNode.java
    
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/ivm/naming/ParsedName.java

Modified: 
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/ivm/naming/NameNode.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/ivm/naming/NameNode.java?rev=966757&r1=966756&r2=966757&view=diff
==============================================================================
--- 
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/ivm/naming/NameNode.java
 (original)
+++ 
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/ivm/naming/NameNode.java
 Thu Jul 22 17:12:03 2010
@@ -16,7 +16,9 @@
  */
 package org.apache.openejb.core.ivm.naming;
 
+import javax.naming.*;
 import java.io.PrintStream;
+import java.util.ArrayList;
 
 public class NameNode implements java.io.Serializable {
     private final String atomicName;
@@ -36,8 +38,12 @@ public class NameNode implements java.io
         this.parentTree = parentTree;
         if (name.next())
             subTree = new NameNode(this, name, obj, this);
-        else
+        else if (obj instanceof Context) {
+            myObject = new Federation();
+            ((Federation)myObject).add((Context) obj);
+        } else {
             myObject = obj;
+        }
     }
 
     void setMyContext(IvmContext myContext) {
@@ -45,7 +51,7 @@ public class NameNode implements java.io
     }
 
     public Object getBinding() {
-        if (myObject != null)
+        if (myObject != null && !(myObject instanceof Federation))
             return myObject;// if NameNode has an object it must be a binding
         else {
             if (myContext == null)
@@ -56,32 +62,66 @@ public class NameNode implements java.io
 
     public Object resolve(ParsedName name) throws 
javax.naming.NameNotFoundException {
         int compareResult = name.compareTo(atomicHash);
-
-        if (compareResult == ParsedName.IS_EQUAL && 
name.getComponent().equals(atomicName)) {// hashcodes and String valuse are 
equal
+        javax.naming.NameNotFoundException n = null;
+        int pos = name.getPos();
+        if (compareResult == ParsedName.IS_EQUAL && 
name.getComponent().equals(atomicName)) {
+            // hashcodes and String valuse are equal
             if (name.next()) {
-                if (subTree == null) throw new 
javax.naming.NameNotFoundException("Cannot resolve " + name);
-                return subTree.resolve(name);
-            } else if (unbound){
-                throw new javax.naming.NameNotFoundException("Cannot resolve " 
+ name);
-            } else {
+                if (subTree != null) {
+                    try {
+                        return subTree.resolve(name);
+                    } catch (NameNotFoundException e) {
+                        n = e;
+                    }
+                }
+            } else if (!unbound){
                 return getBinding();
             }
-        } else if (compareResult == ParsedName.IS_LESS) {// parsed hash is 
less than
-            if (lessTree == null) throw new 
javax.naming.NameNotFoundException("Cannot resolve " + name);
-            return lessTree.resolve(name);
-
-        } else {//ParsedName.IS_GREATER
+        } else if (compareResult == ParsedName.IS_LESS) {
+            // parsed hash is less than
+            if (lessTree != null) {
+                return lessTree.resolve(name);
+            }
 
-            if (grtrTree == null) throw new 
javax.naming.NameNotFoundException("Cannot resolve " + name);
-            return grtrTree.resolve(name);
+        } else {
+            //ParsedName.IS_GREATER
+            if (grtrTree != null) {
+                return grtrTree.resolve(name);
+            }
+        }
+        if (myObject instanceof Federation) {
+            name.reset(pos);
+            String nameInContext = name.remaining().path();
+            Federation f = null;
+            for (Context c: (Federation)myObject) {
+                try {
+                    Object o = c.lookup(nameInContext);
+                    if (o instanceof Context) {
+                        if (f == null) {
+                            f = new Federation();
+                        }
+                        f.add((Context) o);
+                    } else {
+                        return o;
+                    }
+                } catch (javax.naming.NamingException e) {
+                    //ignore
+                }
+            }
+            if (f != null) {
+                NameNode node = new NameNode(null, new ParsedName(""), f, 
null);
+                return new IvmContext(node);
+            }
         }
+        if (n != null) throw n;
+        throw new javax.naming.NameNotFoundException("Cannot resolve " + name);
     }
 
     public void bind(ParsedName name, Object obj) throws 
javax.naming.NameAlreadyBoundException {
         int compareResult = name.compareTo(atomicHash);
         if (compareResult == ParsedName.IS_EQUAL && 
name.getComponent().equals(atomicName)) {
             if (name.next()) {
-                if (myObject != null) {
+                if (myObject != null && !(myObject instanceof Federation)) {
                     throw new javax.naming.NameAlreadyBoundException();
                 }
                 if (subTree == null)
@@ -89,22 +129,33 @@ public class NameNode implements java.io
                 else
                     subTree.bind(name, obj);
             } else {
-                if (subTree != null) {
-                    throw new 
javax.naming.NameAlreadyBoundException(name.toString());
-                }
-                if (myObject != null){
-                    throw new 
javax.naming.NameAlreadyBoundException(name.toString());
+                if (obj instanceof Context) {
+                    if (myObject != null) {
+                        if (!(myObject instanceof Federation)) {
+                            throw new 
javax.naming.NameAlreadyBoundException(name.toString());
+                        }
+                    } else {
+                        myObject = new Federation();
+                    }
+                    ((Federation)myObject).add((Context) obj);
+                } else {
+                    if (subTree != null) {
+                        throw new 
javax.naming.NameAlreadyBoundException(name.toString());
+                    }
+                    if (myObject != null) {
+                        throw new 
javax.naming.NameAlreadyBoundException(name.toString());
+                    }
+                    unbound = false;
+                    myObject = obj;// bind the object to this node
                 }
-                unbound = false;
-                myObject = obj;// bind the object to this node
             }
         } else if (compareResult == ParsedName.IS_LESS) {
             if (lessTree == null)
                 lessTree = new NameNode(this.parent, name, obj, this);
             else
                 lessTree.bind(name, obj);
-        } else {//ParsedName.IS_GREATER ...
-
+        } else {
+            //ParsedName.IS_GREATER ...
             if (grtrTree == null)
                 grtrTree = new NameNode(this.parent, name, obj, this);
             else
@@ -322,4 +373,6 @@ public class NameNode implements java.io
                 ", unbound=" + unbound +
                 '}';
     }
+
+    private static class Federation extends ArrayList<Context> {};
 }

Modified: 
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/ivm/naming/ParsedName.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/ivm/naming/ParsedName.java?rev=966757&r1=966756&r2=966757&view=diff
==============================================================================
--- 
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/ivm/naming/ParsedName.java
 (original)
+++ 
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/ivm/naming/ParsedName.java
 Thu Jul 22 17:12:03 2010
@@ -66,6 +66,16 @@ public class ParsedName implements java.
         hashcode = components[0].hashCode();
     }
 
+    public int getPos() {
+        return pos;
+    }
+
+    public void reset(int pos) {
+        if (pos < 0 || pos >= components.length) throw new 
IllegalArgumentException("pos out of range 0 to " + components.length);
+        this.pos = pos;
+        hashcode = components[pos].hashCode();
+    }
+
     public int compareTo(int otherHash) {
         if (hashcode == otherHash)
             return 0;


Reply via email to