intermediate stops for hafas api

git-svn-id: https://public-transport-enabler.googlecode.com/svn/trunk@644 0924bc21-9374-b0fa-ee44-9ff1593b38f0
This commit is contained in:
andreas.schildbach@gmail.com 2011-05-15 12:34:36 +00:00
parent 7c6b3d2539
commit 2badfa9e70

View file

@ -25,6 +25,7 @@ import java.util.Collections;
import java.util.Date; import java.util.Date;
import java.util.GregorianCalendar; import java.util.GregorianCalendar;
import java.util.HashMap; import java.util.HashMap;
import java.util.LinkedList;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.TimeZone; import java.util.TimeZone;
@ -49,6 +50,7 @@ import de.schildbach.pte.dto.QueryConnectionsResult;
import de.schildbach.pte.dto.QueryConnectionsResult.Status; import de.schildbach.pte.dto.QueryConnectionsResult.Status;
import de.schildbach.pte.dto.QueryDeparturesResult; import de.schildbach.pte.dto.QueryDeparturesResult;
import de.schildbach.pte.dto.StationDepartures; import de.schildbach.pte.dto.StationDepartures;
import de.schildbach.pte.dto.Stop;
import de.schildbach.pte.util.Color; import de.schildbach.pte.util.Color;
import de.schildbach.pte.util.ParserUtils; import de.schildbach.pte.util.ParserUtils;
import de.schildbach.pte.util.XmlPullUtil; import de.schildbach.pte.util.XmlPullUtil;
@ -178,6 +180,19 @@ public abstract class AbstractHafasProvider implements NetworkProvider
throw new IllegalStateException("cannot handle: " + type); throw new IllegalStateException("cannot handle: " + type);
} }
private static final String parsePlatform(final XmlPullParser pp) throws XmlPullParserException, IOException
{
XmlPullUtil.enter(pp, "Platform");
XmlPullUtil.require(pp, "Text");
final String position = XmlPullUtil.text(pp).trim();
XmlPullUtil.exit(pp, "Platform");
if (position.length() == 0)
return null;
else
return position;
}
public List<Location> xmlLocValReq(final CharSequence constraint) throws IOException public List<Location> xmlLocValReq(final CharSequence constraint) throws IOException
{ {
final String request = "<LocValReq id=\"req\" maxNr=\"20\"><ReqLoc match=\"" + constraint + "\" type=\"ALLTYPE\"/></LocValReq>"; final String request = "<LocValReq id=\"req\" maxNr=\"20\"><ReqLoc match=\"" + constraint + "\" type=\"ALLTYPE\"/></LocValReq>";
@ -677,6 +692,8 @@ public abstract class AbstractHafasProvider implements NetworkProvider
XmlPullUtil.enter(pp, "ConSectionList"); XmlPullUtil.enter(pp, "ConSectionList");
final Calendar time = new GregorianCalendar(timeZone());
while (XmlPullUtil.test(pp, "ConSection")) while (XmlPullUtil.test(pp, "ConSection"))
{ {
XmlPullUtil.enter(pp, "ConSection"); XmlPullUtil.enter(pp, "ConSection");
@ -689,16 +706,10 @@ public abstract class AbstractHafasProvider implements NetworkProvider
final Location sectionDeparture = parseLocation(pp); final Location sectionDeparture = parseLocation(pp);
XmlPullUtil.enter(pp, "Dep"); XmlPullUtil.enter(pp, "Dep");
XmlPullUtil.require(pp, "Time"); XmlPullUtil.require(pp, "Time");
final Calendar departureTime = new GregorianCalendar(timeZone()); time.setTimeInMillis(currentDate.getTimeInMillis());
departureTime.setTimeInMillis(currentDate.getTimeInMillis()); parseTime(time, XmlPullUtil.text(pp));
parseTime(departureTime, XmlPullUtil.text(pp)); final Date departureTime = time.getTime();
XmlPullUtil.enter(pp, "Platform"); final String departurePos = parsePlatform(pp);
XmlPullUtil.require(pp, "Text");
String departurePos = XmlPullUtil.text(pp).trim();
if (departurePos.length() == 0)
departurePos = null;
XmlPullUtil.exit(pp, "Platform");
XmlPullUtil.exit(pp, "Dep"); XmlPullUtil.exit(pp, "Dep");
XmlPullUtil.exit(pp, "BasicStop"); XmlPullUtil.exit(pp, "BasicStop");
@ -709,10 +720,12 @@ public abstract class AbstractHafasProvider implements NetworkProvider
Location destination = null; Location destination = null;
int min = 0; int min = 0;
final List<Stop> intermediateStops = new LinkedList<Stop>();
final String tag = pp.getName(); final String tag = pp.getName();
if (tag.equals("Journey")) if (tag.equals("Journey"))
{ {
XmlPullUtil.enter(pp); XmlPullUtil.enter(pp, "Journey");
while (pp.getName().equals("JHandle")) while (pp.getName().equals("JHandle"))
XmlPullUtil.next(pp); XmlPullUtil.next(pp);
XmlPullUtil.enter(pp, "JourneyAttributeList"); XmlPullUtil.enter(pp, "JourneyAttributeList");
@ -728,7 +741,7 @@ public abstract class AbstractHafasProvider implements NetworkProvider
XmlPullUtil.enter(pp); XmlPullUtil.enter(pp);
final Map<String, String> attributeVariants = parseAttributeVariants(pp); final Map<String, String> attributeVariants = parseAttributeVariants(pp);
XmlPullUtil.exit(pp); XmlPullUtil.exit(pp);
XmlPullUtil.exit(pp); XmlPullUtil.exit(pp, "JourneyAttribute");
if ("NAME".equals(attrName)) if ("NAME".equals(attrName))
{ {
@ -745,8 +758,33 @@ public abstract class AbstractHafasProvider implements NetworkProvider
destination = new Location(LocationType.ANY, 0, null, attributeVariants.get("NORMAL")); destination = new Location(LocationType.ANY, 0, null, attributeVariants.get("NORMAL"));
} }
} }
XmlPullUtil.exit(pp); XmlPullUtil.exit(pp, "JourneyAttributeList");
XmlPullUtil.exit(pp);
XmlPullUtil.enter(pp, "PassList");
while (XmlPullUtil.test(pp, "BasicStop"))
{
XmlPullUtil.enter(pp, "BasicStop");
while (XmlPullUtil.test(pp, "StAttrList"))
XmlPullUtil.next(pp);
final Location location = parseLocation(pp);
if (XmlPullUtil.test(pp, "Arr"))
XmlPullUtil.next(pp);
if (XmlPullUtil.test(pp, "Dep"))
{
XmlPullUtil.enter(pp, "Dep");
XmlPullUtil.require(pp, "Time");
time.setTimeInMillis(currentDate.getTimeInMillis());
parseTime(time, XmlPullUtil.text(pp));
final String position = parsePlatform(pp);
XmlPullUtil.exit(pp, "Dep");
intermediateStops.add(new Stop(location, position, time.getTime()));
}
XmlPullUtil.exit(pp, "BasicStop");
}
XmlPullUtil.exit(pp, "PassList");
XmlPullUtil.exit(pp, "Journey");
if (category == null) if (category == null)
category = shortCategory; category = shortCategory;
@ -778,27 +816,32 @@ public abstract class AbstractHafasProvider implements NetworkProvider
final Location sectionArrival = parseLocation(pp); final Location sectionArrival = parseLocation(pp);
XmlPullUtil.enter(pp, "Arr"); XmlPullUtil.enter(pp, "Arr");
XmlPullUtil.require(pp, "Time"); XmlPullUtil.require(pp, "Time");
final Calendar arrivalTime = new GregorianCalendar(timeZone()); time.setTimeInMillis(currentDate.getTimeInMillis());
arrivalTime.setTimeInMillis(currentDate.getTimeInMillis()); parseTime(time, XmlPullUtil.text(pp));
parseTime(arrivalTime, XmlPullUtil.text(pp)); final Date arrivalTime = time.getTime();
XmlPullUtil.enter(pp, "Platform"); final String arrivalPos = parsePlatform(pp);
XmlPullUtil.require(pp, "Text");
String arrivalPos = XmlPullUtil.text(pp).trim();
if (arrivalPos.length() == 0)
arrivalPos = null;
XmlPullUtil.exit(pp, "Platform");
XmlPullUtil.exit(pp, "Arr"); XmlPullUtil.exit(pp, "Arr");
XmlPullUtil.exit(pp, "BasicStop"); XmlPullUtil.exit(pp, "BasicStop");
XmlPullUtil.exit(pp, "Arrival"); XmlPullUtil.exit(pp, "Arrival");
// remove first and last, because they are not intermediate
final int size = intermediateStops.size();
if (size >= 2)
{
if (intermediateStops.get(size - 1).location.id == sectionArrival.id)
intermediateStops.remove(size - 1);
if (intermediateStops.get(0).location.id == sectionDeparture.id)
intermediateStops.remove(0);
}
XmlPullUtil.exit(pp, "ConSection"); XmlPullUtil.exit(pp, "ConSection");
if (min == 0 || line != null) if (min == 0 || line != null)
{ {
parts.add(new Connection.Trip(line, destination, departureTime.getTime(), departurePos, sectionDeparture, arrivalTime parts.add(new Connection.Trip(line, destination, departureTime, departurePos, sectionDeparture, arrivalTime, arrivalPos,
.getTime(), arrivalPos, sectionArrival, null, null)); sectionArrival, intermediateStops, null));
} }
else else
{ {
@ -814,8 +857,8 @@ public abstract class AbstractHafasProvider implements NetworkProvider
} }
if (firstDepartureTime == null) if (firstDepartureTime == null)
firstDepartureTime = departureTime.getTime(); firstDepartureTime = departureTime;
lastArrivalTime = arrivalTime.getTime(); lastArrivalTime = arrivalTime;
} }
XmlPullUtil.exit(pp, "ConSectionList"); XmlPullUtil.exit(pp, "ConSectionList");