org.onebusaway.quickstart.webapp.BootstrapWebApplicationContext.java Source code

Java tutorial

Introduction

Here is the source code for org.onebusaway.quickstart.webapp.BootstrapWebApplicationContext.java

Source

/**
 * 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());
        }
    }
}