public static void CreateTask(ProjectWrapper projectWrapper, PackageWrapper packageWrapper, ContainerWrapper containerWrapper, IonStructure.Task task, List <ScriptProject> globalScriptProjects, ScriptProject referencedGlobalScriptProject = null) { try { ExecutableWrapper executableWrapper = null; switch (task) { case DataFlow dataFlow: DataFlowTask dataFlowTask = new DataFlowTask(dataFlow, projectWrapper, packageWrapper, containerWrapper); executableWrapper = dataFlowTask.DataFlowTaskWrapper; break; case ExecuteSql executeSql: ExecuteSqlTask executeSqlTask = new ExecuteSqlTask(executeSql, containerWrapper); executableWrapper = executeSqlTask.ExecuteSqlTaskWrapper; break; case ExecuteProcess executeProcess: executableWrapper = ExecuteProcessTask.CreateTask(executeProcess, containerWrapper); break; case Expression expression: executableWrapper = ExpressionTask.CreateTask(expression, containerWrapper); break; case Script script: ScriptTask scriptTask = new ScriptTask(script, projectWrapper, packageWrapper, containerWrapper, referencedGlobalScriptProject); executableWrapper = scriptTask.ScriptTaskWrapper; break; case ForLoopContainer forLoopContainer: executableWrapper = ContainerExecutable.CreateForLoopContainer(forLoopContainer, projectWrapper, packageWrapper, containerWrapper, globalScriptProjects); break; case ForEachFromVariableLoopContainer forEachFromVarLoopContainer: executableWrapper = ContainerExecutable.CreateForEachFromVariableLoopContainer(forEachFromVarLoopContainer, projectWrapper, packageWrapper, containerWrapper, globalScriptProjects); break; case SequenceContainer sequenceContainer: executableWrapper = ContainerExecutable.CreateSequenceContainer(sequenceContainer, projectWrapper, packageWrapper, containerWrapper, globalScriptProjects); break; } AddPrecedenceConstraints(containerWrapper, executableWrapper, task.PrecedenceConstraints); } catch (Exception e) { if (e.Data[Constants.ExceptionTaskKey] == null) { e.Data[Constants.ExceptionTaskKey] = task.Name; } else { e.Data[Constants.ExceptionTaskKey] = task.Name + "/" + e.Data[Constants.ExceptionTaskKey]; // If task is not null then the task being created is a container, and an exception has been thrown in one of its underlying tasks. } throw; } }
public static void ConstructTask(ProjectWrapper project, PackageWrapper package, ContainerWrapper taskContainer, Task task, ScriptProject innerTask = null) { try { ExecutableWrapper executableTask = null; switch (task) { case DataFlow dataflowTask: executableTask = DataFlowTask.ConstructTask(dataflowTask, project, package, taskContainer); break; case ExecuteSql executeSqlTask: executableTask = ConstructExecuteSqlTask(executeSqlTask, taskContainer); break; case ExecuteProcess executeProcessTask: executableTask = ConstructExecuteProcessTask(executeProcessTask, taskContainer); break; case Expression expressionTask: executableTask = ConstructExpressionTask(expressionTask, taskContainer); break; case Script scriptTask: executableTask = ConstructScriptTask(scriptTask, project, package, taskContainer, innerTask); break; case ForLoopContainer forLoopContainer: executableTask = ContainerExecutable.ConstructForLoopContainer(forLoopContainer, project, package, taskContainer); break; case ForEachFromVariableLoopContainer forEachFromVarLoopContainer: executableTask = ContainerExecutable.ConstructForEachFromVariableLoopContainer(forEachFromVarLoopContainer, project, package, taskContainer); break; case SequenceContainer sequenceContainer: executableTask = ContainerExecutable.ConstructSequenceContainer(sequenceContainer, project, package, taskContainer); break; } AddPrecedenceConstraints(taskContainer, executableTask, task.PrecedenceConstraints); } catch (Exception e) { if (e.Data[Constants.ExceptionTaskKey] == null) { e.Data[Constants.ExceptionTaskKey] = task.Name; } else { e.Data[Constants.ExceptionTaskKey] = task.Name + "/" + e.Data[Constants.ExceptionTaskKey]; // If task is not null then the task being constructed is a container and an exception has been thrown in one of the underlying tasks. } throw; } }
private static void AddPrecedenceConstraints(ContainerWrapper taskContainer, ExecutableWrapper task, PrecedenceConstraintList constraints) { if (constraints != null) { foreach (InputPath input in constraints.Inputs) { ExecutableWrapper sourceTask = taskContainer.FindTask(input.OutputPathName); if (sourceTask == null) { throw new Exception($"Failed to find task {input.OutputPathName}, referenced by {task.Name} in container {taskContainer.Name}!"); } string evaluationValue = input.EvaluationValue.ToString(); string evaluationOperation = input.EvaluationOperation.ToString(); bool logicalAnd = constraints.LogicalType == LogicalOperationEnum.And; taskContainer.AddPrecedenceConstraint(sourceTask, task, input.Expression, evaluationValue, evaluationOperation, logicalAnd); } } }