aboutsummaryrefslogtreecommitdiff
path: root/src/org/traccar/http
diff options
context:
space:
mode:
authorAnton Tananaev <anton.tananaev@gmail.com>2015-06-29 10:48:34 +1200
committerAnton Tananaev <anton.tananaev@gmail.com>2015-06-29 10:48:34 +1200
commitd1c4cd526845aad56c5b0a3e20454638bbc7fecc (patch)
tree565ee245ea0e98b88674b775147fbc6d3e1933cb /src/org/traccar/http
parent88b3f00f3855aa408c7859051efdcb5b37fe559f (diff)
downloadtraccar-server-d1c4cd526845aad56c5b0a3e20454638bbc7fecc.tar.gz
traccar-server-d1c4cd526845aad56c5b0a3e20454638bbc7fecc.tar.bz2
traccar-server-d1c4cd526845aad56c5b0a3e20454638bbc7fecc.zip
Merge commands implmentation (fix #1271)
Diffstat (limited to 'src/org/traccar/http')
-rw-r--r--src/org/traccar/http/CommandsServlet.java58
-rw-r--r--src/org/traccar/http/EnumFactory.java20
-rw-r--r--src/org/traccar/http/JsonConverter.java44
-rw-r--r--src/org/traccar/http/WebServer.java1
-rw-r--r--src/org/traccar/http/commands/CommandType.java28
-rw-r--r--src/org/traccar/http/commands/Duration.java38
-rw-r--r--src/org/traccar/http/commands/FixPositioningCommand.java25
-rw-r--r--src/org/traccar/http/commands/GpsCommand.java27
-rw-r--r--src/org/traccar/http/commands/NoParameterCommand.java11
9 files changed, 238 insertions, 14 deletions
diff --git a/src/org/traccar/http/CommandsServlet.java b/src/org/traccar/http/CommandsServlet.java
new file mode 100644
index 000000000..3e3ab9086
--- /dev/null
+++ b/src/org/traccar/http/CommandsServlet.java
@@ -0,0 +1,58 @@
+package org.traccar.http;
+
+import org.traccar.Context;
+import org.traccar.database.ActiveDevice;
+import org.traccar.http.commands.CommandType;
+import org.traccar.http.commands.GpsCommand;
+
+import javax.json.Json;
+import javax.json.JsonObject;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+public class CommandsServlet extends BaseServlet {
+
+ @Override
+ protected boolean handle(String command, HttpServletRequest req, HttpServletResponse resp) throws Exception {
+ if (command.equals("/send")) {
+ send(req, resp);
+ }
+ else if (command.equals("/raw")) {
+ sendRawCommand(req, resp);
+ }
+ else {
+ return false;
+ }
+ return true;
+ }
+
+ private void send(HttpServletRequest req, HttpServletResponse resp) throws Exception {
+ GpsCommand command = JsonConverter.<GpsCommand>enumObjectFromJson(req.getReader(), new EnumFactory(CommandType.class, "type"));
+
+ String uniqueId = command.getUniqueId();
+
+ ActiveDevice activeDevice = Context.getDataManager().getActiveDevice(uniqueId);
+ if(activeDevice == null) {
+ throw new RuntimeException("The device has not yet registered to the server");
+ }
+
+ activeDevice.sendCommand(command);
+
+ sendResponse(resp.getWriter(), JsonConverter.objectToJson(new Object()));
+ }
+
+ private void sendRawCommand(HttpServletRequest req, HttpServletResponse resp) throws Exception {
+ JsonObject json = Json.createReader(req.getReader()).readObject();
+ String uniqueId = json.getString("uniqueId");
+
+ ActiveDevice activeDevice = Context.getDataManager().getActiveDevice(uniqueId);
+ if(activeDevice == null) {
+ throw new RuntimeException("The device has not yet registered to the server");
+ }
+
+ String command = json.getString("command");
+ activeDevice.write(command);
+
+ sendResponse(resp.getWriter(), JsonConverter.objectToJson(new Object()));
+ }
+}
diff --git a/src/org/traccar/http/EnumFactory.java b/src/org/traccar/http/EnumFactory.java
new file mode 100644
index 000000000..6e9971f71
--- /dev/null
+++ b/src/org/traccar/http/EnumFactory.java
@@ -0,0 +1,20 @@
+package org.traccar.http;
+
+import org.traccar.model.Factory;
+
+import javax.json.JsonObject;
+
+public class EnumFactory<T extends Enum<T> & Factory> {
+ private Class<T> commandTypeClass;
+ private String jsonKey;
+
+ public EnumFactory(Class<T> commandTypeClass, String type) {
+ this.commandTypeClass = commandTypeClass;
+ jsonKey = type;
+ }
+
+ public <K> K create(JsonObject json) {
+ Factory factory = Enum.valueOf(commandTypeClass, json.getString(jsonKey));
+ return (K) factory.create();
+ }
+}
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 extends Factory> T objectFromJson(Reader reader, T prototype) throws ParseException {
return objectFromJson(Json.createReader(reader).readObject(), prototype);
}
-
- public static <T extends Factory> T objectFromJson(JsonObject json, T prototype) throws ParseException {
+ public static <T> T enumObjectFromJson(Reader reader, EnumFactory<? extends Enum<?>> factory) throws ParseException {
+ JsonObject json = Json.createReader(reader).readObject();
+ T object = factory.<T>create(json);
+ populateObject(json, object);
+ return object;
+ }
+
+ public static <T extends Factory> 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<? extends Enum>) 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 <T> 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));
}
diff --git a/src/org/traccar/http/WebServer.java b/src/org/traccar/http/WebServer.java
index 21e43b3d3..9030e992b 100644
--- a/src/org/traccar/http/WebServer.java
+++ b/src/org/traccar/http/WebServer.java
@@ -55,6 +55,7 @@ public class WebServer {
servletHandler.addServlet(new ServletHolder(new UserServlet()), "/user/*");
servletHandler.addServlet(new ServletHolder(new DeviceServlet()), "/device/*");
servletHandler.addServlet(new ServletHolder(new PositionServlet()), "/position/*");
+ servletHandler.addServlet(new ServletHolder(new CommandsServlet()), "/commands/*");
servletHandler.addServlet(new ServletHolder(new MainServlet()), "/*");
/*ResourceHandler mobileResourceHandler = new ResourceHandler();
diff --git a/src/org/traccar/http/commands/CommandType.java b/src/org/traccar/http/commands/CommandType.java
new file mode 100644
index 000000000..12610dbcc
--- /dev/null
+++ b/src/org/traccar/http/commands/CommandType.java
@@ -0,0 +1,28 @@
+package org.traccar.http.commands;
+
+import org.traccar.model.Factory;
+
+public enum CommandType implements Factory {
+ STOP_POSITIONING(NoParameterCommand.class),
+ FIX_POSITIONING(FixPositioningCommand.class),
+ STOP_ENGINE(NoParameterCommand.class),
+ RESUME_ENGINE(NoParameterCommand.class);
+
+
+ private Class<? extends GpsCommand> commandClass;
+
+ CommandType(Class<? extends GpsCommand> commandClass) {
+ this.commandClass = commandClass;
+ }
+
+ @Override
+ public Object create() {
+ try {
+ return commandClass.newInstance();
+ } catch (InstantiationException e) {
+ throw new RuntimeException(e);
+ } catch (IllegalAccessException e) {
+ throw new RuntimeException(e);
+ }
+ }
+}
diff --git a/src/org/traccar/http/commands/Duration.java b/src/org/traccar/http/commands/Duration.java
new file mode 100644
index 000000000..e50f0c23e
--- /dev/null
+++ b/src/org/traccar/http/commands/Duration.java
@@ -0,0 +1,38 @@
+package org.traccar.http.commands;
+
+public class Duration {
+
+ public enum TimeUnit {
+ SECOND("s"), MINUTE("m"), HOUR("h");
+
+ private final String commandFormat;
+
+ TimeUnit(String commandFormat) {
+ this.commandFormat = commandFormat;
+ }
+
+ public String getCommandFormat() {
+ return commandFormat;
+ }
+ }
+
+
+ private TimeUnit unit;
+ private int value;
+
+ public TimeUnit getUnit() {
+ return unit;
+ }
+
+ public void setUnit(TimeUnit unit) {
+ this.unit = unit;
+ }
+
+ public int getValue() {
+ return value;
+ }
+
+ public void setValue(int value) {
+ this.value = value;
+ }
+}
diff --git a/src/org/traccar/http/commands/FixPositioningCommand.java b/src/org/traccar/http/commands/FixPositioningCommand.java
new file mode 100644
index 000000000..f3b25acbc
--- /dev/null
+++ b/src/org/traccar/http/commands/FixPositioningCommand.java
@@ -0,0 +1,25 @@
+package org.traccar.http.commands;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class FixPositioningCommand extends GpsCommand {
+ public static final String FREQUENCY = "frequency";
+
+ private Duration data;
+
+ @Override
+ public Map<String, Object> getReplacements() {
+ Map<String, Object> replacements = new HashMap<String, Object>();
+ replacements.put(FREQUENCY, data);
+ return replacements;
+ }
+
+ public Duration getData() {
+ return data;
+ }
+
+ public void setData(Duration data) {
+ this.data = data;
+ }
+}
diff --git a/src/org/traccar/http/commands/GpsCommand.java b/src/org/traccar/http/commands/GpsCommand.java
new file mode 100644
index 000000000..604bf832f
--- /dev/null
+++ b/src/org/traccar/http/commands/GpsCommand.java
@@ -0,0 +1,27 @@
+package org.traccar.http.commands;
+
+import java.util.Map;
+
+public abstract class GpsCommand {
+ public static final String UNIQUE_ID = "uniqueId";
+ private String uniqueId;
+ private CommandType type;
+
+ public String getUniqueId() {
+ return uniqueId;
+ }
+
+ public void setUniqueId(String uniqueId) {
+ this.uniqueId = uniqueId;
+ }
+
+ public CommandType getType() {
+ return type;
+ }
+
+ public void setType(CommandType type) {
+ this.type = type;
+ }
+
+ public abstract Map<String, Object> getReplacements();
+}
diff --git a/src/org/traccar/http/commands/NoParameterCommand.java b/src/org/traccar/http/commands/NoParameterCommand.java
new file mode 100644
index 000000000..fee3c8097
--- /dev/null
+++ b/src/org/traccar/http/commands/NoParameterCommand.java
@@ -0,0 +1,11 @@
+package org.traccar.http.commands;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class NoParameterCommand extends GpsCommand {
+ @Override
+ public Map<String, Object> getReplacements() {
+ return new HashMap<String, Object>();
+ }
+}