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