MATSIM
EventsHandlingImpl.java
Go to the documentation of this file.
1 /* *********************************************************************** *
2  * project: org.matsim.*
3  * EventsHandling.java
4  * *
5  * *********************************************************************** *
6  * *
7  * copyright : (C) 2010 by the members listed in the COPYING, *
8  * LICENSE and WARRANTY file. *
9  * email : info at matsim dot org *
10  * *
11  * *********************************************************************** *
12  * *
13  * This program is free software; you can redistribute it and/or modify *
14  * it under the terms of the GNU General Public License as published by *
15  * the Free Software Foundation; either version 2 of the License, or *
16  * (at your option) any later version. *
17  * See also COPYING, LICENSE and WARRANTY file *
18  * *
19  * *********************************************************************** */
20 
21 package org.matsim.core.controler.corelisteners;
22 
23 import com.google.inject.Inject;
24 import com.google.inject.Singleton;
25 import java.io.OutputStream;
26 import java.lang.reflect.Constructor;
27 import java.net.URL;
28 import java.util.LinkedList;
29 import java.util.List;
30 import java.util.Set;
31 
32 import org.apache.logging.log4j.LogManager;
33 import org.apache.logging.log4j.Logger;
48 
49 import java.io.File;
50 import org.matsim.core.utils.io.IOUtils;
51 
52 @Singleton
53 final class EventsHandlingImpl implements EventsHandling, BeforeMobsimListener,
54  IterationEndsListener, ShutdownListener {
55 
56  final static private Logger log = LogManager.getLogger(EventsHandlingImpl.class);
57 
58  private final EventsManager eventsManager;
59  private List<EventWriter> eventWriters = new LinkedList<>();
60 
61  private int writeEventsInterval;
62 
63  private Set<EventsFileFormat> eventsFileFormats ;
64 
65  private OutputDirectoryHierarchy controlerIO ;
66 
67  private int writeMoreUntilIteration;
68 
69  @Inject
70  EventsHandlingImpl(
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() ;
79  }
80 
81  @Override
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 ) ;
86  // (w/o the "writingEventsAtAll && ..." this is a division by zero when writeEventsInterval=0. kai, apr'18)
87  final boolean earlyIteration = event.getIteration() <= writeMoreUntilIteration ;
88  final boolean lastIteration = event.isLastIteration();
89  if (writingEventsAtAll && (regularWriteEvents||earlyIteration || lastIteration ) ) {
90  for (EventsFileFormat format : eventsFileFormats) {
91  switch (format) {
92  case xml:
93  this.eventWriters.add(new EventWriterXML(controlerIO.getIterationFilename(event.getIteration(),
94  Controler.DefaultFiles.events)));
95  break;
96  case pb:
97  // The pb dependency is optional at the moment so we search it first
98  URL url = IOUtils.getFileUrl(controlerIO.getIterationFilename(event.getIteration(), Controler.DefaultFiles.eventsPb));
99  try {
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);
106  }
107  break;
108  case json:
109  this.eventWriters.add(new EventWriterJson(new File(controlerIO.getIterationFilename(event.getIteration(),
110  Controler.DefaultFiles.eventsJson))));
111  break;
112  default:
113  log.warn("Unknown events file format specified: " + format.toString() + ".");
114  }
115  }
116  for (EventWriter writer : this.eventWriters) {
117  eventsManager.addHandler(writer);
118  }
119  }
120  }
121 
122  @Override
123  public void notifyIterationEnds(IterationEndsEvent event) {
124  /*
125  * Events that are produced after the Mobsim has ended, e.g. by the RoadProcing
126  * module, should also be written to the events file.
127  */
128  for (EventWriter writer : this.eventWriters) {
129  writer.closeFile();
130  this.eventsManager.removeHandler(writer);
131  }
132  this.eventWriters.clear();
133  }
134 
135  @Override
136  public void notifyShutdown(ShutdownEvent event) {
137  for (EventWriter writer : this.eventWriters) {
138  writer.closeFile();
139  }
140  }
141 
142 }
static URL getFileUrl(String filename)
Definition: IOUtils.java:501