/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * The contents of this file are subject to the Netscape 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/NPL/ * * 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 Netscape are * Copyright (C) 2000 Netscape Communications Corporation. All * Rights Reserved. * * Contributor(s): */ package netscape.ldap; import java.util.*; /** * The definition of a DIT content rule in the schema. * RFC 2252, Lightweight Directory Access Protocol (v3): * DIT Content Rule Description covers the types of information * to specify when defining a DIT content rule. According to the RFC, * the description of a DIT content rule can include the following: *

* *

*

* * When you construct an LDAPDITContentRuleSchema 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 LDAPDITContentRuleSchema, but which * can be managed with setQualifier, getQualifier, and getQualifierNames: *

* *

*

* * To get the name, OID, and description of this DIT content 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 DITContentRuleDescription as follows: *

*

 *    DITContentRuleDescription = "("
 *        numericoid   ; Structural ObjectClass identifier
 *        [ "NAME" qdescrs ]
 *        [ "DESC" qdstring ]
 *        [ "OBSOLETE" ]
 *        [ "AUX" oids ]    ; Auxiliary ObjectClasses
 *        [ "MUST" oids ]   ; AttributeType identifiers
 *        [ "MAY" oids ]    ; AttributeType identifiers
 *        [ "NOT" oids ]    ; AttributeType identifiers
 *       ")"
 * 
* * @version 1.0 * @see netscape.ldap.LDAPSchemaElement **/ public class LDAPDITContentRuleSchema extends LDAPSchemaElement { static final long serialVersionUID = -8588488481097270056L; /** * Constructs a blank element. */ protected LDAPDITContentRuleSchema() { super(); } /** * Constructs a DIT content rule definition, using the specified * information. * @param name name of the attribute type * @param oid object identifier (OID) of the attribute type * in dotted-string format (for example, "1.2.3.4") * @param description description of attribute type * @param obsolete true if the rule is obsolete * @param auxiliary a list of auxiliary object classes * allowed for an entry to which this content rule applies. * These may either be specified by name or numeric oid. * @param required a list of user attribute types that an entry * to which this content rule applies must contain in addition to * its normal set of mandatory attributes. These may either be * specified by name or numeric oid. * @param optional a list of user attribute types that an entry * to which this content rule applies may contain in addition to * its normal set of optional attributes. These may either be * specified by name or numeric oid. * @param precluded a list consisting of a subset of the optional * user attribute types of the structural and auxiliary object * classes which are precluded from an entry to which this content rule * applies. These may either be specified by name or numeric oid. */ public LDAPDITContentRuleSchema( String name, String oid, String description, boolean obsolete, String[] auxiliary, String[] required, String[] optional, String[] precluded ) { super( name, oid, description, null ); if ( required != null ) { for( int i = 0; i < required.length; i++ ) { must.addElement( required[i] ); } } if ( optional != null ) { for( int i = 0; i < optional.length; i++ ) { may.addElement( optional[i] ); } } if ( auxiliary != null ) { for( int i = 0; i < auxiliary.length; i++ ) { aux.addElement( auxiliary[i] ); } } if ( precluded != null ) { for( int i = 0; i < precluded.length; i++ ) { not.addElement( precluded[i] ); } } if ( obsolete ) { setQualifier( OBSOLETE, "" ); } } /** * Constructs a DIT content rule definition based on a description in * the DITContentRuleDescription format. For information on this format, * (see RFC 2252, Lightweight Directory Access Protocol (v3): * DIT Content 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 content rule in the * DITContentRuleDescription format */ public LDAPDITContentRuleSchema( String raw ) { attrName = "ditContentRules"; parseValue( raw ); Object o = properties.get( MAY ); if ( o != null ) { if ( o instanceof Vector ) { may = (Vector)o; } else { may.addElement( o ); } } o = properties.get( MUST ); if ( o != null ) { if ( o instanceof Vector ) { must = (Vector)o; } else { must.addElement( o ); } } o = properties.get( NOT ); if ( o != null ) { if ( o instanceof Vector ) { not = (Vector)o; } else { not.addElement( o ); } } o = properties.get( AUX ); if ( o != null ) { if ( o instanceof Vector ) { aux = (Vector)o; } else { aux.addElement( o ); } } } /** * Gets the names of the required attributes for * this content rule. * @return the names of the required attributes * for this content rule. */ public String[] getRequiredAttributes() { String[] vals = new String[must.size()]; must.copyInto( vals ); return vals; } /** * Gets the names of optional attributes allowed * in this content rule. * @return the names of optional attributes * allowed in this content rule. */ public String[] getOptionalAttributes() { String[] vals = new String[may.size()]; may.copyInto( vals ); return vals; } /** * Gets the names of the precluded attributes for * this content rule. * @return the names of the precluded attributes * for this content rule. */ public String[] getPrecludedAttributes() { String[] vals = new String[not.size()]; not.copyInto( vals ); return vals; } /** * Gets the names of the auxiliary object classes allowed * in this content rule. * @return the names of auxiliary object classes * allowed in this content rule. */ public String[] getAuxiliaryClasses() { String[] vals = new String[aux.size()]; aux.copyInto( vals ); return vals; } /** * 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 = getValuePrefix(); String val; val = getOptionalValues( NOVALS ); if ( val.length() > 0 ) { s += val + ' '; } if ( aux.size() > 0 ) { s += AUX + " " + vectorToList( aux ); s += ' '; } if ( must.size() > 0 ) { s += MUST + " " + vectorToList( must ); s += ' '; } if ( may.size() > 0 ) { s += MAY + " " + vectorToList( may ); s += ' '; } if ( not.size() > 0 ) { s += NOT + " " + vectorToList( not ); s += ' '; } val = getCustomValues(); if ( val.length() > 0 ) { s += val + ' '; } s += ')'; return s; } /** * Creates a list within parentheses, with $ as delimiter * * @param vals values for list * @return a String with a list of values. */ protected String vectorToList( Vector vals ) { String val = "( "; for( int i = 0; i < vals.size(); i++ ) { val += (String)vals.elementAt(i) + ' '; if ( i < (vals.size() - 1) ) { val += "$ "; } } val += ')'; return val; } /** * 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 + "; OID: " + oid; s += "; Description: " + description + "; Required: "; int i = 0; Enumeration e = must.elements(); while( e.hasMoreElements() ) { if ( i > 0 ) s += ", "; i++; s += (String)e.nextElement(); } s += "; Optional: "; e = may.elements(); i = 0; while( e.hasMoreElements() ) { if ( i > 0 ) s += ", "; i++; s += (String)e.nextElement(); } s += "; Auxiliary: "; e = aux.elements(); i = 0; while( e.hasMoreElements() ) { if ( i > 0 ) s += ", "; i++; s += (String)e.nextElement(); } s += "; Precluded: "; e = not.elements(); i = 0; while( e.hasMoreElements() ) { if ( i > 0 ) s += ", "; i++; s += (String)e.nextElement(); } if ( isObsolete() ) { s += "; OBSOLETE"; } s += getQualifierString( IGNOREVALS ); return s; } public final static String AUX = "AUX"; public final static String MUST = "MUST"; public final static String MAY = "MAY"; public final static String NOT = "NOT"; // 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, AUX, MUST, MAY, NOT }; private Vector must = new Vector(); private Vector may = new Vector(); private Vector aux = new Vector(); private Vector not = new Vector(); }