RegexCompositeParser.java
- package org.jbehave.core.parsers;
- import static java.util.regex.Pattern.DOTALL;
- import static java.util.regex.Pattern.compile;
- import static org.apache.commons.lang3.StringUtils.removeStart;
- import java.util.ArrayList;
- import java.util.Arrays;
- import java.util.List;
- import java.util.regex.Matcher;
- import java.util.regex.Pattern;
- import org.jbehave.core.configuration.Keywords;
- import org.jbehave.core.model.Composite;
- import org.jbehave.core.steps.StepType;
- /**
- * Pattern-based composite parser, which uses the keywords provided to parse the
- * textual composite steps into a list of {@link Composite}.
- *
- * @author Mauro Talevi
- * @author Valery Yatsynovich
- */
- public class RegexCompositeParser extends AbstractRegexParser implements CompositeParser {
- public RegexCompositeParser() {
- super();
- }
- public RegexCompositeParser(Keywords keywords) {
- super(keywords);
- }
- @Override
- public List<Composite> parseComposites(String compositesAsText) {
- List<Composite> parsed = new ArrayList<>();
- for (String compositeAsText : splitElements(compositesAsText, keywords().composite())) {
- parsed.add(parseComposite(compositeAsText));
- }
- return parsed;
- }
- private Composite parseComposite(String compositeAsText) {
- Matcher findingCompositeMatcher = findingCompositePattern().matcher(compositeAsText);
- String compositePattern = NONE;
- int priority = 0;
- if (findingCompositeMatcher.find()) {
- compositePattern = findingCompositeMatcher.group(1).trim();
- String priorityGroup = findingCompositeMatcher.group(2);
- if (priorityGroup != null) {
- priority = Integer.parseInt(priorityGroup);
- }
- }
- String compositeWithoutKeyword = removeStart(compositeAsText, keywords().composite()).trim();
- String compositeWithoutName = removeStart(compositeWithoutKeyword, compositePattern);
- compositeWithoutName = startingWithNL(compositeWithoutName);
- List<String> steps = findSteps(compositeWithoutName);
- StepType stepType = keywords().stepTypeFor(compositePattern);
- String stepWithoutStartingWord = keywords().stepWithoutStartingWord(compositePattern, stepType);
- return new Composite(stepType, stepWithoutStartingWord, priority, steps);
- }
- // Regex Patterns
- private Pattern findingCompositePattern() {
- String startingWords = concatenateStartingWords();
- String startingCompositeStepWords = concatenateWithOr("\\s*", Arrays.asList(
- keywords().given(),
- keywords().when(),
- keywords().then()
- ));
- return compile(keywords().composite() + "\n(" + startingCompositeStepWords + "\\s.*?)\\s*(?:\n\\s*"
- + keywords().priority() + "\\s*(\\d+)" + "\\s*)?" + "(" + startingWords + ".*|\\s*$)", DOTALL);
- }
- }