MATSIM
QSimBuilder.java
Go to the documentation of this file.
1 
2 /* *********************************************************************** *
3  * project: org.matsim.*
4  * QSimBuilder.java
5  * *
6  * *********************************************************************** *
7  * *
8  * copyright : (C) 2019 by the members listed in the COPYING, *
9  * LICENSE and WARRANTY file. *
10  * email : info at matsim dot org *
11  * *
12  * *********************************************************************** *
13  * *
14  * This program is free software; you can redistribute it and/or modify *
15  * it under the terms of the GNU General Public License as published by *
16  * the Free Software Foundation; either version 2 of the License, or *
17  * (at your option) any later version. *
18  * See also COPYING, LICENSE and WARRANTY file *
19  * *
20  * *********************************************************************** */
21 
22 package org.matsim.core.mobsim.qsim;
23 
24 import java.util.Collection;
25 import java.util.Collections;
26 import java.util.LinkedList;
27 import java.util.List;
28 import java.util.function.Consumer;
29 
30 import org.matsim.api.core.v01.Scenario;
32 import org.matsim.core.config.Config;
42 
43 import com.google.inject.Injector;
44 import com.google.inject.Key;
45 import com.google.inject.TypeLiteral;
46 import com.google.inject.name.Names;
47 
92 public class QSimBuilder implements AllowsConfiguration {
93  private final Config config;
94 
95  private final Collection<AbstractQSimModule> qsimModules = new LinkedList<>();
97 
98  private final List<AbstractModule> overridingControllerModules = new LinkedList<>();
99  private final List<AbstractQSimModule> overridingQSimModules = new LinkedList<>();
100 
101  public QSimBuilder(Config config) {
102  this.config = config;
103  }
104 
113  return this;
114  }
115 
120  @Override
122  overridingControllerModules.add(module);
123  return this;
124  }
125 
130  this.qsimModules.add(module);
131  return this;
132  }
133 
137  @Override
139  this.overridingQSimModules.add(module);
140  return this;
141  }
142 
147  // yy As an outside user, I find both the naming of this method and its javadoc
148  // confusing. I would say that it is, in fact, _not_ resetting to the
149  // standard ones. Instead, it is resetting to those coming from the config,
150  // whatever they are. kai, nov'19
151 
152  components.clear();
153  new StandardQSimComponentConfigurator(config).configure(components);
154  return this;
155  }
156 
161  configurator.configure(components);
162  return this;
163  }
164 
169  qsimModules.clear();
170  qsimModules.addAll(QSimModule.getDefaultQSimModules());
171  return this;
172  }
173 
177  public QSimBuilder configureModules(Consumer<Collection<AbstractQSimModule>> configurator) {
178  configurator.accept(qsimModules);
179  return this;
180  }
181 
186  public QSimBuilder removeModule(Class<? extends AbstractQSimModule> moduleType) {
187  qsimModules.removeIf(moduleType::isInstance);
188  return this;
189  }
190 
195  public QSim build(Scenario scenario, EventsManager eventsManager) {
196  return build(scenario, eventsManager, 0);
197  }
198 
199  public QSim build(Scenario scenario, EventsManager eventsManager, int iterationNumber) {
200  // First, load standard QSim module
201  AbstractModule controllerModule = new StandaloneQSimModule(scenario, eventsManager, () -> iterationNumber);
202 
203  // Add all overrides
204  for (AbstractModule override : overridingControllerModules) {
205  controllerModule = AbstractModule.override(Collections.singleton(controllerModule), override);
206  }
207 
208  // Override components and modules
209  controllerModule = AbstractModule.override(Collections.singleton(controllerModule), new AbstractModule() {
210  @Override
211  public void install() {
212  bind(QSimComponentsConfig.class).toInstance(components);
213  qsimModules.forEach(this::installQSimModule);
214  bind(Key.get(new TypeLiteral<List<AbstractQSimModule>>() {
215  }, Names.named("overrides"))).toInstance(overridingQSimModules);
216  }
217  });
218 
219  // Build QSim
220  Injector injector = org.matsim.core.controler.Injector.createInjector(config, controllerModule);
221  return (QSim) injector.getInstance(Mobsim.class);
222  }
223 
224  private static class StandaloneQSimModule extends AbstractModule {
225  private final Scenario scenario;
228 
229  public StandaloneQSimModule(Scenario scenario, EventsManager eventsManager, IterationCounter iterationCounter) {
230  this.scenario = scenario;
231  this.eventsManager = eventsManager;
232  this.iterationCounter = iterationCounter;
233  }
234 
235  @Override
236  public void install() {
237  install(new ScenarioByInstanceModule(scenario));
238  bind(EventsManager.class).toInstance(eventsManager);
239  bind(IterationCounter.class).toInstance(iterationCounter);
240  install(new QSimModule(false));
242  }
243  }
244 }
QSimBuilder addOverridingQSimModule(AbstractQSimModule module)
final QSimComponentsConfig components
QSimBuilder configureQSimComponents(QSimComponentsConfigurator configurator)
final List< AbstractModule > overridingControllerModules
QSimBuilder addQSimModule(AbstractQSimModule module)
QSimBuilder removeModule(Class<? extends AbstractQSimModule > moduleType)
final Collection< AbstractQSimModule > qsimModules
final List< AbstractQSimModule > overridingQSimModules
StandaloneQSimModule(Scenario scenario, EventsManager eventsManager, IterationCounter iterationCounter)
static com.google.inject.Injector createInjector(final Config config, Module... modules)
Definition: Injector.java:58
QSim build(Scenario scenario, EventsManager eventsManager, int iterationNumber)
static Collection< AbstractQSimModule > getDefaultQSimModules()
QSimBuilder addOverridingModule(AbstractModule module)
QSimBuilder configureModules(Consumer< Collection< AbstractQSimModule >> configurator)
static AbstractModule override(final Iterable<? extends AbstractModule > modules, final AbstractModule abstractModule)
QSim build(Scenario scenario, EventsManager eventsManager)