@VisibleForTesting
    TaskModel createJoinTask(
            WorkflowModel workflowModel,
            WorkflowTask joinWorkflowTask,
            HashMap<String, Object> joinInput) {
        TaskModel joinTask = new TaskModel();
        joinTask.setTaskType(TaskType.TASK_TYPE_JOIN);
        joinTask.setTaskDefName(TaskType.TASK_TYPE_JOIN);
        joinTask.setReferenceTaskName(joinWorkflowTask.getTaskReferenceName());
        joinTask.setWorkflowInstanceId(workflowModel.getWorkflowId());
        joinTask.setWorkflowType(workflowModel.getWorkflowName());
        joinTask.setCorrelationId(workflowModel.getCorrelationId());
        joinTask.setScheduledTime(System.currentTimeMillis());
        joinTask.setStartTime(System.currentTimeMillis());
        joinTask.setInputData(joinInput);
        joinTask.setTaskId(idGenerator.generate());
        joinTask.setStatus(TaskModel.Status.IN_PROGRESS);
        joinTask.setWorkflowTask(joinWorkflowTask);
        joinTask.setWorkflowPriority(workflowModel.getPriority());
        return joinTask;
    }
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 workflowModel: A instance of the {@link WorkflowModel} 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 TaskModel#setInputData(Map)}
@return a new instance of {@link TaskModel} representing a {@link TaskType#JOIN}
core/src/main/java/com/netflix/conductor/core/execution/mapper/ForkJoinDynamicTaskMapper.java