public void execute(
      String configuration,
      ExecutionEntity execution,
      CommandContext commandContext,
      String tenantId) {
    String activityId = getKey(configuration);
    ActivityImpl intermediateEventActivity =
        execution.getProcessDefinition().findActivity(activityId);

    ensureNotNull(
        "Error while firing timer: intermediate event activity " + configuration + " not found",
        "intermediateEventActivity",
        intermediateEventActivity);

    try {
      if (activityId.equals(execution.getActivityId())) {
        // Regular Intermediate timer catch
        execution.signal("signal", null);
      } else {
        // Event based gateway
        execution.executeEventHandlerActivity(intermediateEventActivity);
      }

    } catch (RuntimeException e) {
      throw e;
    } catch (Exception e) {
      throw new ProcessEngineException("exception during timer execution: " + e.getMessage(), e);
    }
  }
  public UserOperationLogContextEntryBuilder inContextOf(ExecutionEntity execution) {
    entry.setProcessInstanceId(execution.getProcessInstanceId());
    entry.setProcessDefinitionId(execution.getProcessDefinitionId());

    ProcessDefinitionEntity processDefinition =
        (ProcessDefinitionEntity) execution.getProcessDefinition();
    entry.setProcessDefinitionKey(processDefinition.getKey());
    entry.setDeploymentId(processDefinition.getDeploymentId());

    return this;
  }
  protected Integer getProcessDefinitionPriority(
      ExecutionEntity execution, JobDeclaration<?> jobDeclaration) {
    if (execution != null) {
      ProcessDefinitionImpl processDefinition = execution.getProcessDefinition();
      ParameterValueProvider priorityProvider =
          (ParameterValueProvider)
              processDefinition.getProperty(BpmnParse.PROPERTYNAME_JOB_PRIORITY);

      if (priorityProvider != null) {
        return evaluateValueProvider(priorityProvider, execution, jobDeclaration);
      }
    }

    return null;
  }
  protected void assignExecutionsToActivities(List<ExecutionEntity> leaves) {
    for (ExecutionEntity leaf : leaves) {
      ScopeImpl activity = leaf.getActivity();

      if (activity != null) {
        if (leaf.getActivityInstanceId() != null) {
          EnsureUtil.ensureNotNull("activity", activity);
          submitExecution(leaf, activity);
        }
        mergeScopeExecutions(leaf);

      } else if (leaf.isProcessInstanceExecution()) {
        submitExecution(leaf, leaf.getProcessDefinition());
      }
    }
  }
  public UserOperationLogContextEntryBuilder inContextOf(
      ExecutionEntity processInstance, List<PropertyChange> propertyChanges) {

    if (propertyChanges == null || propertyChanges.isEmpty()) {
      if (OPERATION_TYPE_CREATE.equals(entry.getOperationType())) {
        propertyChanges = Arrays.asList(PropertyChange.EMPTY_CHANGE);
      }
    }
    entry.setPropertyChanges(propertyChanges);
    entry.setProcessInstanceId(processInstance.getProcessInstanceId());
    entry.setProcessDefinitionId(processInstance.getProcessDefinitionId());
    entry.setExecutionId(processInstance.getId());
    entry.setCaseInstanceId(processInstance.getCaseInstanceId());

    ResourceDefinitionEntity definition = processInstance.getProcessDefinition();
    if (definition != null) {
      entry.setProcessDefinitionKey(definition.getKey());
      entry.setDeploymentId(definition.getDeploymentId());
    }

    return this;
  }
  protected ActivityImpl getCurrentActivity(CommandContext commandContext, JobEntity job) {
    String type = job.getJobHandlerType();
    ActivityImpl activity = null;

    String configuration = job.getJobHandlerConfiguration();

    if (TimerExecuteNestedActivityJobHandler.TYPE.equals(type)
        || TimerCatchIntermediateEventJobHandler.TYPE.equals(type)) {
      ExecutionEntity execution = fetchExecutionEntity(job.getExecutionId());
      if (execution != null) {
        String acitivtyId = TimerEventJobHandler.getKey(configuration);
        activity = execution.getProcessDefinition().findActivity(acitivtyId);
      }

    } else if (TimerStartEventJobHandler.TYPE.equals(type)) {
      DeploymentCache deploymentCache =
          Context.getProcessEngineConfiguration().getDeploymentCache();
      String definitionKey = TimerEventJobHandler.getKey(configuration);
      ProcessDefinitionEntity processDefinition =
          deploymentCache.findDeployedLatestProcessDefinitionByKey(definitionKey);
      if (processDefinition != null) {
        activity = processDefinition.getInitial();
      }

    } else if (AsyncContinuationJobHandler.TYPE.equals(type)) {
      ExecutionEntity execution = fetchExecutionEntity(job.getExecutionId());
      if (execution != null) {
        activity = execution.getActivity();
      }

    } else {
      // noop, because activity type is not supported
    }

    return activity;
  }