View Javadoc

1   package cz.cuni.amis.pogamut.ut2004.factory.guice.remoteagent;
2   
3   import com.google.inject.AbstractModule;
4   import com.google.inject.name.Names;
5   
6   import cz.cuni.amis.pogamut.base.agent.IAgent;
7   import cz.cuni.amis.pogamut.base.communication.messages.InfoMessage;
8   import cz.cuni.amis.pogamut.base.communication.translator.IWorldMessageTranslator;
9   import cz.cuni.amis.pogamut.base.communication.worldview.ILockableWorldView;
10  import cz.cuni.amis.pogamut.base.communication.worldview.IWorldView;
11  import cz.cuni.amis.pogamut.base.component.controller.ComponentDependencies;
12  import cz.cuni.amis.pogamut.base.component.controller.ComponentDependencyType;
13  import cz.cuni.amis.pogamut.base.factory.guice.GuiceAgentModule;
14  import cz.cuni.amis.pogamut.base.factory.guice.GuiceRemoteAgentModule;
15  import cz.cuni.amis.pogamut.base.utils.guice.AdaptableProvider;
16  import cz.cuni.amis.pogamut.base3d.ILockableVisionWorldView;
17  import cz.cuni.amis.pogamut.base3d.worldview.IVisionWorldView;
18  import cz.cuni.amis.pogamut.ut2004.agent.params.UT2004AgentParameters;
19  import cz.cuni.amis.pogamut.ut2004.communication.translator.observer.ObserverFSM;
20  import cz.cuni.amis.pogamut.ut2004.communication.worldview.UT2004LockableWorldView;
21  import cz.cuni.amis.pogamut.ut2004.communication.worldview.UT2004WorldView;
22  import cz.cuni.amis.pogamut.ut2004.observer.IUT2004Observer;
23  import cz.cuni.amis.pogamut.ut2004.observer.impl.UT2004Observer;
24  
25  /**
26   * Module extending {@link UT2004CommunicationModule} for the purpose of {@link UT2004Observer} instantiation.
27   * <p><p>
28   * Introduces {@link UT2004ObserverModule#worldViewDependenciesProvider}.
29   * <p><p>
30   * Newly binded classes:
31   * <table>
32   * <tr><th>Mapped class</th>                    <th>  </th> <th>Target</th>                          <th>Description</th></tr>
33   * 
34   * <tr><td>{@link IWorldMessageTranslator}</td>	<td>-></td>	<td>{@link ObserverFSM}</td>			 <td>Protocol-validating translator of {@link InfoMessage}s of GameBots2004.</td></tr>
35   * <tr><td>{@link IWorldView}</td>				<td>-></td> <td>{@link IVisionWorldView}</td>        <td>Binds world view as vision world view.</td></tr>
36   * <tr><td>{@link IVisionWorldView}</td>		<td>-></td> <td>{@link ILockableVisionWorldView}</td><td>Binds vision world view as lockable one.</td></tr>
37   * <tr><td>{@link ILockableWorldView}</td>		<td>-></td> <td>{@link ILockableVisionWorldView}</td><td>Binds lockable world view as vision world view.</td></tr>
38   * <tr><td>{@link ILockableVisionWorldView}</td><td>-></td> <td>{@link UT2004LockableWorldView}</td> <td>Binds world view with concrete implementation.</td></tr>
39   * <tr><td>{@link UT2004LockableWorldView} dependencies</td>
40   *                                              <td>-></td> <td>{@link UT2004ObserverModule#worldViewDependenciesProvider}</td></tr>
41   * <tr><td>{@link IAgent}</td>                  <td>-></td> <td>{@link IUT2004Observer}</td>         <td></td></tr>
42   * <tr><td>{@link IUT2004Observer}</td>         <td>-></td> <td>{@link UT2004Observer}</td>          <td>Binds concrete implementation of the observer.</td></tr>
43   * 
44   * </table>
45   * To have <b>successful module</b> the descendant <b>must specify</b> these <b>missing bindings</b>:
46   * <table>
47   * <tr><th>Mapped class</th>                    <th>Description</th></tr>
48   * <tr><td>nothing</td></tr>
49   * </table>
50   * ... but all newly introduced dependencies (by various implementors of mentioned interfaces).<p>
51   * ... <b>don't forget to call super.configureModules()</b> in the subclasses ;-)
52   * 
53   * @see UT2004CommunicationModule
54   * @see GuiceRemoteAgentModule
55   * @see GuiceAgentModule
56   * @author Jimmy
57   */
58  public class UT2004ObserverModule<PARAMS extends UT2004AgentParameters> extends UT2004CommunicationModule<PARAMS> {
59  
60  	/**
61  	 * Dependency provider for the world view, so the world view know when to start.
62  	 */
63  	protected AdaptableProvider<ComponentDependencies> worldViewDependenciesProvider = new AdaptableProvider<ComponentDependencies>(null);
64  	
65  	@Override
66  	public void prepareNewAgent(PARAMS agentParameters) {
67  		super.prepareNewAgent(agentParameters);
68  		worldViewDependenciesProvider.set(new ComponentDependencies(ComponentDependencyType.STARTS_WITH).add(agentParameters.getAgentId()));
69  	}
70  	
71  	@Override
72  	protected void configureModules() {
73  		super.configureModules();
74  		addModule(new AbstractModule() {
75  
76  			@Override
77  			public void configure() {
78  				bind(IWorldMessageTranslator.class).to(ObserverFSM.class);
79  				bind(IWorldView.class).to(IVisionWorldView.class);
80  				bind(IVisionWorldView.class).to(UT2004WorldView.class);
81  				bind(ComponentDependencies.class).annotatedWith(Names.named(UT2004WorldView.WORLDVIEW_DEPENDENCY)).toProvider(worldViewDependenciesProvider);
82  				bind(IAgent.class).to(IUT2004Observer.class);
83  				bind(IUT2004Observer.class).to(UT2004Observer.class);				
84  			}
85  			
86  		});
87  	}
88  
89  }