Program: 129049
Project: 129049
Buggy source:
public void executeProjectTasks(final Project project,final boolean beforeLogon,final IProgressMonitor monitorWrap){
  String taskDesc="String_Node_Str" + project.getLabel() + "String_Node_Str";
  log.trace(taskDesc);
  final List<IProjectMigrationTask> toExecute=GetTasksHelper.getProjectTasks(beforeLogon);
  final List<String> done=new ArrayList<String>(project.getEmfProject().getMigrationTasks());
  done.remove("String_Node_Str");
  Collections.sort(toExecute,new Comparator<IProjectMigrationTask>(){
    public int compare(    IProjectMigrationTask o1,    IProjectMigrationTask o2){
      return o1.getOrder().compareTo(o2.getOrder());
    }
  }
);
  int nbMigrationsToDo=0;
  for (  IProjectMigrationTask task : toExecute) {
    if (!done.contains(task.getId()) && !task.isDeprecated()) {
      nbMigrationsToDo++;
    }
  }
  if (!beforeLogon && (!RelationshipItemBuilder.INDEX_VERSION.equals(project.getEmfProject().getItemsRelationVersion()) || project.getEmfProject().getItemsRelations() == null || project.getEmfProject().getItemsRelations().isEmpty() || nbMigrationsToDo > 0)) {
    done.remove(RELATION_TASK);
  }
  boolean haveAnyBinFolder=false;
  IWorkspace workspace=ResourcesPlugin.getWorkspace();
  IProject fsProject=workspace.getRoot().getProject(project.getTechnicalLabel());
  for (  ERepositoryObjectType type : (ERepositoryObjectType[])ERepositoryObjectType.values()) {
    if (!type.hasFolder()) {
      continue;
    }
    String folderName=ERepositoryObjectType.getFolderName(type);
    if (folderName == null || "String_Node_Str".equals(folderName)) {
      continue;
    }
    IFolder folder=fsProject.getFolder(folderName);
    if (folder.exists() && folder.getFolder("String_Node_Str").exists()) {
      haveAnyBinFolder=true;
      break;
    }
  }
  if (haveAnyBinFolder) {
    done.remove("String_Node_Str");
  }
  final SubProgressMonitor subProgressMonitor=new SubProgressMonitor(monitorWrap,toExecute.size());
  IRepositoryService service=(IRepositoryService)GlobalServiceRegister.getDefault().getService(IRepositoryService.class);
  final IProxyRepositoryFactory repFactory=service.getProxyRepositoryFactory();
  RepositoryWorkUnit repositoryWorkUnit=new RepositoryWorkUnit(project,taskDesc){
    public void run() throws PersistenceException {
      boolean needSave=false;
      if (!beforeLogon) {
        ERepositoryObjectType[] types=(ERepositoryObjectType[])ERepositoryObjectType.values();
        Arrays.sort(types,new Comparator<ERepositoryObjectType>(){
          public int compare(          ERepositoryObjectType arg0,          ERepositoryObjectType arg1){
            if (arg0 == ERepositoryObjectType.PROCESS) {
              return 1;
            }
            if (arg0 == ERepositoryObjectType.JOBLET) {
              return 1;
            }
            return 0;
          }
        }
);
        for (        ERepositoryObjectType type : types) {
          if (!type.isResourceItem()) {
            continue;
          }
          List<IRepositoryViewObject> objects=repFactory.getAll(project,type,true,true);
          for (          IRepositoryViewObject object : objects) {
            Item item=object.getProperty().getItem();
            monitorWrap.subTask("String_Node_Str" + item.getProperty().getLabel());
            subProgressMonitor.worked(1);
            for (            IProjectMigrationTask task : toExecute) {
              if (monitorWrap.isCanceled()) {
                throw new OperationCanceledException(Messages.getString("String_Node_Str",task.getName()));
              }
              if (!done.contains(task.getId()) && !task.isDeprecated()) {
                ExecutionResult status=task.execute(project,item);
switch (status) {
case SUCCESS_WITH_ALERT:
                  if (task.getStatus() != ExecutionResult.FAILURE) {
                    task.setStatus(status);
                  }
case SUCCESS_NO_ALERT:
                if (task.getStatus() != ExecutionResult.FAILURE) {
                  task.setStatus(status);
                }
case NOTHING_TO_DO:
              if (task.getStatus() != ExecutionResult.SUCCESS_WITH_ALERT && task.getStatus() != ExecutionResult.SUCCESS_NO_ALERT && task.getStatus() != ExecutionResult.FAILURE) {
                task.setStatus(status);
              }
            break;
case SKIPPED:
          if (task.getStatus() != ExecutionResult.SUCCESS_WITH_ALERT && task.getStatus() != ExecutionResult.SUCCESS_NO_ALERT && task.getStatus() != ExecutionResult.FAILURE) {
            task.setStatus(status);
          }
        break;
case FAILURE:
      task.setStatus(status);
default :
    task.setStatus(status);
  break;
}
}
}
if (object instanceof RepositoryObject) {
((RepositoryObject)object).unload();
}
}
monitorWrap.subTask("String_Node_Str");
}
}
for (IProjectMigrationTask task : toExecute) {
if (!done.contains(task.getId()) && !task.isDeprecated()) {
try {
ExecutionResult status;
if (beforeLogon) {
status=task.execute(project);
}
 else {
status=task.getStatus();
}
switch (status) {
case SUCCESS_WITH_ALERT:
doneThisSession.add(task);
case SUCCESS_NO_ALERT:
log.debug("String_Node_Str" + task.getName() + "String_Node_Str");
case NOTHING_TO_DO:
done.add(task.getId());
needSave=true;
break;
case SKIPPED:
log.debug("String_Node_Str" + task.getName() + "String_Node_Str");
break;
case FAILURE:
default :
log.debug("String_Node_Str" + task.getName() + "String_Node_Str");
break;
}
}
 catch (Exception e) {
ExceptionHandler.process(e);
log.debug("String_Node_Str" + task.getName() + "String_Node_Str");
}
}
 else if (task.isDeprecated() && !done.contains(task.getId())) {
done.add(task.getId());
needSave=true;
}
}
if (needSave) {
saveProjectMigrationTasksDone(project,done);
}
RelationshipItemBuilder.getInstance().saveRelations();
if (!RelationshipItemBuilder.INDEX_VERSION.equals(project.getEmfProject().getItemsRelationVersion())) {
project.getEmfProject().setItemsRelationVersion(RelationshipItemBuilder.INDEX_VERSION);
}
}
}
;
repositoryWorkUnit.setAvoidUnloadResources(true);
repFactory.executeRepositoryWorkUnit(repositoryWorkUnit);
}

Fixed version (ground truth):
@Override public void executeProjectTasks(final Project project,final boolean beforeLogon,final IProgressMonitor monitorWrap){
  String taskDesc="String_Node_Str" + project.getLabel() + "String_Node_Str";
  log.trace(taskDesc);
  final List<IProjectMigrationTask> toExecute=GetTasksHelper.getProjectTasks(beforeLogon);
  final List<String> done=new ArrayList<String>(project.getEmfProject().getMigrationTasks());
  done.remove("String_Node_Str");
  Collections.sort(toExecute,new Comparator<IProjectMigrationTask>(){
    @Override public int compare(    IProjectMigrationTask o1,    IProjectMigrationTask o2){
      return o1.getOrder().compareTo(o2.getOrder());
    }
  }
);
  int nbMigrationsToDo=0;
  for (  IProjectMigrationTask task : toExecute) {
    if (!done.contains(task.getId()) && !task.isDeprecated()) {
      nbMigrationsToDo++;
    }
  }
  if (!beforeLogon && (!RelationshipItemBuilder.INDEX_VERSION.equals(project.getEmfProject().getItemsRelationVersion()) || project.getEmfProject().getItemsRelations() == null || project.getEmfProject().getItemsRelations().isEmpty() || nbMigrationsToDo > 0)) {
    done.remove(RELATION_TASK);
  }
  boolean haveAnyBinFolder=false;
  IWorkspace workspace=ResourcesPlugin.getWorkspace();
  IProject fsProject=workspace.getRoot().getProject(project.getTechnicalLabel());
  for (  ERepositoryObjectType type : (ERepositoryObjectType[])ERepositoryObjectType.values()) {
    if (!type.hasFolder()) {
      continue;
    }
    String folderName=ERepositoryObjectType.getFolderName(type);
    if (folderName == null || "String_Node_Str".equals(folderName)) {
      continue;
    }
    IFolder folder=fsProject.getFolder(folderName);
    if (folder.exists() && folder.getFolder("String_Node_Str").exists()) {
      haveAnyBinFolder=true;
      break;
    }
  }
  if (haveAnyBinFolder) {
    done.remove("String_Node_Str");
  }
  final SubProgressMonitor subProgressMonitor=new SubProgressMonitor(monitorWrap,toExecute.size());
  IRepositoryService service=(IRepositoryService)GlobalServiceRegister.getDefault().getService(IRepositoryService.class);
  final IProxyRepositoryFactory repFactory=service.getProxyRepositoryFactory();
  RepositoryWorkUnit repositoryWorkUnit=new RepositoryWorkUnit(project,taskDesc){
    @Override public void run() throws PersistenceException {
      boolean needSave=false;
      if (!beforeLogon) {
        ERepositoryObjectType[] types=(ERepositoryObjectType[])ERepositoryObjectType.values();
        Arrays.sort(types,new Comparator<ERepositoryObjectType>(){
          @Override public int compare(          ERepositoryObjectType arg0,          ERepositoryObjectType arg1){
            if (arg0 == ERepositoryObjectType.PROCESS) {
              return 1;
            }
            if (arg0 == ERepositoryObjectType.JOBLET) {
              return 1;
            }
            return 0;
          }
        }
);
        for (        ERepositoryObjectType type : types) {
          if (!type.isResourceItem()) {
            continue;
          }
          List<IRepositoryViewObject> objects=repFactory.getAll(project,type,true,true);
          for (          IRepositoryViewObject object : objects) {
            Item item=object.getProperty().getItem();
            monitorWrap.subTask("String_Node_Str" + item.getProperty().getLabel());
            subProgressMonitor.worked(1);
            for (            IProjectMigrationTask task : toExecute) {
              if (monitorWrap.isCanceled()) {
                throw new OperationCanceledException(Messages.getString("String_Node_Str",task.getName()));
              }
              if (!done.contains(task.getId()) && !task.isDeprecated()) {
                ExecutionResult status=task.execute(project,item);
switch (status) {
case SUCCESS_WITH_ALERT:
                  if (task.getStatus() != ExecutionResult.FAILURE) {
                    task.setStatus(status);
                  }
case SUCCESS_NO_ALERT:
                if (task.getStatus() != ExecutionResult.FAILURE) {
                  task.setStatus(status);
                }
case NOTHING_TO_DO:
              if (task.getStatus() != ExecutionResult.SUCCESS_WITH_ALERT && task.getStatus() != ExecutionResult.SUCCESS_NO_ALERT && task.getStatus() != ExecutionResult.FAILURE) {
                task.setStatus(status);
              }
            break;
case SKIPPED:
          if (task.getStatus() != ExecutionResult.SUCCESS_WITH_ALERT && task.getStatus() != ExecutionResult.SUCCESS_NO_ALERT && task.getStatus() != ExecutionResult.FAILURE) {
            task.setStatus(status);
          }
        break;
case FAILURE:
      task.setStatus(status);
default :
    task.setStatus(status);
  break;
}
}
}
if (object instanceof RepositoryObject) {
((RepositoryObject)object).unload();
}
}
monitorWrap.subTask("String_Node_Str");
}
}
for (IProjectMigrationTask task : toExecute) {
if (!done.contains(task.getId()) && !task.isDeprecated()) {
try {
ExecutionResult status;
if (beforeLogon) {
status=task.execute(project);
}
 else {
status=task.getStatus();
}
switch (status) {
case SUCCESS_WITH_ALERT:
doneThisSession.add(task);
case SUCCESS_NO_ALERT:
log.debug("String_Node_Str" + task.getName() + "String_Node_Str");
case NOTHING_TO_DO:
done.add(task.getId());
needSave=true;
break;
case SKIPPED:
log.debug("String_Node_Str" + task.getName() + "String_Node_Str");
break;
case FAILURE:
default :
log.debug("String_Node_Str" + task.getName() + "String_Node_Str");
break;
}
}
 catch (Exception e) {
ExceptionHandler.process(e);
log.debug("String_Node_Str" + task.getName() + "String_Node_Str");
}
}
 else if (task.isDeprecated() && !done.contains(task.getId())) {
done.add(task.getId());
needSave=true;
}
}
if (needSave) {
saveProjectMigrationTasksDone(project,done);
}
if (!RelationshipItemBuilder.INDEX_VERSION.equals(project.getEmfProject().getItemsRelationVersion())) {
project.getEmfProject().setItemsRelationVersion(RelationshipItemBuilder.INDEX_VERSION);
}
RelationshipItemBuilder.getInstance().saveRelations();
}
}
;
repositoryWorkUnit.setAvoidUnloadResources(true);
repFactory.executeRepositoryWorkUnit(repositoryWorkUnit);
}