1 /*******************************************************************************
\r
2 * Copyright (c) 2018 Politecnico di Torino and others.
\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
11 import java.io.IOException;
\r
12 import java.util.Map;
\r
14 import javax.xml.namespace.QName;
\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
30 public class GraphToXml {
\r
31 /** model --> tosca_xml*/
\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
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
45 TServiceTemplate serviceTemplate = new TServiceTemplate();
\r
46 TTopologyTemplate topologyTemplate = new TTopologyTemplate();
\r
48 for(Node node : graph.getNodes().values()) {
\r
50 TNodeTemplate nodeTemplate = mapNode(node);
\r
51 topologyTemplate.getNodeTemplateOrRelationshipTemplate().add(nodeTemplate);
\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
68 serviceTemplate.setId(String.valueOf(graph.getId()));
\r
69 serviceTemplate.setTopologyTemplate(topologyTemplate);
\r
71 return serviceTemplate;
\r
75 private static TNodeTemplate mapNode(Node node){
\r
76 TNodeTemplate nodeTemplate = new TNodeTemplate();
\r
78 nodeTemplate.setId(String.valueOf(node.getId()));
\r
79 nodeTemplate.setName(node.getName());
\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
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
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
101 Node targetNode = graph.getNodes().get(neigh.getId());
\r
103 TNodeTemplate sourceNT = mapNode(sourceNode);
\r
104 TNodeTemplate targetNT = mapNode(targetNode);
\r
106 source.setRef(sourceNT);
\r
107 target.setRef(targetNT);
\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
114 return relationship;
\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
121 //We are passing the configuration type to the Deserializer context
\r
122 configuration = MappingUtils.obtainToscaConfiguration(conf, type);
\r
124 //In Graph, ID and DESCRIPTION are always empty
\r
125 //configuration.setConfID(conf.getId());
\r
126 //configuration.setConfDescr(conf.getDescription());
\r
128 } catch (IOException | NullPointerException e) {
\r
129 e.printStackTrace();
\r
131 return configuration;
\r