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}