From 946978e44223beb5b4b202c80dce6319f9a5cc14 Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Wed, 15 Jul 2015 22:55:09 +1200 Subject: Store extra data in JSON format --- src/org/traccar/database/DataManager.java | 6 ++--- src/org/traccar/database/QueryBuilder.java | 35 ++++++++++++------------- src/org/traccar/http/JsonConverter.java | 6 +++++ src/org/traccar/model/Event.java | 7 +++-- src/org/traccar/model/MiscFormatter.java | 42 ++++++++++++++++++++++++++---- 5 files changed, 65 insertions(+), 31 deletions(-) (limited to 'src') diff --git a/src/org/traccar/database/DataManager.java b/src/org/traccar/database/DataManager.java index f134f87cb..04695c4a5 100644 --- a/src/org/traccar/database/DataManager.java +++ b/src/org/traccar/database/DataManager.java @@ -37,6 +37,7 @@ import org.traccar.helper.Log; import org.traccar.http.AsyncServlet; import org.traccar.http.JsonConverter; import org.traccar.model.Device; +import org.traccar.model.MiscFormatter; import org.traccar.model.Permission; import org.traccar.model.Position; import org.traccar.model.Server; @@ -306,18 +307,17 @@ public class DataManager implements IdentityManager { .setDate("time", position.getFixTime()) // tmp .setLong("device_id", position.getDeviceId()) // tmp .setLong("power", 0) // tmp - .setString("extended_info", position.getOther()) // tmp + .setString("extended_info", MiscFormatter.toXmlString(position.getOther())) // tmp .executeUpdate()); } - // TODO: possibly remove this method public void updateLatestPosition(Position position) throws SQLException { QueryBuilder.create(dataSource, getQuery("database.updateLatestPosition")) .setObject(position) .setDate("time", position.getFixTime()) // tmp .setLong("device_id", position.getDeviceId()) // tmp .setLong("power", 0) // tmp - .setString("extended_info", position.getOther()) // tmp + .setString("extended_info", MiscFormatter.toXmlString(position.getOther())) // tmp .executeUpdate(); } diff --git a/src/org/traccar/database/QueryBuilder.java b/src/org/traccar/database/QueryBuilder.java index 17165db82..4afa5b992 100644 --- a/src/org/traccar/database/QueryBuilder.java +++ b/src/org/traccar/database/QueryBuilder.java @@ -15,6 +15,7 @@ */ package org.traccar.database; +import java.io.StringReader; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.sql.Connection; @@ -31,8 +32,11 @@ import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; +import javax.json.Json; +import javax.json.JsonReader; import javax.sql.DataSource; import org.traccar.model.Factory; +import org.traccar.model.MiscFormatter; public class QueryBuilder { @@ -224,23 +228,6 @@ public class QueryBuilder { return this; } - public QueryBuilder setBytes(String name, byte[] value) throws SQLException { - for (int i : indexes(name)) { - try { - if (value == null) { - statement.setNull(i, Types.VARCHAR); - } else { - statement.setBytes(i, value); - } - } catch (SQLException error) { - statement.close(); - connection.close(); - throw error; - } - } - return this; - } - public QueryBuilder setObject(Object object) throws SQLException { Method[] methods = object.getClass().getMethods(); @@ -261,8 +248,8 @@ public class QueryBuilder { setString(name, (String) method.invoke(object)); } else if (method.getReturnType().equals(Date.class)) { setDate(name, (Date) method.invoke(object)); - } else if (method.getReturnType().equals(byte[].class)) { - setBytes(name, (byte[]) method.invoke(object)); + } else if (method.getReturnType().equals(Map.class)) { + setString(name, MiscFormatter.toJsonString((Map) method.invoke(object))); } } catch (IllegalAccessException | InvocationTargetException error) { } @@ -379,6 +366,16 @@ public class QueryBuilder { } } }); + } else if (parameterType.equals(Map.class)) { + processors.add(new ResultSetProcessor() { + @Override + public void process(T object, ResultSet resultSet) throws SQLException { + try (JsonReader reader = Json.createReader(new StringReader(resultSet.getString(name)))) { + method.invoke(object, MiscFormatter.fromJson(reader.readObject())); + } catch (IllegalAccessException | InvocationTargetException error) { + } + } + }); } } } diff --git a/src/org/traccar/http/JsonConverter.java b/src/org/traccar/http/JsonConverter.java index d8773ec1f..deb676f6e 100644 --- a/src/org/traccar/http/JsonConverter.java +++ b/src/org/traccar/http/JsonConverter.java @@ -24,6 +24,7 @@ import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Collection; import java.util.Date; +import java.util.Map; import javax.json.Json; import javax.json.JsonArray; import javax.json.JsonArrayBuilder; @@ -31,6 +32,7 @@ import javax.json.JsonObject; import javax.json.JsonObjectBuilder; import javax.json.JsonValue; import org.traccar.model.Factory; +import org.traccar.model.MiscFormatter; public class JsonConverter { @@ -83,6 +85,8 @@ public class JsonConverter { method.invoke(object, dateFormat.parse(json.getString(name))); } else if (parameterType.isEnum()) { method.invoke(object, Enum.valueOf((Class) parameterType, json.getString(name))); + } else if (parameterType.equals(Map.class)) { + //method.invoke(object, json.getString(name)); } else { Object nestedObject = parameterType.newInstance(); populateObject(json.getJsonObject(name), nestedObject); @@ -126,6 +130,8 @@ public class JsonConverter { if (value != null) { json.add(name, dateFormat.format(value)); } + } else if (method.getReturnType().equals(Map.class)) { + json.add(name, MiscFormatter.toJson((Map) method.invoke(object))); } } catch (IllegalAccessException | InvocationTargetException error) { } diff --git a/src/org/traccar/model/Event.java b/src/org/traccar/model/Event.java index 71348ef8b..0768ec9f3 100644 --- a/src/org/traccar/model/Event.java +++ b/src/org/traccar/model/Event.java @@ -41,15 +41,14 @@ public abstract class Event { public Date getDeviceTime() { return deviceTime; } public void setDeviceTime(Date deviceTime) { this.deviceTime = deviceTime; } - private final Map other = new LinkedHashMap<>(); + private Map other = new LinkedHashMap<>(); public void set(String key, Object value) { if (value != null && (!(value instanceof String) || !((String) value).isEmpty())) { other.put(key, value); } } - public String getOther() { - return MiscFormatter.toXmlString(other); - } + public void setOther(Map other) { this.other = other; } + public Map getOther() { return other; } public static final String KEY_INDEX = "index"; public static final String KEY_HDOP = "hdop"; diff --git a/src/org/traccar/model/MiscFormatter.java b/src/org/traccar/model/MiscFormatter.java index e0e7d11e8..a866f3ec7 100644 --- a/src/org/traccar/model/MiscFormatter.java +++ b/src/org/traccar/model/MiscFormatter.java @@ -15,13 +15,16 @@ */ package org.traccar.model; -import org.traccar.helper.Log; - +import java.text.DecimalFormat; +import java.util.LinkedHashMap; +import java.util.Map; import javax.json.Json; +import javax.json.JsonNumber; import javax.json.JsonObject; import javax.json.JsonObjectBuilder; -import java.text.DecimalFormat; -import java.util.Map; +import javax.json.JsonString; +import javax.json.JsonValue; +import org.traccar.helper.Log; /** * Format extended tracker status @@ -79,7 +82,36 @@ public class MiscFormatter { return json.build(); } - private static String toJsonString(Map other) { + public static Map fromJson(JsonObject json) { + + Map other = new LinkedHashMap<>(); + + for (Map.Entry entry : json.entrySet()) { + switch (entry.getValue().getValueType()) { + case STRING: + other.put(entry.getKey(), ((JsonString) entry.getValue()).getString()); + break; + case NUMBER: + JsonNumber number = (JsonNumber) entry.getValue(); + if (number.isIntegral()) { + other.put(entry.getKey(), number.longValue()); + } else { + other.put(entry.getKey(), number.doubleValue()); + } + break; + case TRUE: + other.put(entry.getKey(), true); + break; + case FALSE: + other.put(entry.getKey(), false); + break; + } + } + + return other; + } + + public static String toJsonString(Map other) { return toJson(other).toString(); } -- cgit v1.2.3