汎用的なプロセスフローマネージャを作ってみる
戻る
::::::::::::::
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();
}
戻る