From 0458890f5ccd5f8e7c9583d9f07b7f23e500a5ca Mon Sep 17 00:00:00 2001 From: "andreas.schildbach@gmail.com" Date: Sun, 11 Sep 2011 12:12:14 +0000 Subject: [PATCH] server product and server time in results git-svn-id: https://public-transport-enabler.googlecode.com/svn/trunk@772 0924bc21-9374-b0fa-ee44-9ff1593b38f0 --- .../schildbach/pte/AbstractEfaProvider.java | 47 ++++++++++++++----- .../schildbach/pte/AbstractHafasProvider.java | 45 ++++++++++-------- src/de/schildbach/pte/BahnProvider.java | 13 ++--- src/de/schildbach/pte/BvgProvider.java | 25 +++++----- src/de/schildbach/pte/InvgProvider.java | 8 ++-- src/de/schildbach/pte/NsProvider.java | 8 ++-- src/de/schildbach/pte/RmvProvider.java | 8 ++-- src/de/schildbach/pte/SeptaProvider.java | 8 ++-- src/de/schildbach/pte/ShProvider.java | 8 ++-- src/de/schildbach/pte/VgsProvider.java | 8 ++-- .../pte/dto/QueryConnectionsResult.java | 18 +++---- .../pte/dto/QueryDeparturesResult.java | 7 ++- src/de/schildbach/pte/dto/ResultHeader.java | 45 ++++++++++++++++++ 13 files changed, 169 insertions(+), 79 deletions(-) create mode 100644 src/de/schildbach/pte/dto/ResultHeader.java diff --git a/src/de/schildbach/pte/AbstractEfaProvider.java b/src/de/schildbach/pte/AbstractEfaProvider.java index c44c02ba..ec86bd37 100644 --- a/src/de/schildbach/pte/AbstractEfaProvider.java +++ b/src/de/schildbach/pte/AbstractEfaProvider.java @@ -20,6 +20,7 @@ package de.schildbach.pte; import java.io.IOException; import java.io.InputStream; import java.text.DateFormat; +import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Calendar; @@ -51,8 +52,8 @@ import de.schildbach.pte.dto.LocationType; import de.schildbach.pte.dto.NearbyStationsResult; import de.schildbach.pte.dto.Point; import de.schildbach.pte.dto.QueryConnectionsResult; -import de.schildbach.pte.dto.QueryConnectionsResult.Status; import de.schildbach.pte.dto.QueryDeparturesResult; +import de.schildbach.pte.dto.ResultHeader; import de.schildbach.pte.dto.StationDepartures; import de.schildbach.pte.dto.Stop; import de.schildbach.pte.exception.ParserException; @@ -66,6 +67,8 @@ import de.schildbach.pte.util.XmlPullUtil; */ public abstract class AbstractEfaProvider implements NetworkProvider { + protected final static String SERVER_PRODUCT = "EFA"; + private final String apiBase; private final String additionalQueryParameter; private final boolean canAcceptPoiID; @@ -195,7 +198,7 @@ public abstract class AbstractEfaProvider implements NetworkProvider uri.append("&coordListOutputFormat=STRING"); uri.append("&max=").append(maxStations != 0 ? maxStations : 50); uri.append("&inclFilter=1&radius_1=").append(maxDistance != 0 ? maxDistance : 1320); - uri.append("&type_1=STOP"); + uri.append("&type_1=STOP"); // ENTRANCE, BUS_POINT, POI_POINT InputStream is = null; try @@ -1030,6 +1033,8 @@ public abstract class AbstractEfaProvider implements NetworkProvider return 'R' + type; if ("Pressnitztalbahn".equals(type)) // Bayern return 'R' + type; + if ("Schneeberg".equals(type)) // VOR + return 'R' + type; if (type.equals("BSB")) // Breisgau-S-Bahn return 'S' + str; @@ -1157,7 +1162,7 @@ public abstract class AbstractEfaProvider implements NetworkProvider final XmlPullParser pp = parserFactory.newPullParser(); pp.setInput(is, null); - enterItdRequest(pp); + final ResultHeader header = enterItdRequest(pp); XmlPullUtil.enter(pp, "itdDepartureMonitorRequest"); @@ -1172,7 +1177,7 @@ public abstract class AbstractEfaProvider implements NetworkProvider XmlPullUtil.enter(pp, "itdOdvName"); if ("identified".equals(nameState)) { - final QueryDeparturesResult result = new QueryDeparturesResult(); + final QueryDeparturesResult result = new QueryDeparturesResult(header); final Location location = processOdvNameElem(pp, place); result.stationDepartures.add(new StationDepartures(location, new LinkedList(), new LinkedList())); @@ -1308,7 +1313,7 @@ public abstract class AbstractEfaProvider implements NetworkProvider } else if ("notidentified".equals(nameState)) { - return new QueryDeparturesResult(QueryDeparturesResult.Status.INVALID_STATION); + return new QueryDeparturesResult(header, QueryDeparturesResult.Status.INVALID_STATION); } else { @@ -1573,7 +1578,8 @@ public abstract class AbstractEfaProvider implements NetworkProvider { final XmlPullParser pp = parserFactory.newPullParser(); pp.setInput(is, null); - final String sessionId = enterItdRequest(pp); + final ResultHeader header = enterItdRequest(pp); + final String context = header.context; XmlPullUtil.require(pp, "itdTripRequest"); final String requestId = XmlPullUtil.attr(pp, "requestID"); @@ -1583,7 +1589,7 @@ public abstract class AbstractEfaProvider implements NetworkProvider { final int code = XmlPullUtil.intAttr(pp, "code"); if (code == -4000) // no connection - return new QueryConnectionsResult(Status.NO_CONNECTIONS); + return new QueryConnectionsResult(header, QueryConnectionsResult.Status.NO_CONNECTIONS); XmlPullUtil.next(pp); } if (XmlPullUtil.test(pp, "itdPrintConfiguration")) @@ -1653,7 +1659,7 @@ public abstract class AbstractEfaProvider implements NetworkProvider } if (ambiguousFrom != null || ambiguousTo != null || ambiguousVia != null) - return new QueryConnectionsResult(ambiguousFrom, ambiguousVia, ambiguousTo); + return new QueryConnectionsResult(header, ambiguousFrom, ambiguousVia, ambiguousTo); XmlPullUtil.enter(pp, "itdTripDateTime"); XmlPullUtil.enter(pp, "itdDateTime"); @@ -1666,7 +1672,7 @@ public abstract class AbstractEfaProvider implements NetworkProvider throw new IllegalStateException("cannot find "); final String message = pp.nextText(); if (message.equals("invalid date")) - return new QueryConnectionsResult(Status.INVALID_DATE); + return new QueryConnectionsResult(header, QueryConnectionsResult.Status.INVALID_DATE); XmlPullUtil.exit(pp, "itdDate"); } XmlPullUtil.exit(pp, "itdDateTime"); @@ -1913,11 +1919,11 @@ public abstract class AbstractEfaProvider implements NetworkProvider XmlPullUtil.exit(pp, "itdRouteList"); - return new QueryConnectionsResult(uri, from, via, to, commandLink(sessionId, requestId, "tripNext"), connections); + return new QueryConnectionsResult(header, uri, from, via, to, commandLink(context, requestId, "tripNext"), connections); } else { - return new QueryConnectionsResult(Status.NO_CONNECTIONS); + return new QueryConnectionsResult(header, QueryConnectionsResult.Status.NO_CONNECTIONS); } } @@ -2133,15 +2139,30 @@ public abstract class AbstractEfaProvider implements NetworkProvider return LINES.get(line.charAt(0)); } - private String enterItdRequest(final XmlPullParser pp) throws XmlPullParserException, IOException + private ResultHeader enterItdRequest(final XmlPullParser pp) throws XmlPullParserException, IOException { if (pp.getEventType() == XmlPullParser.START_DOCUMENT) pp.next(); XmlPullUtil.require(pp, "itdRequest"); + final String serverVersion = XmlPullUtil.attr(pp, "version"); + final String now = XmlPullUtil.attr(pp, "now") + " " + timeZone().getDisplayName(true, TimeZone.SHORT); final String sessionId = XmlPullUtil.attr(pp, "sessionID"); + final DateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss z"); + long serverTime = 0; + try + { + serverTime = format.parse(now).getTime(); + } + catch (final ParseException x) + { + System.out.println("cannot parse time: '" + now + "'"); + } + + final ResultHeader header = new ResultHeader(SERVER_PRODUCT, serverVersion, serverTime, sessionId); + XmlPullUtil.enter(pp, "itdRequest"); if (XmlPullUtil.test(pp, "clientHeaderLines")) @@ -2156,6 +2177,6 @@ public abstract class AbstractEfaProvider implements NetworkProvider if (XmlPullUtil.test(pp, "serverMetaInfo")) XmlPullUtil.next(pp); - return sessionId; + return header; } } diff --git a/src/de/schildbach/pte/AbstractHafasProvider.java b/src/de/schildbach/pte/AbstractHafasProvider.java index 39b2489c..82c584a4 100644 --- a/src/de/schildbach/pte/AbstractHafasProvider.java +++ b/src/de/schildbach/pte/AbstractHafasProvider.java @@ -49,8 +49,8 @@ import de.schildbach.pte.dto.Location; import de.schildbach.pte.dto.LocationType; import de.schildbach.pte.dto.NearbyStationsResult; import de.schildbach.pte.dto.QueryConnectionsResult; -import de.schildbach.pte.dto.QueryConnectionsResult.Status; import de.schildbach.pte.dto.QueryDeparturesResult; +import de.schildbach.pte.dto.ResultHeader; import de.schildbach.pte.dto.StationDepartures; import de.schildbach.pte.dto.Stop; import de.schildbach.pte.util.Color; @@ -63,6 +63,8 @@ import de.schildbach.pte.util.XmlPullUtil; */ public abstract class AbstractHafasProvider implements NetworkProvider { + protected final static String SERVER_PRODUCT = "HAFAS"; + private static final String DEFAULT_ENCODING = "ISO-8859-1"; private static final String PROD = "hafas"; private static final int NUM_CONNECTIONS = 6; @@ -448,7 +450,8 @@ public abstract class AbstractHafasProvider implements NetworkProvider pp.nextTag(); - final QueryDeparturesResult result = new QueryDeparturesResult(); + final ResultHeader header = new ResultHeader(SERVER_PRODUCT); + final QueryDeparturesResult result = new QueryDeparturesResult(header); final List departures = new ArrayList(8); if (XmlPullUtil.test(pp, "Err")) @@ -457,7 +460,7 @@ public abstract class AbstractHafasProvider implements NetworkProvider final String text = XmlPullUtil.attr(pp, "text"); if (code.equals("H730")) // Your input is not valid - return new QueryDeparturesResult(QueryDeparturesResult.Status.INVALID_STATION); + return new QueryDeparturesResult(header, QueryDeparturesResult.Status.INVALID_STATION); if (code.equals("H890")) { result.stationDepartures.add(new StationDepartures(new Location(LocationType.STATION, stationId), Collections @@ -605,13 +608,15 @@ public abstract class AbstractHafasProvider implements NetworkProvider public QueryConnectionsResult queryConnections(Location from, Location via, Location to, final Date date, final boolean dep, final String products, final WalkSpeed walkSpeed) throws IOException { + final ResultHeader header = new ResultHeader(SERVER_PRODUCT); + if (from.type == LocationType.ANY || (from.type == LocationType.ADDRESS && !from.hasLocation())) { final List autocompletes = autocompleteStations(from.name); if (autocompletes.isEmpty()) - return new QueryConnectionsResult(QueryConnectionsResult.Status.NO_CONNECTIONS); // TODO + return new QueryConnectionsResult(header, QueryConnectionsResult.Status.NO_CONNECTIONS); // TODO if (autocompletes.size() > 1) - return new QueryConnectionsResult(autocompletes, null, null); + return new QueryConnectionsResult(header, autocompletes, null, null); from = autocompletes.get(0); } @@ -619,9 +624,9 @@ public abstract class AbstractHafasProvider implements NetworkProvider { final List autocompletes = autocompleteStations(via.name); if (autocompletes.isEmpty()) - return new QueryConnectionsResult(QueryConnectionsResult.Status.NO_CONNECTIONS); // TODO + return new QueryConnectionsResult(header, QueryConnectionsResult.Status.NO_CONNECTIONS); // TODO if (autocompletes.size() > 1) - return new QueryConnectionsResult(null, autocompletes, null); + return new QueryConnectionsResult(header, null, autocompletes, null); via = autocompletes.get(0); } @@ -629,9 +634,9 @@ public abstract class AbstractHafasProvider implements NetworkProvider { final List autocompletes = autocompleteStations(to.name); if (autocompletes.isEmpty()) - return new QueryConnectionsResult(QueryConnectionsResult.Status.NO_CONNECTIONS); // TODO + return new QueryConnectionsResult(header, QueryConnectionsResult.Status.NO_CONNECTIONS); // TODO if (autocompletes.size() > 1) - return new QueryConnectionsResult(null, null, autocompletes); + return new QueryConnectionsResult(header, null, null, autocompletes); to = autocompletes.get(0); } @@ -695,15 +700,17 @@ public abstract class AbstractHafasProvider implements NetworkProvider pp.setInput(is, DEFAULT_ENCODING); assertResC(pp); + final String product = XmlPullUtil.attr(pp, "prod"); + final ResultHeader header = new ResultHeader(SERVER_PRODUCT, product, 0, null); XmlPullUtil.enter(pp, "ResC"); if (XmlPullUtil.test(pp, "Err")) { final String code = XmlPullUtil.attr(pp, "code"); if (code.equals("I3")) // Input: date outside of the timetable period - return new QueryConnectionsResult(Status.INVALID_DATE); + return new QueryConnectionsResult(header, QueryConnectionsResult.Status.INVALID_DATE); if (code.equals("F1")) // Spool: Error reading the spoolfile - return new QueryConnectionsResult(Status.SERVICE_DOWN); + return new QueryConnectionsResult(header, QueryConnectionsResult.Status.SERVICE_DOWN); throw new IllegalStateException("error " + code + " " + XmlPullUtil.attr(pp, "text")); } @@ -713,19 +720,19 @@ public abstract class AbstractHafasProvider implements NetworkProvider { final String code = XmlPullUtil.attr(pp, "code"); if (code.equals("K9380") || code.equals("K895")) // Departure/Arrival are too near - return QueryConnectionsResult.TOO_CLOSE; + return new QueryConnectionsResult(header, QueryConnectionsResult.Status.TOO_CLOSE); if (code.equals("K9220")) // Nearby to the given address stations could not be found - return QueryConnectionsResult.UNRESOLVABLE_ADDRESS; + return new QueryConnectionsResult(header, QueryConnectionsResult.Status.UNRESOLVABLE_ADDRESS); if (code.equals("K9240")) // Internal error - return new QueryConnectionsResult(Status.SERVICE_DOWN); + return new QueryConnectionsResult(header, QueryConnectionsResult.Status.SERVICE_DOWN); if (code.equals("K9260")) // Departure station does not exist - return QueryConnectionsResult.NO_CONNECTIONS; + return new QueryConnectionsResult(header, QueryConnectionsResult.Status.NO_CONNECTIONS); if (code.equals("K890")) // No connections found - return QueryConnectionsResult.NO_CONNECTIONS; + return new QueryConnectionsResult(header, QueryConnectionsResult.Status.NO_CONNECTIONS); if (code.equals("K891")) // No route found (try entering an intermediate station) - return QueryConnectionsResult.NO_CONNECTIONS; + return new QueryConnectionsResult(header, QueryConnectionsResult.Status.NO_CONNECTIONS); if (code.equals("K899")) // An error occurred - return new QueryConnectionsResult(Status.SERVICE_DOWN); + return new QueryConnectionsResult(header, QueryConnectionsResult.Status.SERVICE_DOWN); // if (code.equals("K1:890")) // Unsuccessful or incomplete search (direction: forward) throw new IllegalStateException("error " + code + " " + XmlPullUtil.attr(pp, "text")); } @@ -992,7 +999,7 @@ public abstract class AbstractHafasProvider implements NetworkProvider XmlPullUtil.exit(pp); - return new QueryConnectionsResult(null, from, via, to, context, connections); + return new QueryConnectionsResult(header, null, from, via, to, context, connections); } catch (final XmlPullParserException x) { diff --git a/src/de/schildbach/pte/BahnProvider.java b/src/de/schildbach/pte/BahnProvider.java index afa5edfd..845972c0 100644 --- a/src/de/schildbach/pte/BahnProvider.java +++ b/src/de/schildbach/pte/BahnProvider.java @@ -35,6 +35,7 @@ import de.schildbach.pte.dto.LocationType; import de.schildbach.pte.dto.NearbyStationsResult; import de.schildbach.pte.dto.QueryConnectionsResult; import de.schildbach.pte.dto.QueryDeparturesResult; +import de.schildbach.pte.dto.ResultHeader; import de.schildbach.pte.exception.SessionExpiredException; import de.schildbach.pte.util.ParserUtils; @@ -290,7 +291,7 @@ public final class BahnProvider extends AbstractHafasProvider } if (fromAddresses != null || viaAddresses != null || toAddresses != null) - return new QueryConnectionsResult(fromAddresses, viaAddresses, toAddresses); + return new QueryConnectionsResult(new ResultHeader(SERVER_PRODUCT), fromAddresses, viaAddresses, toAddresses); else return queryConnections(uri, page); } @@ -322,13 +323,13 @@ public final class BahnProvider extends AbstractHafasProvider if (mError.find()) { if (mError.group(1) != null) - return QueryConnectionsResult.TOO_CLOSE; + return new QueryConnectionsResult(null, QueryConnectionsResult.Status.TOO_CLOSE); if (mError.group(2) != null) - return QueryConnectionsResult.UNRESOLVABLE_ADDRESS; + return new QueryConnectionsResult(null, QueryConnectionsResult.Status.UNRESOLVABLE_ADDRESS); if (mError.group(3) != null) - return QueryConnectionsResult.NO_CONNECTIONS; + return new QueryConnectionsResult(null, QueryConnectionsResult.Status.NO_CONNECTIONS); if (mError.group(4) != null) - return QueryConnectionsResult.INVALID_DATE; + return new QueryConnectionsResult(null, QueryConnectionsResult.Status.INVALID_DATE); if (mError.group(5) != null) throw new SessionExpiredException(); } @@ -378,7 +379,7 @@ public final class BahnProvider extends AbstractHafasProvider } } - return new QueryConnectionsResult(uri, from, null, to, linkLater, connections); + return new QueryConnectionsResult(new ResultHeader(SERVER_PRODUCT), uri, from, null, to, linkLater, connections); } else { diff --git a/src/de/schildbach/pte/BvgProvider.java b/src/de/schildbach/pte/BvgProvider.java index b8bc76f9..25ebf0c4 100644 --- a/src/de/schildbach/pte/BvgProvider.java +++ b/src/de/schildbach/pte/BvgProvider.java @@ -40,7 +40,7 @@ import de.schildbach.pte.dto.LocationType; import de.schildbach.pte.dto.NearbyStationsResult; import de.schildbach.pte.dto.QueryConnectionsResult; import de.schildbach.pte.dto.QueryDeparturesResult; -import de.schildbach.pte.dto.QueryDeparturesResult.Status; +import de.schildbach.pte.dto.ResultHeader; import de.schildbach.pte.dto.StationDepartures; import de.schildbach.pte.dto.Stop; import de.schildbach.pte.exception.SessionExpiredException; @@ -253,7 +253,8 @@ public final class BvgProvider extends AbstractHafasProvider public QueryDeparturesResult queryDepartures(final int stationId, final int maxDepartures, final boolean equivs) throws IOException { - final QueryDeparturesResult result = new QueryDeparturesResult(); + final ResultHeader header = new ResultHeader(SERVER_PRODUCT); + final QueryDeparturesResult result = new QueryDeparturesResult(header); if (stationId < 1000000) // live { @@ -265,9 +266,9 @@ public final class BvgProvider extends AbstractHafasProvider if (mError.find()) { if (mError.group(1) != null) - return new QueryDeparturesResult(Status.INVALID_STATION); + return new QueryDeparturesResult(header, QueryDeparturesResult.Status.INVALID_STATION); if (mError.group(2) != null) - return new QueryDeparturesResult(Status.SERVICE_DOWN); + return new QueryDeparturesResult(header, QueryDeparturesResult.Status.SERVICE_DOWN); if (mError.group(3) != null) throw new UnexpectedRedirectException(); } @@ -361,9 +362,9 @@ public final class BvgProvider extends AbstractHafasProvider if (mError.find()) { if (mError.group(1) != null) - return new QueryDeparturesResult(Status.INVALID_STATION); + return new QueryDeparturesResult(header, QueryDeparturesResult.Status.INVALID_STATION); if (mError.group(2) != null) - return new QueryDeparturesResult(Status.SERVICE_DOWN); + return new QueryDeparturesResult(header, QueryDeparturesResult.Status.SERVICE_DOWN); if (mError.group(3) != null) throw new UnexpectedRedirectException(); } @@ -595,7 +596,7 @@ public final class BvgProvider extends AbstractHafasProvider } if (fromAddresses != null || viaAddresses != null || toAddresses != null) - return new QueryConnectionsResult(fromAddresses, viaAddresses, toAddresses); + return new QueryConnectionsResult(new ResultHeader(SERVER_PRODUCT), fromAddresses, viaAddresses, toAddresses); else return queryConnections(uri, page); } @@ -688,13 +689,13 @@ public final class BvgProvider extends AbstractHafasProvider if (mError.find()) { if (mError.group(1) != null) - return QueryConnectionsResult.TOO_CLOSE; + return new QueryConnectionsResult(null, QueryConnectionsResult.Status.TOO_CLOSE); if (mError.group(2) != null) - return QueryConnectionsResult.UNRESOLVABLE_ADDRESS; + return new QueryConnectionsResult(null, QueryConnectionsResult.Status.UNRESOLVABLE_ADDRESS); if (mError.group(3) != null) - return QueryConnectionsResult.NO_CONNECTIONS; + return new QueryConnectionsResult(null, QueryConnectionsResult.Status.NO_CONNECTIONS); if (mError.group(4) != null) - return QueryConnectionsResult.INVALID_DATE; + return new QueryConnectionsResult(null, QueryConnectionsResult.Status.INVALID_DATE); if (mError.group(5) != null) throw new SessionExpiredException(); if (mError.group(6) != null) @@ -864,7 +865,7 @@ public final class BvgProvider extends AbstractHafasProvider } } - return new QueryConnectionsResult(firstUri, from, via, to, linkLater, connections); + return new QueryConnectionsResult(new ResultHeader(SERVER_PRODUCT), firstUri, from, via, to, linkLater, connections); } else { diff --git a/src/de/schildbach/pte/InvgProvider.java b/src/de/schildbach/pte/InvgProvider.java index 5ea19541..fa6c0427 100644 --- a/src/de/schildbach/pte/InvgProvider.java +++ b/src/de/schildbach/pte/InvgProvider.java @@ -35,6 +35,7 @@ import de.schildbach.pte.dto.LocationType; import de.schildbach.pte.dto.NearbyStationsResult; import de.schildbach.pte.dto.QueryDeparturesResult; import de.schildbach.pte.dto.QueryDeparturesResult.Status; +import de.schildbach.pte.dto.ResultHeader; import de.schildbach.pte.dto.StationDepartures; import de.schildbach.pte.util.Color; import de.schildbach.pte.util.ParserUtils; @@ -157,7 +158,8 @@ public class InvgProvider extends AbstractHafasProvider public QueryDeparturesResult queryDepartures(final int stationId, final int maxDepartures, final boolean equivs) throws IOException { - final QueryDeparturesResult result = new QueryDeparturesResult(); + final ResultHeader header = new ResultHeader(SERVER_PRODUCT); + final QueryDeparturesResult result = new QueryDeparturesResult(header); // scrape page final String uri = departuresQueryUri(stationId, maxDepartures); @@ -175,9 +177,9 @@ public class InvgProvider extends AbstractHafasProvider return result; } else if (mHeadCoarse.group(5) != null) - return new QueryDeparturesResult(Status.INVALID_STATION); + return new QueryDeparturesResult(header, Status.INVALID_STATION); else if (mHeadCoarse.group(6) != null) - return new QueryDeparturesResult(Status.SERVICE_DOWN); + return new QueryDeparturesResult(header, Status.SERVICE_DOWN); final int locationId = Integer.parseInt(mHeadCoarse.group(2)); diff --git a/src/de/schildbach/pte/NsProvider.java b/src/de/schildbach/pte/NsProvider.java index 4f309273..e10fc8d5 100644 --- a/src/de/schildbach/pte/NsProvider.java +++ b/src/de/schildbach/pte/NsProvider.java @@ -32,6 +32,7 @@ import de.schildbach.pte.dto.LocationType; import de.schildbach.pte.dto.NearbyStationsResult; import de.schildbach.pte.dto.QueryDeparturesResult; import de.schildbach.pte.dto.QueryDeparturesResult.Status; +import de.schildbach.pte.dto.ResultHeader; import de.schildbach.pte.dto.StationDepartures; import de.schildbach.pte.util.ParserUtils; @@ -126,7 +127,8 @@ public class NsProvider extends AbstractHafasProvider public QueryDeparturesResult queryDepartures(final int stationId, final int maxDepartures, final boolean equivs) throws IOException { - final QueryDeparturesResult result = new QueryDeparturesResult(); + final ResultHeader header = new ResultHeader(SERVER_PRODUCT); + final QueryDeparturesResult result = new QueryDeparturesResult(header); // scrape page final String uri = departuresQueryUri(stationId, maxDepartures); @@ -138,9 +140,9 @@ public class NsProvider extends AbstractHafasProvider { // messages if (mHeadCoarse.group(3) != null) - return new QueryDeparturesResult(Status.INVALID_STATION); + return new QueryDeparturesResult(header, Status.INVALID_STATION); else if (mHeadCoarse.group(4) != null) - return new QueryDeparturesResult(Status.SERVICE_DOWN); + return new QueryDeparturesResult(header, Status.SERVICE_DOWN); final Matcher mHeadFine = P_DEPARTURES_HEAD_FINE.matcher(mHeadCoarse.group(1)); if (mHeadFine.matches()) diff --git a/src/de/schildbach/pte/RmvProvider.java b/src/de/schildbach/pte/RmvProvider.java index 5aefdba8..047c2874 100644 --- a/src/de/schildbach/pte/RmvProvider.java +++ b/src/de/schildbach/pte/RmvProvider.java @@ -32,6 +32,7 @@ import de.schildbach.pte.dto.LocationType; import de.schildbach.pte.dto.NearbyStationsResult; import de.schildbach.pte.dto.QueryDeparturesResult; import de.schildbach.pte.dto.QueryDeparturesResult.Status; +import de.schildbach.pte.dto.ResultHeader; import de.schildbach.pte.dto.StationDepartures; import de.schildbach.pte.util.ParserUtils; @@ -205,7 +206,8 @@ public class RmvProvider extends AbstractHafasProvider public QueryDeparturesResult queryDepartures(final int stationId, final int maxDepartures, final boolean equivs) throws IOException { - final QueryDeparturesResult result = new QueryDeparturesResult(); + final ResultHeader header = new ResultHeader(SERVER_PRODUCT); + final QueryDeparturesResult result = new QueryDeparturesResult(header); // scrape page final String uri = departuresQueryUri(stationId, maxDepartures); @@ -217,9 +219,9 @@ public class RmvProvider extends AbstractHafasProvider { // messages if (mHeadCoarse.group(4) != null) - return new QueryDeparturesResult(Status.INVALID_STATION); + return new QueryDeparturesResult(header, Status.INVALID_STATION); else if (mHeadCoarse.group(5) != null) - return new QueryDeparturesResult(Status.SERVICE_DOWN); + return new QueryDeparturesResult(header, Status.SERVICE_DOWN); final int locationId = Integer.parseInt(mHeadCoarse.group(3)); diff --git a/src/de/schildbach/pte/SeptaProvider.java b/src/de/schildbach/pte/SeptaProvider.java index e6efd5f1..79d00547 100644 --- a/src/de/schildbach/pte/SeptaProvider.java +++ b/src/de/schildbach/pte/SeptaProvider.java @@ -34,6 +34,7 @@ import de.schildbach.pte.dto.LocationType; import de.schildbach.pte.dto.NearbyStationsResult; import de.schildbach.pte.dto.QueryDeparturesResult; import de.schildbach.pte.dto.QueryDeparturesResult.Status; +import de.schildbach.pte.dto.ResultHeader; import de.schildbach.pte.dto.StationDepartures; import de.schildbach.pte.util.ParserUtils; @@ -183,7 +184,8 @@ public class SeptaProvider extends AbstractHafasProvider public QueryDeparturesResult queryDepartures(final int stationId, final int maxDepartures, final boolean equivs) throws IOException { - final QueryDeparturesResult result = new QueryDeparturesResult(); + final ResultHeader header = new ResultHeader(SERVER_PRODUCT); + final QueryDeparturesResult result = new QueryDeparturesResult(header); // scrape page final String uri = departuresQueryUri(stationId, maxDepartures); @@ -201,9 +203,9 @@ public class SeptaProvider extends AbstractHafasProvider return result; } else if (mPageCoarse.group(6) != null) - return new QueryDeparturesResult(Status.INVALID_STATION); + return new QueryDeparturesResult(header, Status.INVALID_STATION); else if (mPageCoarse.group(7) != null) - return new QueryDeparturesResult(Status.SERVICE_DOWN); + return new QueryDeparturesResult(header, Status.SERVICE_DOWN); final String location = ParserUtils.resolveEntities(mPageCoarse.group(1)); final Calendar currentTime = new GregorianCalendar(timeZone()); diff --git a/src/de/schildbach/pte/ShProvider.java b/src/de/schildbach/pte/ShProvider.java index a727bfdb..769f13f5 100644 --- a/src/de/schildbach/pte/ShProvider.java +++ b/src/de/schildbach/pte/ShProvider.java @@ -33,6 +33,7 @@ import de.schildbach.pte.dto.LocationType; import de.schildbach.pte.dto.NearbyStationsResult; import de.schildbach.pte.dto.QueryDeparturesResult; import de.schildbach.pte.dto.QueryDeparturesResult.Status; +import de.schildbach.pte.dto.ResultHeader; import de.schildbach.pte.dto.StationDepartures; import de.schildbach.pte.util.ParserUtils; @@ -168,7 +169,8 @@ public class ShProvider extends AbstractHafasProvider public QueryDeparturesResult queryDepartures(final int stationId, final int maxDepartures, final boolean equivs) throws IOException { - final QueryDeparturesResult result = new QueryDeparturesResult(); + final ResultHeader header = new ResultHeader(SERVER_PRODUCT); + final QueryDeparturesResult result = new QueryDeparturesResult(header); // scrape page final String uri = departuresQueryUri(stationId, maxDepartures); @@ -186,9 +188,9 @@ public class ShProvider extends AbstractHafasProvider return result; } else if (mHeadCoarse.group(6) != null) - return new QueryDeparturesResult(Status.INVALID_STATION); + return new QueryDeparturesResult(header, Status.INVALID_STATION); else if (mHeadCoarse.group(7) != null) - return new QueryDeparturesResult(Status.SERVICE_DOWN); + return new QueryDeparturesResult(header, Status.SERVICE_DOWN); final String location = ParserUtils.resolveEntities(mHeadCoarse.group(1)); final Calendar currentTime = new GregorianCalendar(timeZone()); diff --git a/src/de/schildbach/pte/VgsProvider.java b/src/de/schildbach/pte/VgsProvider.java index f5252547..be8532da 100644 --- a/src/de/schildbach/pte/VgsProvider.java +++ b/src/de/schildbach/pte/VgsProvider.java @@ -33,6 +33,7 @@ import de.schildbach.pte.dto.LocationType; import de.schildbach.pte.dto.NearbyStationsResult; import de.schildbach.pte.dto.QueryDeparturesResult; import de.schildbach.pte.dto.QueryDeparturesResult.Status; +import de.schildbach.pte.dto.ResultHeader; import de.schildbach.pte.dto.StationDepartures; import de.schildbach.pte.util.ParserUtils; @@ -188,7 +189,8 @@ public class VgsProvider extends AbstractHafasProvider public QueryDeparturesResult queryDepartures(final int stationId, final int maxDepartures, final boolean equivs) throws IOException { - final QueryDeparturesResult result = new QueryDeparturesResult(); + final ResultHeader header = new ResultHeader(SERVER_PRODUCT); + final QueryDeparturesResult result = new QueryDeparturesResult(header); // scrape page final String uri = departuresQueryUri(stationId, maxDepartures); @@ -206,9 +208,9 @@ public class VgsProvider extends AbstractHafasProvider return result; } else if (mHeadCoarse.group(4) != null) - return new QueryDeparturesResult(Status.INVALID_STATION); + return new QueryDeparturesResult(header, Status.INVALID_STATION); else if (mHeadCoarse.group(5) != null) - return new QueryDeparturesResult(Status.SERVICE_DOWN); + return new QueryDeparturesResult(header, Status.SERVICE_DOWN); final Matcher mHeadFine = P_DEPARTURES_HEAD_FINE.matcher(mHeadCoarse.group(1)); if (mHeadFine.matches()) diff --git a/src/de/schildbach/pte/dto/QueryConnectionsResult.java b/src/de/schildbach/pte/dto/QueryConnectionsResult.java index d265a90b..e9a86b29 100644 --- a/src/de/schildbach/pte/dto/QueryConnectionsResult.java +++ b/src/de/schildbach/pte/dto/QueryConnectionsResult.java @@ -30,11 +30,7 @@ public final class QueryConnectionsResult implements Serializable OK, AMBIGUOUS, TOO_CLOSE, UNRESOLVABLE_ADDRESS, NO_CONNECTIONS, INVALID_DATE, SERVICE_DOWN; } - public static final QueryConnectionsResult TOO_CLOSE = new QueryConnectionsResult(Status.TOO_CLOSE); - public static final QueryConnectionsResult UNRESOLVABLE_ADDRESS = new QueryConnectionsResult(Status.UNRESOLVABLE_ADDRESS); - public static final QueryConnectionsResult NO_CONNECTIONS = new QueryConnectionsResult(Status.NO_CONNECTIONS); - public static final QueryConnectionsResult INVALID_DATE = new QueryConnectionsResult(Status.INVALID_DATE); - + public final ResultHeader header; public final Status status; public final List ambiguousFrom; @@ -48,9 +44,10 @@ public final class QueryConnectionsResult implements Serializable public final String context; public final List connections; - public QueryConnectionsResult(final String queryUri, final Location from, final Location via, final Location to, final String context, - final List connections) + public QueryConnectionsResult(final ResultHeader header, final String queryUri, final Location from, final Location via, final Location to, + final String context, final List connections) { + this.header = header; this.status = Status.OK; this.queryUri = queryUri; this.from = from; @@ -64,8 +61,10 @@ public final class QueryConnectionsResult implements Serializable this.ambiguousTo = null; } - public QueryConnectionsResult(final List ambiguousFrom, final List ambiguousVia, final List ambiguousTo) + public QueryConnectionsResult(final ResultHeader header, final List ambiguousFrom, final List ambiguousVia, + final List ambiguousTo) { + this.header = header; this.status = Status.AMBIGUOUS; this.ambiguousFrom = ambiguousFrom; this.ambiguousVia = ambiguousVia; @@ -79,8 +78,9 @@ public final class QueryConnectionsResult implements Serializable this.connections = null; } - public QueryConnectionsResult(final Status status) + public QueryConnectionsResult(final ResultHeader header, final Status status) { + this.header = header; this.status = status; this.ambiguousFrom = null; diff --git a/src/de/schildbach/pte/dto/QueryDeparturesResult.java b/src/de/schildbach/pte/dto/QueryDeparturesResult.java index 120d85c3..9838c20c 100644 --- a/src/de/schildbach/pte/dto/QueryDeparturesResult.java +++ b/src/de/schildbach/pte/dto/QueryDeparturesResult.java @@ -30,16 +30,19 @@ public final class QueryDeparturesResult OK, INVALID_STATION, SERVICE_DOWN } + public final ResultHeader header; public final Status status; public final List stationDepartures = new LinkedList(); - public QueryDeparturesResult() + public QueryDeparturesResult(final ResultHeader header) { + this.header = header; this.status = Status.OK; } - public QueryDeparturesResult(final Status status) + public QueryDeparturesResult(final ResultHeader header, final Status status) { + this.header = header; this.status = status; } diff --git a/src/de/schildbach/pte/dto/ResultHeader.java b/src/de/schildbach/pte/dto/ResultHeader.java new file mode 100644 index 00000000..2f9799ee --- /dev/null +++ b/src/de/schildbach/pte/dto/ResultHeader.java @@ -0,0 +1,45 @@ +/* + * Copyright 2010, 2011 the original author or authors. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package de.schildbach.pte.dto; + +/** + * @author Andreas Schildbach + */ +public final class ResultHeader +{ + public final String serverProduct; + public final String serverVersion; + public final long serverTime; + public final String context; + + public ResultHeader(final String serverProduct) + { + this.serverProduct = serverProduct; + this.serverVersion = null; + this.serverTime = 0; + this.context = null; + } + + public ResultHeader(final String serverProduct, final String serverVersion, final long serverTime, final String context) + { + this.serverProduct = serverProduct; + this.serverVersion = serverVersion; + this.serverTime = serverTime; + this.context = context; + } +}