diff options
author | Anton Tananaev <anton.tananaev@gmail.com> | 2015-06-29 10:48:34 +1200 |
---|---|---|
committer | Anton Tananaev <anton.tananaev@gmail.com> | 2015-06-29 10:48:34 +1200 |
commit | d1c4cd526845aad56c5b0a3e20454638bbc7fecc (patch) | |
tree | 565ee245ea0e98b88674b775147fbc6d3e1933cb /src/org/traccar/http | |
parent | 88b3f00f3855aa408c7859051efdcb5b37fe559f (diff) | |
download | traccar-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.java | 58 | ||||
-rw-r--r-- | src/org/traccar/http/EnumFactory.java | 20 | ||||
-rw-r--r-- | src/org/traccar/http/JsonConverter.java | 44 | ||||
-rw-r--r-- | src/org/traccar/http/WebServer.java | 1 | ||||
-rw-r--r-- | src/org/traccar/http/commands/CommandType.java | 28 | ||||
-rw-r--r-- | src/org/traccar/http/commands/Duration.java | 38 | ||||
-rw-r--r-- | src/org/traccar/http/commands/FixPositioningCommand.java | 25 | ||||
-rw-r--r-- | src/org/traccar/http/commands/GpsCommand.java | 27 | ||||
-rw-r--r-- | src/org/traccar/http/commands/NoParameterCommand.java | 11 |
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>(); + } +} |