Add winery source code
[vfc/nfvo/wfengine.git] / winery / org.eclipse.winery.topologymodeler / src / main / java / org / eclipse / winery / topologymodeler / addons / topologycompleter / topologycompletion / completer / RequirementCompleter.java
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
8  *
9  * Contributors:
10  *    Pascal Hirmer - initial API and implementation
11  *******************************************************************************/
12
13 package org.eclipse.winery.topologymodeler.addons.topologycompleter.topologycompletion.completer;
14
15 import java.util.ArrayList;
16 import java.util.List;
17 import java.util.Map;
18 import java.util.Set;
19
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;
31
32 public class RequirementCompleter {
33
34         /**
35          * The TOSCA {@link TTopologyTemplate} document.
36          */
37         TTopologyTemplate topology;
38
39         /**
40          * The constructor the class.
41          *
42          * @param topology
43          *                        the topology to be completed
44          */
45         public RequirementCompleter(TTopologyTemplate topology) {
46                 this.topology = topology;
47         }
48
49         /**
50          * This method completes a topology containing {@link TRequirement}s in one step (without user interaction).
51          *
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
56          *
57          * @return the complete topology
58          */
59         public List<TTopologyTemplate> completeRequirementTopology(Map<TRequirement, TNodeTemplate> unfulfilledRequirements, TOSCAAnalyzer toscaAnalyzer) {
60
61                 List<TTopologyTemplate> solutions = new ArrayList<TTopologyTemplate>();
62
63                 Set<TRequirement> requirements = unfulfilledRequirements.keySet();
64
65                 TNodeTemplate instantiatedNodeTemplate = null;
66
67                 // fulfill the Requirements
68                 for (TRequirement requirement : requirements) {
69
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);
75                                 }
76                         }
77
78                         List<TNodeType> possibleNodeTypes = Utils.matchRequirementAndCapability(requirement, toscaAnalyzer);
79
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) {
83
84                                 topologyCopy = new TTopologyTemplate();
85                                 topologyCopy.getNodeTemplateOrRelationshipTemplate().addAll(topology.getNodeTemplateOrRelationshipTemplate());
86
87                                 // instantiate the template
88                                 instantiatedNodeTemplate = ModelUtilities.instantiateNodeTemplate(possibleType);
89                                 topologyCopy.getNodeTemplateOrRelationshipTemplate().add(instantiatedNodeTemplate);
90
91                                 TNodeTemplate correspondingNodeTemplate = unfulfilledRequirements.get(requirement);
92
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);
98                                 }
99
100                                 solutions.add(topologyCopy);
101                         }
102                         if (solutions.size() > 1) {
103                                 break;
104                         }
105                 }
106                 return solutions;
107         }
108 }