package com.cmm;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.jbpm.JbpmException;
import org.jbpm.graph.def.ActionHandler;
import org.jbpm.graph.def.Event;
import org.jbpm.graph.exe.ExecutionContext;
/**
* 是所有Cmm任务的基类。
* 一个cmm任务在流程定义的时候一定是按如下定义格式进行定义的(这是定义的最下格式,还可以添加jbpm支持的属性等内容):
* <task name="#{任务名,例如:task1}">
* <event type="task-start">
* <action class="#{CmmTask的子类,例如:com.cmm.CmmTask1}" config-type="configuration-property">
* <!--以下部分为在建模的时候对CmmTask的之类进行自定义的地方,相应的内容会以参数的形式传递给子类实现的setConfiguration()方法-->
* <name>dust</name>
* <count>20</count>
* <entity>
* <name>elena</name>
* <count>30</count>
* </entity>
* <!--自定义内容结束-->
* </action>
* </event>
* <event type="task-end">
* <action class="com.cmm.CmmTask1" config-type="constructor">
* </action>
* </event>
* </task>
* @author 吴大愚
* @time 2006-11-27
*/
public abstract class CmmTask implements ActionHandler {
/**
* 在对cmmTask保存状态时,需要的CmmTask的id
*/
protected long loadId=-1;
public void execute(ExecutionContext executionContext) throws Exception {
// TODO Auto-generated method stub
Event event=executionContext.getEvent();
if(event.getEventType().compareTo(Event.EVENTTYPE_TASK_START)==0)
{
//做cmmTask1任务初始化的操作
startExecute(executionContext);
this.save();
}
else if(event.getEventType().compareTo( Event.EVENTTYPE_TASK_END)==0)
{
if(this.loadId ==-1){
throw new Exception("no assign value to loadid before call endExecute()!");
}
this.load(loadId );
//做cmmTask1任务结束的操作
endExecute(executionContext);
}
else{
throw new Exception("cmmTask1 event wrong!");
}
}
/**
* 暂停执行任务,保存状态
* @throws Exception
*/
public void pause()throws Exception{
this.save();
}
/**
* 恢复执行任务的状态
* @param id CmmTask的Id
* @throws Exception
*/
public void resume(long id) throws Exception{
load(id);
}
/**
* 恢复执行任务的状态,在调此方法前,需要在带参数的构造函数中对loadId赋值
* @throws Exception
*/
public void resume() throws Exception{
if(this.loadId ==-1){
throw new Exception("no assign value to loadid before load a CmmTask!");
}
load(this.loadId);
}
//=======继承类需要实现的方法==================================
/**
* 实现一个默认构造函数
*/
public CmmTask(){}
/**
* 实现一个带一个String类型参数的构造函数,并且在此构造函数中要取得load操作所需要的CmmTask的id
* @param text
*/
public CmmTask(String text){}
/**
* 初始化
* @param configuration
* @throws Exception
*/
public abstract void setConfiguration(String configuration) throws Exception;
/**
* 做cmmTask任务初始化的操作
* @param executionContext
* @throws Exception
* */
protected abstract void startExecute(ExecutionContext executionContext) throws Exception ;
/**
* 做cmmTask任务结束的操作
* @param executionContext
* @throws Exception
* */
protected abstract void endExecute(ExecutionContext arg0) throws Exception ;
/**
* 将此对象持久化,保存状态
* @throws Exception
*/
protected abstract void save() throws Exception;
/**
* 读取此对象状态
* @param id
* @throws Exception
*/
protected abstract void load(long id) throws Exception;
//===========便利方法===============================================
protected Element parseConfiguration(String configuration) {
Element element = null;
try {
element = DocumentHelper.parseText( "<cmmtask>"+configuration+"</cmmtask>" ).getRootElement();
} catch (DocumentException e) {
log.error( "couldn't parse bean configuration : " + configuration, e );
throw new JbpmException(e);
}
return element;
}
private static final Log log = LogFactory.getLog(CmmTask.class);
}