package org.camunda.bpm.extension.process_test_coverage.listeners;

import org.camunda.bpm.engine.delegate.ExecutionListener;
import org.camunda.bpm.engine.impl.bpmn.parser.AbstractBpmnParseListener;
import org.camunda.bpm.engine.impl.pvm.process.ScopeImpl;
import org.camunda.bpm.engine.impl.util.xml.Element;
import org.camunda.bpm.extension.process_test_coverage.junit.rules.CoverageTestRunState;

/**
 * Adds a PathCoverageExecutionListener to every transition.
 */
public class PathCoverageParseListener extends AbstractBpmnParseListener {

    /**
     * The state of the coverage test run.
     */
    private CoverageTestRunState coverageTestRunState;

    @Override
    public void parseSequenceFlow(Element sequenceFlowElement, ScopeImpl scopeElement,
            org.camunda.bpm.engine.impl.pvm.process.TransitionImpl transition) {

        final PathCoverageExecutionListener pathCoverageExecutionListener = new PathCoverageExecutionListener(
                coverageTestRunState);
        transition.addListener(ExecutionListener.EVENTNAME_TAKE, pathCoverageExecutionListener);

    }

    @Override
    public void parseIntermediateCatchEvent(Element intermediateEventElement, ScopeImpl scope,
            org.camunda.bpm.engine.impl.pvm.process.ActivityImpl activity) {

        final IntermediateEventExecutionListener startListener = new IntermediateEventExecutionListener(
                coverageTestRunState);
        activity.addListener(ExecutionListener.EVENTNAME_START, startListener);

        final IntermediateEventExecutionListener endListener = new IntermediateEventExecutionListener(
                coverageTestRunState);
        activity.addListener(ExecutionListener.EVENTNAME_END, endListener);
    }

    public void setCoverageTestRunState(CoverageTestRunState coverageTestRunState) {
        this.coverageTestRunState = coverageTestRunState;
    }
}