From 3a4dadcb2a46abdb94209c63359e58073c5a568b Mon Sep 17 00:00:00 2001 From: Mandar Chitre Date: Mon, 1 Jul 2024 02:49:48 +0800 Subject: [PATCH] feat(remote): improve JSON handling of map objects in parameter values --- README.md | 2 +- ReleaseNotes.md | 16 ++++++++++ VERSION | 2 +- .../remote/GenericValueAdapterFactory.java | 29 ++++++++++++++++++- src/sphinx/fjage_quickstart.sh | 2 +- 5 files changed, 47 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index cad6c60d..dafd7345 100644 --- a/README.md +++ b/README.md @@ -40,7 +40,7 @@ Maven Central dependency com.github.org-arl fjage - 1.12.3 + 1.13.0 Contributing diff --git a/ReleaseNotes.md b/ReleaseNotes.md index 31f7066a..8519422a 100644 --- a/ReleaseNotes.md +++ b/ReleaseNotes.md @@ -1,5 +1,21 @@ # Release Notes +## v1.13.0 + +* Handle generic map objects in JSON serialization +* Javascript improvements + +## v1.12.3 + +* Javascript improvements +* Improved darkmode support +* Improved handling of parameter change notifications +* Fix broken tests + +## v1.12.2 + +* Gateway improvements + ## v1.12.1 * Use LONG_OR_DOUBLE parsing for JSON diff --git a/VERSION b/VERSION index 81f36323..feaae22b 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.12.3 +1.13.0 diff --git a/src/main/java/org/arl/fjage/remote/GenericValueAdapterFactory.java b/src/main/java/org/arl/fjage/remote/GenericValueAdapterFactory.java index a8503940..359b4aec 100644 --- a/src/main/java/org/arl/fjage/remote/GenericValueAdapterFactory.java +++ b/src/main/java/org/arl/fjage/remote/GenericValueAdapterFactory.java @@ -21,6 +21,8 @@ import java.io.IOException; import java.util.ArrayList; +import java.util.HashMap; +import java.util.Map; import java.util.List; /** @@ -54,6 +56,11 @@ else if (List.class.isAssignableFrom(type) || (type.isArray() && type.getCompone Object v = ((GenericValue)value).getValue(); delegate.write(out, v); } + else if (Map.class.isAssignableFrom(type)) { + TypeAdapter delegate = gson.getAdapter(TypeToken.get(type)); + Object v = ((GenericValue)value).getValue(); + delegate.write(out, v); + } else { out.beginObject(); out.name("clazz").value(type.getName()); @@ -86,6 +93,7 @@ public T read(JsonReader in) throws IOException { if (tok == JsonToken.BEGIN_OBJECT) { TypeToken tt = null; GenericValue rv = null; + Map map = new HashMap(); in.beginObject(); while (in.hasNext()) { String name = in.nextName(); @@ -100,9 +108,28 @@ public T read(JsonReader in) throws IOException { TypeAdapter delegate = gson.getAdapter(tt); rv = new GenericValue(delegate.read(in)); } - else in.skipValue(); + else { + JsonToken tok2 = in.peek(); + if (tok2 == JsonToken.NULL) { + in.nextNull(); + map.put(name, null); + } + else if (tok2 == JsonToken.NUMBER) { + String s = in.nextString(); + try { + if (s.contains(".")) map.put(name, Double.parseDouble(s)); + else map.put(name, Long.parseLong(s)); + } catch (NumberFormatException ex) { + // ignore + } + } + else if (tok == JsonToken.STRING) map.put(name, in.nextString()); + else if (tok == JsonToken.BOOLEAN) map.put(name, in.nextBoolean()); + else in.skipValue(); + } } in.endObject(); + if (rv == null) rv = new GenericValue(map); return (T)rv; } if (tok == JsonToken.BEGIN_ARRAY) { diff --git a/src/sphinx/fjage_quickstart.sh b/src/sphinx/fjage_quickstart.sh index 40907ebc..eff32655 100644 --- a/src/sphinx/fjage_quickstart.sh +++ b/src/sphinx/fjage_quickstart.sh @@ -1,7 +1,7 @@ #!/bin/sh # fjage version -VERSION=1.12.3 +VERSION=1.13.0 # create the folder structure mkdir -p build/libs etc logs samples