package org.jboss.seam; import java.util.HashMap; import java.util.Map; /** * A namespace for Seam component names. * * @author Gavin King * */ public class Namespace { private String name; private Map<String, Namespace> children = new HashMap<String, Namespace>(); public Namespace(String name) { this.name = name; } /** * Get a component or child namespace */ public Object get(String key) { Object component = getComponentInstance(key); return component==null ? children.get(key) : component; } public Namespace getChild(String key) { return children.get(key); } public Namespace getOrCreateChild(String key) { Namespace result = getChild(key); if (result==null) { result = new Namespace( qualifyName(key) + '.' ); addChild(key, result); } return result; } public Object getComponentInstance(String key) { return getComponentInstance(key, true); } public Object getComponentInstance(String key, boolean create) { return Component.getInstance( qualifyName(key), create ); } private String qualifyName(String key) { return name==null ? key : name + key; } public boolean hasChild(String key) { return children.containsKey(key); } public void addChild(String name, Namespace value) { children.put(name, value); } @Override public int hashCode() { return name==null ? 0 : name.hashCode(); } @Override public boolean equals(Object other) { if ( !(other instanceof Namespace) ) { return false; } else { Namespace ns = (Namespace) other; return this.name==ns.name || ( this.name!=null && this.name.equals(ns.name) ); } } @Override public String toString() { return "Namespace(" + ( name==null ? "Root" : name ) + ')'; } }