| /* |
| * 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 org.apache.directory.api.ldap.model.schema; |
| |
| |
| import org.apache.directory.api.i18n.I18n; |
| |
| |
| /** |
| * An attributeType specification. attributeType specifications describe the |
| * nature of attributes within the directory. The attributeType specification's |
| * properties are accessible through this interface. |
| * <p> |
| * According to ldapbis [MODELS]: |
| * </p> |
| * |
| * <pre> |
| * 4.1.2. Attribute Types |
| * |
| * Attribute Type definitions are written according to the ABNF: |
| * |
| * AttributeTypeDescription = LPAREN WSP |
| * numericoid ; object identifier |
| * [ SP "NAME" SP qdescrs ] ; short names (descriptors) |
| * [ SP "DESC" SP qdstring ] ; description |
| * [ SP "OBSOLETE" ] ; not active |
| * [ SP "SUP" SP oid ] ; supertype |
| * [ SP "EQUALITY" SP oid ] ; equality matching rule |
| * [ SP "ORDERING" SP oid ] ; ordering matching rule |
| * [ SP "SUBSTR" SP oid ] ; substrings matching rule |
| * [ SP "SYNTAX" SP noidlen ] ; value syntax |
| * [ SP "SINGLE-VALUE" ] ; single-value |
| * [ SP "COLLECTIVE" ] ; collective |
| * [ SP "NO-USER-MODIFICATION" ]; not user modifiable |
| * [ SP "USAGE" SP usage ] ; usage |
| * extensions WSP RPAREN ; extensions |
| * |
| * usage = "userApplications" / ; user |
| * "directoryOperation" / ; directory operational |
| * "distributedOperation" / ; DSA-shared operational |
| * "dSAOperation" ; DSA-specific operational |
| * |
| * where: |
| * [numericoid] is object identifier assigned to this attribute type; |
| * NAME [qdescrs] are short names (descriptors) identifying this |
| * attribute type; |
| * DESC [qdstring] is a short descriptive string; |
| * OBSOLETE indicates this attribute type is not active; |
| * SUP oid specifies the direct supertype of this type; |
| * EQUALITY, ORDERING, SUBSTRING provide the oid of the equality, |
| * ordering, and substrings matching rules, respectively; |
| * SYNTAX identifies value syntax by object identifier and may suggest |
| * a minimum upper bound; |
| * COLLECTIVE indicates this attribute type is collective [X.501]; |
| * NO-USER-MODIFICATION indicates this attribute type is not user |
| * modifiable; |
| * USAGE indicates the application of this attribute type; and |
| * [extensions] describe extensions. |
| * |
| * Each attribute type description must contain at least one of the SUP |
| * or SYNTAX fields. |
| * |
| * Usage of userApplications, the default, indicates that attributes of |
| * this type represent user information. That is, they are user |
| * attributes. |
| * |
| * COLLECTIVE requires usage userApplications. Use of collective |
| * attribute types in LDAP is not discussed in this technical |
| * specification. |
| * |
| * A usage of directoryOperation, distributedOperation, or dSAOperation |
| * indicates that attributes of this type represent operational and/or |
| * administrative information. That is, they are operational attributes. |
| * |
| * directoryOperation usage indicates that the attribute of this type is |
| * a directory operational attribute. distributedOperation usage |
| * indicates that the attribute of this DSA-shared usage operational |
| * attribute. dSAOperation usage indicates that the attribute of this |
| * type is a DSA-specific operational attribute. |
| * |
| * NO-USER-MODIFICATION requires an operational usage. |
| * |
| * Note that the [AttributeTypeDescription] does not list the matching |
| * rules which can be used with that attribute type in an extensibleMatch |
| * search filter. This is done using the 'matchingRuleUse' attribute |
| * described in Section 4.1.4. |
| * |
| * This document refines the schema description of X.501 by requiring |
| * that the SYNTAX field in an [AttributeTypeDescription] be a string |
| * representation of an object identifier for the LDAP string syntax |
| * definition with an optional indication of the suggested minimum bound |
| * of a value of this attribute. |
| * |
| * A suggested minimum upper bound on the number of characters in a value |
| * with a string-based syntax, or the number of bytes in a value for all |
| * other syntaxes, may be indicated by appending this bound count inside |
| * of curly braces following the syntax's OBJECT IDENTIFIER in an |
| * |
| * Attribute Type Description. This bound is not part of the syntax name |
| * itself. For instance, "1.3.6.4.1.1466.0{64}" suggests that server |
| * implementations should allow a string to be 64 characters long, |
| * although they may allow longer strings. Note that a single character |
| * of the Directory String syntax may be encoded in more than one octet |
| * since UTF-8 is a variable-length encoding. |
| * </pre> |
| * |
| * @see <a href="http://www.faqs.org/rfcs/rfc2252.html">RFC 2252 Section 4.2</a> |
| * @see <a |
| * href="http://www.ietf.org/internet-drafts/draft-ietf-ldapbis-models-11.txt"> |
| * ldapbis [MODELS]</a> |
| * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a> |
| */ |
| public class MutableAttributeType extends AttributeType |
| { |
| /** The mandatory serialVersionUID */ |
| public static final long serialVersionUID = 1L; |
| |
| |
| /** |
| * Creates a AttributeType object using a unique OID. |
| * |
| * @param oid the OID for this AttributeType |
| */ |
| public MutableAttributeType( String oid ) |
| { |
| super( oid ); |
| } |
| |
| |
| /** |
| * Tells if this AttributeType is Single Valued or not |
| * |
| * @param singleValued True if the AttributeType is single-valued |
| */ |
| public void setSingleValued( boolean singleValued ) |
| { |
| if ( locked ) |
| { |
| throw new UnsupportedOperationException( I18n.err( I18n.ERR_13700_CANNOT_MODIFY_LOCKED_SCHEMA_OBJECT, getName() ) ); |
| } |
| |
| this.isSingleValued = singleValued; |
| } |
| |
| |
| /** |
| * Tells if this AttributeType can be modified by a user or not |
| * |
| * @param userModifiable The flag to set |
| */ |
| public void setUserModifiable( boolean userModifiable ) |
| { |
| if ( locked ) |
| { |
| throw new UnsupportedOperationException( I18n.err( I18n.ERR_13700_CANNOT_MODIFY_LOCKED_SCHEMA_OBJECT, getName() ) ); |
| } |
| |
| this.canUserModify = userModifiable; |
| } |
| |
| |
| /** |
| * Updates the collective flag |
| * |
| * @param collective The new value to set |
| */ |
| public void updateCollective( boolean collective ) |
| { |
| if ( locked ) |
| { |
| throw new UnsupportedOperationException( I18n.err( I18n.ERR_13700_CANNOT_MODIFY_LOCKED_SCHEMA_OBJECT, getName() ) ); |
| } |
| |
| this.isCollective = collective; |
| } |
| |
| |
| /** |
| * Sets the collective flag |
| * |
| * @param collective The new value to set |
| */ |
| public void setCollective( boolean collective ) |
| { |
| if ( locked ) |
| { |
| throw new UnsupportedOperationException( I18n.err( I18n.ERR_13700_CANNOT_MODIFY_LOCKED_SCHEMA_OBJECT, getName() ) ); |
| } |
| |
| this.isCollective = collective; |
| } |
| |
| |
| /** |
| * Sets the AttributeType usage, one of : |
| * <ul> |
| * <li>USER_APPLICATIONS</li> |
| * <li>DIRECTORY_OPERATION</li> |
| * <li>DISTRIBUTED_OPERATION</li> |
| * <li>DSA_OPERATION</li> |
| * </ul> |
| * |
| * @see UsageEnum |
| * @param usage The AttributeType usage |
| */ |
| public void setUsage( UsageEnum usage ) |
| { |
| if ( locked ) |
| { |
| throw new UnsupportedOperationException( I18n.err( I18n.ERR_13700_CANNOT_MODIFY_LOCKED_SCHEMA_OBJECT, getName() ) ); |
| } |
| |
| this.usage = usage; |
| } |
| |
| |
| /** |
| * Updates the AttributeType usage, one of : |
| * <ul> |
| * <li>USER_APPLICATIONS</li> |
| * <li>DIRECTORY_OPERATION</li> |
| * <li>DISTRIBUTED_OPERATION</li> |
| * <li>DSA_OPERATION</li> |
| * </ul> |
| * |
| * @see UsageEnum |
| * @param newUsage The AttributeType usage |
| */ |
| public void updateUsage( UsageEnum newUsage ) |
| { |
| if ( locked ) |
| { |
| throw new UnsupportedOperationException( I18n.err( I18n.ERR_13700_CANNOT_MODIFY_LOCKED_SCHEMA_OBJECT, getName() ) ); |
| } |
| |
| this.usage = newUsage; |
| } |
| |
| |
| /** |
| * Sets the length limit of this AttributeType based on its associated |
| * syntax. |
| * |
| * @param length the new length to set |
| */ |
| public void setSyntaxLength( long length ) |
| { |
| if ( locked ) |
| { |
| throw new UnsupportedOperationException( I18n.err( I18n.ERR_13700_CANNOT_MODIFY_LOCKED_SCHEMA_OBJECT, getName() ) ); |
| } |
| |
| this.syntaxLength = length; |
| } |
| |
| |
| /** |
| * Sets the superior AttributeType OID of this AttributeType |
| * |
| * @param superiorOid The superior AttributeType OID of this AttributeType |
| */ |
| public void setSuperiorOid( String superiorOid ) |
| { |
| if ( locked ) |
| { |
| throw new UnsupportedOperationException( I18n.err( I18n.ERR_13700_CANNOT_MODIFY_LOCKED_SCHEMA_OBJECT, getName() ) ); |
| } |
| |
| this.superiorOid = superiorOid; |
| } |
| |
| |
| /** |
| * Sets the superior for this AttributeType |
| * |
| * @param superior The superior for this AttributeType |
| */ |
| public void setSuperior( AttributeType superior ) |
| { |
| if ( locked ) |
| { |
| throw new UnsupportedOperationException( I18n.err( I18n.ERR_13700_CANNOT_MODIFY_LOCKED_SCHEMA_OBJECT, getName() ) ); |
| } |
| |
| this.superior = superior; |
| this.superiorOid = superior.getOid(); |
| } |
| |
| |
| /** |
| * Sets the superior oid for this AttributeType |
| * |
| * @param newSuperiorOid The superior oid for this AttributeType |
| */ |
| public void setSuperior( String newSuperiorOid ) |
| { |
| if ( locked ) |
| { |
| throw new UnsupportedOperationException( I18n.err( I18n.ERR_13700_CANNOT_MODIFY_LOCKED_SCHEMA_OBJECT, getName() ) ); |
| } |
| |
| this.superiorOid = newSuperiorOid; |
| } |
| |
| |
| /** |
| * Update the associated Superior AttributeType, even if the SchemaObject is readOnly |
| * |
| * @param newSuperior The superior for this AttributeType |
| */ |
| public void updateSuperior( MutableAttributeType newSuperior ) |
| { |
| if ( locked ) |
| { |
| throw new UnsupportedOperationException( I18n.err( I18n.ERR_13700_CANNOT_MODIFY_LOCKED_SCHEMA_OBJECT, getName() ) ); |
| } |
| |
| this.superior = newSuperior; |
| this.superiorOid = newSuperior.getOid(); |
| } |
| |
| |
| /** |
| * Sets the Syntax OID for this AttributeType |
| * |
| * @param syntaxOid The syntax OID for this AttributeType |
| */ |
| public void setSyntaxOid( String syntaxOid ) |
| { |
| if ( locked ) |
| { |
| throw new UnsupportedOperationException( I18n.err( I18n.ERR_13700_CANNOT_MODIFY_LOCKED_SCHEMA_OBJECT, getName() ) ); |
| } |
| |
| this.syntaxOid = syntaxOid; |
| } |
| |
| |
| /** |
| * Sets the Syntax for this AttributeType |
| * |
| * @param syntax The Syntax for this AttributeType |
| */ |
| public void setSyntax( LdapSyntax syntax ) |
| { |
| if ( locked ) |
| { |
| throw new UnsupportedOperationException( I18n.err( I18n.ERR_13700_CANNOT_MODIFY_LOCKED_SCHEMA_OBJECT, getName() ) ); |
| } |
| |
| this.syntax = syntax; |
| this.syntaxOid = syntax.getOid(); |
| } |
| |
| |
| /** |
| * Update the associated Syntax, even if the SchemaObject is readOnly |
| * |
| * @param newSyntax The Syntax for this AttributeType |
| */ |
| public void updateSyntax( LdapSyntax newSyntax ) |
| { |
| if ( locked ) |
| { |
| throw new UnsupportedOperationException( I18n.err( I18n.ERR_13700_CANNOT_MODIFY_LOCKED_SCHEMA_OBJECT, getName() ) ); |
| } |
| |
| this.syntax = newSyntax; |
| this.syntaxOid = newSyntax.getOid(); |
| } |
| |
| |
| /** |
| * Sets the Equality OID for this AttributeType |
| * |
| * @param equalityOid The Equality OID for this AttributeType |
| */ |
| public void setEqualityOid( String equalityOid ) |
| { |
| if ( locked ) |
| { |
| throw new UnsupportedOperationException( I18n.err( I18n.ERR_13700_CANNOT_MODIFY_LOCKED_SCHEMA_OBJECT, getName() ) ); |
| } |
| |
| this.equalityOid = equalityOid; |
| } |
| |
| |
| /** |
| * Sets the Equality MR for this AttributeType |
| * |
| * @param equality The Equality MR for this AttributeType |
| */ |
| public void setEquality( MatchingRule equality ) |
| { |
| if ( locked ) |
| { |
| throw new UnsupportedOperationException( I18n.err( I18n.ERR_13700_CANNOT_MODIFY_LOCKED_SCHEMA_OBJECT, getName() ) ); |
| } |
| |
| this.equality = equality; |
| this.equalityOid = equality.getOid(); |
| } |
| |
| |
| /** |
| * Update the associated Equality MatchingRule, even if the SchemaObject is readOnly |
| * |
| * @param newEquality The Equality MR for this AttributeType |
| */ |
| public void updateEquality( MatchingRule newEquality ) |
| { |
| if ( locked ) |
| { |
| throw new UnsupportedOperationException( I18n.err( I18n.ERR_13700_CANNOT_MODIFY_LOCKED_SCHEMA_OBJECT, getName() ) ); |
| } |
| |
| this.equality = newEquality; |
| this.equalityOid = newEquality.getOid(); |
| } |
| |
| |
| /** |
| * Sets the Ordering OID for this AttributeType |
| * |
| * @param orderingOid The Ordering OID for this AttributeType |
| */ |
| public void setOrderingOid( String orderingOid ) |
| { |
| if ( locked ) |
| { |
| throw new UnsupportedOperationException( I18n.err( I18n.ERR_13700_CANNOT_MODIFY_LOCKED_SCHEMA_OBJECT, getName() ) ); |
| } |
| |
| this.orderingOid = orderingOid; |
| } |
| |
| |
| /** |
| * Sets the Ordering MR for this AttributeType |
| * |
| * @param ordering The Ordering MR for this AttributeType |
| */ |
| public void setOrdering( MatchingRule ordering ) |
| { |
| if ( locked ) |
| { |
| throw new UnsupportedOperationException( I18n.err( I18n.ERR_13700_CANNOT_MODIFY_LOCKED_SCHEMA_OBJECT, getName() ) ); |
| } |
| |
| this.ordering = ordering; |
| this.orderingOid = ordering.getOid(); |
| } |
| |
| |
| /** |
| * Update the associated Ordering MatchingRule, even if the SchemaObject is readOnly |
| * |
| * @param newOrdering The Ordering MR for this AttributeType |
| */ |
| public void updateOrdering( MatchingRule newOrdering ) |
| { |
| if ( locked ) |
| { |
| throw new UnsupportedOperationException( I18n.err( I18n.ERR_13700_CANNOT_MODIFY_LOCKED_SCHEMA_OBJECT, getName() ) ); |
| } |
| |
| this.ordering = newOrdering; |
| this.orderingOid = newOrdering.getOid(); |
| } |
| |
| |
| /** |
| * Sets the Substr OID for this AttributeType |
| * |
| * @param substrOid The Substr OID for this AttributeType |
| */ |
| public void setSubstringOid( String substrOid ) |
| { |
| if ( locked ) |
| { |
| throw new UnsupportedOperationException( I18n.err( I18n.ERR_13700_CANNOT_MODIFY_LOCKED_SCHEMA_OBJECT, getName() ) ); |
| } |
| |
| this.substringOid = substrOid; |
| } |
| |
| |
| /** |
| * Sets the Substr MR for this AttributeType |
| * |
| * @param substring The Substr MR for this AttributeType |
| */ |
| public void setSubstring( MatchingRule substring ) |
| { |
| if ( locked ) |
| { |
| throw new UnsupportedOperationException( I18n.err( I18n.ERR_13700_CANNOT_MODIFY_LOCKED_SCHEMA_OBJECT, getName() ) ); |
| } |
| |
| this.substring = substring; |
| this.substringOid = substring.getOid(); |
| } |
| |
| |
| /** |
| * Update the associated Substring MatchingRule, even if the SchemaObject is readOnly |
| * |
| * @param newSubstring The Substr MR for this AttributeType |
| */ |
| public void updateSubstring( MatchingRule newSubstring ) |
| { |
| if ( locked ) |
| { |
| throw new UnsupportedOperationException( I18n.err( I18n.ERR_13700_CANNOT_MODIFY_LOCKED_SCHEMA_OBJECT, getName() ) ); |
| } |
| |
| this.substring = newSubstring; |
| this.substringOid = newSubstring.getOid(); |
| } |
| |
| |
| /** |
| * {@inheritDoc} |
| */ |
| @Override |
| public void clear() |
| { |
| // Clear the common elements |
| super.clear(); |
| |
| // Clear the references |
| equality = null; |
| ordering = null; |
| substring = null; |
| superior = null; |
| syntax = null; |
| } |
| } |