Configuration.java
package org.jbehave.core.configuration;
import java.util.Collections;
import java.util.Comparator;
import java.util.Optional;
import java.util.Set;
import com.thoughtworks.paranamer.NullParanamer;
import com.thoughtworks.paranamer.Paranamer;
import org.jbehave.core.Embeddable;
import org.jbehave.core.condition.ReflectionBasedStepConditionMatcher;
import org.jbehave.core.condition.StepConditionMatcher;
import org.jbehave.core.embedder.Embedder;
import org.jbehave.core.embedder.StoryControls;
import org.jbehave.core.expressions.ExpressionResolver;
import org.jbehave.core.expressions.NullExpressionResolverMonitor;
import org.jbehave.core.failures.FailingUponPendingStep;
import org.jbehave.core.failures.FailureStrategy;
import org.jbehave.core.failures.PassingUponPendingStep;
import org.jbehave.core.failures.PendingStepStrategy;
import org.jbehave.core.failures.RethrowingFailure;
import org.jbehave.core.failures.SilentlyAbsorbingFailure;
import org.jbehave.core.i18n.LocalizedKeywords;
import org.jbehave.core.io.AbsolutePathCalculator;
import org.jbehave.core.io.LoadFromClasspath;
import org.jbehave.core.io.PathCalculator;
import org.jbehave.core.io.StoryLoader;
import org.jbehave.core.io.StoryPathResolver;
import org.jbehave.core.io.UnderscoredCamelCaseResolver;
import org.jbehave.core.model.ExamplesTableFactory;
import org.jbehave.core.model.NullTableTransformerMonitor;
import org.jbehave.core.model.Story;
import org.jbehave.core.model.TableParsers;
import org.jbehave.core.model.TableTransformerMonitor;
import org.jbehave.core.model.TableTransformers;
import org.jbehave.core.parsers.AliasParser;
import org.jbehave.core.parsers.CompositeParser;
import org.jbehave.core.parsers.JsonAliasParser;
import org.jbehave.core.parsers.RegexCompositeParser;
import org.jbehave.core.parsers.RegexPrefixCapturingPatternParser;
import org.jbehave.core.parsers.RegexStoryParser;
import org.jbehave.core.parsers.StepPatternParser;
import org.jbehave.core.parsers.StoryParser;
import org.jbehave.core.reporters.ConsoleOutput;
import org.jbehave.core.reporters.FreemarkerViewGenerator;
import org.jbehave.core.reporters.PrintStreamStepdocReporter;
import org.jbehave.core.reporters.StepdocReporter;
import org.jbehave.core.reporters.StoryReporter;
import org.jbehave.core.reporters.StoryReporterBuilder;
import org.jbehave.core.reporters.ViewGenerator;
import org.jbehave.core.steps.MarkUnmatchedStepsAsPending;
import org.jbehave.core.steps.ParameterControls;
import org.jbehave.core.steps.ParameterConverters;
import org.jbehave.core.steps.PrintStreamStepMonitor;
import org.jbehave.core.steps.SilentStepMonitor;
import org.jbehave.core.steps.StepCollector;
import org.jbehave.core.steps.StepFinder;
import org.jbehave.core.steps.StepMonitor;
import org.jbehave.core.steps.context.StepsContext;
/**
* <p>
* Provides the configuration used by the {@link Embedder} and the in the
* {@link Embeddable} implementations to customise its runtime properties.
* </p>
* <p>
* Configuration implements a <a
* href="http://en.wikipedia.org/wiki/Builder_pattern">Builder</a> pattern so
* that each element of the configuration can be specified individually, and
* read well. All elements have default values, which can be overridden by the
* "use" methods. The "use" methods allow to override the dependencies one by
* one and play nicer with a Java hierarchical structure, in that does allow the
* use of non-static member variables.
* </p>
*/
public abstract class Configuration {
/**
* Use default story controls
*/
protected StoryControls storyControls;
/**
* Use English language for keywords
*/
protected Keywords keywords;
/**
* Provides pending steps where unmatched steps exist.
*/
protected StepCollector stepCollector;
/**
* Parses the textual representation via pattern matching of keywords
*/
protected StoryParser storyParser;
/**
* Parses composite steps from their textual representation
*/
protected CompositeParser compositeParser;
/**
* Loads story content from classpath
*/
protected StoryLoader storyLoader;
/**
* Parse aliases from resources
*/
protected AliasParser aliasParser;
/**
* Resolves story paths from class names using underscored camel case with
* ".story" extension
*/
protected StoryPathResolver storyPathResolver;
/**
* Handles errors by re-throwing them.
* <p/>
* If there are multiple scenarios in a single story, this could cause the
* story to stop after the first failing scenario.
* <p/>
* Users wanting a different behaviour may use
* {@link SilentlyAbsorbingFailure}.
*/
protected FailureStrategy failureStrategy;
/**
* Allows pending steps to pass, so that steps that to do not match any
* method will not cause failure.
* <p/>
* Uses wanting a stricter behaviour for pending steps may use
* {@link FailingUponPendingStep}.
*/
protected PendingStepStrategy pendingStepStrategy;
/**
* Reports stories to console output
*/
protected StoryReporter defaultStoryReporter;
/**
* The story reporter builder
*/
protected StoryReporterBuilder storyReporterBuilder;
/**
* The steps context
*/
protected StepsContext stepsContext;
/**
* Finder of matching candidate steps
*/
protected StepFinder stepFinder;
/**
* Report candidate steps found to a PrintStream
*/
protected StepdocReporter stepdocReporter;
/**
* Pattern build that uses prefix for identifying parameters
*/
protected StepPatternParser stepPatternParser;
/**
* Controls of step parameterization
*/
protected ParameterControls parameterControls;
/**
* Silent monitoring that does not produce any noise of the step matching.
* </p> If needed, users can switch on verbose monitoring using
* {@link PrintStreamStepMonitor}
*/
protected StepMonitor stepMonitor;
/**
* Paranamer is switched off by default
*/
protected Paranamer paranamer;
/**
* Use default built-in parameter converters
*/
protected ParameterConverters parameterConverters;
/**
* Use default built-in expression resolver
*/
protected ExpressionResolver expressionResolver;
/**
* Use default built-in ExamplesTable parsers
*/
protected TableParsers tableParsers;
/**
* Use default built-in ExamplesTable transformers
*/
protected TableTransformers tableTransformers;
/**
* Use Freemarker-based view generator
*/
protected ViewGenerator viewGenerator;
/**
* Use an absolute path calculator
*/
protected PathCalculator pathCalculator;
/**
* Paths to resources containing composite steps definitions
*/
protected Set<String> compositePaths;
/**
* Paths to resources containing ailas definitions
*/
protected Set<String> aliasPaths;
/**
* The examples table factory
*/
protected ExamplesTableFactory examplesTableFactory;
/**
* The story execution comparator
*/
protected Comparator<Story> storyExecutionComparator;
/**
* Enables parallelization of story level examples
*/
private boolean parallelStoryExamplesEnabled;
/**
* The step condition matcher to match conditional steps
*/
protected StepConditionMatcher stepConditionMatcher;
/**
* Monitor events of example table transformers
*/
protected TableTransformerMonitor tableTransformerMonitor;
public Configuration() {
}
public Keywords keywords() {
if (keywords == null) {
keywords = new LocalizedKeywords();
}
return keywords;
}
public boolean dryRun() {
return storyControls().dryRun();
}
public StoryControls storyControls() {
if (storyControls == null) {
storyControls = new StoryControls();
}
return storyControls;
}
public StoryParser storyParser() {
if (storyParser == null) {
storyParser = new RegexStoryParser(examplesTableFactory());
}
return storyParser;
}
public CompositeParser compositeParser() {
if (compositeParser == null) {
compositeParser = new RegexCompositeParser(keywords());
}
return compositeParser;
}
public StoryLoader storyLoader() {
if (storyLoader == null) {
storyLoader = new LoadFromClasspath();
}
return storyLoader;
}
public AliasParser aliasParser() {
if (aliasParser == null) {
aliasParser = new JsonAliasParser(keywords());
}
return aliasParser;
}
public Comparator<Story> storyExecutionComparator() {
if (storyExecutionComparator == null) {
storyExecutionComparator = Comparator.comparing(Story::getPath, Comparator.naturalOrder());
}
return storyExecutionComparator;
}
public ExamplesTableFactory examplesTableFactory() {
if (examplesTableFactory == null) {
examplesTableFactory = new ExamplesTableFactory(keywords(), storyLoader(), parameterConverters(),
parameterControls(), tableParsers(), tableTransformers(), tableTransformerMonitor());
}
return examplesTableFactory;
}
public StoryPathResolver storyPathResolver() {
if (storyPathResolver == null) {
storyPathResolver = new UnderscoredCamelCaseResolver();
}
return storyPathResolver;
}
public FailureStrategy failureStrategy() {
if (failureStrategy == null) {
failureStrategy = new RethrowingFailure();
}
return failureStrategy;
}
public PendingStepStrategy pendingStepStrategy() {
if (pendingStepStrategy == null) {
pendingStepStrategy = new PassingUponPendingStep();
}
return pendingStepStrategy;
}
public StoryReporter defaultStoryReporter() {
if (defaultStoryReporter == null) {
defaultStoryReporter = new ConsoleOutput();
}
return defaultStoryReporter;
}
public StoryReporter storyReporter(String storyPath) {
return storyReporterBuilder().build(storyPath);
}
public StoryReporterBuilder storyReporterBuilder() {
if (storyReporterBuilder == null) {
storyReporterBuilder = new StoryReporterBuilder();
}
return storyReporterBuilder;
}
public StepsContext stepsContext() {
if (stepsContext == null) {
stepsContext = new StepsContext();
}
return stepsContext;
}
public StepCollector stepCollector() {
if (stepCollector == null) {
stepCollector = new MarkUnmatchedStepsAsPending(stepFinder(), keywords());
}
return stepCollector;
}
public StepFinder stepFinder() {
if (stepFinder == null) {
stepFinder = new StepFinder(stepConditionMatcher());
}
return stepFinder;
}
public StepdocReporter stepdocReporter() {
if (stepdocReporter == null) {
stepdocReporter = new PrintStreamStepdocReporter();
}
return stepdocReporter;
}
public StepPatternParser stepPatternParser() {
if (stepPatternParser == null) {
stepPatternParser = new RegexPrefixCapturingPatternParser();
}
return stepPatternParser;
}
public ParameterControls parameterControls() {
if (parameterControls == null) {
parameterControls = new ParameterControls();
}
return parameterControls;
}
public StepMonitor stepMonitor() {
if (stepMonitor == null) {
stepMonitor = new SilentStepMonitor();
}
return stepMonitor;
}
public Paranamer paranamer() {
if (paranamer == null) {
paranamer = new NullParanamer();
}
return paranamer;
}
public ParameterConverters parameterConverters() {
if (parameterConverters == null) {
parameterConverters = new ParameterConverters(stepMonitor(), keywords(), storyLoader(), parameterControls(),
tableTransformers());
}
return parameterConverters;
}
public ExpressionResolver expressionResolver() {
if (expressionResolver == null) {
expressionResolver = new ExpressionResolver(Collections.emptySet(), new NullExpressionResolverMonitor());
}
return expressionResolver;
}
public TableParsers tableParsers() {
if (tableParsers == null) {
tableParsers = new TableParsers(keywords(), parameterConverters(), Optional.empty());
}
return tableParsers;
}
public TableTransformers tableTransformers() {
if (tableTransformers == null) {
tableTransformers = new TableTransformers();
}
return tableTransformers;
}
public ViewGenerator viewGenerator() {
if (viewGenerator == null) {
viewGenerator = new FreemarkerViewGenerator();
}
return viewGenerator;
}
public PathCalculator pathCalculator() {
if (pathCalculator == null) {
pathCalculator = new AbsolutePathCalculator();
}
return pathCalculator;
}
public Set<String> compositePaths() {
if (compositePaths == null) {
compositePaths = Collections.emptySet();
}
return compositePaths;
}
public Set<String> aliasPaths() {
if (aliasPaths == null) {
aliasPaths = Collections.emptySet();
}
return aliasPaths;
}
public StepConditionMatcher stepConditionMatcher() {
if (stepConditionMatcher == null) {
stepConditionMatcher = new ReflectionBasedStepConditionMatcher();
}
return stepConditionMatcher;
}
public TableTransformerMonitor tableTransformerMonitor() {
if (tableTransformerMonitor == null) {
tableTransformerMonitor = new NullTableTransformerMonitor();
}
return tableTransformerMonitor;
}
public Configuration useStepConditionMatcher(StepConditionMatcher stepConditionMatcher) {
this.stepConditionMatcher = stepConditionMatcher;
return this;
}
public Configuration useKeywords(Keywords keywords) {
this.keywords = keywords;
return this;
}
public Configuration doDryRun(Boolean dryRun) {
this.storyControls().doDryRun(dryRun);
return this;
}
public Configuration useStoryControls(StoryControls storyControls) {
this.storyControls = storyControls;
return this;
}
public Configuration usePendingStepStrategy(PendingStepStrategy pendingStepStrategy) {
this.pendingStepStrategy = pendingStepStrategy;
return this;
}
public Configuration useFailureStrategy(FailureStrategy failureStrategy) {
this.failureStrategy = failureStrategy;
return this;
}
public Configuration useStoryParser(StoryParser storyParser) {
this.storyParser = storyParser;
return this;
}
public Configuration useCompositeParser(CompositeParser compositeParser) {
this.compositeParser = compositeParser;
return this;
}
public Configuration useStoryLoader(StoryLoader storyLoader) {
this.storyLoader = storyLoader;
return this;
}
public Configuration useAliasParser(AliasParser aliasParser) {
this.aliasParser = aliasParser;
return this;
}
public Configuration useExamplesTableFactory(ExamplesTableFactory examplesTableFactory) {
this.examplesTableFactory = examplesTableFactory;
return this;
}
public Configuration useStoryExecutionComparator(Comparator<Story> storyExecutionComparator) {
this.storyExecutionComparator = storyExecutionComparator;
return this;
}
public Configuration useStoryPathResolver(StoryPathResolver storyPathResolver) {
this.storyPathResolver = storyPathResolver;
return this;
}
public Configuration useDefaultStoryReporter(StoryReporter storyReporter) {
this.defaultStoryReporter = storyReporter;
return this;
}
public Configuration useStoryReporterBuilder(StoryReporterBuilder storyReporterBuilder) {
this.storyReporterBuilder = storyReporterBuilder;
return this;
}
public Configuration useStepCollector(StepCollector stepCollector) {
this.stepCollector = stepCollector;
return this;
}
public Configuration useStepFinder(StepFinder stepFinder) {
this.stepFinder = stepFinder;
return this;
}
public Configuration useStepdocReporter(StepdocReporter stepdocReporter) {
this.stepdocReporter = stepdocReporter;
return this;
}
public Configuration useStepPatternParser(StepPatternParser stepPatternParser) {
this.stepPatternParser = stepPatternParser;
return this;
}
public Configuration useParameterControls(ParameterControls parameterControls) {
this.parameterControls = parameterControls;
return this;
}
public Configuration useStepMonitor(StepMonitor stepMonitor) {
this.stepMonitor = stepMonitor;
return this;
}
public Configuration useParanamer(Paranamer paranamer) {
this.paranamer = paranamer;
return this;
}
public Configuration useParameterConverters(ParameterConverters parameterConverters) {
this.parameterConverters = parameterConverters;
return this;
}
public Configuration useExpressionResolver(ExpressionResolver expressionResolver) {
this.expressionResolver = expressionResolver;
return this;
}
public Configuration useTableTransformers(TableTransformers tableTransformers) {
this.tableTransformers = tableTransformers;
return this;
}
public Configuration useViewGenerator(ViewGenerator viewGenerator) {
this.viewGenerator = viewGenerator;
return this;
}
public Configuration usePathCalculator(PathCalculator pathCalculator) {
this.pathCalculator = pathCalculator;
return this;
}
public Configuration useCompositePaths(Set<String> compositePaths) {
this.compositePaths = compositePaths;
return this;
}
public Configuration useAliasPaths(Set<String> aliasPaths) {
this.aliasPaths = aliasPaths;
return this;
}
public boolean isParallelStoryExamplesEnabled() {
return parallelStoryExamplesEnabled;
}
public void setParallelStoryExamplesEnabled(boolean parallelStoryExamplesEnabled) {
this.parallelStoryExamplesEnabled = parallelStoryExamplesEnabled;
}
public Configuration useStepsContext(StepsContext stepsContext) {
this.stepsContext = stepsContext;
return this;
}
public Configuration useTableTransformerMonitor(TableTransformerMonitor tableTransformerMonitor) {
this.tableTransformerMonitor = tableTransformerMonitor;
return this;
}
}