6e65ac983e747396dd1f3731b9dda29290fce04e
[parser.git] / verigraph / src / it / polito / verigraph / tosca / YamlParsingUtils.java
1 /*******************************************************************************\r
2  * Copyright (c) 2017/18 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;\r
10 \r
11 import java.io.File;\r
12 import java.io.IOException;\r
13 import java.io.StringWriter;\r
14 import java.util.Map;\r
15 \r
16 import javax.xml.bind.JAXBException;\r
17 \r
18 import com.fasterxml.jackson.core.JsonParseException;\r
19 import com.fasterxml.jackson.core.JsonParser;\r
20 import com.fasterxml.jackson.core.JsonProcessingException;\r
21 import com.fasterxml.jackson.databind.JsonMappingException;\r
22 import com.fasterxml.jackson.databind.ObjectMapper;\r
23 import com.fasterxml.jackson.databind.module.SimpleModule;\r
24 import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;\r
25 \r
26 import it.polito.verigraph.exception.BadRequestException;\r
27 import it.polito.verigraph.exception.DataNotFoundException;\r
28 import it.polito.verigraph.exception.InvalidServiceTemplateException;\r
29 import it.polito.verigraph.tosca.serializer.YamlConfigSerializer;\r
30 import it.polito.verigraph.tosca.yaml.beans.AntispamNode;\r
31 import it.polito.verigraph.tosca.yaml.beans.CacheNode;\r
32 import it.polito.verigraph.tosca.yaml.beans.ConfigurationYaml;\r
33 import it.polito.verigraph.tosca.yaml.beans.DpiNode;\r
34 import it.polito.verigraph.tosca.yaml.beans.EndhostNode;\r
35 import it.polito.verigraph.tosca.yaml.beans.EndpointNode;\r
36 import it.polito.verigraph.tosca.yaml.beans.FieldModifierNode;\r
37 import it.polito.verigraph.tosca.yaml.beans.FirewallNode;\r
38 import it.polito.verigraph.tosca.yaml.beans.MailClientNode;\r
39 import it.polito.verigraph.tosca.yaml.beans.MailServerNode;\r
40 import it.polito.verigraph.tosca.yaml.beans.NatNode;\r
41 import it.polito.verigraph.tosca.yaml.beans.NodeTemplateYaml;\r
42 import it.polito.verigraph.tosca.yaml.beans.RelationshipTemplateYaml;\r
43 import it.polito.verigraph.tosca.yaml.beans.ServiceTemplateYaml;\r
44 import it.polito.verigraph.tosca.yaml.beans.TopologyTemplateYaml;\r
45 import it.polito.verigraph.tosca.yaml.beans.VpnAccessNode;\r
46 import it.polito.verigraph.tosca.yaml.beans.VpnExitNode;\r
47 import it.polito.verigraph.tosca.yaml.beans.WebClientNode;\r
48 import it.polito.verigraph.tosca.yaml.beans.WebServerNode;\r
49 \r
50 public class YamlParsingUtils {\r
51 \r
52     public static ServiceTemplateYaml obtainServiceTemplate(String filePath) throws InvalidServiceTemplateException {\r
53         ServiceTemplateYaml yamlServiceTemplate = new ServiceTemplateYaml();\r
54         ObjectMapper mapper = new ObjectMapper(new YAMLFactory());\r
55         mapper.enable(JsonParser.Feature.STRICT_DUPLICATE_DETECTION);\r
56 \r
57         try {\r
58             yamlServiceTemplate = mapper.readValue(new File(filePath), ServiceTemplateYaml.class);\r
59             return yamlServiceTemplate;\r
60 \r
61         } catch (JsonParseException e) {\r
62             throw new InvalidServiceTemplateException("The NodeTemplate IDs and the RelationshipTemplate IDs must be unique.");\r
63         } catch (JsonMappingException e) {\r
64             throw new InvalidServiceTemplateException("The provided file does not match the expected structure.");\r
65         } catch (InvalidServiceTemplateException e) {\r
66             throw new InvalidServiceTemplateException("The provided template contains errors or missing informations.");\r
67         } catch (IOException e) {\r
68             throw new InvalidServiceTemplateException("I/O error.");\r
69         }\r
70 \r
71     }\r
72 \r
73 \r
74     public static Map<String, NodeTemplateYaml> obtainNodeTemplates(ServiceTemplateYaml yamlService) throws DataNotFoundException {\r
75         TopologyTemplateYaml yamlTopology;\r
76         try {\r
77             yamlTopology = yamlService.getTopology_template();\r
78         } catch(NullPointerException ex) {\r
79             throw new DataNotFoundException("The ServiceTemplate provided does not contain a TopologyTemplate.");\r
80         }\r
81         try {\r
82             Map<String, NodeTemplateYaml> nodes = yamlTopology.getNode_templates();\r
83             return nodes;\r
84         } catch(NullPointerException ex) {\r
85             throw new DataNotFoundException("The ServiceTemplate provided does not contain any NodeTemplates.");\r
86         }\r
87 \r
88     }\r
89 \r
90 \r
91     public static Map<String, RelationshipTemplateYaml> obtainRelationshipTemplates(ServiceTemplateYaml yamlService) throws DataNotFoundException {\r
92         TopologyTemplateYaml yamlTopology;\r
93         try {\r
94             yamlTopology = yamlService.getTopology_template();\r
95         } catch(NullPointerException ex) {\r
96             throw new DataNotFoundException("The ServiceTemplate provided does not contain a TopologyTemplate.");\r
97         }\r
98         try {\r
99             Map<String,RelationshipTemplateYaml> relats = yamlTopology.getRelationship_templates();\r
100             return relats;\r
101         } catch(NullPointerException ex) {\r
102             throw new DataNotFoundException("The ServiceTemplate provided does not contain any RelationshipTemplates.");\r
103         }\r
104 \r
105     }\r
106 \r
107 \r
108     public static String obtainConfiguration(NodeTemplateYaml node) throws BadRequestException {\r
109         ConfigurationYaml yamlConfiguration = null;\r
110         ObjectMapper mapper = new ObjectMapper();\r
111         SimpleModule module = new SimpleModule();\r
112         module.addSerializer(ConfigurationYaml.class, new YamlConfigSerializer());\r
113         mapper.registerModule(module);\r
114 \r
115         // Find out node type, retrieve the corresponding configuration and convert it properly\r
116         try {\r
117             if(node instanceof AntispamNode) {\r
118                 yamlConfiguration = ((AntispamNode)node).getProperties();\r
119             }else if(node instanceof CacheNode) {\r
120                 yamlConfiguration = ((CacheNode)node).getProperties();\r
121             }else if(node instanceof DpiNode) {\r
122                 yamlConfiguration = ((DpiNode)node).getProperties();\r
123             }else if(node instanceof EndhostNode) {\r
124                 yamlConfiguration = ((EndhostNode)node).getProperties();\r
125             }else if(node instanceof EndpointNode) {\r
126                 yamlConfiguration = ((EndpointNode)node).getProperties();\r
127             }else if(node instanceof FieldModifierNode) {\r
128                 yamlConfiguration = ((FieldModifierNode)node).getProperties();\r
129             }else if(node instanceof FirewallNode) {\r
130                 yamlConfiguration = ((FirewallNode)node).getProperties();\r
131             }else if(node instanceof MailClientNode) {\r
132                 yamlConfiguration = ((MailClientNode)node).getProperties();\r
133             }else if(node instanceof MailServerNode) {\r
134                 yamlConfiguration = ((MailServerNode)node).getProperties();\r
135             }else if(node instanceof NatNode) {\r
136                 yamlConfiguration = ((NatNode)node).getProperties();\r
137             }else if(node instanceof VpnAccessNode) {\r
138                 yamlConfiguration = ((VpnAccessNode)node).getProperties();\r
139             }else if(node instanceof VpnExitNode) {\r
140                 yamlConfiguration = ((VpnExitNode)node).getProperties();\r
141             }else if(node instanceof WebClientNode) {\r
142                 yamlConfiguration = ((WebClientNode)node).getProperties();\r
143             }else if(node instanceof WebServerNode) {\r
144                 yamlConfiguration = ((WebServerNode)node).getProperties();\r
145             }else {\r
146                 throw new BadRequestException("The provided node is of unknown type, unable to retrieve the node configuration");\r
147             }\r
148 \r
149             String stringConfiguration = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(yamlConfiguration);\r
150             if (!stringConfiguration.equals("null"))\r
151                 return stringConfiguration;\r
152             else\r
153                 return "[]";\r
154 \r
155         } catch (JsonProcessingException | NullPointerException e) {\r
156             throw new BadRequestException("Not able to retrieve a valid configuration");\r
157         }\r
158     }\r
159 \r
160 }