FSMImpl.java revision 608:7e06bf1dcb09
1/* 2 * Copyright (c) 2002, 2003, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. Oracle designates this 8 * particular file as subject to the "Classpath" exception as provided 9 * by Oracle in the LICENSE file that accompanied this code. 10 * 11 * This code is distributed in the hope that it will be useful, but WITHOUT 12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14 * version 2 for more details (a copy is included in the LICENSE file that 15 * accompanied this code). 16 * 17 * You should have received a copy of the GNU General Public License version 18 * 2 along with this work; if not, write to the Free Software Foundation, 19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 20 * 21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 22 * or visit www.oracle.com if you need additional information or have any 23 * questions. 24 */ 25 26package com.sun.corba.se.spi.orbutil.fsm ; 27 28import java.util.Set ; 29import java.util.HashSet ; 30 31import com.sun.corba.se.spi.orbutil.fsm.Input ; 32import com.sun.corba.se.spi.orbutil.fsm.StateEngine ; 33import com.sun.corba.se.impl.orbutil.fsm.StateEngineImpl ; 34import com.sun.corba.se.impl.orbutil.ORBUtility ; 35import com.sun.corba.se.spi.orbutil.fsm.FSM ; 36 37/** 38 * This is the main class that represents an instance of a state machine 39 * using a state engine. It may be used as a base class, in which case 40 * the guards and actions have access to the derived class. 41 * 42 * @author Ken Cavanaugh 43 */ 44public class FSMImpl implements FSM 45{ 46 private boolean debug ; 47 private State state ; 48 private StateEngineImpl stateEngine ; 49 50 /** Create an instance of an FSM using the StateEngine 51 * in a particular start state. 52 */ 53 public FSMImpl( StateEngine se, State startState ) 54 { 55 this( se, startState, false ) ; 56 } 57 58 public FSMImpl( StateEngine se, State startState, boolean debug ) 59 { 60 state = startState ; 61 stateEngine = (StateEngineImpl)se ; 62 this.debug = debug ; 63 } 64 65 /** Return the current state. 66 */ 67 public State getState() 68 { 69 return state ; 70 } 71 72 /** Perform the transition for the given input in the current state. This proceeds as follows: 73 * <p>Let S be the current state of the FSM. 74 * If there are guarded actions for S with input in, evaluate their guards successively until 75 * all have been evaluted, or one returns a non-DISABLED Result. 76 * <ol> 77 * <li>If a DEFERED result is returned, retry the input 78 * <li>If a ENABLED result is returned, the action for the guarded action 79 * is the current action 80 * <li>Otherwise there is no enabled action. If S has a default action and next state, use them; otherwise 81 * use the state engine default action (the next state is always the current state). 82 * </ol> 83 * After the action is available, the transition proceeds as follows: 84 * <ol> 85 * <li>If the next state is not the current state, execute the current state postAction method. 86 * <li>Execute the action. 87 * <li>If the next state is not the current state, execute the next state preAction method. 88 * <li>Set the current state to the next state. 89 * </ol> 90 */ 91 public void doIt( Input in ) 92 { 93 stateEngine.doIt( this, in, debug ) ; 94 } 95 96 // Methods for use only by StateEngineImpl 97 98 public void internalSetState( State nextState ) 99 { 100 if (debug) { 101 ORBUtility.dprint( this, "Calling internalSetState with nextState = " + 102 nextState ) ; 103 } 104 105 state = nextState ; 106 107 if (debug) { 108 ORBUtility.dprint( this, "Exiting internalSetState with state = " + 109 state ) ; 110 } 111 } 112} 113 114// end of FSMImpl.java 115