/******************************************************************************* * (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.entities.utils; import java.io.Serializable; import java.util.HashSet; import java.util.Set; import java.util.regex.Matcher; import java.util.regex.Pattern; import static io.cloudslang.lang.entities.constants.Regex.CHECK_EMPTY_REGEX; import static io.cloudslang.lang.entities.constants.Regex.EXPRESSION_REGEX; import static io.cloudslang.lang.entities.constants.Regex.GET_REGEX; import static io.cloudslang.lang.entities.constants.Regex.GET_REGEX_WITH_DEFAULT; import static io.cloudslang.lang.entities.constants.Regex.SYSTEM_PROPERTY_REGEX_DOUBLE_QUOTE; import static io.cloudslang.lang.entities.constants.Regex.SYSTEM_PROPERTY_REGEX_SINGLE_QUOTE; import static io.cloudslang.lang.entities.constants.Regex.SYSTEM_PROPERTY_REGEX_WITH_DEFAULT_DOUBLE_QUOTE; import static io.cloudslang.lang.entities.constants.Regex.SYSTEM_PROPERTY_REGEX_WITH_DEFAULT_SINGLE_QUOTE; import static java.util.regex.Pattern.compile; /** * @author Bonczidai Levente * @since 1/18/2016 */ public final class ExpressionUtils { private ExpressionUtils() { } private static final Pattern EXPRESSION_PATTERN = compile(EXPRESSION_REGEX, Pattern.DOTALL); private static final Pattern SYSTEM_PROPERTY_PATTERN_SINGLE_QUOTE = compile(SYSTEM_PROPERTY_REGEX_SINGLE_QUOTE); private static final Pattern SYSTEM_PROPERTY_PATTERN_DOUBLE_QUOTE = compile(SYSTEM_PROPERTY_REGEX_DOUBLE_QUOTE); private static final Pattern SYSTEM_PROPERTY_PATTERN_WITH_DEFAULT_SINGLE_QUOTE = compile(SYSTEM_PROPERTY_REGEX_WITH_DEFAULT_SINGLE_QUOTE); private static final Pattern SYSTEM_PROPERTY_PATTERN_WITH_DEFAULT_DOUBLE_QUOTE = compile(SYSTEM_PROPERTY_REGEX_WITH_DEFAULT_DOUBLE_QUOTE); private static final Pattern GET_PATTERN = compile(GET_REGEX); private static final Pattern GET_PATTERN_WITH_DEFAULT = compile(GET_REGEX_WITH_DEFAULT); private static final Pattern CHECK_EMPTY_PATTERN = compile(CHECK_EMPTY_REGEX); public static String extractExpression(Serializable value) { String expression = null; if (value instanceof String) { String valueAsString = ((String) value); Matcher expressionMatcher = EXPRESSION_PATTERN.matcher(valueAsString); if (expressionMatcher.find()) { expression = expressionMatcher.group(1); } } return expression; } public static Set<String> extractSystemProperties(String expression) { Set<String> properties = matchFunction(SYSTEM_PROPERTY_PATTERN_SINGLE_QUOTE, expression, 1); properties.addAll(matchFunction(SYSTEM_PROPERTY_PATTERN_DOUBLE_QUOTE, expression, 1)); properties.addAll(matchFunction(SYSTEM_PROPERTY_PATTERN_WITH_DEFAULT_SINGLE_QUOTE, expression, 1)); properties.addAll(matchFunction(SYSTEM_PROPERTY_PATTERN_WITH_DEFAULT_DOUBLE_QUOTE, expression, 1)); return properties; } public static boolean matchGetFunction(String text) { return matchPattern(GET_PATTERN_WITH_DEFAULT, text) || matchPattern(GET_PATTERN, text); } public static boolean matchCheckEmptyFunction(String text) { return matchPattern(CHECK_EMPTY_PATTERN, text); } private static boolean matchPattern(Pattern pattern, String text) { Matcher matcher = pattern.matcher(text); return matcher.find(); } private static Set<String> matchFunction(Pattern functionPattern, String text, int parameterGroup) { Matcher matcher = functionPattern.matcher(text); Set<String> parameters = new HashSet<>(); while (matcher.find()) { parameters.add(matcher.group(parameterGroup)); } return parameters; } }