/******************************************************************************* * (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.parser.model.ParsedDescriptionData; import io.cloudslang.lang.compiler.parser.model.ParsedDescriptionSection; import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import org.apache.commons.lang3.StringUtils; /** * @author Bonczidai Levente * @since 3/20/2017 */ public class DescriptionBuilder { private List<ParsedDescriptionSection> topLevelDescriptions; private Map<String, ParsedDescriptionSection> stepDescriptions; private List<RuntimeException> errors; private Map<String, String> currentDescription; private String mostRecentlyUsedTag; private int currentDescriptionStartLine; public DescriptionBuilder() { init(); } public boolean descriptionOpened() { return currentDescription != null; } public void addError(RuntimeException rex) { errors.add(rex); } public void beginDescription(int startLineNumber) { currentDescription = new LinkedHashMap<>(); currentDescriptionStartLine = startLineNumber; } public void addToDescription(String tag, String content) { String tagContent = currentDescription.get(tag); tagContent = tagContent == null ? "" : tagContent; if (StringUtils.isNotBlank(content)) { if (org.apache.commons.lang.StringUtils.isNotEmpty(tagContent)) { tagContent += System.lineSeparator(); } tagContent += content; } currentDescription.put(tag, tagContent); mostRecentlyUsedTag = tag; } public void addToDescriptionToMostRecentlyUsedTag(String content) { if (mostRecentlyUsedTag != null) { addToDescription(mostRecentlyUsedTag, content); } } public void endExecutableDescription() { topLevelDescriptions.add(new ParsedDescriptionSection(currentDescription, currentDescriptionStartLine)); resetCurrentDescription(); } public void endStepDescription(String stepName) { stepDescriptions.put(stepName, new ParsedDescriptionSection(currentDescription, currentDescriptionStartLine)); resetCurrentDescription(); } public void resetCurrentDescription() { currentDescription = null; mostRecentlyUsedTag = null; currentDescriptionStartLine = -1; } public ParsedDescriptionData build() { return new ParsedDescriptionData(topLevelDescriptions, stepDescriptions, errors); } private void init() { topLevelDescriptions = new ArrayList<>(); stepDescriptions = new LinkedHashMap<>(); errors = new ArrayList<>(); resetCurrentDescription(); } }