package org.fireflow.demo.workflow.ext;
import java.util.Enumeration;
import javax.servlet.ServletContext;
import org.fireflow.demo.MainModule;
import org.fireflow.demo.misc.Utils;
import org.fireflow.engine.entity.runtime.ActivityInstance;
import org.fireflow.engine.modules.instancemanager.event.AbsActivityInstanceEventListener;
import org.fireflow.engine.modules.instancemanager.event.ActivityInstanceEvent;
import org.fireflow.pdl.fpdl.process.Activity;
import org.nutz.dao.Chain;
import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
import org.nutz.ioc.Ioc;
import org.nutz.log.Log;
import org.nutz.log.Logs;
import org.nutz.mvc.Mvcs;
public class OnActivityCreatedListener extends AbsActivityInstanceEventListener {
public static final String PROCESS_STATUS = "PROCESS_STATUS";
public static final String TABLE_NAME = "TABLE_NAME";
public static final String TABLE_COLUMN = "processStatus";
public static final String CODE = "CODE";
public static final String CLASS_NAME = "CLASS_NAME";
private String daoBeanName = MainModule.DAO_BEAN_NAME;
Dao dao = null;
private static final Log log = Logs.get();
@Override
protected void onActivityInstanceCreated(ActivityInstanceEvent e) {
ActivityInstance activityInstance = e.getSource();
Activity activity = (Activity)e.getWorkflowElement();
if (activity==null)return;
String className = activity.getExtendedAttribute(CLASS_NAME);
if (className==null || className.trim().equals("")){
return;//什么都不做
}
try {
Class dealClass = Class.forName(className);
String bizId = activityInstance.getBizId();
String processStatus = activity.getExtendedAttribute(PROCESS_STATUS);
if (processStatus==null || processStatus.trim().equals("")){
processStatus = activity.getDisplayName();
}
String code = activity.getExtendedAttribute(CODE);
if(code == null && "".equals(code.trim())){
return;
}
//TODO 根据tableName,bizId,更新数据库的processStatus字段
//dao()..update(tableName, chain, cnd);
dao().update(dealClass, Chain.make(TABLE_COLUMN, processStatus), Cnd.where(code, "=", bizId));
//dao().update(tableName, Chain.make(TABLE_COLUMN, processStatus), Cnd.where(code, "=", bizId));
super.onActivityInstanceCreated(e);
} catch (ClassNotFoundException e1) {
log.error(Utils.exceptionStackToString(e1));
}
}
public void setDao(Dao dao) {
this.dao = dao;
}
@SuppressWarnings("unchecked")
public Dao dao() {
if (dao == null) {
ServletContext servletContext = Mvcs.getServletContext();
if (servletContext != null) {
//也行我能直接拿到Ioc容器
Ioc ioc = Mvcs.getIoc();
if (ioc != null) {
dao = ioc.get(Dao.class, daoBeanName);
return dao;
}
else {
//Search in servletContext.attr
Enumeration<String> names = servletContext.getAttributeNames();
while (names.hasMoreElements()) {
String attrName = (String) names.nextElement();
Object obj = servletContext.getAttribute(attrName);
if (obj instanceof Ioc) {
dao = ((Ioc)obj).get(Dao.class, daoBeanName);
return dao;
}
}
//还是没找到? 试试新版Mvcs.ctx
ioc = Mvcs.ctx.getDefaultIoc();
if (ioc != null) {
dao = ioc.get(Dao.class, daoBeanName);
return dao;
}
}
}
throw new RuntimeException("NutDao not found!!");
}
return dao;
}
}