]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.charts/src/org/simantics/charts/internal/JsonUtils.java
Added support for JSON PlainTextTransferable to charts and subscriptions
[simantics/platform.git] / bundles / org.simantics.charts / src / org / simantics / charts / internal / JsonUtils.java
diff --git a/bundles/org.simantics.charts/src/org/simantics/charts/internal/JsonUtils.java b/bundles/org.simantics.charts/src/org/simantics/charts/internal/JsonUtils.java
new file mode 100644 (file)
index 0000000..31861ea
--- /dev/null
@@ -0,0 +1,71 @@
+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