Program: 32675
Project: 32675
Buggy source:
/** 
 * {@inheritDoc} 
 */
public void listChanged(ListEvent<E> listChanges){
  if (listChanges.isReordering()) {
    int[] reorderMap=listChanges.getReorderMap();
    IndexedTreeNode[] sortedNodes=new IndexedTreeNode[sorted.size()];
    int index=0;
    for (IndexedTreeIterator<IndexedTreeNode> i=unsorted.iterator(0); i.hasNext(); index++) {
      IndexedTreeNode<IndexedTreeNode> unsortedNode=i.next();
      sortedNodes[index]=unsortedNode.getValue();
    }
    index=0;
    for (IndexedTreeIterator<IndexedTreeNode> i=unsorted.iterator(0); i.hasNext(); index++) {
      IndexedTreeNode<IndexedTreeNode> unsortedNode=i.next();
      unsortedNode.setValue(sortedNodes[reorderMap[index]]);
      sortedNodes[reorderMap[index]].setValue(unsortedNode);
    }
    return;
  }
  updates.beginEvent();
  LinkedList<IndexedTreeNode> insertNodes=new LinkedList<IndexedTreeNode>();
  List<IndexedTreeNode<IndexedTreeNode>> updateNodes=new ArrayList<IndexedTreeNode<IndexedTreeNode>>();
  while (listChanges.next()) {
    int unsortedIndex=listChanges.getIndex();
    int changeType=listChanges.getType();
    if (changeType == ListEvent.INSERT) {
      IndexedTreeNode<IndexedTreeNode> unsortedNode=unsorted.addByNode(unsortedIndex,IndexedTreeNode.EMPTY_NODE);
      insertNodes.addLast(unsortedNode);
    }
 else     if (changeType == ListEvent.UPDATE) {
      IndexedTreeNode<IndexedTreeNode> unsortedNode=unsorted.getNode(unsortedIndex);
      IndexedTreeNode sortedNode=unsortedNode.getValue();
      sortedNode.setSorted(false);
      updateNodes.add(sortedNode);
    }
 else     if (changeType == ListEvent.DELETE) {
      IndexedTreeNode<IndexedTreeNode> unsortedNode=unsorted.getNode(unsortedIndex);
      unsortedNode.removeFromTree(unsorted);
      int deleteSortedIndex=deleteByUnsortedNode(unsortedNode);
      updates.addDelete(deleteSortedIndex);
    }
  }
  for (Iterator<IndexedTreeNode<IndexedTreeNode>> i=updateNodes.iterator(); i.hasNext(); ) {
    IndexedTreeNode<IndexedTreeNode> sortedNode=i.next();
    int originalIndex=sortedNode.getIndex();
    if (isNodeInSortedOrder(sortedNode)) {
      sortedNode.setSorted(true);
      updates.addUpdate(originalIndex);
    }
 else     if (mode == AVOID_MOVING_ELEMENTS) {
      updates.addUpdate(originalIndex);
    }
 else {
      sortedNode.removeFromTree(sorted);
      updates.addDelete(originalIndex);
      int insertedIndex=insertByUnsortedNode(sortedNode.getValue());
      updates.addInsert(insertedIndex);
    }
  }
  while (!insertNodes.isEmpty()) {
    IndexedTreeNode insertNode=insertNodes.removeFirst();
    int insertedIndex=insertByUnsortedNode(insertNode);
    updates.addInsert(insertedIndex);
  }
  updates.commitEvent();
}

Fixed version (ground truth):
/** 
 * {@inheritDoc} 
 */
public void listChanged(ListEvent<E> listChanges){
  if (listChanges.isReordering()) {
    int[] sourceReorder=listChanges.getReorderMap();
    int[] previousIndexToSortedIndex=new int[sorted.size()];
    int index=0;
    for (IndexedTreeIterator<IndexedTreeNode> i=sorted.iterator(0); i.hasNext(); index++) {
      IndexedTreeNode<IndexedTreeNode> sortedNode=i.next();
      int unsortedIndex=sortedNode.getValue().getIndex();
      previousIndexToSortedIndex[unsortedIndex]=index;
    }
    int[] newIndexToSortedIndex=new int[sorted.size()];
    for (int i=0; i < previousIndexToSortedIndex.length; i++) {
      newIndexToSortedIndex[i]=previousIndexToSortedIndex[sourceReorder[i]];
    }
    IndexedTreeNode<IndexedTreeNode>[] unsortedNodes=new IndexedTreeNode[unsorted.size()];
    index=0;
    for (IndexedTreeIterator<IndexedTreeNode> i=unsorted.iterator(0); i.hasNext(); index++) {
      IndexedTreeNode<IndexedTreeNode> unsortedNode=i.next();
      unsortedNodes[index]=unsortedNode;
    }
    Arrays.sort(unsortedNodes,sorted.getComparator());
    int[] reorderMap=new int[sorted.size()];
    boolean indexChanged=false;
    index=0;
    for (IndexedTreeIterator<IndexedTreeNode> i=sorted.iterator(0); i.hasNext(); index++) {
      IndexedTreeNode<IndexedTreeNode> sortedNode=i.next();
      IndexedTreeNode<IndexedTreeNode> unsortedNode=unsortedNodes[index];
      sortedNode.setValue(unsortedNode);
      unsortedNode.setValue(sortedNode);
      int unsortedIndex=unsortedNode.getIndex();
      reorderMap[index]=newIndexToSortedIndex[unsortedIndex];
      indexChanged=indexChanged || (index != reorderMap[index]);
    }
    if (indexChanged) {
      updates.beginEvent();
      updates.reorder(reorderMap);
      updates.commitEvent();
    }
    return;
  }
  updates.beginEvent();
  LinkedList<IndexedTreeNode> insertNodes=new LinkedList<IndexedTreeNode>();
  List<IndexedTreeNode<IndexedTreeNode>> updateNodes=new ArrayList<IndexedTreeNode<IndexedTreeNode>>();
  while (listChanges.next()) {
    int unsortedIndex=listChanges.getIndex();
    int changeType=listChanges.getType();
    if (changeType == ListEvent.INSERT) {
      IndexedTreeNode<IndexedTreeNode> unsortedNode=unsorted.addByNode(unsortedIndex,IndexedTreeNode.EMPTY_NODE);
      insertNodes.addLast(unsortedNode);
    }
 else     if (changeType == ListEvent.UPDATE) {
      IndexedTreeNode<IndexedTreeNode> unsortedNode=unsorted.getNode(unsortedIndex);
      IndexedTreeNode sortedNode=unsortedNode.getValue();
      sortedNode.setSorted(false);
      updateNodes.add(sortedNode);
    }
 else     if (changeType == ListEvent.DELETE) {
      IndexedTreeNode<IndexedTreeNode> unsortedNode=unsorted.getNode(unsortedIndex);
      unsortedNode.removeFromTree(unsorted);
      int deleteSortedIndex=deleteByUnsortedNode(unsortedNode);
      updates.addDelete(deleteSortedIndex);
    }
  }
  for (Iterator<IndexedTreeNode<IndexedTreeNode>> i=updateNodes.iterator(); i.hasNext(); ) {
    IndexedTreeNode<IndexedTreeNode> sortedNode=i.next();
    int originalIndex=sortedNode.getIndex();
    if (isNodeInSortedOrder(sortedNode)) {
      sortedNode.setSorted(true);
      updates.addUpdate(originalIndex);
    }
 else     if (mode == AVOID_MOVING_ELEMENTS) {
      updates.addUpdate(originalIndex);
    }
 else {
      sortedNode.removeFromTree(sorted);
      updates.addDelete(originalIndex);
      int insertedIndex=insertByUnsortedNode(sortedNode.getValue());
      updates.addInsert(insertedIndex);
    }
  }
  while (!insertNodes.isEmpty()) {
    IndexedTreeNode insertNode=insertNodes.removeFirst();
    int insertedIndex=insertByUnsortedNode(insertNode);
    updates.addInsert(insertedIndex);
  }
  updates.commitEvent();
}