You are viewing a plain text version of this content. The canonical link for it is here.
Posted to scm@geronimo.apache.org by da...@apache.org on 2006/08/18 01:20:59 UTC

svn commit: r432428 - in /geronimo/xbean/branches/colossus/xbean-naming/src/main/java/org/apache/xbean/naming/context: AbstractContext.java AbstractReadOnlyContext.java WritableContext.java

Author: dain
Date: Thu Aug 17 16:20:59 2006
New Revision: 432428

URL: http://svn.apache.org/viewvc?rev=432428&view=rev
Log:
Made AbstractReadOnlyContext a subclass of AbstractContext
Rearranged the AbstractContext methods into logical groupings
Merged common code between AbstractContext and AbstractReadOnlyContext

Modified:
    geronimo/xbean/branches/colossus/xbean-naming/src/main/java/org/apache/xbean/naming/context/AbstractContext.java
    geronimo/xbean/branches/colossus/xbean-naming/src/main/java/org/apache/xbean/naming/context/AbstractReadOnlyContext.java
    geronimo/xbean/branches/colossus/xbean-naming/src/main/java/org/apache/xbean/naming/context/WritableContext.java

Modified: geronimo/xbean/branches/colossus/xbean-naming/src/main/java/org/apache/xbean/naming/context/AbstractContext.java
URL: http://svn.apache.org/viewvc/geronimo/xbean/branches/colossus/xbean-naming/src/main/java/org/apache/xbean/naming/context/AbstractContext.java?rev=432428&r1=432427&r2=432428&view=diff
==============================================================================
--- geronimo/xbean/branches/colossus/xbean-naming/src/main/java/org/apache/xbean/naming/context/AbstractContext.java (original)
+++ geronimo/xbean/branches/colossus/xbean-naming/src/main/java/org/apache/xbean/naming/context/AbstractContext.java Thu Aug 17 16:20:59 2006
@@ -16,8 +16,6 @@
  */
 package org.apache.xbean.naming.context;
 
-import org.apache.geronimo.naming.enc.EnterpriseNamingContextNameParser;
-
 import javax.naming.CompositeName;
 import javax.naming.Context;
 import javax.naming.InvalidNameException;
@@ -27,118 +25,143 @@
 import javax.naming.NamingEnumeration;
 import javax.naming.NamingException;
 import javax.naming.NotContextException;
+import javax.naming.LinkRef;
+import java.io.Serializable;
+import java.util.Collections;
 import java.util.Hashtable;
 import java.util.Map;
 
-public abstract class AbstractContext implements Context {
-    protected Hashtable env;
-    protected AbstractContext parent;
-    protected Name contextAtomicName;
-
-    public AbstractContext() {
-        env = new Hashtable();
-    }
+public abstract class AbstractContext implements Context, ContextFactory, Serializable {
+    private static final long serialVersionUID = 6481918425692261483L;
+    private final String nameInNamespace;
 
-    protected AbstractContext(AbstractContext parent, Hashtable environment, Name contextAtomicName) {
-        this.env = environment;
-        this.parent = parent;
-        this.contextAtomicName = contextAtomicName;
+    protected AbstractContext(String nameInNamespace) {
+        this.nameInNamespace = nameInNamespace;
     }
 
-    public AbstractContext(Hashtable env) {
-        if (env == null) {
-            this.env = new Hashtable();
-        } else {
-            this.env = new Hashtable(env);
-        }
-    }
 
     public void close() throws NamingException {
         //Ignore. Explicitly do not close the context
     }
 
-    protected abstract AbstractContext newSubcontext(Name name);
     protected abstract void removeBindings(Name name) throws NamingException;
     protected abstract Object internalLookup(Name name, boolean resolveLinks) throws NamingException;
     protected abstract void addBinding(Name name, Object obj, boolean rebind) throws NamingException;
     protected abstract Map getBindingsCopy();
 
-    public String getNameInNamespace() throws NamingException {
-        AbstractContext parentContext = parent;
-        if (parentContext == null) {
-            return "ROOT CONTEXT";
-        }
-        Name name = EnterpriseNamingContextNameParser.INSTANCE.parse("");
-        name.add(contextAtomicName.toString());
-
-        // Get parent's names
-        while (parentContext != null && parentContext.contextAtomicName != null) {
-            name.add(0, parentContext.contextAtomicName.toString());
-            parentContext = parentContext.parent;
+    /**
+     * Gets the name of this context withing the global namespace.  This method may return null
+     * if the location of the node in the global namespace is not known
+     * @return the name of this context within the global namespace or null if unknown.
+     */
+    public String getNameInNamespace() {
+        return nameInNamespace;
+    }
+
+    /**
+     * Gets the name of a path withing the global namespace context.
+     */
+    protected String getNameInNamespace(String path) {
+        String nameInNamespace = getNameInNamespace();
+        if (nameInNamespace == null || nameInNamespace.length() == 0) {
+            return path;
+        } else {
+            return nameInNamespace + "/" + path;
         }
-        return name.toString();
     }
 
-    public void destroySubcontext(String name) throws NamingException {
-        if (name == null) throw new NullPointerException("name is null");
-        destroySubcontext(new CompositeName(name));
+    //
+    // Environment
+    //
+
+    /**
+     * Always returns a new (empty) Hashtable.
+     * @return a new (empty) Hashtable
+     */
+    public Hashtable getEnvironment() {
+        return new Hashtable();
     }
 
-    public void unbind(String name) throws NamingException {
-        if (name == null) throw new NullPointerException("name is null");
-        unbind(new CompositeName(name));
+    public Object addToEnvironment(String propName, Object propVal) throws NamingException {
+        if (propName == null) throw new NullPointerException("propName is null");
+        if (propVal == null) throw new NullPointerException("propVal is null");
+
+        Map env = getEnvironment();
+        return env.put(propName, propVal);
     }
 
-    public Hashtable getEnvironment() throws NamingException {
-        return env;
+    public Object removeFromEnvironment(String propName) throws NamingException {
+        if (propName == null) throw new NullPointerException("propName is null");
+
+        Map env = getEnvironment();
+        return env.remove(propName);
     }
 
-    public void destroySubcontext(Name name) throws NamingException {
-        if (name == null) throw new NullPointerException("name is null");
-        if (name.isEmpty()) {
-            throw new InvalidNameException("Cannot destroy subcontext with empty name");
-        }
-        unbind(name);
+    //
+    // Name handling
+    //
+
+    /**
+     * A parser that can turn Strings into javax.naming.Name objects.
+     * @return ContextUtil.NAME_PARSER
+     */
+    protected NameParser getNameParser() {
+        return ContextUtil.NAME_PARSER;
     }
 
-    public void unbind(Name name) throws NamingException {
-        if (name == null) throw new NullPointerException("name is null");
-        if (name.isEmpty()) {
-            throw new InvalidNameException("Cannot unbind empty name");
-        }
-        removeBindings(name);
+    public NameParser getNameParser(Name name) {
+        return getNameParser();
     }
 
-    public Object lookup(String name) throws NamingException {
-        if (name == null) throw new NullPointerException("name is null");
-        return lookup(new CompositeName(name));
+    public NameParser getNameParser(String name) {
+        return getNameParser();
     }
 
-    public Object lookupLink(String name) throws NamingException {
+    public Name composeName(Name name, Name prefix) throws NamingException {
         if (name == null) throw new NullPointerException("name is null");
-        return lookupLink(new CompositeName(name));
-    }
+        if (prefix == null) throw new NullPointerException("prefix is null");
 
-    public Object removeFromEnvironment(String propName) throws NamingException {
-        if (propName == null) throw new NullPointerException("propName is null");
-        Object obj = env.get(propName);
-        env.remove(propName);
-        return obj;
+        Name result = (Name) prefix.clone();
+        result.addAll(name);
+        return result;
     }
 
-    public void bind(String name, Object obj) throws NamingException {
+    public String composeName(String name, String prefix) throws NamingException {
         if (name == null) throw new NullPointerException("name is null");
-        bind(new CompositeName(name), obj);
+        if (prefix == null) throw new NullPointerException("prefix is null");
+
+        CompositeName result = new CompositeName(prefix);
+        result.addAll(new CompositeName(name));
+        return result.toString();
     }
 
-    public void rebind(String name, Object obj) throws NamingException {
+    //
+    // Lookup
+    //
+
+    public Object lookup(String name) throws NamingException {
         if (name == null) throw new NullPointerException("name is null");
-        rebind(new CompositeName(name), obj);
+        return lookup(new CompositeName(name));
     }
 
     public Object lookup(Name name) throws NamingException {
         if (name == null) throw new NullPointerException("name is null");
-        return internalLookup(name, true);
+
+        Object value = internalLookup(name, true);
+
+
+        // if we got a link back we need to resolve it
+        if (value instanceof LinkRef) {
+            LinkRef linkRef = (LinkRef) value;
+            value = lookup(linkRef.getLinkName());
+        }
+
+        return value;
+    }
+
+    public Object lookupLink(String name) throws NamingException {
+        if (name == null) throw new NullPointerException("name is null");
+        return lookupLink(new CompositeName(name));
     }
 
     public Object lookupLink(Name name) throws NamingException {
@@ -146,22 +169,18 @@
         return internalLookup(name, false);
     }
 
-    /**
-     * Binds a name to an object. The logic of this method is as follows If the
-     * name consists of only one element, then it is bound directly to the
-     * underlying HashMap. If the name consists of many parts, then the object
-     * is bound to the target context with the terminal atomic component of the
-     * name. If any of the atomic names other than the terminal one is bound to
-     * an object that is not a Context a NameAlreadyBoundException is thrown. If
-     * the terminal atomic name is already bound to any object then a
-     * NameAlreadyBoundException is thrown. If any of the subContexts included
-     * in the Name do not exist then a NamingException is thrown.
-     *
-     * @param name the name to bind; may not be empty
-     * @param obj  the object to bind; possibly null
-     * @throws NameAlreadyBoundException if name is already bound
-     * @throws NamingException           if a naming exception is encountered
-     */
+    //
+    // Bind, rebind, rename and unbind
+    //
+
+    public void bind(String name, Object obj) throws NamingException {
+        if (name == null) throw new NullPointerException("name is null");
+        if (name.length() == 0) {
+            throw new NameAlreadyBoundException("Cannot bind to an empty name (this context)");
+        }
+        bind(new CompositeName(name), obj);
+    }
+
     public void bind(Name name, Object obj) throws NamingException {
         if (name == null) throw new NullPointerException("name is null");
         if (name.isEmpty()) {
@@ -170,6 +189,11 @@
         addBinding(name, obj, false);
     }
 
+    public void rebind(String name, Object obj) throws NamingException {
+        if (name == null) throw new NullPointerException("name is null");
+        rebind(new CompositeName(name), obj);
+    }
+
     public void rebind(Name name, Object obj) throws NamingException {
         if (name == null) throw new NullPointerException("name is null");
         if (name.isEmpty()) {
@@ -178,29 +202,13 @@
         addBinding(name, obj, true);
     }
 
-    public synchronized void rename(String oldName, String newName) throws NamingException {
+    public void rename(String oldName, String newName) throws NamingException {
         if (oldName == null) throw new NullPointerException("oldName is null");
         if (newName == null) throw new NullPointerException("newName is null");
         rename(new CompositeName(oldName), new CompositeName(newName));
     }
 
-    public Context createSubcontext(String name) throws NamingException {
-        if (name == null) throw new NullPointerException("name is null");
-        return createSubcontext(new CompositeName(name));
-    }
-
-    public Context createSubcontext(Name name) throws NamingException {
-        if (name == null) throw new NullPointerException("name is null");
-        if (name.isEmpty()) {
-            throw new InvalidNameException("Cannot create a subcontext if the name is empty");
-        }
-        AbstractContext abstractContext = newSubcontext(name);
-        addBinding(name, abstractContext, false);
-        return abstractContext;
-    }
-
-
-    public synchronized void rename(Name oldName, Name newName) throws NamingException {
+    public void rename(Name oldName, Name newName) throws NamingException {
         if (oldName == null || newName == null) {
             throw new NullPointerException("name is null");
         } else if (oldName.isEmpty() || newName.isEmpty()) {
@@ -212,26 +220,28 @@
         this.unbind(oldName);
     }
 
-    public NameParser getNameParser(String name) throws NamingException {
+    public void unbind(String name) throws NamingException {
         if (name == null) throw new NullPointerException("name is null");
-        return getNameParser(new CompositeName(name));
+        unbind(new CompositeName(name));
     }
 
-    public NameParser getNameParser(Name name) throws NamingException {
+    public void unbind(Name name) throws NamingException {
         if (name == null) throw new NullPointerException("name is null");
-        return EnterpriseNamingContextNameParser.INSTANCE;
+        if (name.isEmpty()) {
+            throw new InvalidNameException("Cannot unbind empty name");
+        }
+        removeBindings(name);
     }
 
+    //
+    // List
+    //
+
     public NamingEnumeration list(String name) throws NamingException {
         if (name == null) throw new NullPointerException("name is null");
         return list(new CompositeName(name));
     }
 
-    public NamingEnumeration listBindings(String name) throws NamingException {
-        if (name == null) throw new NullPointerException("name is null");
-        return listBindings(new CompositeName(name));
-    }
-
     public NamingEnumeration list(Name name) throws NamingException {
         if (name == null) throw new NullPointerException("name is null");
         if (name.isEmpty()) {
@@ -244,6 +254,11 @@
         throw new NotContextException("The name " + name + " cannot be listed");
     }
 
+    public NamingEnumeration listBindings(String name) throws NamingException {
+        if (name == null) throw new NullPointerException("name is null");
+        return listBindings(new CompositeName(name));
+    }
+
     public NamingEnumeration listBindings(Name name) throws NamingException {
         if (name == null) throw new NullPointerException("name is null");
         if (name.isEmpty()) {
@@ -256,33 +271,35 @@
         throw new NotContextException("The name " + name + " cannot be listed");
     }
 
-    public Object addToEnvironment(String propName, Object propVal) throws NamingException {
-        if (propName == null || propVal == null) {
-            throw new NamingException("The parameters for this method cannot be null");
+    //
+    // Subcontexts
+    //
+
+    public Context createSubcontext(String name) throws NamingException {
+        if (name == null) throw new NullPointerException("name is null");
+        return createSubcontext(new CompositeName(name));
+    }
+
+    public Context createSubcontext(Name name) throws NamingException {
+        if (name == null) throw new NullPointerException("name is null");
+        if (name.isEmpty()) {
+            throw new InvalidNameException("Cannot create a subcontext if the name is empty");
         }
-        Object obj = env.get(propName);
-        env.put(propName, propVal);
-        return obj;
+        Context abstractContext = createContext(name.toString(), Collections.EMPTY_MAP);
+        addBinding(name, abstractContext, false);
+        return abstractContext;
     }
 
-    public String composeName(String name, String prefix) throws NamingException {
+    public void destroySubcontext(String name) throws NamingException {
         if (name == null) throw new NullPointerException("name is null");
-        if (prefix == null) throw new NullPointerException("prefix is null");
-        return composeName(new CompositeName(name), new CompositeName(prefix)) .toString();
+        destroySubcontext(new CompositeName(name));
     }
 
-    public Name composeName(Name name, Name prefix) throws NamingException {
+    public void destroySubcontext(Name name) throws NamingException {
         if (name == null) throw new NullPointerException("name is null");
-        if (prefix == null) throw new NullPointerException("prefix is null");
-        if (name == null) {
-            throw new NullPointerException("name is null");
-        }
-        if (prefix == null) {
-            throw new NullPointerException("prefix is null");
+        if (name.isEmpty()) {
+            throw new InvalidNameException("Cannot destroy subcontext with empty name");
         }
-
-        Name result = (Name) prefix.clone();
-        result.addAll(name);
-        return result;
+        unbind(name);
     }
 }

Modified: geronimo/xbean/branches/colossus/xbean-naming/src/main/java/org/apache/xbean/naming/context/AbstractReadOnlyContext.java
URL: http://svn.apache.org/viewvc/geronimo/xbean/branches/colossus/xbean-naming/src/main/java/org/apache/xbean/naming/context/AbstractReadOnlyContext.java?rev=432428&r1=432427&r2=432428&view=diff
==============================================================================
--- geronimo/xbean/branches/colossus/xbean-naming/src/main/java/org/apache/xbean/naming/context/AbstractReadOnlyContext.java (original)
+++ geronimo/xbean/branches/colossus/xbean-naming/src/main/java/org/apache/xbean/naming/context/AbstractReadOnlyContext.java Thu Aug 17 16:20:59 2006
@@ -17,70 +17,28 @@
 
 package org.apache.xbean.naming.context;
 
-import javax.naming.CompositeName;
 import javax.naming.Context;
 import javax.naming.InitialContext;
+import javax.naming.InvalidNameException;
+import javax.naming.LinkRef;
 import javax.naming.Name;
 import javax.naming.NameNotFoundException;
-import javax.naming.NameParser;
 import javax.naming.NamingEnumeration;
 import javax.naming.NamingException;
 import javax.naming.NotContextException;
 import javax.naming.OperationNotSupportedException;
-import javax.naming.InvalidNameException;
-import javax.naming.LinkRef;
 import java.io.Serializable;
-import java.util.Hashtable;
-import java.util.Map;
 import java.util.Collections;
+import java.util.Map;
 
 /**
  * @version $Rev: 355877 $ $Date: 2005-12-10 18:48:27 -0800 (Sat, 10 Dec 2005) $
  */
-public abstract class AbstractReadOnlyContext implements Context, ContextFactory, Serializable {
+public abstract class AbstractReadOnlyContext extends AbstractContext implements Context, ContextFactory, Serializable {
     private static final long serialVersionUID = 3808693663629444493L;
-    private final String nameInNamespace;
 
     protected AbstractReadOnlyContext(String nameInNamespace) {
-        this.nameInNamespace = nameInNamespace;
-    }
-
-    /**
-     * Gets the name of this context withing the global namespace.  This method may return null
-     * if the location of the node in the global namespace is not known
-     * @return the name of this context within the global namespace or null if unknown.
-     */
-    public String getNameInNamespace() {
-        return nameInNamespace;
-    }
-
-    /**
-     * Gets the name of a path withing the global namespace context.
-     */
-    protected String getNameInNamespace(String path) {
-        String nameInNamespace = getNameInNamespace();
-        if (nameInNamespace == null || nameInNamespace.length() == 0) {
-            return path;
-        } else {
-            return nameInNamespace + "/" + path;
-        }
-    }
-
-
-    /**
-     * Always returns a new (empty) Hashtable.
-     * @return a new (empty) Hashtable
-     */
-    public Hashtable getEnvironment() {
-        return new Hashtable();
-    }
-
-    /**
-     * A parser that can turn Strings into javax.naming.Name objects.
-     * @return ContextUtil.NAME_PARSER
-     */
-    protected NameParser getNameParser() {
-        return ContextUtil.NAME_PARSER;
+        super(nameInNamespace);
     }
 
     //
@@ -465,46 +423,8 @@
     }
 
     //
-    // Name manipulation
-    //
-
-    public final NameParser getNameParser(Name name) {
-        return getNameParser();
-    }
-
-    public final NameParser getNameParser(String name) {
-        return getNameParser();
-    }
-
-    public final Name composeName(Name name, Name prefix) throws NamingException {
-        if (name == null) throw new NullPointerException("name is null");
-        if (prefix == null) throw new NullPointerException("prefix is null");
-
-        Name result = (Name) prefix.clone();
-        result.addAll(name);
-        return result;
-    }
-
-    public final String composeName(String name, String prefix) throws NamingException {
-        if (name == null) throw new NullPointerException("name is null");
-        if (prefix == null) throw new NullPointerException("prefix is null");
-
-        CompositeName result = new CompositeName(prefix);
-        result.addAll(new CompositeName(name));
-        return result.toString();
-    }
-
-    //
     //  Unsupported Operations
     //
-
-    public final Object addToEnvironment(String propName, Object propVal) throws NamingException {
-        throw new OperationNotSupportedException("Context is read only");
-    }
-
-    public final Object removeFromEnvironment(String propName) throws NamingException {
-        throw new OperationNotSupportedException("Context is read only");
-    }
 
     public final void bind(Name name, Object obj) throws NamingException {
         throw new OperationNotSupportedException("Context is read only");

Modified: geronimo/xbean/branches/colossus/xbean-naming/src/main/java/org/apache/xbean/naming/context/WritableContext.java
URL: http://svn.apache.org/viewvc/geronimo/xbean/branches/colossus/xbean-naming/src/main/java/org/apache/xbean/naming/context/WritableContext.java?rev=432428&r1=432427&r2=432428&view=diff
==============================================================================
--- geronimo/xbean/branches/colossus/xbean-naming/src/main/java/org/apache/xbean/naming/context/WritableContext.java (original)
+++ geronimo/xbean/branches/colossus/xbean-naming/src/main/java/org/apache/xbean/naming/context/WritableContext.java Thu Aug 17 16:20:59 2006
@@ -22,7 +22,6 @@
 import javax.naming.NameAlreadyBoundException;
 import javax.naming.LinkRef;
 import java.util.Map;
-import java.util.Hashtable;
 import java.util.HashMap;
 
 /**
@@ -32,26 +31,17 @@
     protected Map bindings;
 
     public WritableContext() {
+        super("");
         bindings = new HashMap();
     }
 
-    public WritableContext(AbstractContext parent, Hashtable environment, Name contextAtomicName) {
-        super(parent, environment, contextAtomicName);
+    public WritableContext(String nameInNamespace) {
+        super(nameInNamespace);
         bindings = new HashMap();
     }
 
-    public WritableContext(Hashtable env) {
-        super(env);
-        bindings = new HashMap();
-    }
-
-    public WritableContext(WritableContext clone, Hashtable env) {
-        super(env);
-        bindings = clone.bindings;
-    }
-
-    protected AbstractContext newSubcontext(Name name) {
-        return new WritableContext(this, this.env, name);
+    public Context createContext(String path, Map bindings) {
+        return new WritableContext(getNameInNamespace(path));
     }
 
     protected void removeBindings(Name name) throws NamingException {