aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/org/traccar/helper/PatternBuilder.java67
-rw-r--r--src/org/traccar/protocol/TotemProtocolDecoder.java65
-rw-r--r--test/org/traccar/helper/PatternBuilderTest.java14
3 files changed, 114 insertions, 32 deletions
diff --git a/src/org/traccar/helper/PatternBuilder.java b/src/org/traccar/helper/PatternBuilder.java
new file mode 100644
index 000000000..7d307668d
--- /dev/null
+++ b/src/org/traccar/helper/PatternBuilder.java
@@ -0,0 +1,67 @@
+/*
+ * Copyright 2015 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.helper;
+
+import java.util.regex.Pattern;
+
+public class PatternBuilder {
+
+ private final StringBuilder pattern = new StringBuilder();
+
+ private final boolean collapse = true;
+
+ public PatternBuilder xpr(String s) {
+ pattern.append(s);
+ return this;
+ }
+
+ public PatternBuilder txt(String s) {
+ pattern.append(s.replaceAll("([\\\\\\.\\[\\{\\(\\*\\+\\?\\^\\$\\|])", "\\\\$1"));
+ return this;
+ }
+
+ public PatternBuilder num(String s) {
+ if (collapse) {
+ s = s.replace("dddd", "d{4}").replace("ddd", "d{3}").replace("dd", "d{2}");
+ s = s.replace("xxxx", "x{4}").replace("xxx", "x{3}").replace("xx", "x{2}");
+ }
+ pattern.append(s.replace("d", "\\d").replace("x", "\\p{XDigit}").replaceAll("([\\.\\|])", "\\\\$1"));
+ return this;
+ }
+
+ public PatternBuilder any() {
+ pattern.append(".*");
+ return this;
+ }
+
+ public PatternBuilder not(String s) {
+ return xpr("[^").txt(s).xpr("]+");
+ }
+
+ public PatternBuilder nxt(String s) {
+ return not(s).txt(s);
+ }
+
+ public Pattern compile() {
+ return Pattern.compile(pattern.toString(), Pattern.DOTALL);
+ }
+
+ @Override
+ public String toString() {
+ return pattern.toString();
+ }
+
+}
diff --git a/src/org/traccar/protocol/TotemProtocolDecoder.java b/src/org/traccar/protocol/TotemProtocolDecoder.java
index b87198481..4f65d2cbd 100644
--- a/src/org/traccar/protocol/TotemProtocolDecoder.java
+++ b/src/org/traccar/protocol/TotemProtocolDecoder.java
@@ -22,6 +22,7 @@ import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.jboss.netty.channel.Channel;
import org.traccar.BaseProtocolDecoder;
+import org.traccar.helper.PatternBuilder;
import org.traccar.model.Event;
import org.traccar.model.Position;
@@ -31,38 +32,38 @@ public class TotemProtocolDecoder extends BaseProtocolDecoder {
super(protocol);
}
- private static final Pattern pattern1 = Pattern.compile(
- "\\$\\$" + // Header
- "\\p{XDigit}{2}" + // Length
- "(\\d+)\\|" + // IMEI
- "(..)" + // Alarm Type
- "\\$GPRMC," +
- "(\\d{2})(\\d{2})(\\d{2})\\.\\d+," + // Time (HHMMSS.SS)
- "([AV])," + // Validity
- "(\\d+)(\\d{2}\\.\\d+)," + // Latitude (DDMM.MMMM)
- "([NS])," +
- "(\\d+)(\\d{2}\\.\\d+)," + // Longitude (DDDMM.MMMM)
- "([EW])," +
- "(\\d+\\.?\\d*)?," + // Speed
- "(\\d+\\.?\\d*)?," + // Course
- "(\\d{2})(\\d{2})(\\d{2})" + // Date (DDMMYY)
- "[^\\*]+\\*\\p{XDigit}{2}\\|" + // Checksum
- "\\d+\\.\\d+\\|" + // PDOP
- "(\\d+\\.\\d+)\\|" + // HDOP
- "\\d+\\.\\d+\\|" + // VDOP
- "(\\d+)\\|" + // IO Status
- "\\d+\\|" + // Time
- "\\d" + // Charged
- "(\\d{3})" + // Battery
- "(\\d{4})\\|" + // External Power
- "(?:(\\d+)\\|)?" + // ADC
- "(\\p{XDigit}+)\\|" + // Location Code
- "(\\d+)\\|" + // Temperature
- "(\\d+.\\d+)\\|" + // Odometer
- "\\d+\\|" + // Serial Number
- ".*\\|?" +
- "\\p{XDigit}{4}" + // Checksum
- "\r?\n?");
+ private static final Pattern pattern1 = new PatternBuilder()
+ .txt("$$") // header
+ .num("xx") // length
+ .num("(d+)|") // imei
+ .xpr("(..)") // alarm
+ .txt("$GPRMC,")
+ .num("(dd)(dd)(dd).d+,") // time
+ .xpr("([AV]),") // validity
+ .num("(d+)(dd.d+),([NS]),") // latitude
+ .num("(d+)(dd.d+),([EW]),") // longitude
+ .num("(d+.?d*)?,") // speed
+ .num("(d+.?d*)?,") // course
+ .num("(dd)(dd)(dd)") // date
+ .nxt("*")
+ .num("xx|") // checksum
+ .num("d+.d+|") // pdop
+ .num("(d+.d+)|") // hdop
+ .num("d+.d+|") // vdop
+ .num("(d+)|") // io status
+ .num("d+|") // time
+ .num("d") // charged
+ .num("(ddd)") // battery
+ .num("(dddd)|") // power
+ .num("(?:(d+)|)?") // adc
+ .num("(x+)|") // location code
+ .num("(d+)|") // temperature
+ .num("(d+.d+)|") // odometer
+ .num("d+|") // serial number
+ .any()
+ .num("xxxx") // checksum
+ .any()
+ .compile();
private static final Pattern pattern2 = Pattern.compile(
"\\$\\$" + // Header
diff --git a/test/org/traccar/helper/PatternBuilderTest.java b/test/org/traccar/helper/PatternBuilderTest.java
new file mode 100644
index 000000000..a36481934
--- /dev/null
+++ b/test/org/traccar/helper/PatternBuilderTest.java
@@ -0,0 +1,14 @@
+package org.traccar.helper;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+public class PatternBuilderTest {
+
+ @Test
+ public void testPatternBuilder() {
+ Assert.assertEquals("\\$GPRMC", new PatternBuilder().txt("$GPRMC").toString());
+ Assert.assertEquals("(\\d{2}\\.\\p{XDigit}+)", new PatternBuilder().num("(dd.x+)").toString());
+ }
+
+}