1 package org.simantics.charts.internal;
\r
3 import java.io.IOException;
\r
4 import java.util.Optional;
\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
13 import com.fasterxml.jackson.core.JsonFactory;
\r
14 import com.fasterxml.jackson.core.JsonParser;
\r
15 import com.fasterxml.jackson.core.JsonToken;
\r
18 * @author Tuukka Lehtonen
\r
21 public class JsonUtils {
\r
23 public static Optional<Variable> tryParseJsonPropertyVariable(RequestProcessor processor, String json) throws DatabaseException {
\r
24 return processor.syncRequest(new UniqueRead<Optional<Variable>>() {
\r
26 public Optional<Variable> perform(ReadGraph graph) throws DatabaseException {
\r
27 return tryParseJsonPropertyVariable(graph, json);
\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
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
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
52 String defaultPropertyUri = null;
\r
54 while (jp.nextToken() != JsonToken.END_OBJECT) {
\r
55 String fieldName = jp.getCurrentName();
\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
66 return Optional.ofNullable("Variable".equals(type) ?
\r
67 defaultPropertyUri != null ? defaultPropertyUri : uri
\r