/**
* Copyright 1996-2014 FoxBPM ORG.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* @author kenshin
*/
package org.foxbpm.engine.impl.entity;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.foxbpm.engine.db.HasRevision;
import org.foxbpm.engine.db.PersistentObject;
import org.foxbpm.engine.execution.ConnectorExecutionContext;
import org.foxbpm.engine.impl.Context;
import org.foxbpm.engine.impl.expression.ExpressionMgmt;
import org.foxbpm.engine.impl.identity.Authentication;
import org.foxbpm.engine.impl.util.ClockUtil;
import org.foxbpm.engine.impl.util.StringUtil;
import org.foxbpm.engine.runtime.Token;
import org.foxbpm.kernel.process.KernelProcessDefinition;
import org.foxbpm.kernel.process.impl.KernelFlowNodeImpl;
import org.foxbpm.kernel.runtime.KernelProcessInstance;
import org.foxbpm.kernel.runtime.impl.KernelProcessInstanceImpl;
import org.foxbpm.kernel.runtime.impl.KernelTokenImpl;
public class TokenEntity extends KernelTokenImpl implements Token, ConnectorExecutionContext, PersistentObject,
HasRevision {
/**
*
*/
private static final long serialVersionUID = 1L;
protected String processInstanceId;
protected String nodeId;
protected String parentId;
protected Date startTime;
protected Date endTime;
protected Date nodeEnterTime;
protected Date archiveTime;
protected List<TaskEntity> tasks;
protected TaskEntity assignTask;
/** 临时指定分配任务的处理者 */
protected String taskAssignee;
protected String groupID;
/** 流程定义唯一版本编号 */
protected String processDefinitionId;
/** 流程定义编号 */
protected String processDefinitionKey;
/** 控制并发修改标示 */
protected int revision;
/** 串行多实例循环标识 */
protected int loopCount=0;
public void setFlowNode(KernelFlowNodeImpl flowNode) {
if (flowNode != null) {
setNodeId(flowNode.getId());
}
super.setFlowNode(flowNode);
}
protected void ensureFlowNodeInitialized() {
if ((currentFlowNode == null) && (nodeId != null)) {
currentFlowNode = getProcessDefinition().findFlowNode(nodeId);
}
}
protected void ensureParentInitialized() {
if (this.parent == null && StringUtil.isNotBlank(this.parentId)) {
this.parent = Context.getCommandContext().getTokenManager().findTokenById(this.parentId);
}
}
protected void ensureChildrenInitialized() {
if (this.children == null) {
children = new ArrayList<KernelTokenImpl>();
List<TokenEntity> listResult = Context.getCommandContext().getTokenManager().findChildTokensByTokenId(this.id);
for (TokenEntity tokenEntity : listResult) {
children.add(tokenEntity);
}
}
}
protected void ensureProcessInstanceInitialized() {
if ((processInstance == null) && (processInstanceId != null)) {
processInstance = Context.getCommandContext().getProcessInstanceManager().findProcessInstanceById(processInstanceId);
}
}
public void setProcessInstance(KernelProcessInstanceImpl processInstance) {
setProcessInstanceId(processInstance.getId());
super.setProcessInstance(processInstance);
}
public void setParent(KernelTokenImpl parent) {
setParentId(parent.getId());
super.setParent(parent);
}
public void ensureEnterInitialized(KernelFlowNodeImpl flowNode) {
/** 设置令牌进入节点的时间 */
setNodeEnterTime(ClockUtil.getCurrentTime());
super.ensureEnterInitialized(flowNode);
}
public void clearExecutionContextData() {
super.clearExecutionContextData();
}
public String getId() {
return this.id;
}
public void setRevision(int revision) {
this.revision = revision;
}
public int getRevision() {
return revision;
}
public int getRevisionNext() {
return revision + 1;
}
public void setId(String id) {
this.id = id;
}
public String getProcessInstanceId() {
return processInstanceId;
}
public void setProcessInstanceId(String processInstanceId) {
this.processInstanceId = processInstanceId;
}
public String getNodeId() {
return nodeId;
}
public void setNodeId(String nodeId) {
this.nodeId = nodeId;
}
public String getParentId() {
return parentId;
}
public void setParentId(String parentId) {
this.parentId = parentId;
}
public Date getStartTime() {
return startTime;
}
public void setStartTime(Date startTime) {
this.startTime = startTime;
}
public Date getEndTime() {
return endTime;
}
public boolean isEnded() {
if (endTime == null) {
return false;
}
return super.isEnded();
}
public Date getNodeEnterTime() {
return nodeEnterTime;
}
public void setNodeEnterTime(Date nodeEnterTime) {
this.nodeEnterTime = nodeEnterTime;
}
public Date getArchiveTime() {
return archiveTime;
}
public void setArchiveTime(Date archiveTime) {
this.archiveTime = archiveTime;
}
public Map<String, Object> getPersistentState() {
Map<String, Object> objectParam = new HashMap<String, Object>();
objectParam.put("tokenId", getId());
objectParam.put("name", getName());
objectParam.put("startTime", getStartTime());
objectParam.put("endTime", getEndTime());
objectParam.put("nodeEnterTime", getNodeEnterTime());
objectParam.put("isSuspended", String.valueOf(isSuspended()));
objectParam.put("isLocked", String.valueOf(isLocked()));
objectParam.put("nodeId", getNodeId());
objectParam.put("processInstanceId", getProcessInstanceId());
objectParam.put("parentId", getParentId());
objectParam.put("processDefinitionId", getProcessDefinitionId());
objectParam.put("processDefinitionKey", getProcessDefinitionKey());
return objectParam;
}
public boolean isModified() {
return true;
}
public ProcessInstanceEntity getProcessInstance() {
return (ProcessInstanceEntity) super.getProcessInstance();
}
public Object getVariableLocal(Object variableName) {
return null;
}
public String getInitiator() {
return getProcessInstance().getInitiator();
}
public String getAuthenticatedUserId() {
return Authentication.getAuthenticatedUserId();
}
public String getStartAuthor() {
return getProcessInstance().getStartAuthor();
}
public TaskEntity getAssignTask() {
return assignTask;
}
public void setAssignTask(TaskEntity assignTask) {
this.assignTask = assignTask;
}
// 任务对象
// ///////////////////////////////////////////////////
@SuppressWarnings({"unchecked", "rawtypes"})
protected void ensureTasksInitialized() {
if (tasks == null) {
tasks = (List) Context.getCommandContext().getTaskManager().findTasksByTokenId(id);
}
}
protected List<TaskEntity> getTasksInternal() {
ensureTasksInitialized();
return tasks;
}
public List<TaskEntity> getTasks() {
return new ArrayList<TaskEntity>(getTasksInternal());
}
public void addTask(TaskEntity taskEntity) {
getTasksInternal().add(taskEntity);
}
public void removeTask(TaskEntity task) {
getTasksInternal().remove(task);
}
public void setProcessInstanceVariables(Map<String, Object> transientVariables) {
if (transientVariables == null) {
return;
}
for (String mapKey : transientVariables.keySet()) {
ExpressionMgmt.setVariable(mapKey, transientVariables.get(mapKey));
}
}
public void end(boolean verifyParentTermination) {
endTime = ClockUtil.getCurrentTime();
super.end(verifyParentTermination);
}
public String getGroupID() {
return groupID;
}
public void setGroupID(String groupID) {
this.groupID = groupID;
}
protected boolean isSignalParentToken() {
if (isSubProcessRootToken) {
if (!getParent().isEnded()) {
return true;
}
}
return super.isSignalParentToken();
}
public void setEnded(boolean isEnded) {
if (isEnded) {
this.endTime = ClockUtil.getCurrentTime();
} else {
this.endTime = null;
}
super.setEnded(isEnded);
}
public void setEndTime(Date endTime) {
if (endTime != null) {
super.setEnded(true);
} else {
super.setEnded(false);
}
this.endTime = endTime;
}
public String getProcessDefinitionId() {
return processDefinitionId;
}
public void setProcessDefinitionId(String processDefinitionId) {
this.processDefinitionId = processDefinitionId;
}
public String getProcessDefinitionKey() {
return processDefinitionKey;
}
public void setProcessDefinitionKey(String processDefinitionKey) {
this.processDefinitionKey = processDefinitionKey;
}
public KernelProcessInstance createSubProcessInstance(KernelProcessDefinition processDefinition) {
return super.createSubProcessInstance(processDefinition);
}
public String getTaskAssignee() {
return taskAssignee;
}
public void setTaskAssignee(String taskAssignee) {
this.taskAssignee = taskAssignee;
}
public int getLoopCount() {
return loopCount;
}
public void setLoopCount(int loopCount) {
this.loopCount = loopCount;
}
public String getBizKey(){
ensureProcessInstanceInitialized();
if(processInstance != null){
ProcessInstanceEntity tmp = (ProcessInstanceEntity)processInstance;
return tmp.getBizKey();
}
return null;
}
}