/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1/GPL 2.0/LGPL 2.1 * * The contents of this file are subject to the Mozilla Public License Version * 1.1 (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.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is mozilla.org code. * * The Initial Developer of the Original Code is * Netscape Communications Corporation. * Portions created by the Initial Developer are Copyright (C) 2000 * the Initial Developer. All Rights Reserved. * * Contributor(s): * * Alternatively, the contents of this file may be used under the terms of * either the GNU General Public License Version 2 or later (the "GPL"), or * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), * in which case the provisions of the GPL or the LGPL are applicable instead * of those above. If you wish to allow use of your version of this file only * under the terms of either the GPL or the LGPL, and not to allow others to * use your version of this file under the terms of the MPL, indicate your * decision by deleting the provisions above and replace them with the notice * and other provisions required by the GPL or the LGPL. If you do not delete * the provisions above, a recipient may use your version of this file under * the terms of any one of the MPL, the GPL or the LGPL. * * ***** END LICENSE BLOCK ***** */ package netscape.ldap; import java.util.*; /** * The definition of a DIT structure rule in the schema. * RFC 2252, Lightweight Directory Access Protocol (v3): * DIT Structure Rule Description covers the types of information * to specify when defining a DIT structure rule. According to the RFC, * the description of a DIT structure rule can include the following: *
* *
cis or int)
*
*
* When you construct an LDAPDITStructureRuleSchema object, you can
* specify these types of information as arguments to the constructor or
* in the AttributeTypeDescription format specified in RFC 2252.
* When an LDAP client searches an LDAP server for the schema, the server
* returns schema information as an object with attribute values in this
* format.
*
* * There are a number of additional optional description fields which * are not explicitly accessible through LDAPDITStructureRuleSchema, but which * can be managed with setQualifier, getQualifier, and getQualifierNames: *
* *
*
* To get the name, OID, and description of this DIT structure rule
* , use the getName, getOID, and
* getDescription methods inherited from the abstract class
* LDAPSchemaElement. Optional and custom qualifiers are
* accessed with getQualifier and getQualifierNames
* from LDAPSchemaElement.
*
*
* To add or remove this attribute type definition from the
* schema, use the add and remove
* methods, which this class inherits from the LDAPSchemaElement
* abstract class.
*
* RFC 2252 defines DITStructureRuleDescription as follows: *
*
* DITStructureRuleDescription = "(" whsp
* ruleidentifier whsp ; DITStructureRule identifier
* [ "NAME" qdescrs ]
* [ "DESC" qdstring ]
* [ "OBSOLETE" whsp ]
* "FORM" woid whsp ; NameForm
* [ "SUP" ruleidentifiers whsp ] ; superior DITStructureRules
* ")"
*
*
* @version 1.0
* @see netscape.ldap.LDAPSchemaElement
**/
public class LDAPDITStructureRuleSchema extends LDAPSchemaElement {
static final long serialVersionUID = -2823317246039655811L;
/**
* Constructs a blank element.
*/
protected LDAPDITStructureRuleSchema() {
super();
}
/**
* Constructs a DIT structure rule definition, using the specified
* information.
* @param name name of the attribute type
* @param ruleID unique identifier of the structure rule.true if the rule is obsolete
* @param nameForm either the identifier or name of a name form.
* This is used to indirectly refer to the object class that this
* structure rule applies to.
* @param superiors list of superior structure rules - specified
* by their integer ID. The object class specified by this structure
* rule (via the nameForm parameter) may only be subordinate in
* the DIT to object classes of those represented by the structure
* rules here.
*/
public LDAPDITStructureRuleSchema( String name, int ruleID,
String description, boolean obsolete,
String nameForm,
String[] superiors ) {
super( name, "", description, null );
this.nameForm = nameForm;
this.ruleID = ruleID;
if ( obsolete ) {
setQualifier( OBSOLETE, "" );
}
if ( (superiors != null) && (superiors.length > 0) ) {
setQualifier( SUPERIOR, superiors );
}
}
/**
* Constructs a DIT structure rule definition based on a description in
* the DITStructureRuleDescription format. For information on this format,
* (see RFC 2252, Lightweight Directory Access Protocol (v3):
* DIT Structure Rule Description. This is the format that
* LDAP servers
* and clients use to exchange schema information. (For example, when
* you search an LDAP server for its schema, the server returns an entry
* with the attributes "objectclasses" and "attributetypes". The
* values of "attributetypes" are attribute type descriptions
* in this format.)
* * * @param raw definition of the DIT structure rule in the * DITStructureRuleDescription format */ public LDAPDITStructureRuleSchema( String raw ) { attrName = "ditStructureRules"; parseValue( raw ); Object o = properties.get( FORM ); if ( o != null ) { nameForm = (String)o; } try { ruleID = Integer.parseInt( oid ); } catch ( Exception e ) { } } /** * Returns a list of all structure rules that are superior to this * structure rule. To resolve to an object class, you need to first * resolve the superior id to another structure rule, then call * getNameForm().getObjectClass() on that structure rule. * @return the structure rules that are superior to this * structure rule. */ public String[] getSuperiors() { return getQualifier( SUPERIOR ); } /** * Returns the rule ID for this structure rule. Note that this returns * an integer rather than a dotted decimal OID. Objects of this class do * not have an OID, thus getID will return null. * * @return the rule ID for this structure rule. */ public int getRuleID() { return ruleID; } /** * Returns the NameForm that this structure rule controls. You can get * the actual object class that this structure rule controls by calling * getNameForm().getObjectClass(). * * @return the NameForm that this structure rule controls. */ public String getNameForm() { return nameForm; } /** * Prepares a value in RFC 2252 format for submission to a server * * @return a String ready for submission to an LDAP server. */ public String getValue() { String s = "( " + ruleID + ' '; if ( name != null ) { s += "NAME " + '\'' + name + "\' "; } if ( description != null ) { s += "DESC \'" + description + "\' "; } if ( isObsolete() ) { s += OBSOLETE + ' '; } s += FORM + " " + nameForm + ' '; String val = getValue( SUPERIOR, false ); if ( (val != null) && (val.length() > 1) ) { s += val + ' '; } val = getCustomValues(); if ( val.length() > 0 ) { s += val + ' '; } s += ')'; return s; } /** * Gets the definition of the rule in a user friendly format. * This is the format that the rule definition uses when * printing the attribute type or the schema. * @return definition of the rule in a user friendly format. */ public String toString() { String s = "Name: " + name + "; ruleID: " + ruleID + "; "; s += "Description: " + description; if ( isObsolete() ) { s += "; OBSOLETE"; } String[] superiors = getSuperiors(); if ( superiors != null ) { for( int i = 0; i < superiors.length; i++ ) { s += superiors[i]; if ( i < (superiors.length-1) ) { s += ", "; } } } s += "Name form: " + nameForm + "; "; s += getQualifierString( IGNOREVALS ); return s; } public final static String FORM = "FORM"; // Qualifiers known to not have values; prepare a Hashtable static final String[] NOVALS = { "OBSOLETE" }; static { for( int i = 0; i < NOVALS.length; i++ ) { novalsTable.put( NOVALS[i], NOVALS[i] ); } } // Qualifiers which we output explicitly in toString() static final String[] IGNOREVALS = { OBSOLETE, FORM, "SUP" }; private String nameForm = null; private int ruleID = 0; }