View Javadoc

1   /**
2    * BaseUnrealEnvironment, an implementation of the environment interface standard that 
3    * facilitates the connection between GOAL and the UT2004 engine. 
4    * 
5    * Copyright (C) 2012 BaseUnrealEnvironment 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  package nl.tudelft.goal.unreal.environment;
21  
22  import java.util.Map;
23  
24  import eis.eis2java.environment.AbstractEnvironment;
25  import eis.exceptions.ManagementException;
26  import eis.iilang.EnvironmentState;
27  import eis.iilang.Parameter;
28  
29  /**
30   * Convenience implementation to simplify dealing with EIS state transitions.
31   * This environment hides all transitions from its subclasses and provides a
32   * better transition model.
33   * 
34   * It guarantees that initialize, connect, pause, start and kill are be called in
35   * this order. The arrow indicates the direction, the brackets indicate these
36   * calls are optional.
37   * 
38   * initalizeEnvironment() ---> connectEnvironment() ---> [pauseEnvironment
39   * [<---> startEnvironment] --->] killEnvironment() ---> initalizeEnvironment()
40   * --->
41   * 
42   * @author mpkorstanje
43   * 
44   */
45  public abstract class SimpleTransitioningEnvironment extends AbstractEnvironment {
46  
47  	/**
48  	 * Generated serialVersionUID.
49  	 */
50  	private static final long serialVersionUID = -8671600742206011276L;
51  
52  
53  	@Override
54  	public final synchronized void init(Map<String, Parameter> parameters) throws ManagementException {
55  		super.init(parameters);
56  
57  		// Delegate actual initialization to abstract method.
58  		initializeEnvironment(parameters);
59  
60  		// Connect to environment
61  		connectEnvironment();
62  
63  		// Transition to paused because the EIS spec requires this.
64  		setState(EnvironmentState.PAUSED);
65  
66  		// Transition to running because UT can't be started paused.
67  		setState(EnvironmentState.RUNNING);
68  		
69  		// Connect agents once environment state is set to running. 
70  		// This allows agents to start from the get go.
71  		connectAgents();
72  	}
73  	
74  	protected abstract void initializeEnvironment(Map<String, Parameter> parameters) throws ManagementException;
75  
76  	
77  	protected abstract void connectEnvironment() throws ManagementException;
78  
79  
80  	protected abstract void connectAgents() throws ManagementException;
81  
82  
83  	@Override
84  	public final synchronized void kill() throws ManagementException {
85  
86  		// Delegate kill to abstract method.
87  		killEnvironment();
88  		// Transition complete, set the state.
89  		super.kill();
90  
91  	}
92  
93  	protected abstract void killEnvironment() throws ManagementException;
94  
95  	/**
96  	 * {@inheritDoc}
97  	 */
98  	@Override
99  	public final synchronized void pause() throws ManagementException {
100 		// Delegate kill to abstract method.
101 		pauseEvironment();
102 		// Transition complete, set the state.
103 		super.pause();
104 	}
105 
106 	protected abstract void pauseEvironment() throws ManagementException;
107 
108 	/**
109 	 * {@inheritDoc}
110 	 */
111 	@Override
112 	public final synchronized void start() throws ManagementException {
113 		// Delegate start to abstract method.
114 		startEnvironment();
115 		// Transition complete, set the state.
116 		super.start();
117 	}
118 
119 	protected abstract void startEnvironment() throws ManagementException;
120 }