code: @VisibleForTesting
      Task createJoinTask(Workflow workflowInstance, WorkflowTask joinWorkflowTask, HashMap<String, Object> joinInput) {
          Task joinTask = new Task();
          joinTask.setTaskType(SystemTaskType.JOIN.name());
          joinTask.setTaskDefName(SystemTaskType.JOIN.name());
          joinTask.setReferenceTaskName(joinWorkflowTask.getTaskReferenceName());
          joinTask.setWorkflowInstanceId(workflowInstance.getWorkflowId());
          joinTask.setWorkflowType(workflowInstance.getWorkflowName());
          joinTask.setCorrelationId(workflowInstance.getCorrelationId());
          joinTask.setScheduledTime(System.currentTimeMillis());
          joinTask.setInputData(joinInput);
          joinTask.setTaskId(IDGenerator.generate());
          joinTask.setStatus(Task.Status.IN_PROGRESS);
          joinTask.setWorkflowTask(joinWorkflowTask);
          return joinTask;
      }
docs: This method creates a JOIN task that is used in the {@link this#getMappedTasks(TaskMapperContext)}
  at the end to add a join task to be scheduled after all the fork tasks
  
  @param workflowInstance: A instance of the {@link Workflow} which represents the workflow being executed.
  @param joinWorkflowTask: A instance of {@link WorkflowTask} which is of type {@link TaskType#JOIN}
  @param joinInput:        The input which is set in the {@link Task#setInputData(Map)}
  @return a new instance of {@link Task} representing a {@link SystemTaskType#JOIN}