summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar 2xsaiko2020-07-06 18:48:36 +0200
committerGravatar GitHub2020-07-06 12:48:36 -0400
commit57af19a99b2c7358d78f102b91482b2073126881 (patch)
treec61f16b670a4ee9eed736b38cb7351900587a166
parentFix crash on remapping [T (#261) (diff)
downloadenigma-57af19a99b2c7358d78f102b91482b2073126881.tar.gz
enigma-57af19a99b2c7358d78f102b91482b2073126881.tar.xz
enigma-57af19a99b2c7358d78f102b91482b2073126881.zip
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
-rw-r--r--enigma-swing/src/main/java/cuchaz/enigma/gui/Gui.java1
-rw-r--r--enigma-swing/src/main/java/cuchaz/enigma/gui/GuiController.java22
-rw-r--r--enigma-swing/src/main/java/cuchaz/enigma/gui/elements/MenuBar.java29
-rw-r--r--enigma/src/main/java/cuchaz/enigma/Enigma.java17
-rw-r--r--enigma/src/main/java/cuchaz/enigma/EnigmaProject.java45
-rw-r--r--enigma/src/main/resources/lang/en_us.json2
-rw-r--r--enigma/src/test/java/cuchaz/enigma/TestDeobfed.java13
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 {
393 } 393 }
394 394
395 public void onCloseJar() { 395 public void onCloseJar() {
396
397 // update gui 396 // update gui
398 this.frame.setTitle(Enigma.NAME); 397 this.frame.setTitle(Enigma.NAME);
399 setObfClasses(null); 398 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 {
178 chp.invalidateMapped(); 178 chp.invalidateMapped();
179 } 179 }
180 180
181 public void reloadAll() {
182 Path jarPath = this.project.getJarPath();
183 MappingFormat loadedMappingFormat = this.loadedMappingFormat;
184 Path loadedMappingPath = this.loadedMappingPath;
185 if (jarPath != null) {
186 this.closeJar();
187 CompletableFuture<Void> f = this.openJar(jarPath);
188 if (loadedMappingFormat != null && loadedMappingPath != null) {
189 f.whenComplete((v, t) -> this.openMappings(loadedMappingFormat, loadedMappingPath));
190 }
191 }
192 }
193
194 public void reloadMappings() {
195 MappingFormat loadedMappingFormat = this.loadedMappingFormat;
196 Path loadedMappingPath = this.loadedMappingPath;
197 if (loadedMappingFormat != null && loadedMappingPath != null) {
198 this.closeMappings();
199 this.openMappings(loadedMappingFormat, loadedMappingPath);
200 }
201 }
202
181 public CompletableFuture<Void> dropMappings() { 203 public CompletableFuture<Void> dropMappings() {
182 if (project == null) return CompletableFuture.completedFuture(null); 204 if (project == null) return CompletableFuture.completedFuture(null);
183 205
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 {
40 private final JMenu saveMappingsAsMenu = new JMenu(I18n.translate("menu.file.mappings.save_as")); 40 private final JMenu saveMappingsAsMenu = new JMenu(I18n.translate("menu.file.mappings.save_as"));
41 private final JMenuItem closeMappingsItem = new JMenuItem(I18n.translate("menu.file.mappings.close")); 41 private final JMenuItem closeMappingsItem = new JMenuItem(I18n.translate("menu.file.mappings.close"));
42 private final JMenuItem dropMappingsItem = new JMenuItem(I18n.translate("menu.file.mappings.drop")); 42 private final JMenuItem dropMappingsItem = new JMenuItem(I18n.translate("menu.file.mappings.drop"));
43 private final JMenuItem reloadMappingsItem = new JMenuItem(I18n.translate("menu.file.reload_mappings"));
44 private final JMenuItem reloadAllItem = new JMenuItem(I18n.translate("menu.file.reload_all"));
43 private final JMenuItem exportSourceItem = new JMenuItem(I18n.translate("menu.file.export.source")); 45 private final JMenuItem exportSourceItem = new JMenuItem(I18n.translate("menu.file.export.source"));
44 private final JMenuItem exportJarItem = new JMenuItem(I18n.translate("menu.file.export.jar")); 46 private final JMenuItem exportJarItem = new JMenuItem(I18n.translate("menu.file.export.jar"));
45 private final JMenuItem statsItem = new JMenuItem(I18n.translate("menu.file.stats")); 47 private final JMenuItem statsItem = new JMenuItem(I18n.translate("menu.file.stats"));
@@ -83,6 +85,9 @@ public class MenuBar {
83 this.fileMenu.add(this.closeMappingsItem); 85 this.fileMenu.add(this.closeMappingsItem);
84 this.fileMenu.add(this.dropMappingsItem); 86 this.fileMenu.add(this.dropMappingsItem);
85 this.fileMenu.addSeparator(); 87 this.fileMenu.addSeparator();
88 this.fileMenu.add(this.reloadMappingsItem);
89 this.fileMenu.add(this.reloadAllItem);
90 this.fileMenu.addSeparator();
86 this.fileMenu.add(this.exportSourceItem); 91 this.fileMenu.add(this.exportSourceItem);
87 this.fileMenu.add(this.exportJarItem); 92 this.fileMenu.add(this.exportJarItem);
88 this.fileMenu.addSeparator(); 93 this.fileMenu.addSeparator();
@@ -117,6 +122,8 @@ public class MenuBar {
117 this.saveMappingsItem.addActionListener(_e -> this.onSaveMappingsClicked()); 122 this.saveMappingsItem.addActionListener(_e -> this.onSaveMappingsClicked());
118 this.closeMappingsItem.addActionListener(_e -> this.onCloseMappingsClicked()); 123 this.closeMappingsItem.addActionListener(_e -> this.onCloseMappingsClicked());
119 this.dropMappingsItem.addActionListener(_e -> this.gui.getController().dropMappings()); 124 this.dropMappingsItem.addActionListener(_e -> this.gui.getController().dropMappings());
125 this.reloadMappingsItem.addActionListener(_e -> this.onReloadMappingsClicked());
126 this.reloadAllItem.addActionListener(_e -> this.onReloadAllClicked());
120 this.exportSourceItem.addActionListener(_e -> this.onExportSourceClicked()); 127 this.exportSourceItem.addActionListener(_e -> this.onExportSourceClicked());
121 this.exportJarItem.addActionListener(_e -> this.onExportJarClicked()); 128 this.exportJarItem.addActionListener(_e -> this.onExportJarClicked());
122 this.statsItem.addActionListener(_e -> StatsDialog.show(this.gui)); 129 this.statsItem.addActionListener(_e -> StatsDialog.show(this.gui));
@@ -143,6 +150,8 @@ public class MenuBar {
143 this.saveMappingsItem.setEnabled(jarOpen && this.gui.enigmaMappingsFileChooser.getSelectedFile() != null && connectionState != ConnectionState.CONNECTED); 150 this.saveMappingsItem.setEnabled(jarOpen && this.gui.enigmaMappingsFileChooser.getSelectedFile() != null && connectionState != ConnectionState.CONNECTED);
144 this.saveMappingsAsMenu.setEnabled(jarOpen); 151 this.saveMappingsAsMenu.setEnabled(jarOpen);
145 this.closeMappingsItem.setEnabled(jarOpen); 152 this.closeMappingsItem.setEnabled(jarOpen);
153 this.reloadMappingsItem.setEnabled(jarOpen);
154 this.reloadAllItem.setEnabled(jarOpen);
146 this.exportSourceItem.setEnabled(jarOpen); 155 this.exportSourceItem.setEnabled(jarOpen);
147 this.exportJarItem.setEnabled(jarOpen); 156 this.exportJarItem.setEnabled(jarOpen);
148 this.statsItem.setEnabled(jarOpen); 157 this.statsItem.setEnabled(jarOpen);
@@ -169,21 +178,33 @@ public class MenuBar {
169 this.gui.getController().saveMappings(this.gui.enigmaMappingsFileChooser.getSelectedFile().toPath()); 178 this.gui.getController().saveMappings(this.gui.enigmaMappingsFileChooser.getSelectedFile().toPath());
170 } 179 }
171 180
172 private void onCloseMappingsClicked() { 181 private void openMappingsDiscardPrompt(Runnable then) {
173 if (this.gui.getController().isDirty()) { 182 if (this.gui.getController().isDirty()) {
174 this.gui.showDiscardDiag((response -> { 183 this.gui.showDiscardDiag((response -> {
175 if (response == JOptionPane.YES_OPTION) { 184 if (response == JOptionPane.YES_OPTION) {
176 this.gui.saveMapping(); 185 this.gui.saveMapping();
177 this.gui.getController().closeMappings(); 186 then.run();
178 } else if (response == JOptionPane.NO_OPTION) 187 } else if (response == JOptionPane.NO_OPTION)
179 this.gui.getController().closeMappings(); 188 then.run();
180 return null; 189 return null;
181 }), I18n.translate("prompt.close.save"), I18n.translate("prompt.close.discard"), I18n.translate("prompt.close.cancel")); 190 }), I18n.translate("prompt.close.save"), I18n.translate("prompt.close.discard"), I18n.translate("prompt.close.cancel"));
182 } else { 191 } else {
183 this.gui.getController().closeMappings(); 192 then.run();
184 } 193 }
185 } 194 }
186 195
196 private void onCloseMappingsClicked() {
197 openMappingsDiscardPrompt(() -> this.gui.getController().closeMappings());
198 }
199
200 private void onReloadMappingsClicked() {
201 openMappingsDiscardPrompt(() -> this.gui.getController().reloadMappings());
202 }
203
204 private void onReloadAllClicked() {
205 openMappingsDiscardPrompt(() -> this.gui.getController().reloadAll());
206 }
207
187 private void onExportSourceClicked() { 208 private void onExportSourceClicked() {
188 if (this.gui.exportSourceFileChooser.showSaveDialog(this.gui.getFrame()) == JFileChooser.APPROVE_OPTION) { 209 if (this.gui.exportSourceFileChooser.showSaveDialog(this.gui.getFrame()) == JFileChooser.APPROVE_OPTION) {
189 this.gui.getController().exportSource(this.gui.exportSourceFileChooser.getSelectedFile().toPath()); 210 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 @@
11 11
12package cuchaz.enigma; 12package cuchaz.enigma;
13 13
14import java.io.IOException;
15import java.nio.file.Path;
16import java.util.List;
17import java.util.ServiceLoader;
18import java.util.Set;
19
14import com.google.common.base.Preconditions; 20import com.google.common.base.Preconditions;
15import com.google.common.collect.ImmutableListMultimap; 21import com.google.common.collect.ImmutableListMultimap;
22import org.objectweb.asm.Opcodes;
23
16import cuchaz.enigma.analysis.index.JarIndex; 24import cuchaz.enigma.analysis.index.JarIndex;
17import cuchaz.enigma.api.EnigmaPlugin; 25import cuchaz.enigma.api.EnigmaPlugin;
18import cuchaz.enigma.api.EnigmaPluginContext; 26import cuchaz.enigma.api.EnigmaPluginContext;
@@ -25,13 +33,6 @@ import cuchaz.enigma.classprovider.ClassProvider;
25import cuchaz.enigma.classprovider.CombiningClassProvider; 33import cuchaz.enigma.classprovider.CombiningClassProvider;
26import cuchaz.enigma.classprovider.JarClassProvider; 34import cuchaz.enigma.classprovider.JarClassProvider;
27import cuchaz.enigma.utils.Utils; 35import cuchaz.enigma.utils.Utils;
28import org.objectweb.asm.Opcodes;
29
30import java.io.IOException;
31import java.nio.file.Path;
32import java.util.List;
33import java.util.ServiceLoader;
34import java.util.Set;
35 36
36public class Enigma { 37public class Enigma {
37 public static final String NAME = "Enigma"; 38 public static final String NAME = "Enigma";
@@ -64,7 +65,7 @@ public class Enigma {
64 index.indexJar(scope, classProvider, progress); 65 index.indexJar(scope, classProvider, progress);
65 services.get(JarIndexerService.TYPE).forEach(indexer -> indexer.acceptJar(scope, classProvider, index)); 66 services.get(JarIndexerService.TYPE).forEach(indexer -> indexer.acceptJar(scope, classProvider, index));
66 67
67 return new EnigmaProject(this, classProvider, index, Utils.zipSha1(path)); 68 return new EnigmaProject(this, path, classProvider, index, Utils.zipSha1(path));
68 } 69 }
69 70
70 public EnigmaProfile getProfile() { 71 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 @@
1package cuchaz.enigma; 1package cuchaz.enigma;
2 2
3import java.io.BufferedWriter;
4import java.io.IOException;
5import java.io.PrintWriter;
6import java.io.StringWriter;
7import java.nio.file.Files;
8import java.nio.file.Path;
9import java.util.Collection;
10import java.util.List;
11import java.util.Map;
12import java.util.Objects;
13import java.util.concurrent.atomic.AtomicInteger;
14import java.util.jar.JarEntry;
15import java.util.jar.JarOutputStream;
16import java.util.stream.Collectors;
17import java.util.stream.Stream;
18
3import com.google.common.base.Functions; 19import com.google.common.base.Functions;
4import com.google.common.base.Preconditions; 20import com.google.common.base.Preconditions;
21import org.objectweb.asm.ClassWriter;
22import org.objectweb.asm.tree.ClassNode;
23
5import cuchaz.enigma.analysis.EntryReference; 24import cuchaz.enigma.analysis.EntryReference;
6import cuchaz.enigma.analysis.index.JarIndex; 25import cuchaz.enigma.analysis.index.JarIndex;
7import cuchaz.enigma.api.service.NameProposalService; 26import cuchaz.enigma.api.service.NameProposalService;
@@ -23,37 +42,21 @@ import cuchaz.enigma.translation.representation.entry.Entry;
23import cuchaz.enigma.translation.representation.entry.LocalVariableEntry; 42import cuchaz.enigma.translation.representation.entry.LocalVariableEntry;
24import cuchaz.enigma.translation.representation.entry.MethodEntry; 43import cuchaz.enigma.translation.representation.entry.MethodEntry;
25import cuchaz.enigma.utils.I18n; 44import cuchaz.enigma.utils.I18n;
26import org.objectweb.asm.ClassWriter;
27import org.objectweb.asm.tree.ClassNode;
28
29import java.io.BufferedWriter;
30import java.io.IOException;
31import java.io.PrintWriter;
32import java.io.StringWriter;
33import java.nio.file.Files;
34import java.nio.file.Path;
35import java.util.Collection;
36import java.util.List;
37import java.util.Map;
38import java.util.Objects;
39import java.util.concurrent.atomic.AtomicInteger;
40import java.util.jar.JarEntry;
41import java.util.jar.JarOutputStream;
42import java.util.stream.Collectors;
43import java.util.stream.Stream;
44 45
45public class EnigmaProject { 46public class EnigmaProject {
46 private final Enigma enigma; 47 private final Enigma enigma;
47 48
49 private final Path jarPath;
48 private final ClassProvider classProvider; 50 private final ClassProvider classProvider;
49 private final JarIndex jarIndex; 51 private final JarIndex jarIndex;
50 private final byte[] jarChecksum; 52 private final byte[] jarChecksum;
51 53
52 private EntryRemapper mapper; 54 private EntryRemapper mapper;
53 55
54 public EnigmaProject(Enigma enigma, ClassProvider classProvider, JarIndex jarIndex, byte[] jarChecksum) { 56 public EnigmaProject(Enigma enigma, Path jarPath, ClassProvider classProvider, JarIndex jarIndex, byte[] jarChecksum) {
55 Preconditions.checkArgument(jarChecksum.length == 20); 57 Preconditions.checkArgument(jarChecksum.length == 20);
56 this.enigma = enigma; 58 this.enigma = enigma;
59 this.jarPath = jarPath;
57 this.classProvider = classProvider; 60 this.classProvider = classProvider;
58 this.jarIndex = jarIndex; 61 this.jarIndex = jarIndex;
59 this.jarChecksum = jarChecksum; 62 this.jarChecksum = jarChecksum;
@@ -73,6 +76,10 @@ public class EnigmaProject {
73 return enigma; 76 return enigma;
74 } 77 }
75 78
79 public Path getJarPath() {
80 return jarPath;
81 }
82
76 public ClassProvider getClassProvider() { 83 public ClassProvider getClassProvider() {
77 return classProvider; 84 return classProvider;
78 } 85 }
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 @@
23 "menu.file.mappings.save_as": "Save Mappings As...", 23 "menu.file.mappings.save_as": "Save Mappings As...",
24 "menu.file.mappings.close": "Close Mappings", 24 "menu.file.mappings.close": "Close Mappings",
25 "menu.file.mappings.drop": "Drop Invalid Mappings", 25 "menu.file.mappings.drop": "Drop Invalid Mappings",
26 "menu.file.reload_mappings": "Reload Mappings",
27 "menu.file.reload_all": "Reload Jar/Mappings",
26 "menu.file.export.source": "Export Source...", 28 "menu.file.export.source": "Export Source...",
27 "menu.file.export.jar": "Export Jar...", 29 "menu.file.export.jar": "Export Jar...",
28 "menu.file.stats": "Mapping Stats...", 30 "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 @@
11 11
12package cuchaz.enigma; 12package cuchaz.enigma;
13 13
14import java.nio.file.Files;
15import java.nio.file.Path;
16import java.nio.file.Paths;
17
18import org.junit.BeforeClass;
19import org.junit.Test;
20
14import cuchaz.enigma.classprovider.ClasspathClassProvider; 21import cuchaz.enigma.classprovider.ClasspathClassProvider;
15import cuchaz.enigma.source.Decompiler; 22import cuchaz.enigma.source.Decompiler;
16import cuchaz.enigma.source.Decompilers; 23import cuchaz.enigma.source.Decompilers;
17import cuchaz.enigma.source.SourceSettings; 24import cuchaz.enigma.source.SourceSettings;
18import org.junit.BeforeClass;
19import org.junit.Test;
20
21import java.nio.file.Files;
22import java.nio.file.Path;
23import java.nio.file.Paths;
24 25
25import static cuchaz.enigma.TestEntryFactory.newClass; 26import static cuchaz.enigma.TestEntryFactory.newClass;
26import static org.hamcrest.MatcherAssert.assertThat; 27import static org.hamcrest.MatcherAssert.assertThat;