package com.schneeloch.bostonbusmap_library.data; import java.util.Collection; import com.schneeloch.bostonbusmap_library.database.Schema; import com.google.common.collect.ImmutableCollection; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableMultimap; import com.google.common.collect.ImmutableSet; import com.google.common.collect.ImmutableTable; import javax.xml.transform.Source; public class Alerts implements IAlerts { private final ImmutableMultimap<String, Alert> alertsByRoute; private final ImmutableMultimap<String, Alert> alertsByStop; private final ImmutableMultimap<Schema.Routes.SourceId, Alert> alertsByRouteType; private final ImmutableMultimap<String, Alert> alertsByCommuterRailTripId; private final ImmutableList<Alert> systemWideAlerts; private Alerts(ImmutableMultimap<String, Alert> alertsByRoute, ImmutableMultimap<String, Alert> alertsByStop, ImmutableMultimap<Schema.Routes.SourceId, Alert> alertsByRouteType, ImmutableMultimap<String, Alert> alertsByCommuterRailTripId, ImmutableList<Alert> systemWideAlerts) { this.alertsByRoute = alertsByRoute; this.alertsByStop = alertsByStop; this.alertsByRouteType = alertsByRouteType; this.alertsByCommuterRailTripId = alertsByCommuterRailTripId; this.systemWideAlerts = systemWideAlerts; } public static class Builder { private final ImmutableMultimap.Builder<String, Alert> alertsByRoute; private final ImmutableMultimap.Builder<String, Alert> alertsByStop; private final ImmutableMultimap.Builder<Schema.Routes.SourceId, Alert> alertsByRouteType; private final ImmutableMultimap.Builder<String, Alert> alertsByCommuterRailTripId; private final ImmutableList.Builder<Alert> systemWideAlerts; public Builder() { this.alertsByRoute = ImmutableMultimap.builder(); this.alertsByStop = ImmutableMultimap.builder(); this.alertsByRouteType = ImmutableMultimap.builder(); this.alertsByCommuterRailTripId = ImmutableMultimap.builder(); this.systemWideAlerts = ImmutableList.builder(); } public void addAlertForRoute(String route, Alert alert) { this.alertsByRoute.put(route, alert); } public void addAlertForRouteType(Schema.Routes.SourceId routeType, Alert alert) { this.alertsByRouteType.put(routeType, alert); } public void addAlertForStop(String stopId, Alert alert) { this.alertsByStop.put(stopId, alert); } public void addSystemWideAlert(Alert alert) { systemWideAlerts.add(alert); } public void addAlertForCommuterRailTrip(String commuterRailTripId, Alert alert) { alertsByCommuterRailTripId.put(commuterRailTripId, alert); } public IAlerts build() { return new Alerts(alertsByRoute.build(), alertsByStop.build(), alertsByRouteType.build(), alertsByCommuterRailTripId.build(), systemWideAlerts.build()); } } public static Builder builder() { return new Builder(); } /* (non-Javadoc) * @see com.schneeloch.bostonbusmap_library.data.IAlerts#getAlertsByCommuterRailTripId(java.lang.String, java.lang.String) */ @Override public ImmutableCollection<Alert> getAlertsByCommuterRailTripId(String tripId, String routeId) { ImmutableCollection.Builder<Alert> ret = ImmutableList.builder(); ret.addAll(systemWideAlerts); ret.addAll(alertsByCommuterRailTripId.get(tripId)); ret.addAll(alertsByRouteType.get(Schema.Routes.SourceId.CommuterRail)); ret.addAll(alertsByRoute.get(routeId)); return ret.build(); } /* (non-Javadoc) * @see com.schneeloch.bostonbusmap_library.data.IAlerts#getAlertsByRoute(java.lang.String, int) */ @Override public ImmutableCollection<Alert> getAlertsByRoute(String routeName, Schema.Routes.SourceId routeType) { ImmutableCollection.Builder<Alert> ret = ImmutableList.builder(); ret.addAll(systemWideAlerts); ret.addAll(alertsByRouteType.get(routeType)); ret.addAll(alertsByRoute.get(routeName)); return ret.build(); } /* (non-Javadoc) * @see com.schneeloch.bostonbusmap_library.data.IAlerts#getAlertsByRouteSetAndStop(java.util.Collection, java.lang.String, int) */ @Override public ImmutableCollection<Alert> getAlertsByRouteSetAndStop( Collection<String> routes, String tag, Schema.Routes.SourceId routeType) { ImmutableCollection.Builder<Alert> ret = ImmutableList.builder(); ret.addAll(systemWideAlerts); ImmutableCollection<Alert> routeTypeAlerts = alertsByRouteType.get(routeType); ret.addAll(routeTypeAlerts); for (String route : routes) { ImmutableCollection<Alert> routeAlerts = alertsByRoute.get(route); ret.addAll(routeAlerts); } ret.addAll(alertsByStop.get(tag)); return ret.build(); } }