Apply @Nullable annotation to NetworkProvider methods and DTOs.

This commit is contained in:
Andreas Schildbach 2015-02-04 16:22:50 +01:00
parent 883015177e
commit 5b3ceed733
45 changed files with 339 additions and 205 deletions

View file

@ -23,6 +23,13 @@
<version>18.0</version> <version>18.0</version>
</dependency> </dependency>
<!-- javax.annotation.* -->
<dependency>
<groupId>com.google.code.findbugs</groupId>
<artifactId>jsr305</artifactId>
<version>3.0.0</version>
</dependency>
<dependency> <dependency>
<groupId>org.json</groupId> <groupId>org.json</groupId>
<artifactId>json</artifactId> <artifactId>json</artifactId>

View file

@ -17,6 +17,7 @@
package de.schildbach.pte; package de.schildbach.pte;
import static com.google.common.base.Preconditions.checkNotNull;
import static com.google.common.base.Preconditions.checkState; import static com.google.common.base.Preconditions.checkState;
import java.io.IOException; import java.io.IOException;
@ -40,6 +41,8 @@ import java.util.concurrent.atomic.AtomicReference;
import java.util.regex.Matcher; import java.util.regex.Matcher;
import java.util.regex.Pattern; import java.util.regex.Pattern;
import javax.annotation.Nullable;
import org.json.JSONArray; import org.json.JSONArray;
import org.json.JSONException; import org.json.JSONException;
import org.json.JSONObject; import org.json.JSONObject;
@ -93,14 +96,14 @@ public abstract class AbstractEfaProvider extends AbstractNetworkProvider
private final String coordEndpoint; private final String coordEndpoint;
private String language = "de"; private String language = "de";
private String additionalQueryParameter = null; private @Nullable String additionalQueryParameter = null;
private boolean useRealtime = true; private boolean useRealtime = true;
private boolean needsSpEncId = false; private boolean needsSpEncId = false;
private boolean includeRegionId = true; private boolean includeRegionId = true;
private boolean useProxFootSearch = true; private boolean useProxFootSearch = true;
private Charset requestUrlEncoding = Charsets.ISO_8859_1; private Charset requestUrlEncoding = Charsets.ISO_8859_1;
private String httpReferer = null; private @Nullable String httpReferer = null;
private String httpRefererTrip = null; private @Nullable String httpRefererTrip = null;
private boolean httpPost = false; private boolean httpPost = false;
private boolean useRouteIndexAsTripId = true; private boolean useRouteIndexAsTripId = true;
private boolean useLineRestriction = true; private boolean useLineRestriction = true;
@ -999,8 +1002,8 @@ public abstract class AbstractEfaProvider extends AbstractNetworkProvider
private static final Pattern P_LINE_S_DB = Pattern.compile("(S\\d+) \\((?:DB Regio AG)\\)"); private static final Pattern P_LINE_S_DB = Pattern.compile("(S\\d+) \\((?:DB Regio AG)\\)");
private static final Pattern P_LINE_NUMBER = Pattern.compile("\\d+"); private static final Pattern P_LINE_NUMBER = Pattern.compile("\\d+");
protected Line parseLine(final String id, final String mot, String symbol, final String name, final String longName, final String trainType, protected Line parseLine(final @Nullable String id, final @Nullable String mot, @Nullable String symbol, final @Nullable String name,
final String trainNum, final String trainName) final @Nullable String longName, final @Nullable String trainType, final @Nullable String trainNum, final @Nullable String trainName)
{ {
if (mot == null) if (mot == null)
{ {
@ -1370,7 +1373,7 @@ public abstract class AbstractEfaProvider extends AbstractNetworkProvider
return new Line(id, Product.BUS, "SEV" + trainNumStr); return new Line(id, Product.BUS, "SEV" + trainNumStr);
if ("Bus replacement".equals(trainName)) // GB if ("Bus replacement".equals(trainName)) // GB
return new Line(id, Product.BUS, "BR"); return new Line(id, Product.BUS, "BR");
if ("BR".equals(trainType) && trainName.startsWith("Bus")) // GB if ("BR".equals(trainType) && trainName != null && trainName.startsWith("Bus")) // GB
return new Line(id, Product.BUS, "BR" + trainNum); return new Line(id, Product.BUS, "BR" + trainNum);
if ("GB".equals(trainType)) // Gondelbahn if ("GB".equals(trainType)) // Gondelbahn
@ -1440,13 +1443,13 @@ public abstract class AbstractEfaProvider extends AbstractNetworkProvider
+ "' trainType='" + trainType + "' trainNum='" + trainNum + "' trainName='" + trainName + "'"); + "' trainType='" + trainType + "' trainNum='" + trainNum + "' trainName='" + trainName + "'");
} }
public QueryDeparturesResult queryDepartures(final String stationId, final Date time, final int maxDepartures, final boolean equivs) public QueryDeparturesResult queryDepartures(final String stationId, final @Nullable Date time, final int maxDepartures, final boolean equivs)
throws IOException throws IOException
{ {
return xsltDepartureMonitorRequest(stationId, time, maxDepartures, equivs); return xsltDepartureMonitorRequest(stationId, time, maxDepartures, equivs);
} }
protected StringBuilder xsltDepartureMonitorRequestParameters(final String stationId, final Date time, final int maxDepartures, protected StringBuilder xsltDepartureMonitorRequestParameters(final String stationId, final @Nullable Date time, final int maxDepartures,
final boolean equivs) final boolean equivs)
{ {
final StringBuilder parameters = new StringBuilder(); final StringBuilder parameters = new StringBuilder();
@ -1482,8 +1485,8 @@ public abstract class AbstractEfaProvider extends AbstractNetworkProvider
uri.append("&itdTime=").append(ParserUtils.urlEncode(String.format(Locale.ENGLISH, "%02d%02d", hour, minute))); uri.append("&itdTime=").append(ParserUtils.urlEncode(String.format(Locale.ENGLISH, "%02d%02d", hour, minute)));
} }
private QueryDeparturesResult xsltDepartureMonitorRequest(final String stationId, final Date time, final int maxDepartures, final boolean equivs) private QueryDeparturesResult xsltDepartureMonitorRequest(final String stationId, final @Nullable Date time, final int maxDepartures,
throws IOException final boolean equivs) throws IOException
{ {
final StringBuilder parameters = xsltDepartureMonitorRequestParameters(stationId, time, maxDepartures, equivs); final StringBuilder parameters = xsltDepartureMonitorRequestParameters(stationId, time, maxDepartures, equivs);
@ -1562,8 +1565,9 @@ public abstract class AbstractEfaProvider extends AbstractNetworkProvider
assignedStationDepartures = new StationDepartures(new Location(LocationType.STATION, assignedStopId), assignedStationDepartures = new StationDepartures(new Location(LocationType.STATION, assignedStopId),
new LinkedList<Departure>(), new LinkedList<LineDestination>()); new LinkedList<Departure>(), new LinkedList<LineDestination>());
if (!assignedStationDepartures.lines.contains(line)) final List<LineDestination> assignedStationDeparturesLines = checkNotNull(assignedStationDepartures.lines);
assignedStationDepartures.lines.add(line); if (!assignedStationDeparturesLines.contains(line))
assignedStationDeparturesLines.add(line);
} }
XmlPullUtil.skipExit(pp, "itdServingLines"); XmlPullUtil.skipExit(pp, "itdServingLines");
} }
@ -1646,8 +1650,8 @@ public abstract class AbstractEfaProvider extends AbstractNetworkProvider
} }
} }
protected QueryDeparturesResult queryDeparturesMobile(final String stationId, final Date time, final int maxDepartures, final boolean equivs) protected QueryDeparturesResult queryDeparturesMobile(final String stationId, final @Nullable Date time, final int maxDepartures,
throws IOException final boolean equivs) throws IOException
{ {
final StringBuilder parameters = xsltDepartureMonitorRequestParameters(stationId, time, maxDepartures, equivs); final StringBuilder parameters = xsltDepartureMonitorRequestParameters(stationId, time, maxDepartures, equivs);
@ -1850,7 +1854,7 @@ public abstract class AbstractEfaProvider extends AbstractNetworkProvider
private StationDepartures findStationDepartures(final List<StationDepartures> stationDepartures, final String id) private StationDepartures findStationDepartures(final List<StationDepartures> stationDepartures, final String id)
{ {
for (final StationDepartures stationDeparture : stationDepartures) for (final StationDepartures stationDeparture : stationDepartures)
if (stationDeparture.location.id.equals(id)) if (id.equals(stationDeparture.location.id))
return stationDeparture; return stationDeparture;
return null; return null;
@ -1994,8 +1998,9 @@ public abstract class AbstractEfaProvider extends AbstractNetworkProvider
return (double) value / 1000000; return (double) value / 1000000;
} }
protected String xsltTripRequestParameters(final Location from, final Location via, final Location to, final Date time, final boolean dep, protected String xsltTripRequestParameters(final Location from, final @Nullable Location via, final Location to, final Date time,
final Collection<Product> products, final WalkSpeed walkSpeed, final Accessibility accessibility, final Set<Option> options) final boolean dep, final @Nullable Collection<Product> products, final @Nullable WalkSpeed walkSpeed,
final @Nullable Accessibility accessibility, final @Nullable Set<Option> options)
{ {
final StringBuilder uri = new StringBuilder(); final StringBuilder uri = new StringBuilder();
appendCommonRequestParams(uri, "XML"); appendCommonRequestParams(uri, "XML");
@ -2099,8 +2104,9 @@ public abstract class AbstractEfaProvider extends AbstractNetworkProvider
uri.append("&coordListOutputFormat=STRING"); uri.append("&coordListOutputFormat=STRING");
} }
public QueryTripsResult queryTrips(final Location from, final Location via, final Location to, final Date date, final boolean dep, public QueryTripsResult queryTrips(final Location from, final @Nullable Location via, final Location to, final Date date, final boolean dep,
final Set<Product> products, final WalkSpeed walkSpeed, final Accessibility accessibility, final Set<Option> options) throws IOException final @Nullable Set<Product> products, final @Nullable WalkSpeed walkSpeed, final @Nullable Accessibility accessibility,
final @Nullable Set<Option> options) throws IOException
{ {
final String parameters = xsltTripRequestParameters(from, via, to, date, dep, products, walkSpeed, accessibility, options); final String parameters = xsltTripRequestParameters(from, via, to, date, dep, products, walkSpeed, accessibility, options);
@ -2137,9 +2143,9 @@ public abstract class AbstractEfaProvider extends AbstractNetworkProvider
} }
} }
protected QueryTripsResult queryTripsMobile(final Location from, final Location via, final Location to, final Date date, final boolean dep, protected QueryTripsResult queryTripsMobile(final Location from, final @Nullable Location via, final Location to, final Date date,
final Collection<Product> products, final WalkSpeed walkSpeed, final Accessibility accessibility, final Set<Option> options) final boolean dep, final @Nullable Collection<Product> products, final @Nullable WalkSpeed walkSpeed,
throws IOException final @Nullable Accessibility accessibility, final @Nullable Set<Option> options) throws IOException
{ {
final String parameters = xsltTripRequestParameters(from, via, to, date, dep, products, walkSpeed, accessibility, options); final String parameters = xsltTripRequestParameters(from, via, to, date, dep, products, walkSpeed, accessibility, options);
@ -2645,11 +2651,11 @@ public abstract class AbstractEfaProvider extends AbstractNetworkProvider
final int size = intermediateStops.size(); final int size = intermediateStops.size();
if (size >= 2) if (size >= 2)
{ {
if (!intermediateStops.get(size - 1).location.id.equals(arrivalLocation.id)) if (!intermediateStops.get(size - 1).location.equals(arrivalLocation))
throw new IllegalStateException(); throw new IllegalStateException();
intermediateStops.remove(size - 1); intermediateStops.remove(size - 1);
if (!intermediateStops.get(0).location.id.equals(departureLocation.id)) if (!intermediateStops.get(0).location.equals(departureLocation))
throw new IllegalStateException(); throw new IllegalStateException();
intermediateStops.remove(0); intermediateStops.remove(0);
} }
@ -2786,8 +2792,8 @@ public abstract class AbstractEfaProvider extends AbstractNetworkProvider
return new QueryTripsResult(header, uri, from, via, to, new Context(commandLink((String) context, requestId)), trips); return new QueryTripsResult(header, uri, from, via, to, new Context(commandLink((String) context, requestId)), trips);
} }
private QueryTripsResult queryTripsMobile(final String uri, final Location from, final Location via, final Location to, final InputStream is) private QueryTripsResult queryTripsMobile(final String uri, final Location from, final @Nullable Location via, final Location to,
throws XmlPullParserException, IOException final InputStream is) throws XmlPullParserException, IOException
{ {
// System.out.println(uri); // System.out.println(uri);

View file

@ -42,6 +42,8 @@ import java.util.Set;
import java.util.regex.Matcher; import java.util.regex.Matcher;
import java.util.regex.Pattern; import java.util.regex.Pattern;
import javax.annotation.Nullable;
import org.json.JSONArray; import org.json.JSONArray;
import org.json.JSONException; import org.json.JSONException;
import org.json.JSONObject; import org.json.JSONObject;
@ -53,6 +55,7 @@ import com.google.common.base.Charsets;
import de.schildbach.pte.dto.Departure; import de.schildbach.pte.dto.Departure;
import de.schildbach.pte.dto.Line; import de.schildbach.pte.dto.Line;
import de.schildbach.pte.dto.Line.Attr;
import de.schildbach.pte.dto.Location; import de.schildbach.pte.dto.Location;
import de.schildbach.pte.dto.LocationType; import de.schildbach.pte.dto.LocationType;
import de.schildbach.pte.dto.NearbyLocationsResult; import de.schildbach.pte.dto.NearbyLocationsResult;
@ -88,14 +91,14 @@ public abstract class AbstractHafasProvider extends AbstractNetworkProvider
protected final String getStopEndpoint; protected final String getStopEndpoint;
protected final String queryEndpoint; protected final String queryEndpoint;
private final int numProductBits; private final int numProductBits;
private String accessId; private @Nullable String accessId = null;
private String clientType; private @Nullable String clientType = null;
private Charset jsonGetStopsEncoding; private Charset jsonGetStopsEncoding;
private boolean jsonGetStopsUseWeight = true; private boolean jsonGetStopsUseWeight = true;
private Charset jsonNearbyLocationsEncoding; private Charset jsonNearbyLocationsEncoding;
private boolean dominantPlanStopTime = false; private boolean dominantPlanStopTime = false;
private boolean useIso8601 = false; private boolean useIso8601 = false;
private String extXmlEndpoint = null; private @Nullable String extXmlEndpoint = null;
private boolean stationBoardHasStationTable = true; private boolean stationBoardHasStationTable = true;
private boolean stationBoardHasLocation = false; private boolean stationBoardHasLocation = false;
private boolean stationBoardCanDoEquivs = true; private boolean stationBoardCanDoEquivs = true;
@ -443,7 +446,7 @@ public abstract class AbstractHafasProvider extends AbstractNetworkProvider
} }
} }
public QueryDeparturesResult queryDepartures(final String stationId, final Date time, final int maxDepartures, final boolean equivs) public QueryDeparturesResult queryDepartures(final String stationId, final @Nullable Date time, final int maxDepartures, final boolean equivs)
throws IOException throws IOException
{ {
final StringBuilder uri = new StringBuilder(stationBoardEndpoint); final StringBuilder uri = new StringBuilder(stationBoardEndpoint);
@ -452,8 +455,8 @@ public abstract class AbstractHafasProvider extends AbstractNetworkProvider
return xmlStationBoard(uri.toString(), stationId); return xmlStationBoard(uri.toString(), stationId);
} }
protected void appendXmlStationBoardParameters(final StringBuilder uri, final Date time, final String stationId, final int maxDepartures, protected void appendXmlStationBoardParameters(final StringBuilder uri, final @Nullable Date time, final String stationId,
final boolean equivs, final String styleSheet) final int maxDepartures, final boolean equivs, final @Nullable String styleSheet)
{ {
uri.append("?productsFilter=").append(allProductsString()); uri.append("?productsFilter=").append(allProductsString());
uri.append("&boardType=dep"); uri.append("&boardType=dep");
@ -652,8 +655,9 @@ public abstract class AbstractHafasProvider extends AbstractNetworkProvider
if (product == null) if (product == null)
throw new IllegalArgumentException(); throw new IllegalArgumentException();
// could check for type consistency here // could check for type consistency here
if (prodLine.attrs != null) final Set<Attr> attrs = prodLine.attrs;
line = newLine(product, prodLine.label, null, prodLine.attrs.toArray(new Line.Attr[0])); if (attrs != null)
line = newLine(product, prodLine.label, null, attrs.toArray(new Line.Attr[0]));
else else
line = newLine(product, prodLine.label, null); line = newLine(product, prodLine.label, null);
} }
@ -747,8 +751,9 @@ public abstract class AbstractHafasProvider extends AbstractNetworkProvider
{ {
} }
public QueryTripsResult queryTrips(final Location from, final Location via, final Location to, final Date date, final boolean dep, public QueryTripsResult queryTrips(final Location from, final @Nullable Location via, final Location to, final Date date, final boolean dep,
final Set<Product> products, final WalkSpeed walkSpeed, final Accessibility accessibility, final Set<Option> options) throws IOException final @Nullable Set<Product> products, final @Nullable WalkSpeed walkSpeed, final @Nullable Accessibility accessibility,
final @Nullable Set<Option> options) throws IOException
{ {
return queryTripsBinary(from, via, to, date, dep, products, walkSpeed, accessibility, options); return queryTripsBinary(from, via, to, date, dep, products, walkSpeed, accessibility, options);
} }
@ -758,9 +763,9 @@ public abstract class AbstractHafasProvider extends AbstractNetworkProvider
return queryMoreTripsBinary(context, later); return queryMoreTripsBinary(context, later);
} }
protected final QueryTripsResult queryTripsXml(Location from, Location via, Location to, final Date date, final boolean dep, protected final QueryTripsResult queryTripsXml(Location from, @Nullable Location via, Location to, final Date date, final boolean dep,
final Collection<Product> products, final WalkSpeed walkSpeed, final Accessibility accessibility, final Set<Option> options) final @Nullable Collection<Product> products, final @Nullable WalkSpeed walkSpeed, final @Nullable Accessibility accessibility,
throws IOException final @Nullable Set<Option> options) throws IOException
{ {
final ResultHeader header = new ResultHeader(SERVER_PRODUCT); final ResultHeader header = new ResultHeader(SERVER_PRODUCT);
@ -859,7 +864,7 @@ public abstract class AbstractHafasProvider extends AbstractNetworkProvider
} }
private QueryTripsResult queryTripsXml(final Context previousContext, final boolean later, final CharSequence conReq, final Location from, private QueryTripsResult queryTripsXml(final Context previousContext, final boolean later, final CharSequence conReq, final Location from,
final Location via, final Location to) throws IOException final @Nullable Location via, final Location to) throws IOException
{ {
final String request = wrapReqC(conReq, null); final String request = wrapReqC(conReq, null);
@ -1187,7 +1192,7 @@ public abstract class AbstractHafasProvider extends AbstractNetworkProvider
// remove last intermediate // remove last intermediate
if (intermediateStops != null) if (intermediateStops != null)
if (!intermediateStops.isEmpty()) if (!intermediateStops.isEmpty())
if (!intermediateStops.get(intermediateStops.size() - 1).location.id.equals(sectionArrivalLocation.id)) if (!intermediateStops.get(intermediateStops.size() - 1).location.equals(sectionArrivalLocation))
intermediateStops.remove(intermediateStops.size() - 1); intermediateStops.remove(intermediateStops.size() - 1);
XmlPullUtil.skipExit(pp, "ConSection"); XmlPullUtil.skipExit(pp, "ConSection");
@ -1353,8 +1358,9 @@ public abstract class AbstractHafasProvider extends AbstractNetworkProvider
throw new IllegalArgumentException(location.type.toString()); throw new IllegalArgumentException(location.type.toString());
} }
protected void appendQueryTripsBinaryParameters(final StringBuilder uri, final Location from, final Location via, final Location to, protected void appendQueryTripsBinaryParameters(final StringBuilder uri, final Location from, final @Nullable Location via, final Location to,
final Date date, final boolean dep, final Collection<Product> products, final Accessibility accessibility, final Set<Option> options) final Date date, final boolean dep, final @Nullable Collection<Product> products, final @Nullable Accessibility accessibility,
final @Nullable Set<Option> options)
{ {
uri.append("?start=Suchen"); uri.append("?start=Suchen");
@ -1428,9 +1434,9 @@ public abstract class AbstractHafasProvider extends AbstractNetworkProvider
private final static int QUERY_TRIPS_BINARY_BUFFER_SIZE = 384 * 1024; private final static int QUERY_TRIPS_BINARY_BUFFER_SIZE = 384 * 1024;
protected final QueryTripsResult queryTripsBinary(Location from, Location via, Location to, final Date date, final boolean dep, protected final QueryTripsResult queryTripsBinary(Location from, @Nullable Location via, Location to, final Date date, final boolean dep,
final Collection<Product> products, final WalkSpeed walkSpeed, final Accessibility accessibility, final Set<Option> options) final @Nullable Collection<Product> products, final @Nullable WalkSpeed walkSpeed, final @Nullable Accessibility accessibility,
throws IOException final @Nullable Set<Option> options) throws IOException
{ {
final ResultHeader header = new ResultHeader(SERVER_PRODUCT); final ResultHeader header = new ResultHeader(SERVER_PRODUCT);
@ -1504,7 +1510,7 @@ public abstract class AbstractHafasProvider extends AbstractNetworkProvider
} }
} }
private QueryTripsResult queryTripsBinary(final String uri, final Location from, final Location via, final Location to, private QueryTripsResult queryTripsBinary(final String uri, final Location from, final @Nullable Location via, final Location to,
final int expectedBufferSize) throws IOException final int expectedBufferSize) throws IOException
{ {
/* /*

View file

@ -17,6 +17,8 @@
package de.schildbach.pte; package de.schildbach.pte;
import static com.google.common.base.Preconditions.checkNotNull;
import java.io.IOException; import java.io.IOException;
import java.text.ParseException; import java.text.ParseException;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
@ -30,6 +32,8 @@ import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.WeakHashMap; import java.util.WeakHashMap;
import javax.annotation.Nullable;
import org.json.JSONArray; import org.json.JSONArray;
import org.json.JSONException; import org.json.JSONException;
import org.json.JSONObject; import org.json.JSONObject;
@ -96,8 +100,8 @@ public abstract class AbstractNavitiaProvider extends AbstractNetworkProvider
private static class Context implements QueryTripsContext private static class Context implements QueryTripsContext
{ {
private Location from; private final Location from;
private Location to; private final Location to;
private final String prevQueryUri; private final String prevQueryUri;
private final String nextQueryUri; private final String nextQueryUri;
@ -831,7 +835,7 @@ public abstract class AbstractNavitiaProvider extends AbstractNetworkProvider
} }
} }
public QueryDeparturesResult queryDepartures(final String stationId, final Date time, final int maxDepartures, final boolean equivs) public QueryDeparturesResult queryDepartures(final String stationId, final @Nullable Date time, final int maxDepartures, final boolean equivs)
throws IOException throws IOException
{ {
final ResultHeader resultHeader = new ResultHeader(SERVER_PRODUCT, SERVER_VERSION, 0, null); final ResultHeader resultHeader = new ResultHeader(SERVER_PRODUCT, SERVER_VERSION, 0, null);
@ -885,7 +889,7 @@ public abstract class AbstractNavitiaProvider extends AbstractNetworkProvider
final List<LineDestination> lineDestinations = getStationLines(location.id); final List<LineDestination> lineDestinations = getStationLines(location.id);
for (LineDestination lineDestination : lineDestinations) for (LineDestination lineDestination : lineDestinations)
stationDepartures.lines.add(lineDestination); checkNotNull(stationDepartures.lines).add(lineDestination);
} }
// Build departure date. // Build departure date.
@ -981,8 +985,9 @@ public abstract class AbstractNavitiaProvider extends AbstractNetworkProvider
} }
} }
public QueryTripsResult queryTrips(final Location from, final Location via, final Location to, final Date date, final boolean dep, public QueryTripsResult queryTrips(final Location from, final @Nullable Location via, final Location to, final Date date, final boolean dep,
final Set<Product> products, final WalkSpeed walkSpeed, final Accessibility accessibility, final Set<Option> options) throws IOException final @Nullable Set<Product> products, final @Nullable WalkSpeed walkSpeed, final @Nullable Accessibility accessibility,
final @Nullable Set<Option> options) throws IOException
{ {
final ResultHeader resultHeader = new ResultHeader(SERVER_PRODUCT, SERVER_VERSION, 0, null); final ResultHeader resultHeader = new ResultHeader(SERVER_PRODUCT, SERVER_VERSION, 0, null);
@ -990,32 +995,34 @@ public abstract class AbstractNavitiaProvider extends AbstractNetworkProvider
{ {
if (from != null && from.isIdentified() && to != null && to.isIdentified()) if (from != null && from.isIdentified() && to != null && to.isIdentified())
{ {
final String fromString = printLocation(from); final StringBuilder queryUri = new StringBuilder(tripUri()).append("journeys");
final String toString = printLocation(to); queryUri.append("?from=").append(ParserUtils.urlEncode(printLocation(from)));
final String dateString = printDate(date); queryUri.append("&to=").append(ParserUtils.urlEncode(printLocation(to)));
final String dateTimeRep = dep ? "departure" : "arrival"; queryUri.append("&datetime=").append(printDate(date));
queryUri.append("&datetime_represents=").append(dep ? "departure" : "arrival");
queryUri.append("&count=").append(this.numTripsRequested);
queryUri.append("&depth=0");
// Set walking speed. // Set walking speed.
final double walkingSpeed; if (walkSpeed != null)
switch (walkSpeed)
{ {
case SLOW: final double walkingSpeed;
walkingSpeed = 1.12 * 0.8; switch (walkSpeed)
break; {
case NORMAL: case SLOW:
walkingSpeed = 1.12; walkingSpeed = 1.12 * 0.8;
break; break;
case FAST: case FAST:
walkingSpeed = 1.12 * 1.2; walkingSpeed = 1.12 * 1.2;
break; break;
default: case NORMAL:
walkingSpeed = 1.12; default:
break; walkingSpeed = 1.12;
} break;
}
final StringBuilder queryUri = new StringBuilder(tripUri() + "journeys?" + "from=" + ParserUtils.urlEncode(fromString) + "&to=" queryUri.append("&walking_speed=").append(walkingSpeed);
+ ParserUtils.urlEncode(toString) + "&datetime=" + dateString + "&datetime_represents=" + dateTimeRep + "&count=" }
+ this.numTripsRequested + "&walking_speed=" + walkingSpeed + "&depth=0");
if (options != null && options.contains(Option.BIKE)) if (options != null && options.contains(Option.BIKE))
{ {
@ -1024,7 +1031,7 @@ public abstract class AbstractNavitiaProvider extends AbstractNetworkProvider
} }
// Set forbidden commercial modes. // Set forbidden commercial modes.
if (!products.equals(Product.ALL)) if (products != null && !products.equals(Product.ALL))
{ {
if (!products.contains(Product.SUBURBAN_TRAIN)) if (!products.contains(Product.SUBURBAN_TRAIN))
{ {

View file

@ -25,6 +25,8 @@ import java.util.TimeZone;
import java.util.regex.Matcher; import java.util.regex.Matcher;
import java.util.regex.Pattern; import java.util.regex.Pattern;
import javax.annotation.Nullable;
import com.google.common.base.Strings; import com.google.common.base.Strings;
import de.schildbach.pte.dto.Point; import de.schildbach.pte.dto.Point;
@ -41,8 +43,8 @@ public abstract class AbstractNetworkProvider implements NetworkProvider
protected TimeZone timeZone = TimeZone.getTimeZone("CET"); protected TimeZone timeZone = TimeZone.getTimeZone("CET");
protected int numTripsRequested = 6; protected int numTripsRequested = 6;
private Map<String, Style> styles = null; private @Nullable Map<String, Style> styles = null;
protected String sessionCookieName = null; protected @Nullable String sessionCookieName = null;
public final boolean hasCapabilities(final Capability... capabilities) public final boolean hasCapabilities(final Capability... capabilities)
{ {
@ -82,8 +84,9 @@ public abstract class AbstractNetworkProvider implements NetworkProvider
private static final char STYLES_SEP = '|'; private static final char STYLES_SEP = '|';
public Style lineStyle(final String network, final Product product, final String label) public Style lineStyle(final @Nullable String network, final @Nullable Product product, final @Nullable String label)
{ {
final Map<String, Style> styles = this.styles;
if (styles != null && product != null) if (styles != null && product != null)
{ {
if (network != null) if (network != null)
@ -99,7 +102,7 @@ public abstract class AbstractNetworkProvider implements NetworkProvider
return productStyle; return productStyle;
// check for night bus, as that's a common special case // check for night bus, as that's a common special case
if (product == Product.BUS && label.startsWith("N")) if (product == Product.BUS && label != null && label.startsWith("N"))
{ {
final Style nightStyle = styles.get(network + STYLES_SEP + "BN"); final Style nightStyle = styles.get(network + STYLES_SEP + "BN");
if (nightStyle != null) if (nightStyle != null)
@ -119,7 +122,7 @@ public abstract class AbstractNetworkProvider implements NetworkProvider
return productStyle; return productStyle;
// check for night bus, as that's a common special case // check for night bus, as that's a common special case
if (product == Product.BUS && label.startsWith("N")) if (product == Product.BUS && label != null && label.startsWith("N"))
{ {
final Style nightStyle = styles.get("BN"); final Style nightStyle = styles.get("BN");
if (nightStyle != null) if (nightStyle != null)

View file

@ -34,6 +34,8 @@ import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.TimeZone; import java.util.TimeZone;
import javax.annotation.Nullable;
import org.json.JSONArray; import org.json.JSONArray;
import org.json.JSONException; import org.json.JSONException;
import org.json.JSONObject; import org.json.JSONObject;
@ -164,7 +166,7 @@ public abstract class AbstractTsiProvider extends AbstractNetworkProvider
return (double) value / 1000000; return (double) value / 1000000;
} }
private final String apiKey; private final @Nullable String apiKey;
private final String stopFinderEndpoint; private final String stopFinderEndpoint;
private final String tripEndpoint; private final String tripEndpoint;
@ -604,7 +606,7 @@ public abstract class AbstractTsiProvider extends AbstractNetworkProvider
return new Location(locType, id, Point.fromDouble(lat, lon), place, name); return new Location(locType, id, Point.fromDouble(lat, lon), place, name);
} }
public QueryDeparturesResult queryDepartures(final String stationId, final Date time, final int maxDepartures, final boolean equivs) public QueryDeparturesResult queryDepartures(final String stationId, final @Nullable Date time, final int maxDepartures, final boolean equivs)
throws IOException throws IOException
{ {
throw new UnsupportedOperationException(); throw new UnsupportedOperationException();
@ -632,8 +634,9 @@ public abstract class AbstractTsiProvider extends AbstractNetworkProvider
return jsonCoordRequest(location.lat, location.lon, maxDistance, maxLocations); return jsonCoordRequest(location.lat, location.lon, maxDistance, maxLocations);
} }
public QueryTripsResult queryTrips(final Location from, final Location via, final Location to, final Date date, final boolean dep, public QueryTripsResult queryTrips(final Location from, final @Nullable Location via, final Location to, final Date date, final boolean dep,
final Set<Product> products, final WalkSpeed walkSpeed, final Accessibility accessibility, final Set<Option> options) throws IOException final @Nullable Set<Product> products, final @Nullable WalkSpeed walkSpeed, final @Nullable Accessibility accessibility,
final @Nullable Set<Option> options) throws IOException
{ {
final List<Location> possibleFroms, possibleTos, possibleVias; final List<Location> possibleFroms, possibleTos, possibleVias;

View file

@ -20,6 +20,8 @@ package de.schildbach.pte;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import javax.annotation.Nullable;
import de.schildbach.pte.dto.Line; import de.schildbach.pte.dto.Line;
import de.schildbach.pte.dto.Product; import de.schildbach.pte.dto.Product;
import de.schildbach.pte.dto.Style; import de.schildbach.pte.dto.Style;
@ -46,8 +48,8 @@ public class AvvProvider extends AbstractEfaProvider
} }
@Override @Override
protected Line parseLine(final String id, final String mot, final String symbol, final String name, final String longName, protected Line parseLine(final @Nullable String id, final @Nullable String mot, final @Nullable String symbol, final @Nullable String name,
final String trainType, final String trainNum, final String trainName) final @Nullable String longName, final @Nullable String trainType, final @Nullable String trainNum, final @Nullable String trainName)
{ {
if ("0".equals(mot)) if ("0".equals(mot))
{ {

View file

@ -22,6 +22,8 @@ import java.util.Date;
import java.util.EnumSet; import java.util.EnumSet;
import java.util.Set; import java.util.Set;
import javax.annotation.Nullable;
import com.google.common.base.Charsets; import com.google.common.base.Charsets;
import de.schildbach.pte.dto.Line; import de.schildbach.pte.dto.Line;
@ -63,8 +65,8 @@ public class BayernProvider extends AbstractEfaProvider
} }
@Override @Override
protected Line parseLine(final String id, final String mot, final String symbol, final String name, final String longName, protected Line parseLine(final @Nullable String id, final @Nullable String mot, final @Nullable String symbol, final @Nullable String name,
final String trainType, final String trainNum, final String trainName) final @Nullable String longName, final @Nullable String trainType, final @Nullable String trainNum, final @Nullable String trainName)
{ {
if ("0".equals(mot)) if ("0".equals(mot))
{ {
@ -117,7 +119,7 @@ public class BayernProvider extends AbstractEfaProvider
} }
@Override @Override
public QueryDeparturesResult queryDepartures(final String stationId, final Date time, final int maxDepartures, final boolean equivs) public QueryDeparturesResult queryDepartures(final String stationId, final @Nullable Date time, final int maxDepartures, final boolean equivs)
throws IOException throws IOException
{ {
return queryDeparturesMobile(stationId, time, maxDepartures, equivs); return queryDeparturesMobile(stationId, time, maxDepartures, equivs);
@ -130,8 +132,9 @@ public class BayernProvider extends AbstractEfaProvider
} }
@Override @Override
public QueryTripsResult queryTrips(final Location from, final Location via, final Location to, final Date date, final boolean dep, public QueryTripsResult queryTrips(final Location from, final @Nullable Location via, final Location to, final Date date, final boolean dep,
final Set<Product> products, final WalkSpeed walkSpeed, final Accessibility accessibility, final Set<Option> options) throws IOException final @Nullable Set<Product> products, final @Nullable WalkSpeed walkSpeed, final @Nullable Accessibility accessibility,
final @Nullable Set<Option> options) throws IOException
{ {
return queryTripsMobile(from, via, to, date, dep, products, walkSpeed, accessibility, options); return queryTripsMobile(from, via, to, date, dep, products, walkSpeed, accessibility, options);
} }

View file

@ -23,6 +23,8 @@ import java.util.Set;
import java.util.regex.Matcher; import java.util.regex.Matcher;
import java.util.regex.Pattern; import java.util.regex.Pattern;
import javax.annotation.Nullable;
import de.schildbach.pte.dto.Line; import de.schildbach.pte.dto.Line;
import de.schildbach.pte.dto.Location; import de.schildbach.pte.dto.Location;
import de.schildbach.pte.dto.Product; import de.schildbach.pte.dto.Product;
@ -89,8 +91,9 @@ public class EireannProvider extends AbstractHafasProvider
} }
@Override @Override
public QueryTripsResult queryTrips(final Location from, final Location via, final Location to, final Date date, final boolean dep, public QueryTripsResult queryTrips(final Location from, final @Nullable Location via, final Location to, final Date date, final boolean dep,
final Set<Product> products, final WalkSpeed walkSpeed, final Accessibility accessibility, final Set<Option> options) throws IOException final @Nullable Set<Product> products, final @Nullable WalkSpeed walkSpeed, final @Nullable Accessibility accessibility,
final @Nullable Set<Option> options) throws IOException
{ {
return queryTripsXml(from, via, to, date, dep, products, walkSpeed, accessibility, options); return queryTripsXml(from, via, to, date, dep, products, walkSpeed, accessibility, options);
} }

View file

@ -31,6 +31,8 @@ import java.util.Set;
import java.util.regex.Matcher; import java.util.regex.Matcher;
import java.util.regex.Pattern; import java.util.regex.Pattern;
import javax.annotation.Nullable;
import com.google.common.base.Charsets; import com.google.common.base.Charsets;
import de.schildbach.pte.dto.Departure; import de.schildbach.pte.dto.Departure;
@ -176,7 +178,7 @@ public class InvgProvider extends AbstractHafasProvider
, Pattern.DOTALL); , Pattern.DOTALL);
@Override @Override
public QueryDeparturesResult queryDepartures(final String stationId, final Date time, final int maxDepartures, final boolean equivs) public QueryDeparturesResult queryDepartures(final String stationId, final @Nullable Date time, final int maxDepartures, final boolean equivs)
throws IOException throws IOException
{ {
final ResultHeader header = new ResultHeader(SERVER_PRODUCT); final ResultHeader header = new ResultHeader(SERVER_PRODUCT);
@ -305,8 +307,9 @@ public class InvgProvider extends AbstractHafasProvider
} }
@Override @Override
public QueryTripsResult queryTrips(final Location from, final Location via, final Location to, final Date date, final boolean dep, public QueryTripsResult queryTrips(final Location from, final @Nullable Location via, final Location to, final Date date, final boolean dep,
final Set<Product> products, final WalkSpeed walkSpeed, final Accessibility accessibility, final Set<Option> options) throws IOException final @Nullable Set<Product> products, final @Nullable WalkSpeed walkSpeed, final @Nullable Accessibility accessibility,
final @Nullable Set<Option> options) throws IOException
{ {
return queryTripsXml(from, via, to, date, dep, products, walkSpeed, accessibility, options); return queryTripsXml(from, via, to, date, dep, products, walkSpeed, accessibility, options);
} }

View file

@ -22,6 +22,8 @@ import java.util.Map;
import java.util.regex.Matcher; import java.util.regex.Matcher;
import java.util.regex.Pattern; import java.util.regex.Pattern;
import javax.annotation.Nullable;
import de.schildbach.pte.dto.Line; import de.schildbach.pte.dto.Line;
import de.schildbach.pte.dto.Style; import de.schildbach.pte.dto.Style;
import de.schildbach.pte.dto.Style.Shape; import de.schildbach.pte.dto.Style.Shape;
@ -55,8 +57,8 @@ public class KvvProvider extends AbstractEfaProvider
private static final Pattern P_LINE = Pattern.compile("(.*?)\\s+\\([\\w/]+\\)", Pattern.CASE_INSENSITIVE); private static final Pattern P_LINE = Pattern.compile("(.*?)\\s+\\([\\w/]+\\)", Pattern.CASE_INSENSITIVE);
@Override @Override
protected Line parseLine(final String id, final String mot, final String symbol, final String name, final String longName, protected Line parseLine(final @Nullable String id, final @Nullable String mot, final @Nullable String symbol, final @Nullable String name,
final String trainType, final String trainNum, final String trainName) final @Nullable String longName, final @Nullable String trainType, final @Nullable String trainNum, final @Nullable String trainName)
{ {
if (name != null) if (name != null)
{ {

View file

@ -20,6 +20,8 @@ package de.schildbach.pte;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import javax.annotation.Nullable;
import com.google.common.base.Strings; import com.google.common.base.Strings;
import de.schildbach.pte.dto.Line; import de.schildbach.pte.dto.Line;
@ -53,8 +55,8 @@ public class MetProvider extends AbstractEfaProvider
} }
@Override @Override
protected Line parseLine(final String id, final String mot, final String symbol, final String name, final String longName, protected Line parseLine(final @Nullable String id, final @Nullable String mot, final @Nullable String symbol, final @Nullable String name,
final String trainType, final String trainNum, final String trainName) final @Nullable String longName, final @Nullable String trainType, final @Nullable String trainNum, final @Nullable String trainName)
{ {
if ("0".equals(mot)) if ("0".equals(mot))
{ {

View file

@ -22,6 +22,8 @@ import java.util.Map;
import java.util.regex.Matcher; import java.util.regex.Matcher;
import java.util.regex.Pattern; import java.util.regex.Pattern;
import javax.annotation.Nullable;
import de.schildbach.pte.dto.Line; import de.schildbach.pte.dto.Line;
import de.schildbach.pte.dto.Point; import de.schildbach.pte.dto.Point;
import de.schildbach.pte.dto.Position; import de.schildbach.pte.dto.Position;
@ -56,8 +58,8 @@ public class MvvProvider extends AbstractEfaProvider
} }
@Override @Override
protected Line parseLine(final String id, final String mot, final String symbol, final String name, final String longName, protected Line parseLine(final @Nullable String id, final @Nullable String mot, final @Nullable String symbol, final @Nullable String name,
final String trainType, final String trainNum, final String trainName) final @Nullable String longName, final @Nullable String trainType, final @Nullable String trainNum, final @Nullable String trainName)
{ {
if ("0".equals(mot)) if ("0".equals(mot))
{ {

View file

@ -22,6 +22,8 @@ import java.util.Date;
import java.util.EnumSet; import java.util.EnumSet;
import java.util.Set; import java.util.Set;
import javax.annotation.Nullable;
import de.schildbach.pte.dto.Location; import de.schildbach.pte.dto.Location;
import de.schildbach.pte.dto.LocationType; import de.schildbach.pte.dto.LocationType;
import de.schildbach.pte.dto.NearbyLocationsResult; import de.schildbach.pte.dto.NearbyLocationsResult;
@ -72,12 +74,13 @@ public interface NetworkProvider
boolean hasCapabilities(final Capability... capabilities); boolean hasCapabilities(final Capability... capabilities);
/** /**
* Find locations near to given location. At least one of lat/lon pair or station id must be present. * Find locations near to given location. At least one of lat/lon pair or station id must be present in that
* location.
* *
* @param types * @param types
* types of locations to find * types of locations to find
* @param location * @param location
* location to determine nearby stations (optional) * location to determine nearby stations
* @param maxDistance * @param maxDistance
* maximum distance in meters, or {@code 0} * maximum distance in meters, or {@code 0}
* @param maxLocations * @param maxLocations
@ -93,7 +96,7 @@ public interface NetworkProvider
* @param stationId * @param stationId
* id of the station * id of the station
* @param time * @param time
* desired time for departing, optional * desired time for departing, or {@code null} for the provider default
* @param maxDepartures * @param maxDepartures
* maximum number of departures to get or {@code 0} * maximum number of departures to get or {@code 0}
* @param equivs * @param equivs
@ -101,7 +104,7 @@ public interface NetworkProvider
* @return result object containing the departures * @return result object containing the departures
* @throws IOException * @throws IOException
*/ */
QueryDeparturesResult queryDepartures(String stationId, Date time, int maxDepartures, boolean equivs) throws IOException; QueryDeparturesResult queryDepartures(String stationId, @Nullable Date time, int maxDepartures, boolean equivs) throws IOException;
/** /**
* Meant for auto-completion of location names, like in an {@link android.widget.AutoCompleteTextView} * Meant for auto-completion of location names, like in an {@link android.widget.AutoCompleteTextView}
@ -134,18 +137,18 @@ public interface NetworkProvider
* @param dep * @param dep
* date is departure date? {@code true} for departure, {@code false} for arrival * date is departure date? {@code true} for departure, {@code false} for arrival
* @param products * @param products
* products to take into account * products to take into account, or {@code null} for the provider default
* @param walkSpeed * @param walkSpeed
* how fast can you walk? * walking ability, or {@code null} for the provider default
* @param accessibility * @param accessibility
* how accessible do you need the route to be? * route accessibility, or {@code null} for the provider default
* @param options * @param options
* additional options * additional options, or {@code null} for the provider default
* @return result object that can contain alternatives to clear up ambiguousnesses, or contains possible trips * @return result object that can contain alternatives to clear up ambiguousnesses, or contains possible trips
* @throws IOException * @throws IOException
*/ */
QueryTripsResult queryTrips(Location from, Location via, Location to, Date date, boolean dep, Set<Product> products, WalkSpeed walkSpeed, QueryTripsResult queryTrips(Location from, @Nullable Location via, Location to, Date date, boolean dep, @Nullable Set<Product> products,
Accessibility accessibility, Set<Option> options) throws IOException; @Nullable WalkSpeed walkSpeed, @Nullable Accessibility accessibility, @Nullable Set<Option> options) throws IOException;
/** /**
* Query more trips (e.g. earlier or later) * Query more trips (e.g. earlier or later)
@ -163,14 +166,14 @@ public interface NetworkProvider
* Get style of line * Get style of line
* *
* @param network * @param network
* network to disambiguate line * network to disambiguate line, may be {@code null}
* @param product * @param product
* line product to get style of * line product to get style of, may be {@code null}
* @param label * @param label
* line label to get style of, or null * line label to get style of, may be {@code null}
* @return object containing background, foreground and optional border colors * @return object containing background, foreground and optional border colors
*/ */
Style lineStyle(String network, Product product, String label); Style lineStyle(@Nullable String network, @Nullable Product product, @Nullable String label);
/** /**
* Gets the primary covered area of the network * Gets the primary covered area of the network

View file

@ -21,6 +21,8 @@ import java.io.IOException;
import java.util.Date; import java.util.Date;
import java.util.Set; import java.util.Set;
import javax.annotation.Nullable;
import com.google.common.base.Charsets; import com.google.common.base.Charsets;
import de.schildbach.pte.dto.Location; import de.schildbach.pte.dto.Location;
@ -130,8 +132,9 @@ public class NriProvider extends AbstractHafasProvider
} }
@Override @Override
public QueryTripsResult queryTrips(final Location from, final Location via, final Location to, final Date date, final boolean dep, public QueryTripsResult queryTrips(final Location from, final @Nullable Location via, final Location to, final Date date, final boolean dep,
final Set<Product> products, final WalkSpeed walkSpeed, final Accessibility accessibility, final Set<Option> options) throws IOException final @Nullable Set<Product> products, final @Nullable WalkSpeed walkSpeed, final @Nullable Accessibility accessibility,
final @Nullable Set<Option> options) throws IOException
{ {
return queryTripsXml(from, via, to, date, dep, products, walkSpeed, accessibility, options); return queryTripsXml(from, via, to, date, dep, products, walkSpeed, accessibility, options);
} }

View file

@ -23,6 +23,8 @@ import java.util.Set;
import java.util.regex.Matcher; import java.util.regex.Matcher;
import java.util.regex.Pattern; import java.util.regex.Pattern;
import javax.annotation.Nullable;
import de.schildbach.pte.dto.Line; import de.schildbach.pte.dto.Line;
import de.schildbach.pte.dto.Location; import de.schildbach.pte.dto.Location;
import de.schildbach.pte.dto.Product; import de.schildbach.pte.dto.Product;
@ -58,8 +60,8 @@ public class NvbwProvider extends AbstractEfaProvider
private static final Pattern P_LINE_S_AVG_VBK = Pattern.compile("(S\\d+) \\((?:AVG|VBK)\\)"); private static final Pattern P_LINE_S_AVG_VBK = Pattern.compile("(S\\d+) \\((?:AVG|VBK)\\)");
@Override @Override
protected Line parseLine(final String id, final String mot, final String symbol, final String name, final String longName, protected Line parseLine(final @Nullable String id, final @Nullable String mot, final @Nullable String symbol, final @Nullable String name,
final String trainType, final String trainNum, final String trainName) final @Nullable String longName, final @Nullable String trainType, final @Nullable String trainNum, final @Nullable String trainName)
{ {
if ("0".equals(mot)) if ("0".equals(mot))
{ {
@ -104,8 +106,9 @@ public class NvbwProvider extends AbstractEfaProvider
} }
@Override @Override
public QueryTripsResult queryTrips(final Location from, final Location via, final Location to, final Date date, final boolean dep, public QueryTripsResult queryTrips(final Location from, final @Nullable Location via, final Location to, final Date date, final boolean dep,
final Set<Product> products, final WalkSpeed walkSpeed, final Accessibility accessibility, final Set<Option> options) throws IOException final @Nullable Set<Product> products, final @Nullable WalkSpeed walkSpeed, final @Nullable Accessibility accessibility,
final @Nullable Set<Option> options) throws IOException
{ {
return queryTripsMobile(from, via, to, date, dep, products, walkSpeed, accessibility, options); return queryTripsMobile(from, via, to, date, dep, products, walkSpeed, accessibility, options);
} }

View file

@ -30,6 +30,8 @@ import java.util.Set;
import java.util.regex.Matcher; import java.util.regex.Matcher;
import java.util.regex.Pattern; import java.util.regex.Pattern;
import javax.annotation.Nullable;
import de.schildbach.pte.dto.Departure; import de.schildbach.pte.dto.Departure;
import de.schildbach.pte.dto.Line; import de.schildbach.pte.dto.Line;
import de.schildbach.pte.dto.Location; import de.schildbach.pte.dto.Location;
@ -162,7 +164,7 @@ public class SeptaProvider extends AbstractHafasProvider
, Pattern.DOTALL); , Pattern.DOTALL);
@Override @Override
public QueryDeparturesResult queryDepartures(final String stationId, final Date time, final int maxDepartures, final boolean equivs) public QueryDeparturesResult queryDepartures(final String stationId, final @Nullable Date time, final int maxDepartures, final boolean equivs)
throws IOException throws IOException
{ {
final ResultHeader header = new ResultHeader(SERVER_PRODUCT); final ResultHeader header = new ResultHeader(SERVER_PRODUCT);
@ -282,8 +284,9 @@ public class SeptaProvider extends AbstractHafasProvider
} }
@Override @Override
public QueryTripsResult queryTrips(final Location from, final Location via, final Location to, final Date date, final boolean dep, public QueryTripsResult queryTrips(final Location from, final @Nullable Location via, final Location to, final Date date, final boolean dep,
final Set<Product> products, final WalkSpeed walkSpeed, final Accessibility accessibility, final Set<Option> options) throws IOException final @Nullable Set<Product> products, final @Nullable WalkSpeed walkSpeed, final @Nullable Accessibility accessibility,
final @Nullable Set<Option> options) throws IOException
{ {
return queryTripsXml(from, via, to, date, dep, products, walkSpeed, accessibility, options); return queryTripsXml(from, via, to, date, dep, products, walkSpeed, accessibility, options);
} }

View file

@ -20,6 +20,8 @@ package de.schildbach.pte;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import javax.annotation.Nullable;
import de.schildbach.pte.dto.Line; import de.schildbach.pte.dto.Line;
import de.schildbach.pte.dto.Product; import de.schildbach.pte.dto.Product;
import de.schildbach.pte.dto.Style; import de.schildbach.pte.dto.Style;
@ -58,8 +60,8 @@ public class SfProvider extends AbstractEfaProvider
} }
@Override @Override
protected Line parseLine(final String id, final String mot, final String symbol, final String name, final String longName, protected Line parseLine(final @Nullable String id, final @Nullable String mot, final @Nullable String symbol, final @Nullable String name,
final String trainType, final String trainNum, final String trainName) final @Nullable String longName, final @Nullable String trainType, final @Nullable String trainNum, final @Nullable String trainName)
{ {
if ("0".equals(mot)) if ("0".equals(mot))
{ {

View file

@ -17,6 +17,8 @@
package de.schildbach.pte; package de.schildbach.pte;
import javax.annotation.Nullable;
import de.schildbach.pte.dto.Line; import de.schildbach.pte.dto.Line;
import de.schildbach.pte.dto.Product; import de.schildbach.pte.dto.Product;
@ -41,8 +43,8 @@ public class StvProvider extends AbstractEfaProvider
} }
@Override @Override
protected Line parseLine(final String id, final String mot, final String symbol, final String name, final String longName, protected Line parseLine(final @Nullable String id, final @Nullable String mot, final @Nullable String symbol, final @Nullable String name,
final String trainType, final String trainNum, final String trainName) final @Nullable String longName, final @Nullable String trainType, final @Nullable String trainNum, final @Nullable String trainName)
{ {
if ("0".equals(mot)) if ("0".equals(mot))
{ {

View file

@ -20,6 +20,8 @@ package de.schildbach.pte;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import javax.annotation.Nullable;
import de.schildbach.pte.dto.Line; import de.schildbach.pte.dto.Line;
import de.schildbach.pte.dto.Product; import de.schildbach.pte.dto.Product;
import de.schildbach.pte.dto.Style; import de.schildbach.pte.dto.Style;
@ -58,8 +60,8 @@ public class SydneyProvider extends AbstractEfaProvider
} }
@Override @Override
protected Line parseLine(final String id, final String mot, final String symbol, final String name, final String longName, protected Line parseLine(final @Nullable String id, final @Nullable String mot, final @Nullable String symbol, final @Nullable String name,
final String trainType, final String trainNum, final String trainName) final @Nullable String longName, final @Nullable String trainType, final @Nullable String trainNum, final @Nullable String trainName)
{ {
if ("1".equals(mot)) if ("1".equals(mot))
{ {

View file

@ -19,6 +19,8 @@ package de.schildbach.pte;
import java.util.Set; import java.util.Set;
import javax.annotation.Nullable;
import de.schildbach.pte.dto.Line; import de.schildbach.pte.dto.Line;
import de.schildbach.pte.dto.Product; import de.schildbach.pte.dto.Product;
@ -50,8 +52,8 @@ public class TfiProvider extends AbstractEfaProvider
} }
@Override @Override
protected Line parseLine(final String id, final String mot, final String symbol, final String name, final String longName, protected Line parseLine(final @Nullable String id, final @Nullable String mot, final @Nullable String symbol, final @Nullable String name,
final String trainType, final String trainNum, final String trainName) final @Nullable String longName, final @Nullable String trainType, final @Nullable String trainNum, final @Nullable String trainName)
{ {
if ("0".equals(mot)) if ("0".equals(mot))
{ {

View file

@ -21,6 +21,8 @@ import java.util.HashMap;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import javax.annotation.Nullable;
import de.schildbach.pte.dto.Line; import de.schildbach.pte.dto.Line;
import de.schildbach.pte.dto.Product; import de.schildbach.pte.dto.Product;
import de.schildbach.pte.dto.Style; import de.schildbach.pte.dto.Style;
@ -72,8 +74,8 @@ public class TlemProvider extends AbstractEfaProvider
} }
@Override @Override
protected Line parseLine(final String id, final String mot, final String symbol, final String name, final String longName, protected Line parseLine(final @Nullable String id, final @Nullable String mot, final @Nullable String symbol, final @Nullable String name,
final String trainType, final String trainNum, final String trainName) final @Nullable String longName, final @Nullable String trainType, final @Nullable String trainNum, final @Nullable String trainName)
{ {
if ("1".equals(mot)) if ("1".equals(mot))
{ {

View file

@ -17,6 +17,8 @@
package de.schildbach.pte; package de.schildbach.pte;
import javax.annotation.Nullable;
import de.schildbach.pte.dto.Line; import de.schildbach.pte.dto.Line;
import de.schildbach.pte.dto.Product; import de.schildbach.pte.dto.Product;
@ -41,8 +43,8 @@ public class VblProvider extends AbstractEfaProvider
} }
@Override @Override
protected Line parseLine(final String id, final String mot, final String symbol, final String name, final String longName, protected Line parseLine(final @Nullable String id, final @Nullable String mot, final @Nullable String symbol, final @Nullable String name,
final String trainType, final String trainNum, final String trainName) final @Nullable String longName, final @Nullable String trainType, final @Nullable String trainNum, final @Nullable String trainName)
{ {
if ("0".equals(mot)) if ("0".equals(mot))
{ {

View file

@ -21,6 +21,8 @@ import java.util.Collection;
import java.util.Date; import java.util.Date;
import java.util.Set; import java.util.Set;
import javax.annotation.Nullable;
import de.schildbach.pte.dto.Line; import de.schildbach.pte.dto.Line;
import de.schildbach.pte.dto.Location; import de.schildbach.pte.dto.Location;
import de.schildbach.pte.dto.Product; import de.schildbach.pte.dto.Product;
@ -45,8 +47,8 @@ public class VgnProvider extends AbstractEfaProvider
} }
@Override @Override
protected Line parseLine(final String id, final String mot, final String symbol, final String name, final String longName, protected Line parseLine(final @Nullable String id, final @Nullable String mot, final @Nullable String symbol, final @Nullable String name,
final String trainType, final String trainNum, final String trainName) final @Nullable String longName, final @Nullable String trainType, final @Nullable String trainNum, final @Nullable String trainName)
{ {
if ("0".equals(mot)) if ("0".equals(mot))
{ {
@ -62,8 +64,9 @@ public class VgnProvider extends AbstractEfaProvider
} }
@Override @Override
protected String xsltTripRequestParameters(final Location from, final Location via, final Location to, final Date date, final boolean dep, protected String xsltTripRequestParameters(final Location from, final @Nullable Location via, final Location to, final Date date,
final Collection<Product> products, final WalkSpeed walkSpeed, final Accessibility accessibility, final Set<Option> options) final boolean dep, final @Nullable Collection<Product> products, final @Nullable WalkSpeed walkSpeed,
final @Nullable Accessibility accessibility, final @Nullable Set<Option> options)
{ {
return super.xsltTripRequestParameters(from, via, to, date, dep, products, walkSpeed, accessibility, options) + "&itdLPxx_showTariffLevel=1"; return super.xsltTripRequestParameters(from, via, to, date, dep, products, walkSpeed, accessibility, options) + "&itdLPxx_showTariffLevel=1";
} }

View file

@ -17,6 +17,8 @@
package de.schildbach.pte; package de.schildbach.pte;
import javax.annotation.Nullable;
import de.schildbach.pte.dto.Line; import de.schildbach.pte.dto.Line;
import de.schildbach.pte.dto.Product; import de.schildbach.pte.dto.Product;
@ -39,8 +41,8 @@ public class VmsProvider extends AbstractEfaProvider
} }
@Override @Override
protected Line parseLine(final String id, final String mot, final String symbol, final String name, final String longName, protected Line parseLine(final @Nullable String id, final @Nullable String mot, final @Nullable String symbol, final @Nullable String name,
final String trainType, final String trainNum, final String trainName) final @Nullable String longName, final @Nullable String trainType, final @Nullable String trainNum, final @Nullable String trainName)
{ {
if ("0".equals(mot)) if ("0".equals(mot))
{ {

View file

@ -17,6 +17,8 @@
package de.schildbach.pte; package de.schildbach.pte;
import javax.annotation.Nullable;
import de.schildbach.pte.dto.Line; import de.schildbach.pte.dto.Line;
import de.schildbach.pte.dto.Product; import de.schildbach.pte.dto.Product;
@ -41,8 +43,8 @@ public class VrnProvider extends AbstractEfaProvider
} }
@Override @Override
protected Line parseLine(final String id, final String mot, final String symbol, final String name, final String longName, protected Line parseLine(final @Nullable String id, final @Nullable String mot, final @Nullable String symbol, final @Nullable String name,
final String trainType, final String trainNum, final String trainName) final @Nullable String longName, final @Nullable String trainType, final @Nullable String trainNum, final @Nullable String trainName)
{ {
if ("0".equals(mot)) if ("0".equals(mot))
{ {

View file

@ -20,6 +20,8 @@ package de.schildbach.pte;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import javax.annotation.Nullable;
import com.google.common.base.Charsets; import com.google.common.base.Charsets;
import de.schildbach.pte.dto.Line; import de.schildbach.pte.dto.Line;
@ -52,8 +54,8 @@ public class VrrProvider extends AbstractEfaProvider
} }
@Override @Override
protected Line parseLine(final String id, final String mot, final String symbol, final String name, final String longName, protected Line parseLine(final @Nullable String id, final @Nullable String mot, final @Nullable String symbol, final @Nullable String name,
final String trainType, final String trainNum, final String trainName) final @Nullable String longName, final @Nullable String trainType, final @Nullable String trainNum, final @Nullable String trainName)
{ {
if ("0".equals(mot)) if ("0".equals(mot))
{ {
@ -190,7 +192,7 @@ public class VrrProvider extends AbstractEfaProvider
} }
@Override @Override
public Style lineStyle(final String network, final Product product, final String label) public Style lineStyle(final @Nullable String network, final @Nullable Product product, final @Nullable String label)
{ {
if (product == Product.BUS && label != null && label.startsWith("SB")) if (product == Product.BUS && label != null && label.startsWith("SB"))
return super.lineStyle(network, product, "SB"); return super.lineStyle(network, product, "SB");

View file

@ -17,6 +17,8 @@
package de.schildbach.pte; package de.schildbach.pte;
import javax.annotation.Nullable;
import com.google.common.base.Charsets; import com.google.common.base.Charsets;
import de.schildbach.pte.dto.Line; import de.schildbach.pte.dto.Line;
@ -49,8 +51,8 @@ public class VvoProvider extends AbstractEfaProvider
} }
@Override @Override
protected Line parseLine(final String id, final String mot, final String symbol, final String name, final String longName, protected Line parseLine(final @Nullable String id, final @Nullable String mot, final @Nullable String symbol, final @Nullable String name,
final String trainType, final String trainNum, final String trainName) final @Nullable String longName, final @Nullable String trainType, final @Nullable String trainNum, final @Nullable String trainName)
{ {
if ("0".equals(mot)) if ("0".equals(mot))
{ {

View file

@ -25,6 +25,8 @@ import java.util.Comparator;
import java.util.Date; import java.util.Date;
import java.util.Locale; import java.util.Locale;
import javax.annotation.Nullable;
import com.google.common.base.MoreObjects; import com.google.common.base.MoreObjects;
import com.google.common.base.MoreObjects.ToStringHelper; import com.google.common.base.MoreObjects.ToStringHelper;
import com.google.common.base.Objects; import com.google.common.base.Objects;
@ -34,13 +36,13 @@ import com.google.common.base.Objects;
*/ */
public final class Departure implements Serializable public final class Departure implements Serializable
{ {
final public Date plannedTime; final public @Nullable Date plannedTime;
final public Date predictedTime; final public @Nullable Date predictedTime;
final public Line line; final public Line line;
final public Position position; final public @Nullable Position position;
final public Location destination; final public @Nullable Location destination;
final public int[] capacity; final public @Nullable int[] capacity;
final public String message; final public @Nullable String message;
public Departure(final Date plannedTime, final Date predictedTime, final Line line, final Position position, final Location destination, public Departure(final Date plannedTime, final Date predictedTime, final Line line, final Position position, final Location destination,
final int[] capacity, final String message) final int[] capacity, final String message)

View file

@ -22,6 +22,8 @@ import static com.google.common.base.Preconditions.checkNotNull;
import java.io.Serializable; import java.io.Serializable;
import java.util.Currency; import java.util.Currency;
import javax.annotation.Nullable;
import com.google.common.base.MoreObjects; import com.google.common.base.MoreObjects;
import com.google.common.base.Objects; import com.google.common.base.Objects;
@ -39,8 +41,8 @@ public final class Fare implements Serializable
public final Type type; public final Type type;
public final Currency currency; public final Currency currency;
public final float fare; public final float fare;
public final String unitName; public final @Nullable String unitName;
public final String units; public final @Nullable String units;
public Fare(final String network, final Type type, final Currency currency, final float fare, final String unitName, final String units) public Fare(final String network, final Type type, final Currency currency, final float fare, final String unitName, final String units)
{ {

View file

@ -20,6 +20,8 @@ package de.schildbach.pte.dto;
import java.io.Serializable; import java.io.Serializable;
import java.util.Set; import java.util.Set;
import javax.annotation.Nullable;
import com.google.common.base.MoreObjects; import com.google.common.base.MoreObjects;
import com.google.common.base.Objects; import com.google.common.base.Objects;
import com.google.common.collect.ComparisonChain; import com.google.common.collect.ComparisonChain;
@ -37,12 +39,12 @@ public final class Line implements Serializable, Comparable<Line>
private static final long serialVersionUID = -5642533805998375070L; private static final long serialVersionUID = -5642533805998375070L;
public final String id; public final @Nullable String id;
public final Product product; public final @Nullable Product product;
public final String label; public final @Nullable String label;
public final Style style; public final @Nullable Style style;
public final Set<Attr> attrs; public final @Nullable Set<Attr> attrs;
public final String message; public final @Nullable String message;
public static final Line FOOTWAY = new Line(null, null, null); public static final Line FOOTWAY = new Line(null, null, null);
public static final Line TRANSFER = new Line(null, null, null); public static final Line TRANSFER = new Line(null, null, null);
@ -81,11 +83,13 @@ public final class Line implements Serializable, Comparable<Line>
public char productCode() public char productCode()
{ {
final Product product = this.product;
return product != null ? product.code : Product.UNKNOWN; return product != null ? product.code : Product.UNKNOWN;
} }
public boolean hasAttr(final Attr attr) public boolean hasAttr(final Attr attr)
{ {
final Set<Attr> attrs = this.attrs;
return attrs != null && attrs.contains(attr); return attrs != null && attrs.contains(attr);
} }

View file

@ -21,6 +21,8 @@ import static com.google.common.base.Preconditions.checkNotNull;
import java.io.Serializable; import java.io.Serializable;
import javax.annotation.Nullable;
import com.google.common.base.MoreObjects; import com.google.common.base.MoreObjects;
import com.google.common.base.Objects; import com.google.common.base.Objects;
@ -30,7 +32,7 @@ import com.google.common.base.Objects;
public final class LineDestination implements Serializable public final class LineDestination implements Serializable
{ {
final public Line line; final public Line line;
final public Location destination; final public @Nullable Location destination;
public LineDestination(final Line line, final Location destination) public LineDestination(final Line line, final Location destination)
{ {

View file

@ -23,6 +23,8 @@ import static com.google.common.base.Preconditions.checkNotNull;
import java.io.Serializable; import java.io.Serializable;
import java.util.Arrays; import java.util.Arrays;
import javax.annotation.Nullable;
import com.google.common.base.MoreObjects; import com.google.common.base.MoreObjects;
import com.google.common.base.MoreObjects.ToStringHelper; import com.google.common.base.MoreObjects.ToStringHelper;
import com.google.common.base.Objects; import com.google.common.base.Objects;
@ -33,10 +35,10 @@ import com.google.common.base.Objects;
public final class Location implements Serializable public final class Location implements Serializable
{ {
public final LocationType type; public final LocationType type;
public final String id; public final @Nullable String id;
public final int lat, lon; public final int lat, lon;
public final String place; public final @Nullable String place;
public final String name; public final @Nullable String name;
public Location(final LocationType type, final String id, final int lat, final int lon, final String place, final String name) public Location(final LocationType type, final String id, final int lat, final int lon, final String place, final String name)
{ {

View file

@ -22,6 +22,8 @@ import static com.google.common.base.Preconditions.checkNotNull;
import java.io.Serializable; import java.io.Serializable;
import java.util.List; import java.util.List;
import javax.annotation.Nullable;
import com.google.common.base.MoreObjects; import com.google.common.base.MoreObjects;
import com.google.common.base.MoreObjects.ToStringHelper; import com.google.common.base.MoreObjects.ToStringHelper;
@ -35,7 +37,7 @@ public final class NearbyLocationsResult implements Serializable
OK, INVALID_ID, SERVICE_DOWN OK, INVALID_ID, SERVICE_DOWN
} }
public final ResultHeader header; public final @Nullable ResultHeader header;
public final Status status; public final Status status;
public final List<Location> locations; public final List<Location> locations;

View file

@ -22,6 +22,8 @@ import static com.google.common.base.Preconditions.checkNotNull;
import java.io.Serializable; import java.io.Serializable;
import javax.annotation.Nullable;
import com.google.common.base.Objects; import com.google.common.base.Objects;
/** /**
@ -30,7 +32,7 @@ import com.google.common.base.Objects;
public final class Position implements Serializable public final class Position implements Serializable
{ {
public final String name; public final String name;
public final String section; public final @Nullable String section;
public Position(final String name) public Position(final String name)
{ {

View file

@ -23,6 +23,8 @@ import java.io.Serializable;
import java.util.LinkedList; import java.util.LinkedList;
import java.util.List; import java.util.List;
import javax.annotation.Nullable;
import com.google.common.base.MoreObjects; import com.google.common.base.MoreObjects;
import com.google.common.base.MoreObjects.ToStringHelper; import com.google.common.base.MoreObjects.ToStringHelper;
@ -36,7 +38,7 @@ public final class QueryDeparturesResult implements Serializable
OK, INVALID_STATION, SERVICE_DOWN OK, INVALID_STATION, SERVICE_DOWN
} }
public final ResultHeader header; public final @Nullable ResultHeader header;
public final Status status; public final Status status;
public final List<StationDepartures> stationDepartures = new LinkedList<StationDepartures>(); public final List<StationDepartures> stationDepartures = new LinkedList<StationDepartures>();
@ -56,7 +58,8 @@ public final class QueryDeparturesResult implements Serializable
{ {
for (final StationDepartures departures : stationDepartures) for (final StationDepartures departures : stationDepartures)
{ {
if (stationId.equals(departures.location.id)) final Location location = departures.location;
if (location != null && stationId.equals(location.id))
return departures; return departures;
} }

View file

@ -22,6 +22,8 @@ import static com.google.common.base.Preconditions.checkNotNull;
import java.io.Serializable; import java.io.Serializable;
import java.util.List; import java.util.List;
import javax.annotation.Nullable;
import com.google.common.base.MoreObjects; import com.google.common.base.MoreObjects;
import com.google.common.base.MoreObjects.ToStringHelper; import com.google.common.base.MoreObjects.ToStringHelper;
@ -35,7 +37,7 @@ public final class QueryTripsResult implements Serializable
OK, AMBIGUOUS, TOO_CLOSE, UNKNOWN_FROM, UNKNOWN_VIA, UNKNOWN_TO, UNRESOLVABLE_ADDRESS, NO_TRIPS, INVALID_DATE, SERVICE_DOWN; OK, AMBIGUOUS, TOO_CLOSE, UNKNOWN_FROM, UNKNOWN_VIA, UNKNOWN_TO, UNRESOLVABLE_ADDRESS, NO_TRIPS, INVALID_DATE, SERVICE_DOWN;
} }
public final ResultHeader header; public final @Nullable ResultHeader header;
public final Status status; public final Status status;
public final List<Location> ambiguousFrom; public final List<Location> ambiguousFrom;

View file

@ -21,6 +21,8 @@ import static com.google.common.base.Preconditions.checkNotNull;
import java.io.Serializable; import java.io.Serializable;
import javax.annotation.Nullable;
import com.google.common.base.MoreObjects; import com.google.common.base.MoreObjects;
/** /**
@ -29,7 +31,7 @@ import com.google.common.base.MoreObjects;
public final class ResultHeader implements Serializable public final class ResultHeader implements Serializable
{ {
public final String serverProduct; public final String serverProduct;
public final String serverVersion; public final @Nullable String serverVersion;
public final long serverTime; public final long serverTime;
public final Object context; public final Object context;

View file

@ -22,6 +22,8 @@ import static com.google.common.base.Preconditions.checkNotNull;
import java.io.Serializable; import java.io.Serializable;
import java.util.List; import java.util.List;
import javax.annotation.Nullable;
import com.google.common.base.MoreObjects; import com.google.common.base.MoreObjects;
import com.google.common.base.MoreObjects.ToStringHelper; import com.google.common.base.MoreObjects.ToStringHelper;
import com.google.common.base.Objects; import com.google.common.base.Objects;
@ -33,7 +35,7 @@ public final class StationDepartures implements Serializable
{ {
public final Location location; public final Location location;
public final List<Departure> departures; public final List<Departure> departures;
public final List<LineDestination> lines; public final @Nullable List<LineDestination> lines;
public StationDepartures(final Location location, final List<Departure> departures, final List<LineDestination> lines) public StationDepartures(final Location location, final List<Departure> departures, final List<LineDestination> lines)
{ {

View file

@ -23,6 +23,8 @@ import java.io.Serializable;
import java.util.Date; import java.util.Date;
import java.util.Locale; import java.util.Locale;
import javax.annotation.Nullable;
import com.google.common.base.MoreObjects; import com.google.common.base.MoreObjects;
import com.google.common.base.MoreObjects.ToStringHelper; import com.google.common.base.MoreObjects.ToStringHelper;
import com.google.common.base.Objects; import com.google.common.base.Objects;
@ -33,15 +35,15 @@ import com.google.common.base.Objects;
public final class Stop implements Serializable public final class Stop implements Serializable
{ {
public final Location location; public final Location location;
public final Date plannedArrivalTime; public final @Nullable Date plannedArrivalTime;
public final Date predictedArrivalTime; public final @Nullable Date predictedArrivalTime;
public final Position plannedArrivalPosition; public final @Nullable Position plannedArrivalPosition;
public final Position predictedArrivalPosition; public final @Nullable Position predictedArrivalPosition;
public final boolean arrivalCancelled; public final boolean arrivalCancelled;
public final Date plannedDepartureTime; public final @Nullable Date plannedDepartureTime;
public final Date predictedDepartureTime; public final @Nullable Date predictedDepartureTime;
public final Position plannedDeparturePosition; public final @Nullable Position plannedDeparturePosition;
public final Position predictedDeparturePosition; public final @Nullable Position predictedDeparturePosition;
public final boolean departureCancelled; public final boolean departureCancelled;
public Stop(final Location location, final Date plannedArrivalTime, final Date predictedArrivalTime, final Position plannedArrivalPosition, public Stop(final Location location, final Date plannedArrivalTime, final Date predictedArrivalTime, final Position plannedArrivalPosition,
@ -125,6 +127,8 @@ public final class Stop implements Serializable
public Long getArrivalDelay() public Long getArrivalDelay()
{ {
final Date plannedArrivalTime = this.plannedArrivalTime;
final Date predictedArrivalTime = this.predictedArrivalTime;
if (plannedArrivalTime != null && predictedArrivalTime != null) if (plannedArrivalTime != null && predictedArrivalTime != null)
return predictedArrivalTime.getTime() - plannedArrivalTime.getTime(); return predictedArrivalTime.getTime() - plannedArrivalTime.getTime();
else else
@ -163,6 +167,8 @@ public final class Stop implements Serializable
public Long getDepartureDelay() public Long getDepartureDelay()
{ {
final Date plannedDepartureTime = this.plannedDepartureTime;
final Date predictedDepartureTime = this.predictedDepartureTime;
if (plannedDepartureTime != null && predictedDepartureTime != null) if (plannedDepartureTime != null && predictedDepartureTime != null)
return predictedDepartureTime.getTime() - plannedDepartureTime.getTime(); return predictedDepartureTime.getTime() - plannedDepartureTime.getTime();
else else
@ -186,6 +192,7 @@ public final class Stop implements Serializable
public Date getMinTime() public Date getMinTime()
{ {
final Date predictedDepartureTime = this.predictedDepartureTime;
if (plannedDepartureTime == null || (predictedDepartureTime != null && predictedDepartureTime.before(plannedDepartureTime))) if (plannedDepartureTime == null || (predictedDepartureTime != null && predictedDepartureTime.before(plannedDepartureTime)))
return predictedDepartureTime; return predictedDepartureTime;
else else
@ -194,6 +201,7 @@ public final class Stop implements Serializable
public Date getMaxTime() public Date getMaxTime()
{ {
final Date predictedArrivalTime = this.predictedArrivalTime;
if (plannedArrivalTime == null || (predictedArrivalTime != null && predictedArrivalTime.after(plannedArrivalTime))) if (plannedArrivalTime == null || (predictedArrivalTime != null && predictedArrivalTime.after(plannedArrivalTime)))
return predictedArrivalTime; return predictedArrivalTime;
else else

View file

@ -25,6 +25,8 @@ import java.util.Collections;
import java.util.LinkedList; import java.util.LinkedList;
import java.util.List; import java.util.List;
import javax.annotation.Nullable;
import com.google.common.base.MoreObjects; import com.google.common.base.MoreObjects;
import com.google.common.base.MoreObjects.ToStringHelper; import com.google.common.base.MoreObjects.ToStringHelper;
@ -38,7 +40,7 @@ public final class SuggestLocationsResult implements Serializable
OK, SERVICE_DOWN OK, SERVICE_DOWN
} }
public final ResultHeader header; public final @Nullable ResultHeader header;
public final Status status; public final Status status;
private final List<SuggestedLocation> suggestedLocations; private final List<SuggestedLocation> suggestedLocations;

View file

@ -27,6 +27,8 @@ import java.util.List;
import java.util.Locale; import java.util.Locale;
import java.util.Set; import java.util.Set;
import javax.annotation.Nullable;
import com.google.common.base.MoreObjects; import com.google.common.base.MoreObjects;
import com.google.common.base.MoreObjects.ToStringHelper; import com.google.common.base.MoreObjects.ToStringHelper;
import com.google.common.base.Objects; import com.google.common.base.Objects;
@ -65,7 +67,7 @@ public final class Trip implements Serializable
return legs.get(0).getDepartureTime(); return legs.get(0).getDepartureTime();
} }
public Public getFirstPublicLeg() public @Nullable Public getFirstPublicLeg()
{ {
for (final Leg leg : legs) for (final Leg leg : legs)
if (leg instanceof Public) if (leg instanceof Public)
@ -74,7 +76,7 @@ public final class Trip implements Serializable
return null; return null;
} }
public Date getFirstPublicLegDepartureTime() public @Nullable Date getFirstPublicLegDepartureTime()
{ {
final Public firstPublicLeg = getFirstPublicLeg(); final Public firstPublicLeg = getFirstPublicLeg();
if (firstPublicLeg != null) if (firstPublicLeg != null)
@ -88,7 +90,7 @@ public final class Trip implements Serializable
return legs.get(legs.size() - 1).getArrivalTime(); return legs.get(legs.size() - 1).getArrivalTime();
} }
public Public getLastPublicLeg() public @Nullable Public getLastPublicLeg()
{ {
for (int i = legs.size() - 1; i >= 0; i--) for (int i = legs.size() - 1; i >= 0; i--)
{ {
@ -100,7 +102,7 @@ public final class Trip implements Serializable
return null; return null;
} }
public Date getLastPublicLegArrivalTime() public @Nullable Date getLastPublicLegArrivalTime()
{ {
final Public lastPublicLeg = getLastPublicLeg(); final Public lastPublicLeg = getLastPublicLeg();
if (lastPublicLeg != null) if (lastPublicLeg != null)
@ -127,7 +129,7 @@ public final class Trip implements Serializable
* *
* @return duration in ms, or null if there are no public legs * @return duration in ms, or null if there are no public legs
*/ */
public Long getPublicDuration() public @Nullable Long getPublicDuration()
{ {
final Date first = getFirstPublicLegDepartureTime(); final Date first = getFirstPublicLegDepartureTime();
final Date last = getLastPublicLegArrivalTime(); final Date last = getLastPublicLegArrivalTime();
@ -217,8 +219,12 @@ public final class Trip implements Serializable
else if (leg instanceof Public) else if (leg instanceof Public)
{ {
final Public publicLeg = (Public) leg; final Public publicLeg = (Public) leg;
builder.append(publicLeg.departureStop.plannedDepartureTime.getTime()).append('-'); final Date plannedDepartureTime = publicLeg.departureStop.plannedDepartureTime;
builder.append(publicLeg.arrivalStop.plannedArrivalTime.getTime()).append('-'); if (plannedDepartureTime != null)
builder.append(plannedDepartureTime.getTime()).append('-');
final Date plannedArrivalTime = publicLeg.arrivalStop.plannedArrivalTime;
if (plannedArrivalTime != null)
builder.append(plannedArrivalTime.getTime()).append('-');
final Line line = publicLeg.line; final Line line = publicLeg.line;
builder.append(line.productCode()); builder.append(line.productCode());
builder.append(line.label); builder.append(line.label);
@ -294,11 +300,11 @@ public final class Trip implements Serializable
private static final long serialVersionUID = 1312066446239817422L; private static final long serialVersionUID = 1312066446239817422L;
public final Line line; public final Line line;
public final Location destination; public final @Nullable Location destination;
public final Stop departureStop; public final Stop departureStop;
public final Stop arrivalStop; public final Stop arrivalStop;
public final List<Stop> intermediateStops; public final @Nullable List<Stop> intermediateStops;
public final String message; public final @Nullable String message;
public Public(final Line line, final Location destination, final Stop departureStop, final Stop arrivalStop, public Public(final Line line, final Location destination, final Stop departureStop, final Stop arrivalStop,
final List<Stop> intermediateStops, final List<Point> path, final String message) final List<Stop> intermediateStops, final List<Point> path, final String message)

View file

@ -7,6 +7,8 @@ package de.schildbach.pte.util;
import java.io.IOException; import java.io.IOException;
import javax.annotation.Nullable;
import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException; import org.xmlpull.v1.XmlPullParserException;
@ -131,7 +133,7 @@ public final class XmlPullUtil
throw new IllegalStateException("expecting attribute: " + attrName); throw new IllegalStateException("expecting attribute: " + attrName);
} }
public static String optAttr(final XmlPullParser pp, final String attrName, final String defaultValue) public static String optAttr(final XmlPullParser pp, final String attrName, final @Nullable String defaultValue)
{ {
final String attr = pp.getAttributeValue(null, attrName); final String attr = pp.getAttributeValue(null, attrName);
@ -189,8 +191,8 @@ public final class XmlPullUtil
return value != null ? value.trim() : null; return value != null ? value.trim() : null;
} }
public static String optValueTag(final XmlPullParser pp, final String tagName, final String defaultValue) throws XmlPullParserException, public static String optValueTag(final XmlPullParser pp, final String tagName, final @Nullable String defaultValue)
IOException throws XmlPullParserException, IOException
{ {
if (XmlPullUtil.test(pp, tagName)) if (XmlPullUtil.test(pp, tagName))
{ {
@ -236,9 +238,6 @@ public final class XmlPullUtil
public static String nextText(final XmlPullParser pp, final String namespace, final String name) throws IOException, XmlPullParserException public static String nextText(final XmlPullParser pp, final String namespace, final String name) throws IOException, XmlPullParserException
{ {
if (name == null)
throw new XmlPullParserException("name for element can not be null");
pp.require(XmlPullParser.START_TAG, namespace, name); pp.require(XmlPullParser.START_TAG, namespace, name);
final String text = pp.nextText(); final String text = pp.nextText();

View file

@ -24,6 +24,8 @@ import java.util.Date;
import java.util.EnumSet; import java.util.EnumSet;
import java.util.Set; import java.util.Set;
import javax.annotation.Nullable;
import de.schildbach.pte.NetworkProvider; import de.schildbach.pte.NetworkProvider;
import de.schildbach.pte.NetworkProvider.Accessibility; import de.schildbach.pte.NetworkProvider.Accessibility;
import de.schildbach.pte.NetworkProvider.WalkSpeed; import de.schildbach.pte.NetworkProvider.WalkSpeed;
@ -126,8 +128,9 @@ public abstract class AbstractProviderLiveTest
return provider.suggestLocations(constraint); return provider.suggestLocations(constraint);
} }
protected final QueryTripsResult queryTrips(final Location from, final Location via, final Location to, final Date date, final boolean dep, protected final QueryTripsResult queryTrips(final Location from, final @Nullable Location via, final Location to, final Date date,
final Set<Product> products, final WalkSpeed walkSpeed, final Accessibility accessibility) throws IOException final boolean dep, final @Nullable Set<Product> products, final @Nullable WalkSpeed walkSpeed, final @Nullable Accessibility accessibility)
throws IOException
{ {
return provider.queryTrips(from, via, to, date, dep, products, walkSpeed, accessibility, null); return provider.queryTrips(from, via, to, date, dep, products, walkSpeed, accessibility, null);
} }

View file

@ -18,17 +18,20 @@
package de.schildbach.pte.live; package de.schildbach.pte.live;
import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue; import static org.junit.Assert.assertTrue;
import java.util.Calendar; import java.util.Calendar;
import java.util.Date; import java.util.Date;
import java.util.EnumSet; import java.util.EnumSet;
import java.util.List;
import org.junit.Test; import org.junit.Test;
import de.schildbach.pte.NetworkProvider.Accessibility; import de.schildbach.pte.NetworkProvider.Accessibility;
import de.schildbach.pte.NetworkProvider.WalkSpeed; import de.schildbach.pte.NetworkProvider.WalkSpeed;
import de.schildbach.pte.ParisProvider; import de.schildbach.pte.ParisProvider;
import de.schildbach.pte.dto.LineDestination;
import de.schildbach.pte.dto.Location; import de.schildbach.pte.dto.Location;
import de.schildbach.pte.dto.LocationType; import de.schildbach.pte.dto.LocationType;
import de.schildbach.pte.dto.NearbyLocationsResult; import de.schildbach.pte.dto.NearbyLocationsResult;
@ -103,7 +106,9 @@ public class ParisProviderLiveTest extends AbstractProviderLiveTest
assertEquals(QueryDeparturesResult.Status.OK, result.status); assertEquals(QueryDeparturesResult.Status.OK, result.status);
assertEquals(1, result.stationDepartures.size()); assertEquals(1, result.stationDepartures.size());
assertTrue(result.stationDepartures.get(0).departures.size() <= maxDepartures); assertTrue(result.stationDepartures.get(0).departures.size() <= maxDepartures);
assertTrue(result.stationDepartures.get(0).lines.size() >= 1); final List<LineDestination> lines = result.stationDepartures.get(0).lines;
assertNotNull(lines);
assertTrue(lines.size() >= 1);
print(result); print(result);
} }
@ -119,7 +124,9 @@ public class ParisProviderLiveTest extends AbstractProviderLiveTest
for (StationDepartures stationDepartures : result.stationDepartures) for (StationDepartures stationDepartures : result.stationDepartures)
{ {
nbDepartures += stationDepartures.departures.size(); nbDepartures += stationDepartures.departures.size();
nbLines += stationDepartures.lines.size(); final List<LineDestination> lines = stationDepartures.lines;
assertNotNull(lines);
nbLines += lines.size();
} }
assertTrue(nbDepartures <= maxDepartures); assertTrue(nbDepartures <= maxDepartures);
assertTrue(nbLines >= 2); assertTrue(nbLines >= 2);