From a42de79292d9541db7865b54e93be2d0b6e6a094 Mon Sep 17 00:00:00 2001 From: "serena.spinoso" Date: Thu, 7 Sep 2017 10:22:39 +0200 Subject: update verigraph JIRA: PARSER-154 code optimizations about graph manipulation and formula generation. Change-Id: Idebef19b128281aa2bc40d1aeab6e208c7ddd93d Signed-off-by: serena.spinoso --- .../it/polito/neo4j/translator/GraphToNeo4j.java | 614 +++++++++++++++++++++ 1 file changed, 614 insertions(+) create mode 100644 verigraph/src/it/polito/neo4j/translator/GraphToNeo4j.java (limited to 'verigraph/src/it/polito/neo4j/translator/GraphToNeo4j.java') diff --git a/verigraph/src/it/polito/neo4j/translator/GraphToNeo4j.java b/verigraph/src/it/polito/neo4j/translator/GraphToNeo4j.java new file mode 100644 index 0000000..8641cbc --- /dev/null +++ b/verigraph/src/it/polito/neo4j/translator/GraphToNeo4j.java @@ -0,0 +1,614 @@ +/******************************************************************************* + * Copyright (c) 2017 Politecnico di Torino and others. + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution, and is available at + * http://www.apache.org/licenses/LICENSE-2.0 + *******************************************************************************/ +package it.polito.neo4j.translator; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import static javax.xml.XMLConstants.W3C_XML_SCHEMA_NS_URI; + +import java.io.File; +import java.io.IOException; +import java.io.StringWriter; +import java.math.BigInteger; +import java.util.HashMap; +import java.util.Iterator; +import java.util.LinkedHashMap; +import java.util.LinkedList; + +import javax.xml.bind.JAXBContext; +import javax.xml.bind.JAXBElement; +import javax.xml.bind.JAXBException; +import javax.xml.bind.Marshaller; +import javax.xml.bind.UnmarshalException; +import javax.xml.bind.Unmarshaller; +import javax.xml.bind.ValidationEvent; +import javax.xml.bind.ValidationEventHandler; +import javax.xml.bind.ValidationEventLocator; +import javax.xml.stream.FactoryConfigurationError; +import javax.xml.stream.XMLOutputFactory; +import javax.xml.stream.XMLStreamException; +import javax.xml.stream.XMLStreamWriter; +import javax.xml.validation.Schema; +import javax.xml.validation.SchemaFactory; + +import com.fasterxml.jackson.core.JsonFactory; +import com.fasterxml.jackson.core.JsonGenerationException; +import com.fasterxml.jackson.core.JsonParseException; +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.JsonMappingException; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.node.ArrayNode; +import com.fasterxml.jackson.databind.node.ObjectNode; +import com.fasterxml.jackson.databind.util.JSONWrappedObject; + +import it.polito.neo4j.jaxb.Antispam; +import it.polito.neo4j.jaxb.Cache; +import it.polito.neo4j.jaxb.Dpi; +import it.polito.neo4j.jaxb.Elements; +import it.polito.neo4j.jaxb.Endhost; +import it.polito.neo4j.jaxb.Endpoint; +import it.polito.neo4j.jaxb.Fieldmodifier; +import it.polito.neo4j.jaxb.Firewall; +import it.polito.neo4j.jaxb.FunctionalTypes; +import it.polito.neo4j.jaxb.Graph; +import it.polito.neo4j.jaxb.Node; +import it.polito.neo4j.jaxb.ObjectFactory; +import it.polito.neo4j.jaxb.ProtocolTypes; +import it.polito.neo4j.jaxb.Vpnaccess; +import it.polito.neo4j.jaxb.Vpnexit; +import it.polito.neo4j.jaxb.Webclient; +import it.polito.neo4j.jaxb.Webserver; +import it.polito.verigraph.model.Configuration; +import it.polito.verigraph.service.VerigraphLogger; +import it.polito.neo4j.jaxb.Graphs; +import it.polito.neo4j.jaxb.Mailclient; +import it.polito.neo4j.jaxb.Mailserver; +import it.polito.neo4j.jaxb.Nat; +import it.polito.neo4j.jaxb.Neighbour; + +public class GraphToNeo4j { + public static VerigraphLogger vlogger = VerigraphLogger.getVerigraphlogger(); + public static it.polito.neo4j.jaxb.Graph generateObject(it.polito.verigraph.model.Graph gr) throws JsonParseException, JsonMappingException, IOException { + it.polito.neo4j.jaxb.Graph graph; + graph=(new ObjectFactory()).createGraph(); + graph.setId(gr.getId()); + + List nodes=new ArrayList(); + for(Map.Entry c : gr.getNodes().entrySet()){ + it.polito.neo4j.jaxb.Node node=(new ObjectFactory()).createNode(); + node.setId(c.getValue().getId()); + node.setName(c.getValue().getName()); + node.setFunctionalType(FunctionalTypes.fromValue(c.getValue().getFunctional_type().toUpperCase())); + List neighbours=new ArrayList(); + + /* setNeighbours*/ + for(Map.Entry a : c.getValue().getNeighbours().entrySet()){ + Neighbour neighbour=(new ObjectFactory()).createNeighbour(); + neighbour.setId(a.getValue().getId()); + neighbour.setName(a.getValue().getName()); + neighbours.add(neighbour); + } + node.getNeighbour().addAll(neighbours); + + /* setConfigurations */ + it.polito.neo4j.jaxb.Configuration configuration=(new ObjectFactory()).createConfiguration(); + JsonNode json=c.getValue().getConfiguration().getConfiguration(); + setConfiguration(configuration, c.getValue(), json); + node.setConfiguration(configuration); + nodes.add(node); + } + graph.getNode().addAll(nodes); + return graph; + } + + public static it.polito.neo4j.jaxb.Configuration ConfToNeo4j(it.polito.verigraph.model.Configuration nodeConfiguration, it.polito.verigraph.model.Node node) throws JsonParseException, JsonMappingException, IOException { + it.polito.neo4j.jaxb.Configuration configuration=(new ObjectFactory()).createConfiguration(); + JsonNode nodes=nodeConfiguration.getConfiguration(); + setConfiguration(configuration, node, nodes); + + return configuration; + + } + + @SuppressWarnings("unchecked") + private static void setConfiguration(it.polito.neo4j.jaxb.Configuration configuration, it.polito.verigraph.model.Node node, JsonNode nodes) throws JsonParseException, JsonMappingException, IOException { + + String empty="[]"; + + switch(node.getFunctional_type().toUpperCase()){ + case "FIREWALL":{ + configuration.setName(node.getFunctional_type().toLowerCase()); + Firewall firewall=new Firewall(); + List elements_list=new ArrayList(); + + if(!nodes.toString().equals(empty)){ + ObjectMapper mapper=new ObjectMapper(); + java.util.Map map=new LinkedHashMap(); + String input; + Matcher matcher = Pattern.compile("\\[([^\\]]*)\\]").matcher(nodes.toString()); + if(matcher.find()){ + input=matcher.group(1); + }else + input=nodes.toString(); + Pattern pattern=Pattern.compile("\\{([^\\}]*)\\}"); + List list = new ArrayList(); + Matcher match= pattern.matcher(input); + while (match.find()) { + list.add(match.group()); + } + + try{ + for(String string : list){ + map.putAll(mapper.readValue(string, LinkedHashMap.class)); + } + for(java.util.Map.Entry m : map.entrySet()){ + Elements e=new Elements(); + e.setDestination(m.getKey()); + e.setSource(m.getValue()); + elements_list.add(e); + } + + }catch(JsonGenerationException e) { + e.printStackTrace(); + } catch (JsonMappingException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } + } + else{ + vlogger.logger.info("elements_list of Firewall " +node.getName()+" empty"); + } + firewall.getElements().addAll(elements_list); + configuration.setFirewall(firewall); + break; + } + case "ANTISPAM":{ + configuration.setName(node.getFunctional_type().toLowerCase()); + Antispam antispam=new Antispam(); + List source=new ArrayList(); + + if(!nodes.toString().equals(empty)){ + ObjectMapper mapper=new ObjectMapper(); + List list=new ArrayList(); + + try { + + list = mapper.readValue(nodes.toString(), ArrayList.class); + + for(String s : list){ + source.add(s); + } + + } catch (JsonGenerationException e) { + e.printStackTrace(); + } catch (JsonMappingException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } + } + else{ + vlogger.logger.info("Antispam " +node.getName()+" empty"); + + } + antispam.getSource().addAll(source); + configuration.setAntispam(antispam); + break; + } + case "CACHE":{ + configuration.setName(node.getFunctional_type().toLowerCase()); + Cache cache=new Cache(); + List resource=new ArrayList(); + + if(!nodes.toString().equals(empty)){ + ObjectMapper mapper=new ObjectMapper(); + + List list=new ArrayList(); + try { + + list = mapper.readValue(nodes.toString(), ArrayList.class); + + for(String s : list){ + resource.add(s); + } + + } catch (JsonGenerationException e) { + e.printStackTrace(); + } catch (JsonMappingException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } + } + else{ + vlogger.logger.info("Cache " +node.getName()+" empty"); + + } + cache.getResource().addAll(resource); + configuration.setCache(cache); + break; + + } + case "DPI":{ + configuration.setName(node.getFunctional_type().toLowerCase()); + Dpi dpi=new Dpi(); + List notAllowed=new ArrayList(); + + if(!nodes.toString().equals(empty)){ + ObjectMapper mapper=new ObjectMapper(); + + List list=new ArrayList(); + try { + + list = mapper.readValue(nodes.toString(), ArrayList.class); + + for(String s : list){ + notAllowed.add(s); + } + + } catch (JsonGenerationException e) { + e.printStackTrace(); + } catch (JsonMappingException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } + + } + else{ + vlogger.logger.info("Dpi " +node.getName()+" empty"); + + } + dpi.getNotAllowed().addAll(notAllowed); + configuration.setDpi(dpi); + break; + } + case "ENDHOST":{ + configuration.setName(node.getFunctional_type().toLowerCase()); + Endhost endhost=new Endhost(); + + if(!nodes.toString().equals(empty)){ + ObjectMapper mapper=new ObjectMapper(); + java.util.Map map=new LinkedHashMap(); + String input; + Matcher matcher = Pattern.compile("\\[([^\\]]*)\\]").matcher(nodes.toString()); + if(matcher.find()){ + input=matcher.group(1); + }else + input=nodes.toString(); + + try{ + map=mapper.readValue(input, java.util.LinkedHashMap.class); + for(java.util.Map.Entry m : map.entrySet()){ + switch(m.getKey()){ + case "body":{ + endhost.setBody(m.getValue()); + break; + } + case"sequence":{ + endhost.setSequence(new BigInteger(m.getValue())); + break; + } + case "protocol":{ + endhost.setProtocol(ProtocolTypes.fromValue(m.getValue())); + break; + } + case "email_from":{ + endhost.setEmailFrom(m.getValue()); + break; + } + case "url":{ + endhost.setUrl(m.getValue()); + break; + } + case "option":{ + endhost.setOptions(m.getValue()); + break; + } + case "destination":{ + endhost.setDestination(m.getValue()); + break; + } + } + } + + }catch(JsonGenerationException e) { + e.printStackTrace(); + } catch (JsonMappingException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } + } + else{ + vlogger.logger.info("Endhost " +node.getName()+" empty"); + + } + configuration.setEndhost(endhost); + break; + } + case "ENDPOINT":{ + configuration.setName(node.getFunctional_type().toLowerCase()); + Endpoint endpoint=new Endpoint(); + configuration.setEndpoint(endpoint); + break; + } + case "FIELDMODIFIER":{ + + configuration.setName(node.getFunctional_type()); + Fieldmodifier fieldmodifier=new Fieldmodifier(); + configuration.setFieldmodifier(fieldmodifier); + break; + } + + case "MAILCLIENT":{ + configuration.setName(node.getFunctional_type().toLowerCase()); + Mailclient mailclient=new Mailclient(); + + ObjectMapper mapper=new ObjectMapper(); + java.util.Map map=new LinkedHashMap(); + String input; + Matcher matcher = Pattern.compile("\\[([^\\]]*)\\]").matcher(nodes.toString()); + if(matcher.find()){ + input=matcher.group(1); + }else + input=nodes.toString(); + + Pattern pattern=Pattern.compile("\\{([^\\}]*)\\}"); + List list = new ArrayList(); + Matcher match= pattern.matcher(input); + while (match.find()) { + list.add(match.group()); + } + + try{ + for(String string : list){ + map.putAll(mapper.readValue(string, LinkedHashMap.class)); + if(map!=null || !map.isEmpty()){ + for(java.util.Map.Entry m : map.entrySet()){ + switch(m.getKey()){ + case "mailserver":{ + mailclient.setMailserver(m.getValue()); + break; + } + default: + vlogger.logger.info("\"mailserver\" object is required"); + break; + } + } + } + } + }catch(JsonGenerationException e) { + e.printStackTrace(); + } catch (JsonMappingException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } + configuration.setMailclient(mailclient); + break; + } + case "MAILSERVER":{ + configuration.setName(node.getFunctional_type().toLowerCase()); + Mailserver mailserver=new Mailserver(); + configuration.setMailserver(mailserver); + break; + } + case "NAT":{ + configuration.setName(node.getFunctional_type().toLowerCase()); + Nat nat=new Nat(); + List source=new ArrayList(); + + if(!nodes.toString().equals(empty)){ + ObjectMapper mapper=new ObjectMapper(); + List list=new ArrayList(); + try { + + list = mapper.readValue(nodes.toString(), ArrayList.class); + + for(String s : list){ + source.add(s); + } + } catch (JsonGenerationException e) { + e.printStackTrace(); + } catch (JsonMappingException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } + } + else{ + vlogger.logger.info("Nat " +node.getName()+" empty"); + } + nat.getSource().addAll(source); + configuration.setNat(nat); + break; + } + case "VPNACCESS":{ + configuration.setName(node.getFunctional_type().toLowerCase()); + Vpnaccess vpnaccess=new Vpnaccess(); + ObjectMapper mapper=new ObjectMapper(); + java.util.Map map=new LinkedHashMap(); + String input; + Matcher matcher = Pattern.compile("\\[([^\\]]*)\\]").matcher(nodes.toString()); + if(matcher.find()){ + input=matcher.group(1); + }else + input=nodes.toString(); + + Pattern pattern=Pattern.compile("\\{([^\\}]*)\\}"); + List list = new ArrayList(); + Matcher match= pattern.matcher(input); + while (match.find()) { + list.add(match.group()); + } + try{ + for(String string : list){ + map.putAll(mapper.readValue(string, LinkedHashMap.class)); + if(map!=null || !map.isEmpty()){ + for(java.util.Map.Entry m : map.entrySet()){ + switch(m.getKey()){ + case "vpnexit":{ + vpnaccess.setVpnexit(m.getValue()); + break; + } + default: + vlogger.logger.info("\"vpnexit\" is required"); + break; + } + } + } + } + }catch(JsonGenerationException e) { + e.printStackTrace(); + } catch (JsonMappingException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } + configuration.setVpnaccess(vpnaccess); + break; + } + case "VPNEXIT":{ + configuration.setName(node.getFunctional_type().toLowerCase()); + Vpnexit vpnexit=new Vpnexit(); + + ObjectMapper mapper=new ObjectMapper(); + java.util.Map map=new LinkedHashMap(); + String input; + Matcher matcher = Pattern.compile("\\[([^\\]]*)\\]").matcher(nodes.toString()); + if(matcher.find()){ + input=matcher.group(1); + }else + input=nodes.toString(); + + Pattern pattern=Pattern.compile("\\{([^\\}]*)\\}"); + List list = new ArrayList(); + Matcher match= pattern.matcher(input); + while (match.find()) { + list.add(match.group()); + } + + try{ + for(String string : list){ + /* there is only 1 string */ + map.putAll(mapper.readValue(string, LinkedHashMap.class)); + if(map!=null || !map.isEmpty()){ + for(java.util.Map.Entry m : map.entrySet()){ + switch(m.getKey()){ + case "vpnaccess":{ + vpnexit.setVpnaccess(m.getValue()); + break; + } + default:{ + vlogger.logger.info("\"vpnaccess\" is required"); + break; + } + } + } + } + } + }catch(JsonGenerationException e) { + e.printStackTrace(); + } catch (JsonMappingException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } + configuration.setVpnexit(vpnexit); + break; + } + case "WEBCLIENT":{ + configuration.setName(node.getFunctional_type().toLowerCase()); + Webclient webclient=new Webclient(); + ObjectMapper mapper=new ObjectMapper(); + java.util.Map map=new LinkedHashMap(); + String input; + Matcher matcher = Pattern.compile("\\[([^\\]]*)\\]").matcher(nodes.toString()); + if(matcher.find()){ + input=matcher.group(1); + }else + input=nodes.toString(); + + Pattern pattern=Pattern.compile("\\{([^\\}]*)\\}"); + List list = new ArrayList(); + Matcher match= pattern.matcher(input); + while (match.find()) { + list.add(match.group()); + } + try{ + for(String string : list){ + map.putAll(mapper.readValue(string, LinkedHashMap.class)); + if(map!=null || !map.isEmpty()){ + for(java.util.Map.Entry m : map.entrySet()){ + switch(m.getKey()){ + case "webserver":{ + webclient.setNameWebServer(m.getValue()); + break; + } + default:{ + vlogger.logger.info("\"webserver\" object is required"); + break; + } + } + } + } + } + }catch(JsonGenerationException e) { + e.printStackTrace(); + } catch (JsonMappingException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } + configuration.setWebclient(webclient); + break; + } + case "WEBSERVER":{ + configuration.setName(node.getFunctional_type().toLowerCase()); + Webserver webserver=new Webserver(); + configuration.setWebserver(webserver); + break; + } + } + } + + public static Neighbour NeighbourToNeo4j(it.polito.verigraph.model.Neighbour n){ + Neighbour neighbourRoot; + neighbourRoot=(new ObjectFactory()).createNeighbour(); + neighbourRoot.setId(n.getId()); + neighbourRoot.setName(n.getName()); + return neighbourRoot; + } + + public static Node NodeToNeo4j(it.polito.verigraph.model.Node n) throws JsonParseException, JsonMappingException, IOException{ + Node nodeRoot; + it.polito.neo4j.jaxb.Configuration configuration=(new ObjectFactory()).createConfiguration(); + nodeRoot=(new ObjectFactory()).createNode(); + nodeRoot.setId(n.getId()); + nodeRoot.setName(n.getName()); + nodeRoot.setFunctionalType(FunctionalTypes.fromValue(n.getFunctional_type().toUpperCase())); + for(Map.Entry neighbour : n.getNeighbours().entrySet()){ + it.polito.verigraph.model.Neighbour neighb=neighbour.getValue(); + nodeRoot.getNeighbour().add(NeighbourToNeo4j(neighb)); + } + JsonNode json=n.getConfiguration().getConfiguration(); + setConfiguration(configuration, n, json); + nodeRoot.setConfiguration(configuration); + return nodeRoot; + } +} \ No newline at end of file -- cgit 1.2.3-korg