MATSIM
AbstractModule.java
Go to the documentation of this file.
1 /*
2  * *********************************************************************** *
3  * * project: org.matsim.*
4  * * Module.java
5  * * *
6  * * *********************************************************************** *
7  * * *
8  * * copyright : (C) 2014 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.controler;
24 
25 import java.util.ArrayList;
26 import java.util.List;
27 
28 import com.google.inject.multibindings.MapBinder;
33 import org.matsim.core.config.Config;
49 
50 import com.google.inject.Binder;
51 import com.google.inject.Inject;
52 import com.google.inject.Key;
53 import com.google.inject.Module;
54 import com.google.inject.TypeLiteral;
55 import com.google.inject.binder.AnnotatedBindingBuilder;
56 import com.google.inject.binder.LinkedBindingBuilder;
57 import com.google.inject.multibindings.Multibinder;
58 import com.google.inject.name.Names;
59 import com.google.inject.util.Modules;
60 
76 public abstract class AbstractModule implements Module {
77 
78  private Binder binder;
79 
80  @Inject
81  com.google.inject.Injector bootstrapInjector;
82  private Config config;
83 
84  public AbstractModule() {
85  // config will be injected later
86  }
87 
88  public AbstractModule(Config config) {
89  this.config = config;
90  }
91 
92  @Override
93  public final void configure(Binder binder) {
94  if (this.config == null) {
95  this.config = bootstrapInjector.getInstance(Config.class);
96  }
97  // Guice error messages should give the code location of the error in the user's module,
98  // not in this class.
99  this.binder = binder.skipSources(AbstractModule.class);
100 
102 
103  this.install();
104  }
105 
106  private void initializeMultibinders() {
107  // We do need to make these calls here in order to register the multi binders. Otherwise, guice doesn't know that they exist. In particular,
108  // if none of the corresponding addXXXBinding methods was called, the set binder would not be registered, and guice would complain.
109  Multibinder.newSetBinder(this.binder, MobsimListener.class);
110  Multibinder.newSetBinder(this.binder, SnapshotWriter.class);
111  Multibinder.newSetBinder(this.binder, EventHandler.class);
112  Multibinder.newSetBinder(this.binder, ControlerListener.class);
113  MapBinder.newMapBinder(this.binder, new TypeLiteral<Class<?>>(){}, new TypeLiteral<AttributeConverter<?>>() {} );
114  Multibinder.newSetBinder(this.binder, AbstractQSimModule.class);
115  Multibinder.newSetBinder( this.binder, AbstractQSimModule.class, Names.named( "overridesFromAbstractModule" ) );
116  }
117 
118  public abstract void install();
119 
120  protected final Config getConfig() {
121  return config;
122  }
123 
124  protected final void install(Module module) {
125  bootstrapInjector.injectMembers(module);
126  binder.install(module);
127  }
128 
129  protected final LinkedBindingBuilder<EventHandler> addEventHandlerBinding() {
130  return Multibinder.newSetBinder(this.binder, EventHandler.class).addBinding();
131  }
132 
133  protected final void installQSimModule(AbstractQSimModule qsimModule) {
134  Multibinder.newSetBinder(this.binder, AbstractQSimModule.class).addBinding().toInstance(qsimModule);
135  }
136  protected final void installOverridingQSimModule(AbstractQSimModule qsimModule) {
137  Multibinder.newSetBinder( this.binder, AbstractQSimModule.class, Names.named( "overridesFromAbstractModule" ) ).addBinding().toInstance(qsimModule);
138  }
139 
143  protected final LinkedBindingBuilder<ControlerListener> addControlerListenerBinding() {
144  return Multibinder.newSetBinder(this.binder, ControlerListener.class).addBinding();
145  }
146 
150  protected final com.google.inject.binder.LinkedBindingBuilder<PlanSelector<Plan, Person>> bindPlanSelectorForRemoval() {
151  return bind(new TypeLiteral<PlanSelector<Plan, Person>>(){});
152  }
153 
154  protected final com.google.inject.binder.LinkedBindingBuilder<PlanStrategy> addPlanStrategyBinding(String selectorName) {
155  return binder().bind(PlanStrategy.class).annotatedWith(Names.named(selectorName));
156  }
157 
158  protected final com.google.inject.binder.LinkedBindingBuilder<Mobsim> bindMobsim() {
159  return bind(Mobsim.class);
160  }
161 
162  protected final com.google.inject.binder.LinkedBindingBuilder<ScoringFunctionFactory> bindScoringFunctionFactory() {
163  return bind(ScoringFunctionFactory.class);
164  }
165 
172  protected final com.google.inject.binder.LinkedBindingBuilder<MobsimListener> addMobsimListenerBinding() {
173  return Multibinder.newSetBinder(this.binder, MobsimListener.class).addBinding();
174  }
175 
176  protected final com.google.inject.binder.LinkedBindingBuilder<SnapshotWriter> addSnapshotWriterBinding() {
177  return Multibinder.newSetBinder(this.binder, SnapshotWriter.class).addBinding();
178  }
179 
180  protected final LinkedBindingBuilder<AttributeConverter<?>> addAttributeConverterBinding(final Class<?> clazz ) {
181  return MapBinder.newMapBinder(this.binder, new TypeLiteral<Class<?>>(){}, new TypeLiteral<AttributeConverter<?>>() {} ).addBinding( clazz );
182  }
186  @Deprecated
187  protected final com.google.inject.binder.LinkedBindingBuilder<TravelDisutilityFactory> bindCarTravelDisutilityFactory() {
189  }
190 
191  protected final Key<TravelDisutilityFactory> carTravelDisutilityFactoryKey() {
192  return Key.get(TravelDisutilityFactory.class, Names.named(TransportMode.car));
193  }
194 
195  protected final com.google.inject.binder.LinkedBindingBuilder<TravelDisutilityFactory> addTravelDisutilityFactoryBinding(String mode) {
196  return binder().bind(TravelDisutilityFactory.class).annotatedWith(Names.named(mode));
197  }
198 
199  protected final com.google.inject.binder.LinkedBindingBuilder<LeastCostPathCalculatorFactory> bindLeastCostPathCalculatorFactory() {
200  return bind(LeastCostPathCalculatorFactory.class);
201  }
202 
203  protected final com.google.inject.binder.LinkedBindingBuilder<TravelTime> addTravelTimeBinding(String mode) {
204  return binder().bind(TravelTime.class).annotatedWith(Names.named(mode));
205  }
206 
207  protected final LinkedBindingBuilder<RoutingModule> addRoutingModuleBinding(String mode) {
208  return binder().bind(RoutingModule.class).annotatedWith(Names.named(mode));
209  }
210 
211  protected final LinkedBindingBuilder<PersonPrepareForSimAlgorithm> addPersonPrepareForSimAlgorithm() {
212  return Multibinder.newSetBinder(binder(), PersonPrepareForSimAlgorithm.class).addBinding();
213  }
214 
215  protected final com.google.inject.binder.LinkedBindingBuilder<EventsManager> bindEventsManager() {
216  return binder().bind(EventsManager.class);
217  }
218 
222  @Deprecated
223  protected final LinkedBindingBuilder<TravelTime> bindNetworkTravelTime() {
224  return bind( carTravelTime() );
225  }
226 
227  @Deprecated // please inline
228  protected final Key<TravelTime> networkTravelTime() { return carTravelTime(); }
229 
230  protected final Key<TravelTime> carTravelTime() {
231  return Key.get(TravelTime.class, Names.named(TransportMode.car));
232  }
233 
234  protected <T> AnnotatedBindingBuilder<T> bind(Class<T> aClass) {
235  return binder.bind(aClass);
236  }
237 
238  protected <T> AnnotatedBindingBuilder<T> bind(TypeLiteral<T> typeLiteral) {
239  return binder.bind(typeLiteral);
240  }
241 
242  protected <T> LinkedBindingBuilder<T> bind(Key<T> key) {
243  return binder.bind(key);
244  }
245 
246  protected final Binder binder() {
247  return binder;
248  }
249 
250  protected final <T> jakarta.inject.Provider<T> getProvider(TypeLiteral<T> typeLiteral) {
251  return binder.getProvider(Key.get(typeLiteral));
252  }
253 
254  public static AbstractModule override(final Iterable<? extends AbstractModule> modules, final AbstractModule abstractModule) {
255  return new AbstractModule() {
256  @Override
257  public void install() {
258  final List<com.google.inject.Module> guiceModules = new ArrayList<>();
259  for (AbstractModule module : modules) {
260  bootstrapInjector.injectMembers(module);
261  guiceModules.add(module);
262  }
263  bootstrapInjector.injectMembers(abstractModule);
264  binder().install(Modules.override(guiceModules).with(abstractModule));
265  }
266  };
267  }
268 
269  public static AbstractModule emptyModule() {
270  return new AbstractModule() {
271  @Override
272  public void install() {}
273  };
274  }
275 }
final com.google.inject.binder.LinkedBindingBuilder< TravelDisutilityFactory > bindCarTravelDisutilityFactory()
final< T > jakarta.inject.Provider< T > getProvider(TypeLiteral< T > typeLiteral)
final LinkedBindingBuilder< PersonPrepareForSimAlgorithm > addPersonPrepareForSimAlgorithm()
final void installQSimModule(AbstractQSimModule qsimModule)
final com.google.inject.binder.LinkedBindingBuilder< LeastCostPathCalculatorFactory > bindLeastCostPathCalculatorFactory()
final com.google.inject.binder.LinkedBindingBuilder< MobsimListener > addMobsimListenerBinding()
final com.google.inject.binder.LinkedBindingBuilder< SnapshotWriter > addSnapshotWriterBinding()
final com.google.inject.binder.LinkedBindingBuilder< Mobsim > bindMobsim()
final com.google.inject.binder.LinkedBindingBuilder< PlanStrategy > addPlanStrategyBinding(String selectorName)
final LinkedBindingBuilder< TravelTime > bindNetworkTravelTime()
final LinkedBindingBuilder< AttributeConverter<?> > addAttributeConverterBinding(final Class<?> clazz)
final Key< TravelDisutilityFactory > carTravelDisutilityFactoryKey()
final LinkedBindingBuilder< RoutingModule > addRoutingModuleBinding(String mode)
final LinkedBindingBuilder< ControlerListener > addControlerListenerBinding()
final com.google.inject.binder.LinkedBindingBuilder< ScoringFunctionFactory > bindScoringFunctionFactory()
final LinkedBindingBuilder< EventHandler > addEventHandlerBinding()
final Key< TravelTime > networkTravelTime()
final com.google.inject.binder.LinkedBindingBuilder< PlanSelector< Plan, Person > > bindPlanSelectorForRemoval()
final com.google.inject.binder.LinkedBindingBuilder< TravelDisutilityFactory > addTravelDisutilityFactoryBinding(String mode)
final void installOverridingQSimModule(AbstractQSimModule qsimModule)
final com.google.inject.binder.LinkedBindingBuilder< EventsManager > bindEventsManager()
final com.google.inject.binder.LinkedBindingBuilder< TravelTime > addTravelTimeBinding(String mode)