PrintingEmbedderMonitor.java
package org.jbehave.core.embedder;
import java.io.File;
import java.util.List;
import java.util.Properties;
import java.util.concurrent.ExecutorService;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import org.jbehave.core.ConfigurableEmbedder;
import org.jbehave.core.failures.BatchFailures;
import org.jbehave.core.model.Meta;
import org.jbehave.core.model.Scenario;
import org.jbehave.core.model.Story;
import org.jbehave.core.model.StoryDuration;
import org.jbehave.core.model.StoryMaps;
import org.jbehave.core.reporters.ReportsCount;
/**
* Abstract monitor that reports to output which should be defined in child implementations.
*/
public abstract class PrintingEmbedderMonitor implements EmbedderMonitor {
@Override
public void batchFailed(BatchFailures failures) {
print("Failed to run batch %s", failures);
}
@Override
public void beforeOrAfterStoriesFailed() {
print("Failed to run before or after stories steps");
}
@Override
public void embeddableFailed(String name, Throwable cause) {
print("Failed to run embeddable %s", name);
printStackTrace(cause);
}
@Override
public void embeddableNotConfigurable(String name) {
print("Embeddable %s must be an instance of %s", name, ConfigurableEmbedder.class);
}
@Override
public void embeddablesSkipped(List<String> classNames) {
print("Skipped embeddables %s", classNames);
}
@Override
public void metaExcluded(Meta meta, MetaFilter filter) {
print("%s excluded by filter '%s'", meta, filter.asString());
}
@Override
public void runningEmbeddable(String name) {
print("Running embeddable %s", name);
}
@Override
public void runningStory(String path) {
print("Running story %s", path);
}
@Override
public void storyFailed(String path, Throwable cause) {
print("Failed to run story %s", path);
printStackTrace(cause);
}
@Override
public void storiesSkipped(List<String> storyPaths) {
print("Skipped stories %s", storyPaths);
}
@Override
public void storiesExcluded(List<Story> excluded, MetaFilter filter, boolean verbose) {
StringBuilder format = new StringBuilder("%d stories excluded by filter: %s%n");
if (verbose) {
for (Story story : excluded) {
format.append(story.getPath()).append("%n");
}
}
print(format.toString(), excluded.size(), filter.asString());
}
@Override
public void scenarioExcluded(Scenario scenario, MetaFilter filter) {
print("Scenario '%s' excluded by filter: %s%n", scenario.getTitle(), filter.asString());
}
@Override
public void runningWithAnnotatedEmbedderRunner(String className) {
print("Running with AnnotatedEmbedderRunner '%s'", className);
}
@Override
public void annotatedInstanceNotOfType(Object annotatedInstance, Class<?> type) {
print("Annotated instance %s if not of type %s", annotatedInstance, type);
}
@Override
public void generatingReportsView(File outputDirectory, List<String> formats, Properties viewProperties) {
print("Generating reports view to '%s' using formats '%s' and view properties '%s'", outputDirectory, formats,
viewProperties);
}
@Override
public void reportsViewGenerationFailed(File outputDirectory, List<String> formats, Properties viewProperties,
Throwable cause) {
print("Failed to generate reports view to '%s' using formats '%s' and view properties '%s'", outputDirectory,
formats, viewProperties);
}
@Override
public void reportsViewGenerated(ReportsCount count) {
print("Reports view generated with %d stories (of which %d pending) containing %d scenarios (of which %d "
+ "pending)",
count.getStories(), count.getStoriesPending(), count.getScenarios(), count.getScenariosPending());
if (count.getStoriesExcluded() > 0 || count.getScenariosExcluded() > 0) {
print("Meta filters excluded %d stories and %d scenarios", count.getStoriesExcluded(),
count.getScenariosExcluded());
}
}
@Override
public void reportsViewFailures(ReportsCount count) {
print("Failures in reports view: %d scenarios failed", count.getScenariosFailed());
}
@Override
public void reportsViewNotGenerated() {
print("Reports view not generated");
}
@Override
public void mappingStory(String storyPath, List<String> metaFilters) {
print("Mapping story %s with meta filters %s", storyPath, metaFilters);
}
@Override
public void generatingMapsView(File outputDirectory, StoryMaps storyMaps, Properties viewProperties) {
print("Generating maps view to '%s' using story maps '%s' and view properties '%s'", outputDirectory, storyMaps,
viewProperties);
}
@Override
public void mapsViewGenerationFailed(File outputDirectory, StoryMaps storyMaps, Properties viewProperties,
Throwable cause) {
print("Failed to generating maps view to '%s' using story maps '%s' and view properties '%s'", outputDirectory,
storyMaps, viewProperties);
printStackTrace(cause);
}
@Override
public void processingSystemProperties(Properties properties) {
print("Processing system properties %s", properties);
}
@Override
public void systemPropertySet(String name, String value) {
print("System property '%s' set to '%s'", name, value);
}
@Override
public void storyTimeout(Story story, StoryDuration storyDuration) {
print("Story %s duration of %d seconds has exceeded timeout of %d seconds", story.getPath(),
storyDuration.getDurationInSecs(), storyDuration.getTimeoutInSecs());
}
@Override
public void usingThreads(int threads) {
print("Using %d threads", threads);
}
@Override
public void usingExecutorService(ExecutorService executorService) {
print("Using executor service %s", executorService);
}
@Override
public void usingControls(EmbedderControls embedderControls) {
print("Using controls %s", embedderControls);
}
@Override
public void invalidTimeoutFormat(String path) {
print("Failed to set specific story timeout for story %s because 'storyTimeoutInSecsByPath' has incorrect "
+ "format", path);
print("'storyTimeoutInSecsByPath' must be a CSV of regex expressions matching story paths. E.g. \"*/long/*"
+ ".story:5000,*/short/*.story:200\"");
}
@Override
public void usingTimeout(String path, long timeout) {
print("Using timeout for story %s of %d secs.", path, timeout);
}
@Override
public String toString() {
return ToStringBuilder.reflectionToString(this, ToStringStyle.SHORT_PREFIX_STYLE);
}
protected abstract void print(String format, Object... args);
protected abstract void printStackTrace(Throwable e);
}