切面

来源:互联网 发布:免费交友恋爱软件 编辑:程序博客网 时间:2024/05/16 17:58
package com.winssage.bpm.module.bpmcommon.aspect;import java.lang.reflect.Method;import java.util.Iterator;import java.util.List;import java.util.Map;import org.apache.commons.lang.StringUtils;import org.aspectj.lang.ProceedingJoinPoint;import org.aspectj.lang.Signature;import org.aspectj.lang.annotation.Around;import org.aspectj.lang.annotation.Aspect;import org.aspectj.lang.annotation.Pointcut;import org.aspectj.lang.reflect.MethodSignature;import com.winssage.bpm.module.bpmbase.domain.TodoTask;import com.winssage.bpm.module.bpmcommon.biz.IProcessEngineBiz;import com.winssage.bpm.module.bpmcommon.vo.CommentVo;import com.winssage.framework.server.action.BaseAction;import com.winssage.framework.server.aspect.BaseActionAspect;import com.winssage.framework.server.exception.ActionException;import com.winssage.framework.util.JsonUtils;@Aspectpublic class ProcessActionAspect extends BaseActionAspect {private IProcessEngineBiz processEngineBiz;public IProcessEngineBiz getProcessEngineBiz() {return processEngineBiz;}public void setProcessEngineBiz(IProcessEngineBiz processEngineBiz) {this.processEngineBiz = processEngineBiz;}@Pointcut("execution(* com.winssage.bpm.module.bpmcommon.aspect.IProcessAction+.process*(..))")public void processCall() {}// 环绕通知@Around("com.winssage.bpm.module.bpmcommon.aspect.ProcessActionAspect.processCall()")public Object aroundProcessCall(ProceedingJoinPoint pjp) throws Throwable {Object obj = null;//1,执行前准备logger.debug("执行前log");Object target = pjp.getTarget();Signature signature = pjp.getSignature();   MethodSignature methodSignature = (MethodSignature) signature;   Method method = methodSignature.getMethod();   String methodName = (String)method.getName();this.beforeInvoke(methodName,target);//2,执行obj = pjp.proceed();//3,执行后准备logger.debug("执行后log");this.afterInvoke(methodName,target);return obj;}protected void beforeInvoke(String methodName,Object target) {BaseAction baseAction = (BaseAction) target;IProcessAction processAction = (IProcessAction) target;//从request中获取值放入processActionParameter中的值ProcessActionParameter processActionParameter = new ProcessActionParameter();this.injectAction(processActionParameter, baseAction.getServletRequest(), baseAction.getSession());//通过processEngineBiz获取当前actionName对应的processActionconfig,并设置相关的内容processEngineBiz.fillProcessActionParameter(processActionParameter);processActionParameter.setCurrentUserName(baseAction.getUserName());//如果method名方法是process开头   根据processInstanceId获得businessIdif(methodName != null  && methodName.startsWith("process")) {if(StringUtils.isEmpty(processActionParameter.getBusinessId())) {String businessId = processEngineBiz.getBusinessIdByProcessInstanceId(processActionParameter.getProcessInstanceId());processActionParameter.setBusinessId(businessId);}}//根据processInstanceId获取流程意见列表  2011-09-09 杨旭新增if(methodName != null  && methodName.startsWith("processShow")) {List<CommentVo> comments = processEngineBiz.getCommentVoListByProcessInstanceId(processActionParameter.getProcessInstanceId());processActionParameter.setCommentList(comments);}//将processActionConfig设置进processAction中processAction.setProcessActionParameter(processActionParameter);//覃争鸣20111124增加//根据processActionParameter中的previousParameter设置到request中String previousParameter = processActionParameter.getPreviousParameter();logger.debug("转换前previousParameter是" + previousParameter);if(!StringUtils.isEmpty(previousParameter)) {Map<String,Object> previousParameterMap = JsonUtils.json2Map(previousParameter);int index = 0;for(Iterator i = previousParameterMap.keySet().iterator(); i.hasNext();index ++) {String key = (String)i.next();String value = (String)previousParameterMap.get(key);logger.debug("转换后previousParameter[" + index + "]是:" + key + "," + value);}this.injectAction(target, previousParameterMap);}if(methodName != null  && methodName.equals("processExecute")) {//覃争鸣20120524增加//防止同时创建两条在运行的流程,也是防止重复提交//如果当前在起草环节,已有一个流程实例在运行,则不能重新提交if(processActionParameter.getIsDraft() == true && true == this.processEngineBiz.isInProcess(processActionParameter.getProcessDefinitionName(), processActionParameter.getBusinessId())) {throw new ActionException("已有流程实例在运行,不能提交下一处理。");}//杨旭20120308增加//防止重复提交String taskIdStr = processActionParameter.getProcessTaskId();if(StringUtils.isNotEmpty(taskIdStr)){Long jbpmTaskId = Long.parseLong(taskIdStr);TodoTask todoTask = processEngineBiz.getTodoTaskByJbmpTaskId(jbpmTaskId);if(todoTask == null){throw new ActionException("流程已提交,不能重复提交。");}}//TODO 根据processVariables设置变量到processActionParameter中的variables//是否需要分两个函数设置当前流程节点变量和流程全局变量}}protected void afterInvoke(String methodName,Object target) {BaseAction baseAction = (BaseAction) target;IProcessAction processAction = (IProcessAction) target;ProcessActionParameter processActionParameter = processAction.getProcessActionParameter();this.rejectAction(processActionParameter,  baseAction.getServletRequest());}}


 

原创粉丝点击