All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.cookingfox.lapasse.impl.logging.LoggersHelper Maven / Gradle / Ivy

There is a newer version: 0.5.6
Show newest version
package com.cookingfox.lapasse.impl.logging;

import com.cookingfox.lapasse.api.command.Command;
import com.cookingfox.lapasse.api.command.exception.NoRegisteredCommandErrorHandlerException;
import com.cookingfox.lapasse.api.command.logging.CommandLogger;
import com.cookingfox.lapasse.api.event.Event;
import com.cookingfox.lapasse.api.event.exception.NoRegisteredEventErrorHandlerException;
import com.cookingfox.lapasse.api.event.logging.EventLogger;
import com.cookingfox.lapasse.api.logging.CombinedLogger;
import com.cookingfox.lapasse.api.logging.LoggerCollection;
import com.cookingfox.lapasse.api.state.State;

import java.util.Collection;
import java.util.LinkedHashSet;
import java.util.Objects;
import java.util.Set;

/**
 * Helper class for all LaPasse loggers.
 *
 * @param  The concrete type of the state object.
 */
public class LoggersHelper implements LoggerCollection {

    /**
     * Set of unique command logger instances.
     */
    protected final Set commandLoggers = new LinkedHashSet<>();

    /**
     * Set of unique event logger instances.
     */
    protected final Set> eventLoggers = new LinkedHashSet<>();

    //----------------------------------------------------------------------------------------------
    // COMMAND LOGGER
    //----------------------------------------------------------------------------------------------

    @Override
    public void addCommandLogger(CommandLogger logger) {
        commandLoggers.add(Objects.requireNonNull(logger, "Logger can not be null"));
    }

    @Override
    public void onCommandHandlerError(Throwable error, Command command, Collection events) {
        if (commandLoggers.isEmpty()) {
            throw new NoRegisteredCommandErrorHandlerException(error, command);
        }

        for (CommandLogger logger : commandLoggers) {
            logger.onCommandHandlerError(error, command, events);
        }
    }

    @Override
    public void onCommandHandlerResult(Command command, Collection events) {
        for (CommandLogger logger : commandLoggers) {
            logger.onCommandHandlerResult(command, events);
        }
    }

    //----------------------------------------------------------------------------------------------
    // EVENT LOGGER
    //----------------------------------------------------------------------------------------------

    @Override
    public void addEventLogger(EventLogger logger) {
        eventLoggers.add(Objects.requireNonNull(logger, "Logger can not be null"));
    }

    @Override
    public void onEventHandlerError(Throwable error, Event event, S newState) {
        if (eventLoggers.isEmpty()) {
            throw new NoRegisteredEventErrorHandlerException(error, event);
        }

        for (EventLogger logger : eventLoggers) {
            logger.onEventHandlerError(error, event, newState);
        }
    }

    @Override
    public void onEventHandlerResult(Event event, S newState) {
        for (EventLogger logger : eventLoggers) {
            logger.onEventHandlerResult(event, newState);
        }
    }

    //----------------------------------------------------------------------------------------------
    // PUBLIC METHODS
    //----------------------------------------------------------------------------------------------

    @Override
    public void addLogger(CombinedLogger logger) {
        addCommandLogger(logger);
        addEventLogger(logger);
    }

}