/* * JBoss, Home of Professional Open Source * Copyright 2005, JBoss Inc., and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jbpm.pvm.internal.model; import java.util.Date; import java.util.HashMap; import java.util.Map; import org.jbpm.api.Execution; import org.jbpm.api.JbpmException; import org.jbpm.internal.log.Log; import org.jbpm.pvm.internal.client.ClientProcessDefinition; import org.jbpm.pvm.internal.client.ClientProcessInstance; import org.jbpm.pvm.internal.task.TaskDefinitionImpl; /** * @author Tom Baeyens */ public class ProcessDefinitionImpl extends CompositeElementImpl implements OpenProcessDefinition, ClientProcessDefinition { private static final long serialVersionUID = 1L; private static final Log log = Log.getLog(ProcessDefinitionImpl.class.getName()); public static final int UNASSIGNED_VERSION = -1; /** user provided short reference for the process definition that * has the same scope as the name. Multiple versions of the same * process can have the same key. The key is used to build the * globally unique execution ids. */ protected String key; /** the unique id (e.g. combination of name and versionnumber) for this * process definition. */ protected String id; /** the version number of the process definitions with the same name.*/ protected int version = UNASSIGNED_VERSION; /** optional package name similar to the Java package name. */ protected String packageName; /** time this process was deployed */ protected Date deploymentTime; /** ref to the deployment */ protected long deploymentDbid; /** propagated from deployment to process definition during deploy */ protected boolean isSuspended = false; /** the activity which is executed when the process starts */ protected ActivityImpl initial; /** * ·Å¿ªÈÎÎñ¶¨Òå±äÁ¿£¬È¡µÃÁ÷³Ì¶¨ÒåÖеÄÈÎÎñ */ public Map taskDefinitions = new HashMap(); protected String imageResourceName = null; public ProcessDefinitionImpl() { this.processDefinition = this; } // execution factory method ///////////////////////////////////////////////// public ClientProcessInstance createProcessInstance() { return createProcessInstance(null, null); } public ClientProcessInstance createProcessInstance(String key) { return createProcessInstance(key, null); } public ClientProcessInstance createProcessInstance(String key, Execution superProcessExecution) { if (isSuspended) { throw new JbpmException("process definition "+id+" is suspended"); } ExecutionImpl processInstance = newProcessInstance(); log.debug("creating new execution for process '"+name+"'"); if (superProcessExecution!=null) { // establish the bidirectional relation between super process activity instance // and sub process instance ExecutionImpl superProcessExecutionImpl = (ExecutionImpl) superProcessExecution; processInstance.setSuperProcessExecution(superProcessExecutionImpl); superProcessExecutionImpl.setSubProcessInstance(processInstance); } processInstance.initializeProcessInstance(this, key); return processInstance; } public ClientProcessInstance startProcessInstance() { ClientProcessInstance processInstance = createProcessInstance(null, null); processInstance.start(); return processInstance; } public ClientProcessInstance startProcessInstance(String key) { ClientProcessInstance processInstance = createProcessInstance(key, null); processInstance.start(); return processInstance; } protected ExecutionImpl newProcessInstance() { return new ExecutionImpl(); } // task definitions ///////////////////////////////////////////////////////// public void addTaskDefinitionImpl(TaskDefinitionImpl taskDefinition) { taskDefinitions.put(taskDefinition.getName(), taskDefinition); } public TaskDefinitionImpl getTaskDefinition(String name) { return taskDefinitions.get(name); } // basic methods //////////////////////////////////////////////////////////// public String toString() { return (name!=null ? "process("+name+")" : "process"); } // customized getters and setters /////////////////////////////////////////// public String getDeploymentId() { return Long.toString(deploymentDbid); } // getters and setters ////////////////////////////////////////////////////// public ActivityImpl getInitial() { return initial; } public void setInitial(ActivityImpl initial) { this.initial = initial; } public int getVersion() { return version; } public void setVersion(int version) { this.version = version; } public Date getDeploymentTime() { return deploymentTime; } public void setDeploymentTime(Date deploymentTime) { this.deploymentTime = deploymentTime; } public String getPackageName() { return packageName; } public void setPackageName(String packageName) { this.packageName = packageName; } public String getKey() { return key; } public void setKey(String key) { this.key = key; } public String getId() { return id; } public void setId(String id) { this.id = id; } public void setDeploymentDbid(long deploymentDbid) { this.deploymentDbid = deploymentDbid; } public String getImageResourceName() { return imageResourceName; } public void setImageResourceName(String imageResourceName) { this.imageResourceName = imageResourceName; } public boolean isSuspended() { return isSuspended; } public void setSuspended(boolean isSuspended) { this.isSuspended = isSuspended; } }