| | |
| | | |
| | | |
| | | /** |
| | | * 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 |
| | | { |
| | |
| | | |
| | | |
| | | |
| | | 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); |
| | | |
| | |
| | | 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() |
| | | { |
| | |
| | | * 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() |
| | | { |
| | |
| | | * 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() |
| | | { |
| | |
| | | * 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() |
| | | { |
| | |
| | | |
| | | |
| | | /** |
| | | * 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. |
| | | */ |
| | |
| | | |
| | | |
| | | /** |
| | | * 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() |
| | | { |
| | |
| | | |
| | | |
| | | /** |
| | | * 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() |
| | | { |
| | |
| | | |
| | | |
| | | /** |
| | | * 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() |
| | |
| | | |
| | | |
| | | /** |
| | | * 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); |
| | | } |
| | |
| | | |
| | | 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); |
| | | |
| | |
| | | |
| | | |
| | | @Override |
| | | void validate(List<LocalizableMessage> warnings, Schema schema) |
| | | void validate(final List<LocalizableMessage> warnings, final Schema schema) |
| | | throws SchemaException |
| | | { |
| | | this.schema = schema; |
| | |
| | | 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); |
| | |
| | | } |
| | | 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(); |
| | |
| | | } |
| | | 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); |
| | | } |
| | | } |
| | |
| | | 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); |
| | | } |
| | | } |
| | |
| | | { |
| | | 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); |
| | | } |
| | | } |
| | |
| | | { |
| | | 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); |
| | | } |
| | | } |
| | |
| | | { |
| | | 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); |
| | | } |
| | | } |
| | |
| | | { |
| | | 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); |
| | | } |
| | | } |