package org.jbpm.command;
import java.util.Iterator;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.jbpm.JbpmContext;
import org.jbpm.graph.def.Node;
import org.jbpm.graph.def.ProcessDefinition;
import org.jbpm.graph.def.Transition;
import org.jbpm.graph.exe.ProcessInstance;
import org.jbpm.graph.exe.Token;
import org.jbpm.taskmgmt.exe.TaskInstance;
/**
* abstract base class for "get" commands which also implements default pre-fetching.
*
* Note: pre-fetching logs is not possible here, so you have to load Logs explicitly
* with GetProcessInstanceLogCommand
*
* @author Bernd Ruecker (bernd.ruecker@camunda.com)
*/
public abstract class AbstractGetObjectBaseCommand extends AbstractBaseCommand
{
static final Log log = LogFactory.getLog(AbstractGetObjectBaseCommand.class);
private static final long serialVersionUID = 1L;
/**
* if true, all process variables in the context (process instance / task) are prefetched too
*/
private boolean includeAllVariables = false;
/**
* specify the names of the variables to prefetch
*/
private String[] variablesToInclude = new String[0];
private transient JbpmContext jbpmContext;
public AbstractGetObjectBaseCommand()
{
}
public AbstractGetObjectBaseCommand(boolean includeAllVariables, boolean includeLogs)
{
this.includeAllVariables = includeAllVariables;
}
public AbstractGetObjectBaseCommand(String[] variablesToInclude)
{
this.variablesToInclude = variablesToInclude;
}
public void retrieveTaskInstanceDetails(TaskInstance ti)
{
try
{
ti.getToken().getProcessInstance().getProcessDefinition().getName();
// in TaskInstances created with jbpm 3.1, this association was
// not present!
ti.setProcessInstance(ti.getToken().getProcessInstance());
ti.getToken().getNode().getName();
ti.getTask().getName();
ti.getAvailableTransitions();
retrieveVariables(ti);
}
catch (Exception ex)
{
log.warn("exception while retrieving task instance data for task instance " + ti.getId(), ex);
}
}
public ProcessInstance retrieveProcessInstance(ProcessInstance pi)
{
try
{
pi.getProcessDefinition().getName();
retrieveToken(pi.getRootToken());
// load at least the super process id and token id
if (pi.getSuperProcessToken() != null)
{
pi.getSuperProcessToken().getId();
pi.getSuperProcessToken().getProcessInstance().getId();
}
retrieveVariables(pi);
}
catch (Exception ex)
{
log.warn("exception while retrieving process instance data for process instance " + pi.getId(), ex);
}
return pi;
}
@SuppressWarnings("rawtypes")
public ProcessDefinition retrieveProcessDefinition(ProcessDefinition pd)
{
try
{
pd.getName();
// often needed to start a process:
Iterator iter = pd.getStartState().getLeavingTransitions().iterator();
while (iter.hasNext())
{
Transition t = (Transition)iter.next();
t.getName();
}
}
catch (Exception ex)
{
log.warn("exception while retrieving process instance data for process definiton " + pd.getName(), ex);
}
return pd;
}
@SuppressWarnings("rawtypes")
protected void retrieveToken(Token t)
{
retrieveNode(t.getNode());
t.getAvailableTransitions();
// if (includeLogs)
// t.getProcessInstance().getLoggingInstance().
if (t.getChildren() != null) {
Iterator iter = t.getChildren().values().iterator();
while (iter.hasNext())
{
retrieveToken((Token)iter.next());
}
}
}
protected void retrieveNode(Node n)
{
if (n != null) {
n.getName();
n.getLeavingTransitions();
if (n.getSuperState() != null)
retrieveNode(n.getSuperState());
}
}
public void retrieveVariables(ProcessInstance pi)
{
if (includeAllVariables)
{
pi.getContextInstance().getVariables();
}
else
{
for (int i = 0; i < variablesToInclude.length; i++)
{
pi.getContextInstance().getVariable(variablesToInclude[i]);
}
}
}
public void retrieveVariables(TaskInstance ti)
{
if (includeAllVariables)
{
ti.getVariables();
}
else
{
for (int i = 0; i < variablesToInclude.length; i++)
{
ti.getVariable(variablesToInclude[i]);
}
}
}
public boolean isIncludeAllVariables()
{
return includeAllVariables;
}
public void setIncludeAllVariables(boolean includeAllVariables)
{
this.includeAllVariables = includeAllVariables;
}
public String[] getVariablesToInclude()
{
return variablesToInclude;
}
public void setVariablesToInclude(String[] variablesToInclude)
{
this.variablesToInclude = variablesToInclude;
}
public void setVariablesToInclude(String variableToInclude)
{
this.variablesToInclude = new String[] { variableToInclude };
}
protected JbpmContext getJbpmContext()
{
return jbpmContext;
}
protected void setJbpmContext(JbpmContext jbpmContext)
{
this.jbpmContext = jbpmContext;
}
// methods for fluent programming
public AbstractGetObjectBaseCommand variablesToInclude(String[] variablesToInclude)
{
setVariablesToInclude(variablesToInclude);
return this;
}
public AbstractGetObjectBaseCommand variablesToInclude(String variableToInclude)
{
setVariablesToInclude(variableToInclude);
return this;
}
public AbstractGetObjectBaseCommand includeAllVariables(boolean includeAllVariables)
{
setIncludeAllVariables( includeAllVariables );
return this;
}
}