From cf72e8022b9fc27135aea8939e4aa508744dcfbb Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Sun, 13 Jan 2013 18:19:27 +1300 Subject: Reduced ServerManager size --- default.cfg | 136 ++--- opengts.cfg | 124 ++-- setup/linux/linux.cfg | 152 ++--- setup/windows/windows.cfg | 128 ++-- src/org/traccar/GenericPipelineFactory.java | 26 +- src/org/traccar/Main.java | 4 +- src/org/traccar/Server.java | 879 ---------------------------- src/org/traccar/ServerManager.java | 572 ++++++++++++++++++ src/org/traccar/TrackerServer.java | 39 +- 9 files changed, 889 insertions(+), 1171 deletions(-) delete mode 100644 src/org/traccar/Server.java create mode 100644 src/org/traccar/ServerManager.java diff --git a/default.cfg b/default.cfg index 4b4685ce1..9920d4851 100644 --- a/default.cfg +++ b/default.cfg @@ -1,24 +1,24 @@ - + - + - org.h2.Driver - org.h2.jdbcx.JdbcDataSource - jdbc:h2:/home/user/Documents/traccar/target/database - sa - + org.h2.Driver + org.h2.jdbcx.JdbcDataSource + jdbc:h2:/home/user/Documents/traccar/target/database + sa + - 300 + 300 id - Long imei - String <--> - + SELECT id, uniqueId as imei FROM devices; @@ -34,127 +34,127 @@ power - Double (NULL for some protocols) extended_info - String (XML) <--> - + INSERT INTO positions (device_id, time, valid, latitude, longitude, altitude, speed, course, power) - VALUES (:device_id, :time, :valid, :latitude, :longitude, :altitude, :speed, :course, :power); + VALUES (:device_id, :time, :valid, :latitude, :longitude, :altitude, :speed, :course, :power); device_id - Long id - Long <--> - + UPDATE devices SET latestPosition_id = :id WHERE id = :device_id; - true - - 8082 - /home/user/Documents/traccar-web/traccar-web.war + true + + 8082 + /home/user/Documents/traccar-web/traccar-web.war - false + false - true - /home/user/Documents/traccar/target/tracker-server.log + true + /home/user/Documents/traccar/target/tracker-server.log - true - - 5000 + true + + 5000 - true - 5001 + true + 5001 - true - 5002 + true + 5002 - true - 5003 + true + 5003 - true - 5004 + true + 5004 - true - 5005 + true + 5005 - true - 5006 + true + 5006 - true - 5007 + true + 5007 - true - 5008 + true + 5008 - true - 5009 + true + 5009 - true - 5010 + true + 5010 - true - 5011 + true + 5011 - true - 5012 + true + 5012 - true - 5013 + true + 5013 - true - 5014 + true + 5014 - true - 5015 + true + 5015 - true - 5016 + true + 5016 - true - 5017 + true + 5017 - true - 5018 + true + 5018 - true - 5019 + true + 5019 - true - 5020 + true + 5020 - true - 5021 + true + 5021 - true - 5022 + true + 5022 - true - 5023 + true + 5023 diff --git a/opengts.cfg b/opengts.cfg index a34301aec..fbef33f87 100644 --- a/opengts.cfg +++ b/opengts.cfg @@ -1,23 +1,23 @@ - + - + - com.mysql.jdbc.Driver - jdbc:mysql://localhost:3306/[DATABASE]?allowMultiQueries=true - [USER] - [PASSWORD] + com.mysql.jdbc.Driver + jdbc:mysql://localhost:3306/[DATABASE]?allowMultiQueries=true + [USER] + [PASSWORD] - 300 + 300 - + SELECT imeiNumber AS id, imeiNumber AS imei FROM Device WHERE imeiNumber <> ''; - + START TRANSACTION; UPDATE Device SET lastValidLatitude = :latitude, lastValidLongitude = :longitude, lastGPSTimestamp = UNIX_TIMESTAMP(:time), lastUpdateTime = UNIX_TIMESTAMP(NOW()) WHERE imeiNumber = :device_id; SELECT @accountID := accountID, @deviceID := deviceID FROM Device WHERE imeiNumber = :device_id; @@ -26,114 +26,114 @@ COMMIT; - + DO 0; - false + false - true + true - true - [LOG] + true + [LOG] - true - 5000 + true + 5000 - true - 5001 + true + 5001 - true - 5002 + true + 5002 - true - 5003 + true + 5003 - true - 5004 + true + 5004 - true - 5005 + true + 5005 - true - 5006 + true + 5006 - true - 5007 + true + 5007 - true - 5008 + true + 5008 - true - 5009 + true + 5009 - true - 5010 + true + 5010 - true - 5011 + true + 5011 - true - 5012 + true + 5012 - true - 5013 + true + 5013 - true - 5014 + true + 5014 - true - 5015 + true + 5015 - true - 5016 + true + 5016 - true - 5017 + true + 5017 - true - 5018 + true + 5018 - true - 5019 + true + 5019 - true - 5020 + true + 5020 - true - 5021 + true + 5021 - true - 5022 + true + 5022 - true - 5023 + true + 5023 diff --git a/setup/linux/linux.cfg b/setup/linux/linux.cfg index 16dc51e6f..539921791 100644 --- a/setup/linux/linux.cfg +++ b/setup/linux/linux.cfg @@ -1,24 +1,24 @@ - + - + - org.h2.Driver - org.h2.jdbcx.JdbcDataSource - jdbc:h2:/opt/traccar/data/database - sa - + org.h2.Driver + org.h2.jdbcx.JdbcDataSource + jdbc:h2:/opt/traccar/data/database + sa + - 300 + 300 id - Long imei - String <--> - + SELECT id, uniqueId as imei FROM devices; @@ -34,7 +34,7 @@ power - Double (NULL for some protocols) extended_info - String (XML) <--> - + INSERT INTO positions (device_id, time, valid, latitude, longitude, altitude, speed, course, power) VALUES (:device_id, :time, :valid, :latitude, :longitude, :altitude, :speed, :course, :power); @@ -43,137 +43,137 @@ device_id - Long id - Long <--> - + UPDATE devices SET latestPosition_id = :id WHERE id = :device_id; - true - 8082 - /opt/traccar/traccar-web.war + true + 8082 + /opt/traccar/traccar-web.war - true - /opt/traccar/logs/tracker-server.log + true + /opt/traccar/logs/tracker-server.log - true - 5000 + true + 5000 - true - 5001 + true + 5001 - true - 5002 + true + 5002 - true - 5003 + true + 5003 - true - 5004 + true + 5004 - true - 5005 + true + 5005 - true - 5006 + true + 5006 - true - 5007 + true + 5007 - true - 5008 + true + 5008 - true - 5009 + true + 5009 - true - 5010 + true + 5010 - true - 5011 + true + 5011 - true - 5012 + true + 5012 - true - 5013 + true + 5013 - true - 5014 + true + 5014 - true - 5015 + true + 5015 - true - 5016 + true + 5016 - true - 5017 + true + 5017 - true - 5018 + true + 5018 - true - 5019 + true + 5019 - true - 5020 + true + 5020 - true - 5021 + true + 5021 - true - 5022 + true + 5022 - true - 5023 + true + 5023 - true - 5018 + true + 5018 - true - 5019 + true + 5019 - true - 5020 + true + 5020 - true - 5021 + true + 5021 - true - 5022 + true + 5022 - true - 5023 + true + 5023 diff --git a/setup/windows/windows.cfg b/setup/windows/windows.cfg index e6b620b0c..d3b4d1da4 100644 --- a/setup/windows/windows.cfg +++ b/setup/windows/windows.cfg @@ -1,24 +1,24 @@ - + - + - org.h2.Driver - org.h2.jdbcx.JdbcDataSource - jdbc:h2:[DATABASE] - sa - + org.h2.Driver + org.h2.jdbcx.JdbcDataSource + jdbc:h2:[DATABASE] + sa + - 300 + 300 id - Long imei - String <--> - + SELECT id, uniqueId as imei FROM devices; @@ -34,7 +34,7 @@ power - Double (NULL for some protocols) extended_info - String (XML) <--> - + INSERT INTO positions (device_id, time, valid, latitude, longitude, altitude, speed, course, power) VALUES (:device_id, :time, :valid, :latitude, :longitude, :altitude, :speed, :course, :power); @@ -43,113 +43,113 @@ device_id - Long id - Long <--> - + UPDATE devices SET latestPosition_id = :id WHERE id = :device_id; - true - 8082 - [WAR] + true + 8082 + [WAR] - true - [LOG] + true + [LOG] - true - 5000 + true + 5000 - true - 5001 + true + 5001 - true - 5002 + true + 5002 - true - 5003 + true + 5003 - true - 5004 + true + 5004 - true - 5005 + true + 5005 - true - 5006 + true + 5006 - true - 5007 + true + 5007 - true - 5008 + true + 5008 - true - 5009 + true + 5009 - true - 5010 + true + 5010 - true - 5011 + true + 5011 - true - 5012 + true + 5012 - true - 5013 + true + 5013 - true - 5014 + true + 5014 - true - 5015 + true + 5015 - true - 5016 + true + 5016 - true - 5017 + true + 5017 - true - 5018 + true + 5018 - true - 5019 + true + 5019 - true - 5020 + true + 5020 - true - 5021 + true + 5021 - true - 5022 + true + 5022 - true - 5023 + true + 5023 diff --git a/src/org/traccar/GenericPipelineFactory.java b/src/org/traccar/GenericPipelineFactory.java index 556d86e1d..4537ac4f7 100644 --- a/src/org/traccar/GenericPipelineFactory.java +++ b/src/org/traccar/GenericPipelineFactory.java @@ -34,7 +34,7 @@ public abstract class GenericPipelineFactory implements ChannelPipelineFactory { private DataManager dataManager; private Boolean loggerEnabled; private Integer resetDelay; - private ReverseGeocoder geocoder; + private ReverseGeocoder reverseGeocoder; /** * Open channel handler @@ -65,7 +65,7 @@ public abstract class GenericPipelineFactory implements ChannelPipelineFactory { if (e instanceof MessageEvent) { MessageEvent event = (MessageEvent) e; StringBuilder msg = new StringBuilder(); - + msg.append("[").append(((InetSocketAddress) e.getChannel().getLocalAddress()).getPort()).append(" - "); msg.append(((InetSocketAddress) event.getRemoteAddress()).getAddress().getHostAddress()).append("]"); @@ -85,13 +85,16 @@ public abstract class GenericPipelineFactory implements ChannelPipelineFactory { } } - public GenericPipelineFactory( - TrackerServer server, DataManager dataManager, Boolean loggerEnabled, Integer resetDelay, ReverseGeocoder geocoder) { + public GenericPipelineFactory(ServerManager serverManager, TrackerServer server, String protocol) { this.server = server; - this.dataManager = dataManager; - this.loggerEnabled = loggerEnabled; - this.resetDelay = resetDelay; - this.geocoder = geocoder; + dataManager = serverManager.getDataManager(); + loggerEnabled = serverManager.isLoggerEnabled(); + reverseGeocoder = serverManager.getReverseGeocoder(); + + String resetDelayProperty = serverManager.getProperties().getProperty(protocol + ".resetDelay"); + if (resetDelayProperty != null) { + resetDelay = Integer.valueOf(resetDelayProperty); + } } protected DataManager getDataManager() { @@ -100,9 +103,10 @@ public abstract class GenericPipelineFactory implements ChannelPipelineFactory { protected abstract void addSpecificHandlers(ChannelPipeline pipeline); + @Override public ChannelPipeline getPipeline() { ChannelPipeline pipeline = Channels.pipeline(); - if (resetDelay != 0) { + if (resetDelay != null) { pipeline.addLast("idleHandler", new IdleStateHandler(GlobalTimer.getTimer(), resetDelay, 0, 0)); } pipeline.addLast("openHandler", new OpenChannelHandler(server)); @@ -110,8 +114,8 @@ public abstract class GenericPipelineFactory implements ChannelPipelineFactory { pipeline.addLast("logger", new StandardLoggingHandler()); } addSpecificHandlers(pipeline); - if (geocoder != null) { - pipeline.addLast("geocoder", new ReverseGeocoderHandler(geocoder)); + if (reverseGeocoder != null) { + pipeline.addLast("geocoder", new ReverseGeocoderHandler(reverseGeocoder)); } pipeline.addLast("handler", new TrackerEventHandler(dataManager)); return pipeline; diff --git a/src/org/traccar/Main.java b/src/org/traccar/Main.java index f4242d95e..918370266 100644 --- a/src/org/traccar/Main.java +++ b/src/org/traccar/Main.java @@ -24,8 +24,8 @@ public class Main { // TODO: Temporary formatting workaround Locale.setDefault(Locale.ENGLISH); - - final Server service = new Server(); + + final ServerManager service = new ServerManager(); service.init(args); Log.info("starting server..."); diff --git a/src/org/traccar/Server.java b/src/org/traccar/Server.java deleted file mode 100644 index e1d9efa3d..000000000 --- a/src/org/traccar/Server.java +++ /dev/null @@ -1,879 +0,0 @@ -/* - * Copyright 2012 Anton Tananaev (anton.tananaev@gmail.com) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.traccar; - -import java.io.FileInputStream; -import java.io.IOException; -import java.nio.ByteOrder; -import java.sql.SQLException; -import java.text.DateFormat; -import java.text.FieldPosition; -import java.text.SimpleDateFormat; -import java.util.Date; -import java.util.LinkedList; -import java.util.List; -import java.util.Properties; -import java.util.logging.FileHandler; -import java.util.logging.Formatter; -import java.util.logging.LogRecord; -import org.jboss.netty.bootstrap.ServerBootstrap; -import org.jboss.netty.buffer.ChannelBuffers; -import org.jboss.netty.channel.ChannelPipeline; -import org.jboss.netty.handler.codec.frame.DelimiterBasedFrameDecoder; -import org.jboss.netty.handler.codec.frame.LengthFieldBasedFrameDecoder; -import org.jboss.netty.handler.codec.string.StringDecoder; -import org.jboss.netty.handler.codec.string.StringEncoder; -import org.traccar.geocode.GoogleReverseGeocoder; -import org.traccar.geocode.ReverseGeocoder; -import org.traccar.helper.Log; -import org.traccar.http.WebServer; -import org.traccar.model.DataManager; -import org.traccar.model.DatabaseDataManager; -import org.traccar.protocol.*; - -/** - * Server - */ -public class Server { - - /** - * Server list - */ - private List serverList; - - private boolean loggerEnabled; - - public Server() { - serverList = new LinkedList(); - loggerEnabled = false; - } - - public boolean isLoggerEnabled() { - return loggerEnabled; - } - - private DataManager dataManager; - - private WebServer webServer; - - private ReverseGeocoder geocoder; - - /** - * Initialize - */ - public void init(String[] arguments) - throws IOException, ClassNotFoundException, SQLException { - - // Load properties - Properties properties = new Properties(); - if (arguments.length > 0) { - properties.loadFromXML(new FileInputStream(arguments[0])); - } - - dataManager = new DatabaseDataManager(properties); - - initLogger(properties); - initGeocoder(properties); - - initXexunServer(properties); - initGps103Server(properties); - initTk103Server(properties); - initGl100Server(properties); - initGl200Server(properties); - initT55Server(properties); - initXexun2Server(properties); - initAvl08Server(properties); - initEnforaServer(properties); - initMeiligaoServer(properties); - initMaxonServer(properties); - initST210Server(properties); - initProgressServer(properties); - initH02Server(properties); - initJt600Server(properties); - initEv603Server(properties); - initV680Server(properties); - initPt502Server(properties); - initTr20Server(properties); - initNavisServer(properties); - initMeitrackServer(properties); - initSkypatrolServer(properties); - initGt02Server(properties); - initGt06Server(properties); - - // Initialize web server - if (Boolean.valueOf(properties.getProperty("http.enable"))) { - webServer = new WebServer(properties); - } - } - - /** - * Start - */ - public void start() { - if (webServer != null) { - webServer.start(); - } - for (Object server: serverList) { - ((TrackerServer) server).start(); - } - } - - /** - * Stop - */ - public void stop() { - for (Object server: serverList) { - ((TrackerServer) server).stop(); - } - - // Release resources - GlobalChannelFactory.release(); - GlobalTimer.release(); - - if (webServer != null) { - webServer.stop(); - } - } - - /** - * Destroy - */ - public void destroy() { - serverList.clear(); - } - - /** - * Initialize logger - */ - private void initLogger(Properties properties) throws IOException { - - loggerEnabled = Boolean.valueOf(properties.getProperty("logger.enable")); - - if (loggerEnabled) { - - String fileName = properties.getProperty("logger.file"); - if (fileName != null) { - - FileHandler file = new FileHandler(fileName, true); - - // Simple formatter - file.setFormatter(new Formatter() { - private final String LINE_SEPARATOR = - System.getProperty("line.separator", "\n"); - - private final DateFormat dateFormat = - new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); - - public String format(LogRecord record) { - StringBuffer line = new StringBuffer(); - dateFormat.format(new Date(record.getMillis()), line, new FieldPosition(0)); - line.append(" "); - line.append(record.getSourceClassName()); - line.append("."); - line.append(record.getSourceMethodName()); - line.append(" "); - line.append(record.getLevel().getName()); - line.append(": "); - line.append(formatMessage(record)); - line.append(LINE_SEPARATOR); - return line.toString(); - } - }); - - Log.getLogger().addHandler(file); - } - } - } - - private void initGeocoder(Properties properties) throws IOException { - if (Boolean.parseBoolean(properties.getProperty("geocoder.enable"))) { - geocoder = new GoogleReverseGeocoder(); - } - } - - private boolean isProtocolEnabled(Properties properties, String protocol) { - String enabled = properties.getProperty(protocol + ".enable"); - if (enabled != null) { - return Boolean.valueOf(enabled); - } - return false; - } - - private String getProtocolInterface(Properties properties, String protocol) { - return properties.getProperty(protocol + ".address"); - } - - private Integer getProtocolPort(Properties properties, String protocol) { - String port = properties.getProperty(protocol + ".port"); - if (port != null) { - return Integer.valueOf(port); - } - return 5000; // Magic number - } - - private Integer getProtocolResetDelay(Properties properties, String protocol) { - String resetDelay = properties.getProperty(protocol + ".resetDelay"); - if (resetDelay != null) { - return Integer.valueOf(resetDelay); - } - return 0; - } - - /** - * Init Xexun server - */ - private void initXexunServer(Properties properties) throws SQLException { - - String protocol = "xexun"; - if (isProtocolEnabled(properties, protocol)) { - - TrackerServer server = new TrackerServer(new ServerBootstrap()); - server.setPort(getProtocolPort(properties, protocol)); - server.setAddress(getProtocolInterface(properties, protocol)); - final Integer resetDelay = getProtocolResetDelay(properties, protocol); - - server.setPipelineFactory(new GenericPipelineFactory(server, dataManager, isLoggerEnabled(), resetDelay, geocoder) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("frameDecoder", new XexunFrameDecoder()); - pipeline.addLast("stringDecoder", new StringDecoder()); - pipeline.addLast("objectDecoder", new XexunProtocolDecoder(getDataManager())); - } - }); - - serverList.add(server); - } - } - - /** - * Init Gps103 server - */ - private void initGps103Server(Properties properties) throws SQLException { - - String protocol = "gps103"; - if (isProtocolEnabled(properties, protocol)) { - - TrackerServer server = new TrackerServer(new ServerBootstrap()); - server.setPort(getProtocolPort(properties, protocol)); - server.setAddress(getProtocolInterface(properties, protocol)); - final Integer resetDelay = getProtocolResetDelay(properties, protocol); - - server.setPipelineFactory(new GenericPipelineFactory(server, dataManager, isLoggerEnabled(), resetDelay, geocoder) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - byte delimiter[] = { (byte) ';' }; - pipeline.addLast("frameDecoder", - new DelimiterBasedFrameDecoder(1024, ChannelBuffers.wrappedBuffer(delimiter))); - pipeline.addLast("stringDecoder", new StringDecoder()); - pipeline.addLast("stringEncoder", new StringEncoder()); - pipeline.addLast("objectDecoder", new Gps103ProtocolDecoder(getDataManager())); - } - }); - - serverList.add(server); - } - } - - /** - * Init Tk103 server - */ - private void initTk103Server(Properties properties) throws SQLException { - - String protocol = "tk103"; - if (isProtocolEnabled(properties, protocol)) { - - TrackerServer server = new TrackerServer(new ServerBootstrap()); - server.setPort(getProtocolPort(properties, protocol)); - server.setAddress(getProtocolInterface(properties, protocol)); - final Integer resetDelay = getProtocolResetDelay(properties, protocol); - - server.setPipelineFactory(new GenericPipelineFactory(server, dataManager, isLoggerEnabled(), resetDelay, geocoder) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - byte delimiter[] = { (byte) ')' }; - pipeline.addLast("frameDecoder", - new DelimiterBasedFrameDecoder(1024, ChannelBuffers.wrappedBuffer(delimiter))); - pipeline.addLast("stringDecoder", new StringDecoder()); - pipeline.addLast("stringEncoder", new StringEncoder()); - pipeline.addLast("objectDecoder", new Tk103ProtocolDecoder(getDataManager())); - } - }); - - serverList.add(server); - } - } - - /** - * Init Gl100 server - */ - private void initGl100Server(Properties properties) throws SQLException { - - String protocol = "gl100"; - if (isProtocolEnabled(properties, protocol)) { - - TrackerServer server = new TrackerServer(new ServerBootstrap()); - server.setPort(getProtocolPort(properties, protocol)); - server.setAddress(getProtocolInterface(properties, protocol)); - final Integer resetDelay = getProtocolResetDelay(properties, protocol); - - server.setPipelineFactory(new GenericPipelineFactory(server, dataManager, isLoggerEnabled(), resetDelay, geocoder) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - byte delimiter[] = { (byte) 0x0 }; - pipeline.addLast("frameDecoder", - new DelimiterBasedFrameDecoder(1024, ChannelBuffers.wrappedBuffer(delimiter))); - pipeline.addLast("stringDecoder", new StringDecoder()); - pipeline.addLast("stringEncoder", new StringEncoder()); - pipeline.addLast("objectDecoder", new Gl100ProtocolDecoder(getDataManager())); - } - }); - - serverList.add(server); - } - } - - /** - * Init Gl200 server - */ - private void initGl200Server(Properties properties) throws SQLException { - - String protocol = "gl200"; - if (isProtocolEnabled(properties, protocol)) { - - TrackerServer server = new TrackerServer(new ServerBootstrap()); - server.setPort(getProtocolPort(properties, protocol)); - server.setAddress(getProtocolInterface(properties, protocol)); - final Integer resetDelay = getProtocolResetDelay(properties, protocol); - - server.setPipelineFactory(new GenericPipelineFactory(server, dataManager, isLoggerEnabled(), resetDelay, geocoder) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - byte delimiter[] = { (byte) '$' }; - pipeline.addLast("frameDecoder", - new DelimiterBasedFrameDecoder(1024, ChannelBuffers.wrappedBuffer(delimiter))); - pipeline.addLast("stringDecoder", new StringDecoder()); - pipeline.addLast("stringEncoder", new StringEncoder()); - pipeline.addLast("objectDecoder", new Gl200ProtocolDecoder(getDataManager())); - } - }); - - serverList.add(server); - } - } - - /** - * Init T55 server - */ - private void initT55Server(Properties properties) throws SQLException { - - String protocol = "t55"; - if (isProtocolEnabled(properties, protocol)) { - - TrackerServer server = new TrackerServer(new ServerBootstrap()); - server.setPort(getProtocolPort(properties, protocol)); - server.setAddress(getProtocolInterface(properties, protocol)); - final Integer resetDelay = getProtocolResetDelay(properties, protocol); - - server.setPipelineFactory(new GenericPipelineFactory(server, dataManager, isLoggerEnabled(), resetDelay, geocoder) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - byte delimiter[] = { (byte) '\r', (byte) '\n' }; - pipeline.addLast("frameDecoder", - new DelimiterBasedFrameDecoder(1024, ChannelBuffers.wrappedBuffer(delimiter))); - pipeline.addLast("stringDecoder", new StringDecoder()); - pipeline.addLast("stringEncoder", new StringEncoder()); - pipeline.addLast("objectDecoder", new T55ProtocolDecoder(getDataManager())); - } - }); - - serverList.add(server); - } - } - - /** - * Init Xexun 2 server - */ - private void initXexun2Server(Properties properties) throws SQLException { - - String protocol = "xexun2"; - if (isProtocolEnabled(properties, protocol)) { - - TrackerServer server = new TrackerServer(new ServerBootstrap()); - server.setPort(getProtocolPort(properties, protocol)); - server.setAddress(getProtocolInterface(properties, protocol)); - final Integer resetDelay = getProtocolResetDelay(properties, protocol); - - server.setPipelineFactory(new GenericPipelineFactory(server, dataManager, isLoggerEnabled(), resetDelay, geocoder) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - byte delimiter[] = { (byte) '\n' }; // tracker bug \n\r - pipeline.addLast("frameDecoder", - new DelimiterBasedFrameDecoder(1024, ChannelBuffers.wrappedBuffer(delimiter))); - pipeline.addLast("stringDecoder", new StringDecoder()); - pipeline.addLast("objectDecoder", new Xexun2ProtocolDecoder(getDataManager())); - } - }); - - serverList.add(server); - } - } - - /** - * Init AVL-08 server - */ - private void initAvl08Server(Properties properties) throws SQLException { - - String protocol = "avl08"; - if (isProtocolEnabled(properties, protocol)) { - - TrackerServer server = new TrackerServer(new ServerBootstrap()); - server.setPort(getProtocolPort(properties, protocol)); - server.setAddress(getProtocolInterface(properties, protocol)); - final Integer resetDelay = getProtocolResetDelay(properties, protocol); - - server.setPipelineFactory(new GenericPipelineFactory(server, dataManager, isLoggerEnabled(), resetDelay, geocoder) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - byte delimiter[] = { (byte) '\r', (byte) '\n' }; - pipeline.addLast("frameDecoder", - new DelimiterBasedFrameDecoder(1024, ChannelBuffers.wrappedBuffer(delimiter))); - pipeline.addLast("stringDecoder", new StringDecoder()); - pipeline.addLast("objectDecoder", new Avl08ProtocolDecoder(getDataManager())); - } - }); - - serverList.add(server); - } - } - - /** - * Init Enfora server - */ - private void initEnforaServer(Properties properties) throws SQLException { - - String protocol = "enfora"; - if (isProtocolEnabled(properties, protocol)) { - - TrackerServer server = new TrackerServer(new ServerBootstrap()); - server.setPort(getProtocolPort(properties, protocol)); - server.setAddress(getProtocolInterface(properties, protocol)); - final Integer resetDelay = getProtocolResetDelay(properties, protocol); - - server.setPipelineFactory(new GenericPipelineFactory(server, dataManager, isLoggerEnabled(), resetDelay, geocoder) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("frameDecoder", new LengthFieldBasedFrameDecoder(1024, 0, 2, -2, 2)); - pipeline.addLast("objectDecoder", new EnforaProtocolDecoder(getDataManager())); - } - }); - - serverList.add(server); - } - } - - /** - * Init Meiligao server - */ - private void initMeiligaoServer(Properties properties) throws SQLException { - - String protocol = "meiligao"; - if (isProtocolEnabled(properties, protocol)) { - - TrackerServer server = new TrackerServer(new ServerBootstrap()); - server.setPort(getProtocolPort(properties, protocol)); - server.setAddress(getProtocolInterface(properties, protocol)); - final Integer resetDelay = getProtocolResetDelay(properties, protocol); - - server.setPipelineFactory(new GenericPipelineFactory(server, dataManager, isLoggerEnabled(), resetDelay, geocoder) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("frameDecoder", new LengthFieldBasedFrameDecoder(1024, 2, 2, -4, 4)); - pipeline.addLast("objectDecoder", new MeiligaoProtocolDecoder(getDataManager())); - } - }); - - serverList.add(server); - } - } - - private void initMaxonServer(Properties properties) throws SQLException { - String protocol = "maxon"; - if (isProtocolEnabled(properties, protocol)) { - - TrackerServer server = new TrackerServer(new ServerBootstrap()); - server.setPort(getProtocolPort(properties, protocol)); - server.setAddress(getProtocolInterface(properties, protocol)); - final Integer resetDelay = getProtocolResetDelay(properties, protocol); - - server.setPipelineFactory(new GenericPipelineFactory(server, dataManager, isLoggerEnabled(), resetDelay, geocoder) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - byte delimiter[] = { (byte) '\r', (byte) '\n' }; - pipeline.addLast("frameDecoder", - new DelimiterBasedFrameDecoder(1024, ChannelBuffers.wrappedBuffer(delimiter))); - pipeline.addLast("stringDecoder", new StringDecoder()); - pipeline.addLast("stringEncoder", new StringEncoder()); - pipeline.addLast("objectDecoder", new MaxonProtocolDecoder(getDataManager())); - } - }); - - serverList.add(server); - } - } - - private void initST210Server(Properties properties) throws SQLException { - String protocol = "st210"; - if (isProtocolEnabled(properties, protocol)) { - - TrackerServer server = new TrackerServer(new ServerBootstrap()); - server.setPort(getProtocolPort(properties, protocol)); - server.setAddress(getProtocolInterface(properties, protocol)); - final Integer resetDelay = getProtocolResetDelay(properties, protocol); - - server.setPipelineFactory(new GenericPipelineFactory(server, dataManager, isLoggerEnabled(), resetDelay, geocoder) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - byte delimiter[] = { (byte) '\r' }; - pipeline.addLast("frameDecoder", - new DelimiterBasedFrameDecoder(1024, ChannelBuffers.wrappedBuffer(delimiter))); - pipeline.addLast("stringDecoder", new StringDecoder()); - pipeline.addLast("objectDecoder", new ST210ProtocolDecoder(getDataManager())); - } - }); - - serverList.add(server); - } - } - - private void initProgressServer(Properties properties) throws SQLException { - String protocol = "progress"; - if (isProtocolEnabled(properties, protocol)) { - - TrackerServer server = new TrackerServer(new ServerBootstrap()); - server.setPort(getProtocolPort(properties, protocol)); - server.setAddress(getProtocolInterface(properties, protocol)); - server.setEndianness(ByteOrder.LITTLE_ENDIAN); - final Integer resetDelay = getProtocolResetDelay(properties, protocol); - - server.setPipelineFactory(new GenericPipelineFactory(server, dataManager, isLoggerEnabled(), resetDelay, geocoder) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("frameDecoder", new LengthFieldBasedFrameDecoder(1024, 2, 2, 0, 0)); - pipeline.addLast("objectDecoder", new ProgressProtocolDecoder(getDataManager())); - } - }); - - serverList.add(server); - } - } - - /** - * Init H02 server - */ - private void initH02Server(Properties properties) throws SQLException { - - String protocol = "h02"; - if (isProtocolEnabled(properties, protocol)) { - - TrackerServer server = new TrackerServer(new ServerBootstrap()); - server.setPort(getProtocolPort(properties, protocol)); - server.setAddress(getProtocolInterface(properties, protocol)); - final Integer resetDelay = getProtocolResetDelay(properties, protocol); - - server.setPipelineFactory(new GenericPipelineFactory(server, dataManager, isLoggerEnabled(), resetDelay, geocoder) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - byte delimiter[] = { (byte) '#' }; - pipeline.addLast("frameDecoder", - new DelimiterBasedFrameDecoder(1024, ChannelBuffers.wrappedBuffer(delimiter))); - pipeline.addLast("stringDecoder", new StringDecoder()); - pipeline.addLast("objectDecoder", new H02ProtocolDecoder(getDataManager())); - } - }); - - serverList.add(server); - } - } - - /** - * Init JT600 server - */ - private void initJt600Server(Properties properties) throws SQLException { - - String protocol = "jt600"; - if (isProtocolEnabled(properties, protocol)) { - - TrackerServer server = new TrackerServer(new ServerBootstrap()); - server.setPort(getProtocolPort(properties, protocol)); - server.setAddress(getProtocolInterface(properties, protocol)); - final Integer resetDelay = getProtocolResetDelay(properties, protocol); - - server.setPipelineFactory(new GenericPipelineFactory(server, dataManager, isLoggerEnabled(), resetDelay, geocoder) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("frameDecoder", new Jt600FrameDecoder()); - pipeline.addLast("objectDecoder", new Jt600ProtocolDecoder(getDataManager())); - } - }); - - serverList.add(server); - } - } - - /** - * Init EV603 server - */ - private void initEv603Server(Properties properties) throws SQLException { - - String protocol = "ev603"; - if (isProtocolEnabled(properties, protocol)) { - - TrackerServer server = new TrackerServer(new ServerBootstrap()); - server.setPort(getProtocolPort(properties, protocol)); - server.setAddress(getProtocolInterface(properties, protocol)); - final Integer resetDelay = getProtocolResetDelay(properties, protocol); - - server.setPipelineFactory(new GenericPipelineFactory(server, dataManager, isLoggerEnabled(), resetDelay, geocoder) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - byte delimiter[] = { (byte) ';' }; - pipeline.addLast("frameDecoder", - new DelimiterBasedFrameDecoder(1024, ChannelBuffers.wrappedBuffer(delimiter))); - pipeline.addLast("stringDecoder", new StringDecoder()); - pipeline.addLast("objectDecoder", new Ev603ProtocolDecoder(getDataManager())); - } - }); - - serverList.add(server); - } - } - - /** - * Init V680 server - */ - private void initV680Server(Properties properties) throws SQLException { - - String protocol = "v680"; - if (isProtocolEnabled(properties, protocol)) { - - TrackerServer server = new TrackerServer(new ServerBootstrap()); - server.setPort(getProtocolPort(properties, protocol)); - server.setAddress(getProtocolInterface(properties, protocol)); - final Integer resetDelay = getProtocolResetDelay(properties, protocol); - - server.setPipelineFactory(new GenericPipelineFactory(server, dataManager, isLoggerEnabled(), resetDelay, geocoder) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - byte delimiter[] = { (byte) '#', (byte) '#' }; - pipeline.addLast("frameDecoder", - new DelimiterBasedFrameDecoder(1024, ChannelBuffers.wrappedBuffer(delimiter))); - pipeline.addLast("stringDecoder", new StringDecoder()); - pipeline.addLast("objectDecoder", new V680ProtocolDecoder(getDataManager())); - } - }); - - serverList.add(server); - } - } - - /** - * Init PT502 server - */ - private void initPt502Server(Properties properties) throws SQLException { - - String protocol = "pt502"; - if (isProtocolEnabled(properties, protocol)) { - - TrackerServer server = new TrackerServer(new ServerBootstrap()); - server.setPort(getProtocolPort(properties, protocol)); - server.setAddress(getProtocolInterface(properties, protocol)); - final Integer resetDelay = getProtocolResetDelay(properties, protocol); - - server.setPipelineFactory(new GenericPipelineFactory(server, dataManager, isLoggerEnabled(), resetDelay, geocoder) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - byte delimiter[] = { (byte) '\r', (byte) '\n' }; - pipeline.addLast("frameDecoder", - new DelimiterBasedFrameDecoder(1024, ChannelBuffers.wrappedBuffer(delimiter))); - pipeline.addLast("stringDecoder", new StringDecoder()); - pipeline.addLast("stringEncoder", new StringEncoder()); - pipeline.addLast("objectDecoder", new Pt502ProtocolDecoder(getDataManager())); - } - }); - - serverList.add(server); - } - } - - /** - * Init TR20 server - */ - private void initTr20Server(Properties properties) throws SQLException { - - String protocol = "tr20"; - if (isProtocolEnabled(properties, protocol)) { - - TrackerServer server = new TrackerServer(new ServerBootstrap()); - server.setPort(getProtocolPort(properties, protocol)); - server.setAddress(getProtocolInterface(properties, protocol)); - final Integer resetDelay = getProtocolResetDelay(properties, protocol); - - server.setPipelineFactory(new GenericPipelineFactory(server, dataManager, isLoggerEnabled(), resetDelay, geocoder) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - byte delimiter[] = { (byte) '\r', (byte) '\n' }; - pipeline.addLast("frameDecoder", - new DelimiterBasedFrameDecoder(1024, ChannelBuffers.wrappedBuffer(delimiter))); - pipeline.addLast("stringDecoder", new StringDecoder()); - pipeline.addLast("stringEncoder", new StringEncoder()); - pipeline.addLast("objectDecoder", new Tr20ProtocolDecoder(getDataManager())); - } - }); - - serverList.add(server); - } - } - - /** - * Init Navis server - */ - private void initNavisServer(Properties properties) throws SQLException { - - String protocol = "navis"; - if (isProtocolEnabled(properties, protocol)) { - - TrackerServer server = new TrackerServer(new ServerBootstrap()); - server.setPort(getProtocolPort(properties, protocol)); - server.setAddress(getProtocolInterface(properties, protocol)); - server.setEndianness(ByteOrder.LITTLE_ENDIAN); - final Integer resetDelay = getProtocolResetDelay(properties, protocol); - - server.setPipelineFactory(new GenericPipelineFactory(server, dataManager, isLoggerEnabled(), resetDelay, geocoder) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("frameDecoder", new LengthFieldBasedFrameDecoder(4 * 1024, 12, 2, 2, 0)); - pipeline.addLast("objectDecoder", new NavisProtocolDecoder(getDataManager())); - } - }); - - serverList.add(server); - } - } - - /** - * Init Meitrack server - */ - private void initMeitrackServer(Properties properties) throws SQLException { - - String protocol = "meitrack"; - if (isProtocolEnabled(properties, protocol)) { - - TrackerServer server = new TrackerServer(new ServerBootstrap()); - server.setPort(getProtocolPort(properties, protocol)); - server.setAddress(getProtocolInterface(properties, protocol)); - final Integer resetDelay = getProtocolResetDelay(properties, protocol); - - server.setPipelineFactory(new GenericPipelineFactory(server, dataManager, isLoggerEnabled(), resetDelay, geocoder) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - byte delimiter[] = { (byte) '\r', (byte) '\n' }; - pipeline.addLast("frameDecoder", - new DelimiterBasedFrameDecoder(1024, ChannelBuffers.wrappedBuffer(delimiter))); - pipeline.addLast("stringDecoder", new StringDecoder()); - pipeline.addLast("stringEncoder", new StringEncoder()); - pipeline.addLast("objectDecoder", new MeitrackProtocolDecoder(getDataManager())); - } - }); - - serverList.add(server); - } - } - - /** - * Init SkyPatrol server - */ - private void initSkypatrolServer(Properties properties) throws SQLException { - - String protocol = "skypatrol"; - if (isProtocolEnabled(properties, protocol)) { - - TrackerServer server = new TrackerServer(new ServerBootstrap()); - server.setPort(getProtocolPort(properties, protocol)); - server.setAddress(getProtocolInterface(properties, protocol)); - final Integer resetDelay = getProtocolResetDelay(properties, protocol); - - server.setPipelineFactory(new GenericPipelineFactory(server, dataManager, isLoggerEnabled(), resetDelay, geocoder) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("objectDecoder", new SkypatrolProtocolDecoder(getDataManager())); - } - }); - - serverList.add(server); - } - } - - /** - * Init GT02 server - */ - private void initGt02Server(Properties properties) throws SQLException { - - String protocol = "gt02"; - if (isProtocolEnabled(properties, protocol)) { - - TrackerServer server = new TrackerServer(new ServerBootstrap()); - server.setPort(getProtocolPort(properties, protocol)); - server.setAddress(getProtocolInterface(properties, protocol)); - final Integer resetDelay = getProtocolResetDelay(properties, protocol); - - server.setPipelineFactory(new GenericPipelineFactory(server, dataManager, isLoggerEnabled(), resetDelay, geocoder) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("frameDecoder", new LengthFieldBasedFrameDecoder(256, 2, 1, 2, 0)); - pipeline.addLast("objectDecoder", new Gt02ProtocolDecoder(getDataManager())); - } - }); - - serverList.add(server); - } - } - - /** - * Init GT06 server - */ - private void initGt06Server(Properties properties) throws SQLException { - - String protocol = "gt06"; - if (isProtocolEnabled(properties, protocol)) { - - TrackerServer server = new TrackerServer(new ServerBootstrap()); - server.setPort(getProtocolPort(properties, protocol)); - server.setAddress(getProtocolInterface(properties, protocol)); - final Integer resetDelay = getProtocolResetDelay(properties, protocol); - - server.setPipelineFactory(new GenericPipelineFactory(server, dataManager, isLoggerEnabled(), resetDelay, geocoder) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("frameDecoder", new LengthFieldBasedFrameDecoder(256, 2, 1, 2, 0)); - pipeline.addLast("objectDecoder", new Gt06ProtocolDecoder(getDataManager())); - } - }); - - serverList.add(server); - } - } - -} diff --git a/src/org/traccar/ServerManager.java b/src/org/traccar/ServerManager.java new file mode 100644 index 000000000..68c537cba --- /dev/null +++ b/src/org/traccar/ServerManager.java @@ -0,0 +1,572 @@ +/* + * Copyright 2012 Anton Tananaev (anton.tananaev@gmail.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.traccar; + +import java.io.FileInputStream; +import java.io.IOException; +import java.sql.SQLException; +import java.text.DateFormat; +import java.text.FieldPosition; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.LinkedList; +import java.util.List; +import java.util.Properties; +import java.util.logging.FileHandler; +import java.util.logging.Formatter; +import java.util.logging.LogRecord; +import org.jboss.netty.bootstrap.ConnectionlessBootstrap; +import org.jboss.netty.bootstrap.ServerBootstrap; +import org.jboss.netty.buffer.ChannelBuffers; +import org.jboss.netty.channel.ChannelPipeline; +import org.jboss.netty.handler.codec.frame.DelimiterBasedFrameDecoder; +import org.jboss.netty.handler.codec.frame.LengthFieldBasedFrameDecoder; +import org.jboss.netty.handler.codec.string.StringDecoder; +import org.jboss.netty.handler.codec.string.StringEncoder; +import org.traccar.geocode.GoogleReverseGeocoder; +import org.traccar.geocode.ReverseGeocoder; +import org.traccar.helper.Log; +import org.traccar.http.WebServer; +import org.traccar.model.DataManager; +import org.traccar.model.DatabaseDataManager; +import org.traccar.protocol.*; + +/** + * Server Manager + */ +public class ServerManager { + + private final List serverList = new LinkedList(); + + public void addTrackerServer(TrackerServer trackerServer) { + serverList.add(trackerServer); + } + + private boolean loggerEnabled; + + public boolean isLoggerEnabled() { + return loggerEnabled; + } + + private DataManager dataManager; + + public DataManager getDataManager() { + return dataManager; + } + + private ReverseGeocoder reverseGeocoder; + + public ReverseGeocoder getReverseGeocoder() { + return reverseGeocoder; + } + + private WebServer webServer; + + public WebServer getWebServer() { + return webServer; + } + + private Properties properties; + + public Properties getProperties() { + return properties; + } + + /** + * Initialize + */ + public void init(String[] arguments) + throws IOException, ClassNotFoundException, SQLException { + + // Load properties + properties = new Properties(); + if (arguments.length > 0) { + properties.loadFromXML(new FileInputStream(arguments[0])); + } + + dataManager = new DatabaseDataManager(properties); + + initLogger(properties); + initGeocoder(properties); + + initXexunServer("xexun"); + initGps103Server("gps103"); + initTk103Server("tk103"); + initGl100Server("gl100"); + initGl200Server("gl200"); + initT55Server("t55"); + initXexun2Server("xexun2"); + initAvl08Server("avl08"); + initEnforaServer("enfora"); + initMeiligaoServer("meiligao"); + initMaxonServer("maxon"); + initST210Server("st210"); + initProgressServer("progress"); + initH02Server("h02"); + initJt600Server("jt600"); + initEv603Server("ev603"); + initV680Server("v680"); + initPt502Server("pt502"); + initTr20Server("tr20"); + initNavisServer("navis"); + initMeitrackServer("meitrack"); + initSkypatrolServer("skypatrol"); + initGt02Server("gt02"); + initGt06Server("gt06"); + + // Initialize web server + if (Boolean.valueOf(properties.getProperty("http.enable"))) { + webServer = new WebServer(properties); + } + } + + /** + * Start + */ + public void start() { + if (webServer != null) { + webServer.start(); + } + for (Object server: serverList) { + ((TrackerServer) server).start(); + } + } + + /** + * Stop + */ + public void stop() { + for (Object server: serverList) { + ((TrackerServer) server).stop(); + } + + // Release resources + GlobalChannelFactory.release(); + GlobalTimer.release(); + + if (webServer != null) { + webServer.stop(); + } + } + + /** + * Destroy + */ + public void destroy() { + serverList.clear(); + } + + /** + * Initialize logger + */ + private void initLogger(Properties properties) throws IOException { + + loggerEnabled = Boolean.valueOf(properties.getProperty("logger.enable")); + + if (loggerEnabled) { + + String fileName = properties.getProperty("logger.file"); + if (fileName != null) { + + FileHandler file = new FileHandler(fileName, true); + + // Simple formatter + file.setFormatter(new Formatter() { + private final String LINE_SEPARATOR = + System.getProperty("line.separator", "\n"); + + private final DateFormat dateFormat = + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + + @Override + public String format(LogRecord record) { + StringBuffer line = new StringBuffer(); + dateFormat.format(new Date(record.getMillis()), line, new FieldPosition(0)); + line.append(" "); + line.append(record.getSourceClassName()); + line.append("."); + line.append(record.getSourceMethodName()); + line.append(" "); + line.append(record.getLevel().getName()); + line.append(": "); + line.append(formatMessage(record)); + line.append(LINE_SEPARATOR); + return line.toString(); + } + }); + + Log.getLogger().addHandler(file); + } + } + } + + private void initGeocoder(Properties properties) throws IOException { + if (Boolean.parseBoolean(properties.getProperty("geocoder.enable"))) { + reverseGeocoder = new GoogleReverseGeocoder(); + } + } + + private boolean isProtocolEnabled(Properties properties, String protocol) { + String enabled = properties.getProperty(protocol + ".enable"); + if (enabled != null) { + return Boolean.valueOf(enabled); + } + return false; + } + + private void initXexunServer(String protocol) throws SQLException { + if (isProtocolEnabled(properties, protocol)) { + serverList.add(new TrackerServer(this, new ServerBootstrap(), protocol) { + @Override + protected void addSpecificHandlers(ChannelPipeline pipeline) { + pipeline.addLast("frameDecoder", new XexunFrameDecoder()); + pipeline.addLast("stringDecoder", new StringDecoder()); + pipeline.addLast("objectDecoder", new XexunProtocolDecoder(getDataManager())); + } + }); + } + } + + private void initGps103Server(String protocol) throws SQLException { + if (isProtocolEnabled(properties, protocol)) { + serverList.add(new TrackerServer(this, new ServerBootstrap(), protocol) { + @Override + protected void addSpecificHandlers(ChannelPipeline pipeline) { + byte delimiter[] = { (byte) ';' }; + pipeline.addLast("frameDecoder", + new DelimiterBasedFrameDecoder(1024, ChannelBuffers.wrappedBuffer(delimiter))); + pipeline.addLast("stringDecoder", new StringDecoder()); + pipeline.addLast("stringEncoder", new StringEncoder()); + pipeline.addLast("objectDecoder", new Gps103ProtocolDecoder(getDataManager())); + } + }); + } + } + + private void initTk103Server(String protocol) throws SQLException { + if (isProtocolEnabled(properties, protocol)) { + serverList.add(new TrackerServer(this, new ServerBootstrap(), protocol) { + @Override + protected void addSpecificHandlers(ChannelPipeline pipeline) { + byte delimiter[] = { (byte) ')' }; + pipeline.addLast("frameDecoder", + new DelimiterBasedFrameDecoder(1024, ChannelBuffers.wrappedBuffer(delimiter))); + pipeline.addLast("stringDecoder", new StringDecoder()); + pipeline.addLast("stringEncoder", new StringEncoder()); + pipeline.addLast("objectDecoder", new Tk103ProtocolDecoder(getDataManager())); + } + }); + } + } + + private void initGl100Server(String protocol) throws SQLException { + if (isProtocolEnabled(properties, protocol)) { + serverList.add(new TrackerServer(this, new ServerBootstrap(), protocol) { + @Override + protected void addSpecificHandlers(ChannelPipeline pipeline) { + byte delimiter[] = { (byte) 0x0 }; + pipeline.addLast("frameDecoder", + new DelimiterBasedFrameDecoder(1024, ChannelBuffers.wrappedBuffer(delimiter))); + pipeline.addLast("stringDecoder", new StringDecoder()); + pipeline.addLast("stringEncoder", new StringEncoder()); + pipeline.addLast("objectDecoder", new Gl100ProtocolDecoder(getDataManager())); + } + }); + } + } + + private void initGl200Server(String protocol) throws SQLException { + if (isProtocolEnabled(properties, protocol)) { + serverList.add(new TrackerServer(this, new ServerBootstrap(), protocol) { + @Override + protected void addSpecificHandlers(ChannelPipeline pipeline) { + byte delimiter[] = { (byte) '$' }; + pipeline.addLast("frameDecoder", + new DelimiterBasedFrameDecoder(1024, ChannelBuffers.wrappedBuffer(delimiter))); + pipeline.addLast("stringDecoder", new StringDecoder()); + pipeline.addLast("stringEncoder", new StringEncoder()); + pipeline.addLast("objectDecoder", new Gl200ProtocolDecoder(getDataManager())); + } + }); + } + } + + private void initT55Server(String protocol) throws SQLException { + if (isProtocolEnabled(properties, protocol)) { + serverList.add(new TrackerServer(this, new ServerBootstrap(), protocol) { + @Override + protected void addSpecificHandlers(ChannelPipeline pipeline) { + byte delimiter[] = { (byte) '\r', (byte) '\n' }; + pipeline.addLast("frameDecoder", + new DelimiterBasedFrameDecoder(1024, ChannelBuffers.wrappedBuffer(delimiter))); + pipeline.addLast("stringDecoder", new StringDecoder()); + pipeline.addLast("stringEncoder", new StringEncoder()); + pipeline.addLast("objectDecoder", new T55ProtocolDecoder(getDataManager())); + } + }); + } + } + + private void initXexun2Server(String protocol) throws SQLException { + if (isProtocolEnabled(properties, protocol)) { + serverList.add(new TrackerServer(this, new ServerBootstrap(), protocol) { + @Override + protected void addSpecificHandlers(ChannelPipeline pipeline) { + byte delimiter[] = { (byte) '\n' }; // tracker bug \n\r + pipeline.addLast("frameDecoder", + new DelimiterBasedFrameDecoder(1024, ChannelBuffers.wrappedBuffer(delimiter))); + pipeline.addLast("stringDecoder", new StringDecoder()); + pipeline.addLast("objectDecoder", new Xexun2ProtocolDecoder(getDataManager())); + } + }); + } + } + + private void initAvl08Server(String protocol) throws SQLException { + if (isProtocolEnabled(properties, protocol)) { + serverList.add(new TrackerServer(this, new ServerBootstrap(), protocol) { + @Override + protected void addSpecificHandlers(ChannelPipeline pipeline) { + byte delimiter[] = { (byte) '\r', (byte) '\n' }; + pipeline.addLast("frameDecoder", + new DelimiterBasedFrameDecoder(1024, ChannelBuffers.wrappedBuffer(delimiter))); + pipeline.addLast("stringDecoder", new StringDecoder()); + pipeline.addLast("objectDecoder", new Avl08ProtocolDecoder(getDataManager())); + } + }); + } + } + + private void initEnforaServer(String protocol) throws SQLException { + if (isProtocolEnabled(properties, protocol)) { + serverList.add(new TrackerServer(this, new ServerBootstrap(), protocol) { + @Override + protected void addSpecificHandlers(ChannelPipeline pipeline) { + pipeline.addLast("frameDecoder", new LengthFieldBasedFrameDecoder(1024, 0, 2, -2, 2)); + pipeline.addLast("objectDecoder", new EnforaProtocolDecoder(getDataManager())); + } + }); + } + } + + private void initMeiligaoServer(String protocol) throws SQLException { + if (isProtocolEnabled(properties, protocol)) { + serverList.add(new TrackerServer(this, new ServerBootstrap(), protocol) { + @Override + protected void addSpecificHandlers(ChannelPipeline pipeline) { + pipeline.addLast("frameDecoder", new LengthFieldBasedFrameDecoder(1024, 2, 2, -4, 4)); + pipeline.addLast("objectDecoder", new MeiligaoProtocolDecoder(getDataManager())); + } + }); + } + } + + private void initMaxonServer(String protocol) throws SQLException { + if (isProtocolEnabled(properties, protocol)) { + serverList.add(new TrackerServer(this, new ServerBootstrap(), protocol) { + @Override + protected void addSpecificHandlers(ChannelPipeline pipeline) { + byte delimiter[] = { (byte) '\r', (byte) '\n' }; + pipeline.addLast("frameDecoder", + new DelimiterBasedFrameDecoder(1024, ChannelBuffers.wrappedBuffer(delimiter))); + pipeline.addLast("stringDecoder", new StringDecoder()); + pipeline.addLast("stringEncoder", new StringEncoder()); + pipeline.addLast("objectDecoder", new MaxonProtocolDecoder(getDataManager())); + } + }); + } + } + + private void initST210Server(String protocol) throws SQLException { + if (isProtocolEnabled(properties, protocol)) { + serverList.add(new TrackerServer(this, new ServerBootstrap(), protocol) { + @Override + protected void addSpecificHandlers(ChannelPipeline pipeline) { + byte delimiter[] = { (byte) '\r' }; + pipeline.addLast("frameDecoder", + new DelimiterBasedFrameDecoder(1024, ChannelBuffers.wrappedBuffer(delimiter))); + pipeline.addLast("stringDecoder", new StringDecoder()); + pipeline.addLast("objectDecoder", new ST210ProtocolDecoder(getDataManager())); + } + }); + } + } + + private void initProgressServer(String protocol) throws SQLException { + if (isProtocolEnabled(properties, protocol)) { + serverList.add(new TrackerServer(this, new ServerBootstrap(), protocol) { + @Override + protected void addSpecificHandlers(ChannelPipeline pipeline) { + pipeline.addLast("frameDecoder", new LengthFieldBasedFrameDecoder(1024, 2, 2, 0, 0)); + pipeline.addLast("objectDecoder", new ProgressProtocolDecoder(getDataManager())); + } + }); + } + } + + private void initH02Server(String protocol) throws SQLException { + if (isProtocolEnabled(properties, protocol)) { + serverList.add(new TrackerServer(this, new ServerBootstrap(), protocol) { + @Override + protected void addSpecificHandlers(ChannelPipeline pipeline) { + byte delimiter[] = { (byte) '#' }; + pipeline.addLast("frameDecoder", + new DelimiterBasedFrameDecoder(1024, ChannelBuffers.wrappedBuffer(delimiter))); + pipeline.addLast("stringDecoder", new StringDecoder()); + pipeline.addLast("objectDecoder", new H02ProtocolDecoder(getDataManager())); + } + }); + } + } + + private void initJt600Server(String protocol) throws SQLException { + if (isProtocolEnabled(properties, protocol)) { + serverList.add(new TrackerServer(this, new ServerBootstrap(), protocol) { + @Override + protected void addSpecificHandlers(ChannelPipeline pipeline) { + pipeline.addLast("frameDecoder", new Jt600FrameDecoder()); + pipeline.addLast("objectDecoder", new Jt600ProtocolDecoder(getDataManager())); + } + }); + } + } + + private void initEv603Server(String protocol) throws SQLException { + if (isProtocolEnabled(properties, protocol)) { + serverList.add(new TrackerServer(this, new ServerBootstrap(), protocol) { + @Override + protected void addSpecificHandlers(ChannelPipeline pipeline) { + byte delimiter[] = { (byte) ';' }; + pipeline.addLast("frameDecoder", + new DelimiterBasedFrameDecoder(1024, ChannelBuffers.wrappedBuffer(delimiter))); + pipeline.addLast("stringDecoder", new StringDecoder()); + pipeline.addLast("objectDecoder", new Ev603ProtocolDecoder(getDataManager())); + } + }); + } + } + + private void initV680Server(String protocol) throws SQLException { + if (isProtocolEnabled(properties, protocol)) { + serverList.add(new TrackerServer(this, new ServerBootstrap(), protocol) { + @Override + protected void addSpecificHandlers(ChannelPipeline pipeline) { + byte delimiter[] = { (byte) '#', (byte) '#' }; + pipeline.addLast("frameDecoder", + new DelimiterBasedFrameDecoder(1024, ChannelBuffers.wrappedBuffer(delimiter))); + pipeline.addLast("stringDecoder", new StringDecoder()); + pipeline.addLast("objectDecoder", new V680ProtocolDecoder(getDataManager())); + } + }); + } + } + + private void initPt502Server(String protocol) throws SQLException { + if (isProtocolEnabled(properties, protocol)) { + serverList.add(new TrackerServer(this, new ServerBootstrap(), protocol) { + @Override + protected void addSpecificHandlers(ChannelPipeline pipeline) { + byte delimiter[] = { (byte) '\r', (byte) '\n' }; + pipeline.addLast("frameDecoder", + new DelimiterBasedFrameDecoder(1024, ChannelBuffers.wrappedBuffer(delimiter))); + pipeline.addLast("stringDecoder", new StringDecoder()); + pipeline.addLast("stringEncoder", new StringEncoder()); + pipeline.addLast("objectDecoder", new Pt502ProtocolDecoder(getDataManager())); + } + }); + } + } + + private void initTr20Server(String protocol) throws SQLException { + if (isProtocolEnabled(properties, protocol)) { + serverList.add(new TrackerServer(this, new ServerBootstrap(), protocol) { + @Override + protected void addSpecificHandlers(ChannelPipeline pipeline) { + byte delimiter[] = { (byte) '\r', (byte) '\n' }; + pipeline.addLast("frameDecoder", + new DelimiterBasedFrameDecoder(1024, ChannelBuffers.wrappedBuffer(delimiter))); + pipeline.addLast("stringDecoder", new StringDecoder()); + pipeline.addLast("stringEncoder", new StringEncoder()); + pipeline.addLast("objectDecoder", new Tr20ProtocolDecoder(getDataManager())); + } + }); + } + } + + private void initNavisServer(String protocol) throws SQLException { + if (isProtocolEnabled(properties, protocol)) { + serverList.add(new TrackerServer(this, new ServerBootstrap(), protocol) { + @Override + protected void addSpecificHandlers(ChannelPipeline pipeline) { + pipeline.addLast("frameDecoder", new LengthFieldBasedFrameDecoder(4 * 1024, 12, 2, 2, 0)); + pipeline.addLast("objectDecoder", new NavisProtocolDecoder(getDataManager())); + } + }); + } + } + + private void initMeitrackServer(String protocol) throws SQLException { + if (isProtocolEnabled(properties, protocol)) { + serverList.add(new TrackerServer(this, new ServerBootstrap(), protocol) { + @Override + protected void addSpecificHandlers(ChannelPipeline pipeline) { + byte delimiter[] = { (byte) '\r', (byte) '\n' }; + pipeline.addLast("frameDecoder", + new DelimiterBasedFrameDecoder(1024, ChannelBuffers.wrappedBuffer(delimiter))); + pipeline.addLast("stringDecoder", new StringDecoder()); + pipeline.addLast("stringEncoder", new StringEncoder()); + pipeline.addLast("objectDecoder", new MeitrackProtocolDecoder(getDataManager())); + } + }); + } + } + + private void initSkypatrolServer(String protocol) throws SQLException { + if (isProtocolEnabled(properties, protocol)) { + serverList.add(new TrackerServer(this, new ConnectionlessBootstrap(), protocol) { + @Override + protected void addSpecificHandlers(ChannelPipeline pipeline) { + pipeline.addLast("objectDecoder", new SkypatrolProtocolDecoder(getDataManager())); + } + }); + } + } + + private void initGt02Server(String protocol) throws SQLException { + if (isProtocolEnabled(properties, protocol)) { + serverList.add(new TrackerServer(this, new ServerBootstrap(), protocol) { + @Override + protected void addSpecificHandlers(ChannelPipeline pipeline) { + pipeline.addLast("frameDecoder", new LengthFieldBasedFrameDecoder(256, 2, 1, 2, 0)); + pipeline.addLast("objectDecoder", new Gt02ProtocolDecoder(getDataManager())); + } + }); + } + } + + private void initGt06Server(String protocol) throws SQLException { + if (isProtocolEnabled(properties, protocol)) { + serverList.add(new TrackerServer(this, new ServerBootstrap(), protocol) { + @Override + protected void addSpecificHandlers(ChannelPipeline pipeline) { + pipeline.addLast("frameDecoder", new LengthFieldBasedFrameDecoder(256, 2, 1, 2, 0)); + pipeline.addLast("objectDecoder", new Gt06ProtocolDecoder(getDataManager())); + } + }); + } + } + +} diff --git a/src/org/traccar/TrackerServer.java b/src/org/traccar/TrackerServer.java index c24e6494b..36c0ce70e 100644 --- a/src/org/traccar/TrackerServer.java +++ b/src/org/traccar/TrackerServer.java @@ -22,6 +22,7 @@ import org.jboss.netty.bootstrap.ConnectionlessBootstrap; import org.jboss.netty.bootstrap.ServerBootstrap; import org.jboss.netty.buffer.HeapChannelBufferFactory; import org.jboss.netty.channel.Channel; +import org.jboss.netty.channel.ChannelPipeline; import org.jboss.netty.channel.ChannelPipelineFactory; import org.jboss.netty.channel.group.ChannelGroup; import org.jboss.netty.channel.group.ChannelGroupFuture; @@ -30,17 +31,37 @@ import org.jboss.netty.channel.group.DefaultChannelGroup; /** * Tracker server */ -public class TrackerServer /*extends ServerBootstrap*/ { - - Bootstrap bootstrap; +public abstract class TrackerServer { - public TrackerServer(Bootstrap bootstrap) { + private ServerManager serverManager; + private Bootstrap bootstrap; + private String protocol; + + public String getProtocol() { + return protocol; + } + + public TrackerServer(ServerManager serverManager, Bootstrap bootstrap, String protocol) { + this.serverManager = serverManager; this.bootstrap = bootstrap; + this.protocol = protocol; - // Create channel factory bootstrap.setFactory(GlobalChannelFactory.getFactory()); + + address = serverManager.getProperties().getProperty(protocol + ".address"); + String portProperty = serverManager.getProperties().getProperty(protocol + ".port"); + port = (portProperty != null) ? Integer.valueOf(portProperty) : 5000; + + bootstrap.setPipelineFactory(new GenericPipelineFactory(serverManager, this, protocol) { + @Override + protected void addSpecificHandlers(ChannelPipeline pipeline) { + TrackerServer.this.addSpecificHandlers(pipeline); + } + }); } + protected abstract void addSpecificHandlers(ChannelPipeline pipeline); + /** * Server port */ @@ -82,11 +103,11 @@ public class TrackerServer /*extends ServerBootstrap*/ { public ChannelGroup getChannelGroup() { return allChannels; } - + public void setPipelineFactory(ChannelPipelineFactory pipelineFactory) { bootstrap.setPipelineFactory(pipelineFactory); } - + /** * Start server */ @@ -97,7 +118,7 @@ public class TrackerServer /*extends ServerBootstrap*/ { } else { endpoint = new InetSocketAddress(address, port); } - + Channel channel = null; if (bootstrap instanceof ServerBootstrap) { channel = ((ServerBootstrap) bootstrap).bind(endpoint); @@ -109,7 +130,7 @@ public class TrackerServer /*extends ServerBootstrap*/ { getChannelGroup().add(channel); } } - + /** * Stop server */ -- cgit v1.2.3