1 /*******************************************************************************
2 * Copyright (c) 2013 Pascal Hirmer.
3 * All rights reserved. This program and the accompanying materials
4 * are made available under the terms of the Eclipse Public License v1.0
5 * and the Apache License 2.0 which both accompany this distribution,
6 * and are available at http://www.eclipse.org/legal/epl-v10.html
7 * and http://www.apache.org/licenses/LICENSE-2.0
10 * Pascal Hirmer - initial API and implementation
11 *******************************************************************************/
13 package org.eclipse.winery.topologymodeler.addons.topologycompleter.topologycompletion.completer;
15 import java.util.ArrayList;
16 import java.util.List;
20 import org.eclipse.winery.common.ModelUtilities;
21 import org.eclipse.winery.model.tosca.TEntityTemplate;
22 import org.eclipse.winery.model.tosca.TNodeTemplate;
23 import org.eclipse.winery.model.tosca.TNodeType;
24 import org.eclipse.winery.model.tosca.TRelationshipTemplate;
25 import org.eclipse.winery.model.tosca.TRelationshipType;
26 import org.eclipse.winery.model.tosca.TRequirement;
27 import org.eclipse.winery.model.tosca.TTopologyTemplate;
28 import org.eclipse.winery.topologymodeler.addons.topologycompleter.analyzer.TOSCAAnalyzer;
29 import org.eclipse.winery.topologymodeler.addons.topologycompleter.helper.NodeTemplateConnector;
30 import org.eclipse.winery.topologymodeler.addons.topologycompleter.helper.Utils;
32 public class RequirementCompleter {
35 * The TOSCA {@link TTopologyTemplate} document.
37 TTopologyTemplate topology;
40 * The constructor the class.
43 * the topology to be completed
45 public RequirementCompleter(TTopologyTemplate topology) {
46 this.topology = topology;
50 * This method completes a topology containing {@link TRequirement}s in one step (without user interaction).
52 * @param unfulfilledRequirements
53 * all the unfulfilled requirements that has been found in the topology
54 * @param toscaAnalyzer
55 * the {@link TOSCAAnalyzer} object to access the data model
57 * @return the complete topology
59 public List<TTopologyTemplate> completeRequirementTopology(Map<TRequirement, TNodeTemplate> unfulfilledRequirements, TOSCAAnalyzer toscaAnalyzer) {
61 List<TTopologyTemplate> solutions = new ArrayList<TTopologyTemplate>();
63 Set<TRequirement> requirements = unfulfilledRequirements.keySet();
65 TNodeTemplate instantiatedNodeTemplate = null;
67 // fulfill the Requirements
68 for (TRequirement requirement : requirements) {
70 // remove the requirement from the NodeTemplate
71 TNodeTemplate requirementTemplate = unfulfilledRequirements.get(requirement);
72 for (TEntityTemplate element : topology.getNodeTemplateOrRelationshipTemplate()) {
73 if (requirementTemplate.getId().equals(element.getId())) {
74 ((TNodeTemplate) element).getRequirements().getRequirement().remove(requirement);
78 List<TNodeType> possibleNodeTypes = Utils.matchRequirementAndCapability(requirement, toscaAnalyzer);
80 // create a NodeTemplate for every matching Type, insert it into the topology and create a topology copy for each possible inserted NodeTemplate
81 TTopologyTemplate topologyCopy = null;
82 for (TNodeType possibleType : possibleNodeTypes) {
84 topologyCopy = new TTopologyTemplate();
85 topologyCopy.getNodeTemplateOrRelationshipTemplate().addAll(topology.getNodeTemplateOrRelationshipTemplate());
87 // instantiate the template
88 instantiatedNodeTemplate = ModelUtilities.instantiateNodeTemplate(possibleType);
89 topologyCopy.getNodeTemplateOrRelationshipTemplate().add(instantiatedNodeTemplate);
91 TNodeTemplate correspondingNodeTemplate = unfulfilledRequirements.get(requirement);
93 // find matching RelationshipTypes, instantiate RelationshipTemplates and connect the Node Templates
94 List<TRelationshipType> suitableRTs = NodeTemplateConnector.findRelationshipType(correspondingNodeTemplate, instantiatedNodeTemplate, toscaAnalyzer, requirement);
95 for (TRelationshipType rt : suitableRTs) {
96 TRelationshipTemplate relationship = ModelUtilities.instantiateRelationshipTemplate(rt, correspondingNodeTemplate, instantiatedNodeTemplate);
97 topologyCopy.getNodeTemplateOrRelationshipTemplate().add(relationship);
100 solutions.add(topologyCopy);
102 if (solutions.size() > 1) {