// Create the message. private static Message createMessage( ServerManagedObject<?> partialManagedObject, Collection<PropertyException> causes) { Validator.ensureNotNull(causes); Validator.ensureTrue(!causes.isEmpty()); ManagedObjectDefinition<?, ?> d = partialManagedObject.getManagedObjectDefinition(); if (causes.size() == 1) { return ERR_MANAGED_OBJECT_DECODING_EXCEPTION_SINGLE.get( d.getUserFriendlyName(), causes.iterator().next().getMessageObject()); } else { MessageBuilder builder = new MessageBuilder(); boolean isFirst = true; for (PropertyException cause : causes) { if (!isFirst) { builder.append("; "); } builder.append(cause.getMessageObject()); isFirst = false; } return ERR_MANAGED_OBJECT_DECODING_EXCEPTION_PLURAL.get( d.getUserFriendlyName(), builder.toMessage()); } }
/** {@inheritDoc} */ @Override() public final String[][] getResponseLogElements() { // Note that no debugging will be done in this method because it is a likely // candidate for being called by the logging subsystem. // There is no response for an abandon. However, we will still want to log // information about whether it was successful. String resultCode = String.valueOf(getResultCode().getIntValue()); String errorMessage; MessageBuilder errorMessageBuffer = getErrorMessage(); if (errorMessageBuffer == null) { errorMessage = null; } else { errorMessage = errorMessageBuffer.toString(); } String processingTime = String.valueOf(getProcessingTime()); return new String[][] { new String[] {LOG_ELEMENT_RESULT_CODE, resultCode}, new String[] {LOG_ELEMENT_ERROR_MESSAGE, errorMessage}, new String[] {LOG_ELEMENT_PROCESSING_TIME, processingTime} }; }
/** * Concatenate a list of messages into a single message. * * @param reasons The list of messages to concatenate. * @param unacceptableReason The single message to which messages should be appended. */ protected final void generateUnacceptableReason( Collection<Message> reasons, MessageBuilder unacceptableReason) { boolean isFirst = true; for (Message reason : reasons) { if (isFirst) { isFirst = false; } else { unacceptableReason.append(" "); } unacceptableReason.append(reason); } }
/** {@inheritDoc} */ @Override public boolean valueIsAcceptable(ByteSequence value, MessageBuilder invalidReason) { String strValue = value.toString(); boolean matches = pattern.matcher(strValue).matches(); if (!matches) { Message message = WARN_ATTR_SYNTAX_LDAPSYNTAX_REGEX_INVALID_VALUE.get(strValue, pattern.pattern()); invalidReason.append(message); } return matches; }
/** {@inheritDoc} */ @Override public boolean valueIsAcceptable(ByteSequence value, MessageBuilder invalidReason) { // The value is acceptable if it belongs to the set. boolean isAllowed = entries.contains(value); if (!isAllowed) { Message message = WARN_ATTR_SYNTAX_LDAPSYNTAX_ENUM_INVALID_VALUE.get(value.toString(), oid); invalidReason.append(message); } return isAllowed; }
/** * 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. */ @Override public boolean valueIsAcceptable(ByteSequence value, MessageBuilder invalidReason) { // We'll use the decodeAttributeType method to determine if the value is // acceptable. try { decodeLDAPSyntax(value, DirectoryServer.getSchema(), true); return true; } catch (DirectoryException de) { if (debugEnabled()) { TRACER.debugCaught(DebugLogLevel.ERROR, de); } invalidReason.append(de.getMessageObject()); return false; } }
/** {@inheritDoc} */ @Override() public boolean passwordIsAcceptable( ByteString newPassword, Set<ByteString> currentPasswords, Operation operation, Entry userEntry, MessageBuilder invalidReason) { // Get a handle to the current configuration and see if we need to count // the number of repeated characters in the password. RepeatedCharactersPasswordValidatorCfg config = currentConfig; int maxRepeats = config.getMaxConsecutiveLength(); if (maxRepeats <= 0) { // We don't need to check anything, so the password will be acceptable. return true; } // Get the password as a string. If we should use case-insensitive // validation, then convert it to use all lowercase characters. String passwordString = newPassword.toString(); if (!config.isCaseSensitiveValidation()) { passwordString = passwordString.toLowerCase(); } // Create variables to keep track of the last character we've seen and how // many times we have seen it. char lastCharacter = '\u0000'; int consecutiveCount = 0; // Iterate through the characters in the password. If the consecutive // count ever gets too high, then fail. for (int i = 0; i < passwordString.length(); i++) { char currentCharacter = passwordString.charAt(i); if (currentCharacter == lastCharacter) { consecutiveCount++; if (consecutiveCount > maxRepeats) { Message message = ERR_REPEATEDCHARS_VALIDATOR_TOO_MANY_CONSECUTIVE.get(maxRepeats); invalidReason.append(message); return false; } } else { lastCharacter = currentCharacter; consecutiveCount = 1; } } return true; }
/** * 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. */ public boolean valueIsAcceptable(ByteSequence value, MessageBuilder invalidReason) { // Check to see if the provided value was null. If so, then that's not // acceptable. if (value == null) { invalidReason.append(ERR_ATTR_SYNTAX_OTHER_MAILBOX_EMPTY_VALUE.get()); return false; } // Get the value as a string and determine its length. If it is empty, then // that's not acceptable. String valueString = value.toString(); int valueLength = valueString.length(); if (valueLength == 0) { invalidReason.append(ERR_ATTR_SYNTAX_OTHER_MAILBOX_EMPTY_VALUE.get()); return false; } // Iterate through the characters in the vale until we find a dollar sign. // Every character up to that point must be a printable string character. int pos = 0; for (; pos < valueLength; pos++) { char c = valueString.charAt(pos); if (c == '$') { if (pos == 0) { invalidReason.append(ERR_ATTR_SYNTAX_OTHER_MAILBOX_NO_MBTYPE.get(valueString)); return false; } pos++; break; } else if (!PrintableString.isPrintableCharacter(c)) { invalidReason.append( ERR_ATTR_SYNTAX_OTHER_MAILBOX_ILLEGAL_MBTYPE_CHAR.get( valueString, String.valueOf(c), pos)); return false; } } // Make sure there is at least one character left for the mailbox. if (pos >= valueLength) { invalidReason.append(ERR_ATTR_SYNTAX_OTHER_MAILBOX_NO_MAILBOX.get(valueString)); return false; } // The remaining characters in the value must be IA5 (ASCII) characters. for (; pos < valueLength; pos++) { char c = valueString.charAt(pos); if (c != (c & 0x7F)) { invalidReason.append( ERR_ATTR_SYNTAX_OTHER_MAILBOX_ILLEGAL_MB_CHAR.get(valueString, String.valueOf(c), pos)); return false; } } // If we've gotten here, then the value is OK. return true; }