Program: 120823
Project: 120823
Buggy source:
/** 
 * DOC talend Comment method "getTemplate".
 * @param event
 * @return the validate drag able node list
 */
protected Object getTemplate(DragSourceEvent event){
  final RootEditPart rootEditPart=getViewer().getRootEditPart();
  if (rootEditPart instanceof AbstractGraphicalEditPart) {
    AbstractGraphicalEditPart graphicPart=(AbstractGraphicalEditPart)rootEditPart;
    final IFigure figure=graphicPart.getFigure();
    final IFigure findFigureAt=figure.findFigureAt(new Point(event.x,event.y));
    if (findFigureAt instanceof ISash) {
      return findFigureAt;
    }
  }
  List<EditPart> filtedSelection=new ArrayList<EditPart>();
  for (  Object part : getViewer().getSelectedEditParts()) {
    if (part instanceof TreeNodeEditPart || part instanceof VarNodeEditPart) {
      filtedSelection.add((EditPart)part);
    }
  }
  if (filtedSelection == null || filtedSelection.isEmpty()) {
    return null;
  }
  List toTransfer=new ArrayList();
  TransferdType type=null;
  List<EditPart> partList=new ArrayList<EditPart>();
  EditPart lastSelection=filtedSelection.get(filtedSelection.size() - 1);
  if (lastSelection instanceof TreeNodeEditPart) {
    type=TransferdType.INPUT;
  }
 else   if (lastSelection instanceof VarNodeEditPart) {
    type=TransferdType.VAR;
  }
  if (type != null) {
    if (filtedSelection.size() > 1) {
      partList.addAll(lastSelection.getParent().getChildren());
      Map<EditPart,Integer> partAndIndex=new HashMap<EditPart,Integer>();
      if (type == TransferdType.INPUT) {
        for (        EditPart treePart : filtedSelection) {
          if (!XmlMapUtil.isDragable((TreeNode)treePart.getModel())) {
            return null;
          }
        }
        AbstractInOutTreeEditPart abstractInOutTreePart=XmlMapUtil.getAbstractInOutTreePart((TreeNodeEditPart)lastSelection);
        if (abstractInOutTreePart != null) {
          partList=XmlMapUtil.getFlatChildrenPartList(abstractInOutTreePart);
        }
      }
 else {
        partList.addAll(lastSelection.getParent().getChildren());
      }
      for (      EditPart selected : filtedSelection) {
        int indexOf=partList.indexOf(selected);
        if (indexOf != -1) {
          partAndIndex.put(selected,indexOf);
          int index=0;
          for (int i=0; i < toTransfer.size(); i++) {
            if (indexOf > partAndIndex.get(toTransfer.get(i))) {
              index=i + 1;
            }
          }
          toTransfer.add(index,selected);
        }
      }
    }
 else {
      if (!XmlMapUtil.isDragable((TreeNode)lastSelection.getModel())) {
        return null;
      }
      toTransfer.add(lastSelection);
    }
    return new TransferedObject(toTransfer,type);
  }
  return null;
}

Fixed version (ground truth):
/** 
 * DOC talend Comment method "getTemplate".
 * @param event
 * @return the validate drag able node list
 */
protected Object getTemplate(DragSourceEvent event){
  final RootEditPart rootEditPart=getViewer().getRootEditPart();
  if (rootEditPart instanceof AbstractGraphicalEditPart) {
    AbstractGraphicalEditPart graphicPart=(AbstractGraphicalEditPart)rootEditPart;
    final IFigure figure=graphicPart.getFigure();
    final IFigure findFigureAt=figure.findFigureAt(new Point(event.x,event.y));
    if (findFigureAt instanceof ISash) {
      return findFigureAt;
    }
  }
  List<EditPart> filtedSelection=new ArrayList<EditPart>();
  for (  Object part : getViewer().getSelectedEditParts()) {
    if (part instanceof TreeNodeEditPart || part instanceof VarNodeEditPart) {
      filtedSelection.add((EditPart)part);
    }
  }
  if (filtedSelection == null || filtedSelection.isEmpty()) {
    return null;
  }
  List toTransfer=new ArrayList();
  TransferdType type=null;
  List<EditPart> partList=new ArrayList<EditPart>();
  EditPart lastSelection=filtedSelection.get(filtedSelection.size() - 1);
  if (lastSelection instanceof TreeNodeEditPart) {
    type=TransferdType.INPUT;
  }
 else   if (lastSelection instanceof VarNodeEditPart) {
    type=TransferdType.VAR;
  }
  if (type != null) {
    if (filtedSelection.size() > 1) {
      partList.addAll(lastSelection.getParent().getChildren());
      Map<EditPart,Integer> partAndIndex=new HashMap<EditPart,Integer>();
      if (type == TransferdType.INPUT) {
        for (        EditPart treePart : filtedSelection) {
          if (!XmlMapUtil.isDragable((TreeNode)treePart.getModel())) {
            return null;
          }
        }
        AbstractInOutTreeEditPart abstractInOutTreePart=XmlMapUtil.getAbstractInOutTreePart((TreeNodeEditPart)lastSelection);
        if (abstractInOutTreePart != null) {
          partList=XmlMapUtil.getFlatChildrenPartList(abstractInOutTreePart);
        }
      }
 else {
        partList.addAll(lastSelection.getParent().getChildren());
      }
      for (      EditPart selected : filtedSelection) {
        int indexOf=partList.indexOf(selected);
        if (indexOf != -1) {
          partAndIndex.put(selected,indexOf);
          int index=0;
          for (int i=0; i < toTransfer.size(); i++) {
            if (indexOf > partAndIndex.get(toTransfer.get(i))) {
              index=i + 1;
            }
          }
          toTransfer.add(index,selected);
        }
      }
    }
 else {
      if (lastSelection.getModel() instanceof TreeNode && !XmlMapUtil.isDragable((TreeNode)lastSelection.getModel())) {
        return null;
      }
      toTransfer.add(lastSelection);
    }
    return new TransferedObject(toTransfer,type);
  }
  return null;
}