--- /dev/null
+package org.simantics.charts.internal;\r
+\r
+import java.io.IOException;\r
+import java.util.Optional;\r
+\r
+import org.simantics.db.ReadGraph;\r
+import org.simantics.db.RequestProcessor;\r
+import org.simantics.db.common.request.UniqueRead;\r
+import org.simantics.db.exception.DatabaseException;\r
+import org.simantics.db.layer0.variable.Variable;\r
+import org.simantics.db.layer0.variable.Variables;\r
+\r
+import com.fasterxml.jackson.core.JsonFactory;\r
+import com.fasterxml.jackson.core.JsonParser;\r
+import com.fasterxml.jackson.core.JsonToken;\r
+\r
+/**\r
+ * @author Tuukka Lehtonen\r
+ *\r
+ */\r
+public class JsonUtils {\r
+\r
+ public static Optional<Variable> tryParseJsonPropertyVariable(RequestProcessor processor, String json) throws DatabaseException {\r
+ return processor.syncRequest(new UniqueRead<Optional<Variable>>() {\r
+ @Override\r
+ public Optional<Variable> perform(ReadGraph graph) throws DatabaseException {\r
+ return tryParseJsonPropertyVariable(graph, json);\r
+ }\r
+ });\r
+ }\r
+\r
+ public static Optional<Variable> tryParseJsonPropertyVariable(ReadGraph graph, String json) throws DatabaseException {\r
+ try (JsonParser jp = new JsonFactory().createParser(json)) {\r
+ return JsonUtils.readPossibleVariable(graph, jp);\r
+ } catch (IOException e) {\r
+ throw new DatabaseException(e);\r
+ }\r
+ }\r
+\r
+ public static Optional<Variable> readPossibleVariable(ReadGraph graph, JsonParser jp) throws IOException, DatabaseException {\r
+ Optional<String> uri = readPossibleVariableUri(jp);\r
+ return uri.isPresent() ? Optional.ofNullable(Variables.getPossibleVariable(graph, uri.get())) : Optional.empty();\r
+ }\r
+\r
+ public static Optional<String> readPossibleVariableUri(JsonParser jp) throws IOException {\r
+ // Sanity check: verify that we got "Json Object":\r
+ if (jp.nextToken() != JsonToken.START_OBJECT)\r
+ throw new IOException("Expected data to start with an Object");\r
+\r
+ String uri = null;\r
+ String type = null;\r
+ String defaultPropertyUri = null;\r
+\r
+ while (jp.nextToken() != JsonToken.END_OBJECT) {\r
+ String fieldName = jp.getCurrentName();\r
+ jp.nextToken();\r
+ if (fieldName.equals("uri")) {\r
+ uri = jp.getValueAsString();\r
+ } else if (fieldName.equals("type")) {\r
+ type = jp.getValueAsString();\r
+ } else if (fieldName.equals("defaultPropertyUri")) {\r
+ defaultPropertyUri = jp.getValueAsString();\r
+ }\r
+ }\r
+\r
+ return Optional.ofNullable("Variable".equals(type) ?\r
+ defaultPropertyUri != null ? defaultPropertyUri : uri\r
+ : null);\r
+ }\r
+\r
+}\r