diff options
-rw-r--r-- | debug.xml | 1 | ||||
-rw-r--r-- | src/org/traccar/database/DataManager.java | 6 | ||||
-rw-r--r-- | src/org/traccar/database/QueryBuilder.java | 35 | ||||
-rw-r--r-- | src/org/traccar/http/JsonConverter.java | 6 | ||||
-rw-r--r-- | src/org/traccar/model/Event.java | 7 | ||||
-rw-r--r-- | src/org/traccar/model/MiscFormatter.java | 42 | ||||
-rw-r--r-- | test/org/traccar/model/MiscFormatterTest.java | 2 | ||||
-rw-r--r-- | web/app/model/Position.js | 2 | ||||
-rw-r--r-- | web/app/view/state/StateController.js | 7 |
9 files changed, 74 insertions, 34 deletions
@@ -41,6 +41,7 @@ <entry key='database.user'>sa</entry> <entry key='database.password'></entry> <entry key='database.mock'>true</entry> + <entry key='database.xml'>false</entry> <entry key='database.checkTable'>traccar</entry> 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<T>() { + @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<? extends Enum>) 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<String, Object> other = new LinkedHashMap<>(); + private Map<String, Object> 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<String, Object> other) { this.other = other; } + public Map<String, Object> 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<String, Object> other) { + public static Map<String, Object> fromJson(JsonObject json) { + + Map<String, Object> other = new LinkedHashMap<>(); + + for (Map.Entry<String, JsonValue> 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<String, Object> other) { return toJson(other).toString(); } diff --git a/test/org/traccar/model/MiscFormatterTest.java b/test/org/traccar/model/MiscFormatterTest.java index 8e013c0bc..6a7a05d3b 100644 --- a/test/org/traccar/model/MiscFormatterTest.java +++ b/test/org/traccar/model/MiscFormatterTest.java @@ -13,7 +13,7 @@ public class MiscFormatterTest { position.set("b", "2"); position.set("a", "3"); - assertEquals("<info><a>3</a><b>2</b></info>", position.getOther()); + assertEquals("<info><a>3</a><b>2</b></info>", MiscFormatter.toXmlString(position.getOther())); } diff --git a/web/app/model/Position.js b/web/app/model/Position.js index f80bece32..c2b83bb87 100644 --- a/web/app/model/Position.js +++ b/web/app/model/Position.js @@ -32,6 +32,6 @@ Ext.define('Traccar.model.Position', { { name: 'speed', type: 'float' }, { name: 'course', type: 'float' }, { name: 'address', type: 'string' }, - { name: 'other', type: 'string' } + { name: 'other' } ] }); diff --git a/web/app/view/state/StateController.js b/web/app/view/state/StateController.js index b3a8e8eed..1e2c271d1 100644 --- a/web/app/view/state/StateController.js +++ b/web/app/view/state/StateController.js @@ -75,6 +75,7 @@ Ext.define('Traccar.view.state.StateController', { updatePosition: function(position) { + var other; var store = Ext.getStore('Parameters'); store.removeAll(); @@ -89,7 +90,11 @@ Ext.define('Traccar.view.state.StateController', { } var xml = position.get('other'); - var other = this.parseXml(xml); + if (typeof xml === 'string' || xml instanceof String) { + other = this.parseXml(xml); + } else { + other = xml; + } for (var key in other) { if (other.hasOwnProperty(key)) { store.add(Ext.create('Traccar.model.Parameter', { |