/*******************************************************************************
* (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.parser.model.ParsedSlang;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.apache.commons.collections4.MapUtils;
import org.apache.commons.lang3.StringUtils;
/**
* @author Bonczidai Levente
* @since 8/24/2016
*/
public class ExecutableValidatorImpl extends AbstractValidator implements ExecutableValidator {
private SystemPropertyValidator systemPropertyValidator;
@Override
public void validateNamespace(ParsedSlang parsedSlang) {
String namespace = parsedSlang.getNamespace();
ParsedSlang.Type executableType = parsedSlang.getType();
switch (executableType) {
case SYSTEM_PROPERTY_FILE:
systemPropertyValidator.validateNamespace(namespace);
break;
case FLOW:
case OPERATION:
case DECISION:
// namespace cannot be empty
if (StringUtils.isEmpty(namespace)) {
throw new RuntimeException("For source[" + parsedSlang.getName() + "] namespace cannot be empty.");
} else {
validateNamespaceRules(namespace);
}
break;
default:
throw new RuntimeException("Not yet implemented");
}
}
@Override
public void validateImportsSection(ParsedSlang parsedSlang) {
Map<String, String> imports = parsedSlang.getImports();
ParsedSlang.Type executableType = parsedSlang.getType();
switch (executableType) {
case FLOW:
break;
case OPERATION:
case DECISION:
case SYSTEM_PROPERTY_FILE:
if (MapUtils.isNotEmpty(imports)) {
throw new RuntimeException("Type[" + executableType.name() + "] cannot have imports section");
}
break;
default:
throw new RuntimeException("Not yet implemented");
}
if (MapUtils.isNotEmpty(imports)) {
Set<Map.Entry<String, String>> entrySet = imports.entrySet();
for (Map.Entry<String, String> entry : entrySet) {
String alias = entry.getKey();
String namespace = entry.getValue();
validateNamespaceRules(namespace);
validateSimpleNameRules(alias);
}
}
}
@Override
public void validateStepReferenceId(String referenceId) {
if (StringUtils.isEmpty(referenceId)) {
throw new RuntimeException("Reference ID cannot be empty");
}
validateNamespaceRules(referenceId);
}
@Override
public void validateExecutableName(String executableName) {
validateSimpleNameRules(executableName);
}
@Override
public void validateStepName(String stepName) {
validateSimpleNameRules(stepName);
}
@Override
public void validateResultName(String resultName) {
validateResultNameRules(resultName);
}
@Override
public void validateNavigationStrings(List<Map<String, String>> navigationStrings) {
for (Map<String, String> element : navigationStrings) {
Map.Entry<String, String> navigation = element.entrySet().iterator().next();
String navigationKey = navigation.getKey();
String navigationValue = navigation.getValue();
validateNavigationKey(navigationKey);
validateNavigationValue(navigationValue);
}
}
@Override
public void validateBreakKeys(List<String> breakKeys) {
for (String breakOn : breakKeys) {
validateResultNameRules(breakOn);
}
}
@Override
public void validateInputName(String name) {
validateVariableNameRules(name);
}
@Override
public void validateOutputName(String name) {
validateVariableNameRules(name);
}
@Override
public void validateLoopStatementVariable(String name) {
validateVariableNameRules(name);
}
private void validateNavigationKey(String navigationKey) {
validateResultNameRules(navigationKey);
}
private void validateNavigationValue(String navigationValue) {
try {
validateStepName(navigationValue);
} catch (RuntimeException rex) {
validateResultName(navigationValue);
}
}
public void setSystemPropertyValidator(SystemPropertyValidator systemPropertyValidator) {
this.systemPropertyValidator = systemPropertyValidator;
}
}