mirror of https://github.com/OpenIdentityPlatform/OpenDJ.git

matthew_swift
28.47.2010 f2160f4bd1c8ac67e5a86a6710d431e8932877f9
sdk/src/org/opends/sdk/schema/Syntax.java
@@ -46,18 +46,17 @@
/**
 * This class defines a data structure for storing and interacting with
 * an LDAP syntaxes, which constrain the structure of attribute values
 * stored in an LDAP directory, and determine the representation of
 * attribute and assertion values transferred in the LDAP protocol.
 * This class defines a data structure for storing and interacting with an LDAP
 * syntaxes, which constrain the structure of attribute values stored in an LDAP
 * directory, and determine the representation of attribute and assertion values
 * transferred in the LDAP protocol.
 * <p>
 * Syntax implementations must extend the
 * <code>SyntaxImplementation</code> class so they can be used by OpenDS
 * to validate attribute values.
 * Syntax implementations must extend the {@link SyntaxImpl} interface so they
 * can be used by OpenDS to validate attribute values.
 * <p>
 * Where ordered sets of names, or extra properties are provided, the
 * ordering will be preserved when the associated fields are accessed
 * via their getters or via the {@link #toString()} methods.
 * Where ordered sets of names, or extra properties are provided, the ordering
 * will be preserved when the associated fields are accessed via their getters
 * or via the {@link #toString()} methods.
 */
public final class Syntax extends SchemaElement
{
@@ -72,9 +71,22 @@
  Syntax(String oid, String description,
      Map<String, List<String>> extraProperties, String definition,
      SyntaxImpl implementation)
  Syntax(final String oid)
  {
    super("", Collections.singletonMap("X-SUBST", Collections
        .singletonList(Schema.getDefaultSyntax().getOID())));
    Validator.ensureNotNull(oid);
    this.oid = oid;
    this.definition = buildDefinition();
    this.impl = Schema.getDefaultSyntax().impl;
  }
  Syntax(final String oid, final String description,
      final Map<String, List<String>> extraProperties, final String definition,
      final SyntaxImpl implementation)
  {
    super(description, extraProperties);
@@ -92,26 +104,15 @@
    this.impl = implementation;
  }
  Syntax(String oid)
  {
    super("", Collections.singletonMap("X-SUBST",
        Collections.singletonList(Schema.getDefaultSyntax().getOID())));
    Validator.ensureNotNull(oid);
    this.oid = oid;
    this.definition = buildDefinition();
    this.impl = Schema.getDefaultSyntax().impl;
  }
  /**
   * Retrieves the default approximate matching rule that will be used
   * for attributes with this syntax.
   * Retrieves the default approximate matching rule that will be used for
   * attributes with this syntax.
   *
   * @return The default approximate matching rule that will be used for
   *         attributes with this syntax, or {@code null} if approximate
   *         matches will not be allowed for this type by default.
   *         attributes with this syntax, or {@code null} if approximate matches
   *         will not be allowed for this type by default.
   */
  public MatchingRule getApproximateMatchingRule()
  {
@@ -124,9 +125,9 @@
   * Retrieves the default equality matching rule that will be used for
   * attributes with this syntax.
   *
   * @return The default equality matching rule that will be used for
   *         attributes with this syntax, or {@code null} if equality
   *         matches will not be allowed for this type by default.
   * @return The default equality matching rule that will be used for attributes
   *         with this syntax, or {@code null} if equality matches will not be
   *         allowed for this type by default.
   */
  public MatchingRule getEqualityMatchingRule()
  {
@@ -151,9 +152,9 @@
   * Retrieves the default ordering matching rule that will be used for
   * attributes with this syntax.
   *
   * @return The default ordering matching rule that will be used for
   *         attributes with this syntax, or {@code null} if ordering
   *         matches will not be allowed for this type by default.
   * @return The default ordering matching rule that will be used for attributes
   *         with this syntax, or {@code null} if ordering matches will not be
   *         allowed for this type by default.
   */
  public MatchingRule getOrderingMatchingRule()
  {
@@ -167,8 +168,8 @@
   * attributes with this syntax.
   *
   * @return The default substring matching rule that will be used for
   *         attributes with this syntax, or {@code null} if substring
   *         matches will not be allowed for this type by default.
   *         attributes with this syntax, or {@code null} if substring matches
   *         will not be allowed for this type by default.
   */
  public MatchingRule getSubstringMatchingRule()
  {
@@ -178,8 +179,8 @@
  /**
   * Retrieves the hash code for this schema element. It will be
   * calculated as the sum of the characters in the OID.
   * Retrieves the hash code for this schema element. It will be calculated as
   * the sum of the characters in the OID.
   *
   * @return The hash code for this attribute syntax.
   */
@@ -192,17 +193,15 @@
  /**
   * Indicates whether this attribute syntax requires that values must
   * be encoded using the Basic Encoding Rules (BER) used by X.500
   * directories and always include the {@code binary} attribute
   * description option.
   * Indicates whether this attribute syntax requires that values must be
   * encoded using the Basic Encoding Rules (BER) used by X.500 directories and
   * always include the {@code binary} attribute description option.
   *
   * @return {@code true} this attribute syntax requires that values
   *         must be BER encoded and always include the {@code binary}
   *         attribute description option, or {@code false} if not.
   * @see <a href="http://tools.ietf.org/html/rfc4522">RFC 4522 -
   *      Lightweight Directory Access Protocol (LDAP): The Binary
   *      Encoding Option </a>
   * @return {@code true} this attribute syntax requires that values must be BER
   *         encoded and always include the {@code binary} attribute description
   *         option, or {@code false} if not.
   * @see <a href="http://tools.ietf.org/html/rfc4522">RFC 4522 - Lightweight
   *      Directory Access Protocol (LDAP): The Binary Encoding Option </a>
   */
  public boolean isBEREncodingRequired()
  {
@@ -212,11 +211,11 @@
  /**
   * Indicates whether this attribute syntax would likely be a human
   * readable string.
   * Indicates whether this attribute syntax would likely be a human readable
   * string.
   *
   * @return {@code true} if this attribute syntax would likely be a
   *         human readable string or {@code false} if not.
   * @return {@code true} if this attribute syntax would likely be a human
   *         readable string or {@code false} if not.
   */
  public boolean isHumanReadable()
  {
@@ -226,11 +225,11 @@
  /**
   * Retrieves a string representation of this attribute syntax in the
   * format defined in RFC 2252.
   * Retrieves a string representation of this attribute syntax in the format
   * defined in RFC 2252.
   *
   * @return A string representation of this attribute syntax in the
   *         format defined in RFC 2252.
   * @return A string representation of this attribute syntax in the format
   *         defined in RFC 2252.
   */
  @Override
  public String toString()
@@ -241,19 +240,19 @@
  /**
   * Indicates whether the provided value is acceptable for use in an
   * attribute with this syntax. If it is not, then the reason may be
   * appended to the provided buffer.
   * Indicates whether the provided value is acceptable for use in an attribute
   * with this syntax. If it is not, then the reason may be appended to the
   * provided buffer.
   *
   * @param value
   *          The value for which to make the determination.
   * @param invalidReason
   *          The buffer to which the invalid reason should be appended.
   * @return {@code true} if the provided value is acceptable for use
   *         with this syntax, or {@code false} if not.
   * @return {@code true} if the provided value is acceptable for use with this
   *         syntax, or {@code false} if not.
   */
  public boolean valueIsAcceptable(ByteSequence value,
      LocalizableMessageBuilder invalidReason)
  public boolean valueIsAcceptable(final ByteSequence value,
      final LocalizableMessageBuilder invalidReason)
  {
    return impl.valueIsAcceptable(schema, value, invalidReason);
  }
@@ -262,14 +261,13 @@
  Syntax duplicate()
  {
    return new Syntax(oid, description, extraProperties, definition,
        impl);
    return new Syntax(oid, description, extraProperties, definition, impl);
  }
  @Override
  void toStringContent(StringBuilder buffer)
  void toStringContent(final StringBuilder buffer)
  {
    buffer.append(oid);
@@ -284,7 +282,7 @@
  @Override
  void validate(List<LocalizableMessage> warnings, Schema schema)
  void validate(final List<LocalizableMessage> warnings, final Schema schema)
      throws SchemaException
  {
    this.schema = schema;
@@ -298,25 +296,24 @@
        if (property.getKey().equalsIgnoreCase("x-subst"))
        {
          /**
           * One unimplemented syntax can be substituted by another
           * defined syntax. A substitution syntax is an
           * LDAPSyntaxDescriptionSyntax with X-SUBST extension.
           * One unimplemented syntax can be substituted by another defined
           * syntax. A substitution syntax is an LDAPSyntaxDescriptionSyntax
           * with X-SUBST extension.
           */
          final Iterator<String> values =
              property.getValue().iterator();
          final Iterator<String> values = property.getValue().iterator();
          if (values.hasNext())
          {
            final String value = values.next();
            if (value.equals(oid))
            {
              final LocalizableMessage message =
                  ERR_ATTR_SYNTAX_CYCLIC_SUB_SYNTAX.get(oid);
              final LocalizableMessage message = ERR_ATTR_SYNTAX_CYCLIC_SUB_SYNTAX
                  .get(oid);
              throw new SchemaException(message);
            }
            if (!schema.hasSyntax(value))
            {
              final LocalizableMessage message =
                  ERR_ATTR_SYNTAX_UNKNOWN_SUB_SYNTAX.get(oid, value);
              final LocalizableMessage message = ERR_ATTR_SYNTAX_UNKNOWN_SUB_SYNTAX
                  .get(oid, value);
              throw new SchemaException(message);
            }
            final Syntax subSyntax = schema.getSyntax(value);
@@ -330,8 +327,7 @@
        }
        else if (property.getKey().equalsIgnoreCase("x-pattern"))
        {
          final Iterator<String> values =
              property.getValue().iterator();
          final Iterator<String> values = property.getValue().iterator();
          if (values.hasNext())
          {
            final String value = values.next();
@@ -342,9 +338,8 @@
            }
            catch (final Exception e)
            {
              final LocalizableMessage message =
                  WARN_ATTR_SYNTAX_LDAPSYNTAX_REGEX_INVALID_PATTERN
                      .get(oid, value);
              final LocalizableMessage message = WARN_ATTR_SYNTAX_LDAPSYNTAX_REGEX_INVALID_PATTERN
                  .get(oid, value);
              throw new SchemaException(message);
            }
          }
@@ -364,9 +359,8 @@
      if (impl == null)
      {
        impl = Schema.getDefaultSyntax().impl;
        final LocalizableMessage message =
            WARN_ATTR_SYNTAX_NOT_IMPLEMENTED.get(oid, Schema
                .getDefaultSyntax().getOID());
        final LocalizableMessage message = WARN_ATTR_SYNTAX_NOT_IMPLEMENTED
            .get(oid, Schema.getDefaultSyntax().getOID());
        warnings.add(message);
      }
    }
@@ -377,14 +371,13 @@
    {
      if (schema.hasMatchingRule(impl.getEqualityMatchingRule()))
      {
        equalityMatchingRule =
            schema.getMatchingRule(impl.getEqualityMatchingRule());
        equalityMatchingRule = schema.getMatchingRule(impl
            .getEqualityMatchingRule());
      }
      else
      {
        final LocalizableMessage message =
            ERR_ATTR_SYNTAX_UNKNOWN_EQUALITY_MATCHING_RULE.get(impl
                .getEqualityMatchingRule(), impl.getName());
        final LocalizableMessage message = ERR_ATTR_SYNTAX_UNKNOWN_EQUALITY_MATCHING_RULE
            .get(impl.getEqualityMatchingRule(), impl.getName());
        warnings.add(message);
      }
    }
@@ -393,14 +386,13 @@
    {
      if (schema.hasMatchingRule(impl.getOrderingMatchingRule()))
      {
        orderingMatchingRule =
            schema.getMatchingRule(impl.getOrderingMatchingRule());
        orderingMatchingRule = schema.getMatchingRule(impl
            .getOrderingMatchingRule());
      }
      else
      {
        final LocalizableMessage message =
            ERR_ATTR_SYNTAX_UNKNOWN_ORDERING_MATCHING_RULE.get(impl
                .getOrderingMatchingRule(), impl.getName());
        final LocalizableMessage message = ERR_ATTR_SYNTAX_UNKNOWN_ORDERING_MATCHING_RULE
            .get(impl.getOrderingMatchingRule(), impl.getName());
        warnings.add(message);
      }
    }
@@ -409,14 +401,13 @@
    {
      if (schema.hasMatchingRule(impl.getSubstringMatchingRule()))
      {
        substringMatchingRule =
            schema.getMatchingRule(impl.getSubstringMatchingRule());
        substringMatchingRule = schema.getMatchingRule(impl
            .getSubstringMatchingRule());
      }
      else
      {
        final LocalizableMessage message =
            ERR_ATTR_SYNTAX_UNKNOWN_SUBSTRING_MATCHING_RULE.get(impl
                .getSubstringMatchingRule(), impl.getName());
        final LocalizableMessage message = ERR_ATTR_SYNTAX_UNKNOWN_SUBSTRING_MATCHING_RULE
            .get(impl.getSubstringMatchingRule(), impl.getName());
        warnings.add(message);
      }
    }
@@ -425,14 +416,13 @@
    {
      if (schema.hasMatchingRule(impl.getApproximateMatchingRule()))
      {
        approximateMatchingRule =
            schema.getMatchingRule(impl.getApproximateMatchingRule());
        approximateMatchingRule = schema.getMatchingRule(impl
            .getApproximateMatchingRule());
      }
      else
      {
        final LocalizableMessage message =
            ERR_ATTR_SYNTAX_UNKNOWN_APPROXIMATE_MATCHING_RULE.get(impl
                .getApproximateMatchingRule(), impl.getName());
        final LocalizableMessage message = ERR_ATTR_SYNTAX_UNKNOWN_APPROXIMATE_MATCHING_RULE
            .get(impl.getApproximateMatchingRule(), impl.getName());
        warnings.add(message);
      }
    }