ExamplesTableFactory.java

  1. package org.jbehave.core.model;

  2. import java.util.Deque;

  3. import org.jbehave.core.configuration.Configuration;
  4. import org.jbehave.core.configuration.Keywords;
  5. import org.jbehave.core.i18n.LocalizedKeywords;
  6. import org.jbehave.core.io.ResourceLoader;
  7. import org.jbehave.core.model.ExamplesTable.TableProperties;
  8. import org.jbehave.core.model.ExamplesTable.TablePropertiesQueue;
  9. import org.jbehave.core.steps.ParameterControls;
  10. import org.jbehave.core.steps.ParameterConverters;

  11. /**
  12.  * Factory that creates instances of ExamplesTable from different type of
  13.  * inputs:
  14.  * <ul>
  15.  * <li>table text input, i.e. any input that contains a
  16.  * {@link Keywords#examplesTableHeaderSeparator()}</li>
  17.  * <li>resource path input, the table as text is loaded via the
  18.  * {@link ResourceLoader}.</li>
  19.  * </ul>
  20.  * Factory also supports optional specification of {@link ParameterConverters}
  21.  * to allow the ExamplesTable to convert row values.
  22.  * <p>
  23.  * <b>NOTE</b>: Users needing parameter conversion in the ExamplesTable, i.e.
  24.  * invoking {@link ExamplesTable#getRowAsParameters(int)}, will need to use a
  25.  * factory constructor providing explicitly the ParameterConverters instance
  26.  * configured in the
  27.  * {@link Configuration#useParameterConverters(ParameterConverters)}.
  28.  * </p>
  29.  */
  30. public class ExamplesTableFactory {

  31.     private Keywords keywords;
  32.     private final ResourceLoader resourceLoader;
  33.     private final ParameterConverters parameterConverters;
  34.     private final ParameterControls parameterControls;
  35.     private final TableParsers tableParsers;
  36.     private final TableTransformers tableTransformers;
  37.     private final TableTransformerMonitor tableTransformerMonitor;

  38.     public ExamplesTableFactory(ResourceLoader resourceLoader, TableTransformers tableTransformers) {
  39.         this(new LocalizedKeywords(), resourceLoader, tableTransformers);
  40.     }

  41.     public ExamplesTableFactory(Keywords keywords, ResourceLoader resourceLoader, TableTransformers tableTransformers) {
  42.         this(keywords, resourceLoader, new ParameterConverters(resourceLoader, tableTransformers),
  43.                 tableTransformers);
  44.     }

  45.     private ExamplesTableFactory(Keywords keywords, ResourceLoader resourceLoader,
  46.             ParameterConverters parameterConverters, TableTransformers tableTransformers) {
  47.         this(keywords, resourceLoader, parameterConverters, new ParameterControls(),
  48.                 new TableParsers(keywords, parameterConverters), tableTransformers);
  49.     }

  50.     public ExamplesTableFactory(Keywords keywords, ResourceLoader resourceLoader,
  51.                                 ParameterConverters parameterConverters, ParameterControls parameterControls,
  52.                                 TableParsers tableParsers, TableTransformers tableTransformers) {
  53.         this(keywords, resourceLoader, parameterConverters, parameterControls, tableParsers, tableTransformers,
  54.                 new NullTableTransformerMonitor());
  55.     }

  56.     public ExamplesTableFactory(Keywords keywords, ResourceLoader resourceLoader,
  57.                                 ParameterConverters parameterConverters, ParameterControls parameterControls,
  58.                                 TableParsers tableParsers, TableTransformers tableTransformers,
  59.                                 TableTransformerMonitor tableTransformerMonitor) {
  60.         this.keywords = keywords;
  61.         this.resourceLoader = resourceLoader;
  62.         this.parameterConverters = parameterConverters;
  63.         this.parameterControls = parameterControls;
  64.         this.tableParsers = tableParsers;
  65.         this.tableTransformers = tableTransformers;
  66.         this.tableTransformerMonitor = tableTransformerMonitor;
  67.     }
  68.    
  69.     public ExamplesTableFactory(Configuration configuration) {
  70.         this.keywords = configuration.keywords();
  71.         this.resourceLoader = configuration.storyLoader();
  72.         this.parameterConverters = configuration.parameterConverters();
  73.         this.parameterControls = configuration.parameterControls();
  74.         this.tableParsers = configuration.tableParsers();
  75.         this.tableTransformers = configuration.tableTransformers();
  76.         this.tableTransformerMonitor = configuration.tableTransformerMonitor();
  77.     }

  78.     public ExamplesTable createExamplesTable(String input) {
  79.         TablePropertiesQueue tablePropertiesQueue = tableParsers.parseProperties(input);

  80.         String tableAsString = tablePropertiesQueue.getTable().trim();
  81.         Deque<TableProperties> properties = tablePropertiesQueue.getProperties();

  82.         if (!isTable(tableAsString, properties.peekFirst()) && !tableAsString.isEmpty()) {
  83.             String loadedTable = resourceLoader.loadResourceAsText(tableAsString.trim());
  84.             tablePropertiesQueue = tableParsers.parseProperties(loadedTable);
  85.             Deque<TableProperties> target = tablePropertiesQueue.getProperties();
  86.             properties.descendingIterator().forEachRemaining(target::addFirst);
  87.         }

  88.         return new ExamplesTable(tablePropertiesQueue, parameterConverters, parameterControls, tableParsers,
  89.                 tableTransformers, tableTransformerMonitor);
  90.     }

  91.     protected boolean isTable(String table, TableProperties properties) {
  92.         String headerSeparator = properties == null ? keywords.examplesTableHeaderSeparator()
  93.                 : properties.getHeaderSeparator();
  94.         return table.startsWith(headerSeparator);
  95.     }

  96.     public void useKeywords(Keywords keywords) {
  97.         this.keywords = keywords;
  98.     }

  99.     public Keywords keywords() {
  100.         return this.keywords;
  101.     }
  102. }