Catalog alignment
[sdc.git] / catalog-model / src / test / java / org / openecomp / sdc / be / model / operations / impl / util / PrintGraph.java
1 /*-
2  * ============LICENSE_START=======================================================
3  * SDC
4  * ================================================================================
5  * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
6  * ================================================================================
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  * 
11  *      http://www.apache.org/licenses/LICENSE-2.0
12  * 
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  * ============LICENSE_END=========================================================
19  */
20
21 package org.openecomp.sdc.be.model.operations.impl.util;
22
23 import org.janusgraph.core.JanusGraphEdge;
24 import org.janusgraph.core.JanusGraph;
25 import org.janusgraph.core.JanusGraphVertex;
26 import org.apache.tinkerpop.gremlin.structure.Edge;
27 import org.apache.tinkerpop.gremlin.structure.Element;
28 import org.apache.tinkerpop.gremlin.structure.Property;
29 import org.apache.tinkerpop.gremlin.structure.Vertex;
30 import org.apache.tinkerpop.gremlin.structure.util.ElementHelper;
31 import org.openecomp.sdc.be.dao.neo4j.GraphEdgeLabels;
32 import org.openecomp.sdc.be.dao.neo4j.GraphPropertiesDictionary;
33 import org.openecomp.sdc.be.datatypes.enums.NodeTypeEnum;
34
35 import java.util.*;
36 import java.util.Map.Entry;
37 //import com.tinkerpop.blueprints.Direction;
38 //import com.tinkerpop.blueprints.Edge;
39 //import com.tinkerpop.blueprints.Vertex;
40 //import com.tinkerpop.blueprints.util.ElementHelper;
41
42 public class PrintGraph {
43
44     public void printGraphVertices(JanusGraph graph) {
45
46         Iterable<JanusGraphVertex> vertices = graph.query().vertices();
47
48         if (vertices != null) {
49             Iterator<JanusGraphVertex> iterator = vertices.iterator();
50             while (iterator.hasNext()) {
51                 Vertex vertex = iterator.next();
52
53                 // System.out.println(vertex);
54                 // System.out.println(ElementHelper.getProperties(vertex));
55                 // System.out.println("=======================================");
56             }
57
58         }
59         // graph.commit();
60         graph.tx().commit();
61     }
62
63     public void printGraphEdges(JanusGraph graph) {
64
65         Iterable<JanusGraphEdge> vertices = graph.query().edges();
66
67         if (vertices != null) {
68             Iterator<JanusGraphEdge> iterator = vertices.iterator();
69             while (iterator.hasNext()) {
70                 Edge edge = iterator.next();
71
72                 // System.out.println(edge);
73                 // System.out.println("edge=" + edge.getLabel() + ",
74                 // properties="+ ElementHelper.getProperties(edge));
75                 // System.out.println("edge=" + edge.label() + ", properties="+
76                 // getProperties(edge));
77                 // System.out.println("=======================================");
78             }
79
80         }
81         // graph.commit();
82         graph.tx().commit();
83     }
84
85     public String buildGraphForWebgraphWiz(JanusGraph graph) {
86
87         StringBuilder builder = new StringBuilder();
88         builder.append("digraph finite_state_machine {\n");
89         builder.append("rankdir=LR;\n");
90         builder.append("size=\"15,10\" \n");
91         // node [shape = doublecircle]; LR_0 LR_3 LR_4 LR_8;
92         // node [shape = circle];
93
94         Iterable<JanusGraphVertex> vertices = graph.query().vertices();
95
96         if (vertices != null) {
97             Iterator<JanusGraphVertex> iterator = vertices.iterator();
98             while (iterator.hasNext()) {
99                 Vertex vertex = iterator.next();
100
101                 // System.out.println(vertex);
102                 // System.out.println(ElementHelper.getProperties(vertex));
103                 // System.out.println(getProperties(vertex));
104                 // System.out.println("=======================================");
105
106                 Map<String, Object> properties = getProperties(vertex);
107
108                 String nodeLabel = (String) properties.get(GraphPropertiesDictionary.LABEL.getProperty());
109
110                 String color = getColorByNodeType(nodeLabel);
111
112                 String uid = getNodeIdByLabel(nodeLabel, properties);
113
114                 // System.out.println("uid=" + uid);
115
116                 String nodeRecord = buildNodeRecord(uid, color, properties);
117
118                 // System.out.println(nodeRecord);
119
120                 builder.append(nodeRecord);
121
122                 // if (nodeLabel.equals(NodeTypeEnum.Category)) {
123                 //
124                 // String
125                 //
126                 // } else (nodeLabel.equals(NodeTypeEnum.User)) {
127                 //
128                 // }
129
130             }
131
132         }
133
134         Iterable<JanusGraphEdge> edges = graph.query().edges();
135
136         if (edges != null) {
137             Iterator<JanusGraphEdge> iterator = edges.iterator();
138             while (iterator.hasNext()) {
139                 Edge edge = iterator.next();
140
141                 // Vertex vertexFrom = edge.getVertex(Direction.OUT);
142                 // Vertex vertexTo = edge.getVertex(Direction.IN);
143                 Vertex vertexFrom = edge.outVertex();
144                 Vertex vertexTo = edge.inVertex();
145
146                 // String fromUid =
147                 // getNodeIdByLabel((String)vertexFrom.getProperty(GraphPropertiesDictionary.LABEL.getProperty()),
148                 // ElementHelper.getProperties(vertexFrom));
149                 // String toUid =
150                 // getNodeIdByLabel((String)vertexTo.getProperty(GraphPropertiesDictionary.LABEL.getProperty()),
151                 // ElementHelper.getProperties(vertexTo));
152                 String fromUid = getNodeIdByLabel(vertexFrom.value(GraphPropertiesDictionary.LABEL.getProperty()),
153                         getProperties(vertexFrom));
154                 String toUid = getNodeIdByLabel(vertexTo.value(GraphPropertiesDictionary.LABEL.getProperty()),
155                         getProperties(vertexTo));
156
157                 // String edgeLabel = edge.getLabel();
158                 String edgeLabel = edge.label();
159
160                 // String edgeRecord = buildEdgeRecord(fromUid, toUid,
161                 // edgeLabel, ElementHelper.getProperties(edge));
162                 String edgeRecord = buildEdgeRecord(fromUid, toUid, edgeLabel, getProperties(edge));
163
164                 builder.append(edgeRecord);
165
166                 // System.out.println(edge);
167                 // System.out.println("edge=" + edge.getLabel() + ",
168                 // properties="
169                 // + ElementHelper.getProperties(edge));
170                 // System.out.println("edge=" + edge.label() + ", properties="
171                 // + getProperties(edge));
172                 // System.out.println("=======================================");
173             }
174
175         }
176
177         builder.append(" } ");
178
179         return builder.toString();
180
181     }
182
183     // LR_0 [ style = "bold" color = "red" shape = "Mrecord" label =
184     // "hello&#92;nworld | { name | apache } | { version | 1.0 } | { uid |
185     // apache.1.0 } | { state| CERTIFIED } |{ b |{c|<here> d|e}| f}| g | h"
186     // ]
187
188     // LR_0 -> LR_2 [ label = "SS(B)" ];
189     // LR_0 -> LR_1 [ label = "SS(S)" ];
190     // LR_1 -> LR_3 [ label = "S($end)" ];
191     // LR_2 -> LR_6 [ label = "SS(b)" ];
192     // LR_2 -> LR_5 [ label = "SS(a)" ];
193     // LR_2 -> LR_4 [ label = "S(A)" ];
194     // LR_5 -> LR_7 [ label = "S(b)" ];
195     // LR_5 -> LR_5 [ label = "S(a)" ];
196     // LR_6 -> LR_6 [ label = "S(b)" ];
197     // LR_6 -> LR_5 [ label = "S(a)" ];
198     // LR_7 -> LR_8 [ label = "S(b)" ];
199     // LR_7 -> LR_5 [ label = "S(a)" ];
200     // LR_8 -> LR_6 [ label = "S(b)" ];
201     // LR_8 -> LR_5 [ label = "S(a)" ];
202
203     private String buildEdgeRecord(String fromUid, String toUid, String edgeLabel, Map<String, Object> properties) {
204
205         StringBuilder builder = new StringBuilder();
206         // LR_0 -> LR_2 [ label = "SS(B)" ];
207
208         String generatedProps = generateStringFromProperties(properties);
209
210         String color = getEdgeColorByLabel(edgeLabel);
211
212         builder.append("\"" + fromUid + "\"" + " -> " + "\"" + toUid + "\"" + " [ color = " + color + " label = \""
213                 + edgeLabel + "(" + generatedProps + ")\"" + " ] " + "\n");
214
215         return builder.toString();
216     }
217
218     private String getEdgeColorByLabel(String edgeLabel) {
219
220         GraphEdgeLabels edgeLabelEnum = GraphEdgeLabels.getByName(edgeLabel);
221
222         String color = "black";
223
224         switch (edgeLabelEnum) {
225         case PROPERTY:
226             color = "orange";
227             break;
228         case CAPABILITY:
229             break;
230         case DERIVED_FROM:
231             color = "red";
232         default:
233             break;
234         }
235
236         return color;
237     }
238
239     private String generateStringFromProperties(Map<String, Object> properties) {
240
241         StringBuilder builder = new StringBuilder();
242
243         if (properties != null) {
244             for (Entry<String, Object> entry : properties.entrySet()) {
245                 String key = entry.getKey();
246                 String value = entry.getValue().toString();
247                 builder.append(key + "=" + value + "__");
248             }
249         }
250         return builder.toString();
251
252     }
253
254     private String buildNodeRecord(String uid, String color, Map<String, Object> properties) {
255
256         StringBuilder builder = new StringBuilder();
257
258         builder.append("\"" + uid + "\"" + " [ ");
259         builder.append("style = \"bold\" ");
260         builder.append(" color = \"" + color + "\"");
261         builder.append("shape = \"Mrecord\" ");
262
263         String label = "";
264         int maxKeyLength = 0;
265         for (Entry<String, Object> entry1 : properties.entrySet()) {
266             String key = entry1.getKey();
267             int keyLength = key.length();
268             if (keyLength > maxKeyLength) {
269                 maxKeyLength = keyLength;
270             }
271         }
272
273         boolean first = true;
274         for (Entry<String, Object> entry : properties.entrySet()) {
275
276             String key = entry.getKey();
277             String value = entry.getValue().toString();
278
279             if (key.equals(GraphPropertiesDictionary.CONSTRAINTS.getProperty())) {
280                 value = value.replaceAll("[^\\w\\s]", "_");
281             }
282
283             key = padKey(key, maxKeyLength);
284
285             if (first) {
286                 first = false;
287             } else {
288                 label += " | ";
289             }
290             label += " { " + key + " | " + value + " } ";
291         }
292
293         builder.append("label = \"" + label + "\" ");
294         builder.append(" ] ");
295
296         // LR_0 [ style = "bold" color = "red" shape = "Mrecord" label =
297         // "hello&#92;nworld | { name | apache } | { version | 1.0 } | { uid |
298         // apache.1.0 } | { state| CERTIFIED } |{ b |{c|<here> d|e}| f}| g | h"
299         // ]
300
301         builder.append(" \n ");
302         return builder.toString();
303     }
304
305     private String getNodeIdByLabel(String nodeLabel, Map<String, Object> properties) {
306
307         NodeTypeEnum typeEnum = NodeTypeEnum.getByName(nodeLabel);
308
309         String uid = null;
310         switch (typeEnum) {
311
312         case User:
313             uid = (String) properties.get(GraphPropertiesDictionary.USERID.getProperty());
314             break;
315         case ServiceCategory:
316         case ResourceCategory:
317         case Tag:
318             uid = (String) properties.get(GraphPropertiesDictionary.NAME.getProperty());
319             break;
320
321         default:
322             uid = (String) properties.get(GraphPropertiesDictionary.UNIQUE_ID.getProperty());
323             break;
324         }
325
326         return uid;
327     }
328
329     private String getColorByNodeType(String nodeLabel) {
330
331         NodeTypeEnum typeEnum = NodeTypeEnum.getByName(nodeLabel);
332
333         String color = "red";
334         switch (typeEnum) {
335         case ServiceCategory:
336             color = "blue";
337             break;
338         case ResourceCategory:
339             color = "blue";
340             break;
341         case Resource:
342             color = "forestgreen";
343             break;
344         case User:
345             color = "green";
346             break;
347         case Capability:
348             color = "lightgreen";
349             break;
350         case CapabilityType:
351             color = "gray";
352             break;
353         case Property:
354             color = "cyan";
355             break;
356         case RelationshipType:
357             color = "darkorchid";
358             break;
359         case Requirement:
360             color = "gold";
361             break;
362         case RequirementImpl:
363             // color = "forestgreen";
364             color = "gold";
365             break;
366         case Service:
367             color = "cyan4";
368             break;
369         case Tag:
370             color = "dimgrey";
371             break;
372         default:
373             break;
374
375         }
376
377         return color;
378     }
379
380     private String padKey(String key, int maxKeyLength) {
381
382         int len = key.length();
383         for (int i = len; i < maxKeyLength; i++) {
384             key += " ";
385         }
386
387         return key;
388     }
389
390     public int getNumberOfVertices(JanusGraph graph) {
391         int counter = 0;
392         Iterable<JanusGraphVertex> vertices = graph.query().vertices();
393
394         if (vertices != null) {
395             Iterator<JanusGraphVertex> iterator = vertices.iterator();
396             while (iterator.hasNext()) {
397                 Vertex vertex = iterator.next();
398                 counter++;
399             }
400         }
401         return counter;
402     }
403
404     public Set<String> getVerticesSet(JanusGraph janusGraph) {
405
406         Set<String> set = new HashSet<>();
407
408         Iterable<JanusGraphVertex> vertices = janusGraph.query().vertices();
409
410         if (vertices != null) {
411             Iterator<JanusGraphVertex> iterator = vertices.iterator();
412             while (iterator.hasNext()) {
413                 Vertex vertex = iterator.next();
414
415                 // System.out.println(vertex);
416                 // System.out.println(ElementHelper.getProperties(vertex));
417                 // System.out.println(getProperties(vertex));
418                 // System.out.println("=======================================");
419
420                 // Map<String, Object> properties =
421                 // ElementHelper.getProperties(vertex);
422                 Map<String, Object> properties = getProperties(vertex);
423
424                 String nodeLabel = (String) properties.get(GraphPropertiesDictionary.LABEL.getProperty());
425
426                 String uid = getNodeIdByLabel(nodeLabel, properties);
427
428                 set.add(uid);
429             }
430         }
431
432         return set;
433
434     }
435
436     public Map<String, Object> getProperties(Element element) {
437
438         Map<String, Object> result = null;
439
440         if (element.keys() != null && element.keys().size() > 0) {
441             Map<String, Property> propertyMap = ElementHelper.propertyMap(element,
442                     element.keys().toArray(new String[element.keys().size()]));
443             result = new HashMap<>();
444
445             for (Entry<String, Property> entry : propertyMap.entrySet()) {
446                 String key = entry.getKey();
447                 Object value = entry.getValue().value();
448
449                 result.put(key, value);
450             }
451         }
452         return result;
453     }
454
455 }