diff options
Diffstat (limited to 'src/org/traccar')
-rw-r--r-- | src/org/traccar/Server.java | 2 | ||||
-rw-r--r-- | src/org/traccar/http/WebServer.java | 112 | ||||
-rw-r--r-- | src/org/traccar/model/DataManager.java | 4 | ||||
-rw-r--r-- | src/org/traccar/model/DatabaseDataManager.java | 27 |
4 files changed, 134 insertions, 11 deletions
diff --git a/src/org/traccar/Server.java b/src/org/traccar/Server.java index 1c11f07b0..fda5e6ad3 100644 --- a/src/org/traccar/Server.java +++ b/src/org/traccar/Server.java @@ -87,7 +87,7 @@ public class Server { // Initialize web server Integer port = Integer.valueOf(properties.getProperty("http.port", "8082")); - webServer = new WebServer(port); + webServer = new WebServer(port, dataManager); } /** diff --git a/src/org/traccar/http/WebServer.java b/src/org/traccar/http/WebServer.java index 9b3b78413..a99f6e11b 100644 --- a/src/org/traccar/http/WebServer.java +++ b/src/org/traccar/http/WebServer.java @@ -15,23 +15,130 @@ */ package org.traccar.http; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.io.PrintWriter; +import java.util.Iterator; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import org.eclipse.jetty.server.Request; import org.eclipse.jetty.server.Server; +import org.eclipse.jetty.server.handler.AbstractHandler; +import org.traccar.model.DataManager; +import org.traccar.model.Device; +import org.traccar.model.Position; /** - * Integrated http server + * Integrated HTTP server */ public class WebServer { private Server server; - public WebServer(Integer port) { + public class WebHandler extends AbstractHandler { + + private DataManager dataManager; + + public WebHandler(DataManager dataManager) { + this.dataManager = dataManager; + } + + public void handleIndex(String target,Request baseRequest,HttpServletRequest request,HttpServletResponse response) + throws IOException, ServletException { + + response.setContentType("text/html"); + + InputStream in = this.getClass().getClassLoader().getResourceAsStream("index.html"); + OutputStream out = response.getOutputStream(); + + byte[] buffer = new byte[1024]; // Magic number + int count; + while ((count = in.read(buffer)) != -1) { + out.write(buffer, 0, count); + } + out.flush(); + } + + public void handleData(String target,Request baseRequest,HttpServletRequest request,HttpServletResponse response) + throws IOException, ServletException { + + response.setContentType("application/json"); + + PrintWriter out = response.getWriter(); + out.print("{'success':true,'results':["); + + try { + if (target.equals("/devices.json")) { + + Iterator<Device> i = dataManager.getDevices().iterator(); + while (i.hasNext()) { + Device device = i.next(); + out.format("{'id':%d,'imei':'%s'}", + device.getId(), + device.getImei()); + if (i.hasNext()) out.print(","); + } + + } else if (target.equals("/positions.json")) { + + String deviceId = request.getParameter("deviceId"); + if (deviceId != null) { + Iterator<Position> i = dataManager.getPositions(Long.valueOf(deviceId)).iterator(); + while (i.hasNext()) { + Position position = i.next(); + out.format("{'device_id':%d,'time':'%tF %tT','valid':%b,'latitude':%f,'longitude':%f,'speed':%f,'course':%f}", + position.getDeviceId(), + position.getTime(), + position.getTime(), + position.getValid(), + position.getLatitude(), + position.getLongitude(), + position.getSpeed(), + position.getCourse()); + if (i.hasNext()) out.print(","); + } + } + + } + } catch (Exception error) { + System.out.println(error.getMessage()); + } + + //" {'id': 1, 'imei': '123456789012345'} ]}"); + out.print("]}"); + out.flush(); + } + + public void handleOther(String target,Request baseRequest,HttpServletRequest request,HttpServletResponse response) + throws IOException, ServletException { + response.sendRedirect(response.encodeRedirectURL("/")); + } + + public void handle(String target,Request baseRequest,HttpServletRequest request,HttpServletResponse response) + throws IOException, ServletException + { + if (target.equals("/") || target.equals("/index.html")) { + handleIndex(target, baseRequest, request, response); + } else if (target.matches("/.+\\.json")) { + handleData(target, baseRequest, request, response); + } else { + handleOther(target, baseRequest, request, response); + } + } + } + + public WebServer(Integer port, DataManager dataManager) { server = new Server(port); + server.setHandler(new WebHandler(dataManager)); } public void start() { try { server.start(); } catch (Exception error) { + System.out.println(error.getMessage()); } } @@ -39,6 +146,7 @@ public class WebServer { try { server.stop(); } catch (Exception error) { + System.out.println(error.getMessage()); } } diff --git a/src/org/traccar/model/DataManager.java b/src/org/traccar/model/DataManager.java index a7dbd6719..d0f290962 100644 --- a/src/org/traccar/model/DataManager.java +++ b/src/org/traccar/model/DataManager.java @@ -25,7 +25,7 @@ public interface DataManager { /** * Manage devices */ - public List getDevices() throws Exception; + public List<Device> getDevices() throws Exception; public void addDevice(Device device) throws Exception; public void addUpdate(Device device) throws Exception; public void addRemove(Device device) throws Exception; @@ -34,7 +34,7 @@ public interface DataManager { /** * Manage positions */ - public List getPositions(Long deviceId) throws Exception; + public List<Position> getPositions(Long deviceId) throws Exception; public void addPosition(Position position) throws Exception; } diff --git a/src/org/traccar/model/DatabaseDataManager.java b/src/org/traccar/model/DatabaseDataManager.java index 8e12f177c..7d90ac194 100644 --- a/src/org/traccar/model/DatabaseDataManager.java +++ b/src/org/traccar/model/DatabaseDataManager.java @@ -77,9 +77,9 @@ public class DatabaseDataManager implements DataManager { queryAddPosition = new NamedParameterStatement(connection, query); } - public synchronized List getDevices() throws SQLException { + public synchronized List<Device> getDevices() throws SQLException { - List deviceList = new LinkedList(); + List<Device> deviceList = new LinkedList(); queryGetDevices.prepare(); ResultSet result = queryGetDevices.executeQuery(); @@ -101,9 +101,8 @@ public class DatabaseDataManager implements DataManager { if ((devices == null) || (Calendar.getInstance().getTimeInMillis() - devicesLastUpdate.getTimeInMillis() > devicesRefreshDelay)) { devices = new HashMap(); - List deviceList = getDevices(); - for (Object device: deviceList) { - devices.put(((Device) device).getImei(), device); + for (Device device: getDevices()) { + devices.put(device.getImei(), device); } devicesLastUpdate = Calendar.getInstance(); } @@ -111,7 +110,23 @@ public class DatabaseDataManager implements DataManager { return (Device) devices.get(imei); } - public List getPositions(Long deviceId) { return null; } // TODO: implement + public List<Position> getPositions(Long deviceId) { // TODO: implement + + List<Position> positionList = new LinkedList(); + + Position p = new Position(); + p.setDeviceId(new Long(1)); + p.setTime(new Date()); + p.setValid(true); + p.setLatitude(1.0); + p.setLongitude(1.0); + p.setSpeed(1.0); + p.setCourse(1.0); + + positionList.add(p); + + return positionList; + } public synchronized void addPosition(Position position) throws SQLException { |