diff options
Diffstat (limited to 'src/org')
-rw-r--r-- | src/org/traccar/Server.java | 14 | ||||
-rw-r--r-- | src/org/traccar/helper/NamedParameterStatement.java | 13 | ||||
-rw-r--r-- | src/org/traccar/http/WebServer.java | 53 | ||||
-rw-r--r-- | src/org/traccar/model/DataManager.java | 4 | ||||
-rw-r--r-- | src/org/traccar/model/DatabaseDataManager.java | 101 |
5 files changed, 147 insertions, 38 deletions
diff --git a/src/org/traccar/Server.java b/src/org/traccar/Server.java index fda5e6ad3..654d32321 100644 --- a/src/org/traccar/Server.java +++ b/src/org/traccar/Server.java @@ -86,15 +86,19 @@ public class Server { initAvl08Server(properties); // Initialize web server - Integer port = Integer.valueOf(properties.getProperty("http.port", "8082")); - webServer = new WebServer(port, dataManager); + if (Boolean.valueOf(properties.getProperty("http.enable"))) { + Integer port = Integer.valueOf(properties.getProperty("http.port", "8082")); + webServer = new WebServer(port, dataManager); + } } /** * Start */ public void start() { - webServer.start(); + if (webServer != null) { + webServer.start(); + } for (Object server: serverList) { ((TrackerServer) server).start(); } @@ -107,7 +111,9 @@ public class Server { for (Object server: serverList) { ((TrackerServer) server).stop(); } - webServer.stop(); + if (webServer != null) { + webServer.stop(); + } } /** diff --git a/src/org/traccar/helper/NamedParameterStatement.java b/src/org/traccar/helper/NamedParameterStatement.java index c86217182..e898af2d3 100644 --- a/src/org/traccar/helper/NamedParameterStatement.java +++ b/src/org/traccar/helper/NamedParameterStatement.java @@ -30,12 +30,12 @@ public class NamedParameterStatement { * Index mapping */ private final Map indexMap; - + /** * Query string */ private final String parsedQuery; - + /** * Database connection */ @@ -106,7 +106,7 @@ public class NamedParameterStatement { return parsedQuery.toString(); } - + public void prepare() throws SQLException { try { if (statement == null) { @@ -134,6 +134,13 @@ public class NamedParameterStatement { } /** + * Return generated keys + */ + public ResultSet getGeneratedKeys() throws SQLException { + return statement.getGeneratedKeys(); + } + + /** * Immediately closes the statement */ public void close() throws SQLException { diff --git a/src/org/traccar/http/WebServer.java b/src/org/traccar/http/WebServer.java index d42f8fe2c..53cdb2966 100644 --- a/src/org/traccar/http/WebServer.java +++ b/src/org/traccar/http/WebServer.java @@ -20,6 +20,8 @@ import java.io.InputStream; import java.io.OutputStream; import java.io.PrintWriter; import java.util.Iterator; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @@ -79,28 +81,65 @@ public class WebServer { out.flush(); } + private Device parseDevice(String json) { + + Pattern pattern = Pattern.compile("\\{\"id\":(\\d+),\"imei\":\"(.*)\"\\}"); + Matcher parser = pattern.matcher(json); + if (parser.matches()) { + Device device = new Device(); + device.setId(Long.valueOf(parser.group(1))); + device.setImei(parser.group(2)); + return device; + } + + return null; + } + + // TODO: separate method into small parts 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(); + String action = request.getParameter("action"); + if (action == null) { + Iterator<Device> i = dataManager.getDevices().iterator(); + out.print("{'success':true,'results':["); + while (i.hasNext()) { + Device device = i.next(); + out.format("{'id':%d,'imei':'%s'}", + device.getId(), + device.getImei()); + if (i.hasNext()) out.print(","); + } + } else if (action.equals("create")) { + Device device = parseDevice(request.getReader().readLine()); + dataManager.addDevice(device); + out.print("{'success':true,'results':["); + out.format("{'id':%d,'imei':'%s'}", + device.getId(), + device.getImei()); + } else if (action.equals("update")) { + Device device = parseDevice(request.getReader().readLine()); + dataManager.updateDevice(device); + out.print("{'success':true,'results':["); out.format("{'id':%d,'imei':'%s'}", device.getId(), device.getImei()); - if (i.hasNext()) out.print(","); + } else if (action.equals("destroy")) { + Device device = parseDevice(request.getReader().readLine()); + dataManager.removeDevice(device); + out.print("{'success':true,'results':["); } } else if (target.equals("/positions.json")) { + out.print("{'success':true,'results':["); String deviceId = request.getParameter("deviceId"); if (deviceId != null) { Iterator<Position> i = dataManager.getPositions(Long.valueOf(deviceId)).iterator(); @@ -120,10 +159,10 @@ public class WebServer { } } catch (Exception error) { + out.print("{'success':false,'results':["); System.out.println(error.getMessage()); } - //" {'id': 1, 'imei': '123456789012345'} ]}"); out.print("]}"); out.flush(); } @@ -138,7 +177,7 @@ public class WebServer { { if (target.equals("/") || target.equals("/index.html")) { handleIndex(target, baseRequest, request, response); - } else if (target.matches("/favicon.ico")) { + } else if (target.equals("/favicon.ico")) { handleIcon(target, baseRequest, request, response); } else if (target.matches("/.+\\.json")) { handleData(target, baseRequest, request, response); diff --git a/src/org/traccar/model/DataManager.java b/src/org/traccar/model/DataManager.java index d0f290962..70cf63380 100644 --- a/src/org/traccar/model/DataManager.java +++ b/src/org/traccar/model/DataManager.java @@ -27,8 +27,8 @@ public interface DataManager { */ 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; + public void updateDevice(Device device) throws Exception; + public void removeDevice(Device device) throws Exception; public Device getDeviceByImei(String imei) throws Exception; /** diff --git a/src/org/traccar/model/DatabaseDataManager.java b/src/org/traccar/model/DatabaseDataManager.java index 7d90ac194..c5492bc8a 100644 --- a/src/org/traccar/model/DatabaseDataManager.java +++ b/src/org/traccar/model/DatabaseDataManager.java @@ -35,16 +35,13 @@ public class DatabaseDataManager implements DataManager { * Database statements */ private NamedParameterStatement queryGetDevices; + private NamedParameterStatement queryAddDevice; + private NamedParameterStatement queryUpdateDevice; + private NamedParameterStatement queryRemoveDevice; + private NamedParameterStatement queryGetPositions; private NamedParameterStatement queryAddPosition; /** - * Devices cache - */ - private Map devices; - private Calendar devicesLastUpdate; - private Long devicesRefreshDelay; - - /** * Initialize database */ private void initDatabase(Properties properties) @@ -70,9 +67,24 @@ public class DatabaseDataManager implements DataManager { String password = properties.getProperty("database.password"); AdvancedConnection connection = new AdvancedConnection(url, user, password); - String query = properties.getProperty("database.selectDevice"); + // Load statements from configuration + String query; + + query = properties.getProperty("database.selectDevice"); queryGetDevices = new NamedParameterStatement(connection, query); + query = properties.getProperty("database.insertDevice"); + queryAddDevice = new NamedParameterStatement(connection, query); + + query = properties.getProperty("database.updateDevice"); + queryUpdateDevice = new NamedParameterStatement(connection, query); + + query = properties.getProperty("database.deleteDevice"); + queryRemoveDevice = new NamedParameterStatement(connection, query); + + query = properties.getProperty("database.selectPosition"); + queryGetPositions = new NamedParameterStatement(connection, query); + query = properties.getProperty("database.insertPosition"); queryAddPosition = new NamedParameterStatement(connection, query); } @@ -93,9 +105,46 @@ public class DatabaseDataManager implements DataManager { return deviceList; } - public void addDevice(Device device) {} // TODO: implement - public void addUpdate(Device device) {} // TODO: implement - public void addRemove(Device device) {} // TODO: implement + public synchronized void addDevice(Device device) throws SQLException { + + queryAddDevice.prepare(); + queryAddDevice.setString("imei", device.getImei()); + queryAddDevice.executeUpdate(); + + // Find generated id + ResultSet result = queryAddDevice.getGeneratedKeys(); + if (result.next()) { + device.setId(result.getLong(1)); + } + + devices = null; + } + + public synchronized void updateDevice(Device device) throws SQLException { + + queryUpdateDevice.prepare(); + queryUpdateDevice.setLong("id", device.getId()); + queryUpdateDevice.setString("imei", device.getImei()); + queryUpdateDevice.executeUpdate(); + + devices = null; + } + + public synchronized void removeDevice(Device device) throws SQLException { + + queryRemoveDevice.prepare(); + queryRemoveDevice.setLong("id", device.getId()); + queryRemoveDevice.executeUpdate(); + + devices = null; + } + + /** + * Devices cache + */ + private Map devices; + private Calendar devicesLastUpdate; + private Long devicesRefreshDelay; public Device getDeviceByImei(String imei) throws SQLException { @@ -110,20 +159,26 @@ public class DatabaseDataManager implements DataManager { return (Device) devices.get(imei); } - public List<Position> getPositions(Long deviceId) { // TODO: implement + public synchronized List<Position> getPositions(Long deviceId) throws SQLException { 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); + queryGetPositions.prepare(); + queryGetPositions.setLong("device_id", deviceId); + ResultSet result = queryGetPositions.executeQuery(); + while (result.next()) { + // TODO: include other parameters + Position position = new Position(); + position.setDeviceId(result.getLong("device_id")); + position.setTime(result.getTimestamp("time")); + position.setValid(result.getBoolean("valid")); + position.setLatitude(result.getDouble("latitude")); + position.setLongitude(result.getDouble("longitude")); + position.setSpeed(result.getDouble("speed")); + position.setCourse(result.getDouble("course")); + position.setPower(result.getDouble("power")); + positionList.add(position); + } return positionList; } @@ -144,6 +199,8 @@ public class DatabaseDataManager implements DataManager { queryAddPosition.setString("extended_info", position.getExtendedInfo()); queryAddPosition.executeUpdate(); + + // TODO: probably return row id } } |