From 65ba053aee248f6b3175f1b0c3d08ba65d2dd648 Mon Sep 17 00:00:00 2001 From: StevenLawson Date: Sun, 15 Sep 2013 14:11:36 -0400 Subject: [PATCH] Wrapped rollback with a Callable to make sure that it executes on the Bukkit thread. Saw this in a log: java.util.ConcurrentModificationException at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:819) at java.util.ArrayList$Itr.next(ArrayList.java:791) at me.StevenLawson.TotalFreedomMod.TFM_RollbackManager.rollback(TFM_RollbackManager.java:94) at me.StevenLawson.TotalFreedomMod.Commands.Command_gtfo.run(Command_gtfo.java:51) --- .../TotalFreedomMod/TFM_RollbackManager.java | 78 ++++++++++++------- 1 file changed, 48 insertions(+), 30 deletions(-) diff --git a/src/me/StevenLawson/TotalFreedomMod/TFM_RollbackManager.java b/src/me/StevenLawson/TotalFreedomMod/TFM_RollbackManager.java index 07a42a8b..76dca894 100644 --- a/src/me/StevenLawson/TotalFreedomMod/TFM_RollbackManager.java +++ b/src/me/StevenLawson/TotalFreedomMod/TFM_RollbackManager.java @@ -6,6 +6,8 @@ import java.util.Iterator; import java.util.List; import java.util.ListIterator; import java.util.Map; +import java.util.concurrent.Callable; +import java.util.concurrent.Future; import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.Material; @@ -84,39 +86,55 @@ public class TFM_RollbackManager public static int rollback(final String playerName) { - final List entries = getEntriesByPlayer(playerName); - if (entries == null) + final Future future = Bukkit.getScheduler().callSyncMethod(TotalFreedomMod.plugin, new Callable() + { + @Override + public Integer call() throws Exception + { + final List entries = getEntriesByPlayer(playerName); + if (entries == null) + { + return 0; + } + + int count = entries.size(); + for (RollbackEntry entry : entries) + { + if (entry != null) + { + entry.restore(); + } + } + + if (!REMOVE_ROLLBACK_HISTORY.contains(playerName.toLowerCase())) + { + REMOVE_ROLLBACK_HISTORY.add(playerName.toLowerCase()); + } + + new BukkitRunnable() + { + @Override + public void run() + { + if (REMOVE_ROLLBACK_HISTORY.contains(playerName.toLowerCase())) + { + REMOVE_ROLLBACK_HISTORY.remove(playerName.toLowerCase()); + purgeEntries(playerName); + } + } + }.runTaskLater(TotalFreedomMod.plugin, 20L * 20L); + return count; + } + }); + + try + { + return future.get(); + } + catch (Exception ex) { return 0; } - - int count = entries.size(); - for (RollbackEntry entry : entries) - { - if (entry != null) - { - entry.restore(); - } - } - - if (!REMOVE_ROLLBACK_HISTORY.contains(playerName.toLowerCase())) - { - REMOVE_ROLLBACK_HISTORY.add(playerName.toLowerCase()); - } - - new BukkitRunnable() - { - @Override - public void run() - { - if (REMOVE_ROLLBACK_HISTORY.contains(playerName.toLowerCase())) - { - REMOVE_ROLLBACK_HISTORY.remove(playerName.toLowerCase()); - purgeEntries(playerName); - } - } - }.runTaskLater(TotalFreedomMod.plugin, 20L * 20L); - return count; } public static int undoRollback(String playerName)