package com.mossle.bpm.listener; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import javax.annotation.Resource; import com.mossle.bpm.expr.Expr; import com.mossle.bpm.expr.ExprProcessor; import com.mossle.bpm.support.DefaultTaskListener; import com.mossle.core.mapper.BeanMapper; import com.mossle.spi.process.InternalProcessConnector; import com.mossle.spi.process.ParticipantDefinition; import com.mossle.spi.process.ProcessTaskDefinition; import org.activiti.engine.delegate.DelegateTask; import org.activiti.engine.impl.context.Context; import org.activiti.engine.impl.el.ExpressionManager; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.jdbc.core.JdbcTemplate; public class HumanTaskUserTaskListener extends DefaultTaskListener implements ExprProcessor { private static Logger logger = LoggerFactory .getLogger(HumanTaskUserTaskListener.class); private InternalProcessConnector internalProcessConnector; private BeanMapper beanMapper = new BeanMapper(); private JdbcTemplate jdbcTemplate; @Override public void onCreate(DelegateTask delegateTask) throws Exception { String processDefinitionId = delegateTask.getProcessDefinitionId(); String businessKey = delegateTask.getExecution() .getProcessBusinessKey(); String taskDefinitionKey = delegateTask.getExecution() .getCurrentActivityId(); ProcessTaskDefinition processTaskDefinition = internalProcessConnector .findTaskDefinition(processDefinitionId, businessKey, taskDefinitionKey); ExpressionManager expressionManager = Context .getProcessEngineConfiguration().getExpressionManager(); for (ParticipantDefinition participantDefinition : processTaskDefinition .getParticipantDefinitions()) { if ("user".equals(participantDefinition.getType())) { if ("add".equals(participantDefinition.getStatus())) { delegateTask.addCandidateUser(participantDefinition .getValue()); } else { delegateTask.deleteCandidateUser(participantDefinition .getValue()); } } else { if ("add".equals(participantDefinition.getStatus())) { delegateTask.addCandidateGroup(participantDefinition .getValue()); } else { delegateTask.deleteCandidateGroup(participantDefinition .getValue()); } } } String assignee = null; if (processTaskDefinition.getAssignee() != null) { assignee = expressionManager .createExpression(processTaskDefinition.getAssignee()) .getValue(delegateTask).toString(); } if (assignee == null) { delegateTask.setAssignee(null); } else if ((assignee.indexOf("&&") != -1) || (assignee.indexOf("||") != -1)) { logger.debug("assignee : {}", assignee); List<String> candidateUsers = new Expr().evaluate(assignee, this); logger.debug("candidateUsers : {}", candidateUsers); delegateTask.addCandidateUsers(candidateUsers); } else { delegateTask.setAssignee(assignee); } } public List<String> process(List<String> left, List<String> right, String operation) { if ("||".equals(operation)) { Set<String> set = new HashSet(); set.addAll(left); set.addAll(right); return new ArrayList<String>(set); } else if ("&&".equals(operation)) { List<String> list = new ArrayList<String>(); for (String username : left) { if (right.contains(username)) { list.add(username); } } return list; } else { throw new UnsupportedOperationException(operation); } } public List<String> process(String text) { String sql = "select child.NAME from PARTY_ENTITY parent,PARTY_STRUCT ps,PARTY_ENTITY child,PARTY_TYPE child_type" + " where parent.ID=ps.PARENT_ENTITY_ID and ps.CHILD_ENTITY_ID=child.ID and child.TYPE_ID=child_type.ID" + " and child_type.PERSON=1 and parent.NAME=?"; List<Map<String, Object>> list = jdbcTemplate.queryForList(sql, text); List<String> usernames = new ArrayList<String>(); for (Map<String, Object> map : list) { usernames.add(map.get("name").toString().toLowerCase()); } logger.info("usernames : {}", usernames); return usernames; } @Resource public void setInternalProcessConnector( InternalProcessConnector internalProcessConnector) { this.internalProcessConnector = internalProcessConnector; } @Resource public void setJdbcTemplate(JdbcTemplate jdbcTemplate) { this.jdbcTemplate = jdbcTemplate; } }