Java tutorial
/** * OpenKM, Open Document Management System (http://www.openkm.com) * Copyright (c) 2006-2011 Paco Avila & Josep Llort * * No bytes were intentionally harmed during the development of this application. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ package com.openkm.module.direct; import java.awt.AlphaComposite; import java.awt.Color; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.image.BufferedImage; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.zip.ZipInputStream; import javax.imageio.ImageIO; import javax.jcr.Session; import org.apache.commons.io.IOUtils; import org.jbpm.JbpmContext; import org.jbpm.JbpmException; import org.jbpm.db.GraphSession; import org.jbpm.db.TaskMgmtSession; import org.jbpm.file.def.FileDefinition; import org.jbpm.taskmgmt.exe.TaskMgmtInstance; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.openkm.bean.form.FormElement; import com.openkm.bean.workflow.ProcessDefinition; import com.openkm.bean.workflow.ProcessInstance; import com.openkm.bean.workflow.TaskInstance; import com.openkm.bean.workflow.Token; import com.openkm.core.DatabaseException; import com.openkm.core.JcrSessionManager; import com.openkm.core.ParseException; import com.openkm.core.RepositoryException; import com.openkm.core.WorkflowException; import com.openkm.jcr.JCRUtils; import com.openkm.module.WorkflowModule; import com.openkm.module.base.BaseWorkflowModule; import com.openkm.util.FormUtils; import com.openkm.util.JBPMUtils; import com.openkm.util.UserActivity; import com.openkm.util.WorkflowUtils; public class DirectWorkflowModule implements WorkflowModule { private static Logger log = LoggerFactory.getLogger(DirectWorkflowModule.class); @Override public void registerProcessDefinition(String token, InputStream is) throws ParseException, RepositoryException, WorkflowException, DatabaseException, IOException { log.debug("registerProcessDefinition({}, {})", token, is); JbpmContext jbpmContext = JBPMUtils.getConfig().createJbpmContext(); InputStream isForms = null; ZipInputStream zis = null; Session session = null; try { if (token == null) { session = JCRUtils.getSession(); } else { session = JcrSessionManager.getInstance().get(token); } zis = new ZipInputStream(is); org.jbpm.graph.def.ProcessDefinition processDefinition = org.jbpm.graph.def.ProcessDefinition .parseParZipInputStream(zis); // Check xml form definition FileDefinition fileDef = processDefinition.getFileDefinition(); isForms = fileDef.getInputStream("forms.xml"); FormUtils.parseWorkflowForms(isForms); // If it is ok, deploy it jbpmContext.deployProcessDefinition(processDefinition); // Activity log UserActivity.log(session.getUserID(), "REGISTER_PROCESS_DEFINITION", null, null); } catch (javax.jcr.RepositoryException e) { throw new RepositoryException(e.getMessage(), e); } catch (JbpmException e) { throw new WorkflowException(e.getMessage(), e); } finally { if (token == null) JCRUtils.logout(session); IOUtils.closeQuietly(isForms); IOUtils.closeQuietly(zis); jbpmContext.close(); } log.debug("registerProcessDefinition: void"); } @Override public void deleteProcessDefinition(String token, long processDefinitionId) throws RepositoryException, DatabaseException, WorkflowException { log.debug("deleteProcessDefinition({}, {})", token, processDefinitionId); JbpmContext jbpmContext = JBPMUtils.getConfig().createJbpmContext(); Session session = null; try { if (token == null) { session = JCRUtils.getSession(); } else { session = JcrSessionManager.getInstance().get(token); } GraphSession graphSession = jbpmContext.getGraphSession(); graphSession.deleteProcessDefinition(processDefinitionId); jbpmContext.getSession().flush(); // Activity log UserActivity.log(session.getUserID(), "DELETE_PROCESS_DEFINITION", "" + processDefinitionId, null); } catch (javax.jcr.RepositoryException e) { throw new RepositoryException(e.getMessage(), e); } catch (JbpmException e) { throw new WorkflowException(e.getMessage(), e); } finally { if (token == null) JCRUtils.logout(session); jbpmContext.close(); } log.debug("deleteProcessDefinition: void"); } @Override public ProcessDefinition getProcessDefinition(String token, long processDefinitionId) throws RepositoryException, DatabaseException, WorkflowException { log.debug("getProcessDefinition({}, {})", token, processDefinitionId); JbpmContext jbpmContext = JBPMUtils.getConfig().createJbpmContext(); ProcessDefinition vo = new ProcessDefinition(); Session session = null; try { if (token == null) { session = JCRUtils.getSession(); } else { session = JcrSessionManager.getInstance().get(token); } GraphSession graphSession = jbpmContext.getGraphSession(); org.jbpm.graph.def.ProcessDefinition pd = graphSession.getProcessDefinition(processDefinitionId); vo = WorkflowUtils.copy(pd); // Activity log UserActivity.log(session.getUserID(), "GET_PROCESS_DEFINITION", "" + processDefinitionId, null); } catch (javax.jcr.RepositoryException e) { throw new RepositoryException(e.getMessage(), e); } catch (JbpmException e) { throw new WorkflowException(e.getMessage(), e); } finally { if (token == null) JCRUtils.logout(session); jbpmContext.close(); } log.debug("getProcessDefinition: {}", vo); return vo; } @Override public byte[] getProcessDefinitionImage(String token, long processDefinitionId, String node) throws RepositoryException, DatabaseException, WorkflowException { log.debug("getProcessDefinitionImage({}, {}, {})", new Object[] { token, processDefinitionId, node }); JbpmContext jbpmContext = JBPMUtils.getConfig().createJbpmContext(); byte[] image = null; Session session = null; try { if (token == null) { session = JCRUtils.getSession(); } else { session = JcrSessionManager.getInstance().get(token); } GraphSession graphSession = jbpmContext.getGraphSession(); org.jbpm.graph.def.ProcessDefinition pd = graphSession.getProcessDefinition(processDefinitionId); FileDefinition fileDef = pd.getFileDefinition(); WorkflowUtils.DiagramInfo dInfo = WorkflowUtils.getDiagramInfo(fileDef.getInputStream("gpd.xml")); WorkflowUtils.DiagramNodeInfo dNodeInfo = dInfo.getNodeMap().get(node); BufferedImage img = ImageIO.read(fileDef.getInputStream("processimage.jpg")); // Obtain all nodes Y List<Integer> ordenadas = new ArrayList<Integer>(); for (WorkflowUtils.DiagramNodeInfo nodeInfo : dInfo.getNodeMap().values()) { ordenadas.add(nodeInfo.getY()); } // Calculate minimal Y Collections.sort(ordenadas); int fix = ordenadas.get(0); if (dNodeInfo != null) { // Select node log.debug("DiagramNodeInfo: {}", dNodeInfo); Graphics g = img.getGraphics(); Graphics2D g2d = (Graphics2D) g; g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.25F)); g2d.setColor(Color.blue); g2d.fillRect(dNodeInfo.getX(), dNodeInfo.getY() - fix, dNodeInfo.getWidth(), dNodeInfo.getHeight()); g.dispose(); } ByteArrayOutputStream baos = new ByteArrayOutputStream(); ImageIO.write(img, "jpg", baos); image = baos.toByteArray(); baos.flush(); baos.close(); // Activity log UserActivity.log(session.getUserID(), "GET_PROCESS_DEFINITION_IMAGE", "" + processDefinitionId, null); } catch (javax.jcr.RepositoryException e) { throw new RepositoryException(e.getMessage(), e); } catch (JbpmException e) { throw new WorkflowException(e.getMessage(), e); } catch (IOException e) { throw new WorkflowException(e.getMessage(), e); } finally { if (token == null) JCRUtils.logout(session); jbpmContext.close(); } log.debug("getProcessDefinitionImage: {}", image); return image; } @Override public Map<String, List<FormElement>> getProcessDefinitionForms(String token, long processDefinitionId) throws ParseException, RepositoryException, DatabaseException, WorkflowException { log.debug("getProcessDefinitionForms({}, {})", token, processDefinitionId); //long begin = Calendar.getInstance().getTimeInMillis(); JbpmContext jbpmContext = JBPMUtils.getConfig().createJbpmContext(); Map<String, List<FormElement>> forms = new HashMap<String, List<FormElement>>(); InputStream is = null; Session session = null; try { if (token == null) { session = JCRUtils.getSession(); } else { session = JcrSessionManager.getInstance().get(token); } GraphSession graphSession = jbpmContext.getGraphSession(); org.jbpm.graph.def.ProcessDefinition pd = graphSession.getProcessDefinition(processDefinitionId); FileDefinition fileDef = pd.getFileDefinition(); is = fileDef.getInputStream("forms.xml"); if (is != null) { forms = FormUtils.parseWorkflowForms(is); is.close(); } else { log.warn("Process definition '{}' has no forms.xml file", processDefinitionId); } // Activity log UserActivity.log(session.getUserID(), "GET_PROCESS_DEFINITION_FORMS", processDefinitionId + "", null); } catch (javax.jcr.RepositoryException e) { throw new RepositoryException(e.getMessage(), e); } catch (JbpmException e) { throw new WorkflowException(e.getMessage(), e); } catch (IOException e) { throw new WorkflowException(e.getMessage(), e); } finally { if (token == null) JCRUtils.logout(session); IOUtils.closeQuietly(is); jbpmContext.close(); } log.debug("getProcessDefinitionForms: {}", forms); //log.info("Time: "+(Calendar.getInstance().getTimeInMillis()-begin)+" ms"); return forms; } @Override public ProcessInstance runProcessDefinition(String token, long processDefinitionId, String uuid, List<FormElement> variables) throws RepositoryException, DatabaseException, WorkflowException { log.debug("runProcessDefinition({}, {}, {})", new Object[] { token, processDefinitionId, variables }); JbpmContext jbpmContext = JBPMUtils.getConfig().createJbpmContext(); ProcessInstance vo = new ProcessInstance(); Session session = null; try { if (token == null) { session = JCRUtils.getSession(); } else { session = JcrSessionManager.getInstance().get(token); } vo = BaseWorkflowModule.runProcessDefinition(session, jbpmContext, processDefinitionId, uuid, variables); // Activity log UserActivity.log(session.getUserID(), "RUN_PROCESS_DEFINITION", "" + processDefinitionId, variables.toString()); } catch (javax.jcr.RepositoryException e) { throw new RepositoryException(e.getMessage(), e); } catch (JbpmException e) { throw new WorkflowException(e.getMessage(), e); } finally { if (token == null) JCRUtils.logout(session); jbpmContext.close(); } log.debug("runProcessDefinition: {}", vo); return vo; } @Override public ProcessInstance sendProcessInstanceSignal(String token, long processInstanceId, String transitionName) throws RepositoryException, DatabaseException, WorkflowException { log.debug("sendProcessInstanceSignal({}, {}, {})", new Object[] { token, processInstanceId, transitionName }); JbpmContext jbpmContext = JBPMUtils.getConfig().createJbpmContext(); ProcessInstance vo = new ProcessInstance(); Session session = null; try { if (token == null) { session = JCRUtils.getSession(); } else { session = JcrSessionManager.getInstance().get(token); } GraphSession graphSession = jbpmContext.getGraphSession(); org.jbpm.graph.exe.ProcessInstance pi = graphSession.getProcessInstance(processInstanceId); org.jbpm.graph.exe.Token t = pi.getRootToken(); if (transitionName != null && !transitionName.equals("")) { t.signal(transitionName); } else { t.signal(); } jbpmContext.getSession().flush(); vo = WorkflowUtils.copy(pi); // Activity log UserActivity.log(session.getUserID(), "SEND_PROCESS_INSTANCE_SIGNAL", "" + processInstanceId, transitionName); } catch (javax.jcr.RepositoryException e) { throw new RepositoryException(e.getMessage(), e); } catch (JbpmException e) { throw new WorkflowException(e.getMessage(), e); } finally { if (token == null) JCRUtils.logout(session); jbpmContext.close(); } log.debug("sendProcessInstanceSignal: {}", vo); return vo; } @Override public void endProcessInstance(String token, long processInstanceId) throws RepositoryException, DatabaseException, WorkflowException { log.debug("endProcessInstance({}, {})", token, processInstanceId); JbpmContext jbpmContext = JBPMUtils.getConfig().createJbpmContext(); Session session = null; try { if (token == null) { session = JCRUtils.getSession(); } else { session = JcrSessionManager.getInstance().get(token); } GraphSession graphSession = jbpmContext.getGraphSession(); graphSession.getProcessInstance(processInstanceId).end(); jbpmContext.getSession().flush(); // Activity log UserActivity.log(session.getUserID(), "END_PROCESS_INSTANCE", "" + processInstanceId, null); } catch (javax.jcr.RepositoryException e) { throw new RepositoryException(e.getMessage(), e); } catch (JbpmException e) { throw new WorkflowException(e.getMessage(), e); } finally { if (token == null) JCRUtils.logout(session); jbpmContext.close(); } log.debug("endProcessInstance: void"); } @Override public void deleteProcessInstance(String token, long processInstanceId) throws RepositoryException, DatabaseException, WorkflowException { log.debug("deleteProcessInstance({}, {})", token, processInstanceId); JbpmContext jbpmContext = JBPMUtils.getConfig().createJbpmContext(); Session session = null; try { if (token == null) { session = JCRUtils.getSession(); } else { session = JcrSessionManager.getInstance().get(token); } GraphSession graphSession = jbpmContext.getGraphSession(); graphSession.deleteProcessInstance(processInstanceId); jbpmContext.getSession().flush(); // Activity log UserActivity.log(session.getUserID(), "DELETE_PROCESS_INSTANCE", "" + processInstanceId, null); } catch (javax.jcr.RepositoryException e) { throw new RepositoryException(e.getMessage(), e); } catch (JbpmException e) { throw new WorkflowException(e.getMessage(), e); } finally { if (token == null) JCRUtils.logout(session); jbpmContext.close(); } log.debug("deleteProcessInstance: void"); } @Override @SuppressWarnings("rawtypes") public List<ProcessInstance> findProcessInstances(String token, long processDefinitionId) throws RepositoryException, DatabaseException, WorkflowException { log.debug("findProcessInstances({}, {})", token, processDefinitionId); JbpmContext jbpmContext = JBPMUtils.getConfig().createJbpmContext(); List<ProcessInstance> al = new ArrayList<ProcessInstance>(); Session session = null; try { if (token == null) { session = JCRUtils.getSession(); } else { session = JcrSessionManager.getInstance().get(token); } GraphSession graphSession = jbpmContext.getGraphSession(); for (Iterator it = graphSession.findProcessInstances(processDefinitionId).iterator(); it.hasNext();) { al.add(WorkflowUtils.copy((org.jbpm.graph.exe.ProcessInstance) it.next())); } // Activity log UserActivity.log(session.getUserID(), "FIND_PROCESS_INSTANCES", "" + processDefinitionId, null); } catch (javax.jcr.RepositoryException e) { throw new RepositoryException(e.getMessage(), e); } catch (JbpmException e) { throw new WorkflowException(e.getMessage(), e); } finally { if (token == null) JCRUtils.logout(session); jbpmContext.close(); } log.debug("findProcessInstances: {}", al); return al; } @Override @SuppressWarnings("rawtypes") public List<ProcessDefinition> findAllProcessDefinitions(String token) throws RepositoryException, DatabaseException, WorkflowException { log.debug("findAllProcessDefinitions({})", token); JbpmContext jbpmContext = JBPMUtils.getConfig().createJbpmContext(); List<ProcessDefinition> al = new ArrayList<ProcessDefinition>(); Session session = null; try { if (token == null) { session = JCRUtils.getSession(); } else { session = JcrSessionManager.getInstance().get(token); } GraphSession graphSession = jbpmContext.getGraphSession(); for (Iterator it = graphSession.findAllProcessDefinitions().iterator(); it.hasNext();) { al.add(WorkflowUtils.copy((org.jbpm.graph.def.ProcessDefinition) it.next())); } // Activity log UserActivity.log(session.getUserID(), "FIND_ALL_PROCESS_DEFINITIONS", null, null); } catch (javax.jcr.RepositoryException e) { throw new RepositoryException(e.getMessage(), e); } catch (JbpmException e) { throw new WorkflowException(e.getMessage(), e); } finally { if (token == null) JCRUtils.logout(session); jbpmContext.close(); } log.debug("findAllProcessDefinitions: {}", al); return al; } @Override @SuppressWarnings("rawtypes") public List<ProcessDefinition> findLatestProcessDefinitions(String token) throws RepositoryException, DatabaseException, WorkflowException { log.debug("findLatestProcessDefinitions({})", token); JbpmContext jbpmContext = JBPMUtils.getConfig().createJbpmContext(); List<ProcessDefinition> al = new ArrayList<ProcessDefinition>(); Session session = null; try { if (token == null) { session = JCRUtils.getSession(); } else { session = JcrSessionManager.getInstance().get(token); } GraphSession graphSession = jbpmContext.getGraphSession(); for (Iterator it = graphSession.findLatestProcessDefinitions().iterator(); it.hasNext();) { al.add(WorkflowUtils.copy((org.jbpm.graph.def.ProcessDefinition) it.next())); } // Activity log UserActivity.log(session.getUserID(), "FIND_LATEST_PROCESS_DEFINITIONS", null, null); } catch (javax.jcr.RepositoryException e) { throw new RepositoryException(e.getMessage(), e); } catch (JbpmException e) { throw new WorkflowException(e.getMessage(), e); } finally { if (token == null) JCRUtils.logout(session); jbpmContext.close(); } log.debug("findLatestProcessDefinitions: {}", al); return al; } @Override @SuppressWarnings("rawtypes") public List<ProcessDefinition> findAllProcessDefinitionVersions(String token, String name) throws RepositoryException, DatabaseException, WorkflowException { log.debug("findAllProcessDefinitionVersions({}, {})", token, name); JbpmContext jbpmContext = JBPMUtils.getConfig().createJbpmContext(); List<ProcessDefinition> al = new ArrayList<ProcessDefinition>(); Session session = null; try { if (token == null) { session = JCRUtils.getSession(); } else { session = JcrSessionManager.getInstance().get(token); } GraphSession graphSession = jbpmContext.getGraphSession(); for (Iterator it = graphSession.findAllProcessDefinitionVersions(name).iterator(); it.hasNext();) { al.add(WorkflowUtils.copy((org.jbpm.graph.def.ProcessDefinition) it.next())); } // Activity log UserActivity.log(session.getUserID(), "FIND_ALL_PROCESS_DEFINITION_VERSIONS", name, null); } catch (javax.jcr.RepositoryException e) { throw new RepositoryException(e.getMessage(), e); } catch (JbpmException e) { throw new WorkflowException(e.getMessage(), e); } finally { if (token == null) JCRUtils.logout(session); jbpmContext.close(); } log.debug("findAllProcessDefinitionVersions: {}", al); return al; } @Override public ProcessInstance getProcessInstance(String token, long processInstanceId) throws RepositoryException, DatabaseException, WorkflowException { log.debug("getProcessInstance({}, {})", token, processInstanceId); JbpmContext jbpmContext = JBPMUtils.getConfig().createJbpmContext(); ProcessInstance vo = new ProcessInstance(); Session session = null; try { if (token == null) { session = JCRUtils.getSession(); } else { session = JcrSessionManager.getInstance().get(token); } GraphSession graphSession = jbpmContext.getGraphSession(); org.jbpm.graph.exe.ProcessInstance pi = graphSession.getProcessInstance(processInstanceId); vo = WorkflowUtils.copy(pi); // Activity log UserActivity.log(session.getUserID(), "GET_PROCESS_INSTANCE", "" + processInstanceId, null); } catch (javax.jcr.RepositoryException e) { throw new RepositoryException(e.getMessage(), e); } catch (JbpmException e) { throw new WorkflowException(e.getMessage(), e); } finally { if (token == null) JCRUtils.logout(session); jbpmContext.close(); } log.debug("getProcessInstance: {}", vo); return vo; } @Override public void suspendProcessInstance(String token, long processInstanceId) throws RepositoryException, DatabaseException, WorkflowException { log.debug("suspendProcessInstance({}, {})", token, processInstanceId); JbpmContext jbpmContext = JBPMUtils.getConfig().createJbpmContext(); Session session = null; try { if (token == null) { session = JCRUtils.getSession(); } else { session = JcrSessionManager.getInstance().get(token); } org.jbpm.graph.exe.ProcessInstance pi = jbpmContext.getProcessInstance(processInstanceId); pi.suspend(); jbpmContext.getSession().flush(); // Activity log UserActivity.log(session.getUserID(), "SUSPEND_PROCESS_INSTANCE", "" + processInstanceId, null); } catch (javax.jcr.RepositoryException e) { throw new RepositoryException(e.getMessage(), e); } catch (JbpmException e) { throw new WorkflowException(e.getMessage(), e); } finally { if (token == null) JCRUtils.logout(session); jbpmContext.close(); } log.debug("suspendProcessInstance: void"); } @Override public void resumeProcessInstance(String token, long processInstanceId) throws RepositoryException, DatabaseException, WorkflowException { log.debug("resumeProcessInstance({}, {})", token, processInstanceId); JbpmContext jbpmContext = JBPMUtils.getConfig().createJbpmContext(); Session session = null; try { if (token == null) { session = JCRUtils.getSession(); } else { session = JcrSessionManager.getInstance().get(token); } org.jbpm.graph.exe.ProcessInstance pi = jbpmContext.getProcessInstance(processInstanceId); pi.resume(); jbpmContext.getSession().flush(); // Activity log UserActivity.log(session.getUserID(), "RESUME_PROCESS_INSTANCE", "" + processInstanceId, null); } catch (javax.jcr.RepositoryException e) { throw new RepositoryException(e.getMessage(), e); } catch (JbpmException e) { throw new WorkflowException(e.getMessage(), e); } finally { if (token == null) JCRUtils.logout(session); jbpmContext.close(); } log.debug("resumeProcessInstance: void"); } @Override public void addProcessInstanceVariable(String token, long processInstanceId, String name, Object value) throws RepositoryException, DatabaseException, WorkflowException { log.debug("addProcessInstanceVariable({}, {}, {}, {})", new Object[] { token, processInstanceId, name, value }); JbpmContext jbpmContext = JBPMUtils.getConfig().createJbpmContext(); Session session = null; try { if (token == null) { session = JCRUtils.getSession(); } else { session = JcrSessionManager.getInstance().get(token); } org.jbpm.graph.exe.ProcessInstance pi = jbpmContext.getProcessInstance(processInstanceId); pi.getContextInstance().setVariable(name, value); jbpmContext.getSession().flush(); // Activity log UserActivity.log(session.getUserID(), "ADD_PROCESS_INSTANCE_VARIABLE", "" + processInstanceId, name + ", " + value); } catch (javax.jcr.RepositoryException e) { throw new RepositoryException(e.getMessage(), e); } catch (JbpmException e) { throw new WorkflowException(e.getMessage(), e); } finally { if (token == null) JCRUtils.logout(session); jbpmContext.close(); } log.debug("addProcessInstanceVariable: void"); } @Override public void deleteProcessInstanceVariable(String token, long processInstanceId, String name) throws RepositoryException, DatabaseException, WorkflowException { log.debug("deleteProcessInstanceVariable({}, {}, {})", new Object[] { token, processInstanceId, name }); JbpmContext jbpmContext = JBPMUtils.getConfig().createJbpmContext(); Session session = null; try { if (token == null) { session = JCRUtils.getSession(); } else { session = JcrSessionManager.getInstance().get(token); } org.jbpm.graph.exe.ProcessInstance pi = jbpmContext.getProcessInstance(processInstanceId); pi.getContextInstance().deleteVariable(name); jbpmContext.getSession().flush(); // Activity log UserActivity.log(session.getUserID(), "DELETE_PROCESS_INSTANCE_VARIABLE", "" + processInstanceId, name); } catch (javax.jcr.RepositoryException e) { throw new RepositoryException(e.getMessage(), e); } catch (JbpmException e) { throw new WorkflowException(e.getMessage(), e); } finally { if (token == null) JCRUtils.logout(session); jbpmContext.close(); } log.debug("deleteProcessInstanceVariable: void"); } @Override @SuppressWarnings("rawtypes") public List<TaskInstance> findUserTaskInstances(String token) throws RepositoryException, DatabaseException, WorkflowException { log.debug("findUserTaskInstances({})", token); JbpmContext jbpmContext = JBPMUtils.getConfig().createJbpmContext(); List<TaskInstance> al = new ArrayList<TaskInstance>(); Session session = null; try { if (token == null) { session = JCRUtils.getSession(); } else { session = JcrSessionManager.getInstance().get(token); } TaskMgmtSession taskMgmtSession = jbpmContext.getTaskMgmtSession(); for (Iterator it = taskMgmtSession.findTaskInstances(session.getUserID()).iterator(); it.hasNext();) { org.jbpm.taskmgmt.exe.TaskInstance ti = (org.jbpm.taskmgmt.exe.TaskInstance) it.next(); al.add(WorkflowUtils.copy(ti)); } // Sort Collections.sort(al); // Activity log UserActivity.log(session.getUserID(), "FIND_USER_TASK_INSTANCES", null, null); } catch (javax.jcr.RepositoryException e) { throw new RepositoryException(e.getMessage(), e); } catch (JbpmException e) { throw new WorkflowException(e.getMessage(), e); } finally { if (token == null) JCRUtils.logout(session); jbpmContext.close(); } log.debug("findUserTaskInstances: {}", al); return al; } @Override @SuppressWarnings("rawtypes") public List<TaskInstance> findPooledTaskInstances(String token) throws RepositoryException, DatabaseException, WorkflowException { log.debug("findPooledTaskInstances({})", token); JbpmContext jbpmContext = JBPMUtils.getConfig().createJbpmContext(); ArrayList<TaskInstance> al = new ArrayList<TaskInstance>(); Session session = null; try { if (token == null) { session = JCRUtils.getSession(); } else { session = JcrSessionManager.getInstance().get(token); } TaskMgmtSession taskMgmtSession = jbpmContext.getTaskMgmtSession(); for (Iterator it = taskMgmtSession.findPooledTaskInstances(session.getUserID()).iterator(); it .hasNext();) { org.jbpm.taskmgmt.exe.TaskInstance ti = (org.jbpm.taskmgmt.exe.TaskInstance) it.next(); al.add(WorkflowUtils.copy(ti)); } // Sort Collections.sort(al); // Activity log UserActivity.log(session.getUserID(), "FIND_POOLED_TASK_INSTANCES", null, null); } catch (javax.jcr.RepositoryException e) { throw new RepositoryException(e.getMessage(), e); } catch (JbpmException e) { throw new WorkflowException(e.getMessage(), e); } finally { if (token == null) JCRUtils.logout(session); jbpmContext.close(); } log.debug("findPooledTaskInstances: {}", al); return al; } @Override @SuppressWarnings("rawtypes") public List<TaskInstance> findTaskInstances(String token, long processInstanceId) throws RepositoryException, DatabaseException, WorkflowException { log.debug("findTaskInstances({})", token); JbpmContext jbpmContext = JBPMUtils.getConfig().createJbpmContext(); ArrayList<TaskInstance> al = new ArrayList<TaskInstance>(); Session session = null; try { if (token == null) { session = JCRUtils.getSession(); } else { session = JcrSessionManager.getInstance().get(token); } GraphSession graphSession = jbpmContext.getGraphSession(); org.jbpm.graph.exe.ProcessInstance pi = graphSession.getProcessInstance(processInstanceId); TaskMgmtInstance taskMgmtInstance = pi.getTaskMgmtInstance(); if (taskMgmtInstance.getTaskInstances() != null) { for (Iterator it = taskMgmtInstance.getTaskInstances().iterator(); it.hasNext();) { org.jbpm.taskmgmt.exe.TaskInstance ti = (org.jbpm.taskmgmt.exe.TaskInstance) it.next(); al.add(WorkflowUtils.copy(ti)); } } // Sort Collections.sort(al); // Activity log UserActivity.log(session.getUserID(), "FIND_TASK_INSTANCES", "" + processInstanceId, null); } catch (javax.jcr.RepositoryException e) { throw new RepositoryException(e.getMessage(), e); } catch (JbpmException e) { throw new WorkflowException(e.getMessage(), e); } finally { if (token == null) JCRUtils.logout(session); jbpmContext.close(); } log.debug("findTaskInstances: {}", al); return al; } @Override public void setTaskInstanceValues(String token, long taskInstanceId, String transitionName, List<FormElement> values) throws RepositoryException, DatabaseException, WorkflowException { log.debug("setTaskInstanceValues({}, {}, {}, {})", new Object[] { token, taskInstanceId, transitionName, values }); JbpmContext jbpmContext = JBPMUtils.getConfig().createJbpmContext(); Session session = null; try { if (token == null) { session = JCRUtils.getSession(); } else { session = JcrSessionManager.getInstance().get(token); } TaskMgmtSession taskMgmtSession = jbpmContext.getTaskMgmtSession(); Map<String, FormElement> hm = new HashMap<String, FormElement>(); for (FormElement fe : values) { hm.put(fe.getName(), fe); } org.jbpm.taskmgmt.exe.TaskInstance ti = taskMgmtSession.getTaskInstance(taskInstanceId); ti.setVariables(hm); if (transitionName != null && !transitionName.equals("")) { if (ti.getStart() == null) { ti.start(); } ti.end(transitionName); } else { if (ti.getStart() == null) { ti.start(); } ti.end(); } // Activity log UserActivity.log(session.getUserID(), "SET_TASK_INSTANCE_VALUES", "" + taskInstanceId, transitionName); } catch (javax.jcr.RepositoryException e) { throw new RepositoryException(e.getMessage(), e); } catch (JbpmException e) { throw new WorkflowException(e.getMessage(), e); } finally { if (token == null) JCRUtils.logout(session); jbpmContext.close(); } log.debug("setTaskInstanceValues: void"); } @Override public void addTaskInstanceComment(String token, long taskInstanceId, String message) throws RepositoryException, DatabaseException, WorkflowException { log.debug("addTaskInstanceComment({}, {}, {})", new Object[] { token, taskInstanceId, message }); JbpmContext jbpmContext = JBPMUtils.getConfig().createJbpmContext(); Session session = null; try { if (token == null) { session = JCRUtils.getSession(); } else { session = JcrSessionManager.getInstance().get(token); } TaskMgmtSession taskMgmtSession = jbpmContext.getTaskMgmtSession(); org.jbpm.taskmgmt.exe.TaskInstance ti = taskMgmtSession.getTaskInstance(taskInstanceId); ti.addComment(new org.jbpm.graph.exe.Comment(session.getUserID(), message)); jbpmContext.getSession().flush(); // Activity log UserActivity.log(session.getUserID(), "ADD_TASK_INSTANCE_COMMENT", "" + taskInstanceId, message); } catch (javax.jcr.RepositoryException e) { throw new RepositoryException(e.getMessage(), e); } catch (JbpmException e) { throw new WorkflowException(e.getMessage(), e); } finally { if (token == null) JCRUtils.logout(session); jbpmContext.close(); } log.debug("addTaskInstanceComment: void"); } @Override public TaskInstance getTaskInstance(String token, long taskInstanceId) throws RepositoryException, DatabaseException, WorkflowException { log.debug("getTaskInstance({}, {})", token, taskInstanceId); JbpmContext jbpmContext = JBPMUtils.getConfig().createJbpmContext(); TaskInstance vo = new TaskInstance(); Session session = null; try { if (token == null) { session = JCRUtils.getSession(); } else { session = JcrSessionManager.getInstance().get(token); } TaskMgmtSession taskMgmtSession = jbpmContext.getTaskMgmtSession(); org.jbpm.taskmgmt.exe.TaskInstance ti = taskMgmtSession.getTaskInstance(taskInstanceId); vo = WorkflowUtils.copy(ti); // Activity log UserActivity.log(session.getUserID(), "GET_TASK_INSTANCE", "" + taskInstanceId, null); } catch (javax.jcr.RepositoryException e) { throw new RepositoryException(e.getMessage(), e); } catch (JbpmException e) { throw new WorkflowException(e.getMessage(), e); } finally { if (token == null) JCRUtils.logout(session); jbpmContext.close(); } log.debug("getTaskInstance: {}", vo); return vo; } @Override public void setTaskInstanceActorId(String token, long taskInstanceId, String actorId) throws RepositoryException, DatabaseException, WorkflowException { log.debug("setTaskInstanceActorId({}, {}, {})", new Object[] { token, taskInstanceId, actorId }); JbpmContext jbpmContext = JBPMUtils.getConfig().createJbpmContext(); Session session = null; try { if (token == null) { session = JCRUtils.getSession(); } else { session = JcrSessionManager.getInstance().get(token); } org.jbpm.taskmgmt.exe.TaskInstance ti = jbpmContext.getTaskInstance(taskInstanceId); ti.setActorId(actorId); jbpmContext.getSession().flush(); // Activity log UserActivity.log(session.getUserID(), "SET_TASK_INSTANCE_ACTOR_ID", "" + taskInstanceId, actorId); } catch (javax.jcr.RepositoryException e) { throw new RepositoryException(e.getMessage(), e); } catch (JbpmException e) { throw new WorkflowException(e.getMessage(), e); } finally { if (token == null) JCRUtils.logout(session); jbpmContext.close(); } log.debug("setTaskInstanceActorId: void"); } @Override // TODO Esto creo que sobra pq no se puede hacer public void addTaskInstanceVariable(String token, long taskInstanceId, String name, Object value) throws RepositoryException, DatabaseException, WorkflowException { log.debug("addTaskInstanceVariable({}, {}, {}, {})", new Object[] { token, taskInstanceId, name, value }); JbpmContext jbpmContext = JBPMUtils.getConfig().createJbpmContext(); Session session = null; try { if (token == null) { session = JCRUtils.getSession(); } else { session = JcrSessionManager.getInstance().get(token); } org.jbpm.taskmgmt.exe.TaskInstance ti = jbpmContext.getTaskInstance(taskInstanceId); ti.setVariable(name, value); jbpmContext.getSession().flush(); // Activity log UserActivity.log(session.getUserID(), "ADD_TASK_INSTANCE_VARIABLE", "" + taskInstanceId, name + ", " + value); } catch (javax.jcr.RepositoryException e) { throw new RepositoryException(e.getMessage(), e); } catch (JbpmException e) { throw new WorkflowException(e.getMessage(), e); } finally { if (token == null) JCRUtils.logout(session); jbpmContext.close(); } log.debug("addTaskInstanceVariable: void"); } @Override public void deleteTaskInstanceVariable(String token, long taskInstanceId, String name) throws RepositoryException, DatabaseException, WorkflowException { log.debug("deleteTaskInstanceVariable({}, {}, {})", new Object[] { token, taskInstanceId, name }); JbpmContext jbpmContext = JBPMUtils.getConfig().createJbpmContext(); Session session = null; try { if (token == null) { session = JCRUtils.getSession(); } else { session = JcrSessionManager.getInstance().get(token); } org.jbpm.taskmgmt.exe.TaskInstance ti = jbpmContext.getTaskInstance(taskInstanceId); ti.deleteVariable(name); jbpmContext.getSession().flush(); // Activity log UserActivity.log(session.getUserID(), "DELETE_TASK_INSTANCE_VARIABLE", "" + taskInstanceId, name); } catch (javax.jcr.RepositoryException e) { throw new RepositoryException(e.getMessage(), e); } catch (JbpmException e) { throw new WorkflowException(e.getMessage(), e); } finally { if (token == null) JCRUtils.logout(session); jbpmContext.close(); } log.debug("deleteTaskInstanceVariable: void"); } @Override public void startTaskInstance(String token, long taskInstanceId) throws RepositoryException, DatabaseException, WorkflowException { log.debug("startTaskInstance({}, {})", token, taskInstanceId); JbpmContext jbpmContext = JBPMUtils.getConfig().createJbpmContext(); Session session = null; try { if (token == null) { session = JCRUtils.getSession(); } else { session = JcrSessionManager.getInstance().get(token); } TaskMgmtSession taskMgmtSession = jbpmContext.getTaskMgmtSession(); org.jbpm.taskmgmt.exe.TaskInstance ti = taskMgmtSession.getTaskInstance(taskInstanceId); ti.start(); jbpmContext.getSession().flush(); // Activity log UserActivity.log(session.getUserID(), "START_TASK_INSTANCE", "" + taskInstanceId, null); } catch (javax.jcr.RepositoryException e) { throw new RepositoryException(e.getMessage(), e); } catch (JbpmException e) { throw new WorkflowException(e.getMessage(), e); } finally { if (token == null) JCRUtils.logout(session); jbpmContext.close(); } log.debug("startTaskInstance: void"); } @Override public void endTaskInstance(String token, long taskInstanceId, String transitionName) throws RepositoryException, DatabaseException, WorkflowException { log.debug("endTaskInstance({}, {}, {})", new Object[] { token, taskInstanceId, transitionName }); JbpmContext jbpmContext = JBPMUtils.getConfig().createJbpmContext(); Session session = null; try { if (token == null) { session = JCRUtils.getSession(); } else { session = JcrSessionManager.getInstance().get(token); } TaskMgmtSession taskMgmtSession = jbpmContext.getTaskMgmtSession(); org.jbpm.taskmgmt.exe.TaskInstance ti = taskMgmtSession.getTaskInstance(taskInstanceId); if (transitionName != null && !transitionName.equals("")) { if (ti.getStart() == null) { ti.start(); } ti.end(transitionName); } else { if (ti.getStart() == null) { ti.start(); } ti.end(); } jbpmContext.getSession().flush(); // Activity log UserActivity.log(session.getUserID(), "END_TASK_INSTANCE", "" + taskInstanceId, null); } catch (javax.jcr.RepositoryException e) { throw new RepositoryException(e.getMessage(), e); } catch (JbpmException e) { throw new WorkflowException(e.getMessage(), e); } finally { if (token == null) JCRUtils.logout(session); jbpmContext.close(); } log.debug("endTaskInstance: void"); } @Override public void suspendTaskInstance(String token, long taskInstanceId) throws RepositoryException, DatabaseException, WorkflowException { log.debug("suspendTaskInstance({}, {})", token, taskInstanceId); JbpmContext jbpmContext = JBPMUtils.getConfig().createJbpmContext(); Session session = null; try { if (token == null) { session = JCRUtils.getSession(); } else { session = JcrSessionManager.getInstance().get(token); } TaskMgmtSession taskMgmtSession = jbpmContext.getTaskMgmtSession(); org.jbpm.taskmgmt.exe.TaskInstance ti = taskMgmtSession.getTaskInstance(taskInstanceId); ti.suspend(); jbpmContext.getSession().flush(); // Activity log UserActivity.log(session.getUserID(), "SUSPEND_TASK_INSTANCE", "" + taskInstanceId, null); } catch (javax.jcr.RepositoryException e) { throw new RepositoryException(e.getMessage(), e); } catch (JbpmException e) { throw new WorkflowException(e.getMessage(), e); } finally { if (token == null) JCRUtils.logout(session); jbpmContext.close(); } log.debug("suspendTaskInstance: void"); } @Override public void resumeTaskInstance(String token, long taskInstanceId) throws RepositoryException, DatabaseException, WorkflowException { log.debug("resumeTaskInstance({}, {})", token, taskInstanceId); JbpmContext jbpmContext = JBPMUtils.getConfig().createJbpmContext(); Session session = null; try { if (token == null) { session = JCRUtils.getSession(); } else { session = JcrSessionManager.getInstance().get(token); } TaskMgmtSession taskMgmtSession = jbpmContext.getTaskMgmtSession(); org.jbpm.taskmgmt.exe.TaskInstance ti = taskMgmtSession.getTaskInstance(taskInstanceId); ti.resume(); jbpmContext.getSession().flush(); // Activity log UserActivity.log(session.getUserID(), "RESUME_TASK_INSTANCE", "" + taskInstanceId, null); } catch (javax.jcr.RepositoryException e) { throw new RepositoryException(e.getMessage(), e); } catch (JbpmException e) { throw new WorkflowException(e.getMessage(), e); } finally { if (token == null) JCRUtils.logout(session); jbpmContext.close(); } log.debug("resumeTaskInstance: void"); } @Override public Token getToken(String token, long tokenId) throws RepositoryException, DatabaseException, WorkflowException { log.debug("getToken({}, {})", token, tokenId); JbpmContext jbpmContext = JBPMUtils.getConfig().createJbpmContext(); Token vo = new Token(); Session session = null; try { if (token == null) { session = JCRUtils.getSession(); } else { session = JcrSessionManager.getInstance().get(token); } org.jbpm.graph.exe.Token t = jbpmContext.getToken(tokenId); vo = WorkflowUtils.copy(t); vo.setProcessInstance(WorkflowUtils.copy(t.getProcessInstance())); // Avoid recursion // Activity log UserActivity.log(session.getUserID(), "GET_TOKEN", "" + tokenId, null); } catch (javax.jcr.RepositoryException e) { throw new RepositoryException(e.getMessage(), e); } catch (JbpmException e) { throw new WorkflowException(e.getMessage(), e); } finally { if (token == null) JCRUtils.logout(session); jbpmContext.close(); } log.debug("getToken: " + vo); return vo; } @Override public void addTokenComment(String token, long tokenId, String message) throws RepositoryException, DatabaseException, WorkflowException { log.debug("addTokenComment({}, {}, {})", new Object[] { token, tokenId, message }); JbpmContext jbpmContext = JBPMUtils.getConfig().createJbpmContext(); Session session = null; try { if (token == null) { session = JCRUtils.getSession(); } else { session = JcrSessionManager.getInstance().get(token); } org.jbpm.graph.exe.Token t = jbpmContext.getToken(tokenId); t.addComment(new org.jbpm.graph.exe.Comment(session.getUserID(), message)); jbpmContext.getSession().flush(); // Activity log UserActivity.log(session.getUserID(), "ADD_TOKEN_COMMENT", "" + tokenId, message); } catch (javax.jcr.RepositoryException e) { throw new RepositoryException(e.getMessage(), e); } catch (JbpmException e) { throw new WorkflowException(e.getMessage(), e); } finally { if (token == null) JCRUtils.logout(session); jbpmContext.close(); } log.debug("addTokenComment: void"); } @Override public void suspendToken(String token, long tokenId) throws RepositoryException, DatabaseException, WorkflowException { log.debug("suspendToken({}, {})", token, tokenId); JbpmContext jbpmContext = JBPMUtils.getConfig().createJbpmContext(); Session session = null; try { if (token == null) { session = JCRUtils.getSession(); } else { session = JcrSessionManager.getInstance().get(token); } org.jbpm.graph.exe.Token t = jbpmContext.getToken(tokenId); t.suspend(); jbpmContext.getSession().flush(); // Activity log UserActivity.log(session.getUserID(), "SUSPEND_TOKEN", "" + tokenId, null); } catch (javax.jcr.RepositoryException e) { throw new RepositoryException(e.getMessage(), e); } catch (JbpmException e) { throw new WorkflowException(e.getMessage(), e); } finally { if (token == null) JCRUtils.logout(session); jbpmContext.close(); } log.debug("suspendToken: void"); } @Override public void resumeToken(String token, long tokenId) throws RepositoryException, DatabaseException, WorkflowException { log.debug("resumeToken({}, {})", token, tokenId); JbpmContext jbpmContext = JBPMUtils.getConfig().createJbpmContext(); Session session = null; try { if (token == null) { session = JCRUtils.getSession(); } else { session = JcrSessionManager.getInstance().get(token); } org.jbpm.graph.exe.Token t = jbpmContext.getToken(tokenId); t.resume(); jbpmContext.getSession().flush(); // Activity log UserActivity.log(session.getUserID(), "RESUME_TOKEN", "" + tokenId, null); } catch (javax.jcr.RepositoryException e) { throw new RepositoryException(e.getMessage(), e); } catch (JbpmException e) { throw new WorkflowException(e.getMessage(), e); } finally { if (token == null) JCRUtils.logout(session); jbpmContext.close(); } log.debug("resumeToken: void"); } @Override public Token sendTokenSignal(String token, long tokenId, String transitionName) throws RepositoryException, DatabaseException, WorkflowException { log.debug("sendTokenSignal({}, {}, {})", new Object[] { token, tokenId, transitionName }); JbpmContext jbpmContext = JBPMUtils.getConfig().createJbpmContext(); Token vo = new Token(); Session session = null; try { if (token == null) { session = JCRUtils.getSession(); } else { session = JcrSessionManager.getInstance().get(token); } org.jbpm.graph.exe.Token t = jbpmContext.getToken(tokenId); if (transitionName != null && !transitionName.equals("")) { t.signal(transitionName); } else { t.signal(); } jbpmContext.getSession().flush(); vo = WorkflowUtils.copy(t); vo.setProcessInstance(WorkflowUtils.copy(t.getProcessInstance())); // Avoid recursion // Activity log UserActivity.log(session.getUserID(), "SEND_TOKEN_SIGNAL", "" + tokenId, transitionName); } catch (javax.jcr.RepositoryException e) { throw new RepositoryException(e.getMessage(), e); } catch (JbpmException e) { throw new WorkflowException(e.getMessage(), e); } finally { if (token == null) JCRUtils.logout(session); jbpmContext.close(); } log.debug("sendTokenSignal: {}", vo); return vo; } @Override public void setTokenNode(String token, long tokenId, String nodeName) throws RepositoryException, DatabaseException, WorkflowException { log.debug("setTokenNode({}, {}, {})", new Object[] { token, tokenId, nodeName }); JbpmContext jbpmContext = JBPMUtils.getConfig().createJbpmContext(); Session session = null; try { if (token == null) { session = JCRUtils.getSession(); } else { session = JcrSessionManager.getInstance().get(token); } org.jbpm.graph.exe.Token t = jbpmContext.getToken(tokenId); org.jbpm.graph.def.Node node = t.getProcessInstance().getProcessDefinition().getNode(nodeName); t.setNode(node); jbpmContext.getSession().flush(); // Activity log UserActivity.log(session.getUserID(), "SEND_TOKEN_NODE", "" + tokenId, nodeName); } catch (javax.jcr.RepositoryException e) { throw new RepositoryException(e.getMessage(), e); } catch (JbpmException e) { throw new WorkflowException(e.getMessage(), e); } finally { if (token == null) JCRUtils.logout(session); jbpmContext.close(); } log.debug("setTokenNode: void"); } @Override public void endToken(String token, long tokenId) throws RepositoryException, DatabaseException, WorkflowException { log.debug("endToken({}, {})", token, tokenId); JbpmContext jbpmContext = JBPMUtils.getConfig().createJbpmContext(); Session session = null; try { if (token == null) { session = JCRUtils.getSession(); } else { session = JcrSessionManager.getInstance().get(token); } jbpmContext.getToken(tokenId).end(); jbpmContext.getSession().flush(); // Activity log UserActivity.log(session.getUserID(), "END_TOKEN", "" + tokenId, null); } catch (javax.jcr.RepositoryException e) { throw new RepositoryException(e.getMessage(), e); } catch (JbpmException e) { throw new WorkflowException(e.getMessage(), e); } finally { if (token == null) JCRUtils.logout(session); jbpmContext.close(); } log.debug("endToken: void"); } }