Merge "Fix build errors in autorelease full clean build"
[vfc/nfvo/wfengine.git] / winery / org.eclipse.winery.topologymodeler / src / main / webapp / WEB-INF / tags / common / topologycompletion / topologyTemplateSelector.tag
1 <%
2 /*******************************************************************************
3  * Copyright (c) 2013 Pascal Hirmer.
4  * All rights reserved. This program and the accompanying materials
5  * are made available under the terms of the Eclipse Public License v1.0
6  * and the Apache License 2.0 which both accompany this distribution,
7  * and are available at http://www.eclipse.org/legal/epl-v10.html
8  * and http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Contributors:
11  *    Pascal Hirmer - initial API and implementation
12  *******************************************************************************/
13 %>
14
15 <%@tag language="java" pageEncoding="UTF-8" description="This tag is used to render Topology Templates for selection in a dialog."%>
16
17 <%-- attributes for the topology selection --%>
18 <%@attribute name="templateURL" type="java.lang.String"%>
19 <%@attribute name="topologyName" type="java.lang.String"%>
20 <%@attribute name="topologyNamespace" type="java.lang.String"%>
21 <%@attribute name="repositoryURL" type="java.lang.String" %>
22 <%@attribute name="solutionTopologies" type="java.util.List<org.eclipse.winery.model.tosca.TTopologyTemplate>"%>
23
24 <%@tag import="java.io.StringWriter"%>
25 <%@tag import="java.util.HashMap"%>
26 <%@tag import="java.util.Map"%>
27 <%@tag import="java.util.List"%>
28 <%@tag import="java.util.UUID"%>
29 <%@tag import="javax.xml.bind.Marshaller"%>
30 <%@tag import="javax.xml.bind.JAXBContext"%>
31 <%@tag import="javax.xml.bind.JAXBException"%>
32 <%@tag import="javax.xml.namespace.QName"%>
33 <%@tag import="org.eclipse.winery.model.tosca.Definitions"%>
34 <%@tag import="org.eclipse.winery.model.tosca.TEntityTemplate"%>
35 <%@tag import="org.eclipse.winery.model.tosca.TNodeTemplate"%>
36 <%@tag import="org.eclipse.winery.model.tosca.TRelationshipTemplate"%>
37 <%@tag import="org.eclipse.winery.model.tosca.TRelationshipType"%>
38 <%@tag import="org.eclipse.winery.model.tosca.TServiceTemplate"%>
39 <%@tag import="org.eclipse.winery.model.tosca.TTopologyTemplate"%>
40 <%@tag import="org.eclipse.winery.repository.client.WineryRepositoryClientFactory"%>
41 <%@tag import="org.eclipse.winery.repository.client.IWineryRepositoryClient"%>
42 <%@tag import="org.eclipse.winery.common.Util"%>
43
44 <%@taglib prefix="ntrq" tagdir="/WEB-INF/tags/common/templates/nodetemplates/reqscaps" %>
45 <%@taglib prefix="nt"   tagdir="/WEB-INF/tags/common/templates/nodetemplates"%>
46
47 <div id="topologyTemplateSelector">
48 <p> There are several possible topology solutions <br> Please select your desired topology: </p>
49         <script>
50                 // array to collect the created IDs
51                 IDs = new Array();
52
53                 // save all created connections in an array to be able to detach them after the selection
54                 Connections = new Array();
55         </script>
56 <%
57         // the pixel distance between the displayed NodeTemplates
58         final int NODE_TEMPLATE_DISTANCE = 150;
59
60         List<TTopologyTemplate> topologyTemplateSelector = solutionTopologies;
61         int i = 0;
62         int counter = 0;
63         Map<String, String> idMap;
64         for (TTopologyTemplate choice: topologyTemplateSelector) {
65                 Definitions definitions = new Definitions();
66                 TServiceTemplate st = new TServiceTemplate();
67                 st.setTopologyTemplate(choice);
68                 definitions.getServiceTemplateOrNodeTypeOrNodeTypeImplementation().add(st);
69                 JAXBContext context = JAXBContext.newInstance(Definitions.class);
70                 Marshaller m = context.createMarshaller();
71                 StringWriter stringWriter = new StringWriter();
72
73                 m.marshal(definitions, stringWriter);
74                 int topCounter = 0;
75                 IWineryRepositoryClient client = WineryRepositoryClientFactory.getWineryRepositoryClient();
76                 client.addRepository(repositoryURL);
77                 String id = "solution" + Integer.toString(i);
78
79                 String sourceId = null;
80                 idMap = new HashMap<String, String>();
81
82                 %>
83                 <div id="proposalEditorArea">
84                 <div id="proposaldrawingarea">
85                 <div id="<%=counter%>">
86                 <script> IDs.push("<%=id%>"); </script>
87                 <%
88                         for (TEntityTemplate entity: choice.getNodeTemplateOrRelationshipTemplate()) {
89
90                                 if (entity instanceof TNodeTemplate) {
91                                         TNodeTemplate nodeTemplate = (TNodeTemplate) entity;
92
93                                         %>
94                                                 <nt:nodeTemplateRenderer client="<%=client%>" relationshipTypes="<%=client.getAllTypes(TRelationshipType.class)%>" repositoryURL='<%=repositoryURL%>' nodeTemplate="<%=nodeTemplate%>" top="<%=Integer.toString(topCounter)%>" left='<%="0"%>'/>
95
96                                                 <%
97                                                         String randomId = UUID.randomUUID().toString();
98                                                 %>
99                                                 <script>
100                                                         document.getElementById("<%=nodeTemplate.getId()%>").id = "<%=randomId%>";
101                                                 </script>
102                                                 <%
103                                                         topCounter = topCounter + NODE_TEMPLATE_DISTANCE;
104                                                         idMap.put(nodeTemplate.getId(), randomId);
105                                                 %>
106
107                                         <%
108                                 }
109                         }
110                         for (TEntityTemplate entity: choice.getNodeTemplateOrRelationshipTemplate()) {
111                                 if (entity instanceof TRelationshipTemplate) {
112                                         TRelationshipTemplate connector = (TRelationshipTemplate) entity;
113                                         sourceId = ((TNodeTemplate) connector.getSourceElement().getRef()).getId();
114                                         String visualSourceId = idMap.get(sourceId);
115                                         String targetId = ((TNodeTemplate) connector.getTargetElement().getRef()).getId();
116                                         String visualTargetId = idMap.get(targetId);
117                                         QName type = connector.getType();
118                                         %>
119                                         <script type='text/javascript'>
120                                                 var c;
121                                                 require(["winery-common-topologyrendering"], function(wct) {
122                                                         wct.initNodeTemplate(jsPlumb.getSelector(".NodeTemplateShape:not('.hidden')"), true);
123                                                         require(["jsplumb"], function(_jsPlumb) {
124                                                                 _jsPlumb.ready(function() {
125                                                                         c = _jsPlumb.connect({
126                                                                                 source:"<%=visualSourceId%>",
127                                                                                 target:"<%=visualTargetId%>",
128                                                                                 endpoint:"Blank",
129                                                                                 type: "<%=type%>"
130                                                                         });
131                                                                         Connections.push(c);
132                                                                 })
133                                                         });
134                                                         wct.handleConnectionCreated(c);
135                                                 });
136                                         </script>  <%
137                                 }
138                         }
139         %>
140         </div>
141         </div>
142         </div>
143         <br>
144         <input name="<%=id%>" id="<%=id%>" type="checkbox" value='<%=stringWriter.toString()%>' onclick="onClick<%=id%>()"> Save this Topology &nbsp; &nbsp;
145         <script>
146                 /**
147                  * Handles a click on the "Save this Topology" checkbox.
148                  */
149                 function onClick<%=id%>() {
150                         if (document.getElementById('<%=id%>').checked) {
151                                 document.getElementById('<%=id + "overwrite"%>').disabled = false;
152                                 document.getElementById('<%=id + "name"%>').disabled = false;
153                                 document.getElementById('<%=id + "namespace"%>').disabled = false;
154                                 document.getElementById('<%=id + "newWindow"%>').disabled = false;
155                         }
156                         else {
157                                 document.getElementById('<%=id + "overwrite"%>').disabled = true;
158                                 document.getElementById('<%=id + "name"%>').disabled = true;
159                                 document.getElementById('<%=id + "namespace"%>').disabled = true;
160                                 document.getElementById('<%=id + "newWindow"%>').disabled = true;
161                         }
162                 }
163         </script>
164         <input disabled="disabled" name='<%=id + "overwrite"%>' id='<%=id + "overwrite"%>' type="checkbox" onclick='onClick<%=id + "overwrite"%>()'> Overwrite current Topology &nbsp; &nbsp;
165         <script>
166                 /**
167                  * Handles a click on the "Overwrite current Topology" checkbox.
168                  */
169                 function onClick<%=id + "overwrite"%>() {
170                         if (document.getElementById('<%=id + "overwrite"%>').checked) {
171                                 document.getElementById('<%=id + "name"%>').disabled = true;
172                                 document.getElementById('<%=id + "namespace"%>').disabled = true;
173                                 document.getElementById('<%=id + "newWindow"%>').disabled = true;
174                         } else {
175                                 document.getElementById('<%=id + "name"%>').disabled = false;
176                                 document.getElementById('<%=id + "namespace"%>').disabled = false;
177                                 document.getElementById('<%=id + "newWindow"%>').disabled = false;
178                         }
179                 }
180         </script>
181         <input disabled="disabled" name='<%=id + "newWindow"%>' id='<%=id + "newWindow"%>' type="checkbox"> Open in new Window <br> <br>
182         <p>Name: <input disabled="disabled" id='<%=id + "name"%>' name='<%=id + "name"%>' value="<%=topologyName%>" type="text" size="30" maxlength="30"> </p>
183         <p>Namespace: <input disabled="disabled" id='<%=id + "namespace"%>' value="<%=topologyNamespace%>" name='<%=id + "namespace"%>' type="text" size="50" maxlength="60"> </p>
184         <%
185         counter++;
186         i++;
187         }
188 %>
189         <button type="button" id="save" class="btn btn-primary btn-default">Save Topologies</button>
190         <script>
191                 $('#save').on('click', function() {
192
193                         for (var i = 0; i < IDs.length; i++) {
194                                 if (document.getElementById(IDs[i]).checked) {
195
196                                         var name = document.getElementById(IDs[i] + 'name').value;
197                                         var namespace = document.getElementById(IDs[i] + 'namespace').value;
198                                         var overwrite = document.getElementById(IDs[i] + 'overwrite').checked;
199                                         var openInNewWindow = document.getElementById(IDs[i] + 'newWindow').checked;
200
201                                         // check validity of the namespace
202                                         var validURIregexp = new RegExp("([A-Za-z][A-Za-z0-9+\\-.]*):(?:(//)(?:((?:[A-Za-z0-9\\-._~!$&'()*+,;=:]|%[0-9A-Fa-f]{2})*)@)?((?:\\[(?:(?:(?:(?:[0-9A-Fa-f]{1,4}:){6}|::(?:[0-9A-Fa-f]{1,4}:){5}|(?:[0-9A-Fa-f]{1,4})?::(?:[0-9A-Fa-f]{1,4}:){4}|(?:(?:[0-9A-Fa-f]{1,4}:){0,1}[0-9A-Fa-f]{1,4})?::(?:[0-9A-Fa-f]{1,4}:){3}|(?:(?:[0-9A-Fa-f]{1,4}:){0,2}[0-9A-Fa-f]{1,4})?::(?:[0-9A-Fa-f]{1,4}:){2}|(?:(?:[0-9A-Fa-f]{1,4}:){0,3}[0-9A-Fa-f]{1,4})?::[0-9A-Fa-f]{1,4}:|(?:(?:[0-9A-Fa-f]{1,4}:){0,4}[0-9A-Fa-f]{1,4})?::)(?:[0-9A-Fa-f]{1,4}:[0-9A-Fa-f]{1,4}|(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?))|(?:(?:[0-9A-Fa-f]{1,4}:){0,5}[0-9A-Fa-f]{1,4})?::[0-9A-Fa-f]{1,4}|(?:(?:[0-9A-Fa-f]{1,4}:){0,6}[0-9A-Fa-f]{1,4})?::)|[Vv][0-9A-Fa-f]+\\.[A-Za-z0-9\\-._~!$&'()*+,;=:]+)\\]|(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)|(?:[A-Za-z0-9\\-._~!$&'()*+,;=]|%[0-9A-Fa-f]{2})*))(?::([0-9]*))?((?:/(?:[A-Za-z0-9\\-._~!$&'()*+,;=:@]|%[0-9A-Fa-f]{2})*)*)|/((?:(?:[A-Za-z0-9\\-._~!$&'()*+,;=:@]|%[0-9A-Fa-f]{2})+(?:/(?:[A-Za-z0-9\\-._~!$&'()*+,;=:@]|%[0-9A-Fa-f]{2})*)*)?)|((?:[A-Za-z0-9\\-._~!$&'()*+,;=:@]|%[0-9A-Fa-f]{2})+(?:/(?:[A-Za-z0-9\\-._~!$&'()*+,;=:@]|%[0-9A-Fa-f]{2})*)*)|)(?:\\?((?:[A-Za-z0-9\\-._~!$&'()*+,;=:@/?]|%[0-9A-Fa-f]{2})*))?(?:\#((?:[A-Za-z0-9\\-._~!$&'()*+,;=:@/?]|%[0-9A-Fa-f]{2})*))?");
203                                         if (validURIregexp.test(namespace) || overwrite) {
204
205                                                 if (!overwrite) {
206                                                         // first create a new service template via AJAX call
207                                                         var dataToSend = "name=" + name + "&namespace=" + namespace;
208                                                         var url = "<%=repositoryURL%>" + "/servicetemplates/";
209                                                         $.ajax(
210                                                                 {
211                                                                         type: "POST",
212                                                                         async: false,
213                                                                         url: url,
214                                                                         "data": dataToSend,
215                                                                         dataType: "text",
216                                                                         error: function(jqXHR, textStatus, errorThrown) {
217                                                                                 vShowAJAXError("Could not add Service Template.");
218                                                                         }
219                                                         });
220                                                 }
221
222                                                 // now save the topology template
223                                                 $.post("jsp/topologyCompletion/topologySaver.jsp", {topology: document.getElementById(IDs[i]).value, templateURL: "<%=templateURL%>", repositoryURL: "<%=repositoryURL%>", topologyName: name, topologyNamespace: namespace, overwriteTopology: overwrite},
224                                                         function(data){
225                                                                 if (openInNewWindow) {
226                                                                         // a new topology has been created, open it in a new window
227                                                                         var win=window.open('?repositoryURL=' + "<%=repositoryURL%>" + '&ns='+ namespace + '&id=' + name, '_blank');
228                                                                         win.focus();
229                                                                 } else if (overwrite) {
230                                                                         // refresh page
231                                                                         document.location.reload(true);
232                                                                 }
233                                                                 // close the dialog
234                                                                 chooseTopologyDiag.modal("hide");
235                                                                 vShowSuccess("Successfully Saved Topologies.")
236                                                         }
237                                                 );
238                                         } else {
239                                                 vShowError("Please enter a valid namespace.");
240                                         }
241                                 }
242                         }
243                 });
244         </script>
245 </div>
246