DelegatingStepMonitor.java

package org.jbehave.core.steps;

import static java.util.Arrays.asList;

import java.lang.reflect.Method;
import java.lang.reflect.Type;
import java.util.Collection;
import java.util.Queue;

import org.jbehave.core.model.StepPattern;

/**
 * Monitor which collects other {@link StepMonitor}s and delegates all invocations to the collected monitors.
 */
public class DelegatingStepMonitor implements StepMonitor {

    private final Collection<StepMonitor> delegates;

    /**
     * Creates DelegatingStepMonitor with a given collections of delegates
     *
     * @param delegates the StepMonitor-s to delegate to
     */
    public DelegatingStepMonitor(Collection<StepMonitor> delegates) {
        this.delegates = delegates;
    }

    /**
     * Creates DelegatingStepMonitor with a given varargs of delegates
     *
     * @param delegates the StepMonitor-s to delegate to
     */
    public DelegatingStepMonitor(StepMonitor... delegates) {
        this(asList(delegates));
    }

    @Override
    public void convertedValueOfType(String value, Type type, Object converted, Queue<Class<?>> converterClasses) {
        for (StepMonitor monitor : delegates) {
            monitor.convertedValueOfType(value, type, converted, converterClasses);
        }
    }

    @Override
    public void stepMatchesType(String stepAsString, String previousAsString, boolean matchesType, StepType stepType,
            Method method, Object stepsInstance) {
        for (StepMonitor monitor : delegates) {
            monitor.stepMatchesType(stepAsString, previousAsString, matchesType, stepType, method, stepsInstance);
        }
    }

    @Override
    public void stepMatchesPattern(String step, boolean matches, StepPattern stepPattern, Method method,
            Object stepsInstance) {
        for (StepMonitor monitor : delegates) {
            monitor.stepMatchesPattern(step, matches, stepPattern, method, stepsInstance);
        }
    }

    @Override
    public void foundParameter(String parameter, int position) {
        for (StepMonitor monitor : delegates) {
            monitor.foundParameter(parameter, position);
        }
    }

    @Override
    public void beforePerforming(String step, boolean dryRun, Method method) {
        for (StepMonitor monitor : delegates) {
            monitor.beforePerforming(step, dryRun, method);
        }
    }

    @Override
    public void afterPerforming(String step, boolean dryRun, Method method) {
        for (StepMonitor monitor : delegates) {
            monitor.afterPerforming(step, dryRun, method);
        }
    }

    @Override
    public void usingAnnotatedNameForParameter(String name, int position) {
        for (StepMonitor monitor : delegates) {
            monitor.usingAnnotatedNameForParameter(name, position);
        }
    }

    @Override
    public void usingNaturalOrderForParameter(int position) {
        for (StepMonitor monitor : delegates) {
            monitor.usingNaturalOrderForParameter(position);
        }
    }

    @Override
    public void usingParameterNameForParameter(String name, int position) {
        for (StepMonitor monitor : delegates) {
            monitor.usingParameterNameForParameter(name, position);
        }
    }

    @Override
    public void usingTableAnnotatedNameForParameter(String name, int position) {
        for (StepMonitor monitor : delegates) {
            monitor.usingTableAnnotatedNameForParameter(name, position);
        }
    }

    @Override
    public void usingTableParameterNameForParameter(String name, int position) {
        for (StepMonitor monitor : delegates) {
            monitor.usingTableParameterNameForParameter(name, position);
        }
    }

    @Override
    public void usingStepsContextParameter(String parameter) {
        for (StepMonitor monitor : delegates) {
            monitor.usingStepsContextParameter(parameter);
        }
    }
}