1 /*******************************************************************************
\r
2 * Copyright (c) 2017/18 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;
\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
16 import javax.xml.bind.JAXBException;
\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
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
50 public class YamlParsingUtils {
\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
58 yamlServiceTemplate = mapper.readValue(new File(filePath), ServiceTemplateYaml.class);
\r
59 return yamlServiceTemplate;
\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
74 public static Map<String, NodeTemplateYaml> obtainNodeTemplates(ServiceTemplateYaml yamlService) throws DataNotFoundException {
\r
75 TopologyTemplateYaml yamlTopology;
\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
82 Map<String, NodeTemplateYaml> nodes = yamlTopology.getNode_templates();
\r
84 } catch(NullPointerException ex) {
\r
85 throw new DataNotFoundException("The ServiceTemplate provided does not contain any NodeTemplates.");
\r
91 public static Map<String, RelationshipTemplateYaml> obtainRelationshipTemplates(ServiceTemplateYaml yamlService) throws DataNotFoundException {
\r
92 TopologyTemplateYaml yamlTopology;
\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
99 Map<String,RelationshipTemplateYaml> relats = yamlTopology.getRelationship_templates();
\r
101 } catch(NullPointerException ex) {
\r
102 throw new DataNotFoundException("The ServiceTemplate provided does not contain any RelationshipTemplates.");
\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
115 // Find out node type, retrieve the corresponding configuration and convert it properly
\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
146 throw new BadRequestException("The provided node is of unknown type, unable to retrieve the node configuration");
\r
149 String stringConfiguration = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(yamlConfiguration);
\r
150 if (!stringConfiguration.equals("null"))
\r
151 return stringConfiguration;
\r
155 } catch (JsonProcessingException | NullPointerException e) {
\r
156 throw new BadRequestException("Not able to retrieve a valid configuration");
\r