Program: 43107
Project: 43107
Buggy source:
/** 
 * Run the rollback. Contains appropriate methods of catching errors and notifying the player
 */
public void run(){
  int i=0;
  while (i < 200 && rollbackQueue.hasNext()) {
    DataEntry entry=rollbackQueue.next();
    if (entry.getType() == null || !entry.getType().canRollback())     continue;
    World world=HawkEye.server.getWorld(entry.getWorld());
    if (world == null)     continue;
    Location loc=new Location(world,entry.getX(),entry.getY(),entry.getZ());
    Block block=world.getBlockAt(loc);
    if (rollbackType == RollbackType.GLOBAL && entry.rollback(world.getBlockAt(loc))) {
      undo.add(block.getState());
      if (Config.DeleteDataOnRollback)       DataManager.deleteEntry(entry.getDataId());
      counter++;
    }
 else     if (rollbackType == RollbackType.LOCAL && entry.rollbackPlayer(block,(Player)session.getSender())) {
      localUndo.add(block);
      counter++;
    }
  }
  if (!rollbackQueue.hasNext()) {
    Bukkit.getServer().getScheduler().cancelTask(timerID);
    if (rollbackType == RollbackType.GLOBAL) {
      session.setRollbackUndo(undo);
      session.setDoingRollback(false);
      Util.sendMessage(session.getSender(),"String_Node_Str" + counter + "String_Node_Str");
      Util.sendMessage(session.getSender(),"String_Node_Str");
    }
 else {
      session.setLocalRollbackUndo(localUndo);
      Util.sendMessage(session.getSender(),"String_Node_Str" + counter + "String_Node_Str");
      Util.sendMessage(session.getSender(),"String_Node_Str");
    }
    Util.debug("String_Node_Str" + counter + "String_Node_Str");
  }
}

Fixed version (ground truth):
/** 
 * Run the rollback. Contains appropriate methods of catching errors and notifying the player
 */
public void run(){
  int i=0;
  while (i < 200 && rollbackQueue.hasNext()) {
    DataEntry entry=rollbackQueue.next();
    if (entry.getType() == null || !entry.getType().canRollback())     continue;
    World world=HawkEye.server.getWorld(entry.getWorld());
    if (world == null)     continue;
    Location loc=new Location(world,entry.getX(),entry.getY(),entry.getZ());
    Block block=world.getBlockAt(loc);
    BlockState state=block.getState();
    if (rollbackType == RollbackType.GLOBAL && entry.rollback(world.getBlockAt(loc))) {
      undo.add(state);
      if (Config.DeleteDataOnRollback)       DataManager.deleteEntry(entry.getDataId());
      counter++;
    }
 else     if (rollbackType == RollbackType.LOCAL && entry.rollbackPlayer(block,(Player)session.getSender())) {
      localUndo.add(block);
      counter++;
    }
  }
  if (!rollbackQueue.hasNext()) {
    Bukkit.getServer().getScheduler().cancelTask(timerID);
    if (rollbackType == RollbackType.GLOBAL) {
      session.setRollbackUndo(undo);
      session.setDoingRollback(false);
      Util.sendMessage(session.getSender(),"String_Node_Str" + counter + "String_Node_Str");
      Util.sendMessage(session.getSender(),"String_Node_Str");
    }
 else {
      session.setLocalRollbackUndo(localUndo);
      Util.sendMessage(session.getSender(),"String_Node_Str" + counter + "String_Node_Str");
      Util.sendMessage(session.getSender(),"String_Node_Str");
    }
    Util.debug("String_Node_Str" + counter + "String_Node_Str");
  }
}