MATSIM
QSimProvider.java
Go to the documentation of this file.
1 /*
2  * *********************************************************************** *
3  * * project: org.matsim.*
4  * * QSimProvider.java
5  * * *
6  * * *********************************************************************** *
7  * * *
8  * * copyright : (C) 2015 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 
23 package org.matsim.core.mobsim.qsim;
24 
25 import java.lang.annotation.Annotation;
26 import java.util.Collection;
27 import java.util.Collections;
28 import java.util.List;
29 import java.util.Set;
30 
31 import org.apache.logging.log4j.LogManager;
32 import org.apache.logging.log4j.Logger;
33 import org.matsim.core.config.Config;
45 
46 import com.google.inject.AbstractModule;
47 import com.google.inject.ConfigurationException;
48 import com.google.inject.Inject;
49 import com.google.inject.Injector;
50 import com.google.inject.Key;
51 import com.google.inject.Provider;
52 import com.google.inject.TypeLiteral;
53 import com.google.inject.name.Named;
54 
55 public class QSimProvider implements Provider<QSim> {
56  private static final Logger log = LogManager.getLogger(QSimProvider.class);
57 
58  private Injector injector;
59  private Config config;
61  private Collection<AbstractQSimModule> modules;
62  private List<AbstractQSimModule> overridingModules;
63  private Set<AbstractQSimModule> overridingModulesFromAbstractModule;
65 
66  @Inject
67  QSimProvider(Injector injector, Config config, IterationCounter iterationCounter,
68  Collection<AbstractQSimModule> modules, QSimComponentsConfig components,
69  @Named("overrides") List<AbstractQSimModule> overridingModules,
70  @Named("overridesFromAbstractModule") Set<AbstractQSimModule> overridingModulesFromAbstractModule ) {
71  this.injector = injector;
72  this.modules = modules;
73  // (these are the implementations)
74  this.config = config;
75  this.iterationCounter = iterationCounter;
76  this.components = components;
77  this.overridingModules = overridingModules;
78  this.overridingModulesFromAbstractModule = overridingModulesFromAbstractModule;
79  }
80 
81  @Override
82  public QSim get() {
83  performHistoricalCheck(injector);
84 
85  modules.forEach(m -> m.setConfig(config));
86  overridingModules.forEach(m -> m.setConfig(config));
87 
88  int iterationNumber = iterationCounter.getIterationNumber();
89  modules.forEach(m -> m.setIterationNumber(iterationNumber));
90  overridingModules.forEach(m -> m.setIterationNumber(iterationNumber));
91 
92  AbstractQSimModule qsimModule = AbstractQSimModule.overrideQSimModules(modules, Collections.emptyList());
93 
94  for (AbstractQSimModule override : overridingModulesFromAbstractModule) {
95  qsimModule = AbstractQSimModule.overrideQSimModules(Collections.singleton(qsimModule), Collections.singletonList(override));
96  }
97 
98  for (AbstractQSimModule override : overridingModules) {
99  qsimModule = AbstractQSimModule.overrideQSimModules(Collections.singleton(qsimModule), Collections.singletonList(override));
100  }
101 
102  final AbstractQSimModule finalQsimModule = qsimModule;
103 
104  AbstractModule module = new AbstractModule() {
105  @Override
106  protected void configure() {
107  install(finalQsimModule);
108  bind(QSim.class).asEagerSingleton();
109  bind(Netsim.class).to(QSim.class);
110  }
111  };
112 
113  Injector qsimInjector = injector.createChildInjector(module);
114 
115  QSim qSim = qsimInjector.getInstance(QSim.class);
116 
117  for (Object activeComponent : components.getActiveComponents()) {
118  Key<Collection<Provider<QSimComponent>>> activeComponentKey;
119  if (activeComponent instanceof Annotation) {
120  activeComponentKey = Key.get(new TypeLiteral<Collection<Provider<QSimComponent>>>(){}, (Annotation) activeComponent);
121  } else {
122  activeComponentKey = Key.get(new TypeLiteral<Collection<Provider<QSimComponent>>>(){}, (Class<? extends Annotation>) activeComponent);
123  }
124 
125  Collection<Provider<QSimComponent>> providers = qsimInjector.getInstance(activeComponentKey);
126  for (Provider<QSimComponent> provider : providers) {
127  QSimComponent qSimComponent = provider.get();
128  if (qSimComponent instanceof MobsimEngine) {
129  MobsimEngine instance = (MobsimEngine) qSimComponent;
130  qSim.addMobsimEngine(instance);
131  log.info("Added MobsimEngine " + instance.getClass());
132  }
133 
134  if (qSimComponent instanceof ActivityHandler) {
135  ActivityHandler instance = (ActivityHandler) qSimComponent;
136  qSim.addActivityHandler(instance);
137  log.info("Added Activityhandler " + instance.getClass());
138  }
139 
140  if (qSimComponent instanceof DepartureHandler) {
141  DepartureHandler instance = (DepartureHandler) qSimComponent;
142  qSim.addDepartureHandler(instance);
143  log.info("Added DepartureHandler " + instance.getClass());
144  }
145 
146  if (qSimComponent instanceof AgentSource) {
147  AgentSource instance = (AgentSource) qSimComponent;
148  qSim.addAgentSource(instance);
149  log.info("Added AgentSource " + instance.getClass());
150  }
151 
152  if (qSimComponent instanceof MobsimListener) {
153  MobsimListener instance = (MobsimListener) qSimComponent;
154  qSim.addQueueSimulationListeners(instance);
155  log.info("Added MobsimListener " + instance.getClass());
156  }
157 
158  }
159  }
160 
161  return qSim;
162  }
163 
169  private void performHistoricalCheck(Injector injector) {
170  boolean foundNetworkFactoryBinding = true;
171 
172  try {
173  injector.getBinding(QNetworkFactory.class);
174  } catch (ConfigurationException e) {
175  foundNetworkFactoryBinding = false;
176  }
177 
178  if (foundNetworkFactoryBinding) {
179  throw new IllegalStateException("QNetworkFactory should only be bound via AbstractQSimModule");
180  }
181 
182  boolean foundTransitStopHandlerFactoryBinding = true;
183 
184  try {
185  injector.getBinding(TransitStopHandlerFactory.class);
186  } catch (ConfigurationException e) {
187  foundTransitStopHandlerFactoryBinding = false;
188  }
189 
190  if (foundTransitStopHandlerFactoryBinding) {
191  throw new IllegalStateException("TransitStopHandlerFactory should be bound via AbstractQSimModule");
192  }
193  }
194 }
void addMobsimEngine(MobsimEngine mobsimEngine)
Definition: QSim.java:589
void addAgentSource(AgentSource agentSource)
Definition: QSim.java:684
void addQueueSimulationListeners(MobsimListener listener)
Definition: QSim.java:653
static AbstractQSimModule overrideQSimModules(Collection< AbstractQSimModule > base, List< AbstractQSimModule > overrides)
void performHistoricalCheck(Injector injector)
Collection< AbstractQSimModule > modules
void addDepartureHandler(DepartureHandler departureHandler)
Definition: QSim.java:633
void addActivityHandler(ActivityHandler activityHandler)
Definition: QSim.java:640
List< AbstractQSimModule > overridingModules
Set< AbstractQSimModule > overridingModulesFromAbstractModule