/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package javax.naming.directory;
import java.io.Serializable;
import javax.naming.NamingEnumeration;
/**
* This is the interface to a collection of attributes associated with a
* directory entry.
* <p>
* This interface defines the methods that are implemented by a collection of a
* particular directory entry's attributes.
* </p>
* <p>
* A directory entry can have zero or more attributes comprising its attributes
* collection. The attributes are unordered within the collection. The
* attributes can be identified by name. The names of attributes are either case
* sensitive or case insensitive as indicated by the <code>isCaseIgnored</code>
* method. Method names refer to attribute ID (identity) rather than name, for
* brevity.
* </p>
* <p>
* The attribute collection is created when the directory entry is created.
* </p>
*/
public interface Attributes extends Cloneable, Serializable {
/**
* Returns a deep copy of this <code>Attributes</code> instance. The
* attribute objects are not cloned.
*
* @return a deep copy of this <code>Attributes</code> instance
*/
Object clone();
/**
* Returns the attribute with the specified name (ID). The name is case
* insensitive if <code>isCaseIgnored()</code> is true. The return value
* is <code>null</code> if no match is found.
*
* @param id
* attribute name (ID)
* @return the attribute with the specified name (ID)
*/
Attribute get(String id);
/**
* Returns an enumeration containing the zero or more attributes in the
* collection. The behaviour of the enumeration is not specified if the
* attribute collection is changed.
*
* @return an enumeration of all contained attributes
*
*/
NamingEnumeration<? extends Attribute> getAll();
/**
* Returns an enumeration containing the zero or more names (IDs) of the
* attributes in the collection. The behaviour of the enumeration is not
* specified if the attribute collection is changed.
*
* @return an enumeration of the IDs of all contained attributes
*/
NamingEnumeration<String> getIDs();
/**
* Indicates whether case is ignored in the names of the attributes.
*
* @return true if case is ignored, otherwise false
*/
boolean isCaseIgnored();
/**
* Places a non-null attribute in the attribute collection. If there is
* already an attribute with the same ID as the new attribute, the old one
* is removed from the collection and is returned by this method. If there
* was no attribute with the same ID the return value is <code>null</code>.
*
* @param attribute
* the attribute to be put
* @return the old attribute with the same ID, if exists; otherwise
* <code>null</code>
*/
Attribute put(Attribute attribute);
/**
* Places a new attribute with the supplied ID and value into the attribute
* collection. If there is already an attribute with the same ID, the old
* one is removed from the collection and is returned by this method. If
* there was no attribute with the same ID the return value is
* <code>null</code>. The case of the ID is ignored if
* <code>isCaseIgnored()</code> is true.
*
* This method provides a mechanism to put an attribute with a
* <code>null</code> value: the value of <code>obj</code> may be
* <code>null</code>.
*
* @param id
* the ID of the new attribute to be put
* @param obj
* the value of the new attribute to be put
* @return the old attribute with the same ID, if exists; otherwise
* <code>null</code>
*/
Attribute put(String id, Object obj);
/**
* Removes the attribute with the specified ID. The removed attribute is
* returned by this method. If there is no attribute with the specified ID,
* the return value is <code>null</code>. The case of the ID is ignored
* if <code>isCaseIgnored()</code> is true.
*
* @param id
* the ID of the attribute to be removed
* @return the removed attribute, if exists; otherwise <code>null</code>
*/
Attribute remove(String id);
/**
* Returns the number of attributes.
*
* @return the number of attributes
*/
int size();
}