From adcb97105796b90b93603249eba8e07df7ebc3e4 Mon Sep 17 00:00:00 2001 From: "andreas.schildbach@gmail.com" Date: Tue, 3 May 2011 22:39:24 +0000 Subject: [PATCH] =?UTF-8?q?Z=C3=BCrich=20autocomplete?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: https://public-transport-enabler.googlecode.com/svn/trunk@594 0924bc21-9374-b0fa-ee44-9ff1593b38f0 --- .../schildbach/pte/AbstractHafasProvider.java | 86 ++++++++++++++++++- src/de/schildbach/pte/ZvvProvider.java | 14 ++- 2 files changed, 90 insertions(+), 10 deletions(-) diff --git a/src/de/schildbach/pte/AbstractHafasProvider.java b/src/de/schildbach/pte/AbstractHafasProvider.java index eb0f04e5..78d88f81 100644 --- a/src/de/schildbach/pte/AbstractHafasProvider.java +++ b/src/de/schildbach/pte/AbstractHafasProvider.java @@ -269,8 +269,90 @@ public abstract class AbstractHafasProvider implements NetworkProvider } } - private static final Pattern P_XML_QUERY_DEPARTURES_COARSE = Pattern.compile("\\G]*?)(?:/>|>]*?)/>)(?:\n|\\z)", - Pattern.DOTALL); + private static final Pattern P_XML_MLC_REQ_ID = Pattern.compile(".*?@L=(\\d+)@.*?"); + private static final Pattern P_XML_MLC_REQ_LONLAT = Pattern.compile(".*?@X=(\\d+)@Y=(\\d+)@.*?"); + + protected final List xmlMLcReq(final CharSequence constraint) throws IOException + { + final String request = ""; + + // ParserUtils.printXml(ParserUtils.scrape(apiUri, true, wrap(request), null, false)); + + InputStream is = null; + + try + { + is = ParserUtils.scrapeInputStream(apiUri, wrap(request), 3); + + final XmlPullParserFactory factory = XmlPullParserFactory.newInstance(System.getProperty(XmlPullParserFactory.PROPERTY_NAME), null); + final XmlPullParser pp = factory.newPullParser(); + pp.setInput(is, DEFAULT_ENCODING); + + final List results = new ArrayList(); + + assertResC(pp); + XmlPullUtil.enter(pp, "ResC"); + XmlPullUtil.enter(pp, "MLcRes"); + + while (XmlPullUtil.test(pp, "MLc")) + { + final String t = XmlPullUtil.attr(pp, "t"); + final LocationType type; + if ("ST".equals(t)) + type = LocationType.STATION; + else if ("POI".equals(t)) + type = LocationType.POI; + else if ("ADR".equals(t)) + type = LocationType.ADDRESS; + else + throw new IllegalStateException("cannot handle: '" + t + "'"); + + final int id; + final String i = pp.getAttributeValue(null, "i"); + if (i != null) + { + final Matcher iMatcherId = P_XML_MLC_REQ_ID.matcher(i); + if (!iMatcherId.matches()) + throw new IllegalStateException("cannot parse id: '" + i + "'"); + id = Integer.parseInt(iMatcherId.group(1)); + } + else + { + id = 0; + } + + final String name = XmlPullUtil.attr(pp, "n"); + + final String r = pp.getAttributeValue(null, "r"); + final Matcher iMatcherLonLat = P_XML_MLC_REQ_LONLAT.matcher(i != null ? i : r); + if (!iMatcherLonLat.matches()) + throw new IllegalStateException("cannot parse lon/lat: '" + i + "'"); + final int lon = Integer.parseInt(iMatcherLonLat.group(1)); + final int lat = Integer.parseInt(iMatcherLonLat.group(2)); + + results.add(new Location(type, id, lat, lon, null, name)); + + XmlPullUtil.next(pp); + } + + XmlPullUtil.exit(pp, "MLcRes"); + XmlPullUtil.exit(pp, "ResC"); + + return results; + } + catch (final XmlPullParserException x) + { + throw new RuntimeException(x); + } + finally + { + if (is != null) + is.close(); + } + } + + private static final Pattern P_XML_QUERY_DEPARTURES_COARSE = Pattern.compile( + "\\G]*?)(?:/>|>]*?)/>)(?:\n|\\z)", Pattern.DOTALL); private static final Pattern P_XML_QUERY_DEPARTURES_FINE = Pattern.compile("" // + "fpTime\\s*=\"(\\d{1,2}:\\d{2})\"\\s*" // time + "fpDate\\s*=\"(\\d{2}\\.\\d{2}\\.\\d{2}|\\d{4}-\\d{2}-\\d{2})\"\\s*" // date diff --git a/src/de/schildbach/pte/ZvvProvider.java b/src/de/schildbach/pte/ZvvProvider.java index 3051c184..51d96310 100644 --- a/src/de/schildbach/pte/ZvvProvider.java +++ b/src/de/schildbach/pte/ZvvProvider.java @@ -37,7 +37,7 @@ public class ZvvProvider extends AbstractHafasProvider public ZvvProvider() { - super(null, null); + super(API_BASE + "query.exe/dn", null); } public NetworkId id() @@ -54,16 +54,10 @@ public class ZvvProvider extends AbstractHafasProvider return false; } - private static final String AUTOCOMPLETE_URI = API_BASE - + "ajax-getstop.exe/dny?start=1&tpl=suggest2json&REQ0JourneyStopsS0A=255&REQ0JourneyStopsS0B=5&REQ0JourneyStopsB=12&getstop=1&noSession=yes&REQ0JourneyStopsS0G=%s?&js=true&"; - private static final String ENCODING = "ISO-8859-1"; - @Override public List autocompleteStations(final CharSequence constraint) throws IOException { - final String uri = String.format(AUTOCOMPLETE_URI, ParserUtils.urlEncode(constraint.toString(), ENCODING)); - - return ajaxGetStops(uri); + return xmlMLcReq(constraint); } @Override @@ -127,6 +121,8 @@ public class ZvvProvider extends AbstractHafasProvider return 'R'; if ("EXT".equals(ucType)) return 'R'; + if ("ATZ".equals(ucType)) // Autotunnelzug + return 'R'; if ("S-BAHN".equals(ucType)) return 'S'; @@ -162,6 +158,8 @@ public class ZvvProvider extends AbstractHafasProvider return 'C'; if ("LB".equals(ucType)) // Luftseilbahn return 'C'; + if ("SL".equals(ucType)) // Sessel-Lift + return 'C'; if ("UNB".equals(ucType)) return '?';