| | |
| | | import org.opends.server.types.ByteString; |
| | | import org.opends.server.types.DirectoryException; |
| | | import org.opends.server.types.DITContentRule; |
| | | import org.opends.server.types.ErrorLogCategory; |
| | | import org.opends.server.types.ErrorLogSeverity; |
| | | import org.opends.server.types.InitializationException; |
| | | import org.opends.server.types.ObjectClass; |
| | | import org.opends.server.types.ObjectClassType; |
| | | import org.opends.server.types.ResultCode; |
| | | import org.opends.server.types.Schema; |
| | | |
| | | import static org.opends.server.loggers.Debug.*; |
| | | import static org.opends.server.loggers.Error.*; |
| | | import static org.opends.server.messages.MessageHandler.*; |
| | | import static org.opends.server.messages.SchemaMessages.*; |
| | | import static org.opends.server.schema.SchemaConstants.*; |
| | |
| | | |
| | | |
| | | /** |
| | | * Initializes this attribute syntax based on the information in the provided |
| | | * configuration entry. |
| | | * |
| | | * @param configEntry The configuration entry that contains the information |
| | | * to use to initialize this attribute syntax. |
| | | * |
| | | * @throws ConfigException If an unrecoverable problem arises in the |
| | | * process of performing the initialization. |
| | | * {@inheritDoc} |
| | | */ |
| | | public void initializeSyntax(ConfigEntry configEntry) |
| | | throws ConfigException |
| | | throws ConfigException, InitializationException |
| | | { |
| | | assert debugEnter(CLASS_NAME, "initializeSyntax", |
| | | String.valueOf(configEntry)); |
| | |
| | | DirectoryServer.getEqualityMatchingRule(EMR_CASE_IGNORE_OID); |
| | | if (defaultEqualityMatchingRule == null) |
| | | { |
| | | logError(ErrorLogCategory.SCHEMA, ErrorLogSeverity.SEVERE_ERROR, |
| | | MSGID_ATTR_SYNTAX_UNKNOWN_EQUALITY_MATCHING_RULE, |
| | | EMR_CASE_IGNORE_OID, SYNTAX_DIT_CONTENT_RULE_NAME); |
| | | int msgID = MSGID_ATTR_SYNTAX_UNKNOWN_EQUALITY_MATCHING_RULE; |
| | | String message = getMessage(msgID, EMR_CASE_IGNORE_OID, |
| | | SYNTAX_DIT_CONTENT_RULE_NAME); |
| | | throw new InitializationException(msgID, message); |
| | | } |
| | | |
| | | defaultOrderingMatchingRule = |
| | | DirectoryServer.getOrderingMatchingRule(OMR_CASE_IGNORE_OID); |
| | | if (defaultOrderingMatchingRule == null) |
| | | { |
| | | logError(ErrorLogCategory.SCHEMA, ErrorLogSeverity.SEVERE_ERROR, |
| | | MSGID_ATTR_SYNTAX_UNKNOWN_ORDERING_MATCHING_RULE, |
| | | OMR_CASE_IGNORE_OID, SYNTAX_DIT_CONTENT_RULE_NAME); |
| | | int msgID = MSGID_ATTR_SYNTAX_UNKNOWN_ORDERING_MATCHING_RULE; |
| | | String message = getMessage(msgID, OMR_CASE_IGNORE_OID, |
| | | SYNTAX_DIT_CONTENT_RULE_NAME); |
| | | throw new InitializationException(msgID, message); |
| | | } |
| | | |
| | | defaultSubstringMatchingRule = |
| | | DirectoryServer.getSubstringMatchingRule(SMR_CASE_IGNORE_OID); |
| | | if (defaultSubstringMatchingRule == null) |
| | | { |
| | | logError(ErrorLogCategory.SCHEMA, ErrorLogSeverity.SEVERE_ERROR, |
| | | MSGID_ATTR_SYNTAX_UNKNOWN_SUBSTRING_MATCHING_RULE, |
| | | SMR_CASE_IGNORE_OID, SYNTAX_DIT_CONTENT_RULE_NAME); |
| | | int msgID = MSGID_ATTR_SYNTAX_UNKNOWN_SUBSTRING_MATCHING_RULE; |
| | | String message = getMessage(msgID, SMR_CASE_IGNORE_OID, |
| | | SYNTAX_DIT_CONTENT_RULE_NAME); |
| | | throw new InitializationException(msgID, message); |
| | | } |
| | | } |
| | | |
| | | |
| | | |
| | | /** |
| | | * Retrieves the common name for this attribute syntax. |
| | | * |
| | | * @return The common name for this attribute syntax. |
| | | * {@inheritDoc} |
| | | */ |
| | | public String getSyntaxName() |
| | | { |
| | |
| | | |
| | | |
| | | /** |
| | | * Retrieves the OID for this attribute syntax. |
| | | * |
| | | * @return The OID for this attribute syntax. |
| | | * {@inheritDoc} |
| | | */ |
| | | public String getOID() |
| | | { |
| | |
| | | |
| | | |
| | | /** |
| | | * Retrieves a description for this attribute syntax. |
| | | * |
| | | * @return A description for this attribute syntax. |
| | | * {@inheritDoc} |
| | | */ |
| | | public String getDescription() |
| | | { |
| | |
| | | |
| | | |
| | | /** |
| | | * 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</CODE> if equality |
| | | * matches will not be allowed for this type by default. |
| | | * {@inheritDoc} |
| | | */ |
| | | public EqualityMatchingRule 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</CODE> if ordering |
| | | * matches will not be allowed for this type by default. |
| | | * {@inheritDoc} |
| | | */ |
| | | public OrderingMatchingRule getOrderingMatchingRule() |
| | | { |
| | |
| | | |
| | | |
| | | /** |
| | | * Retrieves the default substring matching rule that will be used for |
| | | * attributes with this syntax. |
| | | * |
| | | * @return The default substring matching rule that will be used for |
| | | * attributes with this syntax, or <CODE>null</CODE> if substring |
| | | * matches will not be allowed for this type by default. |
| | | * {@inheritDoc} |
| | | */ |
| | | public SubstringMatchingRule getSubstringMatchingRule() |
| | | { |
| | |
| | | |
| | | |
| | | /** |
| | | * 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</CODE> if approximate |
| | | * matches will not be allowed for this type by default. |
| | | * {@inheritDoc} |
| | | */ |
| | | public ApproximateMatchingRule getApproximateMatchingRule() |
| | | { |
| | |
| | | |
| | | |
| | | /** |
| | | * 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</CODE> if the provided value is acceptable for use with |
| | | * this syntax, or <CODE>false</CODE> if not. |
| | | * {@inheritDoc} |
| | | */ |
| | | public boolean valueIsAcceptable(ByteString value, |
| | | StringBuilder invalidReason) |
| | |
| | | // acceptable. |
| | | try |
| | | { |
| | | decodeDITContentRule(value, DirectoryServer.getSchema()); |
| | | decodeDITContentRule(value, DirectoryServer.getSchema(), true); |
| | | return true; |
| | | } |
| | | catch (DirectoryException de) |
| | |
| | | * should not be in order to allow the desired capitalization to be |
| | | * preserved). |
| | | * |
| | | * @param value The ASN.1 octet string containing the value to decode (it |
| | | * does not need to be normalized). |
| | | * @param schema The schema to use to resolve references to other schema |
| | | * elements. |
| | | * @param value The ASN.1 octet string containing the value |
| | | * to decode (it does not need to be |
| | | * normalized). |
| | | * @param schema The schema to use to resolve references to |
| | | * other schema elements. |
| | | * @param allowUnknownElements Indicates whether to allow values that |
| | | * reference a name form and/or superior rules |
| | | * which are not defined in the server schema. |
| | | * This should only be true when called by |
| | | * {@code valueIsAcceptable}. |
| | | * |
| | | * @return The decoded DIT content rule definition. |
| | | * |
| | |
| | | * DIT content rule definition. |
| | | */ |
| | | public static DITContentRule decodeDITContentRule(ByteString value, |
| | | Schema schema) |
| | | Schema schema, boolean allowUnknownElements) |
| | | throws DirectoryException |
| | | { |
| | | assert debugEnter(CLASS_NAME, "decodeDITContentRule", |
| | |
| | | |
| | | |
| | | // Get the objectclass with the specified OID. If it does not exist or is |
| | | // not structural, then log a warning but continue on. |
| | | // not structural, then fail. |
| | | ObjectClass structuralClass = schema.getObjectClass(oid); |
| | | if (structuralClass == null) |
| | | { |
| | | int msgID = MSGID_ATTR_SYNTAX_DCR_UNKNOWN_STRUCTURAL_CLASS; |
| | | String message = getMessage(msgID, valueStr, oid); |
| | | logError(ErrorLogCategory.SCHEMA, ErrorLogSeverity.SEVERE_WARNING, |
| | | message, msgID); |
| | | |
| | | structuralClass = DirectoryServer.getDefaultObjectClass(oid); |
| | | if (allowUnknownElements) |
| | | { |
| | | structuralClass = DirectoryServer.getDefaultObjectClass(oid); |
| | | } |
| | | else |
| | | { |
| | | int msgID = MSGID_ATTR_SYNTAX_DCR_UNKNOWN_STRUCTURAL_CLASS; |
| | | String message = getMessage(msgID, valueStr, oid); |
| | | throw new DirectoryException(ResultCode.CONSTRAINT_VIOLATION, message, |
| | | msgID); |
| | | } |
| | | } |
| | | else if (structuralClass.getObjectClassType() != ObjectClassType.STRUCTURAL) |
| | | { |
| | |
| | | String message = |
| | | getMessage(msgID, valueStr, oid, structuralClass.getNameOrOID(), |
| | | String.valueOf(structuralClass.getObjectClassType())); |
| | | logError(ErrorLogCategory.SCHEMA, ErrorLogSeverity.SEVERE_WARNING, |
| | | message, msgID); |
| | | throw new DirectoryException(ResultCode.CONSTRAINT_VIOLATION, message, |
| | | msgID); |
| | | } |
| | | |
| | | |
| | |
| | | ObjectClass oc = schema.getObjectClass(woidBuffer.toString()); |
| | | if (oc == null) |
| | | { |
| | | // This isn't good because it is an unknown auxiliary class. Log |
| | | // a message and construct a default. |
| | | int msgID = MSGID_ATTR_SYNTAX_DCR_UNKNOWN_AUXILIARY_CLASS; |
| | | String message = getMessage(msgID, valueStr, |
| | | // This isn't good because it is an unknown auxiliary class. |
| | | if (allowUnknownElements) |
| | | { |
| | | oc = DirectoryServer.getDefaultAuxiliaryObjectClass( |
| | | woidBuffer.toString()); |
| | | logError(ErrorLogCategory.SCHEMA, ErrorLogSeverity.SEVERE_WARNING, |
| | | message, msgID); |
| | | |
| | | oc = DirectoryServer.getDefaultObjectClass(woidBuffer.toString()); |
| | | } |
| | | else |
| | | { |
| | | int msgID = MSGID_ATTR_SYNTAX_DCR_UNKNOWN_AUXILIARY_CLASS; |
| | | String message = getMessage(msgID, valueStr, |
| | | woidBuffer.toString()); |
| | | throw new DirectoryException(ResultCode.CONSTRAINT_VIOLATION, |
| | | message, msgID); |
| | | } |
| | | } |
| | | else if (oc.getObjectClassType() != ObjectClassType.AUXILIARY) |
| | | { |
| | | // This isn't good because it isn't an auxiliary class. Log a |
| | | // message but continue on. |
| | | // This isn't good because it isn't an auxiliary class. |
| | | int msgID = MSGID_ATTR_SYNTAX_DCR_AUXILIARY_CLASS_NOT_AUXILIARY; |
| | | String message = getMessage(msgID, valueStr, |
| | | woidBuffer.toString()); |
| | | logError(ErrorLogCategory.SCHEMA, ErrorLogSeverity.SEVERE_WARNING, |
| | | message, msgID); |
| | | woidBuffer.toString(), |
| | | oc.getObjectClassType().toString()); |
| | | throw new DirectoryException(ResultCode.CONSTRAINT_VIOLATION, |
| | | message, msgID); |
| | | } |
| | | |
| | | ocs.add(oc); |
| | |
| | | ObjectClass oc = schema.getObjectClass(woidBuffer.toString()); |
| | | if (oc == null) |
| | | { |
| | | // This isn't good because it is an unknown auxiliary class. Log |
| | | // a message and construct a default. |
| | | int msgID = MSGID_ATTR_SYNTAX_DCR_UNKNOWN_AUXILIARY_CLASS; |
| | | String message = getMessage(msgID, valueStr, woidBuffer.toString()); |
| | | logError(ErrorLogCategory.SCHEMA, ErrorLogSeverity.SEVERE_WARNING, |
| | | message, msgID); |
| | | |
| | | oc = DirectoryServer.getDefaultObjectClass(woidBuffer.toString()); |
| | | // This isn't good because it is an unknown auxiliary class. |
| | | if (allowUnknownElements) |
| | | { |
| | | oc = DirectoryServer.getDefaultAuxiliaryObjectClass( |
| | | woidBuffer.toString()); |
| | | } |
| | | else |
| | | { |
| | | int msgID = MSGID_ATTR_SYNTAX_DCR_UNKNOWN_AUXILIARY_CLASS; |
| | | String message = getMessage(msgID, valueStr, |
| | | woidBuffer.toString()); |
| | | throw new DirectoryException(ResultCode.CONSTRAINT_VIOLATION, |
| | | message, msgID); |
| | | } |
| | | } |
| | | else if (oc.getObjectClassType() != ObjectClassType.AUXILIARY) |
| | | { |
| | | // This isn't good because it isn't an auxiliary class. Log a |
| | | // message but continue on. |
| | | // This isn't good because it isn't an auxiliary class. |
| | | int msgID = MSGID_ATTR_SYNTAX_DCR_AUXILIARY_CLASS_NOT_AUXILIARY; |
| | | String message = getMessage(msgID, valueStr, woidBuffer.toString()); |
| | | logError(ErrorLogCategory.SCHEMA, ErrorLogSeverity.SEVERE_WARNING, |
| | | message, msgID); |
| | | String message = getMessage(msgID, valueStr, woidBuffer.toString(), |
| | | oc.getObjectClassType().toString()); |
| | | throw new DirectoryException(ResultCode.CONSTRAINT_VIOLATION, |
| | | message, msgID); |
| | | } |
| | | |
| | | ocs.add(oc); |
| | |
| | | { |
| | | // This isn't good because it means that the DIT content rule |
| | | // requires an attribute type that we don't know anything about. |
| | | // in this case all we can do is log a message and construct a |
| | | // default type. |
| | | int msgID = MSGID_ATTR_SYNTAX_DCR_UNKNOWN_REQUIRED_ATTR; |
| | | String message = getMessage(msgID, valueStr, |
| | | woidBuffer.toString()); |
| | | logError(ErrorLogCategory.SCHEMA, ErrorLogSeverity.SEVERE_WARNING, |
| | | message, msgID); |
| | | |
| | | attr = DirectoryServer.getDefaultAttributeType( |
| | | woidBuffer.toString()); |
| | | if (allowUnknownElements) |
| | | { |
| | | attr = DirectoryServer.getDefaultAttributeType( |
| | | woidBuffer.toString()); |
| | | } |
| | | else |
| | | { |
| | | int msgID = MSGID_ATTR_SYNTAX_DCR_UNKNOWN_REQUIRED_ATTR; |
| | | String message = getMessage(msgID, valueStr, |
| | | woidBuffer.toString()); |
| | | throw new DirectoryException(ResultCode.CONSTRAINT_VIOLATION, |
| | | message, msgID); |
| | | } |
| | | } |
| | | |
| | | attrs.add(attr); |
| | |
| | | if (attr == null) |
| | | { |
| | | // This isn't good because it means that the DIT content rule |
| | | // requires an attribute type that we don't know anything about. In |
| | | // this case all we can do is log a message and construct a default |
| | | // type. |
| | | int msgID = MSGID_ATTR_SYNTAX_DCR_UNKNOWN_REQUIRED_ATTR; |
| | | String message = getMessage(msgID, valueStr, woidBuffer.toString()); |
| | | logError(ErrorLogCategory.SCHEMA, ErrorLogSeverity.SEVERE_WARNING, |
| | | message, msgID); |
| | | |
| | | attr = DirectoryServer.getDefaultAttributeType( |
| | | woidBuffer.toString()); |
| | | // requires an attribute type that we don't know anything about. |
| | | if (allowUnknownElements) |
| | | { |
| | | attr = DirectoryServer.getDefaultAttributeType( |
| | | woidBuffer.toString()); |
| | | } |
| | | else |
| | | { |
| | | int msgID = MSGID_ATTR_SYNTAX_DCR_UNKNOWN_REQUIRED_ATTR; |
| | | String message = getMessage(msgID, valueStr, |
| | | woidBuffer.toString()); |
| | | throw new DirectoryException(ResultCode.CONSTRAINT_VIOLATION, |
| | | message, msgID); |
| | | } |
| | | } |
| | | |
| | | attrs.add(attr); |
| | |
| | | if (attr == null) |
| | | { |
| | | // This isn't good because it means that the DIT content rule |
| | | // allows an attribute type that we don't know anything about. In |
| | | // this case all we can do is log a message and construct a |
| | | // default type. |
| | | int msgID = MSGID_ATTR_SYNTAX_DCR_UNKNOWN_OPTIONAL_ATTR; |
| | | String message = getMessage(msgID, valueStr, |
| | | woidBuffer.toString()); |
| | | logError(ErrorLogCategory.SCHEMA, ErrorLogSeverity.SEVERE_WARNING, |
| | | message, msgID); |
| | | |
| | | attr = DirectoryServer.getDefaultAttributeType( |
| | | woidBuffer.toString()); |
| | | // allows an attribute type that we don't know anything about. |
| | | if (allowUnknownElements) |
| | | { |
| | | attr = DirectoryServer.getDefaultAttributeType( |
| | | woidBuffer.toString()); |
| | | } |
| | | else |
| | | { |
| | | int msgID = MSGID_ATTR_SYNTAX_DCR_UNKNOWN_OPTIONAL_ATTR; |
| | | String message = getMessage(msgID, valueStr, |
| | | woidBuffer.toString()); |
| | | throw new DirectoryException(ResultCode.CONSTRAINT_VIOLATION, |
| | | message, msgID); |
| | | } |
| | | } |
| | | |
| | | attrs.add(attr); |
| | |
| | | if (attr == null) |
| | | { |
| | | // This isn't good because it means that the DIT content rule allows |
| | | // an attribute type that we don't know anything about. In this |
| | | // case all we can do is log a message and construct a default type. |
| | | int msgID = MSGID_ATTR_SYNTAX_DCR_UNKNOWN_OPTIONAL_ATTR; |
| | | String message = getMessage(msgID, valueStr, woidBuffer.toString()); |
| | | logError(ErrorLogCategory.SCHEMA, ErrorLogSeverity.SEVERE_WARNING, |
| | | message, msgID); |
| | | |
| | | attr = DirectoryServer.getDefaultAttributeType( |
| | | woidBuffer.toString()); |
| | | // an attribute type that we don't know anything about. |
| | | if (allowUnknownElements) |
| | | { |
| | | attr = DirectoryServer.getDefaultAttributeType( |
| | | woidBuffer.toString()); |
| | | } |
| | | else |
| | | { |
| | | int msgID = MSGID_ATTR_SYNTAX_DCR_UNKNOWN_OPTIONAL_ATTR; |
| | | String message = getMessage(msgID, valueStr, |
| | | woidBuffer.toString()); |
| | | throw new DirectoryException(ResultCode.CONSTRAINT_VIOLATION, |
| | | message, msgID); |
| | | } |
| | | } |
| | | |
| | | attrs.add(attr); |
| | |
| | | { |
| | | // This isn't good because it means that the DIT content rule |
| | | // prohibits an attribute type that we don't know anything about. |
| | | // In this case all we can do is log a message and construct a |
| | | // default type. |
| | | int msgID = MSGID_ATTR_SYNTAX_DCR_UNKNOWN_PROHIBITED_ATTR; |
| | | String message = getMessage(msgID, valueStr, |
| | | woidBuffer.toString()); |
| | | logError(ErrorLogCategory.SCHEMA, ErrorLogSeverity.SEVERE_WARNING, |
| | | message, msgID); |
| | | |
| | | attr = DirectoryServer.getDefaultAttributeType( |
| | | woidBuffer.toString()); |
| | | if (allowUnknownElements) |
| | | { |
| | | attr = DirectoryServer.getDefaultAttributeType( |
| | | woidBuffer.toString()); |
| | | } |
| | | else |
| | | { |
| | | int msgID = MSGID_ATTR_SYNTAX_DCR_UNKNOWN_PROHIBITED_ATTR; |
| | | String message = getMessage(msgID, valueStr, |
| | | woidBuffer.toString()); |
| | | throw new DirectoryException(ResultCode.CONSTRAINT_VIOLATION, |
| | | message, msgID); |
| | | } |
| | | } |
| | | |
| | | attrs.add(attr); |
| | |
| | | { |
| | | // This isn't good because it means that the DIT content rule |
| | | // prohibits an attribute type that we don't know anything about. |
| | | // In this case all we can do is log a message and construct a |
| | | // default type. |
| | | int msgID = MSGID_ATTR_SYNTAX_DCR_UNKNOWN_PROHIBITED_ATTR; |
| | | String message = getMessage(msgID, valueStr, woidBuffer.toString()); |
| | | logError(ErrorLogCategory.SCHEMA, ErrorLogSeverity.SEVERE_WARNING, |
| | | message, msgID); |
| | | |
| | | attr = DirectoryServer.getDefaultAttributeType( |
| | | woidBuffer.toString()); |
| | | if (allowUnknownElements) |
| | | { |
| | | attr = DirectoryServer.getDefaultAttributeType( |
| | | woidBuffer.toString()); |
| | | } |
| | | else |
| | | { |
| | | int msgID = MSGID_ATTR_SYNTAX_DCR_UNKNOWN_PROHIBITED_ATTR; |
| | | String message = getMessage(msgID, valueStr, |
| | | woidBuffer.toString()); |
| | | throw new DirectoryException(ResultCode.CONSTRAINT_VIOLATION, |
| | | message, msgID); |
| | | } |
| | | } |
| | | |
| | | attrs.add(attr); |
| | |
| | | } |
| | | |
| | | |
| | | // Make sure that none of the prohibited attributes is required by the |
| | | // structural or any of the auxiliary classes. |
| | | for (AttributeType t : prohibitedAttributes) |
| | | { |
| | | if (structuralClass.isRequired(t)) |
| | | { |
| | | int msgID = MSGID_ATTR_SYNTAX_DCR_PROHIBITED_REQUIRED_BY_STRUCTURAL; |
| | | String message = getMessage(msgID, valueStr, t.getNameOrOID(), |
| | | structuralClass.getNameOrOID()); |
| | | throw new DirectoryException(ResultCode.CONSTRAINT_VIOLATION, message, |
| | | msgID); |
| | | } |
| | | |
| | | for (ObjectClass oc : auxiliaryClasses) |
| | | { |
| | | if (oc.isRequired(t)) |
| | | { |
| | | int msgID = MSGID_ATTR_SYNTAX_DCR_PROHIBITED_REQUIRED_BY_AUXILIARY; |
| | | String message = getMessage(msgID, valueStr, t.getNameOrOID(), |
| | | oc.getNameOrOID()); |
| | | throw new DirectoryException(ResultCode.CONSTRAINT_VIOLATION, message, |
| | | msgID); |
| | | } |
| | | } |
| | | } |
| | | |
| | | |
| | | return new DITContentRule(value.stringValue(), structuralClass, names, |
| | | description, auxiliaryClasses, requiredAttributes, |
| | | optionalAttributes, prohibitedAttributes, |