From dcbaac71303e606662c8274d5b936fd8323a01b0 Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Thu, 9 Jun 2011 08:50:44 +0000 Subject: --- src/net/sourceforge/opentracking/Server.java | 162 ++++++++++++++++----- .../opentracking/TrackerEventHandler.java | 4 +- .../sourceforge/opentracking/TrackerServer.java | 29 +--- .../protocol/gps103/Gps103ProtocolDecoder.java | 15 +- .../protocol/tk103/Tk103ProtocolDecoder.java | 6 +- .../protocol/xexun/XexunProtocolDecoder.java | 2 - 6 files changed, 145 insertions(+), 73 deletions(-) (limited to 'src') diff --git a/src/net/sourceforge/opentracking/Server.java b/src/net/sourceforge/opentracking/Server.java index 8769d1d04..18194b3e6 100644 --- a/src/net/sourceforge/opentracking/Server.java +++ b/src/net/sourceforge/opentracking/Server.java @@ -41,6 +41,12 @@ import net.sourceforge.opentracking.protocol.xexun.XexunFrameDecoder; import net.sourceforge.opentracking.protocol.xexun.XexunProtocolDecoder; import net.sourceforge.opentracking.protocol.gps103.Gps103ProtocolDecoder; import net.sourceforge.opentracking.protocol.tk103.Tk103ProtocolDecoder; +import org.jboss.netty.channel.ChannelHandlerContext; +import org.jboss.netty.channel.ChannelPipeline; +import org.jboss.netty.channel.ChannelPipelineFactory; +import org.jboss.netty.channel.ChannelStateEvent; +import org.jboss.netty.channel.Channels; +import org.jboss.netty.channel.SimpleChannelHandler; /** * Server @@ -58,6 +64,10 @@ public class Server implements DataManager { serverList = new LinkedList(); loggerEnable = false; } + + public boolean isLoggerEnabled() { + return loggerEnable; + } /** * Init @@ -202,6 +212,53 @@ public class Server implements DataManager { } } + /** + * Open channel handler + */ + protected class OpenChannelHandler extends SimpleChannelHandler { + + private TrackerServer server; + + public OpenChannelHandler(TrackerServer server) { + this.server = server; + } + + @Override + public void channelOpen(ChannelHandlerContext ctx, ChannelStateEvent e) { + server.getChannelGroup().add(e.getChannel()); + } + } + + /** + * Xexun pipeline factory + */ + protected class XexunPipelineFactory implements ChannelPipelineFactory { + + private TrackerServer server; + private Server serverCreator; + private Integer resetDelay; + + public XexunPipelineFactory( + TrackerServer server, Server serverCreator, Integer resetDelay) { + this.server = server; + this.serverCreator = serverCreator; + this.resetDelay = resetDelay; + } + + public ChannelPipeline getPipeline() { + ChannelPipeline pipeline = Channels.pipeline(); + pipeline.addLast("openHandler", new OpenChannelHandler(server)); + if (serverCreator.isLoggerEnabled()) { + pipeline.addLast("logger", new LoggingHandler("logger")); + } + pipeline.addLast("frameDecoder", new XexunFrameDecoder()); + pipeline.addLast("stringDecoder", new StringDecoder()); + pipeline.addLast("objectDecoder", new XexunProtocolDecoder(serverCreator, resetDelay)); + pipeline.addLast("handler", new TrackerEventHandler(serverCreator)); + return pipeline; + } + } + /** * Init Xexun server */ @@ -213,21 +270,47 @@ public class Server implements DataManager { TrackerServer server = new TrackerServer( Integer.valueOf(properties.getProperty("xexun.port"))); - if (loggerEnable) { - server.getPipeline().addLast("logger", new LoggingHandler("logger")); - } - server.getPipeline().addLast("frameDecoder", new XexunFrameDecoder()); - server.getPipeline().addLast("stringDecoder", new StringDecoder()); String resetDelay = properties.getProperty("xexun.resetDelay"); - server.getPipeline().addLast("objectDecoder", new XexunProtocolDecoder(this, - (resetDelay == null) ? 0 : Integer.valueOf(resetDelay))); - - server.getPipeline().addLast("handler", new TrackerEventHandler(this)); + server.setPipelineFactory(new XexunPipelineFactory( + server, this, (resetDelay == null) ? 0 : Integer.valueOf(resetDelay))); serverList.add(server); } } + /** + * Gps103 pipeline factory + */ + protected class Gps103PipelineFactory implements ChannelPipelineFactory { + + private TrackerServer server; + private Server serverCreator; + private Integer resetDelay; + + public Gps103PipelineFactory( + TrackerServer server, Server serverCreator, Integer resetDelay) { + this.server = server; + this.serverCreator = serverCreator; + this.resetDelay = resetDelay; + } + + public ChannelPipeline getPipeline() { + ChannelPipeline pipeline = Channels.pipeline(); + pipeline.addLast("openHandler", new OpenChannelHandler(server)); + if (serverCreator.isLoggerEnabled()) { + pipeline.addLast("logger", new LoggingHandler("logger")); + } + 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(serverCreator, resetDelay)); + pipeline.addLast("handler", new TrackerEventHandler(serverCreator)); + return pipeline; + } + } + /** * Init Gps103 server */ @@ -239,24 +322,47 @@ public class Server implements DataManager { TrackerServer server = new TrackerServer( Integer.valueOf(properties.getProperty("gps103.port"))); - if (loggerEnable) { - server.getPipeline().addLast("logger", new LoggingHandler("logger")); - } - byte delimiter[] = { (byte) ';' }; - server.getPipeline().addLast("frameDecoder", - new DelimiterBasedFrameDecoder(1024, ChannelBuffers.wrappedBuffer(delimiter))); - server.getPipeline().addLast("stringDecoder", new StringDecoder()); - server.getPipeline().addLast("stringEncoder", new StringEncoder()); String resetDelay = properties.getProperty("gps103.resetDelay"); - server.getPipeline().addLast("objectDecoder", new Gps103ProtocolDecoder(this, - (resetDelay == null) ? 0 : Integer.valueOf(resetDelay))); - - server.getPipeline().addLast("handler", new TrackerEventHandler(this)); + server.setPipelineFactory(new Gps103PipelineFactory( + server, this, (resetDelay == null) ? 0 : Integer.valueOf(resetDelay))); serverList.add(server); } } + /** + * Tk103 pipeline factory + */ + protected class Tk103PipelineFactory implements ChannelPipelineFactory { + + private TrackerServer server; + private Server serverCreator; + private Integer resetDelay; + + public Tk103PipelineFactory( + TrackerServer server, Server serverCreator, Integer resetDelay) { + this.server = server; + this.serverCreator = serverCreator; + this.resetDelay = resetDelay; + } + + public ChannelPipeline getPipeline() { + ChannelPipeline pipeline = Channels.pipeline(); + pipeline.addLast("openHandler", new OpenChannelHandler(server)); + if (serverCreator.isLoggerEnabled()) { + pipeline.addLast("logger", new LoggingHandler("logger")); + } + 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(serverCreator, resetDelay)); + pipeline.addLast("handler", new TrackerEventHandler(serverCreator)); + return pipeline; + } + } + /** * Init Tk103 server */ @@ -268,19 +374,9 @@ public class Server implements DataManager { TrackerServer server = new TrackerServer( Integer.valueOf(properties.getProperty("tk103.port"))); - if (loggerEnable) { - server.getPipeline().addLast("logger", new LoggingHandler("logger")); - } - byte delimiter[] = { (byte) ')' }; - server.getPipeline().addLast("frameDecoder", - new DelimiterBasedFrameDecoder(1024, ChannelBuffers.wrappedBuffer(delimiter))); - server.getPipeline().addLast("stringDecoder", new StringDecoder()); - server.getPipeline().addLast("stringEncoder", new StringEncoder()); String resetDelay = properties.getProperty("tk103.resetDelay"); - server.getPipeline().addLast("objectDecoder", new Tk103ProtocolDecoder(this, - (resetDelay == null) ? 0 : Integer.valueOf(resetDelay))); - - server.getPipeline().addLast("handler", new TrackerEventHandler(this)); + server.setPipelineFactory(new Tk103PipelineFactory( + server, this, (resetDelay == null) ? 0 : Integer.valueOf(resetDelay))); serverList.add(server); } diff --git a/src/net/sourceforge/opentracking/TrackerEventHandler.java b/src/net/sourceforge/opentracking/TrackerEventHandler.java index 7bd3f5501..28a8c8fad 100644 --- a/src/net/sourceforge/opentracking/TrackerEventHandler.java +++ b/src/net/sourceforge/opentracking/TrackerEventHandler.java @@ -19,12 +19,12 @@ import org.jboss.netty.channel.SimpleChannelHandler; import org.jboss.netty.channel.ChannelHandlerContext; import org.jboss.netty.channel.ExceptionEvent; import org.jboss.netty.channel.MessageEvent; -import org.jboss.netty.channel.ChannelPipelineCoverage; +import org.jboss.netty.channel.ChannelHandler; /** * Tracker message handler */ -@ChannelPipelineCoverage("all") +@ChannelHandler.Sharable public class TrackerEventHandler extends SimpleChannelHandler { /** diff --git a/src/net/sourceforge/opentracking/TrackerServer.java b/src/net/sourceforge/opentracking/TrackerServer.java index 4b38920c7..dc9981e61 100644 --- a/src/net/sourceforge/opentracking/TrackerServer.java +++ b/src/net/sourceforge/opentracking/TrackerServer.java @@ -23,34 +23,12 @@ import org.jboss.netty.channel.socket.nio.NioServerSocketChannelFactory; import org.jboss.netty.channel.group.ChannelGroup; import org.jboss.netty.channel.group.DefaultChannelGroup; import org.jboss.netty.channel.group.ChannelGroupFuture; -import org.jboss.netty.channel.SimpleChannelHandler; -import org.jboss.netty.channel.ChannelHandlerContext; -import org.jboss.netty.channel.ChannelStateEvent; -import org.jboss.netty.channel.ChannelPipelineCoverage; /** * Tracker server */ public class TrackerServer extends ServerBootstrap { - /** - * Open channel handler - */ - @ChannelPipelineCoverage("all") - protected class OpenChannelHandler extends SimpleChannelHandler { - - TrackerServer server; - - public OpenChannelHandler(TrackerServer newServer) { - server = newServer; - } - - @Override - public void channelOpen(ChannelHandlerContext ctx, ChannelStateEvent e) { - server.getChannelGroup().add(e.getChannel()); - } - } - /** * Initialization */ @@ -60,11 +38,8 @@ public class TrackerServer extends ServerBootstrap { // Create channel factory setFactory(new NioServerSocketChannelFactory( - Executors.newFixedThreadPool(threadPoolSize), - Executors.newFixedThreadPool(threadPoolSize))); - - // Add open channel handler - getPipeline().addLast("openHandler", new OpenChannelHandler(this)); + Executors.newCachedThreadPool(), + Executors.newCachedThreadPool())); } public TrackerServer(Integer port) { diff --git a/src/net/sourceforge/opentracking/protocol/gps103/Gps103ProtocolDecoder.java b/src/net/sourceforge/opentracking/protocol/gps103/Gps103ProtocolDecoder.java index 663ca22bb..30fdcb06f 100644 --- a/src/net/sourceforge/opentracking/protocol/gps103/Gps103ProtocolDecoder.java +++ b/src/net/sourceforge/opentracking/protocol/gps103/Gps103ProtocolDecoder.java @@ -17,7 +17,6 @@ package net.sourceforge.opentracking.protocol.gps103; import java.util.Calendar; import java.util.GregorianCalendar; -import java.util.TimeZone; import java.util.Timer; import java.util.TimerTask; import java.util.regex.Pattern; @@ -25,7 +24,6 @@ import java.util.regex.Matcher; import org.jboss.netty.channel.Channel; import org.jboss.netty.channel.ChannelHandlerContext; import org.jboss.netty.handler.codec.oneone.OneToOneDecoder; -import org.jboss.netty.channel.ChannelPipelineCoverage; import net.sourceforge.opentracking.Position; import net.sourceforge.opentracking.DataManager; import org.jboss.netty.channel.ChannelEvent; @@ -35,7 +33,6 @@ import org.jboss.netty.channel.ChannelStateEvent; /** * Gps 103 tracker protocol decoder */ -@ChannelPipelineCoverage("all") public class Gps103ProtocolDecoder extends OneToOneDecoder { /** @@ -63,8 +60,8 @@ public class Gps103ProtocolDecoder extends OneToOneDecoder { "imei:" + "([\\d]+)," + // IMEI "[^,]+," + - "[\\d]+," + - "[\\d]*," + + "(\\d{2})(\\d{2})(\\d{2})[\\d]+," + // Date + "[+]?[\\d]*," + "[FL]," + // F - full / L - low "([\\d]{2})([\\d]{2})([\\d]{2}).([\\d]{3})," + // Time (HHMMSS.SSS) "([AV])," + // Validity @@ -102,9 +99,15 @@ public class Gps103ProtocolDecoder extends OneToOneDecoder { // Get device by IMEI String imei = parser.group(index++); position.setDeviceId(dataManager.getDeviceByImei(imei).getId()); + + // Date + Calendar time = new GregorianCalendar(); + time.clear(); + time.set(Calendar.YEAR, 2000 + Integer.valueOf(parser.group(index++))); + time.set(Calendar.MONTH, Integer.valueOf(parser.group(index++)) - 1); + time.set(Calendar.DAY_OF_MONTH, Integer.valueOf(parser.group(index++))); // Time - Calendar time = new GregorianCalendar(TimeZone.getTimeZone("UTC")); time.set(Calendar.HOUR, Integer.valueOf(parser.group(index++))); time.set(Calendar.MINUTE, Integer.valueOf(parser.group(index++))); time.set(Calendar.SECOND, Integer.valueOf(parser.group(index++))); diff --git a/src/net/sourceforge/opentracking/protocol/tk103/Tk103ProtocolDecoder.java b/src/net/sourceforge/opentracking/protocol/tk103/Tk103ProtocolDecoder.java index ab88bf69c..c11d22a17 100644 --- a/src/net/sourceforge/opentracking/protocol/tk103/Tk103ProtocolDecoder.java +++ b/src/net/sourceforge/opentracking/protocol/tk103/Tk103ProtocolDecoder.java @@ -17,7 +17,6 @@ package net.sourceforge.opentracking.protocol.tk103; import java.util.Calendar; import java.util.GregorianCalendar; -import java.util.TimeZone; import java.util.Timer; import java.util.TimerTask; import java.util.regex.Pattern; @@ -25,7 +24,6 @@ import java.util.regex.Matcher; import org.jboss.netty.channel.Channel; import org.jboss.netty.channel.ChannelHandlerContext; import org.jboss.netty.handler.codec.oneone.OneToOneDecoder; -import org.jboss.netty.channel.ChannelPipelineCoverage; import net.sourceforge.opentracking.Position; import net.sourceforge.opentracking.DataManager; import org.jboss.netty.channel.ChannelEvent; @@ -35,7 +33,6 @@ import org.jboss.netty.channel.ChannelStateEvent; /** * Gps 103 tracker protocol decoder */ -@ChannelPipelineCoverage("all") public class Tk103ProtocolDecoder extends OneToOneDecoder { /** @@ -85,11 +82,14 @@ public class Tk103ProtocolDecoder extends OneToOneDecoder { String sentence = (String) msg; + System.out.println(sentence); // DELME + // TODO: Send response (?) // Parse message Matcher parser = pattern.matcher(sentence); if (!parser.matches()) { + System.out.println("Pattern doesn't match."); // DELME return null; } diff --git a/src/net/sourceforge/opentracking/protocol/xexun/XexunProtocolDecoder.java b/src/net/sourceforge/opentracking/protocol/xexun/XexunProtocolDecoder.java index 94b1cb31b..865d1cf72 100644 --- a/src/net/sourceforge/opentracking/protocol/xexun/XexunProtocolDecoder.java +++ b/src/net/sourceforge/opentracking/protocol/xexun/XexunProtocolDecoder.java @@ -25,7 +25,6 @@ import java.util.TimerTask; import org.jboss.netty.channel.Channel; import org.jboss.netty.channel.ChannelHandlerContext; import org.jboss.netty.handler.codec.oneone.OneToOneDecoder; -import org.jboss.netty.channel.ChannelPipelineCoverage; import net.sourceforge.opentracking.Position; import net.sourceforge.opentracking.DataManager; import org.jboss.netty.channel.ChannelEvent; @@ -35,7 +34,6 @@ import org.jboss.netty.channel.ChannelStateEvent; /** * Xexun tracker protocol decoder */ -@ChannelPipelineCoverage("all") public class XexunProtocolDecoder extends OneToOneDecoder { /** -- cgit v1.2.3