/* * Copyright (c) 2006 Stiftung Deutsches Elektronen-Synchroton, * Member of the Helmholtz Association, (DESY), HAMBURG, GERMANY. * * THIS SOFTWARE IS PROVIDED UNDER THIS LICENSE ON AN "../AS IS" BASIS. * WITHOUT WARRANTY OF ANY KIND, EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED * TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR PARTICULAR PURPOSE AND * NON-INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE * FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * THE USE OR OTHER DEALINGS IN THE SOFTWARE. SHOULD THE SOFTWARE PROVE DEFECTIVE * IN ANY RESPECT, THE USER ASSUMES THE COST OF ANY NECESSARY SERVICING, REPAIR OR * CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. * NO USE OF ANY SOFTWARE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER. * DESY HAS NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, * OR MODIFICATIONS. * THE FULL LICENSE SPECIFYING FOR THE SOFTWARE THE REDISTRIBUTION, MODIFICATION, * USAGE AND OTHER RIGHTS AND OBLIGATIONS IS INCLUDED WITH THE DISTRIBUTION OF THIS * PROJECT IN THE FILE LICENSE.HTML. IF THE LICENSE IS NOT INCLUDED YOU MAY FIND A COPY * AT HTTP://WWW.DESY.DE/LEGAL/LICENSE.HTM */ package org.epics.css.dal.directory; import java.util.Hashtable; import java.util.Map; import javax.naming.Binding; import javax.naming.Context; import javax.naming.InvalidNameException; import javax.naming.Name; import javax.naming.NameClassPair; import javax.naming.NameNotFoundException; import javax.naming.NameParser; import javax.naming.NamingEnumeration; import javax.naming.NamingException; import javax.naming.directory.Attribute; import javax.naming.directory.Attributes; import javax.naming.directory.BasicAttributes; import javax.naming.directory.DirContext; import javax.naming.directory.ModificationItem; import javax.naming.directory.SearchControls; import javax.naming.directory.SearchResult; import org.csstudio.dal.simple.RemoteInfo; import com.cosylab.naming.URIName; /** * This is <code>DirContext</code> implementation for CSS federation * management of different protocol specific subcontexts. In order for this * federation manager to find appropriate subcontext following guidelines must * be followed. * <ul> * <li>All <code>Name</code> instances must be implementation of * <code>URIName</code> or <code>RemoteInfo</code>.</li> * <li><code>URIName</code> must present URI with schema defined * as follows: <code>css-PLUG</code> where <code>PLUG</code> is protocol * name which must match with Plug type.</li> * <li>All particular plug implementation must bind their specific * <code>DirContext</code> implementation under name <code>css-PLUG</code></li> * </ul> * <p>For example see Simulation implementation of * <code>DirContext</code>.</p> * * @author Igor Kriznar (igor.kriznarATcosylab.com) */ public class InitialDirContextImpl implements DirContext { protected URINameParser parser; protected Hashtable env; protected Map<String, DirContext> dirs = new Hashtable<String, DirContext>(); protected Attributes attr = new BasicAttributes(false); /** * Creates a new InitialDirContextImpl object. */ public InitialDirContextImpl() { this(new Hashtable<String, Object>()); } /** * Creates a new InitialDirContextImpl object. * * @param env Environment HashTable */ public InitialDirContextImpl(Hashtable<?,?> env) { super(); parser = new URINameParser(); this.env = env; } /** * Finds subcontext which is representing * * @param name must be absolute <code>URIName</code> instance. * * @return <code>DirContext</code> presenting requested schema part or * exception is thrown. * * @throws NamingException if context for schema is not loaded or error * occured. * @throws InvalidNameException if name is not absolute */ public DirContext resolveSchema(Name name) throws NamingException { if (!(name instanceof URIName)) { throw new InvalidNameException("Name '" + name + " is not URIName."); } URIName un = (URIName)name; if (un.isRelative()) { throw new InvalidNameException("Name '" + name + " is not absolute."); } DirContext ctx = dirs.get(un.get(0)); if (ctx == null) { throw new NamingException("DirContext for schema from '" + name + "' is not loaded."); } return ctx; } /* (non-Javadoc) * @see javax.naming.directory.DirContext#getAttributes(javax.naming.Name) */ @Override public Attributes getAttributes(Name name) throws NamingException { if (name == null) { throw new NullPointerException("name"); } if (name.isEmpty()) { return (Attributes)attr.clone(); } return resolveSchema(name).getAttributes(name.getSuffix(1)); } /* (non-Javadoc) * @see javax.naming.directory.DirContext#getAttributes(java.lang.String) */ @Override public Attributes getAttributes(String name) throws NamingException { if (name == null) { throw new NullPointerException("name"); } Name n = parser.parse(name); if (n.isEmpty()) { return (Attributes)attr.clone(); } return resolveSchema(n).getAttributes(n.getSuffix(1)); } /* (non-Javadoc) * @see javax.naming.directory.DirContext#getAttributes(javax.naming.Name, java.lang.String[]) */ @Override public Attributes getAttributes(Name name, String[] attrIds) throws NamingException { if (name == null) { throw new NullPointerException("name"); } if (name.isEmpty()) { Attributes a = new BasicAttributes(false); for (int i = 0; i < attrIds.length; i++) { a.put(attr.get(attrIds[i])); } return a; } return resolveSchema(name).getAttributes(name.getSuffix(1), attrIds); } /* (non-Javadoc) * @see javax.naming.directory.DirContext#getAttributes(java.lang.String, java.lang.String[]) */ @Override public Attributes getAttributes(String name, String[] attrIds) throws NamingException { if (name == null) { throw new NullPointerException("name"); } return getAttributes(parser.parse(name), attrIds); } /* (non-Javadoc) * @see javax.naming.directory.DirContext#modifyAttributes(javax.naming.Name, int, javax.naming.directory.Attributes) */ @Override public void modifyAttributes(Name name, int mod_op, Attributes attrs) throws NamingException { if (name == null) { throw new NullPointerException("name"); } if (name.isEmpty()) { NamingEnumeration<?extends Attribute> enumeration = attrs.getAll(); switch (mod_op) { case DirContext.ADD_ATTRIBUTE: { while (enumeration.hasMore()) { attr.put(enumeration.next()); } return; } case DirContext.REPLACE_ATTRIBUTE: { Attribute a; while (enumeration.hasMore()) { a = enumeration.next(); attr.put(a.getID(), a); } return; } case DirContext.REMOVE_ATTRIBUTE: { while (enumeration.hasMore()) { attr.remove(((Attribute)enumeration.next()).getID()); } return; } default: return; } } resolveSchema(name).modifyAttributes(name.getSuffix(1), mod_op, attrs); } /* (non-Javadoc) * @see javax.naming.directory.DirContext#modifyAttributes(java.lang.String, int, javax.naming.directory.Attributes) */ @Override public void modifyAttributes(String name, int mod_op, Attributes attrs) throws NamingException { if (name == null) { throw new NullPointerException("name"); } modifyAttributes(parser.parse(name), mod_op, attrs); } /* (non-Javadoc) * @see javax.naming.directory.DirContext#modifyAttributes(javax.naming.Name, javax.naming.directory.ModificationItem[]) */ @Override public void modifyAttributes(Name name, ModificationItem[] mods) throws NamingException { if (name == null) { throw new NullPointerException("name"); } if (name.isEmpty()) { for (int i = 0; i < mods.length; i++) { switch (mods[i].getModificationOp()) { case DirContext.ADD_ATTRIBUTE: { attr.put(mods[i].getAttribute()); return; } case DirContext.REPLACE_ATTRIBUTE: { attr.put(mods[i].getAttribute().getID(), mods[i].getAttribute()); return; } case DirContext.REMOVE_ATTRIBUTE: { attr.remove(mods[i].getAttribute().getID()); return; } default: return; } } } resolveSchema(name).modifyAttributes(name.getSuffix(1), mods); } /* (non-Javadoc) * @see javax.naming.directory.DirContext#modifyAttributes(java.lang.String, javax.naming.directory.ModificationItem[]) */ @Override public void modifyAttributes(String name, ModificationItem[] mods) throws NamingException { if (name == null) { throw new NullPointerException("name"); } modifyAttributes(parser.parse(name), mods); } /* (non-Javadoc) * @see javax.naming.directory.DirContext#bind(javax.naming.Name, java.lang.Object, javax.naming.directory.Attributes) */ @Override public void bind(Name name, Object obj, Attributes attrs) throws NamingException { if (name == null) { throw new NullPointerException("name"); } if (name.isEmpty()) { throw new UnsupportedOperationException("Name may not be empty."); } else if (name.size() == 1) { if (obj instanceof DirContext) { URIName un = (URIName)name; if (un.isRelative()) { throw new InvalidNameException("Name '" + name + " is not absolute."); } if (!un.get(0).toString().startsWith(RemoteInfo.DAL_TYPE_PREFIX)) { throw new InvalidNameException("Name '" + name + " does not start with '" + RemoteInfo.DAL_TYPE_PREFIX + "'."); } dirs.put(un.get(0), (DirContext)obj); modifyAttributes(name, DirContext.ADD_ATTRIBUTE, attrs); } else { throw new UnsupportedOperationException( "Object must be a DirContext."); } } else { resolveSchema(name).bind(name.getSuffix(1), obj, attrs); } } /* (non-Javadoc) * @see javax.naming.directory.DirContext#bind(java.lang.String, java.lang.Object, javax.naming.directory.Attributes) */ @Override public void bind(String name, Object obj, Attributes attrs) throws NamingException { if (name == null) { throw new NullPointerException("name"); } bind(parser.parse(name), obj, attrs); } /* (non-Javadoc) * @see javax.naming.directory.DirContext#rebind(javax.naming.Name, java.lang.Object, javax.naming.directory.Attributes) */ @Override public void rebind(Name name, Object obj, Attributes attrs) throws NamingException { if (name == null) { throw new NullPointerException("name"); } if (name.isEmpty()) { throw new UnsupportedOperationException("Name may not be empty."); } else if (name.size() == 1) { if (obj instanceof DirContext) { URIName un = (URIName)name; if (un.isRelative()) { throw new InvalidNameException("Name '" + name + " is not absolute."); } if (!un.get(0).toString().startsWith(RemoteInfo.DAL_TYPE_PREFIX)) { throw new InvalidNameException("Name '" + name + " does not start with '" + RemoteInfo.DAL_TYPE_PREFIX + "'."); } dirs.put(un.get(0), (DirContext)obj); modifyAttributes(name, DirContext.ADD_ATTRIBUTE, attrs); } else { throw new UnsupportedOperationException( "Object must be a DirContext."); } } else { resolveSchema(name).rebind(name.getSuffix(1), attrs); } } /* (non-Javadoc) * @see javax.naming.directory.DirContext#rebind(java.lang.String, java.lang.Object, javax.naming.directory.Attributes) */ @Override public void rebind(String name, Object obj, Attributes attrs) throws NamingException { if (name == null) { throw new NullPointerException("name"); } rebind(parser.parse(name), obj, attrs); } /* (non-Javadoc) * @see javax.naming.directory.DirContext#createSubcontext(javax.naming.Name, javax.naming.directory.Attributes) */ @Override public DirContext createSubcontext(Name name, Attributes attrs) throws NamingException { if (name == null) { throw new NullPointerException("name"); } if (name.isEmpty()) { throw new UnsupportedOperationException("Name may not be empty."); } else if (name.size() == 1) { DirContext ctx = new DirContextSupport(); URIName un = (URIName)name; if (un.isRelative()) { throw new InvalidNameException("Name '" + name + " is not absolute."); } if (!un.get(0).toString().startsWith(RemoteInfo.DAL_TYPE_PREFIX)) { throw new InvalidNameException("Name '" + name + " does not start with '" + RemoteInfo.DAL_TYPE_PREFIX + "'."); } dirs.put(un.get(0), ctx); modifyAttributes(name, DirContext.ADD_ATTRIBUTE, attrs); return ctx; } return resolveSchema(name).createSubcontext(name.getSuffix(1), attrs); } /* (non-Javadoc) * @see javax.naming.directory.DirContext#createSubcontext(java.lang.String, javax.naming.directory.Attributes) */ @Override public DirContext createSubcontext(String name, Attributes attrs) throws NamingException { if (name == null) { throw new NullPointerException("name"); } return createSubcontext(parser.parse(name), attrs); } /* (non-Javadoc) * @see javax.naming.directory.DirContext#getSchema(javax.naming.Name) */ @Override public DirContext getSchema(Name name) throws NamingException { if (name == null) { throw new NullPointerException("name"); } if (name.isEmpty()) { throw new UnsupportedOperationException("Name may not be empty."); } else { return resolveSchema(name).getSchema(name.getSuffix(1)); } } /* (non-Javadoc) * @see javax.naming.directory.DirContext#getSchema(java.lang.String) */ @Override public DirContext getSchema(String name) throws NamingException { if (name == null) { throw new NullPointerException("name"); } return getSchema(parser.parse(name)); } /* (non-Javadoc) * @see javax.naming.directory.DirContext#getSchemaClassDefinition(javax.naming.Name) */ @Override public DirContext getSchemaClassDefinition(Name name) throws NamingException { if (name == null) { throw new NullPointerException("name"); } if (name.isEmpty()) { throw new UnsupportedOperationException("Name may not be empty."); } return resolveSchema(name).getSchemaClassDefinition(name.getSuffix(1)); } /* (non-Javadoc) * @see javax.naming.directory.DirContext#getSchemaClassDefinition(java.lang.String) */ @Override public DirContext getSchemaClassDefinition(String name) throws NamingException { if (name == null) { throw new NullPointerException("name"); } return getSchemaClassDefinition(parser.parse(name)); } /* (non-Javadoc) * @see javax.naming.directory.DirContext#search(javax.naming.Name, javax.naming.directory.Attributes, java.lang.String[]) */ @Override public NamingEnumeration<SearchResult> search(Name name, Attributes matchingAttributes, String[] attributesToReturn) throws NamingException { if (name == null) { throw new NullPointerException("name"); } return resolveSchema(name) .search(name.getSuffix(1), matchingAttributes, attributesToReturn); } /* (non-Javadoc) * @see javax.naming.directory.DirContext#search(java.lang.String, javax.naming.directory.Attributes, java.lang.String[]) */ @Override public NamingEnumeration<SearchResult> search(String name, Attributes matchingAttributes, String[] attributesToReturn) throws NamingException { if (name == null) { throw new NullPointerException("name"); } Name n = parser.parse(name); return search(n, matchingAttributes, attributesToReturn); } /* (non-Javadoc) * @see javax.naming.directory.DirContext#search(javax.naming.Name, javax.naming.directory.Attributes) */ @Override public NamingEnumeration<SearchResult> search(Name name, Attributes matchingAttributes) throws NamingException { if (name == null) { throw new NullPointerException("name"); } return resolveSchema(name).search(name.getSuffix(1), matchingAttributes); } /* (non-Javadoc) * @see javax.naming.directory.DirContext#search(java.lang.String, javax.naming.directory.Attributes) */ @Override public NamingEnumeration<SearchResult> search(String name, Attributes matchingAttributes) throws NamingException { if (name == null) { throw new NullPointerException("name"); } Name n = parser.parse(name); return resolveSchema(n).search(n.getSuffix(1), matchingAttributes); } /* (non-Javadoc) * @see javax.naming.directory.DirContext#search(javax.naming.Name, java.lang.String, javax.naming.directory.SearchControls) */ @Override public NamingEnumeration<SearchResult> search(Name name, String filter, SearchControls cons) throws NamingException { if (name == null) { throw new NullPointerException("name"); } return resolveSchema(name).search(name.getSuffix(1), filter, cons); } /* (non-Javadoc) * @see javax.naming.directory.DirContext#search(java.lang.String, java.lang.String, javax.naming.directory.SearchControls) */ @Override public NamingEnumeration<SearchResult> search(String name, String filter, SearchControls cons) throws NamingException { if (name == null) { throw new NullPointerException("name"); } Name n = parser.parse(name); return resolveSchema(n).search(n.getSuffix(1), filter, cons); } /* (non-Javadoc) * @see javax.naming.directory.DirContext#search(javax.naming.Name, java.lang.String, java.lang.Object[], javax.naming.directory.SearchControls) */ @Override public NamingEnumeration<SearchResult> search(Name name, String filterExpr, Object[] filterArgs, SearchControls cons) throws NamingException { if (name == null) { throw new NullPointerException("name"); } return resolveSchema(name) .search(name.getSuffix(1), filterExpr, filterArgs, cons); } /* (non-Javadoc) * @see javax.naming.directory.DirContext#search(java.lang.String, java.lang.String, java.lang.Object[], javax.naming.directory.SearchControls) */ @Override public NamingEnumeration<SearchResult> search(String name, String filterExpr, Object[] filterArgs, SearchControls cons) throws NamingException { if (name == null) { throw new NullPointerException("name"); } Name n = parser.parse(name); return resolveSchema(n) .search(n.getSuffix(1), filterExpr, filterArgs, cons); } /* (non-Javadoc) * @see javax.naming.Context#lookup(javax.naming.Name) */ @Override public Object lookup(Name name) throws NamingException { if (name == null) { throw new NullPointerException("name"); } if (name.isEmpty()) { // Hashtable table = (Hashtable) env.clone(); // Attributes a = (Attributes) attr.clone(); // InitialDirContextImpl ctx = new InitialDirContextImpl(table); // ctx.modifyAttributes(name, DirContext.ADD_ATTRIBUTE, a); // return ctx; //avoid cloning return this; } else if (name.size() == 1) { URIName uri = (URIName)name; return dirs.get(uri.get(0)); } return resolveSchema(name).lookup(name.getSuffix(1)); } /* (non-Javadoc) * @see javax.naming.Context#lookup(java.lang.String) */ @Override public Object lookup(String name) throws NamingException { if (name == null) { throw new NullPointerException("name"); } return lookup(parser.parse(name)); } /* (non-Javadoc) * @see javax.naming.Context#bind(javax.naming.Name, java.lang.Object) */ @Override public void bind(Name name, Object obj) throws NamingException { if (name == null) { throw new NullPointerException("name"); } if (name.isEmpty()) { throw new UnsupportedOperationException("Name may not be empty."); } else if (name.size() == 1) { if (obj instanceof DirContext) { URIName un = (URIName)name; if (un.isRelative()) { throw new InvalidNameException("Name '" + name + " is not absolute."); } if (!un.get(0).toString().startsWith(RemoteInfo.DAL_TYPE_PREFIX)) { throw new InvalidNameException("Name '" + name + " does not start with '" + RemoteInfo.DAL_TYPE_PREFIX + "'."); } dirs.put(un.get(0), (DirContext)obj); } else { throw new UnsupportedOperationException( "Object must be a DirContext."); } } else { resolveSchema(name).bind(name.getSuffix(1), obj); } } /* (non-Javadoc) * @see javax.naming.Context#bind(java.lang.String, java.lang.Object) */ @Override public void bind(String name, Object obj) throws NamingException { if (name == null) { throw new NullPointerException("name"); } bind(parser.parse(name), obj); } /* (non-Javadoc) * @see javax.naming.Context#rebind(javax.naming.Name, java.lang.Object) */ @Override public void rebind(Name name, Object obj) throws NamingException { if (name == null) { throw new NullPointerException("name"); } if (name.isEmpty()) { throw new UnsupportedOperationException("Name may not be empty."); } else if (name.size() == 1) { if (obj instanceof DirContext) { URIName un = (URIName)name; if (un.isRelative()) { throw new InvalidNameException("Name '" + name + " is not absolute."); } dirs.put(un.get(0), (DirContext)obj); } else { throw new UnsupportedOperationException( "Object must be a DirContext."); } } else { resolveSchema(name).rebind(name.getSuffix(1), obj); } } /* (non-Javadoc) * @see javax.naming.Context#rebind(java.lang.String, java.lang.Object) */ @Override public void rebind(String name, Object obj) throws NamingException { if (name == null) { throw new NullPointerException("name"); } rebind(parser.parse(name), obj); } /* (non-Javadoc) * @see javax.naming.Context#unbind(javax.naming.Name) */ @Override public void unbind(Name name) throws NamingException { if (name == null) { throw new NullPointerException("name"); } if (name.isEmpty()) { throw new UnsupportedOperationException("Name may not be empty."); } else if (name.size() == 1) { URIName un = (URIName)name; dirs.remove(un.get(0)); } else { resolveSchema(name).unbind(name.getSuffix(1)); } } /* (non-Javadoc) * @see javax.naming.Context#unbind(java.lang.String) */ @Override public void unbind(String name) throws NamingException { if (name == null) { throw new NullPointerException("name"); } unbind(parser.parse(name)); } /* (non-Javadoc) * @see javax.naming.Context#rename(javax.naming.Name, javax.naming.Name) */ @Override public void rename(Name oldName, Name newName) throws NamingException { if (oldName == null) { throw new NullPointerException("oldName"); } if (newName == null) { throw new NullPointerException("newName"); } if (oldName.isEmpty()) { throw new UnsupportedOperationException("oldName may not be empty."); } if (newName.isEmpty()) { throw new UnsupportedOperationException("newName may not be empty."); } if (oldName.size() == 1) { URIName un = (URIName)oldName; DirContext ctx = dirs.remove(un.get(0)); URIName unnew = (URIName)newName; dirs.put(unnew.get(0), ctx); } resolveSchema(oldName).rename(oldName.getSuffix(1), newName); } /* (non-Javadoc) * @see javax.naming.Context#rename(java.lang.String, java.lang.String) */ @Override public void rename(String oldName, String newName) throws NamingException { if (oldName == null) { throw new NullPointerException("oldName"); } if (newName == null) { throw new NullPointerException("newName"); } rename(parser.parse(oldName), parser.parse(newName)); } /* (non-Javadoc) * @see javax.naming.Context#list(javax.naming.Name) */ @Override public NamingEnumeration<NameClassPair> list(Name name) throws NamingException { if (name == null) { throw new NullPointerException("name"); } if (name.isEmpty()) { // HashMap<Object, NameClassPair> map = new HashMap<Object, NameClassPair>(); // String n; // Iterator<String> it = dirs.keySet().iterator(); // // while (it.hasNext()) { // n = it.next(); // // NameClassPair ncp = new NameClassPair(n, // dirs.get(n).getClass().getName()); // map.put(n, ncp); // } return new NameClassEnumeration(dirs); } return resolveSchema(name).list(name.getSuffix(1)); } /* (non-Javadoc) * @see javax.naming.Context#list(java.lang.String) */ @Override public NamingEnumeration<NameClassPair> list(String name) throws NamingException { if (name == null) { throw new NullPointerException("name"); } return list(parser.parse(name)); } /* (non-Javadoc) * @see javax.naming.Context#listBindings(javax.naming.Name) */ @Override public NamingEnumeration<Binding> listBindings(Name name) throws NamingException { if (name == null) { throw new NullPointerException("name"); } if (name.isEmpty()) { // HashMap<String, Object> map = new HashMap<String, Object>(); // String n; // Iterator<String> it = dirs.keySet().iterator(); // // while (it.hasNext()) { // n = it.next(); // map.put(n, dirs.get(n)); // } return new BindingEnumeration(dirs); } return resolveSchema(name).listBindings(name.getSuffix(1)); } /* (non-Javadoc) * @see javax.naming.Context#listBindings(java.lang.String) */ @Override public NamingEnumeration<Binding> listBindings(String name) throws NamingException { if (name == null) { throw new NullPointerException("name"); } return listBindings(parser.parse(name)); } /* (non-Javadoc) * @see javax.naming.Context#destroySubcontext(javax.naming.Name) */ @Override public void destroySubcontext(Name name) throws NamingException { if (name == null) { throw new NullPointerException("name"); } if (name.isEmpty()) { throw new UnsupportedOperationException("Name may not be empty."); } else if (name.size() == 1) { URIName un = (URIName)name; DirContext ctx = dirs.remove(un.get(0)); if (ctx == null) { throw new NameNotFoundException("Subcontext for name " + name + "not found."); } else { ctx.close(); } } else { resolveSchema(name).destroySubcontext(name.getSuffix(1)); } } /* (non-Javadoc) * @see javax.naming.Context#destroySubcontext(java.lang.String) */ @Override public void destroySubcontext(String name) throws NamingException { if (name == null) { throw new NullPointerException("name"); } destroySubcontext(parser.parse(name)); } /* (non-Javadoc) * @see javax.naming.Context#createSubcontext(javax.naming.Name) */ @Override public Context createSubcontext(Name name) throws NamingException { if (name == null) { throw new NullPointerException("name"); } if (name.isEmpty()) { throw new UnsupportedOperationException("Name may not be empty."); } else if (name.size() == 1) { DirContext ctx = new DirContextSupport(); URIName un = (URIName)name; if (un.isRelative()) { throw new InvalidNameException("Name '" + name + " is not absolute."); } if (!un.get(0).toString().startsWith(RemoteInfo.DAL_TYPE_PREFIX)) { throw new InvalidNameException("Name '" + name + " does not start with '" + RemoteInfo.DAL_TYPE_PREFIX + "'."); } dirs.put(un.get(0), ctx); return ctx; } else { return resolveSchema(name).createSubcontext(name.getSuffix(1)); } } /* (non-Javadoc) * @see javax.naming.Context#createSubcontext(java.lang.String) */ @Override public Context createSubcontext(String name) throws NamingException { if (name == null) { throw new NullPointerException("name"); } return createSubcontext(parser.parse(name)); } /* (non-Javadoc) * @see javax.naming.Context#lookupLink(javax.naming.Name) */ @Override public Object lookupLink(Name name) throws NamingException { if (name == null) { throw new NullPointerException("name"); } if (name.isEmpty()) { return this; } else if (name.size() == 1) { URIName un = (URIName)name; return dirs.get(un.get(0)); } else { return resolveSchema(name).lookupLink(name.getSuffix(1)); } } /* (non-Javadoc) * @see javax.naming.Context#lookupLink(java.lang.String) */ @Override public Object lookupLink(String name) throws NamingException { if (name == null) { throw new NullPointerException("name"); } return lookupLink(parser.parse(name)); } /* (non-Javadoc) * @see javax.naming.Context#getNameParser(javax.naming.Name) */ @Override public NameParser getNameParser(Name name) throws NamingException { return parser; } /* (non-Javadoc) * @see javax.naming.Context#getNameParser(java.lang.String) */ @Override public NameParser getNameParser(String name) throws NamingException { return parser; } /* (non-Javadoc) * @see javax.naming.Context#composeName(javax.naming.Name, javax.naming.Name) */ @Override public Name composeName(Name name, Name prefix) throws NamingException { if (name == null) { throw new NullPointerException("name"); } if (name.isEmpty()) { //TODO return prefix; } else { return resolveSchema(name).composeName(name.getSuffix(1), prefix); } } /* (non-Javadoc) * @see javax.naming.Context#composeName(java.lang.String, java.lang.String) */ @Override public String composeName(String name, String prefix) throws NamingException { if (name == null) { throw new NullPointerException("name"); } Name n = parser.parse(name); if (n.isEmpty()) { return prefix; } else { return resolveSchema(n) .composeName(n.getSuffix(1).toString(), prefix); } } /* (non-Javadoc) * @see javax.naming.Context#addToEnvironment(java.lang.String, java.lang.Object) */ @Override public Object addToEnvironment(String propName, Object propVal) throws NamingException { if (propName == null) { throw new NullPointerException("propName"); } return env.put(propName, propVal); } /* (non-Javadoc) * @see javax.naming.Context#removeFromEnvironment(java.lang.String) */ @Override public Object removeFromEnvironment(String propName) throws NamingException { if (propName == null) { throw new NullPointerException("propName"); } return env.remove(propName); } /* (non-Javadoc) * @see javax.naming.Context#getEnvironment() */ @Override public Hashtable<?, ?> getEnvironment() throws NamingException { return new Hashtable(env); } /* (non-Javadoc) * @see javax.naming.Context#close() */ @Override public void close() throws NamingException { // TODO Auto-generated method stub } /* (non-Javadoc) * @see javax.naming.Context#getNameInNamespace() */ @Override public String getNameInNamespace() throws NamingException { return null; } } /* __oOo__ */