/** * 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.quickstart.webapp; import java.io.IOException; import java.util.HashMap; import java.util.Map; import java.util.Properties; import javax.servlet.ServletContext; import org.apache.commons.cli.CommandLine; import org.onebusaway.quickstart.WebappCommon; import org.springframework.beans.BeansException; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.beans.factory.support.BeanDefinitionBuilder; import org.springframework.beans.factory.support.DefaultListableBeanFactory; import org.springframework.web.context.support.XmlWebApplicationContext; /** * A custom extension of {@link XmlWebApplicationContext} that loads custom * Spring bean definitions as determined by command-line arguments to the * quickstart webapp. See {@link WebappCommon} for a list of the command-line * arguments. This class expects an instance of {@link CommandLine} to be stored * in a {@link ServletContext} attribute identified by the key * {@link WebappCommon#COMMAND_LINE_CONTEXT_ATTRIBUTE}. * * @author bdferris * */ public class BootstrapWebApplicationContext extends XmlWebApplicationContext { @Override protected void loadBeanDefinitions(DefaultListableBeanFactory beanFactory) throws BeansException, IOException { super.loadBeanDefinitions(beanFactory); System.out.println("=== BootstrapWebApplicationContext! ============================"); ServletContext servletContext = getServletContext(); final CommandLine cli = (CommandLine) servletContext.getAttribute(WebappCommon.COMMAND_LINE_CONTEXT_ATTRIBUTE); if (cli == null) throw new IllegalStateException( "expected a CommandLine object stored in the webapp context"); final Map<String, BeanDefinition> beanDefinitions = configureBeanDefinitions(cli); if (beanDefinitions.isEmpty()) return; for (Map.Entry<String, BeanDefinition> entry : beanDefinitions.entrySet()) { String beanName = entry.getKey(); BeanDefinition beanDefinition = entry.getValue(); beanFactory.registerBeanDefinition(beanName, beanDefinition); } } protected Map<String, BeanDefinition> configureBeanDefinitions(CommandLine cli) { Map<String, BeanDefinition> beanDefinitions = new HashMap<String, BeanDefinition>(); configureGtfsRealtimeBeanDefinition(cli, beanDefinitions); return beanDefinitions; } private void configureGtfsRealtimeBeanDefinition(CommandLine cli, Map<String, BeanDefinition> beanDefinitions) { boolean tripUpdates = cli.hasOption(WebappCommon.ARG_GTFS_REALTIME_TRIP_UPDATES_URL); boolean vehiclePositions = cli.hasOption(WebappCommon.ARG_GTFS_REALTIME_VEHICLE_POSITIONS_URL); boolean alertsUrl = cli.hasOption(WebappCommon.ARG_GTFS_REALTIME_ALERTS_URL); if (tripUpdates || vehiclePositions || alertsUrl) { BeanDefinitionBuilder bean = BeanDefinitionBuilder.genericBeanDefinition("org.onebusaway.transit_data_federation.impl.realtime.gtfs_realtime.GtfsRealtimeSource"); if (tripUpdates) bean.addPropertyValue("tripUpdatesUrl", cli.getOptionValue(WebappCommon.ARG_GTFS_REALTIME_TRIP_UPDATES_URL)); if (vehiclePositions) bean.addPropertyValue( "vehiclePositionsUrl", cli.getOptionValue(WebappCommon.ARG_GTFS_REALTIME_VEHICLE_POSITIONS_URL)); if (alertsUrl) bean.addPropertyValue("alertsUrl", cli.getOptionValue(WebappCommon.ARG_GTFS_REALTIME_ALERTS_URL)); if (cli.hasOption(WebappCommon.ARG_GTFS_REALTIME_REFRESH_INTERVAL)) { String refreshInterval = cli.getOptionValue(WebappCommon.ARG_GTFS_REALTIME_REFRESH_INTERVAL); bean.addPropertyValue("refreshInterval", refreshInterval); } beanDefinitions.put("gtfsRealtimeSource", bean.getBeanDefinition()); System.out.println("=== GTFS REALTIME! ============================"); } if (cli.hasOption("P")) { Properties props = cli.getOptionProperties("P"); BeanDefinitionBuilder propertyOverrides = BeanDefinitionBuilder.genericBeanDefinition("org.onebusaway.container.spring.PropertyOverrideConfigurer"); propertyOverrides.addPropertyValue("properties", props); beanDefinitions.put("myCustomPropertyOverrides", propertyOverrides.getBeanDefinition()); } } }