From a4e394be2698505a8fa1cc1a369cb6352e8433e4 Mon Sep 17 00:00:00 2001 From: "andreas.schildbach@gmail.com" Date: Wed, 13 Apr 2011 18:13:18 +0000 Subject: [PATCH] fixed parsing of ambiguous list git-svn-id: https://public-transport-enabler.googlecode.com/svn/trunk@557 0924bc21-9374-b0fa-ee44-9ff1593b38f0 --- src/de/schildbach/pte/BvgProvider.java | 52 +++++++++++++++----------- 1 file changed, 30 insertions(+), 22 deletions(-) diff --git a/src/de/schildbach/pte/BvgProvider.java b/src/de/schildbach/pte/BvgProvider.java index 51f98f68..c13b2411 100644 --- a/src/de/schildbach/pte/BvgProvider.java +++ b/src/de/schildbach/pte/BvgProvider.java @@ -303,9 +303,9 @@ public final class BvgProvider extends AbstractHafasProvider throw new IllegalArgumentException(type.toString()); } - private static final Pattern P_CHECK_ADDRESS = Pattern.compile("]*>\\s*(.*?)\\s*", Pattern.DOTALL); - private static final Pattern P_CHECK_FROM = Pattern.compile("Von:"); - private static final Pattern P_CHECK_TO = Pattern.compile("Nach:"); + private static final Pattern P_PRE_ADDRESS = Pattern.compile( + "]*name=\"(REQ0JourneyStopsS0K|REQ0JourneyStopsZ0K|REQ0JourneyStops1\\.0K)\"[^>]*>\n(.*?)", Pattern.DOTALL); + private static final Pattern P_ADDRESSES = Pattern.compile("]*>\\s*(.*?)\\s*", Pattern.DOTALL); @Override public QueryConnectionsResult queryConnections(final Location from, final Location via, final Location to, final Date date, final boolean dep, @@ -314,31 +314,39 @@ public final class BvgProvider extends AbstractHafasProvider final String uri = connectionsQueryUri(from, via, to, date, dep, products); final CharSequence page = ParserUtils.scrape(uri); - final Matcher mAddress = P_CHECK_ADDRESS.matcher(page); + List fromAddresses = null; + List viaAddresses = null; + List toAddresses = null; - final List addresses = new ArrayList(); - while (mAddress.find()) + final Matcher mPreAddress = P_PRE_ADDRESS.matcher(page); + while (mPreAddress.find()) { - final String address = ParserUtils.resolveEntities(mAddress.group(1)); - if (!addresses.contains(address)) - addresses.add(new Location(LocationType.ANY, 0, null, address + "!")); - } + final String type = mPreAddress.group(1); + final String options = mPreAddress.group(2); - if (addresses.isEmpty()) - { - return queryConnections(uri, page); - } - else if (P_CHECK_FROM.matcher(page).find()) - { - if (P_CHECK_TO.matcher(page).find()) - return new QueryConnectionsResult(null, addresses, null); + final Matcher mAddresses = P_ADDRESSES.matcher(options); + final List addresses = new ArrayList(); + while (mAddresses.find()) + { + final String address = ParserUtils.resolveEntities(mAddresses.group(1)).trim(); + if (!addresses.contains(address)) + addresses.add(new Location(LocationType.ANY, 0, null, address + "!")); + } + + if (type.equals("REQ0JourneyStopsS0K")) + fromAddresses = addresses; + else if (type.equals("REQ0JourneyStopsZ0K")) + toAddresses = addresses; + else if (type.equals("REQ0JourneyStops1.0K")) + viaAddresses = addresses; else - return new QueryConnectionsResult(null, null, addresses); + throw new IllegalStateException(type); } + + if (fromAddresses != null || viaAddresses != null || toAddresses != null) + return new QueryConnectionsResult(fromAddresses, viaAddresses, toAddresses); else - { - return new QueryConnectionsResult(addresses, null, null); - } + return queryConnections(uri, page); } @Override