/**
* Copyright (C) 2011 Brian Ferris <bdferris@onebusaway.org>
* 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_webapp.siri;
import java.io.Reader;
import java.io.Writer;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import org.onebusaway.collections.CollectionsLibrary;
import org.onebusaway.guice.jsr250.LifecycleService;
import org.onebusaway.siri.core.ESiriModuleType;
import org.onebusaway.siri.core.SiriChannelInfo;
import org.onebusaway.siri.core.SiriClient;
import org.onebusaway.siri.core.SiriClientRequest;
import org.onebusaway.siri.core.SiriClientRequestFactory;
import org.onebusaway.siri.core.SiriCommon.ELogRawXmlType;
import org.onebusaway.siri.core.SiriCoreModule;
import org.onebusaway.siri.core.SiriLibrary;
import org.onebusaway.siri.core.handlers.SiriServiceDeliveryHandler;
import org.onebusaway.transit_data_federation.impl.realtime.siri.SiriEndpointDetails;
import org.onebusaway.transit_data_federation.impl.realtime.siri.SiriService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import uk.org.siri.siri.AbstractServiceDeliveryStructure;
import uk.org.siri.siri.ServiceDelivery;
import com.google.inject.Guice;
import com.google.inject.Injector;
import com.google.inject.Module;
@Controller
public class SiriController {
private static Logger _log = LoggerFactory.getLogger(SiriController.class);
private SiriService _siriService;
private ServiceDeliveryHandlerImpl _handler = new ServiceDeliveryHandlerImpl();
private List<String> _endpoints;
private SiriClient _client;
private LifecycleService _lifecycleService;
private String _clientUrl;
private ELogRawXmlType _logRawXmlType;
@Autowired
public void setSiriService(SiriService siriService) {
_siriService = siriService;
}
public void setEndpoint(String endpoint) {
_endpoints = Arrays.asList(endpoint);
}
public void setEndpoints(List<String> endpoints) {
_endpoints = endpoints;
}
public void setClientUrl(String clientUrl) {
_clientUrl = clientUrl;
}
public void setLogRawXmlType(ELogRawXmlType logRawXmlType) {
_logRawXmlType = logRawXmlType;
}
@PostConstruct
public void start() {
List<Module> modules = new ArrayList<Module>();
modules.addAll(SiriCoreModule.getModules());
Injector injector = Guice.createInjector(modules);
_client = injector.getInstance(SiriClient.class);
_lifecycleService = injector.getInstance(LifecycleService.class);
_client.addServiceDeliveryHandler(_handler);
if( _clientUrl != null)
_client.setUrl(_clientUrl);
if (_logRawXmlType != null)
_client.setLogRawXmlType(_logRawXmlType);
_lifecycleService.start();
if (!CollectionsLibrary.isEmpty(_endpoints)) {
SiriClientRequestFactory factory = new SiriClientRequestFactory();
for (String endpoint : _endpoints) {
Map<String, String> args = SiriLibrary.getLineAsMap(endpoint);
SiriClientRequest request = factory.createSubscriptionRequest(args);
SiriEndpointDetails context = new SiriEndpointDetails();
String agencyId = args.get("AgencyId");
if (agencyId != null)
context.getDefaultAgencyIds().add(agencyId);
String agencyIds = args.get("AgencyIds");
if (agencyIds != null) {
for (String id : agencyIds.split(","))
context.getDefaultAgencyIds().add(id);
}
request.setChannelContext(context);
_client.handleRequest(request);
}
}
}
@PreDestroy
public void stop() {
_client.removeServiceDeliveryHandler(_handler);
_lifecycleService.stop();
}
@RequestMapping(value = "/siri.action")
public void siri(Reader reader, Writer writer) {
_client.handleRawRequest(reader, writer);
}
private class ServiceDeliveryHandlerImpl implements
SiriServiceDeliveryHandler {
@Override
public void handleServiceDelivery(SiriChannelInfo channelInfo,
ServiceDelivery serviceDelivery) {
SiriEndpointDetails endpoint = channelInfo.getContext();
if (endpoint == null) {
_log.warn("could not find siri delivery info");
return;
}
for (ESiriModuleType moduleType : ESiriModuleType.values()) {
List<AbstractServiceDeliveryStructure> deliveriesForModule = SiriLibrary.getServiceDeliveriesForModule(
serviceDelivery, moduleType);
for (AbstractServiceDeliveryStructure deliveryForModule : deliveriesForModule) {
_siriService.handleServiceDelivery(serviceDelivery,
deliveryForModule, moduleType, endpoint);
}
}
}
}
}