在流程管理中
因為是用戶自己操作
一個流程必須有一個開始節點
例如用戶建立的節點如下
然後用戶指定節點的流向
以上這些都是正確的節點流向
以上這些都是不正確定的節點流向
所以必須檢查用戶指定的流向是否能從開始節點經過若干審核節點連通到結束節點
節點Node:
/** * 節點 * @author Luxh *
@Id
@GeneratedValue
private Integer id;
//節點名稱
private String name;
//節點標記
private String flag;
//一個檢查標記位
Y
private String checkStatus;}
流向Flow:
/** * 流向 * @author Luxh *
@Id
@GeneratedValue
private Integer id;
//開始編號
private Integer beginNo;
//指向編號
private Integer endNo;
/** * 節點檢查測試 * @author Luxh *
EntityManagerFactory emf = null;
@Before
public void before() {
//根據在persistence
emf = Persistence
}
@After
public void after() {
if(null != emf) {
emf
}
}
/**
* 添加節點數據
*/
@Test
public void testAddNode(){
EntityManager em = emf
em
Node n
n
n
Node n
n
n
Node n
n
n
Node n
n
n
Node n
n
n
em
em
em
em
em
em
em
}
/**
* 添加節點流向數據
*/
@Test
public void testAddFlow(){
EntityManager em = emf
em
Flow f
f
f
Flow f
f
f
Flow f
f
f
Flow f
f
f
Flow f
f
f
em
em
em
em
em
em
em
em
}
/**
* 測試
*/
@Test
public void testIsStartCan
//獲取JPA實體管理器
EntityManager em = emf
//流程開始節點的編號
Integer beginNo =
List<String> flagList = new ArrayList<String>()
//因為可能會多次檢查開始節點是否可以連通結束節點
//所以在調用遞歸檢查方法前
//實際中節點表肯定會有一個字段表示所屬流程
//調用清空標記位方法
//…
//首次調用時
isStartCan
if(ntains(
System
}else {
System
}
em
}
/**
* 遞歸判斷 開始節點是否可以連通到結束節點
* @param beginNo 開始編號
* @param flagList 存放結束節點標記
* @param em
JPA的實體管理器
*/
public void isStartCan
//根據開始編號查詢出該開始編號的所有指向的節點的編號
String jpql =
List<Flow> flows = em
if(flows != null && flows
//遍歷開始編號所指向的所有流向
for(Flow f : flows) {
//根據編號找出節點
Node n = em
//如果是結束節點
if(
flagList
break;
}else if(
//如果是開始節點
continue;
}else {
em
n
rge(n)
em
//如果是審核節點
isStartCan
}
}
}
}
}
From:http://tw.wingwit.com/Article/program/Java/hx/201311/25836.html