protected ProcessInstance createProcessInstance(ProcessRecord record, boolean schedule, boolean replay) {
if (record == null)
return null;
ProcessDefinition processDef = definitions.get(record.getProcessName());
if (processDef == null)
throw new ProcessNotFoundException("Failed to find ProcessDefinition for [" + record.getProcessName() + "]");
ProcessState state = processDef.constructProcessState(record);
if (state == null)
throw new ProcessNotFoundException("Failed to construct ProcessState for [" + record.getProcessName() + "]");
if (record.getId() == null && (schedule || !EngineContext.hasParentProcess()))
record = processRecordDao.insert(record);
ProcessServiceContext context = new ProcessServiceContext(lockManager, eventService, this, exceptionHandler, changeMonitors);
DefaultProcessInstanceImpl process = new DefaultProcessInstanceImpl(context, record, processDef, state, schedule, replay);
if (record.getId() != null)
queue(process);
return process;
}