aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--nbproject/build-impl.xml241
-rw-r--r--nbproject/genfiles.properties4
-rw-r--r--nbproject/project.properties18
-rw-r--r--src/net/sourceforge/opentracking/Server.java162
-rw-r--r--src/net/sourceforge/opentracking/TrackerEventHandler.java4
-rw-r--r--src/net/sourceforge/opentracking/TrackerServer.java29
-rw-r--r--src/net/sourceforge/opentracking/protocol/gps103/Gps103ProtocolDecoder.java15
-rw-r--r--src/net/sourceforge/opentracking/protocol/tk103/Tk103ProtocolDecoder.java6
-rw-r--r--src/net/sourceforge/opentracking/protocol/xexun/XexunProtocolDecoder.java2
-rw-r--r--test/net/sourceforge/opentracking/protocol/gps103/Gps103ProtocolDecoderTest.java3
-rw-r--r--test/net/sourceforge/opentracking/protocol/tk103/Tk103ProtocolDecoderTest.java2
11 files changed, 359 insertions, 127 deletions
diff --git a/nbproject/build-impl.xml b/nbproject/build-impl.xml
index ce971292e..d1e971a8e 100644
--- a/nbproject/build-impl.xml
+++ b/nbproject/build-impl.xml
@@ -55,7 +55,14 @@ is divided into following sections:
</target>
<target depends="-pre-init,-init-private,-init-user,-init-project,-init-macrodef-property" name="-do-init">
<available file="${manifest.file}" property="manifest.available"/>
- <available file="${application.splash}" property="splashscreen.available"/>
+ <condition property="splashscreen.available">
+ <and>
+ <not>
+ <equals arg1="${application.splash}" arg2="" trim="true"/>
+ </not>
+ <available file="${application.splash}"/>
+ </and>
+ </condition>
<condition property="main.class.available">
<and>
<isset property="main.class"/>
@@ -70,8 +77,14 @@ is divided into following sections:
<isset property="main.class.available"/>
</and>
</condition>
+ <condition property="do.archive">
+ <not>
+ <istrue value="${jar.archive.disabled}"/>
+ </not>
+ </condition>
<condition property="do.mkdist">
<and>
+ <isset property="do.archive"/>
<isset property="libs.CopyLibs.classpath"/>
<not>
<istrue value="${mkdist.disabled}"/>
@@ -84,41 +97,42 @@ is divided into following sections:
<isset property="do.mkdist"/>
</and>
</condition>
- <condition property="manifest.available+main.class+mkdist.available+splashscreen.available">
- <and>
- <istrue value="${manifest.available+main.class+mkdist.available}"/>
- <istrue value="${splashscreen.available}"/>
- </and>
- </condition>
- <condition property="do.archive">
- <not>
- <istrue value="${jar.archive.disabled}"/>
- </not>
- </condition>
<condition property="do.archive+manifest.available">
<and>
<isset property="manifest.available"/>
<istrue value="${do.archive}"/>
</and>
</condition>
- <condition property="do.archive+manifest.available+main.class">
+ <condition property="do.archive+main.class.available">
<and>
- <istrue value="${manifest.available+main.class}"/>
+ <isset property="main.class.available"/>
<istrue value="${do.archive}"/>
</and>
</condition>
- <condition property="do.archive+manifest.available+main.class+mkdist.available">
+ <condition property="do.archive+splashscreen.available">
<and>
- <istrue value="${manifest.available+main.class+mkdist.available}"/>
+ <isset property="splashscreen.available"/>
<istrue value="${do.archive}"/>
</and>
</condition>
- <condition property="do.archive+manifest.available+main.class+mkdist.available+splashscreen.available">
+ <condition property="do.archive+manifest.available+main.class">
<and>
- <istrue value="${manifest.available+main.class+mkdist.available+splashscreen.available}"/>
+ <istrue value="${manifest.available+main.class}"/>
<istrue value="${do.archive}"/>
</and>
</condition>
+ <condition property="manifest.available-mkdist.available">
+ <or>
+ <istrue value="${manifest.available}"/>
+ <isset property="do.mkdist"/>
+ </or>
+ </condition>
+ <condition property="manifest.available+main.class-mkdist.available">
+ <or>
+ <istrue value="${manifest.available+main.class}"/>
+ <isset property="do.mkdist"/>
+ </or>
+ </condition>
<condition property="have.tests">
<or>
<available file="${test.src.dir}"/>
@@ -173,8 +187,17 @@ is divided into following sections:
<condition else="" property="endorsed.classpath.cmd.line.arg" value="-Xbootclasspath/p:'${toString:endorsed.classpath.path}'">
<length length="0" string="${endorsed.classpath}" when="greater"/>
</condition>
- <property name="javac.fork" value="false"/>
+ <condition else="false" property="jdkBug6558476">
+ <and>
+ <matches pattern="1\.[56]" string="${java.specification.version}"/>
+ <not>
+ <os family="unix"/>
+ </not>
+ </and>
+ </condition>
+ <property name="javac.fork" value="${jdkBug6558476}"/>
<property name="jar.index" value="false"/>
+ <property name="jar.index.metainf" value="${jar.index}"/>
<available file="${meta.inf.dir}/persistence.xml" property="has.persistence.xml"/>
</target>
<target name="-post-init">
@@ -302,7 +325,9 @@ is divided into following sections:
<delete>
<files includesfile="${javac.includesfile.binary}"/>
</delete>
- <delete file="${javac.includesfile.binary}"/>
+ <delete>
+ <fileset file="${javac.includesfile.binary}"/>
+ </delete>
</sequential>
</macrodef>
</target>
@@ -312,7 +337,8 @@ is divided into following sections:
<attribute default="${excludes}" name="excludes"/>
<attribute default="**" name="testincludes"/>
<sequential>
- <junit dir="${work.dir}" errorproperty="tests.failed" failureproperty="tests.failed" fork="true" showoutput="true" tempdir="${build.dir}">
+ <property name="junit.forkmode" value="perTest"/>
+ <junit dir="${work.dir}" errorproperty="tests.failed" failureproperty="tests.failed" fork="true" forkmode="${junit.forkmode}" showoutput="true" tempdir="${build.dir}">
<batchtest todir="${build.test.results.dir}">
<fileset dir="${test.src.dir}" excludes="@{excludes},${excludes}" includes="@{includes}">
<filename name="@{testincludes}"/>
@@ -328,11 +354,56 @@ is divided into following sections:
<formatter type="brief" usefile="false"/>
<formatter type="xml"/>
<jvmarg line="${endorsed.classpath.cmd.line.arg}"/>
+ <jvmarg value="-ea"/>
<jvmarg line="${run.jvmargs}"/>
</junit>
</sequential>
</macrodef>
</target>
+ <target depends="-profile-pre-init, init, -profile-post-init, -profile-init-macrodef-profile, -profile-init-check" name="profile-init"/>
+ <target name="-profile-pre-init">
+ <!-- Empty placeholder for easier customization. -->
+ <!-- You can override this target in the ../build.xml file. -->
+ </target>
+ <target name="-profile-post-init">
+ <!-- Empty placeholder for easier customization. -->
+ <!-- You can override this target in the ../build.xml file. -->
+ </target>
+ <target name="-profile-init-macrodef-profile">
+ <macrodef name="resolve">
+ <attribute name="name"/>
+ <attribute name="value"/>
+ <sequential>
+ <property name="@{name}" value="${env.@{value}}"/>
+ </sequential>
+ </macrodef>
+ <macrodef name="profile">
+ <attribute default="${main.class}" name="classname"/>
+ <element name="customize" optional="true"/>
+ <sequential>
+ <property environment="env"/>
+ <resolve name="profiler.current.path" value="${profiler.info.pathvar}"/>
+ <java classname="@{classname}" dir="${profiler.info.dir}" fork="true" jvm="${profiler.info.jvm}">
+ <jvmarg value="${profiler.info.jvmargs.agent}"/>
+ <jvmarg line="${profiler.info.jvmargs}"/>
+ <env key="${profiler.info.pathvar}" path="${profiler.info.agentpath}:${profiler.current.path}"/>
+ <arg line="${application.args}"/>
+ <classpath>
+ <path path="${run.classpath}"/>
+ </classpath>
+ <syspropertyset>
+ <propertyref prefix="run-sys-prop."/>
+ <mapper from="run-sys-prop.*" to="*" type="glob"/>
+ </syspropertyset>
+ <customize/>
+ </java>
+ </sequential>
+ </macrodef>
+ </target>
+ <target depends="-profile-pre-init, init, -profile-post-init, -profile-init-macrodef-profile" name="-profile-init-check">
+ <fail unless="profiler.info.jvm">Must set JVM to use for profiling in profiler.info.jvm</fail>
+ <fail unless="profiler.info.jvmargs.agent">Must set profiler agent JVM arguments in profiler.info.jvmargs.agent</fail>
+ </target>
<target depends="-init-debug-args" name="-init-macrodef-nbjpda">
<macrodef name="nbjpdastart" uri="http://www.netbeans.org/ns/j2se-project/1">
<attribute default="${main.class}" name="name"/>
@@ -427,6 +498,7 @@ is divided into following sections:
</target>
<target name="-init-macrodef-copylibs">
<macrodef name="copylibs" uri="http://www.netbeans.org/ns/j2se-project/3">
+ <attribute default="${manifest.file}" name="manifest"/>
<element name="customize" optional="true"/>
<sequential>
<property location="${build.classes.dir}" name="build.classes.dir.resolved"/>
@@ -442,7 +514,7 @@ is divided into following sections:
</chainedmapper>
</pathconvert>
<taskdef classname="org.netbeans.modules.java.j2seproject.copylibstask.CopyLibs" classpath="${libs.CopyLibs.classpath}" name="copylibs"/>
- <copylibs compress="${jar.compress}" index="${jar.index}" jarfile="${dist.jar}" manifest="${manifest.file}" runtimeclasspath="${run.classpath.without.build.classes.dir}">
+ <copylibs compress="${jar.compress}" index="${jar.index}" indexMetaInf="${jar.index.metainf}" jarfile="${dist.jar}" manifest="@{manifest}" runtimeclasspath="${run.classpath.without.build.classes.dir}">
<fileset dir="${build.classes.dir}"/>
<manifest>
<attribute name="Class-Path" value="${jar.classpath}"/>
@@ -571,10 +643,10 @@ is divided into following sections:
<!-- Empty placeholder for easier customization. -->
<!-- You can override this target in the ../build.xml file. -->
</target>
- <target depends="init,compile,-pre-pre-jar,-pre-jar" if="do.archive" name="-do-jar-without-manifest" unless="manifest.available">
+ <target depends="init,compile,-pre-pre-jar,-pre-jar" if="do.archive" name="-do-jar-without-manifest" unless="manifest.available-mkdist.available">
<j2seproject1:jar/>
</target>
- <target depends="init,compile,-pre-pre-jar,-pre-jar" if="do.archive+manifest.available" name="-do-jar-with-manifest" unless="manifest.available+main.class">
+ <target depends="init,compile,-pre-pre-jar,-pre-jar" if="do.archive+manifest.available" name="-do-jar-with-manifest" unless="manifest.available+main.class-mkdist.available">
<j2seproject1:jar manifest="${manifest.file}"/>
</target>
<target depends="init,compile,-pre-pre-jar,-pre-jar" if="do.archive+manifest.available+main.class" name="-do-jar-with-mainclass" unless="manifest.available+main.class+mkdist.available">
@@ -583,44 +655,53 @@ is divided into following sections:
<j2seproject1:attribute name="Main-Class" value="${main.class}"/>
</j2seproject1:manifest>
</j2seproject1:jar>
- <echo>To run this application from the command line without Ant, try:</echo>
+ <echo level="info">To run this application from the command line without Ant, try:</echo>
<property location="${build.classes.dir}" name="build.classes.dir.resolved"/>
<property location="${dist.jar}" name="dist.jar.resolved"/>
<pathconvert property="run.classpath.with.dist.jar">
<path path="${run.classpath}"/>
<map from="${build.classes.dir.resolved}" to="${dist.jar.resolved}"/>
</pathconvert>
- <echo>java -cp "${run.classpath.with.dist.jar}" ${main.class}</echo>
+ <echo level="info">java -cp "${run.classpath.with.dist.jar}" ${main.class}</echo>
</target>
- <target depends="init,compile,-pre-pre-jar,-pre-jar,-init-macrodef-copylibs" if="do.archive+manifest.available+main.class+mkdist.available+splashscreen.available" name="-do-jar-with-libraries-and-splashscreen">
+ <target depends="init" if="do.archive" name="-do-jar-with-libraries-create-manifest" unless="manifest.available">
+ <tempfile deleteonexit="true" destdir="${build.dir}" property="tmp.manifest.file"/>
+ <touch file="${tmp.manifest.file}" verbose="false"/>
+ </target>
+ <target depends="init" if="do.archive+manifest.available" name="-do-jar-with-libraries-copy-manifest">
+ <tempfile deleteonexit="true" destdir="${build.dir}" property="tmp.manifest.file"/>
+ <copy file="${manifest.file}" tofile="${tmp.manifest.file}"/>
+ </target>
+ <target depends="init,-do-jar-with-libraries-create-manifest,-do-jar-with-libraries-copy-manifest" if="do.archive+main.class.available" name="-do-jar-with-libraries-set-main">
+ <manifest file="${tmp.manifest.file}" mode="update">
+ <attribute name="Main-Class" value="${main.class}"/>
+ </manifest>
+ </target>
+ <target depends="init,-do-jar-with-libraries-create-manifest,-do-jar-with-libraries-copy-manifest" if="do.archive+splashscreen.available" name="-do-jar-with-libraries-set-splashscreen">
<basename file="${application.splash}" property="splashscreen.basename"/>
<mkdir dir="${build.classes.dir}/META-INF"/>
<copy failonerror="false" file="${application.splash}" todir="${build.classes.dir}/META-INF"/>
- <j2seproject3:copylibs>
- <customize>
- <attribute name="Main-Class" value="${main.class}"/>
- <attribute name="SplashScreen-Image" value="META-INF/${splashscreen.basename}"/>
- </customize>
- </j2seproject3:copylibs>
- <echo>To run this application from the command line without Ant, try:</echo>
- <property location="${dist.jar}" name="dist.jar.resolved"/>
- <echo>java -jar "${dist.jar.resolved}"</echo>
+ <manifest file="${tmp.manifest.file}" mode="update">
+ <attribute name="SplashScreen-Image" value="META-INF/${splashscreen.basename}"/>
+ </manifest>
</target>
- <target depends="init,compile,-pre-pre-jar,-pre-jar,-init-macrodef-copylibs" if="do.archive+manifest.available+main.class+mkdist.available" name="-do-jar-with-libraries" unless="splashscreen.available">
- <j2seproject3:copylibs>
- <customize>
- <attribute name="Main-Class" value="${main.class}"/>
- </customize>
- </j2seproject3:copylibs>
- <echo>To run this application from the command line without Ant, try:</echo>
+ <target depends="init,-init-macrodef-copylibs,compile,-pre-pre-jar,-pre-jar,-do-jar-with-libraries-create-manifest,-do-jar-with-libraries-copy-manifest,-do-jar-with-libraries-set-main,-do-jar-with-libraries-set-splashscreen" if="do.mkdist" name="-do-jar-with-libraries-pack">
+ <j2seproject3:copylibs manifest="${tmp.manifest.file}"/>
+ <echo level="info">To run this application from the command line without Ant, try:</echo>
<property location="${dist.jar}" name="dist.jar.resolved"/>
- <echo>java -jar "${dist.jar.resolved}"</echo>
+ <echo level="info">java -jar "${dist.jar.resolved}"</echo>
+ </target>
+ <target depends="-do-jar-with-libraries-pack" if="do.archive" name="-do-jar-with-libraries-delete-manifest">
+ <delete>
+ <fileset file="${tmp.manifest.file}"/>
+ </delete>
</target>
+ <target depends="init,compile,-pre-pre-jar,-pre-jar,-do-jar-with-libraries-create-manifest,-do-jar-with-libraries-copy-manifest,-do-jar-with-libraries-set-main,-do-jar-with-libraries-set-splashscreen,-do-jar-with-libraries-pack,-do-jar-with-libraries-delete-manifest" name="-do-jar-with-libraries"/>
<target name="-post-jar">
<!-- Empty placeholder for easier customization. -->
<!-- You can override this target in the ../build.xml file. -->
</target>
- <target depends="init,compile,-pre-jar,-do-jar-with-manifest,-do-jar-without-manifest,-do-jar-with-mainclass,-do-jar-with-libraries-and-splashscreen,-do-jar-with-libraries,-post-jar" description="Build JAR." name="jar"/>
+ <target depends="init,compile,-pre-jar,-do-jar-with-manifest,-do-jar-without-manifest,-do-jar-with-mainclass,-do-jar-with-libraries,-post-jar" description="Build JAR." name="jar"/>
<!--
=================
EXECUTION SECTION
@@ -686,6 +767,72 @@ is divided into following sections:
</target>
<target depends="init,-pre-debug-fix,-do-debug-fix" if="netbeans.home" name="debug-fix"/>
<!--
+ =================
+ PROFILING SECTION
+ =================
+ -->
+ <target depends="profile-init,compile" description="Profile a project in the IDE." if="netbeans.home" name="profile">
+ <nbprofiledirect>
+ <classpath>
+ <path path="${run.classpath}"/>
+ </classpath>
+ </nbprofiledirect>
+ <profile/>
+ </target>
+ <target depends="profile-init,compile-single" description="Profile a selected class in the IDE." if="netbeans.home" name="profile-single">
+ <fail unless="profile.class">Must select one file in the IDE or set profile.class</fail>
+ <nbprofiledirect>
+ <classpath>
+ <path path="${run.classpath}"/>
+ </classpath>
+ </nbprofiledirect>
+ <profile classname="${profile.class}"/>
+ </target>
+ <!--
+ =========================
+ APPLET PROFILING SECTION
+ =========================
+ -->
+ <target depends="profile-init,compile-single" if="netbeans.home" name="profile-applet">
+ <nbprofiledirect>
+ <classpath>
+ <path path="${run.classpath}"/>
+ </classpath>
+ </nbprofiledirect>
+ <profile classname="sun.applet.AppletViewer">
+ <customize>
+ <arg value="${applet.url}"/>
+ </customize>
+ </profile>
+ </target>
+ <!--
+ =========================
+ TESTS PROFILING SECTION
+ =========================
+ -->
+ <target depends="profile-init,compile-test-single" if="netbeans.home" name="profile-test-single">
+ <nbprofiledirect>
+ <classpath>
+ <path path="${run.test.classpath}"/>
+ </classpath>
+ </nbprofiledirect>
+ <junit dir="${profiler.info.dir}" errorproperty="tests.failed" failureproperty="tests.failed" fork="true" jvm="${profiler.info.jvm}" showoutput="true">
+ <env key="${profiler.info.pathvar}" path="${profiler.info.agentpath}:${profiler.current.path}"/>
+ <jvmarg value="${profiler.info.jvmargs.agent}"/>
+ <jvmarg line="${profiler.info.jvmargs}"/>
+ <test name="${profile.class}"/>
+ <classpath>
+ <path path="${run.test.classpath}"/>
+ </classpath>
+ <syspropertyset>
+ <propertyref prefix="test-sys-prop."/>
+ <mapper from="test-sys-prop.*" to="*" type="glob"/>
+ </syspropertyset>
+ <formatter type="brief" usefile="false"/>
+ <formatter type="xml"/>
+ </junit>
+ </target>
+ <!--
===============
JAVADOC SECTION
===============
@@ -731,7 +878,7 @@ is divided into following sections:
<target if="do.depend.true" name="-compile-test-depend">
<j2seproject3:depend classpath="${javac.test.classpath}" destdir="${build.test.classes.dir}" srcdir="${test.src.dir}"/>
</target>
- <target depends="init,compile,-pre-pre-compile-test,-pre-compile-test,-compile-test-depend" if="have.tests" name="-do-compile-test">
+ <target depends="init,deps-jar,compile,-pre-pre-compile-test,-pre-compile-test,-compile-test-depend" if="have.tests" name="-do-compile-test">
<j2seproject3:javac apgeneratedsrcdir="${build.test.classes.dir}" classpath="${javac.test.classpath}" debug="true" destdir="${build.test.classes.dir}" processorpath="${javac.test.processorpath}" srcdir="${test.src.dir}"/>
<copy todir="${build.test.classes.dir}">
<fileset dir="${test.src.dir}" excludes="${build.classes.excludes},${excludes}" includes="${includes}"/>
@@ -746,7 +893,7 @@ is divided into following sections:
<!-- Empty placeholder for easier customization. -->
<!-- You can override this target in the ../build.xml file. -->
</target>
- <target depends="init,compile,-pre-pre-compile-test,-pre-compile-test-single" if="have.tests" name="-do-compile-test-single">
+ <target depends="init,deps-jar,compile,-pre-pre-compile-test,-pre-compile-test-single" if="have.tests" name="-do-compile-test-single">
<fail unless="javac.includes">Must select some files in the IDE or set javac.includes</fail>
<j2seproject3:force-recompile destdir="${build.test.classes.dir}"/>
<j2seproject3:javac apgeneratedsrcdir="${build.test.classes.dir}" classpath="${javac.test.classpath}" debug="true" destdir="${build.test.classes.dir}" excludes="" includes="${javac.includes}" processorpath="${javac.test.processorpath}" sourcepath="${test.src.dir}" srcdir="${test.src.dir}"/>
diff --git a/nbproject/genfiles.properties b/nbproject/genfiles.properties
index 3f1e5c781..cdea35abe 100644
--- a/nbproject/genfiles.properties
+++ b/nbproject/genfiles.properties
@@ -4,5 +4,5 @@ build.xml.stylesheet.CRC32=28e38971@1.38.2.45
# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml.
# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you.
nbproject/build-impl.xml.data.CRC32=06177666
-nbproject/build-impl.xml.script.CRC32=48d0d70b
-nbproject/build-impl.xml.stylesheet.CRC32=229523de@1.38.3.45
+nbproject/build-impl.xml.script.CRC32=6a8d24fd
+nbproject/build-impl.xml.stylesheet.CRC32=0c01fd8e@1.43.1.45
diff --git a/nbproject/project.properties b/nbproject/project.properties
index 986777a28..4e1f3eb23 100644
--- a/nbproject/project.properties
+++ b/nbproject/project.properties
@@ -25,13 +25,15 @@ dist.jar=${dist.dir}/tracker-server.jar
dist.javadoc.dir=${dist.dir}/javadoc
endorsed.classpath=
excludes=
-file.reference.netty-3.2.3.Final.jar=C:\\Test\\traccar\\lib\\netty-3.2.3.Final.jar
+file.reference.netty-3.2.4.Final.jar=C:\\Test\\traccar\\lib\\netty-3.2.4.Final.jar
includes=**
+jar.archive.disabled=${jnlp.enabled}
jar.compress=false
+jar.index=${jnlp.enabled}
javac.classpath=\
${libs.PostgreSQLDriver.classpath}:\
- ${file.reference.netty-3.2.3.Final.jar}:\
- ${libs.MySQLDriver.classpath}
+ ${libs.MySQLDriver.classpath}:\
+ ${file.reference.netty-3.2.4.Final.jar}
# Space-separated list of extra javac options
javac.compilerargs=
javac.deprecation=false
@@ -54,9 +56,19 @@ javadoc.splitindex=true
javadoc.use=true
javadoc.version=false
javadoc.windowtitle=
+jnlp.codebase.type=no.codebase
+jnlp.descriptor=application
+jnlp.enabled=false
+jnlp.mixed.code=default
+jnlp.offline-allowed=false
+jnlp.signed=false
+jnlp.signing=
+jnlp.signing.alias=
+jnlp.signing.keystore=
main.class=Main
manifest.file=manifest.mf
meta.inf.dir=${src.dir}/META-INF
+mkdist.disabled=false
platform.active=default_platform
run.classpath=\
${javac.classpath}:\
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
@@ -203,6 +213,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
*/
public void initXexunServer(Properties properties) throws SQLException {
@@ -213,22 +270,48 @@ 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
*/
public void initGps103Server(Properties properties) throws SQLException {
@@ -239,25 +322,48 @@ 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
*/
public void initTk103Server(Properties properties) throws SQLException {
@@ -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,10 +23,6 @@ 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
@@ -34,24 +30,6 @@ import org.jboss.netty.channel.ChannelPipelineCoverage;
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
*/
private void init(Integer port, Integer threadPoolSize) {
@@ -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 {
/**
diff --git a/test/net/sourceforge/opentracking/protocol/gps103/Gps103ProtocolDecoderTest.java b/test/net/sourceforge/opentracking/protocol/gps103/Gps103ProtocolDecoderTest.java
index 1372c1c2c..895cbb534 100644
--- a/test/net/sourceforge/opentracking/protocol/gps103/Gps103ProtocolDecoderTest.java
+++ b/test/net/sourceforge/opentracking/protocol/gps103/Gps103ProtocolDecoderTest.java
@@ -41,7 +41,8 @@ public class Gps103ProtocolDecoderTest {
String testMsg1 = "##,imei:10000000000000,A";
// NEW MESSAGE: imei:359587017470280,tracker,0000000000,03184511405,L,;
- String testMsg2 = "imei:10000000000000,help me,1004171910,,F,010203.000,A,0102.0003,N,00102.0003,E,1.02,";
+ String testMsg2 = //"imei:10000000000000,help me,1004171910,,F,010203.000,A,0102.0003,N,00102.0003,E,1.02,";
+ "imei:353451040164707,tracker,1105182344,+36304665439,F,214418.000,A,4804.2222,N,01916.7593,E,0.37,";
Gps103ProtocolDecoder decoder = new Gps103ProtocolDecoder(new TestDataManager(), 0);
//assertNull(decoder.decode(null, null, testMsg1));
diff --git a/test/net/sourceforge/opentracking/protocol/tk103/Tk103ProtocolDecoderTest.java b/test/net/sourceforge/opentracking/protocol/tk103/Tk103ProtocolDecoderTest.java
index a94657c04..e318fe5fb 100644
--- a/test/net/sourceforge/opentracking/protocol/tk103/Tk103ProtocolDecoderTest.java
+++ b/test/net/sourceforge/opentracking/protocol/tk103/Tk103ProtocolDecoderTest.java
@@ -31,7 +31,7 @@ public class Tk103ProtocolDecoderTest {
@Test
public void testDecode() throws Exception {
- String testMsg1 = "(035988863964BP05000035988863964110430A4241.8399N02318.8131E000.0110112311.8310000000L00000094";
+ String testMsg1 = "(035988863964BP05000035988863964110524A4241.7977N02318.7561E000.0123536356.5100000000L000946BB";
Tk103ProtocolDecoder decoder = new Tk103ProtocolDecoder(new TestDataManager(), 0);
Position position = (Position) decoder.decode(null, null, testMsg1);