diff --git a/enabler/src/de/schildbach/pte/AbstractEfaProvider.java b/enabler/src/de/schildbach/pte/AbstractEfaProvider.java
index 9e4044d0..45a066cd 100644
--- a/enabler/src/de/schildbach/pte/AbstractEfaProvider.java
+++ b/enabler/src/de/schildbach/pte/AbstractEfaProvider.java
@@ -47,6 +47,7 @@ import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlPullParserFactory;
+import de.schildbach.pte.NetworkProvider.Option;
import de.schildbach.pte.dto.Connection;
import de.schildbach.pte.dto.Departure;
import de.schildbach.pte.dto.Fare;
@@ -1577,7 +1578,7 @@ public abstract class AbstractEfaProvider extends AbstractNetworkProvider
}
protected String xsltTripRequest2Uri(final Location from, final Location via, final Location to, final Date date, final boolean dep,
- final int numConnections, final String products, final WalkSpeed walkSpeed, final Accessibility accessibility)
+ final int numConnections, final String products, final WalkSpeed walkSpeed, final Accessibility accessibility, final Set options)
{
final DateFormat DATE_FORMAT = new SimpleDateFormat("yyyyMMdd");
final DateFormat TIME_FORMAT = new SimpleDateFormat("HHmm");
@@ -1655,6 +1656,9 @@ public abstract class AbstractEfaProvider extends AbstractNetworkProvider
uri.append("&lineRestriction=403"); // means: all but ice
}
+ if (options != null && options.contains(Option.BIKE))
+ uri.append("&bikeTakeAlong=1");
+
uri.append("&locationServerActive=1");
uri.append("&useRealtime=1");
uri.append("&useProxFootSearch=1"); // walk if it makes journeys quicker
@@ -1681,9 +1685,10 @@ public abstract class AbstractEfaProvider extends AbstractNetworkProvider
}
public QueryConnectionsResult queryConnections(final Location from, final Location via, final Location to, final Date date, final boolean dep,
- final int numConnections, final String products, final WalkSpeed walkSpeed, final Accessibility accessibility) throws IOException
+ final int numConnections, final String products, final WalkSpeed walkSpeed, final Accessibility accessibility, final Set options)
+ throws IOException
{
- final String uri = xsltTripRequest2Uri(from, via, to, date, dep, numConnections, products, walkSpeed, accessibility);
+ final String uri = xsltTripRequest2Uri(from, via, to, date, dep, numConnections, products, walkSpeed, accessibility, options);
InputStream is = null;
try
diff --git a/enabler/src/de/schildbach/pte/AbstractHafasProvider.java b/enabler/src/de/schildbach/pte/AbstractHafasProvider.java
index dd4658d7..9cfd183a 100644
--- a/enabler/src/de/schildbach/pte/AbstractHafasProvider.java
+++ b/enabler/src/de/schildbach/pte/AbstractHafasProvider.java
@@ -732,7 +732,8 @@ public abstract class AbstractHafasProvider extends AbstractNetworkProvider
}
public QueryConnectionsResult queryConnections(Location from, Location via, Location to, final Date date, final boolean dep,
- final int numConnections, final String products, final WalkSpeed walkSpeed, final Accessibility accessibility) throws IOException
+ final int numConnections, final String products, final WalkSpeed walkSpeed, final Accessibility accessibility, final Set options)
+ throws IOException
{
final ResultHeader header = new ResultHeader(SERVER_PRODUCT);
@@ -782,14 +783,18 @@ public abstract class AbstractHafasProvider extends AbstractNetworkProvider
productsStr.append(allProductsString());
}
+ final char bikeChar = (options != null && options.contains(Option.BIKE)) ? '1' : '0';
+
final StringBuilder request = new StringBuilder("");
request.append("").append(locationXml(from));
- request.append("");
+ request.append("");
request.append(" ");
if (via != null)
{
request.append("").append(locationXml(via));
- request.append("");
+ request.append("");
request.append(" ");
}
request.append("").append(locationXml(to)).append(" ");
diff --git a/enabler/src/de/schildbach/pte/BahnProvider.java b/enabler/src/de/schildbach/pte/BahnProvider.java
index 5053efcc..5758d067 100644
--- a/enabler/src/de/schildbach/pte/BahnProvider.java
+++ b/enabler/src/de/schildbach/pte/BahnProvider.java
@@ -24,6 +24,7 @@ import java.util.Date;
import java.util.GregorianCalendar;
import java.util.List;
import java.util.Locale;
+import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@@ -158,7 +159,7 @@ public final class BahnProvider extends AbstractHafasProvider
}
private String connectionsQueryUri(final Location from, final Location via, final Location to, final Date date, final boolean dep,
- final String products)
+ final String products, final Set options)
{
final Calendar c = new GregorianCalendar(timeZone());
c.setTime(date);
@@ -264,6 +265,9 @@ public final class BahnProvider extends AbstractHafasProvider
}
}
+ if (options != null && options.contains(Option.BIKE))
+ uri.append("&REQ0JourneyProduct_opt3=1");
+
return uri.toString();
}
@@ -273,9 +277,10 @@ public final class BahnProvider extends AbstractHafasProvider
@Override
public QueryConnectionsResult queryConnections(final Location from, final Location via, final Location to, final Date date, final boolean dep,
- final int numConnections, final String products, final WalkSpeed walkSpeed, final Accessibility accessibility) throws IOException
+ final int numConnections, final String products, final WalkSpeed walkSpeed, final Accessibility accessibility, final Set options)
+ throws IOException
{
- final String uri = connectionsQueryUri(from, via, to, date, dep, products);
+ final String uri = connectionsQueryUri(from, via, to, date, dep, products, options);
final CharSequence page = ParserUtils.scrape(uri);
List fromAddresses = null;
@@ -285,10 +290,10 @@ public final class BahnProvider extends AbstractHafasProvider
final Matcher mPreAddress = P_PRE_ADDRESS.matcher(page);
while (mPreAddress.find())
{
- final String type = mPreAddress.group(1);
- final String options = mPreAddress.group(2);
+ final String suggestionType = mPreAddress.group(1);
+ final String suggestion = mPreAddress.group(2);
- final Matcher mAddresses = P_ADDRESSES.matcher(options);
+ final Matcher mAddresses = P_ADDRESSES.matcher(suggestion);
final List addresses = new ArrayList();
while (mAddresses.find())
{
@@ -297,14 +302,14 @@ public final class BahnProvider extends AbstractHafasProvider
addresses.add(address);
}
- if (type.equals("REQ0JourneyStopsS0K"))
+ if (suggestionType.equals("REQ0JourneyStopsS0K"))
fromAddresses = addresses;
- else if (type.equals("REQ0JourneyStopsZ0K"))
+ else if (suggestionType.equals("REQ0JourneyStopsZ0K"))
toAddresses = addresses;
- else if (type.equals("REQ0JourneyStops1.0K"))
+ else if (suggestionType.equals("REQ0JourneyStops1.0K"))
viaAddresses = addresses;
else
- throw new IllegalStateException(type);
+ throw new IllegalStateException(suggestionType);
}
if (fromAddresses != null || viaAddresses != null || toAddresses != null)
diff --git a/enabler/src/de/schildbach/pte/BvgProvider.java b/enabler/src/de/schildbach/pte/BvgProvider.java
index ce019aa1..52a2c24f 100644
--- a/enabler/src/de/schildbach/pte/BvgProvider.java
+++ b/enabler/src/de/schildbach/pte/BvgProvider.java
@@ -28,6 +28,7 @@ import java.util.LinkedList;
import java.util.List;
import java.util.Locale;
import java.util.Map;
+import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@@ -569,7 +570,8 @@ public final class BvgProvider extends AbstractHafasProvider
@Override
public QueryConnectionsResult queryConnections(final Location from, final Location via, final Location to, final Date date, final boolean dep,
- final int numConnections, final String products, final WalkSpeed walkSpeed, final Accessibility accessibility) throws IOException
+ final int numConnections, final String products, final WalkSpeed walkSpeed, final Accessibility accessibility, final Set options)
+ throws IOException
{
final String uri = connectionsQueryUri(from, via, to, date, dep, products);
final CharSequence page = ParserUtils.scrape(uri);
@@ -581,10 +583,10 @@ public final class BvgProvider extends AbstractHafasProvider
final Matcher mPreAddress = P_PRE_ADDRESS.matcher(page);
while (mPreAddress.find())
{
- final String optionsType = mPreAddress.group(1);
- final String options = mPreAddress.group(2);
+ final String suggestionType = mPreAddress.group(1);
+ final String suggestion = mPreAddress.group(2);
- final Matcher mAddresses = P_ADDRESSES.matcher(options);
+ final Matcher mAddresses = P_ADDRESSES.matcher(suggestion);
final List addresses = new ArrayList();
while (mAddresses.find())
{
@@ -607,14 +609,14 @@ public final class BvgProvider extends AbstractHafasProvider
addresses.add(location);
}
- if (optionsType.equals("REQ0JourneyStopsS0K"))
+ if (suggestionType.equals("REQ0JourneyStopsS0K"))
fromAddresses = addresses;
- else if (optionsType.equals("REQ0JourneyStopsZ0K"))
+ else if (suggestionType.equals("REQ0JourneyStopsZ0K"))
toAddresses = addresses;
- else if (optionsType.equals("REQ0JourneyStops1.0K"))
+ else if (suggestionType.equals("REQ0JourneyStops1.0K"))
viaAddresses = addresses;
else
- throw new IllegalStateException("cannot handle: '" + optionsType + "'");
+ throw new IllegalStateException("cannot handle: '" + suggestionType + "'");
}
if (fromAddresses != null || viaAddresses != null || toAddresses != null)
diff --git a/enabler/src/de/schildbach/pte/NetworkProvider.java b/enabler/src/de/schildbach/pte/NetworkProvider.java
index 58f746eb..1a10d2f3 100644
--- a/enabler/src/de/schildbach/pte/NetworkProvider.java
+++ b/enabler/src/de/schildbach/pte/NetworkProvider.java
@@ -20,6 +20,7 @@ package de.schildbach.pte;
import java.io.IOException;
import java.util.Date;
import java.util.List;
+import java.util.Set;
import de.schildbach.pte.dto.Connection;
import de.schildbach.pte.dto.GetConnectionDetailsResult;
@@ -60,6 +61,11 @@ public interface NetworkProvider
NEUTRAL, LIMITED, BARRIER_FREE
}
+ public enum Option
+ {
+ BIKE
+ }
+
NetworkId id();
boolean hasCapabilities(Capability... capabilities);
@@ -123,11 +129,13 @@ public interface NetworkProvider
* how fast can you walk?
* @param accessibility
* how accessible do you need the route to be?
+ * @param options
+ * additional options
* @return result object that can contain alternatives to clear up ambiguousnesses, or contains possible connections
* @throws IOException
*/
QueryConnectionsResult queryConnections(Location from, Location via, Location to, Date date, boolean dep, int numConnections, String products,
- WalkSpeed walkSpeed, Accessibility accessibility) throws IOException;
+ WalkSpeed walkSpeed, Accessibility accessibility, Set options) throws IOException;
/**
* Query more connections (e.g. earlier or later)
diff --git a/enabler/src/de/schildbach/pte/SadProvider.java b/enabler/src/de/schildbach/pte/SadProvider.java
index 21e5a09b..6d822fc2 100644
--- a/enabler/src/de/schildbach/pte/SadProvider.java
+++ b/enabler/src/de/schildbach/pte/SadProvider.java
@@ -13,6 +13,7 @@ import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
+import java.util.Set;
import java.util.TimeZone;
import org.ksoap2.SoapEnvelope;
@@ -121,7 +122,7 @@ public class SadProvider extends AbstractNetworkProvider {
}
public QueryConnectionsResult queryConnections(Location from, Location via, Location to, Date date, boolean dep, final int numConnections, String products,
- WalkSpeed walkSpeed, Accessibility accessibility) throws IOException {
+ WalkSpeed walkSpeed, Accessibility accessibility, Set options) throws IOException {
// Select correct SOAP method depending on the dep flag
final String soapMethod = dep ? "searchCollPartenza" : "searchCollArrivo";
@@ -220,7 +221,7 @@ public class SadProvider extends AbstractNetworkProvider {
// Query for connections with new date/time value
// NOTE: via, products, walkSpeed, accessibility are set to null
return queryConnections(new Location(LocationType.STATION, fromId), null, new Location(LocationType.STATION, toId), date, dep,
- 0, null, null, null);
+ 0, null, null, null, null);
}
protected TimeZone timeZone() {
diff --git a/enabler/src/de/schildbach/pte/VgnProvider.java b/enabler/src/de/schildbach/pte/VgnProvider.java
index 5274c264..36bc958d 100644
--- a/enabler/src/de/schildbach/pte/VgnProvider.java
+++ b/enabler/src/de/schildbach/pte/VgnProvider.java
@@ -18,6 +18,7 @@
package de.schildbach.pte;
import java.util.Date;
+import java.util.Set;
import de.schildbach.pte.dto.Location;
@@ -51,8 +52,9 @@ public class VgnProvider extends AbstractEfaProvider
@Override
protected String xsltTripRequest2Uri(final Location from, final Location via, final Location to, final Date date, final boolean dep,
- final int numConnections, final String products, final WalkSpeed walkSpeed, final Accessibility accessibility)
+ final int numConnections, final String products, final WalkSpeed walkSpeed, final Accessibility accessibility, final Set options)
{
- return super.xsltTripRequest2Uri(from, via, to, date, dep, numConnections, products, walkSpeed, accessibility) + "&itdLPxx_showTariffLevel=1";
+ return super.xsltTripRequest2Uri(from, via, to, date, dep, numConnections, products, walkSpeed, accessibility, options)
+ + "&itdLPxx_showTariffLevel=1";
}
}
diff --git a/enabler/test/de/schildbach/pte/live/AbstractProviderLiveTest.java b/enabler/test/de/schildbach/pte/live/AbstractProviderLiveTest.java
index 1d9ebbcf..e6b29ca7 100644
--- a/enabler/test/de/schildbach/pte/live/AbstractProviderLiveTest.java
+++ b/enabler/test/de/schildbach/pte/live/AbstractProviderLiveTest.java
@@ -70,7 +70,7 @@ public abstract class AbstractProviderLiveTest
protected final QueryConnectionsResult queryConnections(final Location from, final Location via, final Location to, final Date date,
final boolean dep, final String products, final WalkSpeed walkSpeed, final Accessibility accessibility) throws IOException
{
- return provider.queryConnections(from, via, to, date, dep, 4, products, walkSpeed, accessibility);
+ return provider.queryConnections(from, via, to, date, dep, 4, products, walkSpeed, accessibility, null);
}
protected final QueryConnectionsResult queryMoreConnections(final QueryConnectionsContext context, final boolean later) throws IOException
diff --git a/service/src/main/java/de/schildbach/pte/service/ConnectionController.java b/service/src/main/java/de/schildbach/pte/service/ConnectionController.java
index 18960d90..2c12a7d6 100644
--- a/service/src/main/java/de/schildbach/pte/service/ConnectionController.java
+++ b/service/src/main/java/de/schildbach/pte/service/ConnectionController.java
@@ -53,6 +53,6 @@ public class ConnectionController
final Location fromLocation = new Location(fromType, fromId, null, from);
final Location toLocation = new Location(toType, toId, null, to);
final String products = "IRSUTBFC";
- return provider.queryConnections(fromLocation, null, toLocation, new Date(), true, 4, products, WalkSpeed.NORMAL, Accessibility.NEUTRAL);
+ return provider.queryConnections(fromLocation, null, toLocation, new Date(), true, 4, products, WalkSpeed.NORMAL, Accessibility.NEUTRAL, null);
}
}