| | |
| | | * Portions Copyright 2012-2014 ForgeRock AS |
| | | */ |
| | | package org.opends.server.schema; |
| | | import org.opends.messages.Message; |
| | | import org.forgerock.i18n.LocalizableMessage; |
| | | |
| | | |
| | | |
| | |
| | | import org.opends.server.types.*; |
| | | import org.forgerock.opendj.ldap.ByteSequence; |
| | | import static org.opends.messages.SchemaMessages.*; |
| | | import org.opends.messages.MessageBuilder; |
| | | import org.forgerock.i18n.LocalizableMessageBuilder; |
| | | import static org.opends.server.schema.SchemaConstants.*; |
| | | import static org.opends.server.util.ServerConstants.*; |
| | | import static org.opends.server.util.StaticUtils.*; |
| | |
| | | DirectoryServer.getEqualityMatchingRule(EMR_CASE_IGNORE_OID); |
| | | if (defaultEqualityMatchingRule == null) |
| | | { |
| | | Message message = ERR_ATTR_SYNTAX_UNKNOWN_EQUALITY_MATCHING_RULE.get( |
| | | LocalizableMessage message = ERR_ATTR_SYNTAX_UNKNOWN_EQUALITY_MATCHING_RULE.get( |
| | | EMR_CASE_IGNORE_OID, SYNTAX_OBJECTCLASS_NAME); |
| | | throw new InitializationException(message); |
| | | } |
| | |
| | | DirectoryServer.getOrderingMatchingRule(OMR_CASE_IGNORE_OID); |
| | | if (defaultOrderingMatchingRule == null) |
| | | { |
| | | Message message = ERR_ATTR_SYNTAX_UNKNOWN_ORDERING_MATCHING_RULE.get( |
| | | LocalizableMessage message = ERR_ATTR_SYNTAX_UNKNOWN_ORDERING_MATCHING_RULE.get( |
| | | OMR_CASE_IGNORE_OID, SYNTAX_OBJECTCLASS_NAME); |
| | | throw new InitializationException(message); |
| | | } |
| | |
| | | DirectoryServer.getSubstringMatchingRule(SMR_CASE_IGNORE_OID); |
| | | if (defaultSubstringMatchingRule == null) |
| | | { |
| | | Message message = ERR_ATTR_SYNTAX_UNKNOWN_SUBSTRING_MATCHING_RULE.get( |
| | | LocalizableMessage message = ERR_ATTR_SYNTAX_UNKNOWN_SUBSTRING_MATCHING_RULE.get( |
| | | SMR_CASE_IGNORE_OID, SYNTAX_OBJECTCLASS_NAME); |
| | | throw new InitializationException(message); |
| | | } |
| | |
| | | * {@inheritDoc} |
| | | */ |
| | | public boolean valueIsAcceptable(ByteSequence value, |
| | | MessageBuilder invalidReason) |
| | | LocalizableMessageBuilder invalidReason) |
| | | { |
| | | // We'll use the decodeObjectClass method to determine if the value is |
| | | // acceptable. |
| | |
| | | { |
| | | // This means that the value was empty or contained only whitespace. That |
| | | // is illegal. |
| | | Message message = ERR_ATTR_SYNTAX_OBJECTCLASS_EMPTY_VALUE.get(); |
| | | LocalizableMessage message = ERR_ATTR_SYNTAX_OBJECTCLASS_EMPTY_VALUE.get(); |
| | | throw new DirectoryException( |
| | | ResultCode.INVALID_ATTRIBUTE_SYNTAX, message); |
| | | } |
| | |
| | | char c = valueStr.charAt(pos++); |
| | | if (c != '(') |
| | | { |
| | | Message message = ERR_ATTR_SYNTAX_OBJECTCLASS_EXPECTED_OPEN_PARENTHESIS. |
| | | LocalizableMessage message = ERR_ATTR_SYNTAX_OBJECTCLASS_EXPECTED_OPEN_PARENTHESIS. |
| | | get(valueStr, (pos-1), String.valueOf(c)); |
| | | throw new DirectoryException( |
| | | ResultCode.INVALID_ATTRIBUTE_SYNTAX, message); |
| | |
| | | { |
| | | // This means that the end of the value was reached before we could find |
| | | // the OID. Ths is illegal. |
| | | Message message = |
| | | LocalizableMessage message = |
| | | ERR_ATTR_SYNTAX_OBJECTCLASS_TRUNCATED_VALUE.get(valueStr); |
| | | throw new DirectoryException( |
| | | ResultCode.INVALID_ATTRIBUTE_SYNTAX, message); |
| | |
| | | { |
| | | if (lastWasPeriod) |
| | | { |
| | | Message message = |
| | | LocalizableMessage message = |
| | | ERR_ATTR_SYNTAX_OBJECTCLASS_DOUBLE_PERIOD_IN_NUMERIC_OID. |
| | | get(valueStr, (pos-1)); |
| | | throw new DirectoryException(ResultCode.INVALID_ATTRIBUTE_SYNTAX, |
| | |
| | | else if (! isDigit(c)) |
| | | { |
| | | // This must have been an illegal character. |
| | | Message message = |
| | | LocalizableMessage message = |
| | | ERR_ATTR_SYNTAX_OBJECTCLASS_ILLEGAL_CHAR_IN_NUMERIC_OID. |
| | | get(valueStr, String.valueOf(c), (pos-1)); |
| | | throw new DirectoryException(ResultCode.INVALID_ATTRIBUTE_SYNTAX, |
| | |
| | | else |
| | | { |
| | | // This must have been an illegal character. |
| | | Message message = |
| | | LocalizableMessage message = |
| | | ERR_ATTR_SYNTAX_OBJECTCLASS_ILLEGAL_CHAR_IN_STRING_OID. |
| | | get(valueStr, String.valueOf(c), (pos-1)); |
| | | throw new DirectoryException(ResultCode.INVALID_ATTRIBUTE_SYNTAX, |
| | |
| | | String oid; |
| | | if (pos >= length) |
| | | { |
| | | Message message = |
| | | LocalizableMessage message = |
| | | ERR_ATTR_SYNTAX_OBJECTCLASS_TRUNCATED_VALUE.get(valueStr); |
| | | throw new DirectoryException( |
| | | ResultCode.INVALID_ATTRIBUTE_SYNTAX, message); |
| | |
| | | { |
| | | // This means that the end of the value was reached before we could find |
| | | // the OID. Ths is illegal. |
| | | Message message = |
| | | LocalizableMessage message = |
| | | ERR_ATTR_SYNTAX_OBJECTCLASS_TRUNCATED_VALUE.get(valueStr); |
| | | throw new DirectoryException( |
| | | ResultCode.INVALID_ATTRIBUTE_SYNTAX, message); |
| | |
| | | // We must be at the end of the value. If not, then that's a problem. |
| | | if (pos < length) |
| | | { |
| | | Message message = |
| | | LocalizableMessage message = |
| | | ERR_ATTR_SYNTAX_OBJECTCLASS_UNEXPECTED_CLOSE_PARENTHESIS. |
| | | get(valueStr, (pos-1)); |
| | | throw new DirectoryException(ResultCode.INVALID_ATTRIBUTE_SYNTAX, |
| | |
| | | else |
| | | { |
| | | // This is an illegal character. |
| | | Message message = ERR_ATTR_SYNTAX_OBJECTCLASS_ILLEGAL_CHAR.get( |
| | | LocalizableMessage message = ERR_ATTR_SYNTAX_OBJECTCLASS_ILLEGAL_CHAR.get( |
| | | valueStr, String.valueOf(c), (pos-1)); |
| | | throw new DirectoryException(ResultCode.INVALID_ATTRIBUTE_SYNTAX, |
| | | message); |
| | |
| | | //hyphen is allowed but not as the first byte. |
| | | if (index==0) |
| | | { |
| | | Message msg = ERR_OC_SYNTAX_ATTR_ILLEGAL_INITIAL_DASH. |
| | | LocalizableMessage msg = ERR_OC_SYNTAX_ATTR_ILLEGAL_INITIAL_DASH. |
| | | get(value.toString()); |
| | | throw new DirectoryException( |
| | | ResultCode.INVALID_ATTRIBUTE_SYNTAX, |
| | |
| | | // name exceptions option is enabled. |
| | | if (index==0) |
| | | { |
| | | Message msg = |
| | | LocalizableMessage msg = |
| | | ERR_OC_SYNTAX_ATTR_ILLEGAL_INITIAL_UNDERSCORE. |
| | | get(value.toString(), |
| | | ATTR_ALLOW_ATTRIBUTE_NAME_EXCEPTIONS); |
| | |
| | | } |
| | | else if (!allowExceptions) |
| | | { |
| | | Message msg = ERR_OC_SYNTAX_ATTR_ILLEGAL_UNDERSCORE_CHAR. |
| | | LocalizableMessage msg = ERR_OC_SYNTAX_ATTR_ILLEGAL_UNDERSCORE_CHAR. |
| | | get(value.toString(), |
| | | ATTR_ALLOW_ATTRIBUTE_NAME_EXCEPTIONS); |
| | | throw new DirectoryException( |
| | |
| | | //can not be a digit. |
| | | if(index ==0 && isDigit(ch) && !allowExceptions) |
| | | { |
| | | Message message = ERR_OC_SYNTAX_ATTR_ILLEGAL_INITIAL_DIGIT. |
| | | LocalizableMessage message = ERR_OC_SYNTAX_ATTR_ILLEGAL_INITIAL_DIGIT. |
| | | get(value.toString(), ch, |
| | | ATTR_ALLOW_ATTRIBUTE_NAME_EXCEPTIONS); |
| | | throw new DirectoryException( |
| | |
| | | else if(!((ch>='0' && ch<='9') || (ch>='A' && ch<='Z') || |
| | | (ch>='a' && ch<='z'))) |
| | | { |
| | | Message msg = ERR_OC_SYNTAX_ATTR_ILLEGAL_CHAR.get( |
| | | LocalizableMessage msg = ERR_OC_SYNTAX_ATTR_ILLEGAL_CHAR.get( |
| | | value.toString(), ch, index); |
| | | throw new DirectoryException( |
| | | ResultCode.INVALID_ATTRIBUTE_SYNTAX, |
| | |
| | | { |
| | | // This is bad because we don't know what the superior oc |
| | | // is so we can't base this objectclass on it. |
| | | Message message = |
| | | LocalizableMessage message = |
| | | WARN_ATTR_SYNTAX_OBJECTCLASS_UNKNOWN_SUPERIOR_CLASS. |
| | | get(String.valueOf(oid), String.valueOf(woidBuffer)); |
| | | throw new DirectoryException(ResultCode.CONSTRAINT_VIOLATION, |
| | |
| | | } |
| | | else if (c != '$') |
| | | { |
| | | Message message = ERR_ATTR_SYNTAX_OBJECTCLASS_ILLEGAL_CHAR.get( |
| | | LocalizableMessage message = ERR_ATTR_SYNTAX_OBJECTCLASS_ILLEGAL_CHAR.get( |
| | | valueStr, String.valueOf(c), (pos-1)); |
| | | throw new DirectoryException(ResultCode.INVALID_ATTRIBUTE_SYNTAX, |
| | | message); |
| | |
| | | { |
| | | // This is bad because we don't know what the superior oc |
| | | // is so we can't base this objectclass on it. |
| | | Message message = |
| | | LocalizableMessage message = |
| | | WARN_ATTR_SYNTAX_OBJECTCLASS_UNKNOWN_SUPERIOR_CLASS. |
| | | get(String.valueOf(oid), String.valueOf(woidBuffer)); |
| | | throw new DirectoryException(ResultCode.CONSTRAINT_VIOLATION, |
| | |
| | | { |
| | | // This isn't good because it means that the objectclass |
| | | // requires an attribute type that we don't know anything about. |
| | | Message message = |
| | | LocalizableMessage message = |
| | | WARN_ATTR_SYNTAX_OBJECTCLASS_UNKNOWN_REQUIRED_ATTR. |
| | | get(oid, woidBuffer.toString()); |
| | | throw new DirectoryException(ResultCode.CONSTRAINT_VIOLATION, |
| | |
| | | } |
| | | else if (c != '$') |
| | | { |
| | | Message message = ERR_ATTR_SYNTAX_OBJECTCLASS_ILLEGAL_CHAR.get( |
| | | LocalizableMessage message = ERR_ATTR_SYNTAX_OBJECTCLASS_ILLEGAL_CHAR.get( |
| | | valueStr, String.valueOf(c), (pos-1)); |
| | | throw new DirectoryException(ResultCode.INVALID_ATTRIBUTE_SYNTAX, |
| | | message); |
| | |
| | | { |
| | | // This isn't good because it means that the objectclass requires |
| | | // an attribute type that we don't know anything about. |
| | | Message message = |
| | | LocalizableMessage message = |
| | | WARN_ATTR_SYNTAX_OBJECTCLASS_UNKNOWN_REQUIRED_ATTR. |
| | | get(oid, woidBuffer.toString()); |
| | | throw new DirectoryException(ResultCode.CONSTRAINT_VIOLATION, |
| | |
| | | { |
| | | // This isn't good because it means that the objectclass allows |
| | | // an attribute type that we don't know anything about. |
| | | Message message = |
| | | LocalizableMessage message = |
| | | WARN_ATTR_SYNTAX_OBJECTCLASS_UNKNOWN_OPTIONAL_ATTR. |
| | | get(oid, woidBuffer.toString()); |
| | | throw new DirectoryException(ResultCode.CONSTRAINT_VIOLATION, |
| | |
| | | } |
| | | else if (c != '$') |
| | | { |
| | | Message message = ERR_ATTR_SYNTAX_OBJECTCLASS_ILLEGAL_CHAR.get( |
| | | LocalizableMessage message = ERR_ATTR_SYNTAX_OBJECTCLASS_ILLEGAL_CHAR.get( |
| | | valueStr, String.valueOf(c), (pos-1)); |
| | | throw new DirectoryException(ResultCode.INVALID_ATTRIBUTE_SYNTAX, |
| | | message); |
| | |
| | | { |
| | | // This isn't good because it means that the objectclass allows an |
| | | // attribute type that we don't know anything about. |
| | | Message message = |
| | | LocalizableMessage message = |
| | | WARN_ATTR_SYNTAX_OBJECTCLASS_UNKNOWN_OPTIONAL_ATTR. |
| | | get(oid, woidBuffer.toString()); |
| | | throw new DirectoryException(ResultCode.CONSTRAINT_VIOLATION, |
| | |
| | | // Abstract classes may only inherit from other abstract classes. |
| | | if (superiorType != ObjectClassType.ABSTRACT) |
| | | { |
| | | Message message = |
| | | LocalizableMessage message = |
| | | WARN_ATTR_SYNTAX_OBJECTCLASS_INVALID_SUPERIOR_TYPE. |
| | | get(oid, objectClassType.toString(), superiorType.toString(), |
| | | superiorClass.getNameOrOID()); |
| | |
| | | if ((superiorType != ObjectClassType.ABSTRACT) && |
| | | (superiorType != ObjectClassType.AUXILIARY)) |
| | | { |
| | | Message message = |
| | | LocalizableMessage message = |
| | | WARN_ATTR_SYNTAX_OBJECTCLASS_INVALID_SUPERIOR_TYPE. |
| | | get(oid, objectClassType.toString(), superiorType.toString(), |
| | | superiorClass.getNameOrOID()); |
| | |
| | | if ((superiorType != ObjectClassType.ABSTRACT) && |
| | | (superiorType != ObjectClassType.STRUCTURAL)) |
| | | { |
| | | Message message = |
| | | LocalizableMessage message = |
| | | WARN_ATTR_SYNTAX_OBJECTCLASS_INVALID_SUPERIOR_TYPE. |
| | | get(oid, objectClassType.toString(), superiorType.toString(), |
| | | superiorClass.getNameOrOID()); |
| | |
| | | // the superior chain. |
| | | if (! superiorChainIncludesTop(superiorClass)) |
| | | { |
| | | Message message = |
| | | LocalizableMessage message = |
| | | WARN_ATTR_SYNTAX_OBJECTCLASS_STRUCTURAL_SUPERIOR_NOT_TOP. |
| | | get(oid); |
| | | throw new DirectoryException(ResultCode.CONSTRAINT_VIOLATION, |
| | |
| | | |
| | | if (startPos >= length) |
| | | { |
| | | Message message = |
| | | LocalizableMessage message = |
| | | ERR_ATTR_SYNTAX_OBJECTCLASS_TRUNCATED_VALUE.get(valueStr); |
| | | throw new DirectoryException( |
| | | ResultCode.INVALID_ATTRIBUTE_SYNTAX, message); |
| | |
| | | |
| | | if (startPos >= length) |
| | | { |
| | | Message message = |
| | | LocalizableMessage message = |
| | | ERR_ATTR_SYNTAX_OBJECTCLASS_TRUNCATED_VALUE.get(valueStr); |
| | | throw new DirectoryException( |
| | | ResultCode.INVALID_ATTRIBUTE_SYNTAX, message); |
| | |
| | | // The next character must be a single quote. |
| | | if (c != '\'') |
| | | { |
| | | Message message = WARN_ATTR_SYNTAX_OBJECTCLASS_EXPECTED_QUOTE_AT_POS.get( |
| | | LocalizableMessage message = WARN_ATTR_SYNTAX_OBJECTCLASS_EXPECTED_QUOTE_AT_POS.get( |
| | | valueStr, startPos, String.valueOf(c)); |
| | | throw new DirectoryException( |
| | | ResultCode.INVALID_ATTRIBUTE_SYNTAX, message); |
| | |
| | | // If we're at the end of the value, then that's illegal. |
| | | if (startPos >= length) |
| | | { |
| | | Message message = |
| | | LocalizableMessage message = |
| | | ERR_ATTR_SYNTAX_OBJECTCLASS_TRUNCATED_VALUE.get(valueStr); |
| | | throw new DirectoryException( |
| | | ResultCode.INVALID_ATTRIBUTE_SYNTAX, message); |
| | |
| | | |
| | | if (startPos >= length) |
| | | { |
| | | Message message = |
| | | LocalizableMessage message = |
| | | ERR_ATTR_SYNTAX_OBJECTCLASS_TRUNCATED_VALUE.get(lowerStr); |
| | | throw new DirectoryException( |
| | | ResultCode.INVALID_ATTRIBUTE_SYNTAX, message); |
| | |
| | | // The next character must be a single quote. |
| | | if (c != '\'') |
| | | { |
| | | Message message = WARN_ATTR_SYNTAX_OBJECTCLASS_EXPECTED_QUOTE_AT_POS.get( |
| | | LocalizableMessage message = WARN_ATTR_SYNTAX_OBJECTCLASS_EXPECTED_QUOTE_AT_POS.get( |
| | | valueStr, startPos, String.valueOf(c)); |
| | | throw new DirectoryException( |
| | | ResultCode.INVALID_ATTRIBUTE_SYNTAX, message); |
| | |
| | | // If we're at the end of the value, then that's illegal. |
| | | if (startPos >= length) |
| | | { |
| | | Message message = |
| | | LocalizableMessage message = |
| | | ERR_ATTR_SYNTAX_OBJECTCLASS_TRUNCATED_VALUE.get(lowerStr); |
| | | throw new DirectoryException( |
| | | ResultCode.INVALID_ATTRIBUTE_SYNTAX, message); |
| | |
| | | |
| | | if (startPos >= length) |
| | | { |
| | | Message message = |
| | | LocalizableMessage message = |
| | | ERR_ATTR_SYNTAX_OBJECTCLASS_TRUNCATED_VALUE.get(lowerStr); |
| | | throw new DirectoryException( |
| | | ResultCode.INVALID_ATTRIBUTE_SYNTAX, message); |
| | |
| | | { |
| | | if (lastWasPeriod) |
| | | { |
| | | Message message = |
| | | LocalizableMessage message = |
| | | ERR_ATTR_SYNTAX_OBJECTCLASS_DOUBLE_PERIOD_IN_NUMERIC_OID. |
| | | get(lowerStr, (startPos-1)); |
| | | throw new DirectoryException(ResultCode.INVALID_ATTRIBUTE_SYNTAX, |
| | |
| | | } |
| | | |
| | | // This must have been an illegal character. |
| | | Message message = |
| | | LocalizableMessage message = |
| | | ERR_ATTR_SYNTAX_OBJECTCLASS_ILLEGAL_CHAR_IN_NUMERIC_OID. |
| | | get(lowerStr, String.valueOf(c), (startPos-1)); |
| | | throw new DirectoryException(ResultCode.INVALID_ATTRIBUTE_SYNTAX, |
| | |
| | | } |
| | | |
| | | // This must have been an illegal character. |
| | | Message message = |
| | | LocalizableMessage message = |
| | | ERR_ATTR_SYNTAX_OBJECTCLASS_ILLEGAL_CHAR_IN_STRING_OID. |
| | | get(lowerStr, String.valueOf(c), (startPos-1)); |
| | | throw new DirectoryException(ResultCode.INVALID_ATTRIBUTE_SYNTAX, |
| | |
| | | } |
| | | else |
| | | { |
| | | Message message = |
| | | LocalizableMessage message = |
| | | ERR_ATTR_SYNTAX_OBJECTCLASS_ILLEGAL_CHAR.get( |
| | | lowerStr, String.valueOf(c), startPos); |
| | | throw new DirectoryException( |
| | |
| | | // If we're at the end of the value, then that's illegal. |
| | | if (startPos >= length) |
| | | { |
| | | Message message = |
| | | LocalizableMessage message = |
| | | ERR_ATTR_SYNTAX_OBJECTCLASS_TRUNCATED_VALUE.get(lowerStr); |
| | | throw new DirectoryException( |
| | | ResultCode.INVALID_ATTRIBUTE_SYNTAX, message); |
| | |
| | | |
| | | if (startPos >= length) |
| | | { |
| | | Message message = |
| | | LocalizableMessage message = |
| | | ERR_ATTR_SYNTAX_OBJECTCLASS_TRUNCATED_VALUE.get(valueStr); |
| | | throw new DirectoryException( |
| | | ResultCode.INVALID_ATTRIBUTE_SYNTAX, message); |
| | |
| | | |
| | | if (startPos >= length) |
| | | { |
| | | Message message = |
| | | LocalizableMessage message = |
| | | ERR_ATTR_SYNTAX_OBJECTCLASS_TRUNCATED_VALUE.get(valueStr); |
| | | throw new DirectoryException(ResultCode.INVALID_ATTRIBUTE_SYNTAX, |
| | | message); |
| | |
| | | else if (c == '(') |
| | | { |
| | | // This is an illegal character. |
| | | Message message = ERR_ATTR_SYNTAX_OBJECTCLASS_ILLEGAL_CHAR.get( |
| | | LocalizableMessage message = ERR_ATTR_SYNTAX_OBJECTCLASS_ILLEGAL_CHAR.get( |
| | | valueStr, String.valueOf(c), startPos); |
| | | throw new DirectoryException(ResultCode.INVALID_ATTRIBUTE_SYNTAX, |
| | | message); |
| | |
| | | |
| | | if (startPos >= length) |
| | | { |
| | | Message message = |
| | | LocalizableMessage message = |
| | | ERR_ATTR_SYNTAX_OBJECTCLASS_TRUNCATED_VALUE.get(valueStr); |
| | | throw new DirectoryException( |
| | | ResultCode.INVALID_ATTRIBUTE_SYNTAX, message); |