// Copyright (C) 2004, 2005, PoolCompsOnline.com. All rights reserved. // Contact tech@PoolCompsOnline.com. // Original file name: ExecManager.java // Changelog: // Date Auth Description // -------- -------- ----------------------------------------------------------- // 20 October 2006 Dmitri Initial version package iyp.stresstester.exec; import iyp.stresstester.model.TestDef; import java.util.ArrayList; /** * * @author Dmitri */ public class ExecManager { public enum State { IDLE, RUNNING, STOPPING, PAUSED }; public interface IOwner { /** Defines the desired rate of execution. It may be not achivable, depending on the number of * worker and duration of scenario execution, but the manager will try to honour it. * The method is called frequently, and may return different value each time. * * @return scenarios per sec, by all workers */ float getCasesPerSec(); // target rate }; /** Creates a new instance of ExecManager */ public ExecManager(IOwner owner, TestDef testDef) { this.owner = owner; this.testDef = testDef; } public State getState() { return curState.getState(); } public void addStateChangeListener(IExecStateChangeListener listener) { synchronized(stateChangeListeners) { stateChangeListeners.add(listener); } } public void removeStateChangeListener(IExecStateChangeListener listener) { synchronized(stateChangeListeners) { stateChangeListeners.remove(listener); }; } public void run() throws Exception { synchronized(stateChangeListeners) { curState.run(); } } public void pause() { synchronized(stateChangeListeners) { curState.pause(); } } public void continueExec() { synchronized(stateChangeListeners) { curState.continueExec(); } } public void stop() { synchronized(stateChangeListeners) { curState.stop(); } } //=========================== // PRIVATE final IOwner owner; final TestDef testDef; private ArrayList stateChangeListeners = new ArrayList(); void notifyStateChangeListeners() { synchronized(stateChangeListeners) { for (IExecStateChangeListener l : stateChangeListeners) l.stateChanged(); }; }; interface IExecState { State getState(); void run() throws Exception; void pause(); void continueExec(); void stop(); }; IExecState curState = new IdleState(); class IdleState implements IExecState { public State getState() { return State.IDLE; } public void run() { // TODO: run } public void pause() {}; public void continueExec() {}; public void stop() {}; }; class RunningState implements IExecState { public State getState() { return State.RUNNING; } public void run() { } public void pause() { // TODO: Running => Pause }; public void continueExec() {}; public void stop() { // TODO: Running => Stop }; }; class StoppingState implements IExecState { public State getState() { return State.STOPPING; } public void run() { } public void pause() {}; public void continueExec() {}; public void stop() {}; }; class PausedState implements IExecState { public State getState() { return State.PAUSED; } public void run() { } public void pause() { }; public void continueExec() { // TODO: paused => continue }; public void stop() { // TODO: pause => Stop }; }; // ========= // CONTROL THREAD class ControlThread extends Thread { ControlThread() { super("ControlThread"); setDaemon(true); }; public void run() { }; private final ExecContent execContent = new ExecContent(); } }