ConditionalStepCandidate.java

package org.jbehave.core.steps;

import java.lang.reflect.Method;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

import org.jbehave.core.condition.StepConditionMatcher;
import org.jbehave.core.configuration.Keywords;
import org.jbehave.core.parsers.StepMatcher;
import org.jbehave.core.steps.StepCreator.ParametrisedStep;

public class ConditionalStepCandidate extends StepCandidate {

    private final Map<Method, StepCreator> stepCreators;
    private final StepConditionMatcher stepConditionMatcher;

    private ConditionalStepCandidate(String patternAsString, int priority, StepType stepType,
            Map<Method, StepCreator> stepCreators, Keywords keywords, StepMatcher stepMatcher,
            String parameterPrefixString, StepCreator stepCreator, StepConditionMatcher stepConditionMatcher,
            StepMonitor stepMonitor) {
        super(patternAsString, priority, stepType, null, null, null, keywords, stepMatcher, parameterPrefixString,
                stepCreator, null, stepMonitor);
        this.stepCreators = stepCreators;
        this.stepConditionMatcher = stepConditionMatcher;
    }

    @Override
    public Method getMethod() {
        throw new UnsupportedOperationException();
    }

    @Override
    public Step createMatchedStep(String stepAsString, Map<String, String> namedParameters, List<Step> composedSteps) {
        Map<Method, ParametrisedStep> parametrisedSteps = stepCreators.entrySet().stream()
                .collect(Collectors.toMap(Map.Entry::getKey,
                        e -> (ParametrisedStep) e.getValue().createParametrisedStep(e.getKey(), stepAsString,
                                stepAsString, namedParameters, composedSteps)));

        return getStepCreator().createConditionalStep(stepConditionMatcher, parametrisedSteps);
    }

    public static StepCandidate from(StepConditionMatcher stepConditionMatcher,
            List<StepCandidate> conditionalCandidates) {
        Map<Method, StepCreator> stepCreators = conditionalCandidates.stream()
                .collect(Collectors.toMap(StepCandidate::getMethod, StepCandidate::getStepCreator));

        StepCandidate baseCandidate = conditionalCandidates.get(0);

        return new ConditionalStepCandidate(baseCandidate.getPatternAsString(), baseCandidate.getPriority(),
                baseCandidate.getStepType(), stepCreators, baseCandidate.getKeywords(),
                baseCandidate.getStepMatcher(), baseCandidate.getParameterPrefix(), baseCandidate.getStepCreator(),
                stepConditionMatcher, baseCandidate.getStepMonitor());
    }
}