/*
 * 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 org.apache.commons.dbcp2;

import java.sql.SQLException;
import java.util.List;

/**
 * A SQLException based on a list of SQLException causes.
 * <p>
 * The first exception in the list is used as this exception's cause and is accessible with the usual
 * {@link #getCause()} while the complete list is accessible with {@link #getCauseList()}.
 * </p>
 * 
 * @since 2.7.0
 */
public class SQLExceptionList extends SQLException {

    private static final long serialVersionUID = 1L;
    private final List<? extends SQLException> causeList;

    /**
     * Creates a new exception caused by a list of exceptions.
     * 
     * @param causeList a list of cause exceptions.
     */
    public SQLExceptionList(List<? extends SQLException> causeList) {
        super(String.format("%,d SQLExceptions: %s", causeList.size(), causeList), causeList.get(0));
        this.causeList = causeList;
    }

    public List<? extends SQLException> getCauseList() {
        return causeList;
    }

}
