Skip to content

Commit 5491acb

Browse files
committed
Refactor Decompiler
1 parent ff7756c commit 5491acb

File tree

7 files changed

+83
-85
lines changed

7 files changed

+83
-85
lines changed

src/main/java/the/bytecode/club/jda/SecurityMan.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ public void stopBlocking() { //slightly safer security system than just a public
2020
String executedClass = Thread.currentThread().getStackTrace()[2].getClassName();
2121
if (executedClass.equals("CFRDecompiler") ||
2222
executedClass.equals("ProcyonDecompiler") ||
23-
executedClass.equals("FernFlowerDecompiler") ||
23+
executedClass.equals("FernflowerDecompiler") ||
2424
executedClass.equals("the.bytecode.club.jda.JDA")) {
2525
blocking = false;
2626
} else

src/main/java/the/bytecode/club/jda/decompilers/Decompiler.java

Lines changed: 1 addition & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,10 @@
55
import org.objectweb.asm.tree.ClassNode;
66
import the.bytecode.club.jda.JDA;
77
import the.bytecode.club.jda.api.ExceptionUI;
8-
import the.bytecode.club.jda.decompilers.bytecode.ClassNodeDecompiler;
98
import the.bytecode.club.jda.settings.DecompilerSettings;
109

1110
import java.io.PrintWriter;
1211
import java.io.StringWriter;
13-
import java.util.Collection;
14-
import java.util.Collections;
15-
import java.util.HashMap;
16-
import java.util.Map;
1712

1813
/**
1914
* Used to represent all of the decompilers/disassemblers BCV contains.
@@ -22,15 +17,8 @@
2217
*/
2318

2419
public abstract class Decompiler {
25-
private static final Map<String, Decompiler> BY_NAME = new HashMap<>();
26-
27-
public final static Decompiler BYTECODE = new ClassNodeDecompiler();
28-
public final static Decompiler FERNFLOWER = new FernFlowerDecompiler();
29-
public final static Decompiler PROCYON = new ProcyonDecompiler();
30-
public final static Decompiler CFR = new CFRDecompiler();
31-
3220
public Decompiler() {
33-
BY_NAME.put(getName().toLowerCase().replace(' ', '-'), this);
21+
Decompilers.BY_NAME.add(this);
3422
}
3523

3624
protected DecompilerSettings settings = new DecompilerSettings(this);
@@ -73,12 +61,4 @@ protected byte[] fixBytes(byte[] in) {
7361
public static void ensureInitted() {
7462
// Just to make sure the classes is loaded so all decompilers are loaded
7563
}
76-
77-
public static Decompiler getByName(String name) {
78-
return BY_NAME.get(name.toLowerCase().replace(' ', '-'));
79-
}
80-
81-
public static Collection<Decompiler> getAllDecompilers() {
82-
return Collections.unmodifiableCollection(BY_NAME.values());
83-
}
8464
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package the.bytecode.club.jda.decompilers;
2+
3+
import the.bytecode.club.jda.decompilers.bytecode.ClassNodeDecompiler;
4+
5+
import java.util.ArrayList;
6+
import java.util.Collection;
7+
import java.util.Collections;
8+
import java.util.List;
9+
10+
public class Decompilers {
11+
static final List<Decompiler> BY_NAME = new ArrayList<>();
12+
13+
public final static Decompiler PROCYON = new ProcyonDecompiler();
14+
public final static Decompiler CFR = new CFRDecompiler();
15+
public final static Decompiler FERNFLOWER = new FernflowerDecompiler();
16+
public final static Decompiler BYTECODE = new ClassNodeDecompiler();
17+
18+
19+
public static Collection<Decompiler> getAllDecompilers() {
20+
return Collections.unmodifiableCollection(BY_NAME);
21+
}
22+
}

src/main/java/the/bytecode/club/jda/decompilers/FernFlowerDecompiler.java renamed to src/main/java/the/bytecode/club/jda/decompilers/FernflowerDecompiler.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,17 +25,17 @@
2525
* @author WaterWolf
2626
*/
2727

28-
public class FernFlowerDecompiler extends Decompiler {
28+
public class FernflowerDecompiler extends Decompiler {
2929

30-
public FernFlowerDecompiler() {
30+
public FernflowerDecompiler() {
3131
for (Settings setting : Settings.values()) {
3232
settings.registerSetting(setting);
3333
}
3434
}
3535

3636
@Override
3737
public String getName() {
38-
return "FernFlower";
38+
return "Fernflower";
3939
}
4040

4141
@Override

src/main/java/the/bytecode/club/jda/decompilers/bytecode/MethodNodeDecompiler.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
import org.objectweb.asm.Type;
55
import org.objectweb.asm.tree.*;
66
import the.bytecode.club.jda.JDA;
7-
import the.bytecode.club.jda.decompilers.Decompiler;
7+
import the.bytecode.club.jda.decompilers.Decompilers;
88

99
import java.util.ArrayList;
1010
import java.util.Arrays;
@@ -241,14 +241,14 @@ private static String getAccessString(int access) {
241241
}
242242

243243
static boolean createComments() {
244-
return Decompiler.BYTECODE.getSettings().isSelected(ClassNodeDecompiler.Settings.DEBUG_HELPERS);
244+
return Decompilers.BYTECODE.getSettings().isSelected(ClassNodeDecompiler.Settings.DEBUG_HELPERS);
245245
}
246246

247247
static boolean createLabelBrackets() {
248-
return Decompiler.BYTECODE.getSettings().isSelected(ClassNodeDecompiler.Settings.APPEND_BRACKETS_TO_LABELS);
248+
return Decompilers.BYTECODE.getSettings().isSelected(ClassNodeDecompiler.Settings.APPEND_BRACKETS_TO_LABELS);
249249
}
250250

251251
static boolean createDescriptors() {
252-
return Decompiler.BYTECODE.getSettings().isSelected(ClassNodeDecompiler.Settings.SHOW_METHOD_DESCRIPTORS);
252+
return Decompilers.BYTECODE.getSettings().isSelected(ClassNodeDecompiler.Settings.SHOW_METHOD_DESCRIPTORS);
253253
}
254254
}

src/main/java/the/bytecode/club/jda/gui/MainViewerGUI.java

Lines changed: 42 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,7 @@
44
import org.objectweb.asm.tree.ClassNode;
55
import the.bytecode.club.jda.*;
66
import the.bytecode.club.jda.api.ExceptionUI;
7-
import the.bytecode.club.jda.decompilers.CFRDecompiler;
8-
import the.bytecode.club.jda.decompilers.Decompiler;
9-
import the.bytecode.club.jda.decompilers.FernFlowerDecompiler;
10-
import the.bytecode.club.jda.decompilers.ProcyonDecompiler;
7+
import the.bytecode.club.jda.decompilers.*;
118
import the.bytecode.club.jda.decompilers.bytecode.ClassNodeDecompiler;
129
import the.bytecode.club.jda.settings.DecompilerSettings;
1310
import the.bytecode.club.jda.settings.IPersistentWindow;
@@ -250,28 +247,28 @@ private void initializeMenubar() {
250247
settingsMenu.add(new JSeparator());
251248

252249
JMenu cfrSettingsMenu = new JMenu("CFR");
253-
DecompilerSettings cfrSettings = Decompiler.CFR.getSettings();
250+
DecompilerSettings cfrSettings = Decompilers.CFR.getSettings();
254251
for (CFRDecompiler.Settings setting : CFRDecompiler.Settings.values()) {
255252
cfrSettingsMenu.add(cfrSettings.getMenuItem(setting));
256253
}
257254
settingsMenu.add(cfrSettingsMenu);
258255

259256
JMenu fernflowerSettingMenu = new JMenu("FernFlower");
260-
DecompilerSettings fernflowerSettings = Decompiler.FERNFLOWER.getSettings();
261-
for (FernFlowerDecompiler.Settings setting : FernFlowerDecompiler.Settings.values()) {
257+
DecompilerSettings fernflowerSettings = Decompilers.FERNFLOWER.getSettings();
258+
for (FernflowerDecompiler.Settings setting : FernflowerDecompiler.Settings.values()) {
262259
fernflowerSettingMenu.add(fernflowerSettings.getMenuItem(setting));
263260
}
264261
settingsMenu.add(fernflowerSettingMenu);
265262

266263
JMenu procyonSettingsMenu = new JMenu("Procyon");
267-
DecompilerSettings procyonSettings = Decompiler.PROCYON.getSettings();
264+
DecompilerSettings procyonSettings = Decompilers.PROCYON.getSettings();
268265
for (ProcyonDecompiler.Settings setting : ProcyonDecompiler.Settings.values()) {
269266
procyonSettingsMenu.add(procyonSettings.getMenuItem(setting));
270267
}
271268
settingsMenu.add(procyonSettingsMenu);
272269

273270
JMenu bytecodeSettingsMenu = new JMenu("Bytecode Decompiler");
274-
DecompilerSettings bytecodeSettings = Decompiler.BYTECODE.getSettings();
271+
DecompilerSettings bytecodeSettings = Decompilers.BYTECODE.getSettings();
275272
for (ClassNodeDecompiler.Settings setting : ClassNodeDecompiler.Settings.values()) {
276273
bytecodeSettingsMenu.add(bytecodeSettings.getMenuItem(setting));
277274
}
@@ -312,8 +309,8 @@ private void initializeMenubar() {
312309
});
313310
viewMenu.add(mnShowContainer);
314311

315-
panelGroup1.setSelected(allDecompilersRev.get(panelGroup1).get(Decompiler.FERNFLOWER).getModel(), true);
316-
panelGroup2.setSelected(allDecompilersRev.get(panelGroup2).get(Decompiler.BYTECODE).getModel(), true);
312+
panelGroup1.setSelected(allDecompilersRev.get(panelGroup1).get(Decompilers.FERNFLOWER).getModel(), true);
313+
panelGroup2.setSelected(allDecompilersRev.get(panelGroup2).get(Decompilers.BYTECODE).getModel(), true);
317314
panelGroup3.setSelected(allDecompilersRev.get(panelGroup3).get(null).getModel(), true);
318315
}
319316

@@ -374,44 +371,43 @@ public void windowClosing(WindowEvent e) {
374371
dialog.setVisible(true);
375372
}
376373

377-
private JMenu generateDecompilerMenu(Decompiler decompiler, int panelId) {
378-
ButtonGroup group = allPanes.get(panelId);
379-
JMenu menu = new JMenu(decompiler.getName());
380-
JRadioButtonMenuItem java = new JRadioButtonMenuItem("Java");
381-
java.addActionListener(listener);
382-
JRadioButtonMenuItem bytecode = new JRadioButtonMenuItem("Bytecode");
383-
JCheckBoxMenuItem editable = new JCheckBoxMenuItem("Editable");
384-
JSeparator separator = new JSeparator();
385-
menu.add(java);
386-
group.add(java);
387-
allDecompilers.get(group).put(java, decompiler);
388-
allDecompilersRev.get(group).put(decompiler, java);
389-
menu.add(separator);
390-
menu.add(editable);
391-
editButtons.get(group).put(decompiler, editable);
392-
return menu;
393-
}
374+
// private JMenu generateDecompilerMenu(Decompiler decompiler, int panelId) {
375+
// ButtonGroup group = allPanes.get(panelId);
376+
// JMenu menu = new JMenu(decompiler.getName());
377+
// JRadioButtonMenuItem java = new JRadioButtonMenuItem("Java");
378+
// java.addActionListener(listener);
379+
// JRadioButtonMenuItem bytecode = new JRadioButtonMenuItem("Bytecode");
380+
// JCheckBoxMenuItem editable = new JCheckBoxMenuItem("Editable");
381+
// JSeparator separator = new JSeparator();
382+
// menu.add(java);
383+
// group.add(java);
384+
// allDecompilers.get(group).put(java, decompiler);
385+
// allDecompilersRev.get(group).put(decompiler, java);
386+
// menu.add(separator);
387+
// menu.add(editable);
388+
// editButtons.get(group).put(decompiler, editable);
389+
// return menu;
390+
// }
394391

395392
private JMenu generatePane(int id) {
396393
JMenu menu = new JMenu("Pane " + (id + 1));
397-
JRadioButtonMenuItem none = new JRadioButtonMenuItem("None");
398-
JRadioButtonMenuItem bytecode = new JRadioButtonMenuItem("Bytecode");
399394
ButtonGroup group = allPanes.get(id);
400395

401-
group.add(none);
402-
group.add(bytecode);
396+
JRadioButtonMenuItem none = new JRadioButtonMenuItem("None");
403397
allDecompilers.get(group).put(none, null);
404398
allDecompilersRev.get(group).put(null, none);
405-
allDecompilers.get(group).put(bytecode, Decompiler.BYTECODE);
406-
allDecompilersRev.get(group).put(Decompiler.BYTECODE, bytecode);
407-
399+
group.add(none);
408400
menu.add(none);
409401
menu.add(new JSeparator());
410-
menu.add(generateDecompilerMenu(Decompiler.PROCYON, id));
411-
menu.add(generateDecompilerMenu(Decompiler.CFR, id));
412-
menu.add(generateDecompilerMenu(Decompiler.FERNFLOWER, id));
413-
menu.add(new JSeparator());
414-
menu.add(bytecode);
402+
403+
for (Decompiler decompiler : Decompilers.getAllDecompilers()) {
404+
JRadioButtonMenuItem button = new JRadioButtonMenuItem(decompiler.getName());
405+
allDecompilers.get(group).put(button, decompiler);
406+
allDecompilersRev.get(group).put(decompiler, button);
407+
group.add(button);
408+
menu.add(button);
409+
410+
}
415411
return menu;
416412
}
417413

@@ -710,7 +706,7 @@ public void run() {
710706
try {
711707
ClassNode cn1 = JDA.getClassNode(containerName, s);
712708
byte[] bytes = JDA.getClassBytes(containerName, s);
713-
String contents = Decompiler.PROCYON.decompileClassNode(cn1, bytes);
709+
String contents = Decompilers.PROCYON.decompileClassNode(cn1, bytes);
714710
FileUtils.writeStringToFile(new File(path), contents, "UTF-8");
715711
JDA.viewer.setIcon(false);
716712
} catch (Exception e) {
@@ -727,7 +723,7 @@ public void run() {
727723
try {
728724
ClassNode cn1 = JDA.getClassNode(containerName, s);
729725
byte[] bytes = JDA.getClassBytes(containerName, s);
730-
String contents = Decompiler.CFR.decompileClassNode(cn1, bytes);
726+
String contents = Decompilers.CFR.decompileClassNode(cn1, bytes);
731727
FileUtils.writeStringToFile(new File(path), contents, "UTF-8");
732728
JDA.viewer.setIcon(false);
733729
} catch (Exception e) {
@@ -744,7 +740,7 @@ public void run() {
744740
try {
745741
ClassNode cn1 = JDA.getClassNode(containerName, s);
746742
byte[] bytes = JDA.getClassBytes(containerName, s);
747-
String contents = Decompiler.FERNFLOWER.decompileClassNode(cn1, bytes);
743+
String contents = Decompilers.FERNFLOWER.decompileClassNode(cn1, bytes);
748744
FileUtils.writeStringToFile(new File(path), contents, "UTF-8");
749745
JDA.viewer.setIcon(false);
750746
} catch (Exception e) {
@@ -830,7 +826,7 @@ public String getDescription() {
830826
@Override
831827
public void run() {
832828
try {
833-
Decompiler.PROCYON.decompileToZip(path);
829+
Decompilers.PROCYON.decompileToZip(path);
834830
JDA.viewer.setIcon(false);
835831
} catch (Exception e) {
836832
new ExceptionUI(e);
@@ -844,7 +840,7 @@ public void run() {
844840
@Override
845841
public void run() {
846842
try {
847-
Decompiler.CFR.decompileToZip(path);
843+
Decompilers.CFR.decompileToZip(path);
848844
JDA.viewer.setIcon(false);
849845
} catch (Exception e) {
850846
new ExceptionUI(e);
@@ -858,7 +854,7 @@ public void run() {
858854
@Override
859855
public void run() {
860856
try {
861-
Decompiler.FERNFLOWER.decompileToZip(path);
857+
Decompilers.FERNFLOWER.decompileToZip(path);
862858
JDA.viewer.setIcon(false);
863859
} catch (Exception e) {
864860
new ExceptionUI(e);

src/main/java/the/bytecode/club/jda/settings/Settings.java

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
import com.eclipsesource.json.JsonObject;
44
import com.eclipsesource.json.JsonValue;
55
import the.bytecode.club.jda.JDA;
6-
import the.bytecode.club.jda.decompilers.Decompiler;
6+
import the.bytecode.club.jda.decompilers.Decompilers;
77
import the.bytecode.club.jda.gui.JDAWindow;
88
import the.bytecode.club.jda.gui.MainViewerGUI;
99

@@ -21,8 +21,8 @@
2121
public class Settings {
2222
static final List<Setting> ALL_SETTINGS = new ArrayList<>();
2323

24-
public static final Setting PATH = new Setting("path", "");
2524
// todo: I should really refactor this
25+
public static final Setting PATH = new Setting("path", "");
2626
public static final Setting SHOW_CONTAINER_NAME = new Setting("showfilename", "false");
2727
public static final Setting SNAP_TO_EDGES = new Setting("snaptoedges", "false");
2828
public static final Setting DO_UPDATE_CHECK = new Setting("doupdatecheck", "true");
@@ -35,10 +35,10 @@ public class Settings {
3535
public static void saveGUI() {
3636
try {
3737
JsonObject settings = new JsonObject();
38-
Decompiler.CFR.getSettings().saveTo(settings);
39-
Decompiler.FERNFLOWER.getSettings().saveTo(settings);
40-
Decompiler.PROCYON.getSettings().saveTo(settings);
41-
Decompiler.BYTECODE.getSettings().saveTo(settings);
38+
Decompilers.CFR.getSettings().saveTo(settings);
39+
Decompilers.FERNFLOWER.getSettings().saveTo(settings);
40+
Decompilers.PROCYON.getSettings().saveTo(settings);
41+
Decompilers.BYTECODE.getSettings().saveTo(settings);
4242

4343

4444
for (Setting setting : Settings.ALL_SETTINGS) {
@@ -88,10 +88,10 @@ public static void saveFrame(JsonObject windowsSection, IPersistentWindow f) {
8888
public static void loadGUI() {
8989
try {
9090
JsonObject settings = JsonObject.readFrom(new FileReader(JDA.settingsFile));
91-
Decompiler.CFR.getSettings().loadFrom(settings);
92-
Decompiler.FERNFLOWER.getSettings().loadFrom(settings);
93-
Decompiler.PROCYON.getSettings().loadFrom(settings);
94-
Decompiler.BYTECODE.getSettings().loadFrom(settings);
91+
Decompilers.CFR.getSettings().loadFrom(settings);
92+
Decompilers.FERNFLOWER.getSettings().loadFrom(settings);
93+
Decompilers.PROCYON.getSettings().loadFrom(settings);
94+
Decompilers.BYTECODE.getSettings().loadFrom(settings);
9595
for (Setting setting : Settings.ALL_SETTINGS) {
9696
String nodeId = setting.node;
9797
JsonValue nodeValue = settings.get(nodeId);

0 commit comments

Comments
 (0)