]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.charts/src/org/simantics/charts/internal/JsonUtils.java
Sync git svn branch with SVN repository r33406.
[simantics/platform.git] / bundles / org.simantics.charts / src / org / simantics / charts / internal / JsonUtils.java
1 package org.simantics.charts.internal;\r
2 \r
3 import java.io.IOException;\r
4 import java.util.Optional;\r
5 \r
6 import org.simantics.db.ReadGraph;\r
7 import org.simantics.db.RequestProcessor;\r
8 import org.simantics.db.common.request.UniqueRead;\r
9 import org.simantics.db.exception.DatabaseException;\r
10 import org.simantics.db.layer0.variable.Variable;\r
11 import org.simantics.db.layer0.variable.Variables;\r
12 \r
13 import com.fasterxml.jackson.core.JsonFactory;\r
14 import com.fasterxml.jackson.core.JsonParser;\r
15 import com.fasterxml.jackson.core.JsonToken;\r
16 \r
17 /**\r
18  * @author Tuukka Lehtonen\r
19  *\r
20  */\r
21 public class JsonUtils {\r
22 \r
23     public static Optional<Variable> tryParseJsonPropertyVariable(RequestProcessor processor, String json) throws DatabaseException {\r
24         return processor.syncRequest(new UniqueRead<Optional<Variable>>() {\r
25             @Override\r
26             public Optional<Variable> perform(ReadGraph graph) throws DatabaseException {\r
27                 return tryParseJsonPropertyVariable(graph, json);\r
28             }\r
29         });\r
30     }\r
31 \r
32     public static Optional<Variable> tryParseJsonPropertyVariable(ReadGraph graph, String json) throws DatabaseException {\r
33         try (JsonParser jp = new JsonFactory().createParser(json)) {\r
34             return JsonUtils.readPossibleVariable(graph, jp);\r
35         } catch (IOException e) {\r
36             throw new DatabaseException(e);\r
37         }\r
38     }\r
39 \r
40     public static Optional<Variable> readPossibleVariable(ReadGraph graph, JsonParser jp) throws IOException, DatabaseException {\r
41         Optional<String> uri = readPossibleVariableUri(jp);\r
42         return uri.isPresent() ? Optional.ofNullable(Variables.getPossibleVariable(graph, uri.get())) : Optional.empty();\r
43     }\r
44 \r
45     public static Optional<String> readPossibleVariableUri(JsonParser jp) throws IOException {\r
46         // Sanity check: verify that we got "Json Object":\r
47         if (jp.nextToken() != JsonToken.START_OBJECT)\r
48             throw new IOException("Expected data to start with an Object");\r
49 \r
50         String uri = null;\r
51         String type = null;\r
52         String defaultPropertyUri = null;\r
53 \r
54         while (jp.nextToken() != JsonToken.END_OBJECT) {\r
55             String fieldName = jp.getCurrentName();\r
56             jp.nextToken();\r
57             if (fieldName.equals("uri")) {\r
58                 uri = jp.getValueAsString();\r
59             } else if (fieldName.equals("type")) {\r
60                 type = jp.getValueAsString();\r
61             } else if (fieldName.equals("defaultPropertyUri")) {\r
62                 defaultPropertyUri = jp.getValueAsString();\r
63             }\r
64         }\r
65 \r
66         return Optional.ofNullable("Variable".equals(type) ?\r
67                 defaultPropertyUri != null ? defaultPropertyUri : uri\r
68                         : null);\r
69     }\r
70 \r
71 }\r