汎用的なプロセスフローマネージャを作ってみる

戻る
::::::::::::::
DecisionTable.java
::::::::::::::
package ProcessFlowManager;

import java.util.*;

/**
* <pre>
* 複数の条件に対する判断をして次のプロセスを決定するクラス
* </pre>
* $Id: pfm.html,v 1.1 2009/06/22 16:12:19 kishi Exp kishi $
* @author KISHI Yasuhiro
*/

public class DecisionTable extends AbstractProcess implements Traversable {

    /** 複数の条件とそれに対応する次プロセスを格納する */
    private Map conditionHandlerMap;

    /** デフォルト(どの条件にもマッチしない場合の進路) */
    private AbstractProcess defaultNextProcess = null;

    /** コンストラクタ */
    public DecisionTable( String name ) {
        super( name );
    }

    /** 複数の条件とそれに対応する次プロセスを格納する
    * @param conditionHandler 条件を処理して真偽を返すオブジェクト
    * @param candidate 選択された条件に対応する次のプロセス
    */
    public void addConditionHandler( Judgeable conditionHandler, AbstractProcess candidate ) {
        if ( conditionHandlerMap == null ) {
            conditionHandlerMap = new LinkedHashMap();
        }
        conditionHandlerMap.put( conditionHandler, candidate );
    }

    /** デフォルト(どの条件にもマッチしない場合の進路を設定する */
    public void setDefaultNextProcess( AbstractProcess defaultNextProcess ) {
        this.defaultNextProcess = defaultNextProcess;
    }

    /** 戻り値がnullの場合は、例外をスローするように改修する予定! */
    public AbstractProcess getNextProcess() {

        Iterator iterator = conditionHandlerMap.keySet().iterator();
        // 登録順に判定していく
        while ( iterator.hasNext() ) {
            Judgeable conditionHandler = ( Judgeable ) iterator.next();
            AbstractProcess candidate = ( AbstractProcess ) conditionHandlerMap.get( conditionHandler );

            if ( conditionHandler.judge() ) {
                return candidate;
            }
        }

        // どの条件にもマッチしない場合は、デフォルトを返す
        return defaultNextProcess;
    }

    public boolean isExitPoint() {
        // 終端になることはありえない
        return false;
    }

    public List getNextPathList() {
        // Generic型を利用
        List<AbstractProcess> list = null;
        if ( list == null ) {
            list = new LinkedList();
        }

        Iterator iterator = conditionHandlerMap.keySet().iterator();
        while ( iterator.hasNext() ) {
            Judgeable key = ( Judgeable ) iterator.next();
            AbstractProcess candidate = ( AbstractProcess ) conditionHandlerMap.get( key );
            list.add( candidate );
        }

        return list;
    }

    /** 単体試験 */
    static public void main( String[] args ) {
        // 追跡対象のアイテムをインスタンス化
        ConcreteItem item = new ConcreteItem();
        item.setAvailableCount( 20 );
        // メタ情報の初期化
        item.setMetaInfo( "不具合", false );

        // プロセスの定義
        Process receipt = new Process( "入荷" );
        Process inspection = new Process( "検査" );
        Process use = new Process( "使用" );
        Process disposal = new Process( "廃棄" );
        Process repair = new Process( "修理" );
        DecisionTable decisionTable = new DecisionTable( "判断" );

        // 次のプロセスを決める
        receipt.setNextProcess( inspection );
        inspection.setNextProcess( decisionTable );
        use.setNextProcess( inspection );
        repair.setNextProcess( receipt );

        // 終端の設定
        disposal.setExitable();

        // 各プロセスで実施される内容を記述したハンドラを付与する
        inspection.addHandler( new Test1_BusinessLogicHandler( item ) );
        use.addHandler( new Test2_BusinessLogicHandler( item ) );

        // 条件の設定
        decisionTable.addConditionHandler( new Test1_ConditionHandler( item ), use );	// 使用
        decisionTable.addConditionHandler( new Test2_ConditionHandler( item ), repair );	// 検査
        decisionTable.setDefaultNextProcess( disposal );

        // アイテムに対して最初のプロセスを設定する
        item.setCurrentProcess( receipt );

        // オペレータを介さない場合を想定 -- without intervention of operator  ⇒ つまりアイテムが勝手にプロセスフローを進む
        System.out.println( "In case that operator does NOT intervene:" );

        // アイテムが終端ポイントまで到着するまでループさせる
        while ( !item.reachesExitPoint() ) {

            AbstractProcess step = item.getCurrentProcess();

            System.out.println( "/// 現在のステップ : " + step.getName() );

            if ( step.isProcess() ) {
                // なんらかの処理を実行
                ( ( Process ) step ).execute();
            }

            try {
                Thread.sleep( 100 );
            } catch ( Exception e ) {
                e.printStackTrace();
            }

            // 次のステップに進む
            item.proceedToNextStep();
        }

        System.out.println( "アイテムのライフサイクルが終了しました!" );

    }
}
::::::::::::::
result.txt
::::::::::::::
$ ./UnitTest.sh DecisionTable  > result.txt 2>&1

In case that operator does NOT intervene:
/// 現在のステップ : 入荷
/// 現在のステップ : 検査
in ProcessFlowManager.Test1_BusinessLogicHandler: 不具合です
/// 現在のステップ : 判断
/*** DEBUG ***/ 修理工程に進みます
/// 現在のステップ : 修理
/// 現在のステップ : 入荷
/// 現在のステップ : 検査
/// 現在のステップ : 判断
/// 現在のステップ : 使用
in ProcessFlowManager.Test2_BusinessLogicHandler: avaliableCount = 19
/// 現在のステップ : 検査
/// 現在のステップ : 判断
/// 現在のステップ : 使用
in ProcessFlowManager.Test2_BusinessLogicHandler: avaliableCount = 18
/// 現在のステップ : 検査
in ProcessFlowManager.Test1_BusinessLogicHandler: 不具合です
/// 現在のステップ : 判断
/*** DEBUG ***/ 修理工程に進みます
/// 現在のステップ : 修理
/// 現在のステップ : 入荷
/// 現在のステップ : 検査
/// 現在のステップ : 判断
/// 現在のステップ : 使用
in ProcessFlowManager.Test2_BusinessLogicHandler: avaliableCount = 17
/// 現在のステップ : 検査
/// 現在のステップ : 判断
/// 現在のステップ : 使用
in ProcessFlowManager.Test2_BusinessLogicHandler: avaliableCount = 16
/// 現在のステップ : 検査
/// 現在のステップ : 判断
/// 現在のステップ : 使用
in ProcessFlowManager.Test2_BusinessLogicHandler: avaliableCount = 15
/// 現在のステップ : 検査
/// 現在のステップ : 判断
/// 現在のステップ : 使用
in ProcessFlowManager.Test2_BusinessLogicHandler: avaliableCount = 14
/// 現在のステップ : 検査
in ProcessFlowManager.Test1_BusinessLogicHandler: 不具合です
/// 現在のステップ : 判断
/*** DEBUG ***/ 修理工程に進みます
/// 現在のステップ : 修理
/// 現在のステップ : 入荷
/// 現在のステップ : 検査
in ProcessFlowManager.Test1_BusinessLogicHandler: 不具合です
/// 現在のステップ : 判断
/*** DEBUG ***/ 修理工程に進みます
/// 現在のステップ : 修理
/// 現在のステップ : 入荷
/// 現在のステップ : 検査
/// 現在のステップ : 判断
/// 現在のステップ : 使用
in ProcessFlowManager.Test2_BusinessLogicHandler: avaliableCount = 13
/// 現在のステップ : 検査
/// 現在のステップ : 判断
/// 現在のステップ : 使用
in ProcessFlowManager.Test2_BusinessLogicHandler: avaliableCount = 12
/// 現在のステップ : 検査
/// 現在のステップ : 判断
/// 現在のステップ : 使用
in ProcessFlowManager.Test2_BusinessLogicHandler: avaliableCount = 11
/// 現在のステップ : 検査
/// 現在のステップ : 判断
/// 現在のステップ : 使用
in ProcessFlowManager.Test2_BusinessLogicHandler: avaliableCount = 10
/// 現在のステップ : 検査
in ProcessFlowManager.Test1_BusinessLogicHandler: 不具合です
/// 現在のステップ : 判断
/*** DEBUG ***/ 修理工程に進みます
/// 現在のステップ : 修理
/// 現在のステップ : 入荷
/// 現在のステップ : 検査
/// 現在のステップ : 判断
/// 現在のステップ : 使用
in ProcessFlowManager.Test2_BusinessLogicHandler: avaliableCount = 9
/// 現在のステップ : 検査
/// 現在のステップ : 判断
/// 現在のステップ : 使用
in ProcessFlowManager.Test2_BusinessLogicHandler: avaliableCount = 8
/// 現在のステップ : 検査
/// 現在のステップ : 判断
/// 現在のステップ : 使用
in ProcessFlowManager.Test2_BusinessLogicHandler: avaliableCount = 7
/// 現在のステップ : 検査
/// 現在のステップ : 判断
/// 現在のステップ : 使用
in ProcessFlowManager.Test2_BusinessLogicHandler: avaliableCount = 6
/// 現在のステップ : 検査
/// 現在のステップ : 判断
/// 現在のステップ : 使用
in ProcessFlowManager.Test2_BusinessLogicHandler: avaliableCount = 5
/// 現在のステップ : 検査
/// 現在のステップ : 判断
/// 現在のステップ : 使用
in ProcessFlowManager.Test2_BusinessLogicHandler: avaliableCount = 4
/// 現在のステップ : 検査
/// 現在のステップ : 判断
/// 現在のステップ : 使用
in ProcessFlowManager.Test2_BusinessLogicHandler: avaliableCount = 3
/// 現在のステップ : 検査
/// 現在のステップ : 判断
/// 現在のステップ : 使用
in ProcessFlowManager.Test2_BusinessLogicHandler: avaliableCount = 2
/// 現在のステップ : 検査
/// 現在のステップ : 判断
/// 現在のステップ : 使用
in ProcessFlowManager.Test2_BusinessLogicHandler: avaliableCount = 1
/// 現在のステップ : 検査
/// 現在のステップ : 判断
/// 現在のステップ : 使用
in ProcessFlowManager.Test2_BusinessLogicHandler: avaliableCount = 0
/// 現在のステップ : 検査
/// 現在のステップ : 判断
アイテムのライフサイクルが終了しました!
::::::::::::::
javap.txt
::::::::::::::
Compiled from "AbstractBusinessLogicHandler.java"
public abstract class ProcessFlowManager.AbstractBusinessLogicHandler extends java.lang.Object implements ProcessFlowManager.Interveneable{
    protected java.lang.Object instance;
    public ProcessFlowManager.AbstractBusinessLogicHandler(java.lang.Object);
}

Compiled from "AbstractHardCodedConditionHandler.java"
public abstract class ProcessFlowManager.AbstractHardCodedConditionHandler extends java.lang.Object implements ProcessFlowManager.Judgeable{
    protected java.lang.Object instance;
    public ProcessFlowManager.AbstractHardCodedConditionHandler(java.lang.Object);
}

Compiled from "AbstractItem.java"
public abstract class ProcessFlowManager.AbstractItem extends java.lang.Object{
    protected java.util.Map metaInfoMap;
    protected ProcessFlowManager.AbstractProcess currentProcess;
    protected ProcessFlowManager.ItemType itemType;
    protected ProcessFlowManager.HistoryManager historyManager;
    public ProcessFlowManager.AbstractItem();
    public abstract void addHistory();
    public java.util.List getHistory();
    protected ProcessFlowManager.AbstractProcess getCurrentProcess();
    protected void setCurrentProcess(ProcessFlowManager.AbstractProcess);
    protected void setMetaInfo(java.lang.Object, java.lang.Object);
    protected java.lang.Object getMetaInfo(java.lang.Object);
    public boolean reachesExitPoint();
    public void proceedToNextStep();
}

Compiled from "AbstractProcess.java"
public abstract class ProcessFlowManager.AbstractProcess extends java.lang.Object{
    protected java.lang.String name;
    public ProcessFlowManager.AbstractProcess(java.lang.String);
    protected java.lang.String getName();
    protected void setName(java.lang.String);
    protected boolean isCondition();
    protected boolean isNotCondition();
    protected boolean isProcess();
    protected abstract ProcessFlowManager.AbstractProcess getNextProcess();
    protected abstract boolean isExitPoint();
    public static void main(java.lang.String[]);
}

Compiled from "ConcreteBusinessLogicHandler.java"
public class ProcessFlowManager.ConcreteBusinessLogicHandler extends ProcessFlowManager.AbstractBusinessLogicHandler{
    public ProcessFlowManager.ConcreteBusinessLogicHandler(java.lang.Object);
    public void intervene();
}

Compiled from "ConcreteItem.java"
public class ProcessFlowManager.ConcreteItem extends ProcessFlowManager.AbstractItem{
    private int availableCount;
    public ProcessFlowManager.ConcreteItem();
    public void setAvailableCount(int);
    public int getAvailableCount();
    public void addHistory();
    public void getOlder();
    public static void main(java.lang.String[]);
}

Compiled from "Condition.java"
public class ProcessFlowManager.Condition extends ProcessFlowManager.AbstractProcess implements ProcessFlowManager.Traversable{
    private ProcessFlowManager.AbstractProcess nextProcessWhenTrue;
    private ProcessFlowManager.AbstractProcess nextProcessWhenFalse;
    private ProcessFlowManager.Judgeable conditionHandler;
    public ProcessFlowManager.Condition(java.lang.String);
    public void setConditionHandler(ProcessFlowManager.Judgeable);
    public void setNextProcessWhenTrue(ProcessFlowManager.AbstractProcess);
    public void setNextProcessWhenFalse(ProcessFlowManager.AbstractProcess);
    public ProcessFlowManager.AbstractProcess getNextProcess();
    public boolean isExitPoint();
    public java.util.List getNextPathList();
}

Compiled from "DecisionTable.java"
public class ProcessFlowManager.DecisionTable extends ProcessFlowManager.AbstractProcess implements ProcessFlowManager.Traversable{
    private java.util.Map conditionHandlerMap;
    private ProcessFlowManager.AbstractProcess defaultNextProcess;
    public ProcessFlowManager.DecisionTable(java.lang.String);
    public void addConditionHandler(ProcessFlowManager.Judgeable, ProcessFlowManager.AbstractProcess);
    public void setDefaultNextProcess(ProcessFlowManager.AbstractProcess);
    public ProcessFlowManager.AbstractProcess getNextProcess();
    public boolean isExitPoint();
    public java.util.List getNextPathList();
    public static void main(java.lang.String[]);
}

Compiled from "GenericTraverser.java"
public class ProcessFlowManager.GenericTraverser extends java.lang.Object{
    public ProcessFlowManager.GenericTraverser();
    public void traverse(ProcessFlowManager.Traversable);
    public static void main(java.lang.String[]);
}

Compiled from "HistoryManager.java"
public class ProcessFlowManager.HistoryManager extends java.lang.Object{
    private java.util.List history;
    public ProcessFlowManager.HistoryManager();
    public java.util.List getHistory();
}

Compiled from "Interveneable.java"
public interface ProcessFlowManager.Interveneable{
    public abstract void intervene();
}

Compiled from "ItemType.java"
public class ProcessFlowManager.ItemType extends java.lang.Object{
    public int id;
    public java.lang.String name;
    public ProcessFlowManager.ItemType(int, java.lang.String);
    public java.lang.String getName();
    public int getId();
}

Compiled from "Judgeable.java"
public interface ProcessFlowManager.Judgeable{
    public abstract boolean judge();
}

Compiled from "Process.java"
public class ProcessFlowManager.Process extends ProcessFlowManager.AbstractProcess implements ProcessFlowManager.Traversable{
    private java.util.List handlerList;
    private ProcessFlowManager.AbstractProcess nextProcess;
    private boolean exitable;
    public ProcessFlowManager.Process(java.lang.String);
    public void addHandler(ProcessFlowManager.AbstractBusinessLogicHandler);
    public ProcessFlowManager.AbstractProcess getNextProcess();
    public void setNextProcess(ProcessFlowManager.AbstractProcess);
    public java.util.List getNextPathList();
    public void setExitable();
    public boolean isExitPoint();
    public void execute();
    public static void main(java.lang.String[]);
}

Compiled from "ProcessFlow.java"
public class ProcessFlowManager.ProcessFlow extends java.lang.Object{
    private java.lang.String name;
    private java.util.List processList;
    private ProcessFlowManager.AbstractProcess entryPoint;
    private ProcessFlowManager.AbstractProcess currentPoint;
    public ProcessFlowManager.ProcessFlow();
    public void setEntryPoint(ProcessFlowManager.AbstractProcess);
    public java.util.List getProcessList();
    public void setName(java.lang.String);
    public void join(ProcessFlowManager.ProcessFlowManager)       throws ProcessFlowManager.ProcessFlowJoinMethodException;
    public void run();
    public java.lang.String getName();
    public void addProcess(ProcessFlowManager.AbstractProcess);
    public void link(ProcessFlowManager.Process, ProcessFlowManager.AbstractProcess);
    public void link(ProcessFlowManager.Condition, ProcessFlowManager.AbstractProcess, boolean);
    public static void main(java.lang.String[]);
}

Compiled from "ProcessFlowJoinMethodException.java"
public class ProcessFlowManager.ProcessFlowJoinMethodException extends java.lang.Exception{
    public ProcessFlowManager.ProcessFlowJoinMethodException(java.lang.String);
}

Compiled from "ProcessFlowManager.java"
public class ProcessFlowManager.ProcessFlowManager extends java.lang.Object{
    private java.util.List flowList;
    public ProcessFlowManager.ProcessFlowManager();
    public java.util.List getProcessFlowList();
    public static void main(java.lang.String[]);
}

Compiled from "SmartConditionHandler.java"
public class ProcessFlowManager.SmartConditionHandler extends java.lang.Object implements ProcessFlowManager.Judgeable{
    public ProcessFlowManager.SmartConditionHandler();
    public boolean judge();
}

Compiled from "TentativeHardCodedConditionHandler.java"
public class ProcessFlowManager.TentativeHardCodedConditionHandler extends ProcessFlowManager.AbstractHardCodedConditionHandler{
    public ProcessFlowManager.TentativeHardCodedConditionHandler(ProcessFlowManager.ConcreteItem);
    public boolean judge();
    public static void main(java.lang.String[]);
}

Compiled from "Test1_BusinessLogicHandler.java"
public class ProcessFlowManager.Test1_BusinessLogicHandler extends ProcessFlowManager.AbstractBusinessLogicHandler{
    public ProcessFlowManager.Test1_BusinessLogicHandler(java.lang.Object);
    public void intervene();
}

Compiled from "Test1_ConditionHandler.java"
public class ProcessFlowManager.Test1_ConditionHandler extends ProcessFlowManager.AbstractHardCodedConditionHandler{
    public ProcessFlowManager.Test1_ConditionHandler(ProcessFlowManager.ConcreteItem);
    public boolean judge();
}

Compiled from "Test2_BusinessLogicHandler.java"
public class ProcessFlowManager.Test2_BusinessLogicHandler extends ProcessFlowManager.AbstractBusinessLogicHandler{
    public ProcessFlowManager.Test2_BusinessLogicHandler(java.lang.Object);
    public void intervene();
}

Compiled from "Test2_ConditionHandler.java"
public class ProcessFlowManager.Test2_ConditionHandler extends ProcessFlowManager.AbstractHardCodedConditionHandler{
    public ProcessFlowManager.Test2_ConditionHandler(ProcessFlowManager.ConcreteItem);
    public boolean judge();
}

Compiled from "Traversable.java"
public interface ProcessFlowManager.Traversable{
    public abstract java.util.List getNextPathList();
    public abstract boolean isExitPoint();
}



戻る inserted by FC2 system