aboutsummaryrefslogtreecommitdiffstats
path: root/winery/org.eclipse.winery.topologymodeler/src/main/webapp/jsp/topologyCompletion/topologyCompletion.jsp
blob: 6e7f006d6c9da86b23f5a2c1c0069981137fddef (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
<%
/*******************************************************************************
 * Copyright (c) 2013 Pascal Hirmer.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * and the Apache License 2.0 which both accompany this distribution,
 * and are available at http://www.eclipse.org/legal/epl-v10.html
 * and http://www.apache.org/licenses/LICENSE-2.0
 *
 * Contributors:
 *    Pascal Hirmer - initial API and implementation
 *******************************************************************************/

/**
 * This JSP calls the topology completion and handles the response.
 * It is called the event handler when "Complete Topology" is selected in the EnterCompletionInformationDiag.
 * There are several possible responses from the completion:
 *	 - the topology is complete: display a success message
 *   - the topology is complete, several solutions exist: display dialog to choose topology solution
 *	 - topology completion interrupted: the user has to chose inserted Node or Relationship Templates
 */
%>

<%@page import="java.io.StringWriter"%>
<%@page import="java.util.List"%>
<%@page import="java.util.Map"%>
<%@page import="javax.xml.bind.Marshaller"%>
<%@page import="javax.xml.bind.JAXBContext"%>
<%@page import="javax.xml.bind.JAXBException"%>
<%@page import="org.eclipse.winery.model.tosca.Definitions"%>
<%@page import="org.eclipse.winery.model.tosca.TEntityTemplate"%>
<%@page import="org.eclipse.winery.model.tosca.TNodeTemplate"%>
<%@page import="org.eclipse.winery.model.tosca.TServiceTemplate"%>
<%@page import="org.eclipse.winery.model.tosca.TTopologyTemplate"%>
<%@page import="org.eclipse.winery.topologymodeler.addons.topologycompleter.topologycompletion.CompletionInterface"%>

<%@taglib prefix="tc"   tagdir="/WEB-INF/tags/common/topologycompletion"%>

<%
	// parse Strings from the request to Boolean values
	boolean stepByStep = Boolean.parseBoolean(request.getParameter("stepByStep"));
	boolean restarted = Boolean.parseBoolean(request.getParameter("restarted"));
	boolean overwriteTopology = Boolean.parseBoolean(request.getParameter("overwriteTopology"));

	// call the topology completion component which will return a message if it was successful.
	CompletionInterface completionInterface = new CompletionInterface();
	String message = completionInterface.complete(request.getParameter("topology"), request.getParameter("stName"), request.getParameter("templateURL"), overwriteTopology, request.getParameter("topologyName"), request.getParameter("topologyNamespace"), request.getParameter("repositoryURL"), stepByStep, restarted);

	if (message.equals("success")) { %>
		<script> vShowSuccess('Completion Successful!'); </script>
	<%
	} else if (message.equals("topologyComplete") && !restarted) { %>
		<script>
			vShowSuccess('The topology is already complete.');
		</script>
	<%
	} else if (message.equals("failure")) {
		%>
		<p> <%=completionInterface.getErrorMessage()%> </p>
	<%} else if (message.equals("userInteraction")) {

			// a user interaction is necessary to choose RelationshipTemplates, receive
			// the current topology and the choices from the CompletionInterface
			// and display them via relationshipTemplateSelector.jsp

			TTopologyTemplate currentTopology = completionInterface.getCurrentTopology();
			List<TEntityTemplate> relationshipTemplateSelection = completionInterface.getRelationshipTemplateChoices();

			/////////////////////////////////////////////////////
			// Convert JAXB objects of the topology and the
			// Relationship Templates to be chosen to XML Strings
			/////////////////////////////////////////////////////

			Definitions definitions = new Definitions();
			TServiceTemplate serviceTemplate = new TServiceTemplate();

			serviceTemplate.setTopologyTemplate(currentTopology);
			definitions.getServiceTemplateOrNodeTypeOrNodeTypeImplementation().add(serviceTemplate);
			JAXBContext context = JAXBContext.newInstance(Definitions.class);
			Marshaller marshaller = context.createMarshaller();
			StringWriter currentTopologyString = new StringWriter();

			marshaller.marshal(definitions, currentTopologyString);

			TTopologyTemplate topologyTemplate = new TTopologyTemplate();

			// add all choices to a TopologyTemplate
			for (TEntityTemplate entityTemplate: relationshipTemplateSelection) {
				topologyTemplate.getNodeTemplateOrRelationshipTemplate().add(entityTemplate);
			}

			// get the choices as XML
			definitions = new Definitions();
			serviceTemplate = new TServiceTemplate();
			serviceTemplate.setTopologyTemplate(topologyTemplate);
			definitions.getServiceTemplateOrNodeTypeOrNodeTypeImplementation().add(serviceTemplate);
			context = JAXBContext.newInstance(Definitions.class);
			StringWriter choicesAsXMLString = new StringWriter();

			marshaller.marshal(definitions, choicesAsXMLString);
		%>
		<script>
			var topology = "<%=currentTopologyString.toString()%>";
			var choices = "<%=choicesAsXMLString.toString()%>";
		</script>
		<!-- call the relationshipTemplateSelector tag to render the selection to graphic objects -->
		<tc:relationshipTemplateSelector choices='<%=relationshipTemplateSelection%>' templateURL='<%=request.getParameter("templateURL")%>' topologyName='<%=request.getParameter("topologyName")%>'
			topologyNamespace='<%=request.getParameter("topologyNamespace")%>' repositoryURL='<%=request.getParameter("repositoryURL")%>' stName='<%=request.getParameter("stName")%>' />
	<%} else if (message.equals("userTopologySelection")) {
		// there are several topology solutions. Receive the choices from the CompletionInterface
		// and display them via topologyTemplateSelector.tag
		List<TTopologyTemplate> topologyTemplateSelection = completionInterface.getTopologyTemplateChoices();
	%>
	<!-- call the topologyTemplateSelector tag to render the selection to graphic objects -->
	<tc:topologyTemplateSelector solutionTopologies='<%=topologyTemplateSelection%>' templateURL='<%=request.getParameter("templateURL")%>' topologyName='<%=request.getParameter("topologyName")%>'
		topologyNamespace='<%=request.getParameter("topologyNamespace")%>' repositoryURL='<%=request.getParameter("repositoryURL")%>' />
	<%
	} else if (message.equals("stepByStep")) {

		// the topology completion is processed step-by-step. The user has to choose inserted Node and RelationshipTemplates
		TTopologyTemplate currentTopology = completionInterface.getCurrentTopology();
		Map<TNodeTemplate, Map<TNodeTemplate, List<TEntityTemplate>>> nodeTemplateSelection = completionInterface.getNodeTemplateChoices();

		///////////////////////////////////////////////
		// Convert JAXB objects of the topology and the
		// Templates to be chosen to XML Strings
		///////////////////////////////////////////////

		Definitions definitions = new Definitions();
		TServiceTemplate serviceTemplate = new TServiceTemplate();
		serviceTemplate.setTopologyTemplate(currentTopology);
		definitions.getServiceTemplateOrNodeTypeOrNodeTypeImplementation().add(serviceTemplate);
		JAXBContext context = JAXBContext.newInstance(Definitions.class);
		Marshaller marshaller = context.createMarshaller();
		StringWriter currentTopologyString = new StringWriter();

		marshaller.marshal(definitions, currentTopologyString);

		// add all choices to a TopologyTemplate
		TTopologyTemplate topologyTemplate = new TTopologyTemplate();

		for (TNodeTemplate nodeTemplate: nodeTemplateSelection.keySet()) {
			Map<TNodeTemplate, List<TEntityTemplate>> entityTemplates = nodeTemplateSelection.get(nodeTemplate);

			for (TNodeTemplate entity: entityTemplates.keySet()) {
				topologyTemplate.getNodeTemplateOrRelationshipTemplate().add(entity);
				topologyTemplate.getNodeTemplateOrRelationshipTemplate().addAll(entityTemplates.get(entity));
			}
			topologyTemplate.getNodeTemplateOrRelationshipTemplate().add(nodeTemplate);
		}

		// get the choices as XML
		definitions = new Definitions();
		serviceTemplate = new TServiceTemplate();
		serviceTemplate.setTopologyTemplate(topologyTemplate);
		definitions.getServiceTemplateOrNodeTypeOrNodeTypeImplementation().add(serviceTemplate);

		StringWriter choicesAsXMLString = new StringWriter();

		marshaller.marshal(definitions, choicesAsXMLString);

		%>
		<script>
			var topology = '<%=currentTopologyString.toString()%>';
			var choices = '<%=choicesAsXMLString.toString()%>';
		</script>
		<!-- call the tc:nodeTemplateSelector tag to render the selection to graphic objects -->
		<tc:nodeTemplateSelector choices='<%=nodeTemplateSelection%>' templateURL='<%=request.getParameter("templateURL")%>' topologyName='<%=request.getParameter("topologyName")%>'
			topologyNamespace='<%=request.getParameter("topologyNamespace")%>' repositoryURL='<%=request.getParameter("repositoryURL")%>' stName='<%=request.getParameter("stName")%>' />
	<%}
%>

<script>
	var message = "<%=message%>";
</script>