jdk/src/share/classes/javax/naming/directory/DirContext.java
changeset 2 90ce3da70b43
child 5506 202f599c92aa
equal deleted inserted replaced
0:fd16c54261b3 2:90ce3da70b43
       
     1 /*
       
     2  * Copyright 1999-2005 Sun Microsystems, Inc.  All Rights Reserved.
       
     3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
       
     4  *
       
     5  * This code is free software; you can redistribute it and/or modify it
       
     6  * under the terms of the GNU General Public License version 2 only, as
       
     7  * published by the Free Software Foundation.  Sun designates this
       
     8  * particular file as subject to the "Classpath" exception as provided
       
     9  * by Sun in the LICENSE file that accompanied this code.
       
    10  *
       
    11  * This code is distributed in the hope that it will be useful, but WITHOUT
       
    12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
       
    13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
       
    14  * version 2 for more details (a copy is included in the LICENSE file that
       
    15  * accompanied this code).
       
    16  *
       
    17  * You should have received a copy of the GNU General Public License version
       
    18  * 2 along with this work; if not, write to the Free Software Foundation,
       
    19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
       
    20  *
       
    21  * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
       
    22  * CA 95054 USA or visit www.sun.com if you need additional information or
       
    23  * have any questions.
       
    24  */
       
    25 
       
    26 package javax.naming.directory;
       
    27 
       
    28 import javax.naming.*;
       
    29 
       
    30 /**
       
    31  * The directory service interface, containing
       
    32  * methods for examining and updating attributes
       
    33  * associated with objects, and for searching the directory.
       
    34  * <p>
       
    35  * <h4>Names</h4>
       
    36  * Each name passed as an argument to a <tt>DirContext</tt> method is relative
       
    37  * to that context.  The empty name is used to name the context itself.
       
    38  * The name parameter may never be null.
       
    39  * <p>
       
    40  * Most of the methods have overloaded versions with one taking a
       
    41  * <code>Name</code> parameter and one taking a <code>String</code>.
       
    42  * These overloaded versions are equivalent in that if
       
    43  * the <code>Name</code> and <code>String</code> parameters are just
       
    44  * different representations of the same name, then the overloaded
       
    45  * versions of the same methods behave the same.
       
    46  * In the method descriptions below, only one version is documented.
       
    47  * The second version instead has a link to the first:  the same
       
    48  * documentation applies to both.
       
    49  * <p>
       
    50  * See <tt>Context</tt> for a discussion on the interpretation of the
       
    51  * name argument to the <tt>Context</tt> methods. These same rules
       
    52  * apply to the name argument to the <tt>DirContext</tt> methods.
       
    53  * <p>
       
    54  * <h4>Attribute Models</h4>
       
    55  * There are two basic models of what attributes should be
       
    56  * associated with.  First, attributes may be directly associated with a
       
    57  * DirContext object.
       
    58  * In this model, an attribute operation on the named object is
       
    59  * roughly equivalent
       
    60  * to a lookup on the name (which returns the DirContext object),
       
    61  * followed by the attribute operation invoked on the DirContext object
       
    62  * in which the caller supplies an empty name. The attributes can be viewed
       
    63  * as being stored along with the object (note that this does not imply that
       
    64  * the implementation must do so).
       
    65  * <p>
       
    66  * The second model is that attributes are associated with a
       
    67  * name (typically an atomic name) in a DirContext.
       
    68  * In this model, an attribute operation on the named object is
       
    69  * roughly equivalent to a lookup on the name of the parent DirContext of the
       
    70  * named object, followed by the attribute operation invoked on the parent
       
    71  * in which the caller supplies the terminal atomic name.
       
    72  * The attributes can be viewed as being stored in the parent DirContext
       
    73  * (again, this does not imply that the implementation must do so).
       
    74  * Objects that are not DirContexts can have attributes, as long as
       
    75  * their parents are DirContexts.
       
    76  * <p>
       
    77  * JNDI support both of these models.
       
    78  * It is up to the individual service providers to decide where to
       
    79  * "store" attributes.
       
    80  * JNDI clients are safest when they do not make assumptions about
       
    81  * whether an object's attributes are stored as part of the object, or stored
       
    82  * within the parent object and associated with the object's name.
       
    83  * <p>
       
    84  * <h4>Attribute Type Names</h4>
       
    85  * In the <tt>getAttributes()</tt> and <tt>search()</tt> methods,
       
    86  * you can supply the attributes to return by supplying a list of
       
    87  * attribute names (strings).
       
    88  * The attributes that you get back might not have the same names as the
       
    89  * attribute names you have specified. This is because some directories
       
    90  * support features that cause them to return other attributes.  Such
       
    91  * features include attribute subclassing, attribute name synonyms, and
       
    92  * attribute language codes.
       
    93  * <p>
       
    94  * In attribute subclassing, attributes are defined in a class hierarchy.
       
    95  * In some directories, for example, the "name" attribute might be the
       
    96  * superclass of all name-related attributes, including "commonName" and
       
    97  * "surName".  Asking for the "name" attribute might return both the
       
    98  * "commonName" and "surName" attributes.
       
    99  * <p>
       
   100  * With attribute type synonyms, a directory can assign multiple names to
       
   101  * the same attribute. For example, "cn" and "commonName" might both
       
   102  * refer to the same attribute. Asking for "cn" might return the
       
   103  * "commonName" attribute.
       
   104  * <p>
       
   105  * Some directories support the language codes for attributes.
       
   106  * Asking such a directory for the "description" attribute, for example,
       
   107  * might return all of the following attributes:
       
   108  * <ul>
       
   109  * <li>description
       
   110  * <li>description;lang-en
       
   111  * <li>description;lang-de
       
   112  * <li>description;lang-fr
       
   113  * </ul>
       
   114  *
       
   115  * <p>
       
   116  *<h4>Operational Attributes</h4>
       
   117  *<p>
       
   118  * Some directories have the notion of "operational attributes" which are
       
   119  * attributes associated with a directory object for administrative
       
   120  * purposes. An example of operational attributes is the access control
       
   121  * list for an object.
       
   122  * <p>
       
   123  * In the <tt>getAttributes()</tt> and <tt>search()</tt> methods,
       
   124  * you can specify that all attributes associated with the requested objects
       
   125  * be returned by supply <tt>null</tt> as the list of attributes to return.
       
   126  * The attributes returned do <em>not</em> include operational attributes.
       
   127  * In order to retrieve operational attributes, you must name them explicitly.
       
   128  *
       
   129  * <p>
       
   130  * <h4>Named Context</h4>
       
   131  * <p>
       
   132  * There are certain methods in which the name must resolve to a context
       
   133  * (for example, when searching a single level context). The documentation
       
   134  * of such methods
       
   135  * use the term <em>named context</em> to describe their name parameter.
       
   136  * For these methods, if the named object is not a DirContext,
       
   137  * <code>NotContextException</code> is thrown.
       
   138  * Aside from these methods, there is no requirement that the
       
   139  * <em>named object</em> be a DirContext.
       
   140  *<p>
       
   141  *<h4>Parameters</h4>
       
   142  *<p>
       
   143  * An <tt>Attributes</tt>, <tt>SearchControls</tt>, or array object
       
   144  * passed as a parameter to any method will not be modified by the
       
   145  * service provider.  The service provider may keep a reference to it
       
   146  * for the duration of the operation, including any enumeration of the
       
   147  * method's results and the processing of any referrals generated.
       
   148  * The caller should not modify the object during this time.
       
   149  * An <tt>Attributes</tt> object returned by any method is owned by
       
   150  * the caller.  The caller may subsequently modify it; the service
       
   151  * provider will not.
       
   152  *<p>
       
   153  *<h4>Exceptions</h4>
       
   154  *<p>
       
   155  * All the methods in this interface can throw a NamingException or
       
   156  * any of its subclasses. See NamingException and their subclasses
       
   157  * for details on each exception.
       
   158  *
       
   159  * @author Rosanna Lee
       
   160  * @author Scott Seligman
       
   161  * @author R. Vasudevan
       
   162  *
       
   163  * @see javax.naming.Context
       
   164  * @since 1.3
       
   165  */
       
   166 
       
   167 public interface DirContext extends Context {
       
   168 
       
   169     /**
       
   170      * Retrieves all of the attributes associated with a named object.
       
   171      * See the class description regarding attribute models, attribute
       
   172      * type names, and operational attributes.
       
   173      *
       
   174      * @param name
       
   175      *          the name of the object from which to retrieve attributes
       
   176      * @return  the set of attributes associated with <code>name</code>.
       
   177      *          Returns an empty attribute set if name has no attributes;
       
   178      *          never null.
       
   179      * @throws  NamingException if a naming exception is encountered
       
   180      *
       
   181      * @see #getAttributes(String)
       
   182      * @see #getAttributes(Name, String[])
       
   183      */
       
   184     public Attributes getAttributes(Name name) throws NamingException;
       
   185 
       
   186     /**
       
   187      * Retrieves all of the attributes associated with a named object.
       
   188      * See {@link #getAttributes(Name)} for details.
       
   189      *
       
   190      * @param name
       
   191      *          the name of the object from which to retrieve attributes
       
   192      * @return  the set of attributes associated with <code>name</code>
       
   193      *
       
   194      * @throws  NamingException if a naming exception is encountered
       
   195      */
       
   196     public Attributes getAttributes(String name) throws NamingException;
       
   197 
       
   198     /**
       
   199      * Retrieves selected attributes associated with a named object.
       
   200      * See the class description regarding attribute models, attribute
       
   201      * type names, and operational attributes.
       
   202      *
       
   203      * <p> If the object does not have an attribute
       
   204      * specified, the directory will ignore the nonexistent attribute
       
   205      * and return those requested attributes that the object does have.
       
   206      *
       
   207      * <p> A directory might return more attributes than was requested
       
   208      * (see <strong>Attribute Type Names</strong> in the class description),
       
   209      * but is not allowed to return arbitrary, unrelated attributes.
       
   210      *
       
   211      * <p> See also <strong>Operational Attributes</strong> in the class
       
   212      * description.
       
   213      *
       
   214      * @param name
       
   215      *          the name of the object from which to retrieve attributes
       
   216      * @param attrIds
       
   217      *          the identifiers of the attributes to retrieve.
       
   218      *          null indicates that all attributes should be retrieved;
       
   219      *          an empty array indicates that none should be retrieved.
       
   220      * @return  the requested attributes; never null
       
   221      *
       
   222      * @throws  NamingException if a naming exception is encountered
       
   223      */
       
   224     public Attributes getAttributes(Name name, String[] attrIds)
       
   225             throws NamingException;
       
   226 
       
   227     /**
       
   228      * Retrieves selected attributes associated with a named object.
       
   229      * See {@link #getAttributes(Name, String[])} for details.
       
   230      *
       
   231      * @param name
       
   232      *          The name of the object from which to retrieve attributes
       
   233      * @param attrIds
       
   234      *          the identifiers of the attributes to retrieve.
       
   235      *          null indicates that all attributes should be retrieved;
       
   236      *          an empty array indicates that none should be retrieved.
       
   237      * @return  the requested attributes; never null
       
   238      *
       
   239      * @throws  NamingException if a naming exception is encountered
       
   240      */
       
   241     public Attributes getAttributes(String name, String[] attrIds)
       
   242             throws NamingException;
       
   243 
       
   244     /**
       
   245      * This constant specifies to add an attribute with the specified values.
       
   246      * <p>
       
   247      * If attribute does not exist,
       
   248      * create the attribute.  The resulting attribute has a union of the
       
   249      * specified value set and the prior value set.
       
   250      * Adding an attribute with no value will throw
       
   251      * <code>InvalidAttributeValueException</code> if the attribute must have
       
   252      * at least  one value.  For a single-valued attribute where that attribute
       
   253      * already exists, throws <code>AttributeInUseException</code>.
       
   254      * If attempting to add more than one value to a single-valued attribute,
       
   255      * throws <code>InvalidAttributeValueException</code>.
       
   256      * <p>
       
   257      * The value of this constant is <tt>1</tt>.
       
   258      *
       
   259      * @see ModificationItem
       
   260      * @see #modifyAttributes
       
   261      */
       
   262     public final static int ADD_ATTRIBUTE = 1;
       
   263 
       
   264     /**
       
   265      * This constant specifies to replace an attribute with specified values.
       
   266      *<p>
       
   267      * If attribute already exists,
       
   268      * replaces all existing values with new specified values.  If the
       
   269      * attribute does not exist, creates it.  If no value is specified,
       
   270      * deletes all the values of the attribute.
       
   271      * Removal of the last value will remove the attribute if the attribute
       
   272      * is required to have at least one value.  If
       
   273      * attempting to add more than one value to a single-valued attribute,
       
   274      * throws <code>InvalidAttributeValueException</code>.
       
   275      * <p>
       
   276      * The value of this constant is <tt>2</tt>.
       
   277      *
       
   278      * @see ModificationItem
       
   279      * @see #modifyAttributes
       
   280      */
       
   281     public final static int REPLACE_ATTRIBUTE = 2;
       
   282 
       
   283     /**
       
   284      * This constant specifies to delete
       
   285      * the specified attribute values from the attribute.
       
   286      *<p>
       
   287      * The resulting attribute has the set difference of its prior value set
       
   288      * and the specified value set.
       
   289      * If no values are specified, deletes the entire attribute.
       
   290      * If the attribute does not exist, or if some or all members of the
       
   291      * specified value set do not exist, this absence may be ignored
       
   292      * and the operation succeeds, or a NamingException may be thrown to
       
   293      * indicate the absence.
       
   294      * Removal of the last value will remove the attribute if the
       
   295      * attribute is required to have at least one value.
       
   296      * <p>
       
   297      * The value of this constant is <tt>3</tt>.
       
   298      *
       
   299      * @see ModificationItem
       
   300      * @see #modifyAttributes
       
   301      */
       
   302     public final static int REMOVE_ATTRIBUTE = 3;
       
   303 
       
   304     /**
       
   305      * Modifies the attributes associated with a named object.
       
   306      * The order of the modifications is not specified.  Where
       
   307      * possible, the modifications are performed atomically.
       
   308      *
       
   309      * @param name
       
   310      *          the name of the object whose attributes will be updated
       
   311      * @param mod_op
       
   312      *          the modification operation, one of:
       
   313      *                  <code>ADD_ATTRIBUTE</code>,
       
   314      *                  <code>REPLACE_ATTRIBUTE</code>,
       
   315      *                  <code>REMOVE_ATTRIBUTE</code>.
       
   316      * @param attrs
       
   317      *          the attributes to be used for the modification; may not be null
       
   318      *
       
   319      * @throws  AttributeModificationException if the modification cannot
       
   320      *          be completed successfully
       
   321      * @throws  NamingException if a naming exception is encountered
       
   322      *
       
   323      * @see #modifyAttributes(Name, ModificationItem[])
       
   324      */
       
   325     public void modifyAttributes(Name name, int mod_op, Attributes attrs)
       
   326             throws NamingException;
       
   327 
       
   328     /**
       
   329      * Modifies the attributes associated with a named object.
       
   330      * See {@link #modifyAttributes(Name, int, Attributes)} for details.
       
   331      *
       
   332      * @param name
       
   333      *          the name of the object whose attributes will be updated
       
   334      * @param mod_op
       
   335      *          the modification operation, one of:
       
   336      *                  <code>ADD_ATTRIBUTE</code>,
       
   337      *                  <code>REPLACE_ATTRIBUTE</code>,
       
   338      *                  <code>REMOVE_ATTRIBUTE</code>.
       
   339      * @param attrs
       
   340      *          the attributes to be used for the modification; may not be null
       
   341      *
       
   342      * @throws  AttributeModificationException if the modification cannot
       
   343      *          be completed successfully
       
   344      * @throws  NamingException if a naming exception is encountered
       
   345      */
       
   346     public void modifyAttributes(String name, int mod_op, Attributes attrs)
       
   347             throws NamingException;
       
   348 
       
   349     /**
       
   350      * Modifies the attributes associated with a named object using
       
   351      * an ordered list of modifications.
       
   352      * The modifications are performed
       
   353      * in the order specified.  Each modification specifies a
       
   354      * modification operation code and an attribute on which to
       
   355      * operate.  Where possible, the modifications are
       
   356      * performed atomically.
       
   357      *
       
   358      * @param name
       
   359      *          the name of the object whose attributes will be updated
       
   360      * @param mods
       
   361      *          an ordered sequence of modifications to be performed;
       
   362      *          may not be null
       
   363      *
       
   364      * @throws  AttributeModificationException if the modifications
       
   365      *          cannot be completed successfully
       
   366      * @throws  NamingException if a naming exception is encountered
       
   367      *
       
   368      * @see #modifyAttributes(Name, int, Attributes)
       
   369      * @see ModificationItem
       
   370      */
       
   371     public void modifyAttributes(Name name, ModificationItem[] mods)
       
   372             throws NamingException;
       
   373 
       
   374     /**
       
   375      * Modifies the attributes associated with a named object using
       
   376      * an ordered list of modifications.
       
   377      * See {@link #modifyAttributes(Name, ModificationItem[])} for details.
       
   378      *
       
   379      * @param name
       
   380      *          the name of the object whose attributes will be updated
       
   381      * @param mods
       
   382      *          an ordered sequence of modifications to be performed;
       
   383      *          may not be null
       
   384      *
       
   385      * @throws  AttributeModificationException if the modifications
       
   386      *          cannot be completed successfully
       
   387      * @throws  NamingException if a naming exception is encountered
       
   388      */
       
   389     public void modifyAttributes(String name, ModificationItem[] mods)
       
   390             throws NamingException;
       
   391 
       
   392     /**
       
   393      * Binds a name to an object, along with associated attributes.
       
   394      * If <tt>attrs</tt> is null, the resulting binding will have
       
   395      * the attributes associated with <tt>obj</tt> if <tt>obj</tt> is a
       
   396      * <tt>DirContext</tt>, and no attributes otherwise.
       
   397      * If <tt>attrs</tt> is non-null, the resulting binding will have
       
   398      * <tt>attrs</tt> as its attributes; any attributes associated with
       
   399      * <tt>obj</tt> are ignored.
       
   400      *
       
   401      * @param name
       
   402      *          the name to bind; may not be empty
       
   403      * @param obj
       
   404      *          the object to bind; possibly null
       
   405      * @param attrs
       
   406      *          the attributes to associate with the binding
       
   407      *
       
   408      * @throws  NameAlreadyBoundException if name is already bound
       
   409      * @throws  InvalidAttributesException if some "mandatory" attributes
       
   410      *          of the binding are not supplied
       
   411      * @throws  NamingException if a naming exception is encountered
       
   412      *
       
   413      * @see Context#bind(Name, Object)
       
   414      * @see #rebind(Name, Object, Attributes)
       
   415      */
       
   416     public void bind(Name name, Object obj, Attributes attrs)
       
   417             throws NamingException;
       
   418 
       
   419     /**
       
   420      * Binds a name to an object, along with associated attributes.
       
   421      * See {@link #bind(Name, Object, Attributes)} for details.
       
   422      *
       
   423      * @param name
       
   424      *          the name to bind; may not be empty
       
   425      * @param obj
       
   426      *          the object to bind; possibly null
       
   427      * @param attrs
       
   428      *          the attributes to associate with the binding
       
   429      *
       
   430      * @throws  NameAlreadyBoundException if name is already bound
       
   431      * @throws  InvalidAttributesException if some "mandatory" attributes
       
   432      *          of the binding are not supplied
       
   433      * @throws  NamingException if a naming exception is encountered
       
   434      */
       
   435     public void bind(String name, Object obj, Attributes attrs)
       
   436             throws NamingException;
       
   437 
       
   438     /**
       
   439      * Binds a name to an object, along with associated attributes,
       
   440      * overwriting any existing binding.
       
   441      * If <tt>attrs</tt> is null and <tt>obj</tt> is a <tt>DirContext</tt>,
       
   442      * the attributes from <tt>obj</tt> are used.
       
   443      * If <tt>attrs</tt> is null and <tt>obj</tt> is not a <tt>DirContext</tt>,
       
   444      * any existing attributes associated with the object already bound
       
   445      * in the directory remain unchanged.
       
   446      * If <tt>attrs</tt> is non-null, any existing attributes associated with
       
   447      * the object already bound in the directory are removed and <tt>attrs</tt>
       
   448      * is associated with the named object.  If <tt>obj</tt> is a
       
   449      * <tt>DirContext</tt> and <tt>attrs</tt> is non-null, the attributes
       
   450      * of <tt>obj</tt> are ignored.
       
   451      *
       
   452      * @param name
       
   453      *          the name to bind; may not be empty
       
   454      * @param obj
       
   455      *          the object to bind; possibly null
       
   456      * @param attrs
       
   457      *          the attributes to associate with the binding
       
   458      *
       
   459      * @throws  InvalidAttributesException if some "mandatory" attributes
       
   460      *          of the binding are not supplied
       
   461      * @throws  NamingException if a naming exception is encountered
       
   462      *
       
   463      * @see Context#bind(Name, Object)
       
   464      * @see #bind(Name, Object, Attributes)
       
   465      */
       
   466     public void rebind(Name name, Object obj, Attributes attrs)
       
   467             throws NamingException;
       
   468 
       
   469     /**
       
   470      * Binds a name to an object, along with associated attributes,
       
   471      * overwriting any existing binding.
       
   472      * See {@link #rebind(Name, Object, Attributes)} for details.
       
   473      *
       
   474      * @param name
       
   475      *          the name to bind; may not be empty
       
   476      * @param obj
       
   477      *          the object to bind; possibly null
       
   478      * @param attrs
       
   479      *          the attributes to associate with the binding
       
   480      *
       
   481      * @throws  InvalidAttributesException if some "mandatory" attributes
       
   482      *          of the binding are not supplied
       
   483      * @throws  NamingException if a naming exception is encountered
       
   484      */
       
   485     public void rebind(String name, Object obj, Attributes attrs)
       
   486             throws NamingException;
       
   487 
       
   488     /**
       
   489      * Creates and binds a new context, along with associated attributes.
       
   490      * This method creates a new subcontext with the given name, binds it in
       
   491      * the target context (that named by all but terminal atomic
       
   492      * component of the name), and associates the supplied attributes
       
   493      * with the newly created object.
       
   494      * All intermediate and target contexts must already exist.
       
   495      * If <tt>attrs</tt> is null, this method is equivalent to
       
   496      * <tt>Context.createSubcontext()</tt>.
       
   497      *
       
   498      * @param name
       
   499      *          the name of the context to create; may not be empty
       
   500      * @param attrs
       
   501      *          the attributes to associate with the newly created context
       
   502      * @return  the newly created context
       
   503      *
       
   504      * @throws  NameAlreadyBoundException if the name is already bound
       
   505      * @throws  InvalidAttributesException if <code>attrs</code> does not
       
   506      *          contain all the mandatory attributes required for creation
       
   507      * @throws  NamingException if a naming exception is encountered
       
   508      *
       
   509      * @see Context#createSubcontext(Name)
       
   510      */
       
   511     public DirContext createSubcontext(Name name, Attributes attrs)
       
   512             throws NamingException;
       
   513 
       
   514     /**
       
   515      * Creates and binds a new context, along with associated attributes.
       
   516      * See {@link #createSubcontext(Name, Attributes)} for details.
       
   517      *
       
   518      * @param name
       
   519      *          the name of the context to create; may not be empty
       
   520      * @param attrs
       
   521      *          the attributes to associate with the newly created context
       
   522      * @return  the newly created context
       
   523      *
       
   524      * @throws  NameAlreadyBoundException if the name is already bound
       
   525      * @throws  InvalidAttributesException if <code>attrs</code> does not
       
   526      *          contain all the mandatory attributes required for creation
       
   527      * @throws  NamingException if a naming exception is encountered
       
   528      */
       
   529     public DirContext createSubcontext(String name, Attributes attrs)
       
   530             throws NamingException;
       
   531 
       
   532 // -------------------- schema operations
       
   533 
       
   534     /**
       
   535      * Retrieves the schema associated with the named object.
       
   536      * The schema describes rules regarding the structure of the namespace
       
   537      * and the attributes stored within it.  The schema
       
   538      * specifies what types of objects can be added to the directory and where
       
   539      * they can be added; what mandatory and optional attributes an object
       
   540      * can have. The range of support for schemas is directory-specific.
       
   541      *
       
   542      * <p> This method returns the root of the schema information tree
       
   543      * that is applicable to the named object. Several named objects
       
   544      * (or even an entire directory) might share the same schema.
       
   545      *
       
   546      * <p> Issues such as structure and contents of the schema tree,
       
   547      * permission to modify to the contents of the schema
       
   548      * tree, and the effect of such modifications on the directory
       
   549      * are dependent on the underlying directory.
       
   550      *
       
   551      * @param name
       
   552      *          the name of the object whose schema is to be retrieved
       
   553      * @return  the schema associated with the context; never null
       
   554      * @throws  OperationNotSupportedException if schema not supported
       
   555      * @throws  NamingException if a naming exception is encountered
       
   556      */
       
   557     public DirContext getSchema(Name name) throws NamingException;
       
   558 
       
   559     /**
       
   560      * Retrieves the schema associated with the named object.
       
   561      * See {@link #getSchema(Name)} for details.
       
   562      *
       
   563      * @param name
       
   564      *          the name of the object whose schema is to be retrieved
       
   565      * @return  the schema associated with the context; never null
       
   566      * @throws  OperationNotSupportedException if schema not supported
       
   567      * @throws  NamingException if a naming exception is encountered
       
   568      */
       
   569     public DirContext getSchema(String name) throws NamingException;
       
   570 
       
   571     /**
       
   572      * Retrieves a context containing the schema objects of the
       
   573      * named object's class definitions.
       
   574      *<p>
       
   575      * One category of information found in directory schemas is
       
   576      * <em>class definitions</em>.  An "object class" definition
       
   577      * specifies the object's <em>type</em> and what attributes (mandatory
       
   578      * and optional) the object must/can have. Note that the term
       
   579      * "object class" being referred to here is in the directory sense
       
   580      * rather than in the Java sense.
       
   581      * For example, if the named object is a directory object of
       
   582      * "Person" class, <tt>getSchemaClassDefinition()</tt> would return a
       
   583      * <tt>DirContext</tt> representing the (directory's) object class
       
   584      * definition of "Person".
       
   585      *<p>
       
   586      * The information that can be retrieved from an object class definition
       
   587      * is directory-dependent.
       
   588      *<p>
       
   589      * Prior to JNDI 1.2, this method
       
   590      * returned a single schema object representing the class definition of
       
   591      * the named object.
       
   592      * Since JNDI 1.2, this method returns a <tt>DirContext</tt> containing
       
   593      * all of the named object's class definitions.
       
   594      *
       
   595      * @param name
       
   596      *          the name of the object whose object class
       
   597      *          definition is to be retrieved
       
   598      * @return  the <tt>DirContext</tt> containing the named
       
   599      *          object's class definitions; never null
       
   600      *
       
   601      * @throws  OperationNotSupportedException if schema not supported
       
   602      * @throws  NamingException if a naming exception is encountered
       
   603      */
       
   604     public DirContext getSchemaClassDefinition(Name name)
       
   605             throws NamingException;
       
   606 
       
   607     /**
       
   608      * Retrieves a context containing the schema objects of the
       
   609      * named object's class definitions.
       
   610      * See {@link #getSchemaClassDefinition(Name)} for details.
       
   611      *
       
   612      * @param name
       
   613      *          the name of the object whose object class
       
   614      *          definition is to be retrieved
       
   615      * @return  the <tt>DirContext</tt> containing the named
       
   616      *          object's class definitions; never null
       
   617      *
       
   618      * @throws  OperationNotSupportedException if schema not supported
       
   619      * @throws  NamingException if a naming exception is encountered
       
   620      */
       
   621     public DirContext getSchemaClassDefinition(String name)
       
   622             throws NamingException;
       
   623 
       
   624 // -------------------- search operations
       
   625 
       
   626     /**
       
   627      * Searches in a single context for objects that contain a
       
   628      * specified set of attributes, and retrieves selected attributes.
       
   629      * The search is performed using the default
       
   630      * <code>SearchControls</code> settings.
       
   631      * <p>
       
   632      * For an object to be selected, each attribute in
       
   633      * <code>matchingAttributes</code> must match some attribute of the
       
   634      * object.  If <code>matchingAttributes</code> is empty or
       
   635      * null, all objects in the target context are returned.
       
   636      *<p>
       
   637      * An attribute <em>A</em><sub>1</sub> in
       
   638      * <code>matchingAttributes</code> is considered to match an
       
   639      * attribute <em>A</em><sub>2</sub> of an object if
       
   640      * <em>A</em><sub>1</sub> and <em>A</em><sub>2</sub> have the same
       
   641      * identifier, and each value of <em>A</em><sub>1</sub> is equal
       
   642      * to some value of <em>A</em><sub>2</sub>.  This implies that the
       
   643      * order of values is not significant, and that
       
   644      * <em>A</em><sub>2</sub> may contain "extra" values not found in
       
   645      * <em>A</em><sub>1</sub> without affecting the comparison.  It
       
   646      * also implies that if <em>A</em><sub>1</sub> has no values, then
       
   647      * testing for a match is equivalent to testing for the presence
       
   648      * of an attribute <em>A</em><sub>2</sub> with the same
       
   649      * identifier.
       
   650      *<p>
       
   651      * The precise definition of "equality" used in comparing attribute values
       
   652      * is defined by the underlying directory service.  It might use the
       
   653      * <code>Object.equals</code> method, for example, or might use a schema
       
   654      * to specify a different equality operation.
       
   655      * For matching based on operations other than equality (such as
       
   656      * substring comparison) use the version of the <code>search</code>
       
   657      * method that takes a filter argument.
       
   658      * <p>
       
   659      * When changes are made to this <tt>DirContext</tt>,
       
   660      * the effect on enumerations returned by prior calls to this method
       
   661      * is undefined.
       
   662      *<p>
       
   663      * If the object does not have the attribute
       
   664      * specified, the directory will ignore the nonexistent attribute
       
   665      * and return the requested attributes that the object does have.
       
   666      *<p>
       
   667      * A directory might return more attributes than was requested
       
   668      * (see <strong>Attribute Type Names</strong> in the class description),
       
   669      * but is not allowed to return arbitrary, unrelated attributes.
       
   670      *<p>
       
   671      * See also <strong>Operational Attributes</strong> in the class
       
   672      * description.
       
   673      *
       
   674      * @param name
       
   675      *          the name of the context to search
       
   676      * @param matchingAttributes
       
   677      *          the attributes to search for.  If empty or null,
       
   678      *          all objects in the target context are returned.
       
   679      * @param attributesToReturn
       
   680      *          the attributes to return.  null indicates that
       
   681      *          all attributes are to be returned;
       
   682      *          an empty array indicates that none are to be returned.
       
   683      * @return
       
   684      *          a non-null enumeration of <tt>SearchResult</tt> objects.
       
   685      *          Each <tt>SearchResult</tt> contains the attributes
       
   686      *          identified by <code>attributesToReturn</code>
       
   687      *          and the name of the corresponding object, named relative
       
   688      *          to the context named by <code>name</code>.
       
   689      * @throws  NamingException if a naming exception is encountered
       
   690      *
       
   691      * @see SearchControls
       
   692      * @see SearchResult
       
   693      * @see #search(Name, String, Object[], SearchControls)
       
   694      */
       
   695     public NamingEnumeration<SearchResult>
       
   696         search(Name name,
       
   697                Attributes matchingAttributes,
       
   698                String[] attributesToReturn)
       
   699         throws NamingException;
       
   700 
       
   701     /**
       
   702      * Searches in a single context for objects that contain a
       
   703      * specified set of attributes, and retrieves selected attributes.
       
   704      * See {@link #search(Name, Attributes, String[])} for details.
       
   705      *
       
   706      * @param name
       
   707      *          the name of the context to search
       
   708      * @param matchingAttributes
       
   709      *          the attributes to search for
       
   710      * @param attributesToReturn
       
   711      *          the attributes to return
       
   712      * @return  a non-null enumeration of <tt>SearchResult</tt> objects
       
   713      * @throws  NamingException if a naming exception is encountered
       
   714      */
       
   715     public NamingEnumeration<SearchResult>
       
   716         search(String name,
       
   717                Attributes matchingAttributes,
       
   718                String[] attributesToReturn)
       
   719         throws NamingException;
       
   720 
       
   721     /**
       
   722      * Searches in a single context for objects that contain a
       
   723      * specified set of attributes.
       
   724      * This method returns all the attributes of such objects.
       
   725      * It is equivalent to supplying null as
       
   726      * the <tt>atributesToReturn</tt> parameter to the method
       
   727      * <code>search(Name, Attributes, String[])</code>.
       
   728      * <br>
       
   729      * See {@link #search(Name, Attributes, String[])} for a full description.
       
   730      *
       
   731      * @param name
       
   732      *          the name of the context to search
       
   733      * @param matchingAttributes
       
   734      *          the attributes to search for
       
   735      * @return  an enumeration of <tt>SearchResult</tt> objects
       
   736      * @throws  NamingException if a naming exception is encountered
       
   737      *
       
   738      * @see #search(Name, Attributes, String[])
       
   739      */
       
   740     public NamingEnumeration<SearchResult>
       
   741         search(Name name, Attributes matchingAttributes)
       
   742         throws NamingException;
       
   743 
       
   744     /**
       
   745      * Searches in a single context for objects that contain a
       
   746      * specified set of attributes.
       
   747      * See {@link #search(Name, Attributes)} for details.
       
   748      *
       
   749      * @param name
       
   750      *          the name of the context to search
       
   751      * @param matchingAttributes
       
   752      *          the attributes to search for
       
   753      * @return  an enumeration of <tt>SearchResult</tt> objects
       
   754      * @throws  NamingException if a naming exception is encountered
       
   755      */
       
   756     public NamingEnumeration<SearchResult>
       
   757         search(String name, Attributes matchingAttributes)
       
   758         throws NamingException;
       
   759 
       
   760     /**
       
   761      * Searches in the named context or object for entries that satisfy the
       
   762      * given search filter.  Performs the search as specified by
       
   763      * the search controls.
       
   764      * <p>
       
   765      * The format and interpretation of <code>filter</code> follows RFC 2254
       
   766      * with the
       
   767      * following interpretations for <code>attr</code> and <code>value</code>
       
   768      * mentioned in the RFC.
       
   769      * <p>
       
   770      * <code>attr</code> is the attribute's identifier.
       
   771      * <p>
       
   772      * <code>value</code> is the string representation the attribute's value.
       
   773      * The translation of this string representation into the attribute's value
       
   774      * is directory-specific.
       
   775      * <p>
       
   776      * For the assertion "someCount=127", for example, <code>attr</code>
       
   777      * is "someCount" and <code>value</code> is "127".
       
   778      * The provider determines, based on the attribute ID ("someCount")
       
   779      * (and possibly its schema), that the attribute's value is an integer.
       
   780      * It then parses the string "127" appropriately.
       
   781      *<p>
       
   782      * Any non-ASCII characters in the filter string should be
       
   783      * represented by the appropriate Java (Unicode) characters, and
       
   784      * not encoded as UTF-8 octets.  Alternately, the
       
   785      * "backslash-hexcode" notation described in RFC 2254 may be used.
       
   786      *<p>
       
   787      * If the directory does not support a string representation of
       
   788      * some or all of its attributes, the form of <code>search</code> that
       
   789      * accepts filter arguments in the form of Objects can be used instead.
       
   790      * The service provider for such a directory would then translate
       
   791      * the filter arguments to its service-specific representation
       
   792      * for filter evaluation.
       
   793      * See <code>search(Name, String, Object[], SearchControls)</code>.
       
   794      * <p>
       
   795      * RFC 2254 defines certain operators for the filter, including substring
       
   796      * matches, equality, approximate match, greater than, less than.  These
       
   797      * operators are mapped to operators with corresponding semantics in the
       
   798      * underlying directory. For example, for the equals operator, suppose
       
   799      * the directory has a matching rule defining "equality" of the
       
   800      * attributes in the filter. This rule would be used for checking
       
   801      * equality of the attributes specified in the filter with the attributes
       
   802      * of objects in the directory. Similarly, if the directory has a
       
   803      * matching rule for ordering, this rule would be used for
       
   804      * making "greater than" and "less than" comparisons.
       
   805      *<p>
       
   806      * Not all of the operators defined in RFC 2254 are applicable to all
       
   807      * attributes.  When an operator is not applicable, the exception
       
   808      * <code>InvalidSearchFilterException</code> is thrown.
       
   809      * <p>
       
   810      * The result is returned in an enumeration of <tt>SearchResult</tt>s.
       
   811      * Each <tt>SearchResult</tt> contains the name of the object
       
   812      * and other information about the object (see SearchResult).
       
   813      * The name is either relative to the target context of the search
       
   814      * (which is named by the <code>name</code> parameter), or
       
   815      * it is a URL string. If the target context is included in
       
   816      * the enumeration (as is possible when
       
   817      * <code>cons</code> specifies a search scope of
       
   818      * <code>SearchControls.OBJECT_SCOPE</code> or
       
   819      * <code>SearchControls.SUBSTREE_SCOPE</code>), its name is the empty
       
   820      * string. The <tt>SearchResult</tt> may also contain attributes of the
       
   821      * matching object if the <tt>cons</tt> argument specified that attributes
       
   822      * be returned.
       
   823      *<p>
       
   824      * If the object does not have a requested attribute, that
       
   825      * nonexistent attribute will be ignored.  Those requested
       
   826      * attributes that the object does have will be returned.
       
   827      *<p>
       
   828      * A directory might return more attributes than were requested
       
   829      * (see <strong>Attribute Type Names</strong> in the class description)
       
   830      * but is not allowed to return arbitrary, unrelated attributes.
       
   831      *<p>
       
   832      * See also <strong>Operational Attributes</strong> in the class
       
   833      * description.
       
   834      *
       
   835      * @param name
       
   836      *          the name of the context or object to search
       
   837      * @param filter
       
   838      *          the filter expression to use for the search; may not be null
       
   839      * @param cons
       
   840      *          the search controls that control the search.  If null,
       
   841      *          the default search controls are used (equivalent
       
   842      *          to <tt>(new SearchControls())</tt>).
       
   843      * @return  an enumeration of <tt>SearchResult</tt>s of
       
   844      *          the objects that satisfy the filter; never null
       
   845      *
       
   846      * @throws  InvalidSearchFilterException if the search filter specified is
       
   847      *          not supported or understood by the underlying directory
       
   848      * @throws  InvalidSearchControlsException if the search controls
       
   849      *          contain invalid settings
       
   850      * @throws  NamingException if a naming exception is encountered
       
   851      *
       
   852      * @see #search(Name, String, Object[], SearchControls)
       
   853      * @see SearchControls
       
   854      * @see SearchResult
       
   855      */
       
   856     public NamingEnumeration<SearchResult>
       
   857         search(Name name,
       
   858                String filter,
       
   859                SearchControls cons)
       
   860         throws NamingException;
       
   861 
       
   862     /**
       
   863      * Searches in the named context or object for entries that satisfy the
       
   864      * given search filter.  Performs the search as specified by
       
   865      * the search controls.
       
   866      * See {@link #search(Name, String, SearchControls)} for details.
       
   867      *
       
   868      * @param name
       
   869      *          the name of the context or object to search
       
   870      * @param filter
       
   871      *          the filter expression to use for the search; may not be null
       
   872      * @param cons
       
   873      *          the search controls that control the search.  If null,
       
   874      *          the default search controls are used (equivalent
       
   875      *          to <tt>(new SearchControls())</tt>).
       
   876      *
       
   877      * @return  an enumeration of <tt>SearchResult</tt>s for
       
   878      *          the objects that satisfy the filter.
       
   879      * @throws  InvalidSearchFilterException if the search filter specified is
       
   880      *          not supported or understood by the underlying directory
       
   881      * @throws  InvalidSearchControlsException if the search controls
       
   882      *          contain invalid settings
       
   883      * @throws  NamingException if a naming exception is encountered
       
   884      */
       
   885     public NamingEnumeration<SearchResult>
       
   886         search(String name,
       
   887                String filter,
       
   888                SearchControls cons)
       
   889         throws NamingException;
       
   890 
       
   891     /**
       
   892      * Searches in the named context or object for entries that satisfy the
       
   893      * given search filter.  Performs the search as specified by
       
   894      * the search controls.
       
   895      *<p>
       
   896      * The interpretation of <code>filterExpr</code> is based on RFC
       
   897      * 2254.  It may additionally contain variables of the form
       
   898      * <code>{i}</code> -- where <code>i</code> is an integer -- that
       
   899      * refer to objects in the <code>filterArgs</code> array.  The
       
   900      * interpretation of <code>filterExpr</code> is otherwise
       
   901      * identical to that of the <code>filter</code> parameter of the
       
   902      * method <code>search(Name, String, SearchControls)</code>.
       
   903      *<p>
       
   904      * When a variable <code>{i}</code> appears in a search filter, it
       
   905      * indicates that the filter argument <code>filterArgs[i]</code>
       
   906      * is to be used in that place.  Such variables may be used
       
   907      * wherever an <em>attr</em>, <em>value</em>, or
       
   908      * <em>matchingrule</em> production appears in the filter grammar
       
   909      * of RFC 2254, section 4.  When a string-valued filter argument
       
   910      * is substituted for a variable, the filter is interpreted as if
       
   911      * the string were given in place of the variable, with any
       
   912      * characters having special significance within filters (such as
       
   913      * <code>'*'</code>) having been escaped according to the rules of
       
   914      * RFC 2254.
       
   915      *<p>
       
   916      * For directories that do not use a string representation for
       
   917      * some or all of their attributes, the filter argument
       
   918      * corresponding to an attribute value may be of a type other than
       
   919      * String.  Directories that support unstructured binary-valued
       
   920      * attributes, for example, should accept byte arrays as filter
       
   921      * arguments.  The interpretation (if any) of filter arguments of
       
   922      * any other type is determined by the service provider for that
       
   923      * directory, which maps the filter operations onto operations with
       
   924      * corresponding semantics in the underlying directory.
       
   925      *<p>
       
   926      * This method returns an enumeration of the results.
       
   927      * Each element in the enumeration contains the name of the object
       
   928      * and other information about the object (see <code>SearchResult</code>).
       
   929      * The name is either relative to the target context of the search
       
   930      * (which is named by the <code>name</code> parameter), or
       
   931      * it is a URL string. If the target context is included in
       
   932      * the enumeration (as is possible when
       
   933      * <code>cons</code> specifies a search scope of
       
   934      * <code>SearchControls.OBJECT_SCOPE</code> or
       
   935      * <code>SearchControls.SUBSTREE_SCOPE</code>),
       
   936      * its name is the empty string.
       
   937      *<p>
       
   938      * The <tt>SearchResult</tt> may also contain attributes of the matching
       
   939      * object if the <tt>cons</tt> argument specifies that attributes be
       
   940      * returned.
       
   941      *<p>
       
   942      * If the object does not have a requested attribute, that
       
   943      * nonexistent attribute will be ignored.  Those requested
       
   944      * attributes that the object does have will be returned.
       
   945      *<p>
       
   946      * A directory might return more attributes than were requested
       
   947      * (see <strong>Attribute Type Names</strong> in the class description)
       
   948      * but is not allowed to return arbitrary, unrelated attributes.
       
   949      *<p>
       
   950      * If a search filter with invalid variable substitutions is provided
       
   951      * to this method, the result is undefined.
       
   952      * When changes are made to this DirContext,
       
   953      * the effect on enumerations returned by prior calls to this method
       
   954      * is undefined.
       
   955      *<p>
       
   956      * See also <strong>Operational Attributes</strong> in the class
       
   957      * description.
       
   958      *
       
   959      * @param name
       
   960      *          the name of the context or object to search
       
   961      * @param filterExpr
       
   962      *          the filter expression to use for the search.
       
   963      *          The expression may contain variables of the
       
   964      *          form "<code>{i}</code>" where <code>i</code>
       
   965      *          is a nonnegative integer.  May not be null.
       
   966      * @param filterArgs
       
   967      *          the array of arguments to substitute for the variables
       
   968      *          in <code>filterExpr</code>.  The value of
       
   969      *          <code>filterArgs[i]</code> will replace each
       
   970      *          occurrence of "<code>{i}</code>".
       
   971      *          If null, equivalent to an empty array.
       
   972      * @param cons
       
   973      *          the search controls that control the search.  If null,
       
   974      *          the default search controls are used (equivalent
       
   975      *          to <tt>(new SearchControls())</tt>).
       
   976      * @return  an enumeration of <tt>SearchResult</tt>s of the objects
       
   977      *          that satisfy the filter; never null
       
   978      *
       
   979      * @throws  ArrayIndexOutOfBoundsException if <tt>filterExpr</tt> contains
       
   980      *          <code>{i}</code> expressions where <code>i</code> is outside
       
   981      *          the bounds of the array <code>filterArgs</code>
       
   982      * @throws  InvalidSearchControlsException if <tt>cons</tt> contains
       
   983      *          invalid settings
       
   984      * @throws  InvalidSearchFilterException if <tt>filterExpr</tt> with
       
   985      *          <tt>filterArgs</tt> represents an invalid search filter
       
   986      * @throws  NamingException if a naming exception is encountered
       
   987      *
       
   988      * @see #search(Name, Attributes, String[])
       
   989      * @see java.text.MessageFormat
       
   990      */
       
   991     public NamingEnumeration<SearchResult>
       
   992         search(Name name,
       
   993                String filterExpr,
       
   994                Object[] filterArgs,
       
   995                SearchControls cons)
       
   996         throws NamingException;
       
   997 
       
   998     /**
       
   999      * Searches in the named context or object for entries that satisfy the
       
  1000      * given search filter.  Performs the search as specified by
       
  1001      * the search controls.
       
  1002      * See {@link #search(Name, String, Object[], SearchControls)} for details.
       
  1003      *
       
  1004      * @param name
       
  1005      *          the name of the context or object to search
       
  1006      * @param filterExpr
       
  1007      *          the filter expression to use for the search.
       
  1008      *          The expression may contain variables of the
       
  1009      *          form "<code>{i}</code>" where <code>i</code>
       
  1010      *          is a nonnegative integer.  May not be null.
       
  1011      * @param filterArgs
       
  1012      *          the array of arguments to substitute for the variables
       
  1013      *          in <code>filterExpr</code>.  The value of
       
  1014      *          <code>filterArgs[i]</code> will replace each
       
  1015      *          occurrence of "<code>{i}</code>".
       
  1016      *          If null, equivalent to an empty array.
       
  1017      * @param cons
       
  1018      *          the search controls that control the search.  If null,
       
  1019      *          the default search controls are used (equivalent
       
  1020      *          to <tt>(new SearchControls())</tt>).
       
  1021      * @return  an enumeration of <tt>SearchResult</tt>s of the objects
       
  1022      *          that satisfy the filter; never null
       
  1023      *
       
  1024      * @throws  ArrayIndexOutOfBoundsException if <tt>filterExpr</tt> contains
       
  1025      *          <code>{i}</code> expressions where <code>i</code> is outside
       
  1026      *          the bounds of the array <code>filterArgs</code>
       
  1027      * @throws  InvalidSearchControlsException if <tt>cons</tt> contains
       
  1028      *          invalid settings
       
  1029      * @throws  InvalidSearchFilterException if <tt>filterExpr</tt> with
       
  1030      *          <tt>filterArgs</tt> represents an invalid search filter
       
  1031      * @throws  NamingException if a naming exception is encountered
       
  1032      */
       
  1033     public NamingEnumeration<SearchResult>
       
  1034         search(String name,
       
  1035                String filterExpr,
       
  1036                Object[] filterArgs,
       
  1037                SearchControls cons)
       
  1038         throws NamingException;
       
  1039 }