package org.jbehave.core.embedder;
import java.io.File;
import java.io.PrintStream;
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.Format;
import org.jbehave.core.reporters.ReportsCount;
/**
* Monitor that reports to a {@link PrintStream}, defaulting to
* {@link System.out}
*/
public class PrintStreamEmbedderMonitor extends NullEmbedderMonitor {
private PrintStream output;
public PrintStreamEmbedderMonitor() {
this(System.out);
}
public PrintStreamEmbedderMonitor(PrintStream output) {
this.output = output;
}
public void batchFailed(BatchFailures failures) {
print("Failed to run batch " + failures);
}
public void beforeOrAfterStoriesFailed() {
print("Failed to run before or after stories steps");
}
public void embeddableFailed(String name, Throwable cause) {
print("Failed to run embeddable " + name);
printStackTrace(cause);
}
public void embeddableNotConfigurable(String name) {
print("Embeddable " + name + " must be an instance of " + ConfigurableEmbedder.class);
}
public void embeddablesSkipped(List<String> classNames) {
print("Skipped embeddables " + classNames);
}
public void metaNotAllowed(Meta meta, MetaFilter filter) {
print(meta + " excluded by filter '" + filter.asString() + "'");
}
public void runningEmbeddable(String name) {
print("Running embeddable " + name);
}
public void runningStory(String path) {
print("Running story " + path);
}
public void storyFailed(String path, Throwable cause) {
print("Failed to run story " + path);
printStackTrace(cause);
}
public void storiesSkipped(List<String> storyPaths) {
print("Skipped stories " + storyPaths);
}
public void storiesNotAllowed(List<Story> stories, MetaFilter filter, boolean verbose) {
StringBuffer sb = new StringBuffer();
sb.append(stories.size() + " stories excluded by filter: " + filter.asString() + "\n");
if (verbose) {
for (Story story : stories) {
sb.append(story.getPath()).append("\n");
}
}
print(sb.toString());
}
public void scenarioNotAllowed(Scenario scenario, MetaFilter filter) {
StringBuffer sb = new StringBuffer();
sb.append("Scenario '"+scenario.getTitle()+"' excluded by filter: " + filter.asString() + "\n");
print(sb.toString());
}
public void runningWithAnnotatedEmbedderRunner(String className) {
print("Running with AnnotatedEmbedderRunner '" + className + "'");
}
public void annotatedInstanceNotOfType(Object annotatedInstance, Class<?> type) {
print("Annotated instance " + annotatedInstance + " if not of type " + type);
}
public void generatingReportsView(File outputDirectory, List<String> formats, Properties viewProperties) {
print("Generating reports view to '" + outputDirectory + "' using formats '" + formats + "'"
+ " and view properties '" + viewProperties + "'");
}
public void reportsViewGenerationFailed(File outputDirectory, List<String> formats, Properties viewProperties,
Throwable cause) {
print("Failed to generate reports view to '" + outputDirectory + "' using formats '" + formats
+ "' and view properties '" + viewProperties + "'");
}
public void reportsViewGenerated(ReportsCount count) {
print("Reports view generated with " + count.getStories() + " stories (of which " + count.getStoriesPending()
+ " pending) containing " + count.getScenarios() + " scenarios (of which " + count.getScenariosPending() + " pending)");
if (count.getStoriesNotAllowed() > 0 || count.getScenariosNotAllowed() > 0) {
print("Meta filters excluded " + count.getStoriesNotAllowed() + " stories and "
+ count.getScenariosNotAllowed() + " scenarios");
}
}
public void reportsViewFailures(ReportsCount count) {
print("Failures in reports view: " + count.getScenariosFailed() + " scenarios failed");
}
public void reportsViewNotGenerated() {
print("Reports view not generated");
}
public void mappingStory(String storyPath, List<String> metaFilters) {
print("Mapping story " + storyPath + " with meta filters " + metaFilters);
}
public void generatingMapsView(File outputDirectory, StoryMaps storyMaps, Properties viewProperties) {
print("Generating maps view to '" + outputDirectory + "' using story maps '" + storyMaps + "'"
+ " and view properties '" + viewProperties + "'");
}
public void mapsViewGenerationFailed(File outputDirectory, StoryMaps storyMaps, Properties viewProperties,
Throwable cause) {
print("Failed to generating maps view to '" + outputDirectory + "' using story maps '" + storyMaps + "'"
+ " and view properties '" + viewProperties + "'");
printStackTrace(cause);
}
public void generatingNavigatorView(File outputDirectory, Properties viewProperties) {
print("Generating navigator view to '" + outputDirectory + "' using view properties '" + viewProperties + "'");
}
public void navigatorViewGenerationFailed(File outputDirectory, Properties viewProperties, Throwable cause) {
print("Failed to generating navigator view to '" + outputDirectory + "' using view properties '"
+ viewProperties + "'");
printStackTrace(cause);
}
public void navigatorViewNotGenerated() {
print("Navigator view not generated, as the CrossReference has not been declared in the StoryReporterBuilder");
}
public void processingSystemProperties(Properties properties) {
print("Processing system properties " + properties);
}
public void systemPropertySet(String name, String value) {
print("System property '" + name + "' set to '" + value + "'");
}
public void storyTimeout(Story story, StoryDuration storyDuration) {
print("Story " + story.getPath() + " duration of " + storyDuration.getDurationInSecs()
+ " seconds has exceeded timeout of " + storyDuration.getTimeoutInSecs() + " seconds");
}
public void usingThreads(int threads) {
print("Using " + threads + " threads");
}
public void usingExecutorService(ExecutorService executorService) {
print("Using executor service " + executorService);
}
public void usingControls(EmbedderControls embedderControls) {
print("Using controls " + embedderControls);
}
public void invalidTimeoutFormat(String path) {
print("Failed to set specific story timeout for story " + path + " because 'storyTimeoutInSecsByPath' has incorrect format");
print("'storyTimeoutInSecsByPath' must be a CSV of regex expressions matching story paths. E.g. \"*/long/*.story:5000,*/short/*.story:200\"");
}
public void usingTimeout(String path, long timeout) {
print("Using timeout for story " + path + " of "+timeout+" secs.");
}
@Override
public String toString() {
return ToStringBuilder.reflectionToString(this, ToStringStyle.SHORT_PREFIX_STYLE);
}
protected void print(String message) {
Format.println(output, message);
}
protected void printStackTrace(Throwable e) {
e.printStackTrace(output);
}
}