ExceptionHandlerQueueThenThrowAfter.java

package com.opencsv.bean.exceptionhandler;

import com.opencsv.exceptions.CsvException;

import java.util.concurrent.atomic.AtomicInteger;

/**
 * <p>An exception handler that queues the first x exceptions, then throws any
 * further exceptions.</p>
 *
 * <p><b>Note:</b> when testing this on systems with a high number of cores/threads under
 * load we noted discrepancies between the number of exceptions counted and the number
 * exceptions queued.   If it is actually important to see the exceptions thrown then
 * we would heavily recommend you use the single threaded iterator() in CsvToBean
 * and collecting the exceptions yourself.</p>
 *
 * @author Andrew Rucker Jones
 * @since 5.2
 */
final public class ExceptionHandlerQueueThenThrowAfter implements CsvExceptionHandler {

    private final AtomicInteger count = new AtomicInteger();
    private final int maxExceptions;

    /**
     * Creates an instance.
     * @param maxExceptions The number of exceptions that will be queued. Any
     *                      exception handled after this limit will be thrown.
     */
    public ExceptionHandlerQueueThenThrowAfter(int maxExceptions) {
        this.maxExceptions = maxExceptions;
    }

    @Override
    public CsvException handleException(CsvException e) throws CsvException {
        if(count.incrementAndGet() > maxExceptions) {
            throw e;
        }
        return e;
    }
}