/**
* Copyright (C) 2011 Google, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.onebusaway.transit_data_federation.impl.realtime.gtfs_realtime;
import java.util.Map;
import org.onebusaway.gtfs.model.AgencyAndId;
import org.onebusaway.transit_data_federation.impl.service_alerts.ServiceAlertLibrary;
import org.onebusaway.transit_data_federation.services.service_alerts.ServiceAlerts;
import org.onebusaway.transit_data_federation.services.service_alerts.ServiceAlerts.Affects;
import org.onebusaway.transit_data_federation.services.service_alerts.ServiceAlerts.Consequence;
import org.onebusaway.transit_data_federation.services.service_alerts.ServiceAlerts.Id;
import org.onebusaway.transit_data_federation.services.service_alerts.ServiceAlerts.ServiceAlert;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.transit.realtime.GtfsRealtime;
import com.google.transit.realtime.GtfsRealtime.Alert;
import com.google.transit.realtime.GtfsRealtime.EntitySelector;
import com.google.transit.realtime.GtfsRealtime.TripDescriptor;
class GtfsRealtimeAlertLibrary {
private static final Logger _log = LoggerFactory.getLogger(GtfsRealtimeAlertLibrary.class);
private GtfsRealtimeEntitySource _entitySource;
public void setEntitySource(GtfsRealtimeEntitySource entitySource) {
_entitySource = entitySource;
}
public ServiceAlert.Builder getAlertAsServiceAlert(AgencyAndId id, Alert alert) {
return getAlertAsServiceAlert(id, alert, null);
}
public ServiceAlert.Builder getAlertAsServiceAlert(AgencyAndId id, Alert alert, Map agencyIdMap) {
ServiceAlert.Builder b = ServiceAlert.newBuilder();
b.setCreationTime(System.currentTimeMillis());
b.setModifiedTime(System.currentTimeMillis());
b.setId(ServiceAlertLibrary.id(id));
for (GtfsRealtime.TimeRange range : alert.getActivePeriodList()) {
ServiceAlerts.TimeRange.Builder rangeBuilder = ServiceAlerts.TimeRange.newBuilder();
if (range.hasStart())
rangeBuilder.setStart(range.getStart());
if (range.hasEnd())
rangeBuilder.setEnd(range.getEnd());
b.addActiveWindow(rangeBuilder);
}
if (alert.hasCause())
b.setCause(convertCause(alert.getCause()));
if (alert.hasHeaderText())
b.setSummary(convertTranslatedString(alert.getHeaderText()));
if (alert.hasDescriptionText())
b.setDescription(convertTranslatedString(alert.getDescriptionText()));
if (alert.hasEffect()) {
Consequence.Builder consequence = Consequence.newBuilder();
consequence.setEffect(convertEffect(alert.getEffect()));
b.addConsequence(consequence);
}
for (EntitySelector selector : alert.getInformedEntityList()) {
Affects.Builder affects = getEntitySelectorAsAffects(selector, agencyIdMap);
b.addAffects(affects);
}
if (alert.hasUrl())
b.setUrl(convertTranslatedString(alert.getUrl()));
return b;
}
private Affects.Builder getEntitySelectorAsAffects(EntitySelector selector, Map agencyIdMap) {
Affects.Builder affects = Affects.newBuilder();
if (selector.hasAgencyId()) {
String agencyId = selector.getAgencyId();
if (agencyIdMap != null && agencyIdMap.get(agencyId) != null) {
agencyId = (String) agencyIdMap.get(agencyId);
}
affects.setAgencyId(agencyId);
}
if (selector.hasRouteId()) {
Id routeId = _entitySource.getRouteId(selector.getRouteId());
affects.setRouteId(routeId);
}
if (selector.hasStopId()) {
Id stopId = _entitySource.getStopId(selector.getStopId());
affects.setStopId(stopId);
}
if (selector.hasTrip()) {
TripDescriptor trip = selector.getTrip();
if (trip.hasTripId())
affects.setTripId(_entitySource.getTripId(trip.getTripId()));
else if (trip.hasRouteId())
affects.setRouteId(_entitySource.getRouteId(trip.getRouteId()));
}
return affects;
}
private ServiceAlert.Cause convertCause(Alert.Cause cause) {
switch (cause) {
case ACCIDENT:
return ServiceAlert.Cause.ACCIDENT;
case CONSTRUCTION:
return ServiceAlert.Cause.CONSTRUCTION;
case DEMONSTRATION:
return ServiceAlert.Cause.DEMONSTRATION;
case HOLIDAY:
return ServiceAlert.Cause.HOLIDAY;
case MAINTENANCE:
return ServiceAlert.Cause.MAINTENANCE;
case MEDICAL_EMERGENCY:
return ServiceAlert.Cause.MEDICAL_EMERGENCY;
case OTHER_CAUSE:
return ServiceAlert.Cause.OTHER_CAUSE;
case POLICE_ACTIVITY:
return ServiceAlert.Cause.POLICE_ACTIVITY;
case STRIKE:
return ServiceAlert.Cause.STRIKE;
case TECHNICAL_PROBLEM:
return ServiceAlert.Cause.TECHNICAL_PROBLEM;
case UNKNOWN_CAUSE:
return ServiceAlert.Cause.UNKNOWN_CAUSE;
case WEATHER:
return ServiceAlert.Cause.WEATHER;
default:
_log.warn("unknown GtfsRealtime.Alert.Cause " + cause);
return ServiceAlert.Cause.UNKNOWN_CAUSE;
}
}
private Consequence.Effect convertEffect(Alert.Effect effect) {
switch (effect) {
case ADDITIONAL_SERVICE:
return Consequence.Effect.ADDITIONAL_SERVICE;
case DETOUR:
return Consequence.Effect.DETOUR;
case MODIFIED_SERVICE:
return Consequence.Effect.MODIFIED_SERVICE;
case NO_SERVICE:
return Consequence.Effect.NO_SERVICE;
case OTHER_EFFECT:
return Consequence.Effect.OTHER_EFFECT;
case REDUCED_SERVICE:
return Consequence.Effect.REDUCED_SERVICE;
case SIGNIFICANT_DELAYS:
return Consequence.Effect.SIGNIFICANT_DELAYS;
case STOP_MOVED:
return Consequence.Effect.STOP_MOVED;
case UNKNOWN_EFFECT:
return Consequence.Effect.UNKNOWN_EFFECT;
default:
_log.warn("unknown GtfsRealtime.Alert.Effect " + effect);
return Consequence.Effect.UNKNOWN_EFFECT;
}
}
private ServiceAlerts.TranslatedString convertTranslatedString(
GtfsRealtime.TranslatedString string) {
ServiceAlerts.TranslatedString.Builder b = ServiceAlerts.TranslatedString.newBuilder();
for (GtfsRealtime.TranslatedString.Translation translation : string.getTranslationList()) {
ServiceAlerts.TranslatedString.Translation.Builder tb = ServiceAlerts.TranslatedString.Translation.newBuilder();
if (translation.hasLanguage())
tb.setLanguage(translation.getLanguage());
tb.setText(translation.getText());
b.addTranslation(tb);
}
return b.build();
}
}