All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.opentripplanner.api.mapping.LegMapper Maven / Gradle / Ivy

package org.opentripplanner.api.mapping;

import org.opentripplanner.api.model.ApiAlert;
import org.opentripplanner.api.model.ApiLeg;
import org.opentripplanner.model.plan.Leg;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import java.util.Locale;

public class LegMapper {
    private final WalkStepMapper walkStepMapper;
    private final StreetNoteMaperMapper streetNoteMaperMapper;
    private final AlertMapper alertMapper;

    public LegMapper(Locale locale) {
        this.walkStepMapper = new WalkStepMapper(locale);
        this.streetNoteMaperMapper = new StreetNoteMaperMapper(locale);
        this.alertMapper = new AlertMapper(locale);
    }

    public List mapLegs(List domain) {
        if(domain == null) { return null; }

        List apiLegs = new ArrayList<>();

        final int size = domain.size();
        final int lastIdx = size-1;

        for (int i=0; i < size; ++i) {
            Calendar arrivalTimeFromPlace = (i == 0) ? null : domain.get(i-1).endTime;
            Calendar departureTimeToPlace = (i == lastIdx) ? null : domain.get(i+1).startTime;

            apiLegs.add(mapLeg(domain.get(i), arrivalTimeFromPlace, departureTimeToPlace));
        }
        return apiLegs;
    }

    public ApiLeg mapLeg(Leg domain, Calendar arrivalTimeFromPlace, Calendar departureTimeToPlace) {
        if(domain == null) { return null; }
        ApiLeg api = new ApiLeg();
        api.startTime = domain.startTime;
        api.endTime = domain.endTime;

        // Set the arrival and departure times, even if this is redundant information
        api.from = PlaceMapper.mapPlace(domain.from, arrivalTimeFromPlace, api.startTime);
        api.to = PlaceMapper.mapPlace(domain.to, api.endTime, departureTimeToPlace);

        api.departureDelay = domain.departureDelay;
        api.arrivalDelay = domain.arrivalDelay;
        api.realTime = domain.realTime;
        api.isNonExactFrequency = domain.isNonExactFrequency;
        api.headway = domain.headway;
        api.distance = domain.distanceMeters;
        api.pathway = domain.pathway;
        api.mode = TraverseModeMapper.mapToApi(domain.mode);
        api.agencyTimeZoneOffset = domain.agencyTimeZoneOffset;
        api.transitLeg = domain.isTransitLeg();

        if(domain.isTransitLeg()) {
            var agency = domain.getAgency();
            api.agencyId = FeedScopedIdMapper.mapToApi(agency.getId());
            api.agencyName = agency.getName();
            api.agencyUrl = agency.getUrl();
            api.agencyBrandingUrl = agency.getBrandingUrl();

            var route = domain.getRoute();
            api.route = route.getLongName();
            api.routeColor = route.getColor();
            api.routeType = domain.routeType;
            api.routeId = FeedScopedIdMapper.mapToApi(route.getId());
            api.routeShortName = route.getShortName();
            api.routeLongName = route.getLongName();
            api.routeTextColor = route.getTextColor();

            var trip = domain.getTrip();
            api.tripId = FeedScopedIdMapper.mapToApi(trip.getId());
            api.tripShortName = trip.getTripShortName();
            api.tripBlockId = trip.getBlockId();
        }
        else {
            // TODO OTP2 - This should be set to the street name according to the JavaDoc
            api.route = "";
        }

        api.interlineWithPreviousLeg = domain.interlineWithPreviousLeg;
        api.headsign = domain.headsign;
        api.serviceDate = ServiceDateMapper.mapToApi(domain.serviceDate);
        api.routeBrandingUrl = domain.routeBrandingUrl;
        api.intermediateStops = PlaceMapper.mapStopArrivals(domain.intermediateStops);
        api.legGeometry = domain.legGeometry;
        api.steps = walkStepMapper.mapWalkSteps(domain.walkSteps);
        api.alerts = concatenateAlerts(
            streetNoteMaperMapper.mapToApi(domain.streetNotes),
            alertMapper.mapToApi(domain.transitAlerts)
        );
        api.boardRule = domain.boardRule;
        api.alightRule = domain.alightRule;
        api.rentedBike = domain.rentedBike;

        return api;
    }

    private static List concatenateAlerts(List a, List b) {
        if (a == null) {
            return b;
        } else if (b == null) {
            return a;
        } else {
            List ret = new ArrayList<>(a);
            ret.addAll(b);
            return ret;
        }
    }

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy