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 }