Report progress for large (10k+) rollbacks

Reorganized messy imports
This commit is contained in:
Ammar Askar
2012-12-15 00:23:37 +05:00
parent a14e48fafb
commit 990881e236
3 changed files with 75 additions and 58 deletions

View File

@@ -1,25 +1,22 @@
package de.diddiz.LogBlock; package de.diddiz.LogBlock;
import static de.diddiz.LogBlock.Session.getSession; import de.diddiz.LogBlock.QueryParams.BlockChangeType;
import static de.diddiz.LogBlock.config.Config.askClearLogAfterRollback; import de.diddiz.LogBlock.QueryParams.Order;
import static de.diddiz.LogBlock.config.Config.askClearLogs; import de.diddiz.LogBlock.QueryParams.SummarizationMode;
import static de.diddiz.LogBlock.config.Config.askRedos; import de.diddiz.LogBlock.config.Config;
import static de.diddiz.LogBlock.config.Config.askRollbacks; import de.diddiz.LogBlock.config.WorldConfig;
import static de.diddiz.LogBlock.config.Config.defaultTime; import de.diddiz.LogBlockQuestioner.LogBlockQuestioner;
import static de.diddiz.LogBlock.config.Config.dumpDeletedLog; import de.diddiz.util.Block;
import static de.diddiz.LogBlock.config.Config.getWorldConfig; import org.bukkit.ChatColor;
import static de.diddiz.LogBlock.config.Config.linesLimit; import org.bukkit.Location;
import static de.diddiz.LogBlock.config.Config.linesPerPage; import org.bukkit.World;
import static de.diddiz.LogBlock.config.Config.rollbackMaxArea; import org.bukkit.command.Command;
import static de.diddiz.LogBlock.config.Config.rollbackMaxTime; import org.bukkit.command.CommandExecutor;
import static de.diddiz.LogBlock.config.Config.toolsByName; import org.bukkit.command.CommandSender;
import static de.diddiz.LogBlock.config.Config.toolsByType; import org.bukkit.entity.Player;
import static de.diddiz.util.BukkitUtils.giveTool; import org.bukkit.inventory.ItemStack;
import static de.diddiz.util.BukkitUtils.saveSpawnHeight; import org.bukkit.scheduler.BukkitScheduler;
import static de.diddiz.util.Utils.isInt;
import static de.diddiz.util.Utils.listing;
import static org.bukkit.Bukkit.getLogger;
import static org.bukkit.Bukkit.getServer;
import java.io.Closeable; import java.io.Closeable;
import java.io.File; import java.io.File;
import java.io.FileWriter; import java.io.FileWriter;
@@ -32,22 +29,15 @@ import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.List; import java.util.List;
import java.util.logging.Level; import java.util.logging.Level;
import org.bukkit.ChatColor;
import org.bukkit.Location; import static de.diddiz.LogBlock.Session.getSession;
import org.bukkit.World; import static de.diddiz.LogBlock.config.Config.*;
import org.bukkit.command.Command; import static de.diddiz.util.BukkitUtils.giveTool;
import org.bukkit.command.CommandExecutor; import static de.diddiz.util.BukkitUtils.saveSpawnHeight;
import org.bukkit.command.CommandSender; import static de.diddiz.util.Utils.isInt;
import org.bukkit.entity.Player; import static de.diddiz.util.Utils.listing;
import org.bukkit.inventory.ItemStack; import static org.bukkit.Bukkit.getLogger;
import org.bukkit.scheduler.BukkitScheduler; import static org.bukkit.Bukkit.getServer;
import de.diddiz.LogBlock.QueryParams.BlockChangeType;
import de.diddiz.LogBlock.QueryParams.Order;
import de.diddiz.LogBlock.QueryParams.SummarizationMode;
import de.diddiz.LogBlock.config.Config;
import de.diddiz.LogBlock.config.WorldConfig;
import de.diddiz.LogBlockQuestioner.LogBlockQuestioner;
import de.diddiz.util.Block;
public class CommandsHandler implements CommandExecutor public class CommandsHandler implements CommandExecutor
{ {
@@ -616,10 +606,14 @@ public class CommandsHandler implements CommandExecutor
if (!params.silent) if (!params.silent)
sender.sendMessage(ChatColor.DARK_AQUA + "Searching " + params.getTitle() + ":"); sender.sendMessage(ChatColor.DARK_AQUA + "Searching " + params.getTitle() + ":");
rs = state.executeQuery(params.getQuery()); rs = state.executeQuery(params.getQuery());
final WorldEditor editor = new WorldEditor(logblock, params.world); final WorldEditor editor = new WorldEditor(logblock, params.world);
while (rs.next()) while (rs.next())
editor.queueEdit(rs.getInt("x"), rs.getInt("y"), rs.getInt("z"), rs.getInt("replaced"), rs.getInt("type"), rs.getByte("data"), rs.getString("signtext"), rs.getShort("itemtype"), rs.getShort("itemamount"), rs.getByte("itemdata")); editor.queueEdit(rs.getInt("x"), rs.getInt("y"), rs.getInt("z"), rs.getInt("replaced"), rs.getInt("type"), rs.getByte("data"), rs.getString("signtext"), rs.getShort("itemtype"), rs.getShort("itemamount"), rs.getByte("itemdata"));
final int changes = editor.getSize(); final int changes = editor.getSize();
if (changes > 10000) {
editor.setSender(sender);
}
if (!params.silent) if (!params.silent)
sender.sendMessage(ChatColor.GREEN.toString() + changes + " blocks found."); sender.sendMessage(ChatColor.GREEN.toString() + changes + " blocks found.");
if (changes == 0) { if (changes == 0) {

View File

@@ -1,11 +1,19 @@
package de.diddiz.LogBlock; package de.diddiz.LogBlock;
import static de.diddiz.LogBlock.config.Config.dontRollback; import org.bukkit.ChatColor;
import static de.diddiz.LogBlock.config.Config.replaceAnyway; import org.bukkit.Location;
import static de.diddiz.util.BukkitUtils.equalTypes; import org.bukkit.World;
import static de.diddiz.util.BukkitUtils.modifyContainer; import org.bukkit.block.Block;
import static de.diddiz.util.MaterialName.materialName; import org.bukkit.block.BlockFace;
import static org.bukkit.Bukkit.getLogger; import org.bukkit.block.BlockState;
import org.bukkit.block.Sign;
import org.bukkit.command.CommandSender;
import org.bukkit.inventory.InventoryHolder;
import org.bukkit.inventory.ItemStack;
import org.bukkit.material.Bed;
import org.bukkit.material.PistonBaseMaterial;
import org.bukkit.material.PistonExtensionMaterial;
import java.io.File; import java.io.File;
import java.io.PrintWriter; import java.io.PrintWriter;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
@@ -14,23 +22,24 @@ import java.util.List;
import java.util.Queue; import java.util.Queue;
import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.LinkedBlockingQueue;
import java.util.logging.Level; import java.util.logging.Level;
import org.bukkit.Location;
import org.bukkit.World; import static de.diddiz.LogBlock.config.Config.dontRollback;
import org.bukkit.block.Block; import static de.diddiz.LogBlock.config.Config.replaceAnyway;
import org.bukkit.block.BlockFace; import static de.diddiz.util.BukkitUtils.equalTypes;
import org.bukkit.block.BlockState; import static de.diddiz.util.BukkitUtils.modifyContainer;
import org.bukkit.block.Sign; import static de.diddiz.util.MaterialName.materialName;
import org.bukkit.inventory.InventoryHolder; import static org.bukkit.Bukkit.getLogger;
import org.bukkit.inventory.ItemStack;
import org.bukkit.material.Bed;
import org.bukkit.material.PistonBaseMaterial;
import org.bukkit.material.PistonExtensionMaterial;
public class WorldEditor implements Runnable public class WorldEditor implements Runnable
{ {
private final LogBlock logblock; private final LogBlock logblock;
private final Queue<Edit> edits = new LinkedBlockingQueue<Edit>(); private final Queue<Edit> edits = new LinkedBlockingQueue<Edit>();
private final World world; private final World world;
/**
* The player responsible for editing the world, used to report progress
*/
private CommandSender sender;
private int taskID; private int taskID;
private int successes = 0, blacklistCollisions = 0; private int successes = 0, blacklistCollisions = 0;
private long elapsedTime = 0; private long elapsedTime = 0;
@@ -57,6 +66,11 @@ public class WorldEditor implements Runnable
return blacklistCollisions; return blacklistCollisions;
} }
public void setSender(CommandSender sender) {
this.sender = sender;
}
public void queueEdit(int x, int y, int z, int replaced, int type, byte data, String signtext, short itemType, short itemAmount, byte itemData) { public void queueEdit(int x, int y, int z, int replaced, int type, byte data, String signtext, short itemType, short itemAmount, byte itemData) {
edits.add(new Edit(0, new Location(world, x, y, z), null, replaced, type, data, signtext, new ChestAccess(itemType, itemAmount, itemData))); edits.add(new Edit(0, new Location(world, x, y, z), null, replaced, type, data, signtext, new ChestAccess(itemType, itemAmount, itemData)));
} }
@@ -82,6 +96,7 @@ public class WorldEditor implements Runnable
public synchronized void run() { public synchronized void run() {
final List<WorldEditorException> errorList = new ArrayList<WorldEditorException>(); final List<WorldEditorException> errorList = new ArrayList<WorldEditorException>();
int counter = 0; int counter = 0;
float size = edits.size();
while (!edits.isEmpty() && counter < 100) { while (!edits.isEmpty() && counter < 100) {
try { try {
switch (edits.poll().perform()) { switch (edits.poll().perform()) {
@@ -98,6 +113,13 @@ public class WorldEditor implements Runnable
getLogger().log(Level.WARNING, "[WorldEditor] Exeption: ", ex); getLogger().log(Level.WARNING, "[WorldEditor] Exeption: ", ex);
} }
counter++; counter++;
if (sender != null) {
float percentage = ((size - edits.size()) / size) * 100.0F;
if (percentage % 20 == 0) {
sender.sendMessage(ChatColor.GOLD + "[LogBlock]" + ChatColor.YELLOW + " Rollback progress: " + percentage + "%" +
" Blocks edited: " + counter);
}
}
} }
if (edits.isEmpty()) { if (edits.isEmpty()) {
logblock.getServer().getScheduler().cancelTask(taskID); logblock.getServer().getScheduler().cancelTask(taskID);

View File

@@ -1,12 +1,13 @@
package de.diddiz.LogBlock.listeners; package de.diddiz.LogBlock.listeners;
import static de.diddiz.LogBlock.config.Config.isLogging; import de.diddiz.LogBlock.LogBlock;
import de.diddiz.LogBlock.Logging;
import org.bukkit.entity.Wither; import org.bukkit.entity.Wither;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority; import org.bukkit.event.EventPriority;
import org.bukkit.event.entity.EntityChangeBlockEvent; import org.bukkit.event.entity.EntityChangeBlockEvent;
import de.diddiz.LogBlock.LogBlock;
import de.diddiz.LogBlock.Logging; import static de.diddiz.LogBlock.config.Config.isLogging;
public class WitherLogging extends LoggingListener public class WitherLogging extends LoggingListener
{ {
@@ -17,6 +18,6 @@ public class WitherLogging extends LoggingListener
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void onEntityChangeBlock(EntityChangeBlockEvent event) { public void onEntityChangeBlock(EntityChangeBlockEvent event) {
if (event.getEntity() instanceof Wither && isLogging(event.getBlock().getWorld(), Logging.WITHER)) if (event.getEntity() instanceof Wither && isLogging(event.getBlock().getWorld(), Logging.WITHER))
consumer.queueBlockReplace("Wither", event.getBlock().getState(), event.getTo().getId(), (byte)0); // Wither walked through a block. consumer.queueBlockReplace("Wither", event.getBlock().getState(), event.getTo().getId(), event.getData()); // Wither walked through a block.
} }
} }