From d1c4cd526845aad56c5b0a3e20454638bbc7fecc Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Mon, 29 Jun 2015 10:48:34 +1200 Subject: Merge commands implmentation (fix #1271) --- src/org/traccar/http/JsonConverter.java | 44 ++++++++++++++++++++++----------- 1 file changed, 30 insertions(+), 14 deletions(-) (limited to 'src/org/traccar/http/JsonConverter.java') diff --git a/src/org/traccar/http/JsonConverter.java b/src/org/traccar/http/JsonConverter.java index f18470d9d..eb672da8d 100644 --- a/src/org/traccar/http/JsonConverter.java +++ b/src/org/traccar/http/JsonConverter.java @@ -35,7 +35,7 @@ import org.traccar.helper.IgnoreOnSerialization; import org.traccar.model.Factory; public class JsonConverter { - + private static final DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"); public static Date parseDate(String value) throws ParseException { @@ -45,19 +45,29 @@ public class JsonConverter { public static T objectFromJson(Reader reader, T prototype) throws ParseException { return objectFromJson(Json.createReader(reader).readObject(), prototype); } - - public static T objectFromJson(JsonObject json, T prototype) throws ParseException { + public static T enumObjectFromJson(Reader reader, EnumFactory> factory) throws ParseException { + JsonObject json = Json.createReader(reader).readObject(); + T object = factory.create(json); + populateObject(json, object); + return object; + } + + public static T objectFromJson(JsonObject json, T prototype) throws ParseException { T object = (T) prototype.create(); - - Method[] methods = prototype.getClass().getMethods(); - + populateObject(json, object); + return object; + } + + private static void populateObject(JsonObject json, Object object) throws ParseException { + Method[] methods = object.getClass().getMethods(); + for (final Method method : methods) { if (method.getName().startsWith("set") && method.getParameterTypes().length == 1) { final String name = Introspector.decapitalize(method.getName().substring(3)); Class parameterType = method.getParameterTypes()[0]; - + if (json.containsKey(name)) try { if (parameterType.equals(boolean.class)) { method.invoke(object, json.getBoolean(name)); @@ -73,22 +83,28 @@ public class JsonConverter { method.invoke(object, json.getString(name)); } else if (parameterType.equals(Date.class)) { method.invoke(object, dateFormat.parse(json.getString(name))); + } else if (parameterType.isEnum()) { + method.invoke(object, Enum.valueOf((Class) parameterType, json.getString(name))); + } else { + Object nestedObject = parameterType.newInstance(); + populateObject(json.getJsonObject(name), nestedObject); + method.invoke(object, nestedObject); } } catch (IllegalAccessException error) { } catch (InvocationTargetException error) { + } catch (InstantiationException e) { } } } - - return object; + } - + public static JsonObject objectToJson(T object) { - + JsonObjectBuilder json = Json.createObjectBuilder(); - + Method[] methods = object.getClass().getMethods(); - + for (Method method : methods) { if(method.isAnnotationPresent(IgnoreOnSerialization.class)) { continue; @@ -127,7 +143,7 @@ public class JsonConverter { public static JsonArray arrayToJson(Collection array) { JsonArrayBuilder json = Json.createArrayBuilder(); - + for (Object object : array) { json.add(objectToJson(object)); } -- cgit v1.2.3