Add winery source code
[vfc/nfvo/wfengine.git] / winery / org.eclipse.winery.topologymodeler / src / main / webapp / WEB-INF / tags / common / templates / nodetemplates / nodeTemplateRenderer.tag
1 <%--
2 /*******************************************************************************
3  * Copyright (c) 2012-2013 University of Stuttgart.
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  *    Uwe Breitenbücher - skeletton for node template shapes
12  *    Oliver Kopp - initial API and implementation and/or initial documentation
13  *******************************************************************************/
14 --%>
15 <%@tag language="java" pageEncoding="UTF-8" description="This tag is used for both real nodeTemplate node rendering and rendering of a 'template' used to create a nodeTemplateShape. The latter is called by palette.jsp. Therefore, this tag has to be more general."%>
16 <%-- Parameters --%>
17
18 <%-- template and palette --%>
19 <%@attribute name="client" required="true" description="IWineryRepository" type="org.eclipse.winery.common.interfaces.IWineryRepository"%>
20 <%@attribute name="repositoryURL" required="true" type="java.lang.String" description="The URL of winery's repository"%>
21 <%@attribute name="topologyModelerURI" required="false" type="java.lang.String" description="The URL of winery topology modeler's URI - required for images/. Has to end with '/'. Can be left blank."%>
22 <%@attribute name="relationshipTypes" description="the known relationship types" required="true" type="java.util.Collection"%>
23
24 <%-- only for topology modeler --%>
25 <%@attribute name="nodeTemplate" type="org.eclipse.winery.model.tosca.TNodeTemplate"%>
26 <%@attribute name="top"%>
27 <%@attribute name="left"%>
28
29 <%-- only for palette.jsp --%>
30 <%@attribute name="nodeType" type="org.eclipse.winery.model.tosca.TNodeType" %>
31 <%@attribute name="nodeTypeQName" type="javax.xml.namespace.QName"%>
32
33 <%@tag import="org.eclipse.winery.model.tosca.TArtifactTemplate"%>
34 <%@tag import="org.eclipse.winery.model.tosca.TArtifactType"%>
35 <%@tag import="org.eclipse.winery.model.tosca.TCapability"%>
36 <%@tag import="org.eclipse.winery.model.tosca.TDeploymentArtifact"%>
37 <%@tag import="org.eclipse.winery.model.tosca.TDeploymentArtifacts"%>
38 <%@tag import="org.eclipse.winery.model.tosca.TEntityType.PropertiesDefinition"%>
39 <%@tag import="org.eclipse.winery.model.tosca.TNodeTemplate"%>
40 <%@tag import="org.eclipse.winery.model.tosca.TNodeTemplate.Capabilities"%>
41 <%@tag import="org.eclipse.winery.model.tosca.TNodeTemplate.Requirements"%>
42 <%@tag import="org.eclipse.winery.model.tosca.TNodeTemplate.Policies"%>
43 <%@tag import="org.eclipse.winery.model.tosca.TNodeType"%>
44 <%@tag import="org.eclipse.winery.model.tosca.TPolicy"%>
45 <%@tag import="org.eclipse.winery.model.tosca.TRelationshipType"%>
46 <%@tag import="org.eclipse.winery.model.tosca.TRequirement"%>
47 <%@tag import="org.eclipse.winery.common.ModelUtilities"%>
48 <%@tag import="org.eclipse.winery.common.Util"%>
49 <%@tag import="org.eclipse.winery.common.ids.definitions.ArtifactTemplateId"%>
50 <%@tag import="org.eclipse.winery.common.ids.definitions.ArtifactTypeId"%>
51 <%@tag import="org.eclipse.winery.common.interfaces.IWineryRepository"%>
52 <%@tag import="org.w3c.dom.Element" %>
53 <%@tag import="org.apache.commons.configuration.Configuration"%>
54 <%@tag import="org.apache.commons.lang3.StringUtils"%>
55 <%@tag import="org.apache.commons.lang3.StringEscapeUtils"%>
56 <%@tag import="java.io.StringWriter" %>
57 <%@tag import="java.util.Collections"%>
58 <%@tag import="java.util.Collection"%>
59 <%@tag import="java.util.Iterator"%>
60 <%@tag import="java.util.List"%>
61 <%@tag import="java.util.Map"%>
62 <%@tag import="java.util.UUID"%>
63 <%@tag import="javax.xml.namespace.QName"%>
64 <%@tag import="javax.xml.transform.OutputKeys"%>
65 <%@tag import="javax.xml.transform.Transformer"%>
66 <%@tag import="javax.xml.transform.TransformerFactory"%>
67 <%@tag import="javax.xml.transform.dom.DOMSource"%>
68 <%@tag import="javax.xml.transform.stream.StreamResult"%>
69
70 <%@taglib prefix="nt"    tagdir="/WEB-INF/tags/common/templates/nodetemplates" %>
71 <%@taglib prefix="ntrq"  tagdir="/WEB-INF/tags/common/templates/nodetemplates/reqscaps" %>
72 <%@taglib prefix="pol"   tagdir="/WEB-INF/tags/common/policies" %>
73 <%@taglib prefix="props" tagdir="/WEB-INF/tags/common/templates" %>
74
75 <%
76         String visualElementId;
77
78         boolean paletteMode;
79         if (nodeTemplate == null) {
80                 // we are in palette mode
81                 // --> we render a template to be inserted in the drawing area by drag'n'drop
82                 paletteMode = true;
83                 assert(nodeType != null);
84                 assert(nodeTypeQName != null);
85
86                 // these values are only pseudo values, they get all overwritten in drop function of palette.jsp
87                 visualElementId = UUID.randomUUID().toString();
88                 left = "0";
89                 top = "0";
90         } else {
91                 // we render a real node template
92                 paletteMode = false;
93                 nodeTypeQName = nodeTemplate.getType();
94                 nodeType = client.getType(nodeTypeQName, TNodeType.class);
95                 if (nodeType == null) {
96 %>
97                         <script>vShowError("Could not get node type <%=nodeTypeQName%>");</script>
98 <%
99                         return;
100                 }
101
102                 visualElementId = nodeTemplate.getId();
103         }
104
105         String nodeTypeCSSName = Util.makeCSSName(nodeTypeQName);
106 %>
107
108         <div class="NodeTemplateShape unselectable <%=nodeTypeCSSName%> <%if (paletteMode){%> hidden<%}%>" id="<%=visualElementId%>" style="left: <%=left%>px; top: <%=top%>px">
109                 <div class="headerContainer">
110                         <img class="icon" onerror="var that=this; require(['winery-common-topologyrendering'], function(wct){wct.imageError(that);});" src="<%=repositoryURL%>/nodetypes/<%=Util.DoubleURLencode(nodeTypeQName)%>/visualappearance/50x50" />
111                         <%
112                                 String name;
113                                 if (paletteMode) {
114                                         name = ""; // will be changed on drop
115                                 } else {
116                                         name = nodeTemplate.getName();
117                                         if (StringUtils.isEmpty(name)) {
118                                                 name = visualElementId;
119                                         }
120                                 }
121                         %>
122                         <div class="minMaxInstances">
123                                 <span class="minInstances"><%
124                                         if (!paletteMode) {
125                                                 %><%=Util.renderMinInstances(nodeTemplate.getMinInstances())%><%
126                                         }
127                                 %></span>
128                                 <span class="maxInstances"><%
129                                         if (!paletteMode) {
130                                                 %><%=Util.renderMaxInstances(nodeTemplate.getMaxInstances())%><%
131                                         }
132                                 %></span>
133                         </div>
134                         <div class="id nodetemplate"><%=visualElementId%></div>
135                         <div class="name nodetemplate"><%=name%></div>
136                         <div class="type nodetemplate"><%=Util.qname2hrefWithName(repositoryURL, TNodeType.class, nodeTypeQName, nodeType.getName())%></div>
137                         <span class="typeQName hidden"><%=nodeTypeQName%></span>
138                         <span class="typeNamespace hidden"><%=nodeTypeQName.getNamespaceURI()%></span>
139                 </div>
140                 <div class="endpointContainer">
141                 <%
142                         for (TRelationshipType relationshipType: (Collection<TRelationshipType>) relationshipTypes) {
143                 %>
144                         <div class="connectorEndpoint <%=Util.makeCSSName(relationshipType.getTargetNamespace(), relationshipType.getName())%>">
145                                 <div class="connectorBox <%=Util.makeCSSName(relationshipType.getTargetNamespace(), relationshipType.getName())%>_box"></div>
146                                 <div class="connectorLabel"><%=relationshipType.getName()%></div>
147                         </div>
148                 <%
149                         }
150                 %>
151                 </div>
152
153                 <%-- Properties --%>
154                 <props:properties
155                         propertiesDefinition="<%=nodeType.getPropertiesDefinition()%>"
156                         wpd="<%=ModelUtilities.getWinerysPropertiesDefinition(nodeType)%>"
157                         template="<%=paletteMode ? null : nodeTemplate %>"
158                         pathToImages="${topologyModelerURI}images/" />
159
160         <%-- Deployment Artifacts --%>
161
162         <%
163         List<TDeploymentArtifact> deploymentArtifacts;
164         if (paletteMode) {
165                 deploymentArtifacts = Collections.emptyList();
166         } else {
167                 TDeploymentArtifacts tDeploymentArtifacts = nodeTemplate.getDeploymentArtifacts();
168                 if (tDeploymentArtifacts == null) {
169                         deploymentArtifacts = Collections.emptyList();
170                 } else {
171                         deploymentArtifacts = tDeploymentArtifacts.getDeploymentArtifact();
172                 }
173         }
174         // Render even if (deploymentArtifacts.isEmpty()), because user could add some with drag'n'drop
175
176         // following is required to render artifact specific content
177         TransformerFactory transFactory = TransformerFactory.newInstance();
178         Transformer transformer = transFactory.newTransformer();
179         transformer.setOutputProperty(OutputKeys.INDENT, "yes");
180         transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
181         %>
182
183         <div class="deploymentArtifactsContainer">
184
185                 <div class="header">Deployment Artifacts</div>
186                 <div class="content">
187                         <%
188                         if (!paletteMode) {
189                                 for (TDeploymentArtifact deploymentArtifact : deploymentArtifacts) {
190                                         %>
191                                         <div class="deploymentArtifact row" onclick="showDeploymentArtifactInformation('<%=visualElementId%>', '<%=deploymentArtifact.getName()%>');">
192                                                 <textarea class="hidden"><%=org.eclipse.winery.common.Util.getXMLAsString(org.eclipse.winery.model.tosca.TDeploymentArtifact.class, deploymentArtifact)%></textarea>
193                                                 <div class="col-xs-4 overflowhidden deploymentArtifact name"><%=deploymentArtifact.getName()%></div>
194                                                 <div class="col-xs-4 overflowhidden artifactTemplate"><%
195                                                         QName artifactRef;
196                                                         if ((artifactRef = deploymentArtifact.getArtifactRef()) != null) {
197                                                                 ArtifactTemplateId atId = new ArtifactTemplateId(artifactRef);
198                                                                 %><%=client.getName(atId)%><%
199                                                         }
200                                                 %></div>
201                                                 <div class="col-xs-4 overflowhidden artifactType"><%
202                                                 ArtifactTypeId atyId = new ArtifactTypeId(deploymentArtifact.getArtifactType());
203                                                 %><%=client.getName(atyId)%></div>
204                                         </div>
205                                         <%
206                                 }
207                         }
208                         %>
209
210                         <div class="row addDA">
211                                 <button class="btn btn-default btn-xs center-block addDA">Add new</button>
212                         </div>
213
214                         <div class="row addnewartifacttemplate">
215                                 <div class="center-block">Drop to add new deployment artifact. Not yet implemented.</div>
216                         </div>
217                 </div>
218         </div>
219
220         <%-- Requirements and Capabilities --%>
221         <%
222         List<TRequirement> reqList;
223         if (paletteMode) {
224                 reqList = null;
225         } else {
226                 Requirements reqs = nodeTemplate.getRequirements();
227                 if (reqs == null) {
228                         reqList = null;
229                 } else {
230                         reqList = reqs.getRequirement();
231                 }
232         }
233         %>
234         <ntrq:reqs list="<%=reqList%>" repositoryURL="${repositoryURL}" pathToImages="${topologyModelerURI}images/" client="${client}" />
235
236         <%
237         List<TCapability> capList;
238         if (paletteMode) {
239                 capList = null;
240         } else {
241                 Capabilities caps = nodeTemplate.getCapabilities();
242                 if (caps == null) {
243                         capList = null;
244                 } else {
245                         capList = caps.getCapability();
246                 }
247         }
248         %>
249         <ntrq:caps list="<%=capList%>" repositoryURL="${repositoryURL}" pathToImages="${topologyModelerURI}images/" client="${client}"/>
250
251         <%-- Policies --%>
252         <%
253         List<TPolicy> policyList;
254         if (paletteMode) {
255                 policyList = null;
256         } else {
257                 Policies policies = nodeTemplate.getPolicies();
258                 if (policies == null) {
259                         policyList = null;
260                 } else {
261                         policyList = policies.getPolicy();
262                 }
263         }
264         %>
265         <pol:policies list="<%=policyList%>" repositoryURL="${repositoryURL}" />
266 </div>