Add CLI in verigraph.
[parser.git] / verigraph / src / it / polito / verigraph / tosca / converter / grpc / XmlToGrpc.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.grpc;\r
10 \r
11 import java.io.IOException;\r
12 import java.util.ArrayList;\r
13 import java.util.List;\r
14 \r
15 import javax.xml.bind.JAXBException;\r
16 \r
17 import com.fasterxml.jackson.core.JsonProcessingException;\r
18 \r
19 import it.polito.tosca.jaxb.TNodeTemplate;\r
20 import it.polito.tosca.jaxb.TRelationshipTemplate;\r
21 import it.polito.tosca.jaxb.TServiceTemplate;\r
22 import it.polito.verigraph.exception.BadRequestException;\r
23 import it.polito.verigraph.exception.DataNotFoundException;\r
24 import it.polito.verigraph.grpc.NodeTemplateGrpc;\r
25 import it.polito.verigraph.grpc.NodeTemplateGrpc.Type;\r
26 import it.polito.verigraph.grpc.RelationshipTemplateGrpc;\r
27 import it.polito.verigraph.grpc.TopologyTemplateGrpc;\r
28 import it.polito.verigraph.grpc.ToscaConfigurationGrpc;\r
29 import it.polito.verigraph.tosca.MappingUtils;\r
30 import it.polito.verigraph.tosca.XmlParsingUtils;\r
31 \r
32 public class XmlToGrpc {\r
33 \r
34     /** Returns the (first) TopologyTemplate found in the TOSCA-compliant XML file */\r
35     public static TopologyTemplateGrpc obtainTopologyTemplateGrpc (String filepath)\r
36             throws IOException, JAXBException, DataNotFoundException, ClassCastException, BadRequestException{\r
37         List<TServiceTemplate> serviceTList = XmlParsingUtils.obtainServiceTemplates(filepath);\r
38         TServiceTemplate serviceTemplate = serviceTList.get(0); //obtain only the first ServiceTemplate of the TOSCA compliance file\r
39 \r
40         //Retrieving of list of NodeTemplate and RelationshipTemplate\r
41         List<NodeTemplateGrpc> nodes = new ArrayList<NodeTemplateGrpc>();\r
42         List<RelationshipTemplateGrpc> relats = new ArrayList<RelationshipTemplateGrpc>();\r
43         List<TNodeTemplate> tNodes = XmlParsingUtils.obtainNodeTemplates(serviceTemplate);\r
44         for(TNodeTemplate nt : tNodes) {\r
45             for(NodeTemplateGrpc alreadyAddedNode : nodes)\r
46                 if(alreadyAddedNode.getId().equals(nt.getId()))\r
47                     throw new BadRequestException("The NodeTemplate ID must be unique.");\r
48             nodes.add(parseNodeTemplate(nt));\r
49         }\r
50         for(TRelationshipTemplate rt : XmlParsingUtils.obtainRelationshipTemplates(serviceTemplate)) {\r
51             if(!tNodes.contains(rt.getSourceElement().getRef()) || !tNodes.contains(rt.getTargetElement().getRef()))\r
52                 throw new BadRequestException("Invalid references to a Node in a Relationship.");\r
53             if(rt.getSourceElement().getRef() == rt.getTargetElement().getRef())\r
54                 throw new BadRequestException("Source and Target cannot be equal in a Relationship.");\r
55             relats.add(parseRelationshipTemplate(rt));\r
56         }\r
57 \r
58         //Creating TopologyTemplateGrpc object to be sent to server\r
59         return TopologyTemplateGrpc.newBuilder()\r
60                 .setId("0") //useless value since the server chooses the actual value for the GraphID\r
61                 .addAllNodeTemplate(nodes)\r
62                 .addAllRelationshipTemplate(relats)\r
63                 .build();\r
64     }\r
65 \r
66 \r
67     /** Parsing method: TNodeTemplate(tosca) --> NodeTemplateGrpc */\r
68     private static NodeTemplateGrpc parseNodeTemplate(TNodeTemplate nodeTempl)\r
69             throws ClassCastException, NullPointerException {\r
70         Boolean isVerigraphCompl = true;\r
71         Type type;\r
72 \r
73         //NodeTemplateGrpc building\r
74         NodeTemplateGrpc.Builder nodegrpc = NodeTemplateGrpc.newBuilder();\r
75 \r
76         //ID cannot be null\r
77         try {\r
78             nodegrpc.setId(nodeTempl.getId());\r
79         } catch (NullPointerException ex) {\r
80             throw new NullPointerException("An ID must be specified for each Node");\r
81         }\r
82         //Name can be null\r
83         try {\r
84             nodegrpc.setName(nodeTempl.getName());\r
85         } catch (NullPointerException ex) {\r
86             nodegrpc.setName("");\r
87         }\r
88 \r
89         //Type cannot be null but it can be invalid\r
90         try {\r
91             String typestring = nodeTempl.getType().getLocalPart().toLowerCase();\r
92             type = Type.valueOf(nodeTempl.getType().getLocalPart().toLowerCase().substring(0,typestring.length()-4));\r
93         } catch (IllegalArgumentException | NullPointerException ex) {\r
94             //in case the NodeTemplate is not TOSCA-Verigraph compliant, we assume it to be a fieldmodifier node\r
95             type = Type.fieldmodifier;\r
96             isVerigraphCompl = false;\r
97         }\r
98         nodegrpc.setType(type);\r
99         ToscaConfigurationGrpc.Builder grpcConfig;\r
100         if(isVerigraphCompl) {\r
101             it.polito.tosca.jaxb.Configuration nodeConfig = XmlParsingUtils.obtainConfiguration(nodeTempl);\r
102             grpcConfig = ToscaConfigurationGrpc.newBuilder();\r
103             //These fields are optional in TOSCA xml\r
104             try {\r
105                 grpcConfig.setId(nodeConfig.getConfID());\r
106             } catch(NullPointerException ex) {\r
107                 grpcConfig.setId(ToscaGrpcUtils.defaultConfID);\r
108             }\r
109             try {\r
110                 grpcConfig.setDescription(nodeConfig.getConfDescr());\r
111             } catch(NullPointerException ex) {\r
112                 grpcConfig.setDescription(ToscaGrpcUtils.defaultDescr);\r
113             }\r
114             try {;\r
115             grpcConfig.setConfiguration(MappingUtils.obtainStringConfiguration(nodeConfig));\r
116             } catch(NullPointerException | JsonProcessingException ex) {\r
117                 grpcConfig.setConfiguration(ToscaGrpcUtils.defaultConfig);\r
118             }\r
119         }\r
120         else {\r
121             grpcConfig = ToscaConfigurationGrpc.newBuilder()\r
122                     .setId(ToscaGrpcUtils.defaultConfID)\r
123                     .setDescription(ToscaGrpcUtils.defaultDescr)\r
124                     .setConfiguration(ToscaGrpcUtils.defaultConfig);\r
125         }\r
126         nodegrpc.setConfiguration(grpcConfig.build());\r
127         return nodegrpc.build();\r
128     }\r
129 \r
130 \r
131     /** Parsing method: TRelationshipTemplate(tosca) --> RelationshipTemplateGrpc */\r
132     private static RelationshipTemplateGrpc parseRelationshipTemplate(TRelationshipTemplate relatTempl)\r
133             throws ClassCastException{\r
134         String source, target;\r
135         //RelationshipTemplateGrpc building\r
136         RelationshipTemplateGrpc.Builder relatgrpc = RelationshipTemplateGrpc.newBuilder();\r
137 \r
138         //ID and Name can be null\r
139         try {\r
140             relatgrpc.setId(relatTempl.getId());\r
141         } catch (NullPointerException ex) {}//Different Relationship with same ID are considered valid.\r
142         try {\r
143             relatgrpc.setName(relatTempl.getName());\r
144         } catch (NullPointerException ex) {}\r
145 \r
146         //Source and Target values cannot be null\r
147         try {\r
148             TNodeTemplate sourceNode = (TNodeTemplate) relatTempl.getSourceElement().getRef();\r
149             TNodeTemplate targetNode = (TNodeTemplate) relatTempl.getTargetElement().getRef();\r
150             source = sourceNode.getId();\r
151             target = targetNode.getId();\r
152         } catch (NullPointerException ex) {\r
153             throw new NullPointerException("Invalid NodeTemplate reference in RelationshipTemplate with id:"\r
154                     + relatTempl.getId());\r
155         }\r
156         relatgrpc.setIdSourceNodeTemplate(source)\r
157         .setIdTargetNodeTemplate(target);\r
158         return relatgrpc.build();\r
159     }\r
160 }\r