Program: 129663
Project: 129663
Buggy source:
private void createOperation(String newJobName,RepositoryNode target,CopyObjectAction copyObjectAction,TreeSelection selectionInClipboard){
  Object currentSource=selectionInClipboard.toArray()[0];
  try {
    IPath path=RepositoryNodeUtilities.getPath(target);
    if (((RepositoryNode)currentSource).getType().equals(ENodeType.REPOSITORY_ELEMENT)) {
      Item originalItem=((RepositoryNode)currentSource).getObject().getProperty().getItem();
      List<IRepositoryViewObject> allVersion=factory.getAllVersion(originalItem.getProperty().getId());
      for (      IRepositoryViewObject obj : allVersion) {
        if (obj.getVersion().equals(originalItem.getProperty().getVersion())) {
          originalItem=obj.getProperty().getItem();
          break;
        }
      }
      if (allVersion.size() == 1) {
        duplicateSingleVersionItem(originalItem,path,newJobName);
      }
 else       if (allVersion.size() > 1) {
        PastSelectorDialog dialog=new PastSelectorDialog(Display.getCurrent().getActiveShell(),allVersion,sourceNode);
        if (dialog.open() == Window.OK) {
          Set<IRepositoryViewObject> selectedVersionItems=dialog.getSelectedVersionItems();
          String id=null;
          String label=null;
          boolean isfirst=true;
          boolean needSys=true;
          for (          IRepositoryViewObject object : selectedVersionItems) {
            Item selectedItem=object.getProperty().getItem();
            final Item copy=factory.copy(selectedItem,path);
            if (isfirst) {
              id=copy.getProperty().getId();
              label=copy.getProperty().getLabel();
              isfirst=false;
            }
            copy.getProperty().setId(id);
            copy.getProperty().setLabel(newJobName);
            copy.getProperty().setDisplayName(newJobName);
            if (needSys && originalItem instanceof RoutineItem) {
              String lastestVersion=getLastestVersion(selectedVersionItems);
              if (lastestVersion.equals(copy.getProperty().getVersion())) {
                synDuplicatedRoutine((RoutineItem)copy);
                needSys=false;
              }
            }
            final RepositoryWorkUnit<Object> workUnit=new RepositoryWorkUnit<Object>(this.getText(),this){
              @Override protected void run() throws LoginException, PersistenceException {
                if (copy instanceof ProcessItem) {
                  RelationshipItemBuilder.getInstance().addOrUpdateItem((ProcessItem)copy);
                }
                factory.save(copy);
              }
            }
;
            workUnit.setAvoidUnloadResources(true);
            factory.executeRepositoryWorkUnit(workUnit);
          }
        }
      }
    }
  }
 catch (  Exception e) {
    ExceptionHandler.process(e);
  }
}

Fixed version (ground truth):
private void createOperation(final String newJobName,final RepositoryNode target,CopyObjectAction copyObjectAction,final TreeSelection selectionInClipboard){
  final IWorkspaceRunnable op=new IWorkspaceRunnable(){
    public void run(    IProgressMonitor monitor) throws CoreException {
      Object currentSource=selectionInClipboard.toArray()[0];
      try {
        IPath path=RepositoryNodeUtilities.getPath(target);
        if (((RepositoryNode)currentSource).getType().equals(ENodeType.REPOSITORY_ELEMENT)) {
          Item originalItem=((RepositoryNode)currentSource).getObject().getProperty().getItem();
          List<IRepositoryViewObject> allVersion=factory.getAllVersion(originalItem.getProperty().getId());
          for (          IRepositoryViewObject obj : allVersion) {
            if (obj.getVersion().equals(originalItem.getProperty().getVersion())) {
              originalItem=obj.getProperty().getItem();
              break;
            }
          }
          if (allVersion.size() == 1) {
            duplicateSingleVersionItem(originalItem,path,newJobName);
          }
 else           if (allVersion.size() > 1) {
            PastSelectorDialog dialog=new PastSelectorDialog(Display.getCurrent().getActiveShell(),allVersion,sourceNode);
            if (dialog.open() == Window.OK) {
              Set<IRepositoryViewObject> selectedVersionItems=dialog.getSelectedVersionItems();
              String id=null;
              String label=null;
              boolean isfirst=true;
              boolean needSys=true;
              for (              IRepositoryViewObject object : selectedVersionItems) {
                Item selectedItem=object.getProperty().getItem();
                final Item copy=factory.copy(selectedItem,path);
                if (isfirst) {
                  id=copy.getProperty().getId();
                  label=copy.getProperty().getLabel();
                  isfirst=false;
                }
                copy.getProperty().setId(id);
                copy.getProperty().setLabel(newJobName);
                copy.getProperty().setDisplayName(newJobName);
                if (needSys && originalItem instanceof RoutineItem) {
                  String lastestVersion=getLastestVersion(selectedVersionItems);
                  if (lastestVersion.equals(copy.getProperty().getVersion())) {
                    synDuplicatedRoutine((RoutineItem)copy);
                    needSys=false;
                  }
                }
                final RepositoryWorkUnit<Object> workUnit=new RepositoryWorkUnit<Object>(getText(),this){
                  @Override protected void run() throws LoginException, PersistenceException {
                    if (copy instanceof ProcessItem) {
                      RelationshipItemBuilder.getInstance().addOrUpdateItem(copy);
                    }
                    factory.save(copy);
                  }
                }
;
                workUnit.setAvoidUnloadResources(true);
                factory.executeRepositoryWorkUnit(workUnit);
              }
            }
          }
        }
      }
 catch (      Exception e) {
        ExceptionHandler.process(e);
      }
    }
  }
;
  IRunnableWithProgress iRunnableWithProgress=new IRunnableWithProgress(){
    public void run(    IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
      IWorkspace workspace=ResourcesPlugin.getWorkspace();
      try {
        ISchedulingRule schedulingRule=workspace.getRoot();
        workspace.run(op,schedulingRule,IWorkspace.AVOID_UPDATE,monitor);
      }
 catch (      CoreException e) {
        throw new InvocationTargetException(e);
      }
    }
  }
;
  try {
    new ProgressMonitorDialog(null).run(true,true,iRunnableWithProgress);
  }
 catch (  InvocationTargetException e) {
    ExceptionHandler.process(e);
  }
catch (  InterruptedException e) {
  }
}