--- /dev/null
+/*******************************************************************************\r
+ * Copyright (c) 2017/18 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;\r
+\r
+import java.io.File;\r
+import java.io.IOException;\r
+import java.io.StringWriter;\r
+import java.util.Map;\r
+\r
+import javax.xml.bind.JAXBException;\r
+\r
+import com.fasterxml.jackson.core.JsonParseException;\r
+import com.fasterxml.jackson.core.JsonParser;\r
+import com.fasterxml.jackson.core.JsonProcessingException;\r
+import com.fasterxml.jackson.databind.JsonMappingException;\r
+import com.fasterxml.jackson.databind.ObjectMapper;\r
+import com.fasterxml.jackson.databind.module.SimpleModule;\r
+import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;\r
+\r
+import it.polito.verigraph.exception.BadRequestException;\r
+import it.polito.verigraph.exception.DataNotFoundException;\r
+import it.polito.verigraph.exception.InvalidServiceTemplateException;\r
+import it.polito.verigraph.tosca.serializer.YamlConfigSerializer;\r
+import it.polito.verigraph.tosca.yaml.beans.AntispamNode;\r
+import it.polito.verigraph.tosca.yaml.beans.CacheNode;\r
+import it.polito.verigraph.tosca.yaml.beans.ConfigurationYaml;\r
+import it.polito.verigraph.tosca.yaml.beans.DpiNode;\r
+import it.polito.verigraph.tosca.yaml.beans.EndhostNode;\r
+import it.polito.verigraph.tosca.yaml.beans.EndpointNode;\r
+import it.polito.verigraph.tosca.yaml.beans.FieldModifierNode;\r
+import it.polito.verigraph.tosca.yaml.beans.FirewallNode;\r
+import it.polito.verigraph.tosca.yaml.beans.MailClientNode;\r
+import it.polito.verigraph.tosca.yaml.beans.MailServerNode;\r
+import it.polito.verigraph.tosca.yaml.beans.NatNode;\r
+import it.polito.verigraph.tosca.yaml.beans.NodeTemplateYaml;\r
+import it.polito.verigraph.tosca.yaml.beans.RelationshipTemplateYaml;\r
+import it.polito.verigraph.tosca.yaml.beans.ServiceTemplateYaml;\r
+import it.polito.verigraph.tosca.yaml.beans.TopologyTemplateYaml;\r
+import it.polito.verigraph.tosca.yaml.beans.VpnAccessNode;\r
+import it.polito.verigraph.tosca.yaml.beans.VpnExitNode;\r
+import it.polito.verigraph.tosca.yaml.beans.WebClientNode;\r
+import it.polito.verigraph.tosca.yaml.beans.WebServerNode;\r
+\r
+public class YamlParsingUtils {\r
+\r
+ public static ServiceTemplateYaml obtainServiceTemplate(String filePath) throws InvalidServiceTemplateException {\r
+ ServiceTemplateYaml yamlServiceTemplate = new ServiceTemplateYaml();\r
+ ObjectMapper mapper = new ObjectMapper(new YAMLFactory());\r
+ mapper.enable(JsonParser.Feature.STRICT_DUPLICATE_DETECTION);\r
+\r
+ try {\r
+ yamlServiceTemplate = mapper.readValue(new File(filePath), ServiceTemplateYaml.class);\r
+ return yamlServiceTemplate;\r
+\r
+ } catch (JsonParseException e) {\r
+ throw new InvalidServiceTemplateException("The NodeTemplate IDs and the RelationshipTemplate IDs must be unique.");\r
+ } catch (JsonMappingException e) {\r
+ throw new InvalidServiceTemplateException("The provided file does not match the expected structure.");\r
+ } catch (InvalidServiceTemplateException e) {\r
+ throw new InvalidServiceTemplateException("The provided template contains errors or missing informations.");\r
+ } catch (IOException e) {\r
+ throw new InvalidServiceTemplateException("I/O error.");\r
+ }\r
+\r
+ }\r
+\r
+\r
+ public static Map<String, NodeTemplateYaml> obtainNodeTemplates(ServiceTemplateYaml yamlService) throws DataNotFoundException {\r
+ TopologyTemplateYaml yamlTopology;\r
+ try {\r
+ yamlTopology = yamlService.getTopology_template();\r
+ } catch(NullPointerException ex) {\r
+ throw new DataNotFoundException("The ServiceTemplate provided does not contain a TopologyTemplate.");\r
+ }\r
+ try {\r
+ Map<String, NodeTemplateYaml> nodes = yamlTopology.getNode_templates();\r
+ return nodes;\r
+ } catch(NullPointerException ex) {\r
+ throw new DataNotFoundException("The ServiceTemplate provided does not contain any NodeTemplates.");\r
+ }\r
+\r
+ }\r
+\r
+\r
+ public static Map<String, RelationshipTemplateYaml> obtainRelationshipTemplates(ServiceTemplateYaml yamlService) throws DataNotFoundException {\r
+ TopologyTemplateYaml yamlTopology;\r
+ try {\r
+ yamlTopology = yamlService.getTopology_template();\r
+ } catch(NullPointerException ex) {\r
+ throw new DataNotFoundException("The ServiceTemplate provided does not contain a TopologyTemplate.");\r
+ }\r
+ try {\r
+ Map<String,RelationshipTemplateYaml> relats = yamlTopology.getRelationship_templates();\r
+ return relats;\r
+ } catch(NullPointerException ex) {\r
+ throw new DataNotFoundException("The ServiceTemplate provided does not contain any RelationshipTemplates.");\r
+ }\r
+\r
+ }\r
+\r
+\r
+ public static String obtainConfiguration(NodeTemplateYaml node) throws BadRequestException {\r
+ ConfigurationYaml yamlConfiguration = null;\r
+ ObjectMapper mapper = new ObjectMapper();\r
+ SimpleModule module = new SimpleModule();\r
+ module.addSerializer(ConfigurationYaml.class, new YamlConfigSerializer());\r
+ mapper.registerModule(module);\r
+\r
+ // Find out node type, retrieve the corresponding configuration and convert it properly\r
+ try {\r
+ if(node instanceof AntispamNode) {\r
+ yamlConfiguration = ((AntispamNode)node).getProperties();\r
+ }else if(node instanceof CacheNode) {\r
+ yamlConfiguration = ((CacheNode)node).getProperties();\r
+ }else if(node instanceof DpiNode) {\r
+ yamlConfiguration = ((DpiNode)node).getProperties();\r
+ }else if(node instanceof EndhostNode) {\r
+ yamlConfiguration = ((EndhostNode)node).getProperties();\r
+ }else if(node instanceof EndpointNode) {\r
+ yamlConfiguration = ((EndpointNode)node).getProperties();\r
+ }else if(node instanceof FieldModifierNode) {\r
+ yamlConfiguration = ((FieldModifierNode)node).getProperties();\r
+ }else if(node instanceof FirewallNode) {\r
+ yamlConfiguration = ((FirewallNode)node).getProperties();\r
+ }else if(node instanceof MailClientNode) {\r
+ yamlConfiguration = ((MailClientNode)node).getProperties();\r
+ }else if(node instanceof MailServerNode) {\r
+ yamlConfiguration = ((MailServerNode)node).getProperties();\r
+ }else if(node instanceof NatNode) {\r
+ yamlConfiguration = ((NatNode)node).getProperties();\r
+ }else if(node instanceof VpnAccessNode) {\r
+ yamlConfiguration = ((VpnAccessNode)node).getProperties();\r
+ }else if(node instanceof VpnExitNode) {\r
+ yamlConfiguration = ((VpnExitNode)node).getProperties();\r
+ }else if(node instanceof WebClientNode) {\r
+ yamlConfiguration = ((WebClientNode)node).getProperties();\r
+ }else if(node instanceof WebServerNode) {\r
+ yamlConfiguration = ((WebServerNode)node).getProperties();\r
+ }else {\r
+ throw new BadRequestException("The provided node is of unknown type, unable to retrieve the node configuration");\r
+ }\r
+\r
+ String stringConfiguration = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(yamlConfiguration);\r
+ if (!stringConfiguration.equals("null"))\r
+ return stringConfiguration;\r
+ else\r
+ return "[]";\r
+\r
+ } catch (JsonProcessingException | NullPointerException e) {\r
+ throw new BadRequestException("Not able to retrieve a valid configuration");\r
+ }\r
+ }\r
+\r
+}
\ No newline at end of file