/******************************************************************************* * (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.parser; import io.cloudslang.lang.compiler.SlangSource; import io.cloudslang.lang.compiler.modeller.result.ParseModellingResult; import io.cloudslang.lang.compiler.parser.model.ParsedSlang; import io.cloudslang.lang.compiler.parser.utils.ParserExceptionHandler; import io.cloudslang.lang.compiler.validator.ExecutableValidator; import java.util.ArrayList; import java.util.List; import org.apache.commons.lang3.Validate; import org.yaml.snakeyaml.Yaml; public abstract class YamlParser { private ParserExceptionHandler parserExceptionHandler; private ExecutableValidator executableValidator; protected abstract Yaml getYaml(); public ParsedSlang validateAndThrowFirstError(ParsedSlang parsedSlang) { ParseModellingResult parseModellingResult = validate(parsedSlang); if (!parseModellingResult.getErrors().isEmpty()) { throw parseModellingResult.getErrors().get(0); } else { return parseModellingResult.getParsedSlang(); } } public ParseModellingResult validate(ParsedSlang parsedSlang) { List<RuntimeException> errors = new ArrayList<>(); try { executableValidator.validateNamespace(parsedSlang); } catch (RuntimeException rex) { errors.add(rex); } try { executableValidator.validateImportsSection(parsedSlang); } catch (RuntimeException rex) { errors.add(rex); } return new ParseModellingResult(parsedSlang, errors); } public ParsedSlang parse(SlangSource source) { Validate.notEmpty(source.getContent(), "Source " + source.getName() + " cannot be empty"); try { ParsedSlang parsedSlang = getYaml().loadAs(source.getContent(), ParsedSlang.class); if (parsedSlang == null) { throw new RuntimeException("Source " + source.getName() + " does not contain YAML content"); } parsedSlang.setName(source.getName()); parsedSlang.setFileExtension(source.getFileExtension()); return parsedSlang; } catch (Throwable e) { throw new RuntimeException("There was a problem parsing the YAML source: " + source.getName() + ".\n" + parserExceptionHandler.getErrorMessage(e), e); } } public void setParserExceptionHandler(ParserExceptionHandler parserExceptionHandler) { this.parserExceptionHandler = parserExceptionHandler; } public void setExecutableValidator(ExecutableValidator executableValidator) { this.executableValidator = executableValidator; } }