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.grpc;
\r
11 import java.io.IOException;
\r
12 import java.util.ArrayList;
\r
13 import java.util.List;
\r
15 import javax.xml.bind.JAXBException;
\r
17 import com.fasterxml.jackson.core.JsonProcessingException;
\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
32 public class XmlToGrpc {
\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
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
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
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
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
73 //NodeTemplateGrpc building
\r
74 NodeTemplateGrpc.Builder nodegrpc = NodeTemplateGrpc.newBuilder();
\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
84 nodegrpc.setName(nodeTempl.getName());
\r
85 } catch (NullPointerException ex) {
\r
86 nodegrpc.setName("");
\r
89 //Type cannot be null but it can be invalid
\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
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
105 grpcConfig.setId(nodeConfig.getConfID());
\r
106 } catch(NullPointerException ex) {
\r
107 grpcConfig.setId(ToscaGrpcUtils.defaultConfID);
\r
110 grpcConfig.setDescription(nodeConfig.getConfDescr());
\r
111 } catch(NullPointerException ex) {
\r
112 grpcConfig.setDescription(ToscaGrpcUtils.defaultDescr);
\r
115 grpcConfig.setConfiguration(MappingUtils.obtainStringConfiguration(nodeConfig));
\r
116 } catch(NullPointerException | JsonProcessingException ex) {
\r
117 grpcConfig.setConfiguration(ToscaGrpcUtils.defaultConfig);
\r
121 grpcConfig = ToscaConfigurationGrpc.newBuilder()
\r
122 .setId(ToscaGrpcUtils.defaultConfID)
\r
123 .setDescription(ToscaGrpcUtils.defaultDescr)
\r
124 .setConfiguration(ToscaGrpcUtils.defaultConfig);
\r
126 nodegrpc.setConfiguration(grpcConfig.build());
\r
127 return nodegrpc.build();
\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
138 //ID and Name can be null
\r
140 relatgrpc.setId(relatTempl.getId());
\r
141 } catch (NullPointerException ex) {}//Different Relationship with same ID are considered valid.
\r
143 relatgrpc.setName(relatTempl.getName());
\r
144 } catch (NullPointerException ex) {}
\r
146 //Source and Target values cannot be null
\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
156 relatgrpc.setIdSourceNodeTemplate(source)
\r
157 .setIdTargetNodeTemplate(target);
\r
158 return relatgrpc.build();
\r