Merge "Add verigraph code base"
[parser.git] / verigraph / src / main / java / it / polito / escape / verify / deserializer / GraphCustomDeserializer.java
1 /*******************************************************************************
2  * Copyright (c) 2017 Politecnico di Torino and others.
3  *
4  * All rights reserved. This program and the accompanying materials
5  * are made available under the terms of the Apache License, Version 2.0
6  * which accompanies this distribution, and is available at
7  * http://www.apache.org/licenses/LICENSE-2.0
8  *******************************************************************************/
9
10 package it.polito.escape.verify.deserializer;
11
12 import java.io.IOException;
13 import java.util.List;
14 import java.util.Map;
15
16 import com.fasterxml.jackson.core.JsonParseException;
17 import com.fasterxml.jackson.core.JsonParser;
18 import com.fasterxml.jackson.core.JsonProcessingException;
19 import com.fasterxml.jackson.databind.DeserializationContext;
20 import com.fasterxml.jackson.databind.JsonDeserializer;
21 import com.fasterxml.jackson.databind.JsonMappingException;
22 import com.fasterxml.jackson.databind.JsonNode;
23 import com.fasterxml.jackson.databind.ObjectMapper;
24 import com.fasterxml.jackson.databind.type.TypeFactory;
25
26 import it.polito.escape.verify.exception.BadRequestException;
27 import it.polito.escape.verify.exception.InternalServerErrorException;
28 import it.polito.escape.verify.model.Graph;
29 import it.polito.escape.verify.model.Node;
30
31
32 /**
33  * The Class GraphCustomDeserializer is a custom deserializer for a Graph object
34  */
35 public class GraphCustomDeserializer extends JsonDeserializer<Graph>{
36
37         /* (non-Javadoc)
38          * @see com.fasterxml.jackson.databind.JsonDeserializer#deserialize(com.fasterxml.jackson.core.JsonParser, com.fasterxml.jackson.databind.DeserializationContext)
39          */
40         @Override
41         public Graph deserialize(JsonParser jp, DeserializationContext context){
42                 JsonNode root = null;
43                 try {
44                         root = jp.getCodec().readTree(jp);
45                 }
46                 catch (JsonProcessingException e) {
47                         throw new InternalServerErrorException("Error parsing a graph: " + e.getMessage());
48                 }
49                 catch (IOException e) {
50                         throw new InternalServerErrorException("I/O error parsing a graph: " + e.getMessage());
51                 }
52
53                 JsonNode nodesJson = root.get("nodes");
54
55                 if(nodesJson == null)
56                         throw new BadRequestException("Invalid graph");
57
58                 List<Node> nodeList = null;
59                 try {
60                         nodeList = new ObjectMapper().readValue(nodesJson.toString(), TypeFactory.defaultInstance().constructCollectionType(List.class, Node.class));
61                 }
62                 catch (JsonParseException e) {
63                         throw new BadRequestException("Invalid content for a graph: " + e.getMessage());
64                 }
65                 catch (JsonMappingException e) {
66                         throw new BadRequestException("Invalid input json structure for a graph: " + e.getMessage());
67                 }
68                 catch (IOException e) {
69                         throw new InternalServerErrorException("I/O error parsing a graph: " + e.getMessage());
70                 }
71
72                 Graph graph = new Graph();
73                 if(root.get("id") != null){
74                         long graphId = root.get("id").asLong();
75                         graph.setId(graphId);
76                 }
77                 Map<Long, Node> nodes = graph.getNodes();
78
79                 long numberOfNodes = 0;
80                 for (Node node : nodeList){
81                         nodes.put(++numberOfNodes, node);
82                 }
83                 return graph;
84
85         }
86
87 }