private void duplicateNodeTemplate(NodeTemplate nodeTemplateToDuplicate, Map<String, String> duplicatedNodesNameMappings,
Map<String, NodeTemplate> nodeTemplates, Topology topology, Csar csar) {
NodeTemplate newNodeTemplate = CloneUtil.clone(nodeTemplateToDuplicate);
newNodeTemplate.setName(copyName(nodeTemplateToDuplicate.getName(), nodeTemplates.keySet()));
NodeType type = ToscaContext.getOrFail(NodeType.class, nodeTemplateToDuplicate.getType());
topologyService.loadType(topology, type);
log.debug("Duplicating node template [ {} ] into [ {} ] on the topology [ {} ] .", nodeTemplateToDuplicate.getName(), newNodeTemplate.getName(),
topology.getId());
nodeTemplates.put(newNodeTemplate.getName(), newNodeTemplate);
duplicatedNodesNameMappings.put(nodeTemplateToDuplicate.getName(), newNodeTemplate.getName());
copyOutputs(topology, nodeTemplateToDuplicate.getName(), newNodeTemplate.getName());
TopologyContext topologyContext = workflowBuilderService.buildTopologyContext(topology, csar);
workflowBuilderService.addNode(topologyContext, newNodeTemplate.getName());
safe(TopologyNavigationUtil.getHostedNodes(topology, nodeTemplateToDuplicate.getName()))
.forEach(nodeTemplate -> duplicateNodeTemplate(nodeTemplate, duplicatedNodesNameMappings, nodeTemplates, topology, csar));
}