com.kurtraschke.wmata.gtfsrealtime.WMATARealtimeMain.java Source code

Java tutorial

Introduction

Here is the source code for com.kurtraschke.wmata.gtfsrealtime.WMATARealtimeMain.java

Source

/*
 * Copyright (C) 2012 Google, Inc.
 * Copyright (C) 2013 Kurt Raschke
 *
 * 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 com.kurtraschke.wmata.gtfsrealtime;

import org.onebusaway.cli.CommandLineInterfaceLibrary;
import org.onebusaway.cli.Daemonizer;
import org.onebusaway.gtfs_realtime.exporter.GtfsRealtimeExporter;
import org.onebusaway.gtfs_realtime.exporter.GtfsRealtimeFileWriter;
import org.onebusaway.gtfs_realtime.exporter.GtfsRealtimeGuiceBindingTypes.Alerts;
import org.onebusaway.gtfs_realtime.exporter.GtfsRealtimeGuiceBindingTypes.TripUpdates;
import org.onebusaway.gtfs_realtime.exporter.GtfsRealtimeGuiceBindingTypes.VehiclePositions;
import org.onebusaway.gtfs_realtime.exporter.GtfsRealtimeServlet;
import org.onebusaway.guice.jsr250.LifecycleService;

import com.google.inject.ConfigurationException;
import com.google.inject.CreationException;
import com.google.inject.Guice;
import com.google.inject.Inject;
import com.google.inject.Injector;
import com.google.inject.Key;
import com.google.inject.Module;
import com.google.inject.ProvisionException;
import com.google.inject.name.Names;

import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.GnuParser;
import org.apache.commons.cli.Option;
import org.apache.commons.cli.Options;
import org.apache.commons.cli.Parser;
import org.nnsoft.guice.rocoto.Rocoto;
import org.nnsoft.guice.rocoto.configuration.ConfigurationModule;
import org.nnsoft.guice.rocoto.converters.FileConverter;
import org.nnsoft.guice.rocoto.converters.PropertiesConverter;
import org.nnsoft.guice.rocoto.converters.URLConverter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.File;
import java.net.URL;
import java.util.HashSet;
import java.util.Set;

public class WMATARealtimeMain {

    private static final Logger _log = LoggerFactory.getLogger(WMATARealtimeMain.class);

    private final String ARG_CONFIG_FILE = "config";
    private File _tripUpdatesPath;
    private URL _tripUpdatesUrl;
    private File _vehiclePositionsPath;
    private URL _vehiclePositionsUrl;
    private File _alertsPath;
    private URL _alertsUrl;
    private Injector _injector;
    @SuppressWarnings("unused")
    private GTFSRealtimeProviderImpl _provider;
    private LifecycleService _lifecycleService;
    private GtfsRealtimeExporter _vehiclePositionsExporter;
    private GtfsRealtimeExporter _tripUpdatesExporter;
    private GtfsRealtimeExporter _alertsExporter;

    public static void main(String[] args) throws Exception {
        System.setProperty("net.sf.ehcache.enableShutdownHook", "true");
        WMATARealtimeMain m = new WMATARealtimeMain();
        try {
            m.run(args);
        } catch (CreationException | ConfigurationException | ProvisionException e) {
            _log.error("Error in startup:", e);
            System.exit(-1);
        }
    }

    @Inject
    public void setProvider(GTFSRealtimeProviderImpl provider) {
        _provider = provider;
    }

    @Inject
    public void setLifecycleService(LifecycleService lifecycleService) {
        _lifecycleService = lifecycleService;
    }

    @Inject
    public void setVehiclePositionsExporter(@VehiclePositions GtfsRealtimeExporter exporter) {
        _vehiclePositionsExporter = exporter;
    }

    @Inject
    public void setTripUpdatesExporter(@TripUpdates GtfsRealtimeExporter exporter) {
        _tripUpdatesExporter = exporter;
    }

    @Inject
    public void setAlertsExporter(@Alerts GtfsRealtimeExporter exporter) {
        _alertsExporter = exporter;
    }

    public void run(String[] args) throws Exception {
        if (args.length == 0 || CommandLineInterfaceLibrary.wantsHelp(args)) {
            printUsage();
            System.exit(-1);
        }

        Options options = new Options();
        buildOptions(options);
        Daemonizer.buildOptions(options);
        Parser parser = new GnuParser();
        final CommandLine cli = parser.parse(options, args);
        Daemonizer.handleDaemonization(cli);

        Set<Module> modules = new HashSet<>();
        WMATARealtimeModule.addModuleAndDependencies(modules);

        _injector = Guice.createInjector(new URLConverter(), new FileConverter(), new PropertiesConverter(),
                new ConfigurationModule() {
                    @Override
                    protected void bindConfigurations() {
                        bindEnvironmentVariables();
                        bindSystemProperties();

                        if (cli.hasOption(ARG_CONFIG_FILE)) {
                            bindProperties(new File(cli.getOptionValue(ARG_CONFIG_FILE)));
                        }
                    }
                }, Rocoto.expandVariables(modules));

        _injector.injectMembers(this);

        _tripUpdatesUrl = getConfigurationValue(URL.class, "tripUpdates.url");
        if (_tripUpdatesUrl != null) {
            GtfsRealtimeServlet servlet = _injector.getInstance(GtfsRealtimeServlet.class);
            servlet.setUrl(_tripUpdatesUrl);
            servlet.setSource(_tripUpdatesExporter);

        }

        _tripUpdatesPath = getConfigurationValue(File.class, "tripUpdates.path");
        if (_tripUpdatesPath != null) {
            GtfsRealtimeFileWriter writer = _injector.getInstance(GtfsRealtimeFileWriter.class);
            writer.setPath(_tripUpdatesPath);
            writer.setSource(_tripUpdatesExporter);
        }

        _vehiclePositionsUrl = getConfigurationValue(URL.class, "vehiclePositions.url");
        if (_vehiclePositionsUrl != null) {
            GtfsRealtimeServlet servlet = _injector.getInstance(GtfsRealtimeServlet.class);
            servlet.setUrl(_vehiclePositionsUrl);
            servlet.setSource(_vehiclePositionsExporter);
        }

        _vehiclePositionsPath = getConfigurationValue(File.class, "vehiclePositions.path");
        if (_vehiclePositionsPath != null) {
            GtfsRealtimeFileWriter writer = _injector.getInstance(GtfsRealtimeFileWriter.class);
            writer.setPath(_vehiclePositionsPath);
            writer.setSource(_vehiclePositionsExporter);
        }

        _alertsUrl = getConfigurationValue(URL.class, "alerts.url");
        if (_alertsUrl != null) {
            GtfsRealtimeServlet servlet = _injector.getInstance(GtfsRealtimeServlet.class);
            servlet.setUrl(_alertsUrl);
            servlet.setSource(_alertsExporter);
        }

        _alertsPath = getConfigurationValue(File.class, "alerts.path");
        if (_alertsPath != null) {
            GtfsRealtimeFileWriter writer = _injector.getInstance(GtfsRealtimeFileWriter.class);
            writer.setPath(_alertsPath);
            writer.setSource(_alertsExporter);
        }

        _lifecycleService.start();
    }

    private <T> T getConfigurationValue(Class<T> type, String configurationKey) {
        try {
            return _injector.getInstance(Key.get(type, Names.named(configurationKey)));
        } catch (ConfigurationException e) {
            return null;
        }
    }

    private void printUsage() {
        CommandLineInterfaceLibrary.printUsage(getClass());
    }

    private void buildOptions(Options options) {
        Option configFile = new Option(ARG_CONFIG_FILE, true, "configuration file path");
        configFile.setRequired(true);
        options.addOption(configFile);
    }
}