package alien4cloud.tosca.parser.impl.advanced; import java.util.List; import javax.annotation.Resource; import org.springframework.stereotype.Component; import org.yaml.snakeyaml.nodes.MappingNode; import org.yaml.snakeyaml.nodes.Node; import org.yaml.snakeyaml.nodes.NodeTuple; import com.google.common.collect.Lists; import alien4cloud.model.common.Tag; import org.alien4cloud.tosca.model.Csar; import alien4cloud.tosca.model.ArchiveRoot; import alien4cloud.tosca.parser.INodeParser; import alien4cloud.tosca.parser.ParserUtils; import alien4cloud.tosca.parser.ParsingContextExecution; import alien4cloud.tosca.parser.impl.base.ScalarParser; import alien4cloud.utils.VersionUtil; /** * Specific parser to enrich the Csar archive object with meta-data */ @Component public class MetaDataParser implements INodeParser<Csar> { private static final String TEMPLATE_NAME = "template_name"; private static final String TEMPLATE_AUTHOR = "template_author"; private static final String TEMPLATE_VERSION = "template_version"; @Resource private ScalarParser scalarParser; @Override public Csar parse(Node node, ParsingContextExecution context) { ArchiveRoot parent = (ArchiveRoot) context.getParent(); Csar csar = parent.getArchive(); List<Tag> tagList = Lists.newArrayList(); if (node instanceof MappingNode) { MappingNode mapNode = (MappingNode) node; for (NodeTuple entry : mapNode.getValue()) { String key = scalarParser.parse(entry.getKeyNode(), context); String value = scalarParser.parse(entry.getValueNode(), context); if (TEMPLATE_NAME.equals(key)) { csar.setName(value); } else if (TEMPLATE_AUTHOR.equals(key)) { csar.setTemplateAuthor(value); } else if (TEMPLATE_VERSION.equals(key)) { csar.setVersion(value); if (!VersionUtil.isValid(value)) { ParserUtils.addTypeError(entry.getValueNode(), context.getParsingErrors(), "version"); } } else if (value != null) { tagList.add(new Tag(key, value)); } } csar.setTags(tagList); } else { ParserUtils.addTypeError(node, context.getParsingErrors(), "meta-data"); } return csar; } }