Schema
Attribute Type Definitions
An attribute type definition specifies the attribute's syntax and how attributes of that type are compared and sorted. The attribute types in the directory form a class hierarchy. For example, the "commonName" attribute type is a subclass of the "name" attribute type. However, not many LDAP servers support attribute subclassing.In the schema tree, the name "AttributeDefinition" is bound to a flat context that contains DirContext objects that represent attribute type definitions in the schema. For example, if a directory supports a "commonName" attribute, then the "AttributeDefinition" context will have a binding with the name "commonName" that is bound to a DirContext object.
Each object in the "AttributeDefinition" context has the mandatory and optional attributes listed in the following table.
Attribute Identifier Attribute Value Description NUMERICOID (mandatory) Unique object identifier (OID) NAME Attribute's name DESC Attribute's description OBSOLETE "true" if obsolete; "false" or absent otherwise SUP Name of superior attribute type from which this attribute's type is derived EQUALITY Name or OID of the matching rule if equality matching is allowed; absent otherwise ORDERING Name or OID of the matching rule if ordering matching is allowed; absent otherwise SUBSTRING Name or OID of the matching rule if substring matching is allowed; absent otherwise SYNTAX Numeric OID of the syntax of values of this type SINGLE-VALUE "true" if the attribute not multivalued; "false" or absent otherwise. COLLECTIVE "true" if the attribute is collective; "false" or absent otherwise. NO-USER-MODIFICATION "true" if the attribute is not user-modifiable; "false" or absent otherwise. USAGE Description of attribute usage These attributes correspond to the definition of "AttributeTypeDescription" in RFC 2252. All of the attribute values are represented by the java.lang.String class. Some directories do not publish all of the schema data. For example, the Netscape Directory Server v4.1 does not publish the equality, ordering, and substring rules for its attribute definitions even though the server does support them for certain attributes. In these cases, the schema objects do not completely describe the attribute definitions.
Retrieving the Schema Object of an Attribute Type Definition To retrieve the schema object of an attribute type definition, you look for it in the schema tree. For example, you can obtain the schema object representing the "cn" attribute by using the following code.
If you get the attributes of the cnSchema schema object, then you will see the following.// Get the schema tree root DirContext schema = ctx.getSchema(""); // Get the schema object for "cn" DirContext cnSchema = (DirContext)schema.lookup("AttributeDefinition/cn");NUMERICOID: 2.5.4.3 NAME: cn SYNTAX: 1.3.6.1.4.1.1466.115.121.1.15 DESC: Standard AttributeYou can use not only lookup() to retrieve schema objects from the schema tree, but also methods such as list() or search().
Getting an Attribute's Type Definition
Given an Attribute object that represents an LDAP attribute, you can get its schema object by invoking getAttributeDefinition() on it. Thus another way of getting the schema object for "cn" is to get a "cn" attribute and then invoke getAttributeDefinition(). Here's an example.
// Get an attribute of that type Attributes attrs = ctx.getAttributes("cn=Ted Geisel, ou=People", new String[]{"cn"}); Attribute cnAttr = attrs.get("cn"); // Get its attribute type definition DirContext cnSchema = cnAttr.getAttributeDefinition();
Adding a New Attribute Type Definition
Before you go on: See the Object Class Definitions section for notes regarding updating the schema.
Adding a new attribute type definition to the schema is like adding a new entry to the directory. This is because the schema tree and schema objects are DirContext objects.
Here's an example that adds a new attribute type definition ("fooAttr") to the schema. It first declares the attributes that describe the new attribute type definition and then adds the definition to the schema by using DirContext.createSubcontext().
Some servers might modify the definition before adding it to the schema. To check the newly added definition, use a new initial context to read the definition so that any cached definition is not used.// Specify attributes for the schema object Attributes attrs = new BasicAttributes(true); // Ignore case attrs.put("NUMERICOID", "1.3.6.1.4.1.42.2.27.4.2.3.1.1.2"); attrs.put("NAME", "fooAttr"); attrs.put("DESC", "for JNDIDocs example only"); attrs.put("SYNTAX", "1.3.6.1.4.1.1466.115.121.1.15"); // Get the schema tree root DirContext schema = ctx.getSchema(""); // Add the new schema object for "fooAttr" DirContext newAttr = schema.createSubcontext("AttributeDefinition/fooAttr", attrs);
Modifying an Attribute Type Definition
Modifying an existing attribute definition in the schema is like modifying an entry in the directory. Here's an example that modifies the "fooAttr" attribute definition to be single-valued by using DirContext.modifyAttributes().
Note: In versions of the LDAP provider prior to the Java 2 SDK, v1.4, you cannot modify an existing attribute definition. In those releases, first delete the existing definition and then add the updated version.Before you go on: See the Adding a New Object Class section for notes regarding updating the schema.
Some servers might modify the definition before performing the update on the schema or ignore the update. To check the newly updated definition, use a new initial context to read the definition so that any cached definition is not used.// Get the schema tree root DirContext schema = ctx.getSchema(""); // Modify the schema object for "fooAttr" schema.modifyAttributes("AttributeDefinition/fooAttr", new ModificationItem[]{new ModificationItem( DirContext.ADD_ATTRIBUTE, new BasicAttribute("SINGLE-VALUE", "true"))});
Deleting an Attribute Type Definition
Deleting an existing attribute type definition from the schema is like deleting an entry from the directory. Here's an example that removes the attribute type definition "fooAttr" from the schema by using DirContext.destroySubcontext().
Before you go on: See the Object Class Definitions section for notes regarding updating the schema.
Some servers might not let you delete an attribute type definition that's being used by entries in the directory. You might be able to get around this restriction by turning off schema checking.// Get the schema tree root DirContext schema = ctx.getSchema(""); // Remove the schema object for "fooAttr" schema.destroySubcontext("AttributeDefinition/fooAttr");