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