/* * Copyright 2010-2012 the original author or authors. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ package de.schildbach.pte.dto; import java.io.Serializable; import java.text.SimpleDateFormat; import java.util.Date; import java.util.List; /** * @author Andreas Schildbach */ public final class Connection implements Serializable { private static final long serialVersionUID = 2508466068307110312L; public final String id; public final Location from; public final Location to; public final List parts; public final List fares; public final int[] capacity; public final Integer numChanges; public Connection(final String id, final Location from, final Location to, final List parts, final List fares, final int[] capacity, final Integer numChanges) { this.id = id; this.from = from; this.to = to; this.parts = parts; this.fares = fares; this.capacity = capacity; this.numChanges = numChanges; } public Date getFirstDepartureTime() { if (parts != null) { int mins = 0; for (final Part part : parts) { if (part instanceof Footway) mins += ((Footway) part).min; else if (part instanceof Trip) return new Date(((Trip) part).getDepartureTime().getTime() - 1000 * 60 * mins); } } return null; } public Trip getFirstTrip() { if (parts != null) for (final Part part : parts) if (part instanceof Trip) return (Trip) part; return null; } public Date getFirstTripDepartureTime() { final Trip firstTrip = getFirstTrip(); if (firstTrip != null) return firstTrip.getDepartureTime(); else return null; } public Date getLastArrivalTime() { if (parts != null) { int mins = 0; for (int i = parts.size() - 1; i >= 0; i--) { final Part part = parts.get(i); if (part instanceof Footway) mins += ((Footway) part).min; else if (part instanceof Trip) return new Date(((Trip) part).getArrivalTime().getTime() + 1000 * 60 * mins); } } return null; } public Trip getLastTrip() { if (parts != null) { for (int i = parts.size() - 1; i >= 0; i--) { final Part part = parts.get(i); if (part instanceof Trip) return (Trip) part; } } return null; } public Date getLastTripArrivalTime() { final Trip lastTrip = getLastTrip(); if (lastTrip != null) return lastTrip.getArrivalTime(); else return null; } @Override public String toString() { final SimpleDateFormat FORMAT = new SimpleDateFormat("E HH:mm"); final StringBuilder str = new StringBuilder(id != null ? id : "null"); str.append(' '); final Date firstTripDepartureTime = getFirstTripDepartureTime(); str.append(firstTripDepartureTime != null ? FORMAT.format(firstTripDepartureTime) : "null"); str.append('-'); final Date lastTripArrivalTime = getLastTripArrivalTime(); str.append(lastTripArrivalTime != null ? FORMAT.format(lastTripArrivalTime) : "null"); str.append(' ').append(numChanges).append("ch"); return str.toString(); } @Override public boolean equals(Object o) { if (o == this) return true; if (!(o instanceof Connection)) return false; final Connection other = (Connection) o; return id.equals(other.id); } @Override public int hashCode() { return id.hashCode(); } public static class Part implements Serializable { private static final long serialVersionUID = 8498461220084523265L; public final Location departure; public final Location arrival; public List path; public Part(final Location departure, final Location arrival, final List path) { this.departure = departure; this.arrival = arrival; this.path = path; } } public final static class Trip extends Part { private static final long serialVersionUID = 1312066446239817422L; public final Line line; public final Location destination; public final Date departureTime; // TODO rename to plannedDepartureTime public final Date predictedDepartureTime; public final String departurePosition; // TODO rename to plannedDeparturePosition public final String predictedDeparturePosition; public final Date arrivalTime; // TODO rename to plannedArrivalTime public final Date predictedArrivalTime; public final String arrivalPosition; // TODO rename to plannedArrivalPosition public final String predictedArrivalPosition; public final List intermediateStops; public Trip(final Line line, final Location destination, final Date plannedDepartureTime, final Date predictedDepartureTime, final String departurePosition, final String predictedDeparturePosition, final Location departure, final Date plannedArrivalTime, final Date predictedArrivalTime, final String arrivalPosition, final String predictedArrivalPosition, final Location arrival, final List intermediateStops, final List path) { super(departure, arrival, path); this.line = line; this.destination = destination; this.departureTime = plannedDepartureTime; this.predictedDepartureTime = predictedDepartureTime; this.departurePosition = departurePosition; this.predictedDeparturePosition = predictedDeparturePosition; this.arrivalTime = plannedArrivalTime; this.predictedArrivalTime = predictedArrivalTime; this.arrivalPosition = arrivalPosition; this.predictedArrivalPosition = predictedArrivalPosition; this.intermediateStops = intermediateStops; } public Date getDepartureTime() { if (predictedDepartureTime != null) return predictedDepartureTime; else if (departureTime != null) return departureTime; else throw new IllegalStateException(); } public boolean isDepartureTimePredicted() { return predictedDepartureTime != null; } public String getDeparturePosition() { if (predictedDeparturePosition != null) return predictedDeparturePosition; else if (departurePosition != null) return departurePosition; else return null; } public boolean isDeparturePositionPredicted() { return predictedDeparturePosition != null; } public Date getArrivalTime() { if (predictedArrivalTime != null) return predictedArrivalTime; else if (arrivalTime != null) return arrivalTime; else throw new IllegalStateException(); } public boolean isArrivalTimePredicted() { return predictedArrivalTime != null; } public String getArrivalPosition() { if (predictedArrivalPosition != null) return predictedArrivalPosition; else if (arrivalPosition != null) return arrivalPosition; else return null; } public boolean isArrivalPositionPredicted() { return predictedArrivalPosition != null; } @Override public String toString() { final StringBuilder builder = new StringBuilder(getClass().getName() + "["); builder.append("line=").append(line); if (destination != null) { builder.append(","); builder.append("destination=").append(destination.toDebugString()); } builder.append(","); builder.append("departure=").append(departureTime).append("/").append(departurePosition).append("/").append(departure.toDebugString()); builder.append(","); builder.append("arrival=").append(arrivalTime).append("/").append(arrivalPosition).append("/").append(arrival.toDebugString()); builder.append("]"); return builder.toString(); } } public final static class Footway extends Part { public final int min; public Footway(final int min, final Location departure, final Location arrival, final List path) { super(departure, arrival, path); this.min = min; } @Override public String toString() { final StringBuilder builder = new StringBuilder(getClass().getName() + "["); builder.append("min=").append(min); builder.append(","); builder.append("departure=").append(departure.toDebugString()); builder.append(","); builder.append("arrival=").append(arrival.toDebugString()); builder.append("]"); return builder.toString(); } } }