Add CLI in verigraph.
[parser.git] / verigraph / src / it / polito / verigraph / tosca / converter / xml / GraphToXml.java
1 /*******************************************************************************\r
2  * Copyright (c) 2018 Politecnico di Torino and others.\r
3  *\r
4  * All rights reserved. This program and the accompanying materials\r
5  * are made available under the terms of the Apache License, Version 2.0\r
6  * which accompanies this distribution, and is available at\r
7  * http://www.apache.org/licenses/LICENSE-2.0\r
8  *******************************************************************************/\r
9 package it.polito.verigraph.tosca.converter.xml;\r
10 \r
11 import java.io.IOException;\r
12 import java.util.Map;\r
13 \r
14 import javax.xml.namespace.QName;\r
15 \r
16 import it.polito.verigraph.model.Configuration;\r
17 import it.polito.verigraph.model.Graph;\r
18 import it.polito.verigraph.model.Neighbour;\r
19 import it.polito.verigraph.model.Node;\r
20 import it.polito.verigraph.tosca.MappingUtils;\r
21 import it.polito.tosca.jaxb.Definitions;\r
22 import it.polito.tosca.jaxb.TEntityTemplate.Properties;\r
23 import it.polito.tosca.jaxb.TNodeTemplate;\r
24 import it.polito.tosca.jaxb.TRelationshipTemplate;\r
25 import it.polito.tosca.jaxb.TRelationshipTemplate.SourceElement;\r
26 import it.polito.tosca.jaxb.TRelationshipTemplate.TargetElement;\r
27 import it.polito.tosca.jaxb.TServiceTemplate;\r
28 import it.polito.tosca.jaxb.TTopologyTemplate;\r
29 \r
30 public class GraphToXml {\r
31     /** model --> tosca_xml*/\r
32 \r
33     public static Definitions mapGraph(Graph graph) {\r
34         Definitions definitions = new Definitions();\r
35         TServiceTemplate serviceTemplate = mapPathToXml(graph);\r
36         definitions.getServiceTemplateOrNodeTypeOrNodeTypeImplementation().add(serviceTemplate);\r
37 \r
38         return definitions;\r
39     }\r
40 \r
41     // These functions have been split so that they can be reused for obtaining all the paths\r
42     //into a single Definitions (see mapPathsToXml)\r
43     public static TServiceTemplate mapPathToXml(Graph graph) {\r
44 \r
45         TServiceTemplate serviceTemplate = new TServiceTemplate();\r
46         TTopologyTemplate topologyTemplate = new TTopologyTemplate();\r
47 \r
48         for(Node node : graph.getNodes().values()) {\r
49             long i = 0;\r
50             TNodeTemplate nodeTemplate = mapNode(node);\r
51             topologyTemplate.getNodeTemplateOrRelationshipTemplate().add(nodeTemplate);\r
52 \r
53             // RelationshipTemplate mapping\r
54             Map<Long,Neighbour> neighMap = node.getNeighbours();\r
55             for (Map.Entry<Long, Neighbour> myentry : neighMap.entrySet()) {\r
56                 Neighbour neigh = myentry.getValue();\r
57                 if (graph.getNodes().containsKey(neigh.getId())) {\r
58                     // I have to check that because if I'm mapping a path (and not a graph) I could have\r
59                     //as neighbour a node which is not in the path\r
60                     TRelationshipTemplate relat = mapRelationship(graph, node, neigh, i);\r
61                     topologyTemplate.getNodeTemplateOrRelationshipTemplate().add(relat);\r
62                     i++; //Neighbour does not have a neighbourID! RelationshipTemplate does,\r
63                     //so it is an incremental number for each node\r
64                 }\r
65             }\r
66         }\r
67 \r
68         serviceTemplate.setId(String.valueOf(graph.getId()));\r
69         serviceTemplate.setTopologyTemplate(topologyTemplate);\r
70 \r
71         return serviceTemplate;\r
72     }\r
73 \r
74 \r
75     private static TNodeTemplate mapNode(Node node){\r
76         TNodeTemplate nodeTemplate = new TNodeTemplate();\r
77 \r
78         nodeTemplate.setId(String.valueOf(node.getId()));\r
79         nodeTemplate.setName(node.getName());\r
80 \r
81         //QName type = new QName("http://docs.oasis-open.org/tosca/ns/2011/12/ToscaVerigraphDefinition")\r
82         QName type = new QName("http://docs.oasis-open.org/tosca/ns/2011/12",\r
83                 node.getFunctional_type().substring(0, 1).toUpperCase() + node.\r
84                 getFunctional_type().substring(1) + "Type");\r
85         nodeTemplate.setType(type);\r
86 \r
87         it.polito.tosca.jaxb.Configuration config = mapModelConfiguration(node.getConfiguration(),\r
88                 node.getFunctional_type().toLowerCase());\r
89         //nodeTemplate.getAny().add(config);\r
90         nodeTemplate.setProperties(new Properties());\r
91         nodeTemplate.getProperties().setAny(config);\r
92         return nodeTemplate;\r
93     }\r
94 \r
95 \r
96     private static TRelationshipTemplate mapRelationship(Graph graph, Node sourceNode, Neighbour neigh, long i) {\r
97         TRelationshipTemplate relationship = new TRelationshipTemplate();\r
98         SourceElement source = new SourceElement();\r
99         TargetElement target = new TargetElement();\r
100 \r
101         Node targetNode = graph.getNodes().get(neigh.getId());\r
102 \r
103         TNodeTemplate sourceNT = mapNode(sourceNode);\r
104         TNodeTemplate targetNT = mapNode(targetNode);\r
105 \r
106         source.setRef(sourceNT);\r
107         target.setRef(targetNT);\r
108 \r
109         relationship.setId(String.valueOf(i));\r
110         relationship.setSourceElement(source);\r
111         relationship.setTargetElement(target);\r
112         relationship.setName(sourceNode.getName()+"to"+neigh.getName());\r
113 \r
114         return relationship;\r
115     }\r
116 \r
117 \r
118     private static it.polito.tosca.jaxb.Configuration mapModelConfiguration(Configuration conf, String type) {\r
119         it.polito.tosca.jaxb.Configuration configuration = new it.polito.tosca.jaxb.Configuration();\r
120         try {\r
121             //We are passing the configuration type to the Deserializer context\r
122             configuration = MappingUtils.obtainToscaConfiguration(conf, type);\r
123 \r
124             //In Graph, ID and DESCRIPTION are always empty\r
125             //configuration.setConfID(conf.getId());\r
126             //configuration.setConfDescr(conf.getDescription());\r
127 \r
128         } catch (IOException | NullPointerException e) {\r
129             e.printStackTrace();\r
130         }\r
131         return configuration;\r
132     }\r
133 \r
134 }\r