1 /*
2  * Copyright (c) 1999, 2019, Oracle and/or its affiliates. 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.  Oracle designates this
8  * particular file as subject to the "Classpath" exception as provided
9  * by Oracle 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22  * or visit www.oracle.com if you need additional information or have any
23  * 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  *
35  * <h2>Names</h2>
36  * Each name passed as an argument to a {@code DirContext} 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 {@code Context} for a discussion on the interpretation of the
51  * name argument to the {@code Context} methods. These same rules
52  * apply to the name argument to the {@code DirContext} methods.
53  *
54  * <h2>Attribute Models</h2>
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  *
84  * <h2>Attribute Type Names</h2>
85  * In the {@code getAttributes()} and {@code search()} 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  *
116  *<h2>Operational Attributes</h2>
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 {@code getAttributes()} and {@code search()} methods,
124  * you can specify that all attributes associated with the requested objects
125  * be returned by supply {@code null} 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  *
130  * <h2>Named Context</h2>
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  *
141  *<h2>Parameters</h2>
142  *<p>
143  * An {@code Attributes}, {@code SearchControls}, 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 {@code Attributes} object returned by any method is owned by
150  * the caller.  The caller may subsequently modify it; the service
151  * provider will not.
152  *
153  *<h2>Exceptions</h2>
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      */
getAttributes(Name name)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      */
getAttributes(String name)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      */
getAttributes(Name name, String[] attrIds)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      */
getAttributes(String name, String[] attrIds)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 {@code 1}.
258      *
259      * @see ModificationItem
260      * @see #modifyAttributes
261      */
262     public static final 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 {@code 2}.
277      *
278      * @see ModificationItem
279      * @see #modifyAttributes
280      */
281     public static final 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 {@code 3}.
298      *
299      * @see ModificationItem
300      * @see #modifyAttributes
301      */
302     public static final 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      */
modifyAttributes(Name name, int mod_op, Attributes attrs)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      */
modifyAttributes(String name, int mod_op, Attributes attrs)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      */
modifyAttributes(Name name, ModificationItem[] mods)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      */
modifyAttributes(String name, ModificationItem[] mods)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 {@code attrs} is null, the resulting binding will have
395      * the attributes associated with {@code obj} if {@code obj} is a
396      * {@code DirContext}, and no attributes otherwise.
397      * If {@code attrs} is non-null, the resulting binding will have
398      * {@code attrs} as its attributes; any attributes associated with
399      * {@code obj} 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      */
bind(Name name, Object obj, Attributes attrs)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      */
bind(String name, Object obj, Attributes attrs)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 {@code attrs} is null and {@code obj} is a {@code DirContext},
442      * the attributes from {@code obj} are used.
443      * If {@code attrs} is null and {@code obj} is not a {@code DirContext},
444      * any existing attributes associated with the object already bound
445      * in the directory remain unchanged.
446      * If {@code attrs} is non-null, any existing attributes associated with
447      * the object already bound in the directory are removed and {@code attrs}
448      * is associated with the named object.  If {@code obj} is a
449      * {@code DirContext} and {@code attrs} is non-null, the attributes
450      * of {@code obj} 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      */
rebind(Name name, Object obj, Attributes attrs)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      */
rebind(String name, Object obj, Attributes attrs)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 {@code attrs} is null, this method is equivalent to
496      * {@code Context.createSubcontext()}.
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      */
createSubcontext(Name name, Attributes attrs)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      */
createSubcontext(String name, Attributes attrs)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      */
getSchema(Name name)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      */
getSchema(String name)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, {@code getSchemaClassDefinition()} would return a
583      * {@code DirContext} 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 {@code DirContext} 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 {@code DirContext} 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      */
getSchemaClassDefinition(Name name)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 {@code DirContext} 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      */
getSchemaClassDefinition(String name)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 {@code DirContext},
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 {@code SearchResult} objects.
685      *          Each {@code SearchResult} 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>
search(Name name, Attributes matchingAttributes, String[] attributesToReturn)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 {@code SearchResult} objects
713      * @throws  NamingException if a naming exception is encountered
714      */
715     public NamingEnumeration<SearchResult>
search(String name, Attributes matchingAttributes, String[] attributesToReturn)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 {@code attributesToReturn} 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 {@code SearchResult} objects
736      * @throws  NamingException if a naming exception is encountered
737      *
738      * @see #search(Name, Attributes, String[])
739      */
740     public NamingEnumeration<SearchResult>
search(Name name, Attributes matchingAttributes)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 {@code SearchResult} objects
754      * @throws  NamingException if a naming exception is encountered
755      */
756     public NamingEnumeration<SearchResult>
search(String name, Attributes matchingAttributes)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 {@code SearchResult}s.
811      * Each {@code SearchResult} 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 {@code SearchResult} may also contain attributes of the
821      * matching object if the {@code cons} 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 {@code (new SearchControls())}).
843      * @return  an enumeration of {@code SearchResult}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>
search(Name name, String filter, SearchControls cons)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 {@code (new SearchControls())}).
876      *
877      * @return  an enumeration of {@code SearchResult}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>
search(String name, String filter, SearchControls cons)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 {@code SearchResult} may also contain attributes of the matching
939      * object if the {@code cons} 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 {@code (new SearchControls())}).
976      * @return  an enumeration of {@code SearchResult}s of the objects
977      *          that satisfy the filter; never null
978      *
979      * @throws  ArrayIndexOutOfBoundsException if {@code filterExpr} 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 {@code cons} contains
983      *          invalid settings
984      * @throws  InvalidSearchFilterException if {@code filterExpr} with
985      *          {@code filterArgs} 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>
search(Name name, String filterExpr, Object[] filterArgs, SearchControls cons)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 {@code (new SearchControls())}).
1021      * @return  an enumeration of {@code SearchResult}s of the objects
1022      *          that satisfy the filter; never null
1023      *
1024      * @throws  ArrayIndexOutOfBoundsException if {@code filterExpr} 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 {@code cons} contains
1028      *          invalid settings
1029      * @throws  InvalidSearchFilterException if {@code filterExpr} with
1030      *          {@code filterArgs} represents an invalid search filter
1031      * @throws  NamingException if a naming exception is encountered
1032      */
1033     public NamingEnumeration<SearchResult>
search(String name, String filterExpr, Object[] filterArgs, SearchControls cons)1034         search(String name,
1035                String filterExpr,
1036                Object[] filterArgs,
1037                SearchControls cons)
1038         throws NamingException;
1039 }
1040