@Override public void process(NodeTemplate instance) { final NodeType nodeType = ToscaContext.get(NodeType.class, instance.getType()); if (nodeType == null) { return; // error managed by the reference post processor. } Map<String, RelationshipTemplate> updated = Maps.newLinkedHashMap(); safe(instance.getRelationships()).entrySet().forEach(entry -> { relationshipPostProcessor.process(nodeType, entry); String relationshipTemplateName = entry.getValue().getName(); if (StringUtils.isEmpty(relationshipTemplateName)) { // from 2.0.0 the relationship's name is filled by the parser relationshipTemplateName = buildRelationShipTemplateName(entry.getValue()); } relationshipTemplateName = getUniqueKey(updated, relationshipTemplateName); updated.put(relationshipTemplateName, entry.getValue()); entry.getValue().setName(relationshipTemplateName); }); instance.setRelationships(updated); }
/** * Discard all relationship targeting an "external" node. External here in terms of the hostedOn hierarchy * Copy the valid ones * * @param nodeName * @param validTargets A map of oldNodeName -> duplicatedNodeName, we should keep relationships targeting one of these nodes. */ private void copyAndCleanRelationships(String nodeName, Map<String, String> validTargets, Map<String, NodeTemplate> nodeTemplates, TopologyContext topologyContext) { NodeTemplate nodeTemplate = nodeTemplates.get(nodeName); if (MapUtils.isNotEmpty(nodeTemplate.getRelationships())) { Map<String, RelationshipTemplate> relationships = nodeTemplate.getRelationships(); Set<String> keys = Sets.newHashSet(relationships.keySet()); for (String key : keys) { RelationshipTemplate rel = relationships.remove(key); // check if the target is from the valids one // If so, then rename it, its target and keep it if (validTargets.containsKey(rel.getTarget())) { rel.setName(copyName(rel.getName(), relationships.keySet())); rel.setTarget(validTargets.get(rel.getTarget())); relationships.put(rel.getName(), rel); workflowBuilderService.addRelationship(topologyContext, nodeName, rel.getName()); } } if (relationships.isEmpty()) { nodeTemplate.setRelationships(null); } } }
@Override protected void processSpecificReplacement(NodeTemplate replacingNode, NodeTemplate replacedTopologyNode, Set<String> topologyNotMergedProps) { replacingNode.setRelationships(replacedTopologyNode.getRelationships());
if (nodeTemplate.getRelationships() == null) { Map<String, RelationshipTemplate> relationships = Maps.newHashMap(); nodeTemplate.setRelationships(relationships);
/** * Build a node template. Note that a Tosca Context is required. * * @param nodeType the type of the node * @param templateToMerge the template that can be used to merge into the new node template * @param adaptToType This flag allow to know if we should adapt the templateToMerge node to the type. * @return new constructed node template. */ public static NodeTemplate buildNodeTemplate(NodeType nodeType, NodeTemplate templateToMerge, boolean adaptToType) { // clone the type of the node to avoid impacts, this should be improved in the future nodeType = CloneUtil.clone(nodeType); NodeTemplate nodeTemplate = new NodeTemplate(); fillAbstractInstantiableTemplate(nodeTemplate, nodeType, templateToMerge, !adaptToType); nodeTemplate.setCapabilities(Maps.newLinkedHashMap()); nodeTemplate.setRequirements(Maps.newLinkedHashMap()); fillCapabilitiesMap(nodeTemplate.getCapabilities(), nodeType.getCapabilities(), templateToMerge != null ? templateToMerge.getCapabilities() : null, adaptToType); fillRequirementsMap(nodeTemplate.getRequirements(), nodeType.getRequirements(), templateToMerge != null ? templateToMerge.getRequirements() : null, adaptToType); if (templateToMerge != null && templateToMerge.getRelationships() != null) { nodeTemplate.setRelationships(templateToMerge.getRelationships()); } if (templateToMerge != null && templateToMerge.getTags() != null) { nodeTemplate.setTags(templateToMerge.getTags()); } return nodeTemplate; }
nodeTemplate.setRelationships(Maps.newHashMap());
newNodeTemplate.setTags(oldNodeTemplate.getTags()); newNodeTemplate.setName(oldNodeTemplate.getName()); newNodeTemplate.setRelationships(oldNodeTemplate.getRelationships());
if (relationships == null) { relationships = Maps.newHashMap(); sourceNode.setRelationships(relationships);