View Javadoc

1   package cz.cuni.amis.pogamut.defcon.factory;
2   
3   import javabot.PogamutJBotSupport;
4   
5   import com.google.inject.AbstractModule;
6   import com.google.inject.Injector;
7   import com.google.inject.name.Names;
8   
9   import cz.cuni.amis.pogamut.base.agent.IAgent;
10  import cz.cuni.amis.pogamut.base.agent.IAgentId;
11  import cz.cuni.amis.pogamut.base.agent.IEmbodiedAgent;
12  import cz.cuni.amis.pogamut.base.agent.IObservingAgent;
13  import cz.cuni.amis.pogamut.base.agent.params.impl.AgentParameters;
14  import cz.cuni.amis.pogamut.base.communication.translator.event.IWorldChangeEventOutput;
15  import cz.cuni.amis.pogamut.base.communication.worldview.IWorldView;
16  import cz.cuni.amis.pogamut.base.component.controller.ComponentDependencies;
17  import cz.cuni.amis.pogamut.base.component.controller.ComponentDependencyType;
18  import cz.cuni.amis.pogamut.base.factory.guice.GuiceAgentModule;
19  import cz.cuni.amis.pogamut.base.utils.guice.AdaptableProvider;
20  import cz.cuni.amis.pogamut.defcon.agent.DefConAgent;
21  import cz.cuni.amis.pogamut.defcon.agent.IDefConAgent;
22  import cz.cuni.amis.pogamut.defcon.agent.IDefConAgentController;
23  import cz.cuni.amis.pogamut.defcon.agent.IDefConAgentLogicController;
24  import cz.cuni.amis.pogamut.defcon.communication.translator.DefConMessageProducer;
25  import cz.cuni.amis.pogamut.defcon.communication.worldview.DefConWorldView;
26  
27  /**
28   * Module for guice instantion.
29   * 
30   * @author Radek 'Black_Hand' Pibil
31   * 
32   */
33  public class DefConAgentModule extends GuiceAgentModule<AgentParameters> {	
34  	
35  	private Class<? extends DefConAgent> defConAgentClass;
36  	private Class<? extends IDefConAgentLogicController> defConAgentLogicControllerClass;
37  	
38  	private AdaptableProvider<ComponentDependencies> defConDependenciesProvider =
39  		new AdaptableProvider<ComponentDependencies>(null);	
40  
41  	public DefConAgentModule(Class<? extends DefConAgent> defConAgentClass,
42  			Class<? extends IDefConAgentLogicController> defConAgentLogicControllerClass) {
43  		this.defConAgentClass = defConAgentClass;
44  		this.defConAgentLogicControllerClass = defConAgentLogicControllerClass;
45  	}
46  	
47  	public Class<? extends DefConAgent> getDefConAgentClass() {
48  		return defConAgentClass;
49  	}
50  	
51  	/**
52  	 * Binds runtime dependencies to the module/{@link Injector}.
53  	 * <p><p>
54  	 * Must be called before the new agent is instantiated with {@link Injector}.
55  	 * @param agentId
56  	 */
57  	public void newBindings(IAgentId agentId) {
58  		getAgentScope().clearScope();
59  		defConDependenciesProvider.
60  			set(new ComponentDependencies(ComponentDependencyType.STARTS_WITH).add(agentId));
61  	}	
62  	
63  	@Override
64  	protected void configureModules() {
65  		super.configureModules();
66  		PogamutJBotSupport.writeToConsole("DefConAgentModule configure modules()");
67  		addModule(new AbstractModule() {
68  
69  			@Override
70  			protected void configure() {				
71  				bind(IAgent.class).to(IObservingAgent.class);
72  				bind(IObservingAgent.class).to(IEmbodiedAgent.class);
73  				bind(IEmbodiedAgent.class).to(IDefConAgent.class);
74  				bind(IDefConAgent.class).to(DefConAgent.class);
75  				if (DefConAgent.class != defConAgentClass)
76  					bind(DefConAgent.class).to(defConAgentClass);
77  				bind(IWorldView.class).to(DefConWorldView.class);		
78  				bind(IWorldChangeEventOutput.class).to(DefConMessageProducer.class);
79  				bind(IDefConAgentController.class).to(IDefConAgentLogicController.class);
80  				bind(IDefConAgentLogicController.class).to(defConAgentLogicControllerClass);
81  				bind(ComponentDependencies.class).
82  					annotatedWith(Names.named(DefConWorldView.WORLDVIEW_DEPENDENCY)).
83  					toProvider(defConDependenciesProvider);
84  			}
85  			
86  		});			
87  	}
88  
89  }