001/*
002 *  *********************************************************************** *
003 *  * project: org.matsim.*
004 *  * FromEvents.java
005 *  *                                                                         *
006 *  * *********************************************************************** *
007 *  *                                                                         *
008 *  * copyright       : (C) 2014 by the members listed in the COPYING, *
009 *  *                   LICENSE and WARRANTY file.                            *
010 *  * email           : info at matsim dot org                                *
011 *  *                                                                         *
012 *  * *********************************************************************** *
013 *  *                                                                         *
014 *  *   This program is free software; you can redistribute it and/or modify  *
015 *  *   it under the terms of the GNU General Public License as published by  *
016 *  *   the Free Software Foundation; either version 2 of the License, or     *
017 *  *   (at your option) any later version.                                   *
018 *  *   See also COPYING, LICENSE and WARRANTY file                           *
019 *  *                                                                         *
020 *  * ***********************************************************************
021 */
022
023package org.matsim.core.controler;
024
025import org.matsim.core.api.experimental.events.EventsManager;
026import org.matsim.core.config.Config;
027import org.matsim.core.controler.events.*;
028import org.matsim.core.controler.listener.*;
029import org.matsim.core.events.MatsimEventsReader;
030
031import javax.inject.Inject;
032import java.util.Set;
033
034/**
035 *
036 * An attempt at making analysis modules reusable by emulating parts of the ControlerListener
037 * protocol while reading an events file.
038 *
039 * @author michaz
040 */
041public final class ReplayEvents {
042
043    public interface Results {
044        <T> T get(Class<? extends T> type);
045    }
046
047    @Inject
048    Set<ControlerListener> controlerListenersDeclaredByModules;
049
050    @Inject
051    ControlerListenerManager controlerListenerManager;
052
053    @Inject
054    EventsManager eventsManager;
055
056    public static Results run(final Config config, final String eventsFilename, final AbstractModule... modules) {
057        final com.google.inject.Injector injector = Injector.createInjector(
058                config,
059                new Module(),
060                new AbstractModule() {
061                    @Override
062                    public void install() {
063                        for (AbstractModule module : modules) {
064                            install(module);
065                        }
066                    }
067                });
068        ReplayEvents instance = injector.getInstance(ReplayEvents.class);
069        instance.playEventsFile(eventsFilename, 1);
070
071        return new Results() {
072            @Override
073            public <T> T get(Class<? extends T> type) {
074                return injector.getInstance(type);
075            }
076        };
077    }
078
079    public void playEventsFile(String eventsFilename, int iterationNumber) {
080        ((ControlerListenerManagerImpl) controlerListenerManager).fireControlerStartupEvent();
081        for (ControlerListener controlerListener : controlerListenersDeclaredByModules) {
082            if (controlerListener instanceof StartupListener) {
083                ((StartupListener) controlerListener).notifyStartup(new StartupEvent(null));
084            }
085        }
086        ((ControlerListenerManagerImpl) controlerListenerManager).fireControlerIterationStartsEvent(iterationNumber);
087        for (ControlerListener controlerListener : controlerListenersDeclaredByModules) {
088            if (controlerListener instanceof IterationStartsListener) {
089                ((IterationStartsListener) controlerListener).notifyIterationStarts(new IterationStartsEvent(null, iterationNumber));
090            }
091        }
092        ((ControlerListenerManagerImpl) controlerListenerManager).fireControlerBeforeMobsimEvent(iterationNumber);
093        for (ControlerListener controlerListener : controlerListenersDeclaredByModules) {
094            if (controlerListener instanceof BeforeMobsimListener) {
095                ((BeforeMobsimListener) controlerListener).notifyBeforeMobsim(new BeforeMobsimEvent(null, iterationNumber));
096            }
097        }
098        new MatsimEventsReader(eventsManager).readFile(eventsFilename);
099        ((ControlerListenerManagerImpl) controlerListenerManager).fireControlerAfterMobsimEvent(iterationNumber);
100        for (ControlerListener controlerListener : controlerListenersDeclaredByModules) {
101            if (controlerListener instanceof AfterMobsimListener) {
102                ((AfterMobsimListener) controlerListener).notifyAfterMobsim(new AfterMobsimEvent(null, iterationNumber));
103            }
104        }
105        ((ControlerListenerManagerImpl) controlerListenerManager).fireControlerIterationEndsEvent(iterationNumber);
106        for (ControlerListener controlerListener : controlerListenersDeclaredByModules) {
107            if (controlerListener instanceof IterationEndsListener) {
108                ((IterationEndsListener) controlerListener).notifyIterationEnds(new IterationEndsEvent(null, iterationNumber));
109            }
110        }
111        ((ControlerListenerManagerImpl) controlerListenerManager).fireControlerShutdownEvent(false);
112        for (ControlerListener controlerListener : controlerListenersDeclaredByModules) {
113            if (controlerListener instanceof ShutdownListener) {
114                ((ShutdownListener) controlerListener).notifyShutdown(new ShutdownEvent(null, false));
115            }
116        }
117    }
118
119    public static class Module extends AbstractModule {
120        @Override
121                public void install() {
122                        bind(ReplayEvents.class).asEagerSingleton();
123            bind(ControlerListenerManager.class).to(ControlerListenerManagerImpl.class).asEagerSingleton();
124                }
125    }
126}