public HistoricFormPropertyEntity(
      ExecutionEntity execution, String propertyId, String propertyValue, String taskId) {
    this.processInstanceId = execution.getProcessInstanceId();
    this.executionId = execution.getId();
    this.taskId = taskId;
    this.propertyId = propertyId;
    this.propertyValue = propertyValue;
    this.time = Context.getProcessEngineConfiguration().getClock().getCurrentTime();

    HistoricActivityInstanceEntity historicActivityInstance =
        Context.getCommandContext().getHistoryManager().findActivityInstance(execution);
    if (historicActivityInstance != null) {
      this.activityInstanceId = historicActivityInstance.getId();
    }
  }
  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;
  }