--- /dev/null
+/*******************************************************************************\r
+ * Copyright (c) 2018 Politecnico di Torino and others.\r
+ *\r
+ * All rights reserved. This program and the accompanying materials\r
+ * are made available under the terms of the Apache License, Version 2.0\r
+ * which accompanies this distribution, and is available at\r
+ * http://www.apache.org/licenses/LICENSE-2.0\r
+ *******************************************************************************/\r
+package it.polito.verigraph.tosca.converter.grpc;\r
+\r
+import java.io.IOException;\r
+import java.util.List;\r
+\r
+import javax.xml.namespace.QName;\r
+\r
+import it.polito.tosca.jaxb.Configuration;\r
+import it.polito.tosca.jaxb.Definitions;\r
+import it.polito.tosca.jaxb.TEntityTemplate.Properties;\r
+import it.polito.tosca.jaxb.TNodeTemplate;\r
+import it.polito.tosca.jaxb.TRelationshipTemplate;\r
+import it.polito.tosca.jaxb.TRelationshipTemplate.SourceElement;\r
+import it.polito.tosca.jaxb.TRelationshipTemplate.TargetElement;\r
+import it.polito.tosca.jaxb.TServiceTemplate;\r
+import it.polito.tosca.jaxb.TTopologyTemplate;\r
+import it.polito.verigraph.exception.BadRequestException;\r
+import it.polito.verigraph.grpc.NodeTemplateGrpc;\r
+import it.polito.verigraph.grpc.RelationshipTemplateGrpc;\r
+import it.polito.verigraph.grpc.TopologyTemplateGrpc;\r
+import it.polito.verigraph.grpc.ToscaConfigurationGrpc;\r
+import it.polito.verigraph.tosca.MappingUtils;\r
+\r
+public class GrpcToXml {\r
+\r
+ public static Definitions mapGraph(TopologyTemplateGrpc topologyGrpc) {\r
+ Definitions definitions = new Definitions();\r
+ TServiceTemplate serviceTemplate = new TServiceTemplate();\r
+ TTopologyTemplate topologyTemplate = new TTopologyTemplate();\r
+\r
+ for(NodeTemplateGrpc node : topologyGrpc.getNodeTemplateList()) {\r
+ TNodeTemplate nodeTemplate = mapNode(node);\r
+ topologyTemplate.getNodeTemplateOrRelationshipTemplate().add(nodeTemplate);\r
+ }\r
+ for(RelationshipTemplateGrpc relat : topologyGrpc.getRelationshipTemplateList()) {\r
+ TRelationshipTemplate relationshipTemplate = mapRelationship(relat, topologyGrpc.getNodeTemplateList());\r
+ topologyTemplate.getNodeTemplateOrRelationshipTemplate().add(relationshipTemplate);\r
+ }\r
+\r
+ try {\r
+ serviceTemplate.setId(String.valueOf(topologyGrpc.getId()));\r
+ } catch (NullPointerException e) {\r
+ throw new NullPointerException("The TopologyTemplateGrpc must have an ID.");\r
+ }\r
+ serviceTemplate.setTopologyTemplate(topologyTemplate);\r
+ definitions.getServiceTemplateOrNodeTypeOrNodeTypeImplementation().add(serviceTemplate);\r
+ return definitions;\r
+ }\r
+\r
+\r
+ private static TNodeTemplate mapNode(NodeTemplateGrpc node){\r
+ TNodeTemplate nodeTemplate = new TNodeTemplate();\r
+\r
+ try {\r
+ nodeTemplate.setId(String.valueOf(node.getId()));\r
+ } catch (NullPointerException e) {\r
+ throw new NullPointerException("The NodeTemplateGrpc must have an ID.");\r
+ }\r
+ try {\r
+ nodeTemplate.setName(node.getName());\r
+ } catch (NullPointerException e) {\r
+ throw new NullPointerException("The NodeTemplateGrpc must have a name.");\r
+ }\r
+\r
+ try {\r
+ //QName type = new QName("http://docs.oasis-open.org/tosca/ns/2011/12/ToscaVerigraphDefinition")\r
+ QName type = new QName("http://docs.oasis-open.org/tosca/ns/2011/12",\r
+ node.getType().toString().substring(0, 1).toUpperCase() +\r
+ node.getType().toString().substring(1) + "Type");\r
+ nodeTemplate.setType(type);\r
+ } catch (NullPointerException e) {\r
+ throw new NullPointerException("The NodeTemplateGrpc must have a valid type.");\r
+ }\r
+\r
+ Configuration config = mapModelConfiguration(node.getConfiguration(), node.getType().toString().toLowerCase());\r
+ nodeTemplate.setProperties(new Properties());\r
+ nodeTemplate.getProperties().setAny(config);\r
+ return nodeTemplate;\r
+ }\r
+\r
+\r
+ private static TRelationshipTemplate mapRelationship(RelationshipTemplateGrpc relat, List<NodeTemplateGrpc> nodeList) {\r
+ TRelationshipTemplate relationship = new TRelationshipTemplate();\r
+ SourceElement source = new SourceElement();\r
+ TargetElement target = new TargetElement();\r
+ int check = 0;\r
+\r
+ TNodeTemplate sourceNode = new TNodeTemplate();\r
+ TNodeTemplate targetNode = new TNodeTemplate();\r
+\r
+ try {\r
+ for(NodeTemplateGrpc node : nodeList) {\r
+ if(node.getId().equals(relat.getIdSourceNodeTemplate())) {\r
+ sourceNode = mapNode(node);\r
+ check++;\r
+ }\r
+ if(node.getId().equals(relat.getIdTargetNodeTemplate())) {\r
+ targetNode = mapNode(node);\r
+ check++;\r
+ }\r
+ }\r
+ } catch (NullPointerException e) {\r
+ throw new BadRequestException("A RelationshipTemplateGrpc must contain both source and target node ID.");\r
+ }\r
+ if(check != 2)\r
+ throw new BadRequestException("A RelationshipTemplateGrpc must contain both source and target node ID.");\r
+\r
+ source.setRef(sourceNode);\r
+ target.setRef(targetNode);\r
+\r
+ relationship.setId(relat.getId()); //TODO da valutare\r
+ relationship.setSourceElement(source);\r
+ relationship.setTargetElement(target);\r
+ relationship.setName(sourceNode.getName()+"To"+targetNode.getName());\r
+\r
+ return relationship;\r
+ }\r
+\r
+\r
+ private static it.polito.tosca.jaxb.Configuration mapModelConfiguration(ToscaConfigurationGrpc toscaConfigurationGrpc, String type) {\r
+ it.polito.tosca.jaxb.Configuration configuration = new it.polito.tosca.jaxb.Configuration();\r
+ try {\r
+ //We are passing the configuration type to the Deserializer context\r
+ configuration = MappingUtils.obtainToscaConfiguration(toscaConfigurationGrpc, type);\r
+\r
+ //In Graph, ID and DESCRIPTION are always empty\r
+ //configuration.setConfID(confGrpc.getId());\r
+ //configuration.setConfDescr(confGrpc.getDescription());\r
+\r
+ } catch (IOException | NullPointerException e) {\r
+ e.printStackTrace();\r
+ }\r
+ return configuration;\r
+ }\r
+\r
+}\r
+\r