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  	protected abstract void connectEnvironment() throws ManagementException;
53  
54  	@Override
55  	public final synchronized void init(Map<String, Parameter> parameters) throws ManagementException {
56  		super.init(parameters);
57  
58  		// Delegate actual initialization to abstract method.
59  		initializeEnvironment(parameters);
60  
61  		// Delegate connection to abstract method.
62  		connectEnvironment();
63  
64  		// Transition to paused because the EIS spec requires this.
65  		setState(EnvironmentState.PAUSED);
66  
67  		// Transition to running because UT can't be started paused.
68  		setState(EnvironmentState.RUNNING);
69  	}
70  
71  	protected abstract void initializeEnvironment(Map<String, Parameter> parameters) throws ManagementException;
72  
73  	@Override
74  	public final synchronized void kill() throws ManagementException {
75  
76  		// Delegate kill to abstract method.
77  		killEnvironment();
78  		// Transition complete, set the state.
79  		super.kill();
80  
81  	}
82  
83  	protected abstract void killEnvironment() throws ManagementException;
84  
85  	/**
86  	 * {@inheritDoc}
87  	 */
88  	@Override
89  	public final synchronized void pause() throws ManagementException {
90  		// Delegate kill to abstract method.
91  		pauseEvironment();
92  		// Transition complete, set the state.
93  		super.pause();
94  	}
95  
96  	protected abstract void pauseEvironment() throws ManagementException;
97  
98  	/**
99  	 * {@inheritDoc}
100 	 */
101 	@Override
102 	public final synchronized void start() throws ManagementException {
103 		// Delegate start to abstract method.
104 		startEnvironment();
105 		// Transition complete, set the state.
106 		super.start();
107 	}
108 
109 	protected abstract void startEnvironment() throws ManagementException;
110 }