From 7dfc244ce77103ccd5cdd9f15a82bfa90e9b189d Mon Sep 17 00:00:00 2001 From: "andreas.schildbach" Date: Wed, 8 Sep 2010 17:06:44 +0000 Subject: [PATCH] parse additional message for Frankfurt git-svn-id: https://public-transport-enabler.googlecode.com/svn/trunk@154 0924bc21-9374-b0fa-ee44-9ff1593b38f0 --- src/de/schildbach/pte/ParserUtils.java | 20 ++++++++++++++- src/de/schildbach/pte/RmvProvider.java | 11 +++------ src/de/schildbach/pte/VbbProvider.java | 18 +------------- test/de/schildbach/pte/RmvProviderTest.java | 27 +++++++++++++++++++-- 4 files changed, 48 insertions(+), 28 deletions(-) diff --git a/src/de/schildbach/pte/ParserUtils.java b/src/de/schildbach/pte/ParserUtils.java index 5a968167..dfe16994 100644 --- a/src/de/schildbach/pte/ParserUtils.java +++ b/src/de/schildbach/pte/ParserUtils.java @@ -241,10 +241,28 @@ public final class ParserUtils } } + public static T selectNotNull(final T... groups) + { + T selected = null; + + for (final T group : groups) + { + if (group != null) + { + if (selected == null) + selected = group; + else + throw new IllegalStateException("ambiguous"); + } + } + + return selected; + } + public static String extractId(final String link) { return link.substring(link.length() - 10); } - + public static final String P_PLATFORM = "[\\wÄÖÜäöüßáàâéèêíìîóòôúùû\\. -/&#;]+?"; } diff --git a/src/de/schildbach/pte/RmvProvider.java b/src/de/schildbach/pte/RmvProvider.java index 2d7aa682..1be85e49 100644 --- a/src/de/schildbach/pte/RmvProvider.java +++ b/src/de/schildbach/pte/RmvProvider.java @@ -460,8 +460,9 @@ public class RmvProvider implements NetworkProvider + "(\\d{1,2}:\\d{2})\n" // plannedTime + "(?:keine Prognose verfügbar\n)?" // + "(?:ca\\. (\\d{1,2}:\\d{2})\n)?" // predictedTime - + "(?:heute Gl\\. " + ParserUtils.P_PLATFORM + "
\n)?" // predictedPosition + + "(?:heute (Gl\\. " + ParserUtils.P_PLATFORM + ")
\n)?" // predictedPosition + "(?:(Gl\\. " + ParserUtils.P_PLATFORM + ")
\n)?" // position + + "(?:([^>]*)\n)?" // message + "(?:\"\"\n.+?\n
\n)*" // (messages) , Pattern.DOTALL); @@ -495,18 +496,14 @@ public class RmvProvider implements NetworkProvider final Matcher mDepFine = P_DEPARTURES_FINE.matcher(mDepCoarse.group(1)); if (mDepFine.matches()) { - // line final String line = normalizeLine(ParserUtils.resolveEntities(mDepFine.group(1))); - // destination final String destination = ParserUtils.resolveEntities(mDepFine.group(2)); - // time final Calendar current = new GregorianCalendar(); current.setTime(currentTime); final Calendar parsed = new GregorianCalendar(); - // plannedTime parsed.setTime(ParserUtils.parseTime(mDepFine.group(3))); parsed.set(Calendar.YEAR, current.get(Calendar.YEAR)); parsed.set(Calendar.MONTH, current.get(Calendar.MONTH)); @@ -515,7 +512,6 @@ public class RmvProvider implements NetworkProvider parsed.add(Calendar.DAY_OF_MONTH, 1); final Date plannedTime = parsed.getTime(); - // predictedTime Date predictedTime = null; if (mDepFine.group(4) != null) { @@ -528,8 +524,7 @@ public class RmvProvider implements NetworkProvider predictedTime = parsed.getTime(); } - // position - final String position = ParserUtils.resolveEntities(mDepFine.group(5)); + final String position = ParserUtils.resolveEntities(ParserUtils.selectNotNull(mDepFine.group(5), mDepFine.group(6))); final Departure dep = new Departure(plannedTime, predictedTime, line, line != null ? LINES.get(line.charAt(0)) : null, position, 0, destination, null); diff --git a/src/de/schildbach/pte/VbbProvider.java b/src/de/schildbach/pte/VbbProvider.java index 075f3583..860dfd8b 100644 --- a/src/de/schildbach/pte/VbbProvider.java +++ b/src/de/schildbach/pte/VbbProvider.java @@ -454,7 +454,7 @@ public final class VbbProvider implements NetworkProvider { final int arrivalId = mDetFine.group(12) != null ? Integer.parseInt(mDetFine.group(12)) : 0; - final String arrival = ParserUtils.resolveEntities(selectNotNull(mDetFine.group(13), mDetFine.group(16), mDetFine.group(17))); + final String arrival = ParserUtils.resolveEntities(ParserUtils.selectNotNull(mDetFine.group(13), mDetFine.group(16), mDetFine.group(17))); final double arrivalLon = mDetFine.group(14) != null ? latLonToDouble(Integer.parseInt(mDetFine.group(14))) : 0; @@ -494,22 +494,6 @@ public final class VbbProvider implements NetworkProvider } } - private static String selectNotNull(final String... groups) - { - String selected = null; - for (final String group : groups) - { - if (group != null) - { - if (selected == null) - selected = group; - else - throw new IllegalStateException("ambiguous"); - } - } - return selected; - } - private static final String DEPARTURE_URL_LIVE = "http://mobil.bvg.de/IstAbfahrtzeiten/index/mobil?"; private static final String DEPARTURE_URL_PLAN = "http://mobil.bvg.de/Fahrinfo/bin/stboard.bin/dox/dox?boardType=dep&start=yes&"; diff --git a/test/de/schildbach/pte/RmvProviderTest.java b/test/de/schildbach/pte/RmvProviderTest.java index 62813e14..45ea44ee 100644 --- a/test/de/schildbach/pte/RmvProviderTest.java +++ b/test/de/schildbach/pte/RmvProviderTest.java @@ -17,6 +17,7 @@ package de.schildbach.pte; +import static junit.framework.Assert.assertNotNull; import static junit.framework.Assert.assertTrue; import java.util.regex.Matcher; @@ -31,19 +32,41 @@ public class RmvProviderTest @Test public void departureWithNoPrognosisMessage() { - assertFineDepartures("Bus 42 \n" // + final Matcher m = assertFineDepartures("Bus 42 \n" // + ">>\n" // + "Frankfurt (Main) Enkheim\n" // + "
\n" // + "20:21\n" // + "keine Prognose verfügbar\n" // + "heute Gl. Enkheim
\n"); + + assertNotNull(m.group(5)); // predictedPosition } - private void assertFineDepartures(String s) + @Test + public void departureWithMessage() + { + final Matcher m = assertFineDepartures("Bus 274 \n" // + + ">>\n" // + + "Bad Schwalbach Kurhaus\n" // + + "
\n" // + + "15:47\n" // + + "Zug fällt aus\n"); + + assertNotNull(m.group(7)); // message + } + + private Matcher assertFineDepartures(String s) { Matcher m = RmvProvider.P_DEPARTURES_FINE.matcher(s); assertTrue(m.matches()); + // ParserUtils.printGroups(m); + + assertNotNull(m.group(1)); // line + assertNotNull(m.group(2)); // destination + assertNotNull(m.group(3)); // time + + return m; } }