Program: 4833
Project: 4833
Buggy source:
private void addProgram(String phaseName,WorkflowProgramAdder programAdder){
  PipelinePhase phase=plan.getPhase(phaseName);
  if (phase == null) {
    return;
  }
  String programName="String_Node_Str" + phaseNum;
  phaseNum++;
  for (  StageInfo connectorInfo : phase.getStagesOfType(Constants.CONNECTOR_TYPE)) {
    String connectorName=connectorInfo.getName();
    String datasetName=connectorDatasets.get(connectorName);
    if (datasetName == null) {
      datasetName="String_Node_Str" + connectorNum++;
      connectorDatasets.put(connectorName,datasetName);
      ConnectorSource connectorSource=new ConnectorSource(datasetName,null);
      connectorSource.configure(getConfigurer());
    }
  }
  Map<String,String> phaseConnectorDatasets=new HashMap<>();
  for (  StageInfo connectorStage : phase.getStagesOfType(Constants.CONNECTOR_TYPE)) {
    phaseConnectorDatasets.put(connectorStage.getName(),connectorDatasets.get(connectorStage.getName()));
  }
  BatchPhaseSpec batchPhaseSpec=new BatchPhaseSpec(programName,phase,spec.getResources(),spec.getDriverResources(),spec.getClientResources(),spec.isStageLoggingEnabled(),spec.isProcessTimingEnabled(),phaseConnectorDatasets,spec.getNumOfRecordsPreview(),spec.getProperties());
  Set<String> pluginTypes=batchPhaseSpec.getPhase().getPluginTypes();
  if (pluginTypes.contains(Action.PLUGIN_TYPE)) {
    programAdder.addAction(new PipelineAction(batchPhaseSpec));
  }
 else   if (pluginTypes.contains(Constants.SPARK_PROGRAM_PLUGIN_TYPE)) {
    String stageName=phase.getStagesOfType(Constants.SPARK_PROGRAM_PLUGIN_TYPE).iterator().next().getName();
    StageSpec stageSpec=stageSpecs.get(stageName);
    applicationConfigurer.addSpark(new ExternalSparkProgram(batchPhaseSpec,stageSpec));
    programAdder.addSpark(programName);
  }
 else   if (useSpark) {
    applicationConfigurer.addSpark(new ETLSpark(batchPhaseSpec));
    programAdder.addSpark(programName);
  }
 else {
    applicationConfigurer.addMapReduce(new ETLMapReduce(batchPhaseSpec));
    programAdder.addMapReduce(programName);
  }
}

Fixed version (ground truth):
private void addProgram(String phaseName,WorkflowProgramAdder programAdder){
  PipelinePhase phase=plan.getPhase(phaseName);
  if (phase == null) {
    return;
  }
  String programName="String_Node_Str" + phaseNum;
  phaseNum++;
  for (  StageInfo connectorInfo : phase.getStagesOfType(Constants.CONNECTOR_TYPE)) {
    String connectorName=connectorInfo.getName();
    String datasetName=connectorDatasets.get(connectorName);
    if (datasetName == null) {
      datasetName="String_Node_Str" + connectorNum++;
      connectorDatasets.put(connectorName,datasetName);
      ConnectorSource connectorSource=new ConnectorSource(datasetName,null);
      connectorSource.configure(getConfigurer());
    }
  }
  Map<String,String> phaseConnectorDatasets=new HashMap<>();
  for (  StageInfo connectorStage : phase.getStagesOfType(Constants.CONNECTOR_TYPE)) {
    phaseConnectorDatasets.put(connectorStage.getName(),connectorDatasets.get(connectorStage.getName()));
  }
  BatchPhaseSpec batchPhaseSpec=new BatchPhaseSpec(programName,phase,spec.getResources(),spec.getDriverResources(),spec.getClientResources(),spec.isStageLoggingEnabled(),spec.isProcessTimingEnabled(),phaseConnectorDatasets,spec.getNumOfRecordsPreview(),spec.getProperties());
  Set<String> pluginTypes=batchPhaseSpec.getPhase().getPluginTypes();
  if (pluginTypes.contains(Action.PLUGIN_TYPE)) {
    programAdder.addAction(new PipelineAction(batchPhaseSpec));
  }
 else   if (pluginTypes.contains(Constants.SPARK_PROGRAM_PLUGIN_TYPE)) {
    String stageName=phase.getStagesOfType(Constants.SPARK_PROGRAM_PLUGIN_TYPE).iterator().next().getName();
    StageSpec stageSpec=stageSpecs.get(stageName);
    applicationConfigurer.addSpark(new ExternalSparkProgram(batchPhaseSpec,stageSpec));
    programAdder.addSpark(programName);
  }
 else   if (useSpark) {
    applicationConfigurer.addSpark(new ETLSpark(batchPhaseSpec));
    programAdder.addSpark(programName);
  }
 else {
    applicationConfigurer.addMapReduce(new ETLMapReduce(batchPhaseSpec,new HashSet<>(connectorDatasets.values())));
    programAdder.addMapReduce(programName);
  }
}