public ExecutionEntity createProcessInstance(String businessKey, ActivityImpl initial) { ExecutionEntity processInstance = null; if (initial == null) { processInstance = (ExecutionEntity) super.createProcessInstance(); } else { processInstance = (ExecutionEntity) super.createProcessInstanceForInitial(initial); } CommandContext commandContext = Context.getCommandContext(); processInstance.setExecutions(new ArrayList<ExecutionEntity>()); processInstance.setProcessDefinition(processDefinition); // Do not initialize variable map (let it happen lazily) if (businessKey != null) { processInstance.setBusinessKey(businessKey); } // reset the process instance in order to have the db-generated process instance id available processInstance.setProcessInstance(processInstance); String initiatorVariableName = (String) getProperty(BpmnParse.PROPERTYNAME_INITIATOR_VARIABLE_NAME); if (initiatorVariableName != null) { String authenticatedUserId = Authentication.getAuthenticatedUserId(); processInstance.setVariable(initiatorVariableName, authenticatedUserId); } int historyLevel = Context.getProcessEngineConfiguration().getHistoryLevel(); // TODO: This smells bad, as the rest of the history is done via the ParseListener if (historyLevel >= ProcessEngineConfigurationImpl.HISTORYLEVEL_ACTIVITY) { HistoricProcessInstanceEntity historicProcessInstance = new HistoricProcessInstanceEntity(processInstance); commandContext.getSession(DbSqlSession.class).insert(historicProcessInstance); // do basically the same as in ActivityInstanceStanrtHandler IdGenerator idGenerator = Context.getProcessEngineConfiguration().getIdGenerator(); String processDefinitionId = processInstance.getProcessDefinitionId(); String processInstanceId = processInstance.getProcessInstanceId(); String executionId = processInstance.getId(); HistoricActivityInstanceEntity historicActivityInstance = new HistoricActivityInstanceEntity(); historicActivityInstance.setId(idGenerator.getNextId()); historicActivityInstance.setProcessDefinitionId(processDefinitionId); historicActivityInstance.setProcessInstanceId(processInstanceId); historicActivityInstance.setExecutionId(executionId); historicActivityInstance.setActivityId(processInstance.getActivityId()); historicActivityInstance.setActivityName( (String) processInstance.getActivity().getProperty("name")); historicActivityInstance.setActivityType( (String) processInstance.getActivity().getProperty("type")); Date now = ClockUtil.getCurrentTime(); historicActivityInstance.setStartTime(now); commandContext.getDbSqlSession().insert(historicActivityInstance); } return processInstance; }