/******************************************************************************* * (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.modeller; import io.cloudslang.lang.entities.SensitivityLevel; import io.cloudslang.lang.compiler.modeller.result.ExecutableModellingResult; import io.cloudslang.lang.compiler.modeller.result.ParseModellingResult; import io.cloudslang.lang.compiler.parser.model.ParsedSlang; import java.util.ArrayList; import java.util.List; import org.apache.commons.lang.Validate; public class SlangModellerImpl implements SlangModeller { private ExecutableBuilder executableBuilder; @Override public ExecutableModellingResult createModel(ParseModellingResult parseModellingResult, SensitivityLevel sensitivityLevel) { ParsedSlang parsedSlang = parseModellingResult.getParsedSlang(); Validate.notNull(parsedSlang, "You must supply a parsed Slang source to compile"); try { switch (parsedSlang.getType()) { case OPERATION: return aggregateModellingWithParseResult( executableBuilder.transformToExecutable(parsedSlang, parsedSlang.getOperation(), sensitivityLevel), parseModellingResult ); case FLOW: return aggregateModellingWithParseResult( executableBuilder.transformToExecutable(parsedSlang, parsedSlang.getFlow(), sensitivityLevel), parseModellingResult ); case DECISION: return aggregateModellingWithParseResult( executableBuilder.transformToExecutable(parsedSlang, parsedSlang.getDecision(), sensitivityLevel), parseModellingResult ); default: throw new RuntimeException("Source: " + parsedSlang.getName() + " is not of flow, operations or decision type"); } } catch (Throwable ex) { throw new RuntimeException("Error transforming source: " + parsedSlang.getName() + " to a Slang model. " + ex.getMessage(), ex); } } private ExecutableModellingResult aggregateModellingWithParseResult( ExecutableModellingResult executableModellingResult, ParseModellingResult parseModellingResult) { List<RuntimeException> aggregatedExceptions = new ArrayList<>(); aggregatedExceptions.addAll(parseModellingResult.getErrors()); aggregatedExceptions.addAll(executableModellingResult.getErrors()); return new ExecutableModellingResult(executableModellingResult.getExecutable(), aggregatedExceptions); } public void setExecutableBuilder(ExecutableBuilder executableBuilder) { this.executableBuilder = executableBuilder; } }