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;