RegexCompositeParser.java

  1. package org.jbehave.core.parsers;

  2. import static java.util.regex.Pattern.DOTALL;
  3. import static java.util.regex.Pattern.compile;
  4. import static org.apache.commons.lang3.StringUtils.removeStart;

  5. import java.util.ArrayList;
  6. import java.util.Arrays;
  7. import java.util.List;
  8. import java.util.regex.Matcher;
  9. import java.util.regex.Pattern;

  10. import org.jbehave.core.configuration.Keywords;
  11. import org.jbehave.core.model.Composite;
  12. import org.jbehave.core.steps.StepType;

  13. /**
  14.  * Pattern-based composite parser, which uses the keywords provided to parse the
  15.  * textual composite steps into a list of {@link Composite}.
  16.  *
  17.  * @author Mauro Talevi
  18.  * @author Valery Yatsynovich
  19.  */
  20. public class RegexCompositeParser extends AbstractRegexParser implements CompositeParser {

  21.     public RegexCompositeParser() {
  22.         super();
  23.     }

  24.     public RegexCompositeParser(Keywords keywords) {
  25.         super(keywords);
  26.     }

  27.     @Override
  28.     public List<Composite> parseComposites(String compositesAsText) {
  29.         List<Composite> parsed = new ArrayList<>();
  30.         for (String compositeAsText : splitElements(compositesAsText, keywords().composite())) {
  31.             parsed.add(parseComposite(compositeAsText));
  32.         }
  33.         return parsed;
  34.     }

  35.     private Composite parseComposite(String compositeAsText) {
  36.         Matcher findingCompositeMatcher = findingCompositePattern().matcher(compositeAsText);
  37.         String compositePattern = NONE;
  38.         int priority = 0;
  39.         if (findingCompositeMatcher.find()) {
  40.             compositePattern = findingCompositeMatcher.group(1).trim();
  41.             String priorityGroup = findingCompositeMatcher.group(2);
  42.             if (priorityGroup != null) {
  43.                 priority = Integer.parseInt(priorityGroup);
  44.             }
  45.         }
  46.         String compositeWithoutKeyword = removeStart(compositeAsText, keywords().composite()).trim();
  47.         String compositeWithoutName = removeStart(compositeWithoutKeyword, compositePattern);
  48.         compositeWithoutName = startingWithNL(compositeWithoutName);
  49.         List<String> steps = findSteps(compositeWithoutName);
  50.         StepType stepType = keywords().stepTypeFor(compositePattern);
  51.         String stepWithoutStartingWord = keywords().stepWithoutStartingWord(compositePattern, stepType);
  52.         return new Composite(stepType, stepWithoutStartingWord, priority, steps);
  53.     }

  54.     // Regex Patterns
  55.     private Pattern findingCompositePattern() {
  56.         String startingWords = concatenateStartingWords();
  57.         String startingCompositeStepWords = concatenateWithOr("\\s*", Arrays.asList(
  58.                 keywords().given(),
  59.                 keywords().when(),
  60.                 keywords().then()
  61.         ));
  62.         return compile(keywords().composite() + "\n(" + startingCompositeStepWords + "\\s.*?)\\s*(?:\n\\s*"
  63.                 + keywords().priority() + "\\s*(\\d+)" + "\\s*)?" + "(" + startingWords + ".*|\\s*$)", DOTALL);
  64.     }
  65. }