/******************************************************************************* * (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; import io.cloudslang.lang.compiler.SlangTextualKeys; import io.cloudslang.lang.compiler.modeller.model.Executable; import io.cloudslang.lang.compiler.validator.matcher.NamespacePatternMatcher; import io.cloudslang.lang.compiler.validator.matcher.PatternMatcher; import io.cloudslang.lang.compiler.validator.matcher.ResultNamePatternMatcher; import io.cloudslang.lang.compiler.validator.matcher.SimpleNamePatternMatcher; import io.cloudslang.lang.compiler.validator.matcher.VariableNamePatternMatcher; import io.cloudslang.lang.entities.bindings.InOutParam; import io.cloudslang.lang.entities.bindings.Input; import io.cloudslang.lang.entities.bindings.Output; import io.cloudslang.lang.entities.bindings.Result; import io.cloudslang.lang.entities.constants.Regex; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import java.util.ArrayList; import java.util.List; public abstract class AbstractValidator { public static final String NAME_PLACEHOLDER = "name_placeholder01"; protected PatternMatcher namespacePatternMatcher; protected PatternMatcher simpleNamePatternMatcher; protected PatternMatcher resultNamePatternMatcher; protected PatternMatcher variableNamePatternMatcher; public AbstractValidator() { namespacePatternMatcher = new NamespacePatternMatcher(); simpleNamePatternMatcher = new SimpleNamePatternMatcher(); resultNamePatternMatcher = new ResultNamePatternMatcher(); variableNamePatternMatcher = new VariableNamePatternMatcher(); } protected void validateNamespaceRules(String input) { validateChars(namespacePatternMatcher, input); validateDelimiter(input); } protected void validateSimpleNameRules(String input) { validateChars(simpleNamePatternMatcher, input); } protected void validateResultNameRules(String input) { validateChars(resultNamePatternMatcher, input); validateKeywords(input); } protected void validateVariableNameRules(String input) { validateChars(variableNamePatternMatcher, input); } protected void validateListsHaveMutuallyExclusiveNames(List<? extends InOutParam> inOutParams, List<Output> outputs, String errorMessage) { for (InOutParam inOutParam : CollectionUtils.emptyIfNull(inOutParams)) { if (inOutParam instanceof Input && ((Input) inOutParam).isPrivateInput()) { continue; } for (Output output : CollectionUtils.emptyIfNull(outputs)) { if (StringUtils.equalsIgnoreCase(inOutParam.getName(), output.getName())) { throw new IllegalArgumentException(errorMessage.replace(NAME_PLACEHOLDER, inOutParam.getName())); } } } } protected List<String> getResultNames(Executable executable) { List<String> resultNames = new ArrayList<>(); for (Result result : executable.getResults()) { resultNames.add(result.getName()); } return resultNames; } private void validateKeywords(String resultName) { if (SlangTextualKeys.ON_FAILURE_KEY.equalsIgnoreCase(resultName)) { throw new RuntimeException("Result cannot be called '" + SlangTextualKeys.ON_FAILURE_KEY + "'."); } } private void validateChars(PatternMatcher patternMatcher, String input) { if (!patternMatcher.matchesEndToEnd(input)) { throw new RuntimeException("Argument[" + input + "] violates character rules."); } } private void validateDelimiter(String input) { if (input.startsWith(Regex.NAMESPACE_PROPERTY_DELIMITER)) { throw new RuntimeException( "Argument[" + input + "] cannot start with delimiter[" + Regex.NAMESPACE_PROPERTY_DELIMITER + "]." ); } if (input.endsWith(Regex.NAMESPACE_PROPERTY_DELIMITER)) { throw new RuntimeException( "Argument[" + input + "] cannot end with delimiter[" + Regex.NAMESPACE_PROPERTY_DELIMITER + "]." ); } String[] parts = input.split(Regex.NAMESPACE_DELIMITER_ESCAPED); for (String part : parts) { if ("".equals(part)) { throw new RuntimeException( "Argument[" + input + "] cannot contain multiple delimiters[" + Regex.NAMESPACE_PROPERTY_DELIMITER + "] without content." ); } } } }