21 package org.matsim.core.controler.corelisteners;
23 import com.google.inject.Inject;
24 import com.google.inject.Singleton;
25 import java.io.OutputStream;
26 import java.lang.reflect.Constructor;
28 import java.util.LinkedList;
29 import java.util.List;
32 import org.apache.logging.log4j.LogManager;
33 import org.apache.logging.log4j.Logger;
53 final class EventsHandlingImpl
implements EventsHandling, BeforeMobsimListener,
54 IterationEndsListener, ShutdownListener {
56 final static private Logger log = LogManager.getLogger(EventsHandlingImpl.class);
58 private final EventsManager eventsManager;
59 private List<EventWriter> eventWriters =
new LinkedList<>();
61 private int writeEventsInterval;
63 private Set<EventsFileFormat> eventsFileFormats ;
65 private OutputDirectoryHierarchy controlerIO ;
67 private int writeMoreUntilIteration;
71 final EventsManager eventsManager,
72 final ControllerConfigGroup config,
73 final OutputDirectoryHierarchy controlerIO) {
74 this.eventsManager = eventsManager;
75 this.writeEventsInterval = config.getWriteEventsInterval();
76 this.eventsFileFormats = config.getEventsFileFormats();
77 this.controlerIO = controlerIO;
78 this.writeMoreUntilIteration = config.getWriteEventsUntilIteration() ;
82 public void notifyBeforeMobsim(BeforeMobsimEvent event) {
83 eventsManager.resetHandlers(event.getIteration());
84 final boolean writingEventsAtAll = this.writeEventsInterval > 0;
85 final boolean regularWriteEvents = writingEventsAtAll && (
event.getIteration()>0 &&
event.getIteration() % writeEventsInterval == 0 ) ;
87 final boolean earlyIteration =
event.getIteration() <= writeMoreUntilIteration ;
88 final boolean lastIteration =
event.isLastIteration();
89 if (writingEventsAtAll && (regularWriteEvents||earlyIteration || lastIteration ) ) {
90 for (EventsFileFormat format : eventsFileFormats) {
93 this.eventWriters.add(
new EventWriterXML(controlerIO.getIterationFilename(event.getIteration(),
94 Controler.DefaultFiles.events)));
98 URL url = IOUtils.
getFileUrl(controlerIO.getIterationFilename(event.getIteration(), Controler.DefaultFiles.eventsPb));
100 Class<?> writerClass = ClassLoader.getSystemClassLoader().loadClass(
"org.matsim.contrib.protobuf.EventWriterPB");
101 Constructor<?> constructor = writerClass.getConstructor(OutputStream.class);
102 EventWriter writer = (EventWriter) constructor.newInstance(IOUtils.getOutputStream(url,
false));
103 this.eventWriters.add(writer);
104 }
catch (ReflectiveOperationException e) {
105 throw new RuntimeException(
"Error using the PBWriter. Please make sure protobuf contrib on the classpath, or remove pb output format.", e);
109 this.eventWriters.add(
new EventWriterJson(
new File(controlerIO.getIterationFilename(event.getIteration(),
110 Controler.DefaultFiles.eventsJson))));
113 log.warn(
"Unknown events file format specified: " + format.toString() +
".");
116 for (EventWriter writer : this.eventWriters) {
117 eventsManager.addHandler(writer);
123 public void notifyIterationEnds(IterationEndsEvent event) {
128 for (EventWriter writer : this.eventWriters) {
130 this.eventsManager.removeHandler(writer);
132 this.eventWriters.clear();
136 public void notifyShutdown(ShutdownEvent event) {
137 for (EventWriter writer : this.eventWriters) {
static URL getFileUrl(String filename)