ExamplesTableFactory.java
package org.jbehave.core.model;
import java.util.Deque;
import org.jbehave.core.configuration.Configuration;
import org.jbehave.core.configuration.Keywords;
import org.jbehave.core.i18n.LocalizedKeywords;
import org.jbehave.core.io.ResourceLoader;
import org.jbehave.core.model.ExamplesTable.TableProperties;
import org.jbehave.core.model.ExamplesTable.TablePropertiesQueue;
import org.jbehave.core.steps.ParameterControls;
import org.jbehave.core.steps.ParameterConverters;
/**
* Factory that creates instances of ExamplesTable from different type of
* inputs:
* <ul>
* <li>table text input, i.e. any input that contains a
* {@link Keywords#examplesTableHeaderSeparator()}</li>
* <li>resource path input, the table as text is loaded via the
* {@link ResourceLoader}.</li>
* </ul>
* Factory also supports optional specification of {@link ParameterConverters}
* to allow the ExamplesTable to convert row values.
* <p>
* <b>NOTE</b>: Users needing parameter conversion in the ExamplesTable, i.e.
* invoking {@link ExamplesTable#getRowAsParameters(int)}, will need to use a
* factory constructor providing explicitly the ParameterConverters instance
* configured in the
* {@link Configuration#useParameterConverters(ParameterConverters)}.
* </p>
*/
public class ExamplesTableFactory {
private Keywords keywords;
private final ResourceLoader resourceLoader;
private final ParameterConverters parameterConverters;
private final ParameterControls parameterControls;
private final TableParsers tableParsers;
private final TableTransformers tableTransformers;
private final TableTransformerMonitor tableTransformerMonitor;
public ExamplesTableFactory(ResourceLoader resourceLoader, TableTransformers tableTransformers) {
this(new LocalizedKeywords(), resourceLoader, tableTransformers);
}
public ExamplesTableFactory(Keywords keywords, ResourceLoader resourceLoader, TableTransformers tableTransformers) {
this(keywords, resourceLoader, new ParameterConverters(resourceLoader, tableTransformers),
tableTransformers);
}
private ExamplesTableFactory(Keywords keywords, ResourceLoader resourceLoader,
ParameterConverters parameterConverters, TableTransformers tableTransformers) {
this(keywords, resourceLoader, parameterConverters, new ParameterControls(),
new TableParsers(keywords, parameterConverters), tableTransformers);
}
public ExamplesTableFactory(Keywords keywords, ResourceLoader resourceLoader,
ParameterConverters parameterConverters, ParameterControls parameterControls,
TableParsers tableParsers, TableTransformers tableTransformers) {
this(keywords, resourceLoader, parameterConverters, parameterControls, tableParsers, tableTransformers,
new NullTableTransformerMonitor());
}
public ExamplesTableFactory(Keywords keywords, ResourceLoader resourceLoader,
ParameterConverters parameterConverters, ParameterControls parameterControls,
TableParsers tableParsers, TableTransformers tableTransformers,
TableTransformerMonitor tableTransformerMonitor) {
this.keywords = keywords;
this.resourceLoader = resourceLoader;
this.parameterConverters = parameterConverters;
this.parameterControls = parameterControls;
this.tableParsers = tableParsers;
this.tableTransformers = tableTransformers;
this.tableTransformerMonitor = tableTransformerMonitor;
}
public ExamplesTableFactory(Configuration configuration) {
this.keywords = configuration.keywords();
this.resourceLoader = configuration.storyLoader();
this.parameterConverters = configuration.parameterConverters();
this.parameterControls = configuration.parameterControls();
this.tableParsers = configuration.tableParsers();
this.tableTransformers = configuration.tableTransformers();
this.tableTransformerMonitor = configuration.tableTransformerMonitor();
}
public ExamplesTable createExamplesTable(String input) {
TablePropertiesQueue tablePropertiesQueue = tableParsers.parseProperties(input);
String tableAsString = tablePropertiesQueue.getTable().trim();
Deque<TableProperties> properties = tablePropertiesQueue.getProperties();
if (!isTable(tableAsString, properties.peekFirst()) && !tableAsString.isEmpty()) {
String loadedTable = resourceLoader.loadResourceAsText(tableAsString.trim());
tablePropertiesQueue = tableParsers.parseProperties(loadedTable);
Deque<TableProperties> target = tablePropertiesQueue.getProperties();
properties.descendingIterator().forEachRemaining(target::addFirst);
}
return new ExamplesTable(tablePropertiesQueue, parameterConverters, parameterControls, tableParsers,
tableTransformers, tableTransformerMonitor);
}
protected boolean isTable(String table, TableProperties properties) {
String headerSeparator = properties == null ? keywords.examplesTableHeaderSeparator()
: properties.getHeaderSeparator();
return table.startsWith(headerSeparator);
}
public void useKeywords(Keywords keywords) {
this.keywords = keywords;
}
public Keywords keywords() {
return this.keywords;
}
}