/*
 *  Licensed to the Apache Software Foundation (ASF) under one or more
 *  contributor license agreements.  See the NOTICE file distributed with
 *  this work for additional information regarding copyright ownership.
 *  The ASF licenses this file to You under the Apache License, Version 2.0
 *  (the "License"); you may not use this file except in compliance with
 *  the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 */

package java.security.cert;

import java.security.GeneralSecurityException;

/**
 * The exception that is thrown when a {@code CertPathBuilder} method fails.
 */
public class CertPathBuilderException extends GeneralSecurityException {

    private static final long serialVersionUID = 5316471420178794402L;

    /**
     * Creates a new {@code CertPathBuilderException} with the specified message
     * and cause.
     *
     * @param msg
     *            the detail message for the exception
     * @param cause
     *            why the building of the certification path failed.
     */
    public CertPathBuilderException(String msg, Throwable cause) {
        super(msg, cause);
    }

    /**
     * Creates a new {@code CertPathBuilderException} with the specified cause.
     *
     * @param cause
     *            why the building of the certification path failed.
     */
    public CertPathBuilderException(Throwable cause) {
        super(cause);
    }

    /**
     * Creates a new {@code CertPathBuilderException} with the specified
     * message.
     *
     * @param msg
     *            the detail message for the exception.
     */
    public CertPathBuilderException(String msg) {
        super(msg);
    }

    /**
     * Creates a new {@code CertPathBuilderException}.
     */
    public CertPathBuilderException() {
    }
}
