????? 今天要介紹的是基于web的shark。不知道為什么字體都是斜體。索性不配圖了。本項目代碼部分源自Geeta Ramani的Struts in Shark。
????? 先來個How to:
????? 1.?在jbuilder 2006中新建一個web項目,包含struts最新版的庫。我起的名字叫TestingShark,路徑在
D:\jproject\TestingShark。可別放中文目錄下,不然可能報錯。
????? 2.把你安裝好的shark打開,進入lib文件夾,找到里面所有shark開頭的jar文件,都復(fù)制到D:\jproject\TestingShark\TestingShark\WEB-INF\lib中。當(dāng)然,你也可以把里面所有的jar文件都copy過去,里面好東西不少,commons,axis,xalan,jawe包應(yīng)有盡有。不要考文件夾,只用考jar包。統(tǒng)計了
一下shark開頭的有53項。不要忘記sqlserver的3個驅(qū)動文件。
??????3.開始寫代碼。Action~!
????? 按照昨天說的,shark要運行起來先要把package就是xpdl給load進來。如何在web上實現(xiàn)?
先看看shark API中的org.enhydra.shark.api.client.wfservice 之Interface PackageAdministration。關(guān)于包的所有操作都有了。
???? StrustsinShark項目中建立了一個JSPAdminUtilities類,里面有一些封裝好的操作。
package com.xxxx.shark.util.jsp;
import java.io.File;
import java.io.FileDescriptor;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.Vector;
import org.enhydra.shark.Shark;
......
import org.enhydra.shark.api.client.wfservice.PackageAdministration;
import org.enhydra.shark.api.client.wfservice.RepositoryMgr;
......
方法 String??PackageLoad(String xpdlName)
/**
? * 取得xpdl文件,xpdl文件必須在Shark服務(wù)端的Rs..external目錄下,不然就要輸入路徑。
? *
? * @param? xpdlName?????????? Description of the Parameter
? * @return??????????????????? Description of the Return Value
? * @exception? BaseException? Description of the Exception
? */
?public String packageLoad(String xpdlName) throws BaseException {
//包實例化需要從shark.getInstance()進入,這步非常的重要。
??PackageAdministration pa = Shark.getInstance().getAdminInterface().getPackageAdministration();
//為什么要用RepositoryMgr?因為要取得package?id 來驗證此包是否已經(jīng)裝載過。
??RepositoryMgr rm = Shark.getInstance().getRepositoryManager();
??String pkgId = rm.getPackageId(xpdlName);
//如果沒有裝載包,就下手吧。
??if (!pa.isPackageOpened(pkgId)) {
???try {
????pa.openPackage(xpdlName);
???}
???catch (Throwable e) {
????e.printStackTrace();
????throw new BaseException(e);
???}
??}
??return rm.getPackageId(xpdlName);
?}
方法? boolean packageDownload(String pkgId, String completeFilePath)
?/**
???? * 從數(shù)據(jù)庫中下載XPDL文件到指定目錄(Table XPDLS and XPDLData)
???? * @param pkgId id of pkg you want to download
???? * @param completeFilePath where you want the file downloaded
???? * @throws BaseException, FileNotFoundException, IOException
???? */
?public boolean packageDownload(String pkgId, String completeFilePath) throws BaseException, FileNotFoundException, IOException {
??PackageAdministration pa = Shark.getInstance().getAdminInterface().getPackageAdministration();
???RepositoryMgr rm = Shark.getInstance().getRepositoryManager();
??//String pkgId = rm.getPackageId(xpdlName);
??//String pkgId = "WellnessDemo";
??String currVersion = pa.getCurrentPackageVersion(pkgId);
??byte[] contents = pa.getPackageContent(pkgId, currVersion);
??//FileOutputStream fos = new FileOutputStream("C:\\xpdls\\WellnessDemo.xpdl");
??FileOutputStream fos = new FileOutputStream(completeFilePath);
??fos.write(contents);
??//return "theXpdl";
??FileDescriptor theFd = fos.getFD();
??return true;
?}
???????????這段大家自己看看API理解吧。Shark的API是非常方便的。輸出使用FileOutputStream。這里
在頁面上我是這樣寫的。把一些屬性放到map中然后做為request傳遞。早知道就用packageDownload了。
????????????? HashMap[] hm=(HashMap[])request.getAttribute("packages");
????????? for(int i=0;i<hm.length;i++)
?????????????????????????? {
?????????????????????? ??field_1=(String)hm[i].get("packageId");
??????????????????????? ?field_2=hm[i].get("isPackageOpened").toString();
??????????????????????????????????????? byte[] b= (byte[])hm[i].get("packageContent");
??????????????????????????????????????? FileOutputStream fs = new FileOutputStream("c:\\"+field_1+".xml");
??????????????????????????????????????? fs.write(b);
??????????????????????????????????????? fs.close();
????????????????????????????}
???????????? 做為xml保存,使用dom來修改,放棄jawe的swing界面,在頁面上修改流程。。。這是不得以而
為之的辦法。
????? That's all for today~
????? 接著昨天的來吧。??昨天說道xpdl文件作為package的形式裝載入shark之中。一個xpdl文件中是由
? 角色(role)來分配任務(wù)的,如下圖所示

這里面有三個角色,報銷人,部門經(jīng)理,財務(wù)。
??????? 來到shark中,選擇user management這個tab,進入第一個sub tab?--Account。在這里添加用戶吧,點擊下方的"new"按鈕,彈出對話框。這里我們只用填寫"user name"和"password"項即可。"group
name"項若填寫,就是新建一個group,用戶作為一個group user存在。若不填寫,用戶僅做為一個single
user存在。(group是存放用戶的集合,在用戶和角色的映射中可以直接當(dāng)作用戶來映射,相當(dāng)于把
集合中的全部用戶都映射到同一角色。)
???????? 說到映射,shark是相當(dāng)靈活的。點擊user management中的第三個sub tab --Mapping。現(xiàn)在里面什么都沒有。點擊下方的"Add"按鈕。彈出一個對話框。左側(cè)的是"Role List",右側(cè)是"User List"。當(dāng)然,我們先要把package加載進去后,角色列表才出的來哦。User List中有我們剛才加入的用戶。如果剛才創(chuàng)建了group的話,group也做為一個user存在。選擇一個角色和用戶,點擊下方的"Apply"按鈕,就成功創(chuàng)建了一條映射。我們可以把一個角色映射到多個用戶上(等效于映射到一個group上,用戶很多的時候就創(chuàng)建group吧。)。也可以把多個角色映射到一個用戶上。完成后關(guān)閉對話框。現(xiàn)在Mapping這個tab中就有我們剛才添加的映射了。
????? 最后我們來到Worklist?management這個tab。在select user這個下拉框中選擇第一步的role對應(yīng)的角色。不好表述,就是做第一條流程的用戶了。選中后就出現(xiàn)一條待辦工作。如下圖

???????
???????? Oh yeah!我們還是先用這個用戶登陸吧。來到這個tab,當(dāng)點選前方checkbox后,用戶的worklist狀態(tài)就由open.not_start.not_running改變成為running了。后面的計時器(Duration)也開始計時。點擊下方的"update variable(s)"來完成表單,最后點擊"Complete"提交。一件待辦工作就完成了,下個用戶再登陸重復(fù)這個步驟即可。
??????? 這個界面還有個"Reassign"按鈕,相當(dāng)于"公文轉(zhuǎn)發(fā)",把自己手上的事情交給另一個用戶來辦。
只要不點擊"complete",一個步驟可以反復(fù)assign到多個用戶,當(dāng)然,這些用戶必須先映射到相同的role
上才行。細節(jié)就不多說了,大家自己試試吧。
????? swing界面比較簡陋,但是基本功能都有,明天我們來構(gòu)建web系統(tǒng)。
?? 為什么都是斜體字?誰能告訴我??