/*
 *  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.directory.api.ldap.model.schema;

import java.util.ArrayList;
import java.util.List;

import org.slf4j.Logger;


/**
 * Schema error handler that is logging the messages. The implementation also remembers
 * the errors in a list.
 * 
 * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
 */
public class LoggingSchemaErrorHandler implements SchemaErrorHandler
{
    private List<Throwable> errors = new ArrayList<>();
    
    @Override
    public void handle( Logger log, String message, Throwable exception )
    {
        if ( exception != null )
        {
            errors.add( exception );
        }
        log( log, message );
    }
    
    protected void log( Logger log, String message )
    {
        log.info( message );
    }

    @Override
    public boolean wasError()
    {
        return !errors.isEmpty();
    }
    
    @Override
    public List<Throwable> getErrors()
    {
        return errors;
    }

    @Override
    public void reset()
    {
        errors.clear();
    }

}
