From 57af19a99b2c7358d78f102b91482b2073126881 Mon Sep 17 00:00:00 2001 From: 2xsaiko Date: Mon, 6 Jul 2020 18:48:36 +0200 Subject: Add menu entry to reload jar & mappings from disk (#263) * Add button to reload jar & mappings from disk * Disable menu entry when currently loading * Add menu entry that reloads mappings only * Remove duplicate user query code --- .../src/main/java/cuchaz/enigma/gui/Gui.java | 1 - .../main/java/cuchaz/enigma/gui/GuiController.java | 22 +++++++++++ .../java/cuchaz/enigma/gui/elements/MenuBar.java | 29 ++++++++++++-- enigma/src/main/java/cuchaz/enigma/Enigma.java | 17 ++++---- .../src/main/java/cuchaz/enigma/EnigmaProject.java | 45 +++++++++++++--------- enigma/src/main/resources/lang/en_us.json | 2 + .../src/test/java/cuchaz/enigma/TestDeobfed.java | 13 ++++--- 7 files changed, 91 insertions(+), 38 deletions(-) diff --git a/enigma-swing/src/main/java/cuchaz/enigma/gui/Gui.java b/enigma-swing/src/main/java/cuchaz/enigma/gui/Gui.java index ec68d0df..8f105058 100644 --- a/enigma-swing/src/main/java/cuchaz/enigma/gui/Gui.java +++ b/enigma-swing/src/main/java/cuchaz/enigma/gui/Gui.java @@ -393,7 +393,6 @@ public class Gui { } public void onCloseJar() { - // update gui this.frame.setTitle(Enigma.NAME); setObfClasses(null); diff --git a/enigma-swing/src/main/java/cuchaz/enigma/gui/GuiController.java b/enigma-swing/src/main/java/cuchaz/enigma/gui/GuiController.java index 124ad07e..2f5e5e1e 100644 --- a/enigma-swing/src/main/java/cuchaz/enigma/gui/GuiController.java +++ b/enigma-swing/src/main/java/cuchaz/enigma/gui/GuiController.java @@ -178,6 +178,28 @@ public class GuiController implements ClientPacketHandler { chp.invalidateMapped(); } + public void reloadAll() { + Path jarPath = this.project.getJarPath(); + MappingFormat loadedMappingFormat = this.loadedMappingFormat; + Path loadedMappingPath = this.loadedMappingPath; + if (jarPath != null) { + this.closeJar(); + CompletableFuture f = this.openJar(jarPath); + if (loadedMappingFormat != null && loadedMappingPath != null) { + f.whenComplete((v, t) -> this.openMappings(loadedMappingFormat, loadedMappingPath)); + } + } + } + + public void reloadMappings() { + MappingFormat loadedMappingFormat = this.loadedMappingFormat; + Path loadedMappingPath = this.loadedMappingPath; + if (loadedMappingFormat != null && loadedMappingPath != null) { + this.closeMappings(); + this.openMappings(loadedMappingFormat, loadedMappingPath); + } + } + public CompletableFuture dropMappings() { if (project == null) return CompletableFuture.completedFuture(null); diff --git a/enigma-swing/src/main/java/cuchaz/enigma/gui/elements/MenuBar.java b/enigma-swing/src/main/java/cuchaz/enigma/gui/elements/MenuBar.java index 768bc410..d6c60e04 100644 --- a/enigma-swing/src/main/java/cuchaz/enigma/gui/elements/MenuBar.java +++ b/enigma-swing/src/main/java/cuchaz/enigma/gui/elements/MenuBar.java @@ -40,6 +40,8 @@ public class MenuBar { private final JMenu saveMappingsAsMenu = new JMenu(I18n.translate("menu.file.mappings.save_as")); private final JMenuItem closeMappingsItem = new JMenuItem(I18n.translate("menu.file.mappings.close")); private final JMenuItem dropMappingsItem = new JMenuItem(I18n.translate("menu.file.mappings.drop")); + private final JMenuItem reloadMappingsItem = new JMenuItem(I18n.translate("menu.file.reload_mappings")); + private final JMenuItem reloadAllItem = new JMenuItem(I18n.translate("menu.file.reload_all")); private final JMenuItem exportSourceItem = new JMenuItem(I18n.translate("menu.file.export.source")); private final JMenuItem exportJarItem = new JMenuItem(I18n.translate("menu.file.export.jar")); private final JMenuItem statsItem = new JMenuItem(I18n.translate("menu.file.stats")); @@ -83,6 +85,9 @@ public class MenuBar { this.fileMenu.add(this.closeMappingsItem); this.fileMenu.add(this.dropMappingsItem); this.fileMenu.addSeparator(); + this.fileMenu.add(this.reloadMappingsItem); + this.fileMenu.add(this.reloadAllItem); + this.fileMenu.addSeparator(); this.fileMenu.add(this.exportSourceItem); this.fileMenu.add(this.exportJarItem); this.fileMenu.addSeparator(); @@ -117,6 +122,8 @@ public class MenuBar { this.saveMappingsItem.addActionListener(_e -> this.onSaveMappingsClicked()); this.closeMappingsItem.addActionListener(_e -> this.onCloseMappingsClicked()); this.dropMappingsItem.addActionListener(_e -> this.gui.getController().dropMappings()); + this.reloadMappingsItem.addActionListener(_e -> this.onReloadMappingsClicked()); + this.reloadAllItem.addActionListener(_e -> this.onReloadAllClicked()); this.exportSourceItem.addActionListener(_e -> this.onExportSourceClicked()); this.exportJarItem.addActionListener(_e -> this.onExportJarClicked()); this.statsItem.addActionListener(_e -> StatsDialog.show(this.gui)); @@ -143,6 +150,8 @@ public class MenuBar { this.saveMappingsItem.setEnabled(jarOpen && this.gui.enigmaMappingsFileChooser.getSelectedFile() != null && connectionState != ConnectionState.CONNECTED); this.saveMappingsAsMenu.setEnabled(jarOpen); this.closeMappingsItem.setEnabled(jarOpen); + this.reloadMappingsItem.setEnabled(jarOpen); + this.reloadAllItem.setEnabled(jarOpen); this.exportSourceItem.setEnabled(jarOpen); this.exportJarItem.setEnabled(jarOpen); this.statsItem.setEnabled(jarOpen); @@ -169,21 +178,33 @@ public class MenuBar { this.gui.getController().saveMappings(this.gui.enigmaMappingsFileChooser.getSelectedFile().toPath()); } - private void onCloseMappingsClicked() { + private void openMappingsDiscardPrompt(Runnable then) { if (this.gui.getController().isDirty()) { this.gui.showDiscardDiag((response -> { if (response == JOptionPane.YES_OPTION) { this.gui.saveMapping(); - this.gui.getController().closeMappings(); + then.run(); } else if (response == JOptionPane.NO_OPTION) - this.gui.getController().closeMappings(); + then.run(); return null; }), I18n.translate("prompt.close.save"), I18n.translate("prompt.close.discard"), I18n.translate("prompt.close.cancel")); } else { - this.gui.getController().closeMappings(); + then.run(); } } + private void onCloseMappingsClicked() { + openMappingsDiscardPrompt(() -> this.gui.getController().closeMappings()); + } + + private void onReloadMappingsClicked() { + openMappingsDiscardPrompt(() -> this.gui.getController().reloadMappings()); + } + + private void onReloadAllClicked() { + openMappingsDiscardPrompt(() -> this.gui.getController().reloadAll()); + } + private void onExportSourceClicked() { if (this.gui.exportSourceFileChooser.showSaveDialog(this.gui.getFrame()) == JFileChooser.APPROVE_OPTION) { this.gui.getController().exportSource(this.gui.exportSourceFileChooser.getSelectedFile().toPath()); diff --git a/enigma/src/main/java/cuchaz/enigma/Enigma.java b/enigma/src/main/java/cuchaz/enigma/Enigma.java index 2e9be34f..d100a75a 100644 --- a/enigma/src/main/java/cuchaz/enigma/Enigma.java +++ b/enigma/src/main/java/cuchaz/enigma/Enigma.java @@ -11,8 +11,16 @@ package cuchaz.enigma; +import java.io.IOException; +import java.nio.file.Path; +import java.util.List; +import java.util.ServiceLoader; +import java.util.Set; + import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableListMultimap; +import org.objectweb.asm.Opcodes; + import cuchaz.enigma.analysis.index.JarIndex; import cuchaz.enigma.api.EnigmaPlugin; import cuchaz.enigma.api.EnigmaPluginContext; @@ -25,13 +33,6 @@ import cuchaz.enigma.classprovider.ClassProvider; import cuchaz.enigma.classprovider.CombiningClassProvider; import cuchaz.enigma.classprovider.JarClassProvider; import cuchaz.enigma.utils.Utils; -import org.objectweb.asm.Opcodes; - -import java.io.IOException; -import java.nio.file.Path; -import java.util.List; -import java.util.ServiceLoader; -import java.util.Set; public class Enigma { public static final String NAME = "Enigma"; @@ -64,7 +65,7 @@ public class Enigma { index.indexJar(scope, classProvider, progress); services.get(JarIndexerService.TYPE).forEach(indexer -> indexer.acceptJar(scope, classProvider, index)); - return new EnigmaProject(this, classProvider, index, Utils.zipSha1(path)); + return new EnigmaProject(this, path, classProvider, index, Utils.zipSha1(path)); } public EnigmaProfile getProfile() { diff --git a/enigma/src/main/java/cuchaz/enigma/EnigmaProject.java b/enigma/src/main/java/cuchaz/enigma/EnigmaProject.java index 76413ab7..2abd39c1 100644 --- a/enigma/src/main/java/cuchaz/enigma/EnigmaProject.java +++ b/enigma/src/main/java/cuchaz/enigma/EnigmaProject.java @@ -1,7 +1,26 @@ package cuchaz.enigma; +import java.io.BufferedWriter; +import java.io.IOException; +import java.io.PrintWriter; +import java.io.StringWriter; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.jar.JarEntry; +import java.util.jar.JarOutputStream; +import java.util.stream.Collectors; +import java.util.stream.Stream; + import com.google.common.base.Functions; import com.google.common.base.Preconditions; +import org.objectweb.asm.ClassWriter; +import org.objectweb.asm.tree.ClassNode; + import cuchaz.enigma.analysis.EntryReference; import cuchaz.enigma.analysis.index.JarIndex; import cuchaz.enigma.api.service.NameProposalService; @@ -23,37 +42,21 @@ import cuchaz.enigma.translation.representation.entry.Entry; import cuchaz.enigma.translation.representation.entry.LocalVariableEntry; import cuchaz.enigma.translation.representation.entry.MethodEntry; import cuchaz.enigma.utils.I18n; -import org.objectweb.asm.ClassWriter; -import org.objectweb.asm.tree.ClassNode; - -import java.io.BufferedWriter; -import java.io.IOException; -import java.io.PrintWriter; -import java.io.StringWriter; -import java.nio.file.Files; -import java.nio.file.Path; -import java.util.Collection; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.concurrent.atomic.AtomicInteger; -import java.util.jar.JarEntry; -import java.util.jar.JarOutputStream; -import java.util.stream.Collectors; -import java.util.stream.Stream; public class EnigmaProject { private final Enigma enigma; + private final Path jarPath; private final ClassProvider classProvider; private final JarIndex jarIndex; private final byte[] jarChecksum; private EntryRemapper mapper; - public EnigmaProject(Enigma enigma, ClassProvider classProvider, JarIndex jarIndex, byte[] jarChecksum) { + public EnigmaProject(Enigma enigma, Path jarPath, ClassProvider classProvider, JarIndex jarIndex, byte[] jarChecksum) { Preconditions.checkArgument(jarChecksum.length == 20); this.enigma = enigma; + this.jarPath = jarPath; this.classProvider = classProvider; this.jarIndex = jarIndex; this.jarChecksum = jarChecksum; @@ -73,6 +76,10 @@ public class EnigmaProject { return enigma; } + public Path getJarPath() { + return jarPath; + } + public ClassProvider getClassProvider() { return classProvider; } diff --git a/enigma/src/main/resources/lang/en_us.json b/enigma/src/main/resources/lang/en_us.json index a98caa9d..debe9d15 100644 --- a/enigma/src/main/resources/lang/en_us.json +++ b/enigma/src/main/resources/lang/en_us.json @@ -23,6 +23,8 @@ "menu.file.mappings.save_as": "Save Mappings As...", "menu.file.mappings.close": "Close Mappings", "menu.file.mappings.drop": "Drop Invalid Mappings", + "menu.file.reload_mappings": "Reload Mappings", + "menu.file.reload_all": "Reload Jar/Mappings", "menu.file.export.source": "Export Source...", "menu.file.export.jar": "Export Jar...", "menu.file.stats": "Mapping Stats...", diff --git a/enigma/src/test/java/cuchaz/enigma/TestDeobfed.java b/enigma/src/test/java/cuchaz/enigma/TestDeobfed.java index 6daa2931..b3d35175 100644 --- a/enigma/src/test/java/cuchaz/enigma/TestDeobfed.java +++ b/enigma/src/test/java/cuchaz/enigma/TestDeobfed.java @@ -11,16 +11,17 @@ package cuchaz.enigma; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; + +import org.junit.BeforeClass; +import org.junit.Test; + import cuchaz.enigma.classprovider.ClasspathClassProvider; import cuchaz.enigma.source.Decompiler; import cuchaz.enigma.source.Decompilers; import cuchaz.enigma.source.SourceSettings; -import org.junit.BeforeClass; -import org.junit.Test; - -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.Paths; import static cuchaz.enigma.TestEntryFactory.newClass; import static org.hamcrest.MatcherAssert.assertThat; -- cgit v1.2.3