| | |
| | | * (the "License"). You may not use this file except in compliance |
| | | * with the License. |
| | | * |
| | | * You can obtain a copy of the license at |
| | | * trunk/opendj3/legal-notices/CDDLv1_0.txt |
| | | * You can obtain a copy of the license at legal-notices/CDDLv1_0.txt |
| | | * or http://forgerock.org/license/CDDLv1.0.html. |
| | | * See the License for the specific language governing permissions |
| | | * and limitations under the License. |
| | | * |
| | | * When distributing Covered Code, include this CDDL HEADER in each |
| | | * file and include the License file at |
| | | * trunk/opendj3/legal-notices/CDDLv1_0.txt. If applicable, |
| | | * add the following below this CDDL HEADER, with the fields enclosed |
| | | * by brackets "[]" replaced with your own identifying information: |
| | | * file and include the License file at legal-notices/CDDLv1_0.txt. |
| | | * If applicable, add the following below this CDDL HEADER, with the |
| | | * fields enclosed by brackets "[]" replaced with your own identifying |
| | | * information: |
| | | * Portions Copyright [yyyy] [name of copyright owner] |
| | | * |
| | | * CDDL HEADER END |
| | |
| | | |
| | | package org.forgerock.opendj.ldap; |
| | | |
| | | |
| | | |
| | | import java.util.concurrent.ExecutionException; |
| | | |
| | | import org.forgerock.opendj.ldap.responses.Responses; |
| | | import org.forgerock.opendj.ldap.responses.Result; |
| | | |
| | | |
| | | |
| | | /** |
| | | * Thrown when the result code returned in a Result indicates that the Request |
| | | * was unsuccessful. This class can be sub-classed in order to implement |
| | | * application specific exceptions. |
| | | */ |
| | | @SuppressWarnings("serial") |
| | | public class ErrorResultException extends ExecutionException |
| | | { |
| | | public class ErrorResultException extends ExecutionException { |
| | | |
| | | /** |
| | | * Creates a new error result exception with the provided result code and an |
| | | * empty diagnostic message. |
| | | * |
| | | * @param resultCode |
| | | * The result code. |
| | | * @return The new error result exception. |
| | | * @throws IllegalArgumentException |
| | | * If the provided result code does not represent a failure. |
| | | * @throws NullPointerException |
| | | * If {@code resultCode} was {@code null}. |
| | | */ |
| | | public static ErrorResultException newErrorResult( |
| | | ResultCode resultCode) |
| | | { |
| | | return newErrorResult(resultCode, null, null); |
| | | } |
| | | |
| | | |
| | | |
| | | /** |
| | | * Creates a new error result exception with the provided result code and |
| | | * diagnostic message. |
| | | * |
| | | * @param resultCode |
| | | * The result code. |
| | | * @param diagnosticMessage |
| | | * The diagnostic message, which may be empty or {@code null} |
| | | * indicating that none was provided. |
| | | * @return The new error result exception. |
| | | * @throws IllegalArgumentException |
| | | * If the provided result code does not represent a failure. |
| | | * @throws NullPointerException |
| | | * If {@code resultCode} was {@code null}. |
| | | */ |
| | | public static ErrorResultException newErrorResult( |
| | | ResultCode resultCode, String diagnosticMessage) |
| | | { |
| | | return newErrorResult(resultCode, diagnosticMessage, null); |
| | | } |
| | | |
| | | |
| | | |
| | | /** |
| | | * Creates a new error result exception with the provided result code and |
| | | * cause. The diagnostic message will be taken from the cause, if provided. |
| | | * |
| | | * @param resultCode |
| | | * The result code. |
| | | * @param cause |
| | | * The throwable cause, which may be {@code null} indicating that |
| | | * none was provided. |
| | | * @return The new error result exception. |
| | | * @throws IllegalArgumentException |
| | | * If the provided result code does not represent a failure. |
| | | * @throws NullPointerException |
| | | * If {@code resultCode} was {@code null}. |
| | | */ |
| | | public static ErrorResultException newErrorResult( |
| | | ResultCode resultCode, Throwable cause) |
| | | { |
| | | return newErrorResult(resultCode, null, cause); |
| | | } |
| | | |
| | | |
| | | |
| | | /** |
| | | * Creates a new error result exception with the provided result code, |
| | | * diagnostic message, and cause. |
| | | * |
| | | * @param resultCode |
| | | * The result code. |
| | | * @param diagnosticMessage |
| | | * The diagnostic message, which may be empty or {@code null} |
| | | * indicating that none was provided. |
| | | * @param cause |
| | | * The throwable cause, which may be {@code null} indicating that |
| | | * none was provided. |
| | | * @return The new error result exception. |
| | | * @throws IllegalArgumentException |
| | | * If the provided result code does not represent a failure. |
| | | * @throws NullPointerException |
| | | * If {@code resultCode} was {@code null}. |
| | | */ |
| | | public static ErrorResultException newErrorResult( |
| | | ResultCode resultCode, String diagnosticMessage, Throwable cause) |
| | | { |
| | | final Result result = Responses.newResult(resultCode); |
| | | if (diagnosticMessage != null) |
| | | { |
| | | result.setDiagnosticMessage(diagnosticMessage); |
| | | } |
| | | else if (cause != null) |
| | | { |
| | | result.setDiagnosticMessage(cause.getLocalizedMessage()); |
| | | } |
| | | result.setCause(cause); |
| | | return newErrorResult(result); |
| | | } |
| | | |
| | | |
| | | |
| | | /** |
| | | * Creates a new error result exception using the provided result. |
| | | * |
| | | * @param result |
| | | * The result whose result code indicates a failure. |
| | | * @return The error result exception wrapping the provided result. |
| | | * @throws IllegalArgumentException |
| | | * If the provided result does not represent a failure. |
| | | * @throws NullPointerException |
| | | * If {@code result} was {@code null}. |
| | | */ |
| | | public static ErrorResultException newErrorResult( |
| | | final Result result) |
| | | { |
| | | if (!result.getResultCode().isExceptional()) |
| | | { |
| | | throw new IllegalArgumentException( |
| | | "Attempted to wrap a successful result: " + result); |
| | | /** |
| | | * Creates a new error result exception with the provided result code and an |
| | | * empty diagnostic message. |
| | | * |
| | | * @param resultCode |
| | | * The result code. |
| | | * @return The new error result exception. |
| | | * @throws IllegalArgumentException |
| | | * If the provided result code does not represent a failure. |
| | | * @throws NullPointerException |
| | | * If {@code resultCode} was {@code null}. |
| | | */ |
| | | public static ErrorResultException newErrorResult(ResultCode resultCode) { |
| | | return newErrorResult(resultCode, null, null); |
| | | } |
| | | |
| | | ResultCode rc = result.getResultCode(); |
| | | if (rc == ResultCode.ASSERTION_FAILED) |
| | | { |
| | | return new AssertionFailureException(result); |
| | | } |
| | | else if (rc == ResultCode.AUTH_METHOD_NOT_SUPPORTED |
| | | || rc == ResultCode.CLIENT_SIDE_AUTH_UNKNOWN |
| | | || rc == ResultCode.INAPPROPRIATE_AUTHENTICATION |
| | | || rc == ResultCode.INVALID_CREDENTIALS) |
| | | { |
| | | return new AuthenticationException(result); |
| | | } |
| | | else if (rc == ResultCode.AUTHORIZATION_DENIED |
| | | || rc == ResultCode.CONFIDENTIALITY_REQUIRED |
| | | || rc == ResultCode.INSUFFICIENT_ACCESS_RIGHTS |
| | | || rc == ResultCode.STRONG_AUTH_REQUIRED) |
| | | { |
| | | return new AuthorizationException(result); |
| | | } |
| | | else if (rc == ResultCode.CLIENT_SIDE_USER_CANCELLED |
| | | || rc == ResultCode.CANCELLED) |
| | | { |
| | | return new CancelledResultException(result); |
| | | } |
| | | else if (rc == ResultCode.CLIENT_SIDE_SERVER_DOWN |
| | | || rc == ResultCode.CLIENT_SIDE_CONNECT_ERROR |
| | | || rc == ResultCode.CLIENT_SIDE_DECODING_ERROR |
| | | || rc == ResultCode.CLIENT_SIDE_ENCODING_ERROR) |
| | | { |
| | | return new ConnectionException(result); |
| | | } |
| | | else if (rc == ResultCode.ATTRIBUTE_OR_VALUE_EXISTS |
| | | || rc == ResultCode.CONSTRAINT_VIOLATION |
| | | || rc == ResultCode.ENTRY_ALREADY_EXISTS |
| | | || rc == ResultCode.INVALID_ATTRIBUTE_SYNTAX |
| | | || rc == ResultCode.INVALID_DN_SYNTAX |
| | | || rc == ResultCode.NAMING_VIOLATION |
| | | || rc == ResultCode.NOT_ALLOWED_ON_NONLEAF |
| | | || rc == ResultCode.NOT_ALLOWED_ON_RDN |
| | | || rc == ResultCode.OBJECTCLASS_MODS_PROHIBITED |
| | | || rc == ResultCode.OBJECTCLASS_VIOLATION |
| | | || rc == ResultCode.UNDEFINED_ATTRIBUTE_TYPE) |
| | | { |
| | | return new ConstraintViolationException(result); |
| | | } |
| | | else if (rc == ResultCode.REFERRAL) |
| | | { |
| | | return new ReferralException(result); |
| | | } |
| | | else if (rc == ResultCode.NO_SUCH_OBJECT |
| | | || rc == ResultCode.CLIENT_SIDE_NO_RESULTS_RETURNED) |
| | | { |
| | | return new EntryNotFoundException(result); |
| | | } |
| | | else if (rc == ResultCode.CLIENT_SIDE_UNEXPECTED_RESULTS_RETURNED) |
| | | { |
| | | return new MultipleEntriesFoundException(result); |
| | | } |
| | | else if (rc == ResultCode.CLIENT_SIDE_TIMEOUT |
| | | || rc == ResultCode.TIME_LIMIT_EXCEEDED) |
| | | { |
| | | return new TimeoutResultException(result); |
| | | /** |
| | | * Creates a new error result exception with the provided result code and |
| | | * diagnostic message. |
| | | * |
| | | * @param resultCode |
| | | * The result code. |
| | | * @param diagnosticMessage |
| | | * The diagnostic message, which may be empty or {@code null} |
| | | * indicating that none was provided. |
| | | * @return The new error result exception. |
| | | * @throws IllegalArgumentException |
| | | * If the provided result code does not represent a failure. |
| | | * @throws NullPointerException |
| | | * If {@code resultCode} was {@code null}. |
| | | */ |
| | | public static ErrorResultException newErrorResult(ResultCode resultCode, |
| | | String diagnosticMessage) { |
| | | return newErrorResult(resultCode, diagnosticMessage, null); |
| | | } |
| | | |
| | | return new ErrorResultException(result); |
| | | } |
| | | /** |
| | | * Creates a new error result exception with the provided result code and |
| | | * cause. The diagnostic message will be taken from the cause, if provided. |
| | | * |
| | | * @param resultCode |
| | | * The result code. |
| | | * @param cause |
| | | * The throwable cause, which may be {@code null} indicating that |
| | | * none was provided. |
| | | * @return The new error result exception. |
| | | * @throws IllegalArgumentException |
| | | * If the provided result code does not represent a failure. |
| | | * @throws NullPointerException |
| | | * If {@code resultCode} was {@code null}. |
| | | */ |
| | | public static ErrorResultException newErrorResult(ResultCode resultCode, Throwable cause) { |
| | | return newErrorResult(resultCode, null, cause); |
| | | } |
| | | |
| | | /** |
| | | * Creates a new error result exception with the provided result code, |
| | | * diagnostic message, and cause. |
| | | * |
| | | * @param resultCode |
| | | * The result code. |
| | | * @param diagnosticMessage |
| | | * The diagnostic message, which may be empty or {@code null} |
| | | * indicating that none was provided. |
| | | * @param cause |
| | | * The throwable cause, which may be {@code null} indicating that |
| | | * none was provided. |
| | | * @return The new error result exception. |
| | | * @throws IllegalArgumentException |
| | | * If the provided result code does not represent a failure. |
| | | * @throws NullPointerException |
| | | * If {@code resultCode} was {@code null}. |
| | | */ |
| | | public static ErrorResultException newErrorResult(ResultCode resultCode, |
| | | String diagnosticMessage, Throwable cause) { |
| | | final Result result = Responses.newResult(resultCode); |
| | | if (diagnosticMessage != null) { |
| | | result.setDiagnosticMessage(diagnosticMessage); |
| | | } else if (cause != null) { |
| | | result.setDiagnosticMessage(cause.getLocalizedMessage()); |
| | | } |
| | | result.setCause(cause); |
| | | return newErrorResult(result); |
| | | } |
| | | |
| | | /** |
| | | * Creates a new error result exception using the provided result. |
| | | * |
| | | * @param result |
| | | * The result whose result code indicates a failure. |
| | | * @return The error result exception wrapping the provided result. |
| | | * @throws IllegalArgumentException |
| | | * If the provided result does not represent a failure. |
| | | * @throws NullPointerException |
| | | * If {@code result} was {@code null}. |
| | | */ |
| | | public static ErrorResultException newErrorResult(final Result result) { |
| | | if (!result.getResultCode().isExceptional()) { |
| | | throw new IllegalArgumentException("Attempted to wrap a successful result: " + result); |
| | | } |
| | | |
| | | private final Result result; |
| | | ResultCode rc = result.getResultCode(); |
| | | if (rc == ResultCode.ASSERTION_FAILED) { |
| | | return new AssertionFailureException(result); |
| | | } else if (rc == ResultCode.AUTH_METHOD_NOT_SUPPORTED |
| | | || rc == ResultCode.CLIENT_SIDE_AUTH_UNKNOWN |
| | | || rc == ResultCode.INAPPROPRIATE_AUTHENTICATION |
| | | || rc == ResultCode.INVALID_CREDENTIALS) { |
| | | return new AuthenticationException(result); |
| | | } else if (rc == ResultCode.AUTHORIZATION_DENIED |
| | | || rc == ResultCode.CONFIDENTIALITY_REQUIRED |
| | | || rc == ResultCode.INSUFFICIENT_ACCESS_RIGHTS |
| | | || rc == ResultCode.STRONG_AUTH_REQUIRED) { |
| | | return new AuthorizationException(result); |
| | | } else if (rc == ResultCode.CLIENT_SIDE_USER_CANCELLED || rc == ResultCode.CANCELLED) { |
| | | return new CancelledResultException(result); |
| | | } else if (rc == ResultCode.CLIENT_SIDE_SERVER_DOWN |
| | | || rc == ResultCode.CLIENT_SIDE_CONNECT_ERROR |
| | | || rc == ResultCode.CLIENT_SIDE_DECODING_ERROR |
| | | || rc == ResultCode.CLIENT_SIDE_ENCODING_ERROR) { |
| | | return new ConnectionException(result); |
| | | } else if (rc == ResultCode.ATTRIBUTE_OR_VALUE_EXISTS |
| | | || rc == ResultCode.CONSTRAINT_VIOLATION || rc == ResultCode.ENTRY_ALREADY_EXISTS |
| | | || rc == ResultCode.INVALID_ATTRIBUTE_SYNTAX || rc == ResultCode.INVALID_DN_SYNTAX |
| | | || rc == ResultCode.NAMING_VIOLATION || rc == ResultCode.NOT_ALLOWED_ON_NONLEAF |
| | | || rc == ResultCode.NOT_ALLOWED_ON_RDN |
| | | || rc == ResultCode.OBJECTCLASS_MODS_PROHIBITED |
| | | || rc == ResultCode.OBJECTCLASS_VIOLATION |
| | | || rc == ResultCode.UNDEFINED_ATTRIBUTE_TYPE) { |
| | | return new ConstraintViolationException(result); |
| | | } else if (rc == ResultCode.REFERRAL) { |
| | | return new ReferralException(result); |
| | | } else if (rc == ResultCode.NO_SUCH_OBJECT |
| | | || rc == ResultCode.CLIENT_SIDE_NO_RESULTS_RETURNED) { |
| | | return new EntryNotFoundException(result); |
| | | } else if (rc == ResultCode.CLIENT_SIDE_UNEXPECTED_RESULTS_RETURNED) { |
| | | return new MultipleEntriesFoundException(result); |
| | | } else if (rc == ResultCode.CLIENT_SIDE_TIMEOUT || rc == ResultCode.TIME_LIMIT_EXCEEDED) { |
| | | return new TimeoutResultException(result); |
| | | } |
| | | |
| | | return new ErrorResultException(result); |
| | | } |
| | | |
| | | private final Result result; |
| | | |
| | | /** |
| | | * Creates a new error result exception using the provided result. |
| | | * |
| | | * @param result |
| | | * The error result. |
| | | */ |
| | | protected ErrorResultException(final Result result) |
| | | { |
| | | super(result.getResultCode() + ": " |
| | | + result.getDiagnosticMessage()); |
| | | this.result = result; |
| | | } |
| | | /** |
| | | * Creates a new error result exception using the provided result. |
| | | * |
| | | * @param result |
| | | * The error result. |
| | | */ |
| | | protected ErrorResultException(final Result result) { |
| | | super(result.getResultCode() + ": " + result.getDiagnosticMessage()); |
| | | this.result = result; |
| | | } |
| | | |
| | | |
| | | |
| | | /** |
| | | * Returns the error result which caused this exception to be thrown. The type |
| | | * of result returned corresponds to the expected result type of the original |
| | | * request. |
| | | * |
| | | * @return The error result which caused this exception to be thrown. |
| | | */ |
| | | public final Result getResult() |
| | | { |
| | | return result; |
| | | } |
| | | /** |
| | | * Returns the error result which caused this exception to be thrown. The |
| | | * type of result returned corresponds to the expected result type of the |
| | | * original request. |
| | | * |
| | | * @return The error result which caused this exception to be thrown. |
| | | */ |
| | | public final Result getResult() { |
| | | return result; |
| | | } |
| | | } |