/******************************************************************************* * (c) Copyright 2016 Hewlett-Packard Development Company, L.P. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Apache License v2.0 which accompany this distribution. * * The Apache License is available at * http://www.apache.org/licenses/LICENSE-2.0 * *******************************************************************************/ package io.cloudslang.lang.compiler.validator.matcher; import io.cloudslang.lang.entities.constants.Regex; import java.util.ArrayList; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.tuple.ImmutablePair; import org.apache.commons.lang3.tuple.Pair; /** * @author Bonczidai Levente * @since 3/20/2017 */ public class DescriptionPatternMatcher { private final Pattern descriptionStartPattern; private final Pattern descriptionVariableLinePattern; private final Pattern descriptionGeneralLinePattern; private final Pattern descriptionComplementaryLinePattern; private final Pattern descriptionEndPattern; private final Pattern commentLinePattern; private final Pattern stepStartLinePattern; private final Pattern executableDelimiterLinePattern; private final Pattern stepDelimiterLinePattern; private final Pattern emptyLinePattern; private final Pattern descriptionVariableLineDeclarationOnlyPattern; public DescriptionPatternMatcher() { descriptionStartPattern = Pattern.compile(Regex.DESCRIPTION_START_LINE); descriptionVariableLinePattern = Pattern.compile(Regex.DESCRIPTION_VARIABLE_LINE); descriptionGeneralLinePattern = Pattern.compile(Regex.DESCRIPTION_GENERAL_LINE); descriptionComplementaryLinePattern = Pattern.compile(Regex.DESCRIPTION_COMPLEMENTARY_LINE); descriptionEndPattern = Pattern.compile(Regex.DESCRIPTION_END_LINE); commentLinePattern = Pattern.compile(Regex.COMMENT_LINE); stepStartLinePattern = Pattern.compile(Regex.STEP_START_LINE); executableDelimiterLinePattern = Pattern.compile(Regex.EXECUTABLE_DESCRIPTION_DELIMITER_LINE); stepDelimiterLinePattern = Pattern.compile(Regex.STEP_DESCRIPTION_DELIMITER_LINE); emptyLinePattern = Pattern.compile(Regex.DESCRIPTION_EMPTY_LINE); descriptionVariableLineDeclarationOnlyPattern = Pattern.compile(Regex.DESCRIPTION_VARIABLE_LINE_DECLARATION_ONLY); } public boolean matchesDescriptionStart(String input) { return descriptionStartPattern.matcher(input).matches(); } public boolean matchesDescriptionEnd(String input) { return descriptionEndPattern.matcher(input).matches(); } public boolean matchesDescriptionVariableLine(String input) { return descriptionVariableLinePattern.matcher(input).matches(); } public boolean matchesDescriptionGeneralLine(String input) { return descriptionGeneralLinePattern.matcher(input).matches(); } public boolean matchesDescriptionComplementaryLine(String input) { return descriptionComplementaryLinePattern.matcher(input).matches(); } public boolean matchesCommentLine(String input) { return commentLinePattern.matcher(input).matches(); } public boolean matchesStepStartLine(String input) { return stepStartLinePattern.matcher(input).matches(); } public boolean matchesExecutableDelimiterLine(String input) { return executableDelimiterLinePattern.matcher(input).matches(); } public boolean matchesStepDelimiterLine(String input) { return stepDelimiterLinePattern.matcher(input).matches(); } public boolean matchesEmptyLine(String input) { return emptyLinePattern.matcher(input).matches(); } public boolean matchesVariableLineDeclarationOnlyLine(String input) { return descriptionVariableLineDeclarationOnlyPattern.matcher(input).matches(); } public String getStepName(String input) { List<String> matches = getData(stepStartLinePattern, input, Regex.STEP_START_LINE_DATA_GROUP_NR); if (CollectionUtils.isNotEmpty(matches)) { return matches.get(0); } else { return null; } } public Pair<String, String> getDescriptionVariableLineData(String input) { List<String> matches = getData( descriptionVariableLinePattern, input, Regex.DESCRIPTION_VARIABLE_LINE_DECLARATION_GROUP_NR, Regex.DESCRIPTION_VARIABLE_LINE_CONTENT_GROUP_NR ); return new ImmutablePair<>(matches.get(0), matches.get(1)); } public Pair<String, String> getDescriptionVariableLineDataDeclarationOnly(String input) { List<String> matches = getData( descriptionVariableLineDeclarationOnlyPattern, input, Regex.DESCRIPTION_VARIABLE_LINE_DECLARATION_ONLY_GROUP_NR ); return new ImmutablePair<>(matches.get(0), ""); } public Pair<String, String> getDescriptionGeneralLineData(String input) { List<String> matches = getData( descriptionGeneralLinePattern, input, Regex.DESCRIPTION_GENERAL_LINE_DECLARATION_GROUP_NR, Regex.DESCRIPTION_GENERAL_LINE_CONTENT_GROUP_NR ); return new ImmutablePair<>(matches.get(0), matches.get(1)); } public String getDescriptionComplementaryLineData(String input) { String data = getData( descriptionComplementaryLinePattern, input, Regex.DESCRIPTION_COMPLEMENTARY_LINE_GROUP_NR ).get(0); return data == null ? "" : data; } @SuppressWarnings("unused") public boolean isLineAcceptedInsideDescription(String input) { // does not allow any line return false; } public String[] splitDeclaration(String declaration) { return declaration.split(Regex.DESCRIPTION_DECLARATION_DELIMITER); } private List<String> getData(Pattern pattern, String input, int... groupNumbers) { Matcher matcher = pattern.matcher(input); List<String> matchedGroups = new ArrayList<>(); if (matcher.find()) { for (int groupNr : groupNumbers) { matchedGroups.add(matcher.group(groupNr)); } } return matchedGroups; } }