Add CLI in verigraph.
[parser.git] / verigraph / src / it / polito / verigraph / tosca / deserializer / YamlConfigurationDeserializer.java
1 /*******************************************************************************\r
2  * Copyright (c) 2018 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.deserializer;\r
10 \r
11 \r
12 import com.fasterxml.jackson.core.JsonParser;\r
13 import com.fasterxml.jackson.core.JsonProcessingException;\r
14 import com.fasterxml.jackson.core.ObjectCodec;\r
15 import com.fasterxml.jackson.databind.DeserializationContext;\r
16 import com.fasterxml.jackson.databind.JsonDeserializer;\r
17 import com.fasterxml.jackson.databind.JsonNode;\r
18 \r
19 import it.polito.verigraph.tosca.yaml.beans.AntispamConfigurationYaml;\r
20 import it.polito.verigraph.tosca.yaml.beans.CacheConfigurationYaml;\r
21 import it.polito.verigraph.tosca.yaml.beans.ConfigurationYaml;\r
22 import it.polito.verigraph.tosca.yaml.beans.DpiConfigurationYaml;\r
23 import it.polito.verigraph.tosca.yaml.beans.EndhostConfigurationYaml;\r
24 import it.polito.verigraph.tosca.yaml.beans.EndpointConfigurationYaml;\r
25 import it.polito.verigraph.tosca.yaml.beans.FieldModifierConfigurationYaml;\r
26 import it.polito.verigraph.tosca.yaml.beans.FirewallConfigurationYaml;\r
27 import it.polito.verigraph.tosca.yaml.beans.MailClientConfigurationYaml;\r
28 import it.polito.verigraph.tosca.yaml.beans.MailServerConfigurationYaml;\r
29 import it.polito.verigraph.tosca.yaml.beans.NatConfigurationYaml;\r
30 import it.polito.verigraph.tosca.yaml.beans.VpnAccessConfigurationYaml;\r
31 import it.polito.verigraph.tosca.yaml.beans.VpnExitConfigurationYaml;\r
32 import it.polito.verigraph.tosca.yaml.beans.WebClientConfigurationYaml;\r
33 import it.polito.verigraph.tosca.yaml.beans.WebServerConfigurationYaml;\r
34 \r
35 import java.io.IOException;\r
36 import java.util.ArrayList;\r
37 import java.util.HashMap;\r
38 import java.util.Iterator;\r
39 import java.util.List;\r
40 import java.util.Map;\r
41 \r
42 public class YamlConfigurationDeserializer extends JsonDeserializer<ConfigurationYaml> {\r
43 \r
44     @Override\r
45     public ConfigurationYaml deserialize(JsonParser jp, DeserializationContext ctxt)\r
46             throws IOException, JsonProcessingException {\r
47         ObjectCodec oc = jp.getCodec();\r
48         JsonNode node = oc.readTree(jp);\r
49         ConfigurationYaml deserialized;\r
50         boolean emptyConfig = false;\r
51 \r
52         try {\r
53             //Get the content from the array wrapping the JSON configuration\r
54             final Iterator<JsonNode> elements = node.elements();\r
55 \r
56             if(!elements.hasNext()) {\r
57                 //System.out.println("The provided configuration is empty.");\r
58                 emptyConfig = true;\r
59             }\r
60 \r
61             switch ((String)ctxt.findInjectableValue("type", null, null)) {\r
62 \r
63             case "antispam":\r
64                 if(emptyConfig) {\r
65                     deserialized = new AntispamConfigurationYaml();\r
66                     break;\r
67                 }\r
68                 AntispamConfigurationYaml antispam = new AntispamConfigurationYaml();\r
69                 antispam.setSources(new ArrayList<String>());\r
70                 while (elements.hasNext()) {\r
71                     antispam.getSources().add(elements.next().asText());\r
72                 }\r
73                 deserialized = antispam;\r
74                 break;\r
75 \r
76             case "cache":\r
77                 if(emptyConfig) {\r
78                     deserialized = new CacheConfigurationYaml();\r
79                     break;\r
80                 }\r
81                 CacheConfigurationYaml cache = new CacheConfigurationYaml();\r
82                 cache.setResources(new ArrayList<String>());\r
83                 while(elements.hasNext()) {\r
84                     cache.getResources().add(elements.next().asText());\r
85                 }\r
86                 deserialized = cache;\r
87                 break;\r
88 \r
89             case "dpi":\r
90                 if(emptyConfig) {\r
91                     deserialized = new DpiConfigurationYaml();\r
92                     break;\r
93                 }\r
94                 DpiConfigurationYaml dpi = new DpiConfigurationYaml();\r
95                 dpi.setNotAllowedList(new ArrayList<String>());\r
96                 while(elements.hasNext()) {\r
97                     dpi.getNotAllowedList().add(elements.next().asText());\r
98                 }\r
99                 deserialized = dpi;\r
100                 break;\r
101 \r
102             case "endhost":\r
103                 if(emptyConfig) {\r
104                     deserialized = new EndhostConfigurationYaml();\r
105                     break;\r
106                 }\r
107                 EndhostConfigurationYaml endhost = new EndhostConfigurationYaml();\r
108                 JsonNode thisnode = elements.next();\r
109                 if(thisnode.has("body"))\r
110                     endhost.setBody(thisnode.findValue("body").asText());\r
111                 if(thisnode.has("sequence"))\r
112                     endhost.setSequence(Integer.valueOf(thisnode.findValue("sequence").asText()));\r
113                 if(thisnode.has("protocol"))\r
114                     endhost.setProtocol(thisnode.findValue("protocol").asText());\r
115                 if(thisnode.has("email_from"))\r
116                     endhost.setEmail_from(thisnode.findValue("email_from").asText());\r
117                 if(thisnode.has("options"))\r
118                     endhost.setOptions(thisnode.findValue("options").asText());\r
119                 if(thisnode.has("url"))\r
120                     endhost.setUrl(thisnode.findValue("url").asText());\r
121                 if(thisnode.has("destination"))\r
122                     endhost.setDestination(thisnode.findValue("destination").asText());\r
123 \r
124                 deserialized = endhost;\r
125                 break;\r
126 \r
127             case "endpoint":\r
128                 if(emptyConfig) {\r
129                     deserialized = new EndpointConfigurationYaml();\r
130                     break;\r
131                 }\r
132                 EndpointConfigurationYaml endpoint = new EndpointConfigurationYaml();\r
133                 deserialized = endpoint;\r
134                 break;\r
135 \r
136             case "fieldmodifier":\r
137                 if(emptyConfig) {\r
138                     deserialized = new FieldModifierConfigurationYaml();\r
139                     break;\r
140                 }\r
141                 FieldModifierConfigurationYaml fieldmodifier = new FieldModifierConfigurationYaml();\r
142                 deserialized = fieldmodifier;\r
143                 break;\r
144 \r
145             case "firewall":\r
146                 if(emptyConfig) {\r
147                     deserialized = new FirewallConfigurationYaml();\r
148                     break;\r
149                 }\r
150                 FirewallConfigurationYaml firewall = new FirewallConfigurationYaml();\r
151                 firewall.setElements(new HashMap<String,String>());\r
152                 JsonNode current = elements.next();\r
153                 Iterator<Map.Entry<String, JsonNode>> iter = current.fields();\r
154 \r
155                 while (iter.hasNext()) {\r
156                     Map.Entry<String, JsonNode> entry = iter.next();\r
157                     firewall.getElements().put(entry.getKey(), entry.getValue().asText());\r
158                 }\r
159 \r
160                 deserialized = firewall;\r
161                 break;\r
162 \r
163             case "mailclient":\r
164                 if(emptyConfig) {\r
165                     deserialized = new MailClientConfigurationYaml();\r
166                     break;\r
167                 }\r
168                 MailClientConfigurationYaml mailclient = new MailClientConfigurationYaml();\r
169                 mailclient.setMailserver(elements.next().findValue("mailserver").asText());\r
170                 deserialized = mailclient;\r
171                 break;\r
172 \r
173             case "mailserver":\r
174                 if(emptyConfig) {\r
175                     deserialized = new MailServerConfigurationYaml();\r
176                     break;\r
177                 }\r
178                 MailServerConfigurationYaml mailserver = new MailServerConfigurationYaml();\r
179                 deserialized = mailserver;\r
180                 break;\r
181 \r
182             case "nat":\r
183                 if(emptyConfig) {\r
184                     deserialized = new NatConfigurationYaml();\r
185                     break;\r
186                 }\r
187                 NatConfigurationYaml nat = new NatConfigurationYaml();\r
188                 nat.setSources(new ArrayList<String>());\r
189                 while(elements.hasNext()) {\r
190                     nat.getSources().add(elements.next().asText());\r
191                 }\r
192                 deserialized = nat;\r
193                 break;\r
194 \r
195             case "vpnaccess":\r
196                 if(emptyConfig) {\r
197                     deserialized = new VpnAccessConfigurationYaml();\r
198                     break;\r
199                 }\r
200                 VpnAccessConfigurationYaml vpnaccess = new VpnAccessConfigurationYaml();\r
201                 vpnaccess.setVpnexit(elements.next().findValue("vpnexit").asText());\r
202                 deserialized = vpnaccess;\r
203                 break;\r
204 \r
205             case "vpnexit":\r
206                 if(emptyConfig) {\r
207                     deserialized = new VpnExitConfigurationYaml();\r
208                     break;\r
209                 }\r
210                 VpnExitConfigurationYaml vpnexit = new VpnExitConfigurationYaml();\r
211                 vpnexit.setVpnaccess(elements.next().findValue("vpnaccess").asText());\r
212                 deserialized = vpnexit;\r
213                 break;\r
214 \r
215             case "webclient":\r
216                 if(emptyConfig) {\r
217                     deserialized = new WebClientConfigurationYaml();\r
218                     break;\r
219                 }\r
220                 WebClientConfigurationYaml webclient = new WebClientConfigurationYaml();\r
221                 webclient.setNameWebServer(elements.next().findValue("webserver").asText());\r
222                 deserialized = webclient;\r
223                 break;\r
224 \r
225             case "webserver":\r
226                 if(emptyConfig) {\r
227                     deserialized = new WebServerConfigurationYaml();\r
228                     break;\r
229                 }\r
230                 WebServerConfigurationYaml webserver = new WebServerConfigurationYaml();\r
231                 deserialized = webserver;\r
232                 break;\r
233 \r
234             default:\r
235                 deserialized = new FieldModifierConfigurationYaml();\r
236                 break;\r
237             }\r
238 \r
239 \r
240         } catch (Exception e) {\r
241             // TODO Auto-generated catch block\r
242             //System.err.println("Error converting the Json to YamlConfiguration");\r
243             e.printStackTrace();\r
244             return new FieldModifierConfigurationYaml();\r
245         }\r
246 \r
247         return deserialized;\r
248 \r
249     }\r
250 \r
251 }