/* * Copyright (C) 2012 Google Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of * the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations under * the License. */ package interactivespaces.activity; import interactivespaces.util.statemachine.simplegoal.BaseSimpleGoalStateTransition; /** * A transition from one activity state to another. * * @author Keith M. Hughes */ public abstract class ActivityStateTransition extends BaseSimpleGoalStateTransition<ActivityState, ActivityControl> { /** * Transition for starting up an activity. */ public static final ActivityStateTransition STARTUP = new StartupActivityStateTransition( "space.activity.state.transition.startup"); /** * Transition for activating an activity. */ public static final ActivityStateTransition ACTIVATE = new ActivateActivityStateTransition( "space.activity.state.transition.activate"); /** * Transition for deactivating an activity. */ public static final ActivityStateTransition DEACTIVATE = new DeactivateActivityStateTransition( "space.activity.state.transition.deactivate"); /** * Transition for shutting down an activity. */ public static final ActivityStateTransition SHUTDOWN = new ShutdownActivityStateTransition( "space.activity.state.transition.shutdown"); /** * Construct a new activity state transition. * * @param description * the description of the transition */ ActivityStateTransition(String description) { super(description); } @Override public String toString() { return "ActivityStateTransition [description=" + getDescription() + "]"; } /** * Transition for starting up an activity. */ private static final class StartupActivityStateTransition extends ActivityStateTransition { /** * Construct a startup transition. * * @param description * the description of the transition */ private StartupActivityStateTransition(String description) { super(description); } @Override public TransitionResult canTransition(ActivityState currentState) { if (currentState.isRunning()) { return TransitionResult.NOOP; } else { switch (currentState) { case STARTUP_FAILURE: case SHUTDOWN_FAILURE: case CRASHED: case READY: return TransitionResult.OK; default: return TransitionResult.ILLEGAL; } } } @Override public void onTransition(ActivityState currentState, ActivityControl activity) { // Make one final attempt to shut it down. if (currentState == ActivityState.SHUTDOWN_FAILURE) { activity.shutdown(); } activity.startup(); } } /** * Transition for activating an activity. */ private static final class ActivateActivityStateTransition extends ActivityStateTransition { /** * Construct an activate transition. * * @param description * the description of the transition */ private ActivateActivityStateTransition(String description) { super(description); } @Override public TransitionResult canTransition(ActivityState state) { if (state == ActivityState.RUNNING || state == ActivityState.ACTIVATE_FAILURE) { return TransitionResult.OK; } else if (state == ActivityState.ACTIVE) { return TransitionResult.NOOP; } else { return TransitionResult.ILLEGAL; } } @Override public void onTransition(ActivityState currentState, ActivityControl activity) { activity.activate(); } } /** * Transition for deactivating an activity. */ private static final class DeactivateActivityStateTransition extends ActivityStateTransition { /** * Construct a deactivate transition. * * @param description * the description of the transition */ private DeactivateActivityStateTransition(String description) { super(description); } @Override public TransitionResult canTransition(ActivityState state) { if (state.equals(ActivityState.ACTIVE) || state.equals(ActivityState.ACTIVATE_FAILURE) || state.equals(ActivityState.DEACTIVATE_FAILURE)) { return TransitionResult.OK; } else if (state.equals(ActivityState.RUNNING)) { return TransitionResult.NOOP; } else { return TransitionResult.ILLEGAL; } } @Override public void onTransition(ActivityState currentState, ActivityControl activity) { activity.deactivate(); } } /** * Transition for shutting down an activity. */ private static final class ShutdownActivityStateTransition extends ActivityStateTransition { /** * Construct a shutdown transition. * * @param description * the description of the transition */ private ShutdownActivityStateTransition(String description) { super(description); } @Override public TransitionResult canTransition(ActivityState state) { // Pretty much can always shut down switch (state) { case READY: return TransitionResult.NOOP; case DEPLOY_ATTEMPT: case DEPLOY_FAILURE: case DOESNT_EXIST: case UNKNOWN: return TransitionResult.ILLEGAL; default: return TransitionResult.OK; } } @Override public void onTransition(ActivityState currentState, ActivityControl activity) { activity.shutdown(); } } }