/*
* Copyright (c) 1999, 2019, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
package javax.naming.directory;
import javax.naming.*;
/**
* The directory service interface, containing
* methods for examining and updating attributes
* associated with objects, and for searching the directory.
*
* <h2>Names</h2>
* Each name passed as an argument to a {@code DirContext} method is relative
* to that context. The empty name is used to name the context itself.
* The name parameter may never be null.
* <p>
* Most of the methods have overloaded versions with one taking a
* <code>Name</code> parameter and one taking a <code>String</code>.
* These overloaded versions are equivalent in that if
* the <code>Name</code> and <code>String</code> parameters are just
* different representations of the same name, then the overloaded
* versions of the same methods behave the same.
* In the method descriptions below, only one version is documented.
* The second version instead has a link to the first: the same
* documentation applies to both.
* <p>
* See {@code Context} for a discussion on the interpretation of the
* name argument to the {@code Context} methods. These same rules
* apply to the name argument to the {@code DirContext} methods.
*
* <h2>Attribute Models</h2>
* There are two basic models of what attributes should be
* associated with. First, attributes may be directly associated with a
* DirContext object.
* In this model, an attribute operation on the named object is
* roughly equivalent
* to a lookup on the name (which returns the DirContext object),
* followed by the attribute operation invoked on the DirContext object
* in which the caller supplies an empty name. The attributes can be viewed
* as being stored along with the object (note that this does not imply that
* the implementation must do so).
* <p>
* The second model is that attributes are associated with a
* name (typically an atomic name) in a DirContext.
* In this model, an attribute operation on the named object is
* roughly equivalent to a lookup on the name of the parent DirContext of the
* named object, followed by the attribute operation invoked on the parent
* in which the caller supplies the terminal atomic name.
* The attributes can be viewed as being stored in the parent DirContext
* (again, this does not imply that the implementation must do so).
* Objects that are not DirContexts can have attributes, as long as
* their parents are DirContexts.
* <p>
* JNDI support both of these models.
* It is up to the individual service providers to decide where to
* "store" attributes.
* JNDI clients are safest when they do not make assumptions about
* whether an object's attributes are stored as part of the object, or stored
* within the parent object and associated with the object's name.
*
* <h2>Attribute Type Names</h2>
* In the {@code getAttributes()} and {@code search()} methods,
* you can supply the attributes to return by supplying a list of
* attribute names (strings).
* The attributes that you get back might not have the same names as the
* attribute names you have specified. This is because some directories
* support features that cause them to return other attributes. Such
* features include attribute subclassing, attribute name synonyms, and
* attribute language codes.
* <p>
* In attribute subclassing, attributes are defined in a class hierarchy.
* In some directories, for example, the "name" attribute might be the
* superclass of all name-related attributes, including "commonName" and
* "surName". Asking for the "name" attribute might return both the
* "commonName" and "surName" attributes.
* <p>
* With attribute type synonyms, a directory can assign multiple names to
* the same attribute. For example, "cn" and "commonName" might both
* refer to the same attribute. Asking for "cn" might return the
* "commonName" attribute.
* <p>
* Some directories support the language codes for attributes.
* Asking such a directory for the "description" attribute, for example,
* might return all of the following attributes:
* <ul>
* <li>description
* <li>description;lang-en
* <li>description;lang-de
* <li>description;lang-fr
* </ul>
*
*
*<h2>Operational Attributes</h2>
*<p>
* Some directories have the notion of "operational attributes" which are
* attributes associated with a directory object for administrative
* purposes. An example of operational attributes is the access control
* list for an object.
* <p>
* In the {@code getAttributes()} and {@code search()} methods,
* you can specify that all attributes associated with the requested objects
* be returned by supply {@code null} as the list of attributes to return.
* The attributes returned do <em>not</em> include operational attributes.
* In order to retrieve operational attributes, you must name them explicitly.
*
*
* <h2>Named Context</h2>
* <p>
* There are certain methods in which the name must resolve to a context
* (for example, when searching a single level context). The documentation
* of such methods
* use the term <em>named context</em> to describe their name parameter.
* For these methods, if the named object is not a DirContext,
* <code>NotContextException</code> is thrown.
* Aside from these methods, there is no requirement that the
* <em>named object</em> be a DirContext.
*
*<h2>Parameters</h2>
*<p>
* An {@code Attributes}, {@code SearchControls}, or array object
* passed as a parameter to any method will not be modified by the
* service provider. The service provider may keep a reference to it
* for the duration of the operation, including any enumeration of the
* method's results and the processing of any referrals generated.
* The caller should not modify the object during this time.
* An {@code Attributes} object returned by any method is owned by
* the caller. The caller may subsequently modify it; the service
* provider will not.
*
*<h2>Exceptions</h2>
*<p>
* All the methods in this interface can throw a NamingException or
* any of its subclasses. See NamingException and their subclasses
* for details on each exception.
*
* @author Rosanna Lee
* @author Scott Seligman
* @author R. Vasudevan
*
* @see javax.naming.Context
* @since 1.3
*/
public interface DirContext extends Context {
/**
* Retrieves all of the attributes associated with a named object.
* See the class description regarding attribute models, attribute
* type names, and operational attributes.
*
* @param name
* the name of the object from which to retrieve attributes
* @return the set of attributes associated with <code>name</code>.
* Returns an empty attribute set if name has no attributes;
* never null.
* @throws NamingException if a naming exception is encountered
*
* @see #getAttributes(String)
* @see #getAttributes(Name, String[])
*/
public Attributes getAttributes(Name name) throws NamingException;
/**
* Retrieves all of the attributes associated with a named object.
* See {@link #getAttributes(Name)} for details.
*
* @param name
* the name of the object from which to retrieve attributes
* @return the set of attributes associated with <code>name</code>
*
* @throws NamingException if a naming exception is encountered
*/
public Attributes getAttributes(String name) throws NamingException;
/**
* Retrieves selected attributes associated with a named object.
* See the class description regarding attribute models, attribute
* type names, and operational attributes.
*
* <p> If the object does not have an attribute
* specified, the directory will ignore the nonexistent attribute
* and return those requested attributes that the object does have.
*
* <p> A directory might return more attributes than was requested
* (see <strong>Attribute Type Names</strong> in the class description),
* but is not allowed to return arbitrary, unrelated attributes.
*
* <p> See also <strong>Operational Attributes</strong> in the class
* description.
*
* @param name
* the name of the object from which to retrieve attributes
* @param attrIds
* the identifiers of the attributes to retrieve.
* null indicates that all attributes should be retrieved;
* an empty array indicates that none should be retrieved.
* @return the requested attributes; never null
*
* @throws NamingException if a naming exception is encountered
*/
public Attributes getAttributes(Name name, String[] attrIds)
throws NamingException;
/**
* Retrieves selected attributes associated with a named object.
* See {@link #getAttributes(Name, String[])} for details.
*
* @param name
* The name of the object from which to retrieve attributes
* @param attrIds
* the identifiers of the attributes to retrieve.
* null indicates that all attributes should be retrieved;
* an empty array indicates that none should be retrieved.
* @return the requested attributes; never null
*
* @throws NamingException if a naming exception is encountered
*/
public Attributes getAttributes(String name, String[] attrIds)
throws NamingException;
/**
* This constant specifies to add an attribute with the specified values.
* <p>
* If attribute does not exist,
* create the attribute. The resulting attribute has a union of the
* specified value set and the prior value set.
* Adding an attribute with no value will throw
* <code>InvalidAttributeValueException</code> if the attribute must have
* at least one value. For a single-valued attribute where that attribute
* already exists, throws <code>AttributeInUseException</code>.
* If attempting to add more than one value to a single-valued attribute,
* throws <code>InvalidAttributeValueException</code>.
* <p>
* The value of this constant is {@code 1}.
*
* @see ModificationItem
* @see #modifyAttributes
*/
public final static int ADD_ATTRIBUTE = 1;
/**
* This constant specifies to replace an attribute with specified values.
*<p>
* If attribute already exists,
* replaces all existing values with new specified values. If the
* attribute does not exist, creates it. If no value is specified,
* deletes all the values of the attribute.
* Removal of the last value will remove the attribute if the attribute
* is required to have at least one value. If
* attempting to add more than one value to a single-valued attribute,
* throws <code>InvalidAttributeValueException</code>.
* <p>
* The value of this constant is {@code 2}.
*
* @see ModificationItem
* @see #modifyAttributes
*/
public final static int REPLACE_ATTRIBUTE = 2;
/**
* This constant specifies to delete
* the specified attribute values from the attribute.
*<p>
* The resulting attribute has the set difference of its prior value set
* and the specified value set.
* If no values are specified, deletes the entire attribute.
* If the attribute does not exist, or if some or all members of the
* specified value set do not exist, this absence may be ignored
* and the operation succeeds, or a NamingException may be thrown to
* indicate the absence.
* Removal of the last value will remove the attribute if the
* attribute is required to have at least one value.
* <p>
* The value of this constant is {@code 3}.
*
* @see ModificationItem
* @see #modifyAttributes
*/
public final static int REMOVE_ATTRIBUTE = 3;
/**
* Modifies the attributes associated with a named object.
* The order of the modifications is not specified. Where
* possible, the modifications are performed atomically.
*
* @param name
* the name of the object whose attributes will be updated
* @param mod_op
* the modification operation, one of:
* <code>ADD_ATTRIBUTE</code>,
* <code>REPLACE_ATTRIBUTE</code>,
* <code>REMOVE_ATTRIBUTE</code>.
* @param attrs
* the attributes to be used for the modification; may not be null
*
* @throws AttributeModificationException if the modification cannot
* be completed successfully
* @throws NamingException if a naming exception is encountered
*
* @see #modifyAttributes(Name, ModificationItem[])
*/
public void modifyAttributes(Name name, int mod_op, Attributes attrs)
throws NamingException;
/**
* Modifies the attributes associated with a named object.
* See {@link #modifyAttributes(Name, int, Attributes)} for details.
*
* @param name
* the name of the object whose attributes will be updated
* @param mod_op
* the modification operation, one of:
* <code>ADD_ATTRIBUTE</code>,
* <code>REPLACE_ATTRIBUTE</code>,
* <code>REMOVE_ATTRIBUTE</code>.
* @param attrs
* the attributes to be used for the modification; may not be null
*
* @throws AttributeModificationException if the modification cannot
* be completed successfully
* @throws NamingException if a naming exception is encountered
*/
public void modifyAttributes(String name, int mod_op, Attributes attrs)
throws NamingException;
/**
* Modifies the attributes associated with a named object using
* an ordered list of modifications.
* The modifications are performed
* in the order specified. Each modification specifies a
* modification operation code and an attribute on which to
* operate. Where possible, the modifications are
* performed atomically.
*
* @param name
* the name of the object whose attributes will be updated
* @param mods
* an ordered sequence of modifications to be performed;
* may not be null
*
* @throws AttributeModificationException if the modifications
* cannot be completed successfully
* @throws NamingException if a naming exception is encountered
*
* @see #modifyAttributes(Name, int, Attributes)
* @see ModificationItem
*/
public void modifyAttributes(Name name, ModificationItem[] mods)
throws NamingException;
/**
* Modifies the attributes associated with a named object using
* an ordered list of modifications.
* See {@link #modifyAttributes(Name, ModificationItem[])} for details.
*
* @param name
* the name of the object whose attributes will be updated
* @param mods
* an ordered sequence of modifications to be performed;
* may not be null
*
* @throws AttributeModificationException if the modifications
* cannot be completed successfully
* @throws NamingException if a naming exception is encountered
*/
public void modifyAttributes(String name, ModificationItem[] mods)
throws NamingException;
/**
* Binds a name to an object, along with associated attributes.
* If {@code attrs} is null, the resulting binding will have
* the attributes associated with {@code obj} if {@code obj} is a
* {@code DirContext}, and no attributes otherwise.
* If {@code attrs} is non-null, the resulting binding will have
* {@code attrs} as its attributes; any attributes associated with
* {@code obj} are ignored.
*
* @param name
* the name to bind; may not be empty
* @param obj
* the object to bind; possibly null
* @param attrs
* the attributes to associate with the binding
*
* @throws NameAlreadyBoundException if name is already bound
* @throws InvalidAttributesException if some "mandatory" attributes
* of the binding are not supplied
* @throws NamingException if a naming exception is encountered
*
* @see Context#bind(Name, Object)
* @see #rebind(Name, Object, Attributes)
*/
public void bind(Name name, Object obj, Attributes attrs)
throws NamingException;
/**
* Binds a name to an object, along with associated attributes.
* See {@link #bind(Name, Object, Attributes)} for details.
*
* @param name
* the name to bind; may not be empty
* @param obj
* the object to bind; possibly null
* @param attrs
* the attributes to associate with the binding
*
* @throws NameAlreadyBoundException if name is already bound
* @throws InvalidAttributesException if some "mandatory" attributes
* of the binding are not supplied
* @throws NamingException if a naming exception is encountered
*/
public void bind(String name, Object obj, Attributes attrs)
throws NamingException;
/**
* Binds a name to an object, along with associated attributes,
* overwriting any existing binding.
* If {@code attrs} is null and {@code obj} is a {@code DirContext},
* the attributes from {@code obj} are used.
* If {@code attrs} is null and {@code obj} is not a {@code DirContext},
* any existing attributes associated with the object already bound
* in the directory remain unchanged.
* If {@code attrs} is non-null, any existing attributes associated with
* the object already bound in the directory are removed and {@code attrs}
* is associated with the named object. If {@code obj} is a
* {@code DirContext} and {@code attrs} is non-null, the attributes
* of {@code obj} are ignored.
*
* @param name
* the name to bind; may not be empty
* @param obj
* the object to bind; possibly null
* @param attrs
* the attributes to associate with the binding
*
* @throws InvalidAttributesException if some "mandatory" attributes
* of the binding are not supplied
* @throws NamingException if a naming exception is encountered
*
* @see Context#bind(Name, Object)
* @see #bind(Name, Object, Attributes)
*/
public void rebind(Name name, Object obj, Attributes attrs)
throws NamingException;
/**
* Binds a name to an object, along with associated attributes,
* overwriting any existing binding.
* See {@link #rebind(Name, Object, Attributes)} for details.
*
* @param name
* the name to bind; may not be empty
* @param obj
* the object to bind; possibly null
* @param attrs
* the attributes to associate with the binding
*
* @throws InvalidAttributesException if some "mandatory" attributes
* of the binding are not supplied
* @throws NamingException if a naming exception is encountered
*/
public void rebind(String name, Object obj, Attributes attrs)
throws NamingException;
/**
* Creates and binds a new context, along with associated attributes.
* This method creates a new subcontext with the given name, binds it in
* the target context (that named by all but terminal atomic
* component of the name), and associates the supplied attributes
* with the newly created object.
* All intermediate and target contexts must already exist.
* If {@code attrs} is null, this method is equivalent to
* {@code Context.createSubcontext()}.
*
* @param name
* the name of the context to create; may not be empty
* @param attrs
* the attributes to associate with the newly created context
* @return the newly created context
*
* @throws NameAlreadyBoundException if the name is already bound
* @throws InvalidAttributesException if <code>attrs</code> does not
* contain all the mandatory attributes required for creation
* @throws NamingException if a naming exception is encountered
*
* @see Context#createSubcontext(Name)
*/
public DirContext createSubcontext(Name name, Attributes attrs)
throws NamingException;
/**
* Creates and binds a new context, along with associated attributes.
* See {@link #createSubcontext(Name, Attributes)} for details.
*
* @param name
* the name of the context to create; may not be empty
* @param attrs
* the attributes to associate with the newly created context
* @return the newly created context
*
* @throws NameAlreadyBoundException if the name is already bound
* @throws InvalidAttributesException if <code>attrs</code> does not
* contain all the mandatory attributes required for creation
* @throws NamingException if a naming exception is encountered
*/
public DirContext createSubcontext(String name, Attributes attrs)
throws NamingException;
// -------------------- schema operations
/**
* Retrieves the schema associated with the named object.
* The schema describes rules regarding the structure of the namespace
* and the attributes stored within it. The schema
* specifies what types of objects can be added to the directory and where
* they can be added; what mandatory and optional attributes an object
* can have. The range of support for schemas is directory-specific.
*
* <p> This method returns the root of the schema information tree
* that is applicable to the named object. Several named objects
* (or even an entire directory) might share the same schema.
*
* <p> Issues such as structure and contents of the schema tree,
* permission to modify to the contents of the schema
* tree, and the effect of such modifications on the directory
* are dependent on the underlying directory.
*
* @param name
* the name of the object whose schema is to be retrieved
* @return the schema associated with the context; never null
* @throws OperationNotSupportedException if schema not supported
* @throws NamingException if a naming exception is encountered
*/
public DirContext getSchema(Name name) throws NamingException;
/**
* Retrieves the schema associated with the named object.
* See {@link #getSchema(Name)} for details.
*
* @param name
* the name of the object whose schema is to be retrieved
* @return the schema associated with the context; never null
* @throws OperationNotSupportedException if schema not supported
* @throws NamingException if a naming exception is encountered
*/
public DirContext getSchema(String name) throws NamingException;
/**
* Retrieves a context containing the schema objects of the
* named object's class definitions.
*<p>
* One category of information found in directory schemas is
* <em>class definitions</em>. An "object class" definition
* specifies the object's <em>type</em> and what attributes (mandatory
* and optional) the object must/can have. Note that the term
* "object class" being referred to here is in the directory sense
* rather than in the Java sense.
* For example, if the named object is a directory object of
* "Person" class, {@code getSchemaClassDefinition()} would return a
* {@code DirContext} representing the (directory's) object class
* definition of "Person".
*<p>
* The information that can be retrieved from an object class definition
* is directory-dependent.
*<p>
* Prior to JNDI 1.2, this method
* returned a single schema object representing the class definition of
* the named object.
* Since JNDI 1.2, this method returns a {@code DirContext} containing
* all of the named object's class definitions.
*
* @param name
* the name of the object whose object class
* definition is to be retrieved
* @return the {@code DirContext} containing the named
* object's class definitions; never null
*
* @throws OperationNotSupportedException if schema not supported
* @throws NamingException if a naming exception is encountered
*/
public DirContext getSchemaClassDefinition(Name name)
throws NamingException;
/**
* Retrieves a context containing the schema objects of the
* named object's class definitions.
* See {@link #getSchemaClassDefinition(Name)} for details.
*
* @param name
* the name of the object whose object class
* definition is to be retrieved
* @return the {@code DirContext} containing the named
* object's class definitions; never null
*
* @throws OperationNotSupportedException if schema not supported
* @throws NamingException if a naming exception is encountered
*/
public DirContext getSchemaClassDefinition(String name)
throws NamingException;
// -------------------- search operations
/**
* Searches in a single context for objects that contain a
* specified set of attributes, and retrieves selected attributes.
* The search is performed using the default
* <code>SearchControls</code> settings.
* <p>
* For an object to be selected, each attribute in
* <code>matchingAttributes</code> must match some attribute of the
* object. If <code>matchingAttributes</code> is empty or
* null, all objects in the target context are returned.
*<p>
* An attribute <em>A</em><sub>1</sub> in
* <code>matchingAttributes</code> is considered to match an
* attribute <em>A</em><sub>2</sub> of an object if
* <em>A</em><sub>1</sub> and <em>A</em><sub>2</sub> have the same
* identifier, and each value of <em>A</em><sub>1</sub> is equal
* to some value of <em>A</em><sub>2</sub>. This implies that the
* order of values is not significant, and that
* <em>A</em><sub>2</sub> may contain "extra" values not found in
* <em>A</em><sub>1</sub> without affecting the comparison. It
* also implies that if <em>A</em><sub>1</sub> has no values, then
* testing for a match is equivalent to testing for the presence
* of an attribute <em>A</em><sub>2</sub> with the same
* identifier.
*<p>
* The precise definition of "equality" used in comparing attribute values
* is defined by the underlying directory service. It might use the
* <code>Object.equals</code> method, for example, or might use a schema
* to specify a different equality operation.
* For matching based on operations other than equality (such as
* substring comparison) use the version of the <code>search</code>
* method that takes a filter argument.
* <p>
* When changes are made to this {@code DirContext},
* the effect on enumerations returned by prior calls to this method
* is undefined.
*<p>
* If the object does not have the attribute
* specified, the directory will ignore the nonexistent attribute
* and return the requested attributes that the object does have.
*<p>
* A directory might return more attributes than was requested
* (see <strong>Attribute Type Names</strong> in the class description),
* but is not allowed to return arbitrary, unrelated attributes.
*<p>
* See also <strong>Operational Attributes</strong> in the class
* description.
*
* @param name
* the name of the context to search
* @param matchingAttributes
* the attributes to search for. If empty or null,
* all objects in the target context are returned.
* @param attributesToReturn
* the attributes to return. null indicates that
* all attributes are to be returned;
* an empty array indicates that none are to be returned.
* @return
* a non-null enumeration of {@code SearchResult} objects.
* Each {@code SearchResult} contains the attributes
* identified by <code>attributesToReturn</code>
* and the name of the corresponding object, named relative
* to the context named by <code>name</code>.
* @throws NamingException if a naming exception is encountered
*
* @see SearchControls
* @see SearchResult
* @see #search(Name, String, Object[], SearchControls)
*/
public NamingEnumeration<SearchResult>
search(Name name,
Attributes matchingAttributes,
String[] attributesToReturn)
throws NamingException;
/**
* Searches in a single context for objects that contain a
* specified set of attributes, and retrieves selected attributes.
* See {@link #search(Name, Attributes, String[])} for details.
*
* @param name
* the name of the context to search
* @param matchingAttributes
* the attributes to search for
* @param attributesToReturn
* the attributes to return
* @return a non-null enumeration of {@code SearchResult} objects
* @throws NamingException if a naming exception is encountered
*/
public NamingEnumeration<SearchResult>
search(String name,
Attributes matchingAttributes,
String[] attributesToReturn)
throws NamingException;
/**
* Searches in a single context for objects that contain a
* specified set of attributes.
* This method returns all the attributes of such objects.
* It is equivalent to supplying null as
* the {@code attributesToReturn} parameter to the method
* <code>search(Name, Attributes, String[])</code>.
* <br>
* See {@link #search(Name, Attributes, String[])} for a full description.
*
* @param name
* the name of the context to search
* @param matchingAttributes
* the attributes to search for
* @return an enumeration of {@code SearchResult} objects
* @throws NamingException if a naming exception is encountered
*
* @see #search(Name, Attributes, String[])
*/
public NamingEnumeration<SearchResult>
search(Name name, Attributes matchingAttributes)
throws NamingException;
/**
* Searches in a single context for objects that contain a
* specified set of attributes.
* See {@link #search(Name, Attributes)} for details.
*
* @param name
* the name of the context to search
* @param matchingAttributes
* the attributes to search for
* @return an enumeration of {@code SearchResult} objects
* @throws NamingException if a naming exception is encountered
*/
public NamingEnumeration<SearchResult>
search(String name, Attributes matchingAttributes)
throws NamingException;
/**
* Searches in the named context or object for entries that satisfy the
* given search filter. Performs the search as specified by
* the search controls.
* <p>
* The format and interpretation of <code>filter</code> follows RFC 2254
* with the
* following interpretations for <code>attr</code> and <code>value</code>
* mentioned in the RFC.
* <p>
* <code>attr</code> is the attribute's identifier.
* <p>
* <code>value</code> is the string representation the attribute's value.
* The translation of this string representation into the attribute's value
* is directory-specific.
* <p>
* For the assertion "someCount=127", for example, <code>attr</code>
* is "someCount" and <code>value</code> is "127".
* The provider determines, based on the attribute ID ("someCount")
* (and possibly its schema), that the attribute's value is an integer.
* It then parses the string "127" appropriately.
*<p>
* Any non-ASCII characters in the filter string should be
* represented by the appropriate Java (Unicode) characters, and
* not encoded as UTF-8 octets. Alternately, the
* "backslash-hexcode" notation described in RFC 2254 may be used.
*<p>
* If the directory does not support a string representation of
* some or all of its attributes, the form of <code>search</code> that
* accepts filter arguments in the form of Objects can be used instead.
* The service provider for such a directory would then translate
* the filter arguments to its service-specific representation
* for filter evaluation.
* See <code>search(Name, String, Object[], SearchControls)</code>.
* <p>
* RFC 2254 defines certain operators for the filter, including substring
* matches, equality, approximate match, greater than, less than. These
* operators are mapped to operators with corresponding semantics in the
* underlying directory. For example, for the equals operator, suppose
* the directory has a matching rule defining "equality" of the
* attributes in the filter. This rule would be used for checking
* equality of the attributes specified in the filter with the attributes
* of objects in the directory. Similarly, if the directory has a
* matching rule for ordering, this rule would be used for
* making "greater than" and "less than" comparisons.
*<p>
* Not all of the operators defined in RFC 2254 are applicable to all
* attributes. When an operator is not applicable, the exception
* <code>InvalidSearchFilterException</code> is thrown.
* <p>
* The result is returned in an enumeration of {@code SearchResult}s.
* Each {@code SearchResult} contains the name of the object
* and other information about the object (see SearchResult).
* The name is either relative to the target context of the search
* (which is named by the <code>name</code> parameter), or
* it is a URL string. If the target context is included in
* the enumeration (as is possible when
* <code>cons</code> specifies a search scope of
* <code>SearchControls.OBJECT_SCOPE</code> or
* <code>SearchControls.SUBSTREE_SCOPE</code>), its name is the empty
* string. The {@code SearchResult} may also contain attributes of the
* matching object if the {@code cons} argument specified that attributes
* be returned.
*<p>
* If the object does not have a requested attribute, that
* nonexistent attribute will be ignored. Those requested
* attributes that the object does have will be returned.
*<p>
* A directory might return more attributes than were requested
* (see <strong>Attribute Type Names</strong> in the class description)
* but is not allowed to return arbitrary, unrelated attributes.
*<p>
* See also <strong>Operational Attributes</strong> in the class
* description.
*
* @param name
* the name of the context or object to search
* @param filter
* the filter expression to use for the search; may not be null
* @param cons
* the search controls that control the search. If null,
* the default search controls are used (equivalent
* to {@code (new SearchControls())}).
* @return an enumeration of {@code SearchResult}s of
* the objects that satisfy the filter; never null
*
* @throws InvalidSearchFilterException if the search filter specified is
* not supported or understood by the underlying directory
* @throws InvalidSearchControlsException if the search controls
* contain invalid settings
* @throws NamingException if a naming exception is encountered
*
* @see #search(Name, String, Object[], SearchControls)
* @see SearchControls
* @see SearchResult
*/
public NamingEnumeration<SearchResult>
search(Name name,
String filter,
SearchControls cons)
throws NamingException;
/**
* Searches in the named context or object for entries that satisfy the
* given search filter. Performs the search as specified by
* the search controls.
* See {@link #search(Name, String, SearchControls)} for details.
*
* @param name
* the name of the context or object to search
* @param filter
* the filter expression to use for the search; may not be null
* @param cons
* the search controls that control the search. If null,
* the default search controls are used (equivalent
* to {@code (new SearchControls())}).
*
* @return an enumeration of {@code SearchResult}s for
* the objects that satisfy the filter.
* @throws InvalidSearchFilterException if the search filter specified is
* not supported or understood by the underlying directory
* @throws InvalidSearchControlsException if the search controls
* contain invalid settings
* @throws NamingException if a naming exception is encountered
*/
public NamingEnumeration<SearchResult>
search(String name,
String filter,
SearchControls cons)
throws NamingException;
/**
* Searches in the named context or object for entries that satisfy the
* given search filter. Performs the search as specified by
* the search controls.
*<p>
* The interpretation of <code>filterExpr</code> is based on RFC
* 2254. It may additionally contain variables of the form
* <code>{i}</code> -- where <code>i</code> is an integer -- that
* refer to objects in the <code>filterArgs</code> array. The
* interpretation of <code>filterExpr</code> is otherwise
* identical to that of the <code>filter</code> parameter of the
* method <code>search(Name, String, SearchControls)</code>.
*<p>
* When a variable <code>{i}</code> appears in a search filter, it
* indicates that the filter argument <code>filterArgs[i]</code>
* is to be used in that place. Such variables may be used
* wherever an <em>attr</em>, <em>value</em>, or
* <em>matchingrule</em> production appears in the filter grammar
* of RFC 2254, section 4. When a string-valued filter argument
* is substituted for a variable, the filter is interpreted as if
* the string were given in place of the variable, with any
* characters having special significance within filters (such as
* <code>'*'</code>) having been escaped according to the rules of
* RFC 2254.
*<p>
* For directories that do not use a string representation for
* some or all of their attributes, the filter argument
* corresponding to an attribute value may be of a type other than
* String. Directories that support unstructured binary-valued
* attributes, for example, should accept byte arrays as filter
* arguments. The interpretation (if any) of filter arguments of
* any other type is determined by the service provider for that
* directory, which maps the filter operations onto operations with
* corresponding semantics in the underlying directory.
*<p>
* This method returns an enumeration of the results.
* Each element in the enumeration contains the name of the object
* and other information about the object (see <code>SearchResult</code>).
* The name is either relative to the target context of the search
* (which is named by the <code>name</code> parameter), or
* it is a URL string. If the target context is included in
* the enumeration (as is possible when
* <code>cons</code> specifies a search scope of
* <code>SearchControls.OBJECT_SCOPE</code> or
* <code>SearchControls.SUBSTREE_SCOPE</code>),
* its name is the empty string.
*<p>
* The {@code SearchResult} may also contain attributes of the matching
* object if the {@code cons} argument specifies that attributes be
* returned.
/**代码未完, 请加载全部代码(NowJava.com).**/