Merge "Add CLI in verigraph."
[parser.git] / verigraph / src / it / polito / verigraph / tosca / YamlParsingUtils.java
diff --git a/verigraph/src/it/polito/verigraph/tosca/YamlParsingUtils.java b/verigraph/src/it/polito/verigraph/tosca/YamlParsingUtils.java
new file mode 100644 (file)
index 0000000..6e65ac9
--- /dev/null
@@ -0,0 +1,160 @@
+/*******************************************************************************\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