From 4a2c7df25f5159ecc5a3525506030befee9f968b Mon Sep 17 00:00:00 2001 From: CrushedPixel Date: Thu, 2 Jul 2015 14:40:17 +0200 Subject: [PATCH] Only rewrite Replay Files once after Replay is closed, in order to prevent rewriting the Replay multiple times (e.g. if a Thumbnail gets added while viewing it and the Markers are added upon exiting). This also fixes the Windows File System not allowing the Replay Mod to delete the original .mcpr file because it thinks that it's still being edited. Resolves https://trello.com/c/CmKfRKc0/ --- .../eu/crushedpixel/replaymod/ReplayMod.java | 1 - .../registry/ReplayFileAppender.java | 92 ++++++++----------- 2 files changed, 40 insertions(+), 53 deletions(-) diff --git a/src/main/java/eu/crushedpixel/replaymod/ReplayMod.java b/src/main/java/eu/crushedpixel/replaymod/ReplayMod.java index 440e993e..4eef912f 100755 --- a/src/main/java/eu/crushedpixel/replaymod/ReplayMod.java +++ b/src/main/java/eu/crushedpixel/replaymod/ReplayMod.java @@ -104,7 +104,6 @@ public class ReplayMod { replayFileAppender = new ReplayFileAppender(); FMLCommonHandler.instance().bus().register(replayFileAppender); - replayFileAppender.start(); } @EventHandler diff --git a/src/main/java/eu/crushedpixel/replaymod/registry/ReplayFileAppender.java b/src/main/java/eu/crushedpixel/replaymod/registry/ReplayFileAppender.java index 677d3953..85a6b431 100644 --- a/src/main/java/eu/crushedpixel/replaymod/registry/ReplayFileAppender.java +++ b/src/main/java/eu/crushedpixel/replaymod/registry/ReplayFileAppender.java @@ -16,7 +16,7 @@ import java.io.IOException; import java.util.*; import java.util.concurrent.ConcurrentLinkedQueue; -public class ReplayFileAppender extends Thread { +public class ReplayFileAppender { private Multimap> filesToMove = ArrayListMultimap.create(); private Queue filesToRewrite = new ConcurrentLinkedQueue(); @@ -49,15 +49,6 @@ public class ReplayFileAppender extends Thread { callListeners(); } - public ReplayFileAppender() { - Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() { - @Override - public void run() { - ReplayFileAppender.this.shutdown(); - } - }, "replaymod-file-appender-shutdown")); - } - public void registerModifiedFile(File toAdd, String name, File replayFile) { //first, remove any files with the same name assigned to this Replay File for (Iterator> iter = filesToMove.get(replayFile).iterator(); iter.hasNext(); ) { @@ -75,10 +66,6 @@ public class ReplayFileAppender extends Thread { } } - public void shutdown() { - interrupt(); - } - public void addFinishListener(GuiReplaySaving gui) { listeners.add(gui); } @@ -87,53 +74,54 @@ public class ReplayFileAppender extends Thread { public void onReplayExit(ReplayExitEvent event) { if(!filesToRewrite.isEmpty()) { openGuiSavingScreen(); + writeFiles(); } } - @Override - public void run() { - while(!Thread.interrupted() || !filesToRewrite.isEmpty()) { - File replayFile = filesToRewrite.poll(); - if(replayFile != null) { - if(replayFile.canWrite()) { - try { - HashMap toAdd = new HashMap(); - for(Pair p : filesToMove.get(replayFile)) { - if(p.getLeft() == null || p.getLeft().exists()) { - toAdd.put(p.getRight(), p.getLeft()); - } - } - ReplayFileIO.addFilesToZip(replayFile, toAdd); - - //delete all written files - for(Pair p : filesToMove.get(replayFile)) { - if(p.getLeft() != null) { - try { - FileUtils.forceDelete(p.getLeft()); - } catch (IOException e) { - e.printStackTrace(); + private void writeFiles() { + new Thread(new Runnable() { + @Override + public void run() { + while(!filesToRewrite.isEmpty()) { + File replayFile = filesToRewrite.poll(); + if(replayFile != null) { + if(replayFile.canWrite()) { + try { + HashMap toAdd = new HashMap(); + for(Pair p : filesToMove.get(replayFile)) { + if(p.getLeft() == null || p.getLeft().exists()) { + toAdd.put(p.getRight(), p.getLeft()); + } } + ReplayFileIO.addFilesToZip(replayFile, toAdd); + + //delete all written files + for(Pair p : filesToMove.get(replayFile)) { + if(p.getLeft() != null) { + try { + FileUtils.forceDelete(p.getLeft()); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + + filesToMove.removeAll(replayFile); + } catch(Exception e) { + e.printStackTrace(); + filesToRewrite.add(replayFile); + } finally { + callListeners(); } + + } else { + filesToRewrite.add(replayFile); } - - filesToMove.removeAll(replayFile); - } catch(Exception e) { - e.printStackTrace(); - filesToRewrite.add(replayFile); - } finally { - callListeners(); } - - } else { - filesToRewrite.add(replayFile); } + callListeners(); } - try { - Thread.sleep(1000); - } catch (InterruptedException e) { - interrupt(); - } - } + }, "replay-file-appender").start(); } public void callListeners() {