| /* |
| * Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved. |
| * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
| * |
| * This code is free software; you can redistribute it and/or modify it |
| * under the terms of the GNU General Public License version 2 only, as |
| * published by the Free Software Foundation. Oracle designates this |
| * particular file as subject to the "Classpath" exception as provided |
| * by Oracle in the LICENSE file that accompanied this code. |
| * |
| * This code is distributed in the hope that it will be useful, but WITHOUT |
| * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
| * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
| * version 2 for more details (a copy is included in the LICENSE file that |
| * accompanied this code). |
| * |
| * You should have received a copy of the GNU General Public License version |
| * 2 along with this work; if not, write to the Free Software Foundation, |
| * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. |
| * |
| * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
| * or visit www.oracle.com if you need additional information or have any |
| * questions. |
| */ |
| |
| package com.sun.jndi.toolkit.ctx; |
| |
| import java.util.Hashtable; |
| |
| import javax.naming.*; |
| import javax.naming.directory.*; |
| import javax.naming.spi.DirectoryManager; |
| |
| /* |
| * Inherit from AtomicContext so that subclasses of PartialCompositeDirContext |
| * can get the ns methods defined in subclasses of PartialCompositeContext. |
| * |
| * Direct subclasses of DirContext should provide implementations for |
| * the p_ abstract DirContext methods and override the p_ Context methods |
| * (not abstract anymore because they are overridden by ComponentContext |
| * (the superclass of AtomicContext)). |
| * |
| * @author Rosanna Lee |
| */ |
| |
| public abstract class PartialCompositeDirContext |
| extends AtomicContext implements DirContext { |
| |
| protected PartialCompositeDirContext() { |
| _contextType = _PARTIAL; |
| } |
| |
| // ------ Abstract methods whose implementation come from subclasses |
| |
| /* Equivalent to DirContext methods */ |
| protected abstract Attributes p_getAttributes(Name name, String[] attrIds, |
| Continuation cont) |
| throws NamingException; |
| |
| protected abstract void p_modifyAttributes(Name name, int mod_op, |
| Attributes attrs, |
| Continuation cont) |
| throws NamingException; |
| |
| protected abstract void p_modifyAttributes(Name name, |
| ModificationItem[] mods, |
| Continuation cont) |
| throws NamingException; |
| |
| protected abstract void p_bind(Name name, Object obj, |
| Attributes attrs, |
| Continuation cont) |
| throws NamingException; |
| |
| protected abstract void p_rebind(Name name, Object obj, |
| Attributes attrs, |
| Continuation cont) |
| throws NamingException; |
| |
| protected abstract DirContext p_createSubcontext(Name name, |
| Attributes attrs, |
| Continuation cont) |
| throws NamingException; |
| |
| protected abstract NamingEnumeration<SearchResult> p_search( |
| Name name, |
| Attributes matchingAttributes, |
| String[] attributesToReturn, |
| Continuation cont) |
| throws NamingException; |
| |
| protected abstract NamingEnumeration<SearchResult> p_search( |
| Name name, |
| String filter, |
| SearchControls cons, |
| Continuation cont) |
| throws NamingException; |
| |
| protected abstract NamingEnumeration<SearchResult> p_search( |
| Name name, |
| String filterExpr, |
| Object[] filterArgs, |
| SearchControls cons, |
| Continuation cont) |
| throws NamingException; |
| |
| protected abstract DirContext p_getSchema(Name name, Continuation cont) |
| throws NamingException; |
| |
| protected abstract DirContext p_getSchemaClassDefinition(Name name, |
| Continuation cont) |
| throws NamingException; |
| |
| // ------ implementation for DirContext methods using |
| // ------ corresponding p_ methods |
| |
| public Attributes getAttributes(String name) |
| throws NamingException { |
| return getAttributes(name, null); |
| } |
| |
| public Attributes getAttributes(Name name) |
| throws NamingException { |
| return getAttributes(name, null); |
| } |
| |
| public Attributes getAttributes(String name, String[] attrIds) |
| throws NamingException { |
| return getAttributes(new CompositeName(name), attrIds); |
| } |
| |
| public Attributes getAttributes(Name name, String[] attrIds) |
| throws NamingException { |
| PartialCompositeDirContext ctx = this; |
| Hashtable<?,?> env = p_getEnvironment(); |
| Continuation cont = new Continuation(name, env); |
| Attributes answer; |
| Name nm = name; |
| |
| try { |
| answer = ctx.p_getAttributes(nm, attrIds, cont); |
| while (cont.isContinue()) { |
| nm = cont.getRemainingName(); |
| ctx = getPCDirContext(cont); |
| answer = ctx.p_getAttributes(nm, attrIds, cont); |
| } |
| } catch (CannotProceedException e) { |
| DirContext cctx = DirectoryManager.getContinuationDirContext(e); |
| answer = cctx.getAttributes(e.getRemainingName(), attrIds); |
| } |
| return answer; |
| } |
| |
| public void modifyAttributes(String name, int mod_op, Attributes attrs) |
| throws NamingException { |
| modifyAttributes(new CompositeName(name), mod_op, attrs); |
| } |
| |
| public void modifyAttributes(Name name, int mod_op, Attributes attrs) |
| throws NamingException { |
| PartialCompositeDirContext ctx = this; |
| Hashtable<?,?> env = p_getEnvironment(); |
| Continuation cont = new Continuation(name, env); |
| Name nm = name; |
| |
| try { |
| ctx.p_modifyAttributes(nm, mod_op, attrs, cont); |
| while (cont.isContinue()) { |
| nm = cont.getRemainingName(); |
| ctx = getPCDirContext(cont); |
| ctx.p_modifyAttributes(nm, mod_op, attrs, cont); |
| } |
| } catch (CannotProceedException e) { |
| DirContext cctx = DirectoryManager.getContinuationDirContext(e); |
| cctx.modifyAttributes(e.getRemainingName(), mod_op, attrs); |
| } |
| } |
| |
| public void modifyAttributes(String name, ModificationItem[] mods) |
| throws NamingException { |
| modifyAttributes(new CompositeName(name), mods); |
| } |
| |
| public void modifyAttributes(Name name, ModificationItem[] mods) |
| throws NamingException { |
| PartialCompositeDirContext ctx = this; |
| Hashtable<?,?> env = p_getEnvironment(); |
| Continuation cont = new Continuation(name, env); |
| Name nm = name; |
| |
| try { |
| ctx.p_modifyAttributes(nm, mods, cont); |
| while (cont.isContinue()) { |
| nm = cont.getRemainingName(); |
| ctx = getPCDirContext(cont); |
| ctx.p_modifyAttributes(nm, mods, cont); |
| } |
| } catch (CannotProceedException e) { |
| DirContext cctx = DirectoryManager.getContinuationDirContext(e); |
| cctx.modifyAttributes(e.getRemainingName(), mods); |
| } |
| } |
| |
| public void bind(String name, Object obj, Attributes attrs) |
| throws NamingException { |
| bind(new CompositeName(name), obj, attrs); |
| } |
| |
| public void bind(Name name, Object obj, Attributes attrs) |
| throws NamingException { |
| PartialCompositeDirContext ctx = this; |
| Hashtable<?,?> env = p_getEnvironment(); |
| Continuation cont = new Continuation(name, env); |
| Name nm = name; |
| |
| try { |
| ctx.p_bind(nm, obj, attrs, cont); |
| while (cont.isContinue()) { |
| nm = cont.getRemainingName(); |
| ctx = getPCDirContext(cont); |
| ctx.p_bind(nm, obj, attrs, cont); |
| } |
| } catch (CannotProceedException e) { |
| DirContext cctx = DirectoryManager.getContinuationDirContext(e); |
| cctx.bind(e.getRemainingName(), obj, attrs); |
| } |
| } |
| |
| public void rebind(String name, Object obj, Attributes attrs) |
| throws NamingException { |
| rebind(new CompositeName(name), obj, attrs); |
| } |
| |
| public void rebind(Name name, Object obj, Attributes attrs) |
| throws NamingException { |
| PartialCompositeDirContext ctx = this; |
| Hashtable<?,?> env = p_getEnvironment(); |
| Continuation cont = new Continuation(name, env); |
| Name nm = name; |
| |
| try { |
| ctx.p_rebind(nm, obj, attrs, cont); |
| while (cont.isContinue()) { |
| nm = cont.getRemainingName(); |
| ctx = getPCDirContext(cont); |
| ctx.p_rebind(nm, obj, attrs, cont); |
| } |
| } catch (CannotProceedException e) { |
| DirContext cctx = DirectoryManager.getContinuationDirContext(e); |
| cctx.rebind(e.getRemainingName(), obj, attrs); |
| } |
| } |
| |
| public DirContext createSubcontext(String name, Attributes attrs) |
| throws NamingException { |
| return createSubcontext(new CompositeName(name), attrs); |
| } |
| |
| public DirContext createSubcontext(Name name, Attributes attrs) |
| throws NamingException { |
| PartialCompositeDirContext ctx = this; |
| Hashtable<?,?> env = p_getEnvironment(); |
| Continuation cont = new Continuation(name, env); |
| DirContext answer; |
| Name nm = name; |
| |
| try { |
| answer = ctx.p_createSubcontext(nm, attrs, cont); |
| while (cont.isContinue()) { |
| nm = cont.getRemainingName(); |
| ctx = getPCDirContext(cont); |
| answer = ctx.p_createSubcontext(nm, attrs, cont); |
| } |
| } catch (CannotProceedException e) { |
| DirContext cctx = DirectoryManager.getContinuationDirContext(e); |
| answer = cctx.createSubcontext(e.getRemainingName(), attrs); |
| } |
| return answer; |
| } |
| |
| public NamingEnumeration<SearchResult> |
| search(String name, Attributes matchingAttributes) |
| throws NamingException |
| { |
| return search(name, matchingAttributes, null); |
| } |
| |
| public NamingEnumeration<SearchResult> |
| search(Name name, Attributes matchingAttributes) |
| throws NamingException |
| { |
| return search(name, matchingAttributes, null); |
| } |
| |
| public NamingEnumeration<SearchResult> |
| search(String name, |
| Attributes matchingAttributes, |
| String[] attributesToReturn) |
| throws NamingException |
| { |
| return search(new CompositeName(name), |
| matchingAttributes, attributesToReturn); |
| } |
| |
| public NamingEnumeration<SearchResult> |
| search(Name name, |
| Attributes matchingAttributes, |
| String[] attributesToReturn) |
| throws NamingException |
| { |
| |
| PartialCompositeDirContext ctx = this; |
| Hashtable<?,?> env = p_getEnvironment(); |
| Continuation cont = new Continuation(name, env); |
| NamingEnumeration<SearchResult> answer; |
| Name nm = name; |
| |
| try { |
| answer = ctx.p_search(nm, matchingAttributes, |
| attributesToReturn, cont); |
| while (cont.isContinue()) { |
| nm = cont.getRemainingName(); |
| ctx = getPCDirContext(cont); |
| answer = ctx.p_search(nm, matchingAttributes, |
| attributesToReturn, cont); |
| } |
| } catch (CannotProceedException e) { |
| DirContext cctx = DirectoryManager.getContinuationDirContext(e); |
| answer = cctx.search(e.getRemainingName(), matchingAttributes, |
| attributesToReturn); |
| } |
| return answer; |
| } |
| |
| public NamingEnumeration<SearchResult> |
| search(String name, |
| String filter, |
| SearchControls cons) |
| throws NamingException |
| { |
| return search(new CompositeName(name), filter, cons); |
| } |
| |
| public NamingEnumeration<SearchResult> |
| search(Name name, |
| String filter, |
| SearchControls cons) |
| throws NamingException |
| { |
| |
| PartialCompositeDirContext ctx = this; |
| Hashtable<?,?> env = p_getEnvironment(); |
| Continuation cont = new Continuation(name, env); |
| NamingEnumeration<SearchResult> answer; |
| Name nm = name; |
| |
| try { |
| answer = ctx.p_search(nm, filter, cons, cont); |
| while (cont.isContinue()) { |
| nm = cont.getRemainingName(); |
| ctx = getPCDirContext(cont); |
| answer = ctx.p_search(nm, filter, cons, cont); |
| } |
| } catch (CannotProceedException e) { |
| DirContext cctx = DirectoryManager.getContinuationDirContext(e); |
| answer = cctx.search(e.getRemainingName(), filter, cons); |
| } |
| return answer; |
| } |
| |
| public NamingEnumeration<SearchResult> |
| search(String name, |
| String filterExpr, |
| Object[] filterArgs, |
| SearchControls cons) |
| throws NamingException |
| { |
| return search(new CompositeName(name), filterExpr, filterArgs, cons); |
| } |
| |
| public NamingEnumeration<SearchResult> |
| search(Name name, |
| String filterExpr, |
| Object[] filterArgs, |
| SearchControls cons) |
| throws NamingException |
| { |
| |
| PartialCompositeDirContext ctx = this; |
| Hashtable<?,?> env = p_getEnvironment(); |
| Continuation cont = new Continuation(name, env); |
| NamingEnumeration<SearchResult> answer; |
| Name nm = name; |
| |
| try { |
| answer = ctx.p_search(nm, filterExpr, filterArgs, cons, cont); |
| while (cont.isContinue()) { |
| nm = cont.getRemainingName(); |
| ctx = getPCDirContext(cont); |
| answer = ctx.p_search(nm, filterExpr, filterArgs, cons, cont); |
| } |
| } catch (CannotProceedException e) { |
| DirContext cctx = DirectoryManager.getContinuationDirContext(e); |
| answer = cctx.search(e.getRemainingName(), filterExpr, filterArgs, |
| cons); |
| } |
| return answer; |
| } |
| |
| public DirContext getSchema(String name) throws NamingException { |
| return getSchema(new CompositeName(name)); |
| } |
| |
| public DirContext getSchema(Name name) throws NamingException { |
| PartialCompositeDirContext ctx = this; |
| Hashtable<?,?> env = p_getEnvironment(); |
| Continuation cont = new Continuation(name, env); |
| DirContext answer; |
| Name nm = name; |
| |
| try { |
| answer = ctx.p_getSchema(nm, cont); |
| while (cont.isContinue()) { |
| nm = cont.getRemainingName(); |
| ctx = getPCDirContext(cont); |
| answer = ctx.p_getSchema(nm, cont); |
| } |
| } catch (CannotProceedException e) { |
| DirContext cctx = DirectoryManager.getContinuationDirContext(e); |
| answer = cctx.getSchema(e.getRemainingName()); |
| } |
| return answer; |
| } |
| |
| public DirContext getSchemaClassDefinition(String name) |
| throws NamingException { |
| return getSchemaClassDefinition(new CompositeName(name)); |
| } |
| |
| public DirContext getSchemaClassDefinition(Name name) |
| throws NamingException { |
| PartialCompositeDirContext ctx = this; |
| Hashtable<?,?> env = p_getEnvironment(); |
| Continuation cont = new Continuation(name, env); |
| DirContext answer; |
| Name nm = name; |
| |
| try { |
| answer = ctx.p_getSchemaClassDefinition(nm, cont); |
| while (cont.isContinue()) { |
| nm = cont.getRemainingName(); |
| ctx = getPCDirContext(cont); |
| answer = ctx.p_getSchemaClassDefinition(nm, cont); |
| } |
| } catch (CannotProceedException e) { |
| DirContext cctx = DirectoryManager.getContinuationDirContext(e); |
| answer = cctx.getSchemaClassDefinition(e.getRemainingName()); |
| } |
| return answer; |
| } |
| |
| // ------ internal method used by PartialCompositeDirContext |
| |
| /** |
| * Retrieves a PartialCompositeDirContext for the resolved object in |
| * cont. Throws CannotProceedException if not successful. |
| */ |
| protected static PartialCompositeDirContext getPCDirContext(Continuation cont) |
| throws NamingException { |
| |
| PartialCompositeContext pctx = |
| PartialCompositeContext.getPCContext(cont); |
| |
| if (!(pctx instanceof PartialCompositeDirContext)) { |
| throw cont.fillInException( |
| new NotContextException( |
| "Resolved object is not a DirContext.")); |
| } |
| |
| return (PartialCompositeDirContext)pctx; |
| } |
| |
| |
| //------ Compensation for inheriting from AtomicContext |
| |
| /* |
| * Dummy implementations defined here so that direct subclasses |
| * of PartialCompositeDirContext or ComponentDirContext do not |
| * have to provide dummy implementations for these. |
| * Override these for subclasses of AtomicDirContext. |
| */ |
| |
| protected StringHeadTail c_parseComponent(String inputName, |
| Continuation cont) throws NamingException { |
| OperationNotSupportedException e = new |
| OperationNotSupportedException(); |
| throw cont.fillInException(e); |
| } |
| |
| protected Object a_lookup(String name, Continuation cont) |
| throws NamingException { |
| OperationNotSupportedException e = new |
| OperationNotSupportedException(); |
| throw cont.fillInException(e); |
| } |
| |
| protected Object a_lookupLink(String name, Continuation cont) |
| throws NamingException { |
| OperationNotSupportedException e = new |
| OperationNotSupportedException(); |
| throw cont.fillInException(e); |
| } |
| |
| protected NamingEnumeration<NameClassPair> a_list( |
| Continuation cont) throws NamingException { |
| OperationNotSupportedException e = new |
| OperationNotSupportedException(); |
| throw cont.fillInException(e); |
| } |
| |
| protected NamingEnumeration<Binding> a_listBindings( |
| Continuation cont) throws NamingException { |
| OperationNotSupportedException e = new |
| OperationNotSupportedException(); |
| throw cont.fillInException(e); |
| } |
| |
| protected void a_bind(String name, Object obj, Continuation cont) |
| throws NamingException { |
| OperationNotSupportedException e = new |
| OperationNotSupportedException(); |
| throw cont.fillInException(e); |
| } |
| |
| protected void a_rebind(String name, Object obj, Continuation cont) |
| throws NamingException { |
| OperationNotSupportedException e = new |
| OperationNotSupportedException(); |
| throw cont.fillInException(e); |
| } |
| |
| protected void a_unbind(String name, Continuation cont) |
| throws NamingException { |
| OperationNotSupportedException e = new |
| OperationNotSupportedException(); |
| throw cont.fillInException(e); |
| } |
| |
| protected void a_destroySubcontext(String name, Continuation cont) |
| throws NamingException { |
| OperationNotSupportedException e = new |
| OperationNotSupportedException(); |
| throw cont.fillInException(e); |
| } |
| |
| protected Context a_createSubcontext(String name, Continuation cont) |
| throws NamingException { |
| OperationNotSupportedException e = new |
| OperationNotSupportedException(); |
| throw cont.fillInException(e); |
| } |
| |
| protected void a_rename(String oldname, Name newname, |
| Continuation cont) throws NamingException { |
| OperationNotSupportedException e = new |
| OperationNotSupportedException(); |
| throw cont.fillInException(e); |
| } |
| |
| protected NameParser a_getNameParser(Continuation cont) |
| throws NamingException { |
| OperationNotSupportedException e = new |
| OperationNotSupportedException(); |
| throw cont.fillInException(e); |
| } |
| } |