View Javadoc

1   /**
2    * UT2004Environment, an implementation of the environment interface standard that 
3    * facilitates the connection between GOAL and UT2004. 
4    * 
5    * Copyright (C) 2012 UT2004Environment authors.
6    * 
7    * This program is free software: you can redistribute it and/or modify it under
8    * the terms of the GNU General Public License as published by the Free Software
9    * Foundation, either version 3 of the License, or (at your option) any later
10   * version.
11   * 
12   * This program is distributed in the hope that it will be useful, but WITHOUT
13   * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
14   * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
15   * details.
16   * 
17   * You should have received a copy of the GNU General Public License along with
18   * this program. If not, see <http://www.gnu.org/licenses/>.
19   */
20  
21  package nl.tudelft.goal.ut2004.environment;
22  
23  import java.net.URI;
24  import java.rmi.RemoteException;
25  import java.util.HashMap;
26  import java.util.Map;
27  
28  import nl.tudelft.goal.unreal.environment.AbstractUnrealEnvironment;
29  import nl.tudelft.goal.unreal.messages.BotParameters;
30  import nl.tudelft.goal.unreal.messages.Configuration;
31  import nl.tudelft.goal.ut2004.server.EnvironmentControllerServer;
32  import nl.tudelft.goal.ut2004.server.EnvironmentControllerServerModule;
33  import nl.tudelft.goal.unreal.translators.LocationTranslator;
34  import nl.tudelft.goal.unreal.translators.NoneTranslator;
35  import nl.tudelft.goal.unreal.translators.PerceptTranslator;
36  import nl.tudelft.goal.unreal.translators.RotationTranslator;
37  import nl.tudelft.goal.unreal.translators.TeamTranslator;
38  import nl.tudelft.goal.unreal.translators.UnrealIdOrLocationTranslator;
39  import nl.tudelft.goal.unreal.translators.UnrealIdTranslator;
40  import nl.tudelft.goal.unreal.translators.VelocityTranslator;
41  import nl.tudelft.goal.ut2004.agent.UT2004BotBehavior;
42  import nl.tudelft.goal.ut2004.translators.CategoryTranslator;
43  import nl.tudelft.goal.ut2004.translators.ComboTranslator;
44  import nl.tudelft.goal.ut2004.translators.FireModeTranslator;
45  import nl.tudelft.goal.ut2004.translators.FlagStateTranslator;
46  import nl.tudelft.goal.ut2004.translators.GameTypeTranslator;
47  import nl.tudelft.goal.ut2004.translators.GroupTranslator;
48  import nl.tudelft.goal.ut2004.translators.UT2004GroupTranslator;
49  import nl.tudelft.goal.ut2004.translators.ItemTypeTranslator;
50  import nl.tudelft.goal.ut2004.translators.NavigationStateTranslator;
51  import nl.tudelft.goal.ut2004.translators.SelectorListTranslator;
52  import nl.tudelft.goal.ut2004.translators.SelectorTranslator;
53  import nl.tudelft.goal.ut2004.translators.UT2004ItemTypeTranslator;
54  import nl.tudelft.goal.ut2004.translators.WeaponPrefListTranslator;
55  import nl.tudelft.goal.ut2004.translators.WeaponPrefTranslator;
56  import nl.tudelft.goal.ut2004.visualizer.connection.AddBotCommand;
57  import nl.tudelft.goal.ut2004.visualizer.connection.EnvironmentServiceListener;
58  import nl.tudelft.goal.ut2004.visualizer.connection.EnvironmentServiceMediator;
59  import nl.tudelft.goal.ut2004.visualizer.connection.client.RemoteVisualizer;
60  import nl.tudelft.goal.ut2004.visualizer.connection.client.VisualizerServiceDefinition;
61  import nl.tudelft.pogamut.base.server.ReconnectingServerDefinition;
62  import cz.cuni.amis.pogamut.base.communication.command.IAct;
63  import cz.cuni.amis.pogamut.base3d.worldview.IVisionWorldView;
64  import cz.cuni.amis.pogamut.ut2004.agent.params.UT2004AgentParameters;
65  import cz.cuni.amis.pogamut.ut2004.bot.impl.UT2004Bot;
66  import cz.cuni.amis.pogamut.ut2004.bot.impl.UT2004BotController;
67  import cz.cuni.amis.pogamut.ut2004.bot.params.UT2004BotParameters;
68  import cz.cuni.amis.pogamut.ut2004.factory.guice.remoteagent.UT2004ServerFactory;
69  import cz.cuni.amis.pogamut.ut2004.factory.guice.remoteagent.UT2004ServerModule;
70  import cz.cuni.amis.pogamut.ut2004.server.IUT2004Server;
71  import cz.cuni.amis.pogamut.ut2004.utils.UT2004BotRunner;
72  import cz.cuni.amis.pogamut.ut2004.utils.UT2004ServerRunner;
73  import cz.cuni.amis.pogamut.ut2004.utils.UTBotRunner;
74  import cz.cuni.amis.utils.flag.FlagListener;
75  import eis.eis2java.handlers.ActionHandler;
76  import eis.eis2java.handlers.AllPerceptPerceptHandler;
77  import eis.eis2java.handlers.DefaultActionHandler;
78  import eis.eis2java.handlers.PerceptHandler;
79  import eis.eis2java.translation.Translator;
80  import eis.eis2java.util.AllPerceptsProvider;
81  import eis.exceptions.EntityException;
82  import eis.exceptions.ManagementException;
83  import eis.iilang.Identifier;
84  import eis.iilang.Parameter;
85  import eis.iilang.ParameterList;
86  import nl.tudelft.goal.ut2004.translators.ScopeTranslator;
87  
88  public class UT2004Environment extends AbstractUnrealEnvironment {
89  
90  	/**
91  	 * Generated serialVersionUID.
92  	 */
93  	private static final long serialVersionUID = 8240549393243585632L;
94  
95  	// Connection to the visualizer. Can be used to add bots to the environment.
96  	private ReconnectingServerDefinition<RemoteVisualizer> visualizerConnection;
97  
98  	@Override
99  	protected void registerTranslators() {
100 		
101 		Translator translator = Translator.getInstance();
102 		/*
103 		 * To translate from Parameter2Java we are given an UnrealId. However we
104 		 * can not access the agents memory during translation. To work around
105 		 * this we store everything we have send to any agent. Hence the same
106 		 * object has to be used for both directions.
107 		 */
108 		
109 		/*
110 		 * Translators provided by the BaseUnrealEnvironment.
111 		 * 
112 		 * Please list these in lexical order.
113 		 */
114 
115 		LocationTranslator locationTranslator = new LocationTranslator();
116 		translator.registerJava2ParameterTranslator(locationTranslator);
117 		translator.registerParameter2JavaTranslator(locationTranslator);
118 		
119 		NoneTranslator noneTranslator = new NoneTranslator();
120 		translator.registerJava2ParameterTranslator(noneTranslator);
121 
122 		PerceptTranslator perceptTranslator = new PerceptTranslator();
123 		translator.registerJava2ParameterTranslator(perceptTranslator);
124 
125 		RotationTranslator rotationTranslator = new RotationTranslator();
126 		translator.registerJava2ParameterTranslator(rotationTranslator);
127 		translator.registerParameter2JavaTranslator(rotationTranslator);
128 
129 		TeamTranslator teamTranslator = new TeamTranslator();
130 		translator.registerJava2ParameterTranslator(teamTranslator);
131 		translator.registerParameter2JavaTranslator(teamTranslator);
132 
133 		UnrealIdTranslator unrealIdTranslator = new UnrealIdTranslator();
134 		translator.registerJava2ParameterTranslator(unrealIdTranslator);
135 		translator.registerParameter2JavaTranslator(unrealIdTranslator);
136 		
137 		UnrealIdOrLocationTranslator unrealIdOrLocationTranslator = new UnrealIdOrLocationTranslator();
138 		translator.registerParameter2JavaTranslator(unrealIdOrLocationTranslator);
139 		translator.registerJava2ParameterTranslator(unrealIdOrLocationTranslator);
140 
141 		VelocityTranslator velocityTranslator = new VelocityTranslator();
142 		translator.registerJava2ParameterTranslator(velocityTranslator);
143 		translator.registerParameter2JavaTranslator(velocityTranslator);
144 		/*
145 		 * Translators provided by the UT2004 environment.
146 		 * 
147 		 * Please list these in lexical order.
148 		 */
149 
150 		CategoryTranslator categoryTranslator = new CategoryTranslator();
151 		translator.registerJava2ParameterTranslator(categoryTranslator);
152 		translator.registerParameter2JavaTranslator(categoryTranslator);
153 
154 		ComboTranslator comboTranslator = new ComboTranslator();
155 		translator.registerParameter2JavaTranslator(comboTranslator);
156 
157 		FireModeTranslator fireModeTranslator = new FireModeTranslator();
158 		translator.registerJava2ParameterTranslator(fireModeTranslator);
159 		translator.registerParameter2JavaTranslator(fireModeTranslator);
160 
161 		FlagStateTranslator flagStateTranslator = new FlagStateTranslator();
162 		translator.registerJava2ParameterTranslator(flagStateTranslator);
163 
164 		GameTypeTranslator gameTypeTranslator = new GameTypeTranslator();
165 		translator.registerJava2ParameterTranslator(gameTypeTranslator);
166 		
167 		GroupTranslator groupTranslator = new GroupTranslator();
168 		translator.registerJava2ParameterTranslator(groupTranslator);
169 		translator.registerParameter2JavaTranslator(groupTranslator);
170 
171 		ItemTypeTranslator itemTypeTranslator = new ItemTypeTranslator();
172 		translator.registerJava2ParameterTranslator(itemTypeTranslator);
173 		translator.registerParameter2JavaTranslator(itemTypeTranslator);
174 
175 		NavigationStateTranslator navigationStateTranslator = new NavigationStateTranslator();
176 		translator.registerJava2ParameterTranslator(navigationStateTranslator);
177 
178 		SelectorListTranslator selectorListTranslator = new SelectorListTranslator();
179 		translator.registerParameter2JavaTranslator(selectorListTranslator);
180 
181 		SelectorTranslator selectorTranslator = new SelectorTranslator();
182 		translator.registerParameter2JavaTranslator(selectorTranslator);
183 
184 		UT2004GroupTranslator ut2004GroupTranslator = new UT2004GroupTranslator();
185 		translator.registerJava2ParameterTranslator(ut2004GroupTranslator);
186 		translator.registerParameter2JavaTranslator(ut2004GroupTranslator);
187 		
188 		UT2004ItemTypeTranslator ut2004ItemTypeTranslator = new UT2004ItemTypeTranslator();
189 		translator.registerJava2ParameterTranslator(ut2004ItemTypeTranslator);
190 		translator.registerParameter2JavaTranslator(ut2004ItemTypeTranslator);
191 		
192 		WeaponPrefListTranslator weaponPrefListTranslator = new WeaponPrefListTranslator();
193 		translator.registerParameter2JavaTranslator(weaponPrefListTranslator);
194 
195 		WeaponPrefTranslator weaponPrefTranslator = new WeaponPrefTranslator();
196 		translator.registerParameter2JavaTranslator(weaponPrefTranslator);
197                 
198         ScopeTranslator scopeTranslator = new ScopeTranslator();
199         translator.registerParameter2JavaTranslator(scopeTranslator);
200 	}
201 
202 	public static void main(String[] args) throws ManagementException {
203 		HashMap<String, Parameter> map = new HashMap<String, Parameter>();
204 		map.put("botNames", new ParameterList(new Identifier("Test")));
205 
206 		
207 		
208 		new UT2004Environment().init(map);
209 
210 	}
211 
212 	@Override
213 	protected Class<UT2004BotBehavior> getControlerClass() {
214 		return UT2004BotBehavior.class;
215 	}
216 	
217 	protected UTBotRunner<UT2004Bot<IVisionWorldView, IAct, UT2004BotController>, UT2004BotParameters> getBotRunner(
218 			Configuration configuration) {
219 		UT2004BotRunner<UT2004Bot<IVisionWorldView, IAct, UT2004BotController>, UT2004BotParameters> runner = new UT2004BotRunner<UT2004Bot<IVisionWorldView, IAct, UT2004BotController>, UT2004BotParameters>(
220 				getControlerClass(), configuration.getDefaultBotName(),
221 				configuration.getBotServerHost(),
222 				configuration.getBotServerPort());
223 		return runner;
224 	}
225 
226 	@Override
227 	protected PerceptHandler createPerceptHandler(@SuppressWarnings("rawtypes") UT2004BotController controller) throws EntityException {
228 		if (!(controller instanceof AllPerceptsProvider))
229 			throw new EntityException("Expected a class that implements " + AllPerceptsProvider.class.getSimpleName());
230 		return new AllPerceptPerceptHandler((AllPerceptsProvider) controller);
231 	}
232 
233 	@Override
234 	protected ActionHandler createActionHandler(@SuppressWarnings("rawtypes") UT2004BotController controller) throws EntityException {
235 		return new DefaultActionHandler(controller);
236 	}
237 	
238 	@Override
239 	protected UT2004ServerRunner<? extends IUT2004Server, ? extends UT2004AgentParameters> createServerRunner() {
240 		UT2004ServerModule<UT2004AgentParameters> serverModule = new EnvironmentControllerServerModule<UT2004AgentParameters>();
241 		UT2004ServerFactory<EnvironmentControllerServer, UT2004AgentParameters> serverFactory = new UT2004ServerFactory<EnvironmentControllerServer, UT2004AgentParameters>(serverModule);
242 		UT2004ServerRunner<EnvironmentControllerServer, UT2004AgentParameters> serverRunner = new UT2004ServerRunner<EnvironmentControllerServer, UT2004AgentParameters>(serverFactory, "UTServer", configuration.getControlServerHost(), configuration.getControlServerPort());
243 		return serverRunner;
244 	}
245 
246 	@Override
247 	protected synchronized void initializeEnvironment(Map<String, Parameter> parameters) throws ManagementException {
248 		super.initializeEnvironment(parameters);
249 
250 		// Set up (future) connection to visualizer. Connecting is done later.
251 		try {
252 			visualizerConnection = new ReconnectingServerDefinition<RemoteVisualizer>(new VisualizerServiceDefinition());
253 			visualizerConnection.getServerFlag().addListener(new VisualizerServiceListener());
254 		} catch (RemoteException e) {
255 			log.severe("Could not start connection to Visualizer: " + e);
256 		}
257 
258 	}
259 
260 	/**
261 	 * Helper class that handles the connection to the visualizer. Registers a
262 	 * mediator with the visualizer and listens to the actions it requests.
263 	 * 
264 	 * @author M.P. Korstanje
265 	 * 
266 	 */
267 	private class VisualizerServiceListener implements EnvironmentServiceListener, FlagListener<RemoteVisualizer> {
268 
269 		private final EnvironmentServiceMediator mediator;
270 
271 		public VisualizerServiceListener() throws RemoteException {
272 			mediator = new EnvironmentServiceMediator(getComponentId());
273 			mediator.setListener(this);
274 		}
275 
276 		@Override
277 		public void flagChanged(RemoteVisualizer visualizer) {
278 			if (visualizer != null) {
279 				visualizer.setEnvironment(mediator);
280 			}
281 		}
282 
283 		/**
284 		 * 
285 		 * Listens to actions executed by the remote visualizer.
286 		 * 
287 		 * @throws ManagementException
288 		 * 
289 		 */
290 		@Override
291 		public void addBot(AddBotCommand command) throws ManagementException {
292 
293 			BotParameters parameters = new BotParameters();
294 
295 			// Fill out the bot parameter
296 			if (command.getBotName() != null) {
297 				parameters.setAgentId(command.getBotName());
298 			}
299 			if (command.getLogLevel() != null) {
300 				parameters.setLogLevel(command.getLogLevel());
301 			}
302 			if (command.getShouldLeadTarget() != null) {
303 				parameters.setShouldLeadTarget(command.getShouldLeadTarget());
304 			}
305 			if (command.getSkill() != null) {
306 				parameters.setSkill(command.getSkill());
307 			}
308 			if (command.getSkin() != null) {
309 				parameters.setSkin(command.getSkin());
310 			}
311 			if (command.getTeam() != null) {
312 				parameters.setTeam(command.getTeam());
313 			}
314 
315 			if (command.getRotation() != null) {
316 				parameters.setInitialRotation(command.getRotation());
317 			}
318 
319 			if (command.getLocation() != null) {
320 				parameters.setInitialLocation(command.getLocation());
321 			}
322 
323 			// Take connection and other settings from init.
324 			// FIXME: Should get the defaults or set the connection parameters too.
325 			//parameters.assignDefaults(botParameters);
326 
327 			startAgent(parameters);
328 
329 		}
330 
331 	}
332 
333 	@Override
334 	protected synchronized void connectEnvironment() throws ManagementException {
335 		super.connectEnvironment();
336 
337 		// Connect to visualizer
338 		URI visualizerUri = configuration.getVisualizer();
339 		if (visualizerUri != null) {
340 			log.info("Connecting to visualizer server at " + visualizerUri + " .");
341 
342 			visualizerConnection.setUri(visualizerUri);
343 		} else {
344 			log.info("No address for the visualizer server was provided. The environment will not try to connect to the visualizer.");
345 		}
346 	}
347 
348 	@Override
349 	protected synchronized void killEnvironment() {
350 		super.killEnvironment();
351 		// Close the connection to the visualizer.
352 		visualizerConnection.stopServer();
353 
354 	}
355 
356 
357 
358 }