package alien4cloud.tosca.parser.postprocess; import java.util.Iterator; import java.util.Set; import org.springframework.stereotype.Component; import org.yaml.snakeyaml.nodes.Node; import com.google.common.collect.Sets; import org.alien4cloud.tosca.model.templates.NodeGroup; import org.alien4cloud.tosca.model.templates.NodeTemplate; import alien4cloud.tosca.model.ArchiveRoot; import alien4cloud.tosca.parser.ParsingContextExecution; import alien4cloud.tosca.parser.ParsingError; import alien4cloud.tosca.parser.ParsingErrorLevel; import alien4cloud.tosca.parser.impl.ErrorCode; /** * Group post processor ensure that referenced nodes indeed exists as well as inject the groups into the node as we keep reversed mapping in alien. */ @Component public class GroupPostProcessor implements IPostProcessor<NodeGroup> { @Override public void process(NodeGroup instance) { final ArchiveRoot archiveRoot = (ArchiveRoot) ParsingContextExecution.getRoot().getWrappedInstance(); // ensure that member groups exists and add the group to the nodes. Iterator<String> groupMembers = instance.getMembers().iterator(); while (groupMembers.hasNext()) { String nodeTemplateId = groupMembers.next(); NodeTemplate nodeTemplate = archiveRoot.getTopology().getNodeTemplates().get(nodeTemplateId); if (nodeTemplate == null) { Node node = ParsingContextExecution.getObjectToNodeMap().get(instance); // add an error to the context ParsingContextExecution.getParsingErrors().add(new ParsingError(ParsingErrorLevel.WARNING, ErrorCode.UNKOWN_GROUP_MEMBER, null, node.getStartMark(), null, node.getEndMark(), nodeTemplateId)); // and remove the member groupMembers.remove(); } else { Set<String> groups = nodeTemplate.getGroups(); if (groups == null) { groups = Sets.newHashSet(); nodeTemplate.setGroups(groups); } groups.add(instance.getName()); } } } }