aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--debug.xml1
-rw-r--r--src/org/traccar/database/DataManager.java6
-rw-r--r--src/org/traccar/database/QueryBuilder.java35
-rw-r--r--src/org/traccar/http/JsonConverter.java6
-rw-r--r--src/org/traccar/model/Event.java7
-rw-r--r--src/org/traccar/model/MiscFormatter.java42
-rw-r--r--test/org/traccar/model/MiscFormatterTest.java2
-rw-r--r--web/app/model/Position.js2
-rw-r--r--web/app/view/state/StateController.js7
9 files changed, 74 insertions, 34 deletions
diff --git a/debug.xml b/debug.xml
index cf40dbc4d..3b69efbe8 100644
--- a/debug.xml
+++ b/debug.xml
@@ -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', {