package org.bouncycastle.jce.cert; import java.io.PrintStream; import java.io.PrintWriter; import java.security.GeneralSecurityException; /** * An exception indicating one of a variety of problems encountered * when building a certification path with a * <code>CertPathBuilder</code>.<br /> * <br /> * A <code>CertPathBuilderException</code> provides support for * wrapping exceptions. The {@link #getCause() getCause} method * returns the throwable, if any, that caused this exception to be * thrown.<br /> * <br /> * <strong>Concurrent Access</strong><br /> * <br /> * Unless otherwise specified, the methods defined in this class are * not thread-safe. Multiple threads that need to access a single * object concurrently should synchronize amongst themselves and * provide the necessary locking. Multiple threads each manipulating * separate objects need not synchronize. * * @see CertPathBuilder **/ public class CertPathBuilderException extends GeneralSecurityException { private Throwable cause; /** * Creates a <code>CertPathBuilderException</code> with <code>null</code> * as its detail message. */ public CertPathBuilderException() { } /** * Creates a <code>CertPathBuilderException</code> with the given detail * message. The detail message is a <code>String</code> that describes * this particular exception in more detail. * * @param msg * the detail message */ public CertPathBuilderException(String message) { super(message); } /** * Creates a <code>CertPathBuilderException</code> that wraps the * specified throwable. This allows any exception to be converted into a * <code>CertPathBuilderException</code>, while retaining information * about the wrapped exception, which may be useful for debugging. The * detail message is set to * <code>(cause==null ? null : cause.toString())</code> (which typically * contains the class and detail message of cause). * * @param cause * the cause (which is saved for later retrieval by the * {@link #getCause()} method). (A null value is permitted, and * indicates that the cause is nonexistent or unknown.) */ public CertPathBuilderException(String message, Throwable cause) { super(message); this.cause = cause; } /** * Creates a <code>CertPathBuilderException</code> with the specified * detail message and cause. * * @param msg * the detail message * @param cause * the cause (which is saved for later retrieval by the * {@link #getCause()} method). (A null value is permitted, and * indicates that the cause is nonexistent or unknown.) */ public CertPathBuilderException(Throwable cause) { this.cause = cause; } /** * Returns the internal (wrapped) cause, or null if the cause is nonexistent * or unknown. * * @return the cause of this throwable or <code>null</code> if the cause * is nonexistent or unknown. */ public Throwable getCause() { return cause; } /** * Returns the detail message for this CertPathBuilderException. * * @return the detail message, or <code>null</code> if neither the message * nor internal cause were specified */ public String getMessage() { String message = super.getMessage(); if (message == null && cause == null) { return null; } if (cause != null) { return cause.getMessage(); } return message; } /** * Returns a string describing this exception, including a description of * the internal (wrapped) cause if there is one. * * @return a string representation of this * <code>CertPathBuilderException</code> */ public String toString() { String message = getMessage(); if (message == null) { return ""; } return message; } /** * Prints a stack trace to <code>System.err</code>, including the * backtrace of the cause, if any. */ public void printStackTrace() { printStackTrace(System.err); } /** * Prints a stack trace to a <code>PrintStream</code>, including the * backtrace of the cause, if any. * * @param ps * the <code>PrintStream</code> to use for output */ public void printStackTrace(PrintStream ps) { super.printStackTrace(ps); if (getCause() != null) { getCause().printStackTrace(ps); } } /** * Prints a stack trace to a <code>PrintWriter</code>, including the * backtrace of the cause, if any. * * @param ps * the <code>PrintWriter</code> to use for output */ public void printStackTrace(PrintWriter pw) { super.printStackTrace(pw); if (getCause() != null) { getCause().printStackTrace(pw); } } }