From b4aaff683d78ab92b83f3a7257c33b8e27d1affa Mon Sep 17 00:00:00 2001 From: Thog Date: Tue, 7 Mar 2017 21:24:39 +0100 Subject: Drop unix case style and implement hashCode when equals is overrided Also update Guava to version 21 --- src/main/java/cuchaz/enigma/gui/BrowserCaret.java | 1 - .../java/cuchaz/enigma/gui/ClassMatchingGui.java | 290 +++++++++---------- src/main/java/cuchaz/enigma/gui/ClassSelector.java | 29 +- src/main/java/cuchaz/enigma/gui/CodeReader.java | 89 +++--- src/main/java/cuchaz/enigma/gui/Gui.java | 318 ++++++++++----------- src/main/java/cuchaz/enigma/gui/GuiController.java | 64 ++--- .../java/cuchaz/enigma/gui/MemberMatchingGui.java | 281 ++++++++---------- .../java/cuchaz/enigma/gui/ScoredClassEntry.java | 20 +- .../java/cuchaz/enigma/gui/dialog/CrashDialog.java | 32 +-- .../cuchaz/enigma/gui/dialog/ProgressDialog.java | 16 +- .../java/cuchaz/enigma/gui/elements/MenuBar.java | 20 +- .../cuchaz/enigma/gui/elements/PopupMenuBar.java | 2 +- .../enigma/gui/node/ClassSelectorClassNode.java | 5 + .../enigma/gui/node/ClassSelectorPackageNode.java | 5 + 14 files changed, 568 insertions(+), 604 deletions(-) (limited to 'src/main/java/cuchaz/enigma/gui') diff --git a/src/main/java/cuchaz/enigma/gui/BrowserCaret.java b/src/main/java/cuchaz/enigma/gui/BrowserCaret.java index 013778a..bcdff51 100644 --- a/src/main/java/cuchaz/enigma/gui/BrowserCaret.java +++ b/src/main/java/cuchaz/enigma/gui/BrowserCaret.java @@ -11,7 +11,6 @@ package cuchaz.enigma.gui; import javax.swing.text.DefaultCaret; -import javax.swing.text.Highlighter; public class BrowserCaret extends DefaultCaret { diff --git a/src/main/java/cuchaz/enigma/gui/ClassMatchingGui.java b/src/main/java/cuchaz/enigma/gui/ClassMatchingGui.java index edf1e30..dcbe1c5 100644 --- a/src/main/java/cuchaz/enigma/gui/ClassMatchingGui.java +++ b/src/main/java/cuchaz/enigma/gui/ClassMatchingGui.java @@ -13,19 +13,6 @@ package cuchaz.enigma.gui; import com.google.common.collect.BiMap; import com.google.common.collect.Lists; import com.google.common.collect.Maps; - -import java.awt.BorderLayout; -import java.awt.Container; -import java.awt.Dimension; -import java.awt.FlowLayout; -import java.awt.event.ActionListener; -import java.util.Collection; -import java.util.Collections; -import java.util.List; -import java.util.Map; - -import javax.swing.*; - import cuchaz.enigma.Constants; import cuchaz.enigma.Deobfuscator; import cuchaz.enigma.convert.*; @@ -37,6 +24,13 @@ import cuchaz.enigma.mapping.MappingsChecker; import cuchaz.enigma.throwables.MappingConflict; import de.sciss.syntaxpane.DefaultSyntaxKit; +import javax.swing.*; +import java.awt.*; +import java.awt.event.ActionListener; +import java.util.Collection; +import java.util.List; +import java.util.Map; + public class ClassMatchingGui { @@ -80,35 +74,35 @@ public class ClassMatchingGui { } // controls - private JFrame m_frame; - private ClassSelector m_sourceClasses; - private ClassSelector m_destClasses; - private CodeReader m_sourceReader; - private CodeReader m_destReader; - private JLabel m_sourceClassLabel; - private JLabel m_destClassLabel; - private JButton m_matchButton; - private Map m_sourceTypeButtons; - private JCheckBox m_advanceCheck; - private JCheckBox m_top10Matches; - - private ClassMatches m_classMatches; - private Deobfuscator m_sourceDeobfuscator; - private Deobfuscator m_destDeobfuscator; - private ClassEntry m_sourceClass; - private ClassEntry m_destClass; - private SourceType m_sourceType; - private SaveListener m_saveListener; + private JFrame frame; + private ClassSelector sourceClasses; + private ClassSelector destClasses; + private CodeReader sourceReader; + private CodeReader destReader; + private JLabel sourceClassLabel; + private JLabel destClassLabel; + private JButton matchButton; + private Map sourceTypeButtons; + private JCheckBox advanceCheck; + private JCheckBox top10Matches; + + private ClassMatches classMatches; + private Deobfuscator sourceDeobfuscator; + private Deobfuscator destDeobfuscator; + private ClassEntry sourceClass; + private ClassEntry destClass; + private SourceType sourceType; + private SaveListener saveListener; public ClassMatchingGui(ClassMatches matches, Deobfuscator sourceDeobfuscator, Deobfuscator destDeobfuscator) { - m_classMatches = matches; - m_sourceDeobfuscator = sourceDeobfuscator; - m_destDeobfuscator = destDeobfuscator; + classMatches = matches; + this.sourceDeobfuscator = sourceDeobfuscator; + this.destDeobfuscator = destDeobfuscator; // init frame - m_frame = new JFrame(Constants.NAME + " - Class Matcher"); - final Container pane = m_frame.getContentPane(); + frame = new JFrame(Constants.NAME + " - Class Matcher"); + final Container pane = frame.getContentPane(); pane.setLayout(new BorderLayout()); // init source side @@ -124,16 +118,16 @@ public class ClassMatchingGui { sourceTypePanel.setLayout(new BoxLayout(sourceTypePanel, BoxLayout.PAGE_AXIS)); ActionListener sourceTypeListener = event -> setSourceType(SourceType.valueOf(event.getActionCommand())); ButtonGroup sourceTypeButtons = new ButtonGroup(); - m_sourceTypeButtons = Maps.newHashMap(); + this.sourceTypeButtons = Maps.newHashMap(); for (SourceType sourceType : SourceType.values()) { JRadioButton button = sourceType.newRadio(sourceTypeListener, sourceTypeButtons); - m_sourceTypeButtons.put(sourceType, button); + this.sourceTypeButtons.put(sourceType, button); sourceTypePanel.add(button); } - m_sourceClasses = new ClassSelector(null, ClassSelector.DEOBF_CLASS_COMPARATOR, false); - m_sourceClasses.setSelectionListener(this::setSourceClass); - JScrollPane sourceScroller = new JScrollPane(m_sourceClasses); + sourceClasses = new ClassSelector(null, ClassSelector.DEOBF_CLASS_COMPARATOR, false); + sourceClasses.setSelectionListener(this::setSourceClass); + JScrollPane sourceScroller = new JScrollPane(sourceClasses); sourcePanel.add(sourceScroller); // init dest side @@ -143,13 +137,13 @@ public class ClassMatchingGui { pane.add(destPanel, BorderLayout.WEST); destPanel.add(new JLabel("Destination Classes")); - m_top10Matches = new JCheckBox("Show only top 10 matches"); - destPanel.add(m_top10Matches); - m_top10Matches.addActionListener(event -> toggleTop10Matches()); + top10Matches = new JCheckBox("Show only top 10 matches"); + destPanel.add(top10Matches); + top10Matches.addActionListener(event -> toggleTop10Matches()); - m_destClasses = new ClassSelector(null, ClassSelector.DEOBF_CLASS_COMPARATOR, false); - m_destClasses.setSelectionListener(this::setDestClass); - JScrollPane destScroller = new JScrollPane(m_destClasses); + destClasses = new ClassSelector(null, ClassSelector.DEOBF_CLASS_COMPARATOR, false); + destClasses.setSelectionListener(this::setDestClass); + JScrollPane destScroller = new JScrollPane(destClasses); destPanel.add(destScroller); JButton autoMatchButton = new JButton("AutoMatch"); @@ -158,13 +152,14 @@ public class ClassMatchingGui { // init source panels DefaultSyntaxKit.initKit(); - m_sourceReader = new CodeReader(); - m_destReader = new CodeReader(); + sourceReader = new CodeReader(); + destReader = new CodeReader(); // init all the splits - JSplitPane splitLeft = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, true, sourcePanel, new JScrollPane(m_sourceReader)); + JSplitPane splitLeft = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, true, sourcePanel, new JScrollPane( + sourceReader)); splitLeft.setResizeWeight(0); // let the right side take all the slack - JSplitPane splitRight = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, true, new JScrollPane(m_destReader), destPanel); + JSplitPane splitRight = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, true, new JScrollPane(destReader), destPanel); splitRight.setResizeWeight(1); // let the left side take all the slack JSplitPane splitCenter = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, true, splitLeft, splitRight); splitCenter.setResizeWeight(0.5); // resize 50:50 @@ -175,55 +170,52 @@ public class ClassMatchingGui { JPanel bottomPanel = new JPanel(); bottomPanel.setLayout(new FlowLayout()); - m_sourceClassLabel = new JLabel(); - m_sourceClassLabel.setHorizontalAlignment(SwingConstants.RIGHT); - m_destClassLabel = new JLabel(); - m_destClassLabel.setHorizontalAlignment(SwingConstants.LEFT); + sourceClassLabel = new JLabel(); + sourceClassLabel.setHorizontalAlignment(SwingConstants.RIGHT); + destClassLabel = new JLabel(); + destClassLabel.setHorizontalAlignment(SwingConstants.LEFT); - m_matchButton = new JButton(); + matchButton = new JButton(); - m_advanceCheck = new JCheckBox("Advance to next likely match"); - m_advanceCheck.addActionListener(event -> { - if (m_advanceCheck.isSelected()) { + advanceCheck = new JCheckBox("Advance to next likely match"); + advanceCheck.addActionListener(event -> { + if (advanceCheck.isSelected()) { advance(); } }); - bottomPanel.add(m_sourceClassLabel); - bottomPanel.add(m_matchButton); - bottomPanel.add(m_destClassLabel); - bottomPanel.add(m_advanceCheck); + bottomPanel.add(sourceClassLabel); + bottomPanel.add(matchButton); + bottomPanel.add(destClassLabel); + bottomPanel.add(advanceCheck); pane.add(bottomPanel, BorderLayout.SOUTH); // show the frame pane.doLayout(); - m_frame.setSize(1024, 576); - m_frame.setMinimumSize(new Dimension(640, 480)); - m_frame.setVisible(true); - m_frame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); + frame.setSize(1024, 576); + frame.setMinimumSize(new Dimension(640, 480)); + frame.setVisible(true); + frame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); // init state updateDestMappings(); setSourceType(SourceType.getDefault()); updateMatchButton(); - m_saveListener = null; + saveListener = null; } public void setSaveListener(SaveListener val) { - m_saveListener = val; + saveListener = val; } private void updateDestMappings() { try { - Mappings newMappings = MappingsConverter.newMappings( - m_classMatches, - m_sourceDeobfuscator.getMappings(), - m_sourceDeobfuscator, - m_destDeobfuscator + Mappings newMappings = MappingsConverter.newMappings(classMatches, + sourceDeobfuscator.getMappings(), sourceDeobfuscator, destDeobfuscator ); // look for dropped mappings - MappingsChecker checker = new MappingsChecker(m_destDeobfuscator.getJarIndex()); + MappingsChecker checker = new MappingsChecker(destDeobfuscator.getJarIndex()); checker.dropBrokenMappings(newMappings); // count them @@ -236,7 +228,7 @@ public class ClassMatchingGui { numDroppedMethods )); - m_destDeobfuscator.setMappings(newMappings); + destDeobfuscator.setMappings(newMappings); } catch (MappingConflict ex) { System.out.println(ex.getMessage()); ex.printStackTrace(); @@ -247,14 +239,14 @@ public class ClassMatchingGui { protected void setSourceType(SourceType val) { // show the source classes - m_sourceType = val; - m_sourceClasses.setClasses(deobfuscateClasses(m_sourceType.getSourceClasses(m_classMatches), m_sourceDeobfuscator)); + sourceType = val; + sourceClasses.setClasses(deobfuscateClasses(sourceType.getSourceClasses(classMatches), sourceDeobfuscator)); // update counts for (SourceType sourceType : SourceType.values()) { - m_sourceTypeButtons.get(sourceType).setText(String.format("%s (%d)", + sourceTypeButtons.get(sourceType).setText(String.format("%s (%d)", sourceType.name(), - sourceType.getSourceClasses(m_classMatches).size() + sourceType.getSourceClasses(classMatches).size() )); } } @@ -278,7 +270,7 @@ public class ClassMatchingGui { protected void setSourceClass(ClassEntry classEntry) { Runnable onGetDestClasses = null; - if (m_advanceCheck.isSelected()) { + if (advanceCheck.isSelected()) { onGetDestClasses = this::pickBestDestClass; } @@ -288,35 +280,33 @@ public class ClassMatchingGui { protected void setSourceClass(ClassEntry classEntry, final Runnable onGetDestClasses) { // update the current source class - m_sourceClass = classEntry; - m_sourceClassLabel.setText(m_sourceClass != null ? m_sourceClass.getName() : ""); + sourceClass = classEntry; + sourceClassLabel.setText(sourceClass != null ? sourceClass.getName() : ""); - if (m_sourceClass != null) { + if (sourceClass != null) { // show the dest class(es) - ClassMatch match = m_classMatches.getMatchBySource(m_sourceDeobfuscator.obfuscateEntry(m_sourceClass)); + ClassMatch match = classMatches.getMatchBySource(sourceDeobfuscator.obfuscateEntry(sourceClass)); assert (match != null); if (match.destClasses.isEmpty()) { - m_destClasses.setClasses(null); + destClasses.setClasses(null); // run in a separate thread to keep ui responsive - new Thread() { - @Override - public void run() { - m_destClasses.setClasses(deobfuscateClasses(getLikelyMatches(m_sourceClass), m_destDeobfuscator)); - m_destClasses.expandAll(); - - if (onGetDestClasses != null) { - onGetDestClasses.run(); - } + new Thread(() -> + { + destClasses.setClasses(deobfuscateClasses(getLikelyMatches(sourceClass), destDeobfuscator)); + destClasses.expandAll(); + + if (onGetDestClasses != null) { + onGetDestClasses.run(); } - }.start(); + }).start(); } else { - m_destClasses.setClasses(deobfuscateClasses(match.destClasses, m_destDeobfuscator)); - m_destClasses.expandAll(); + destClasses.setClasses(deobfuscateClasses(match.destClasses, destDeobfuscator)); + destClasses.expandAll(); if (onGetDestClasses != null) { onGetDestClasses.run(); @@ -325,23 +315,24 @@ public class ClassMatchingGui { } setDestClass(null); - m_sourceReader.decompileClass(m_sourceClass, m_sourceDeobfuscator, () -> m_sourceReader.navigateToClassDeclaration(m_sourceClass)); + sourceReader.decompileClass( + sourceClass, sourceDeobfuscator, () -> sourceReader.navigateToClassDeclaration(sourceClass)); updateMatchButton(); } private Collection getLikelyMatches(ClassEntry sourceClass) { - ClassEntry obfSourceClass = m_sourceDeobfuscator.obfuscateEntry(sourceClass); + ClassEntry obfSourceClass = sourceDeobfuscator.obfuscateEntry(sourceClass); // set up identifiers - ClassNamer namer = new ClassNamer(m_classMatches.getUniqueMatches()); + ClassNamer namer = new ClassNamer(classMatches.getUniqueMatches()); ClassIdentifier sourceIdentifier = new ClassIdentifier( - m_sourceDeobfuscator.getJar(), m_sourceDeobfuscator.getJarIndex(), + sourceDeobfuscator.getJar(), sourceDeobfuscator.getJarIndex(), namer.getSourceNamer(), true ); ClassIdentifier destIdentifier = new ClassIdentifier( - m_destDeobfuscator.getJar(), m_destDeobfuscator.getJarIndex(), + destDeobfuscator.getJar(), destDeobfuscator.getJarIndex(), namer.getDestNamer(), true ); @@ -350,15 +341,16 @@ public class ClassMatchingGui { // rank all the unmatched dest classes against the source class ClassIdentity sourceIdentity = sourceIdentifier.identify(obfSourceClass); List scoredDestClasses = Lists.newArrayList(); - for (ClassEntry unmatchedDestClass : m_classMatches.getUnmatchedDestClasses()) { + for (ClassEntry unmatchedDestClass : classMatches.getUnmatchedDestClasses()) { ClassIdentity destIdentity = destIdentifier.identify(unmatchedDestClass); float score = 100.0f * (sourceIdentity.getMatchScore(destIdentity) + destIdentity.getMatchScore(sourceIdentity)) / (sourceIdentity.getMaxMatchScore() + destIdentity.getMaxMatchScore()); scoredDestClasses.add(new ScoredClassEntry(unmatchedDestClass, score)); } - if (m_top10Matches.isSelected() && scoredDestClasses.size() > 10) { - Collections.sort(scoredDestClasses, (a, b) -> { + if (top10Matches.isSelected() && scoredDestClasses.size() > 10) { + scoredDestClasses.sort((a, b) -> + { ScoredClassEntry sa = (ScoredClassEntry) a; ScoredClassEntry sb = (ScoredClassEntry) b; return -Float.compare(sa.getScore(), sb.getScore()); @@ -376,30 +368,30 @@ public class ClassMatchingGui { protected void setDestClass(ClassEntry classEntry) { // update the current source class - m_destClass = classEntry; - m_destClassLabel.setText(m_destClass != null ? m_destClass.getName() : ""); + destClass = classEntry; + destClassLabel.setText(destClass != null ? destClass.getName() : ""); - m_destReader.decompileClass(m_destClass, m_destDeobfuscator, () -> m_destReader.navigateToClassDeclaration(m_destClass)); + destReader.decompileClass(destClass, destDeobfuscator, () -> destReader.navigateToClassDeclaration(destClass)); updateMatchButton(); } private void updateMatchButton() { - ClassEntry obfSource = m_sourceDeobfuscator.obfuscateEntry(m_sourceClass); - ClassEntry obfDest = m_destDeobfuscator.obfuscateEntry(m_destClass); + ClassEntry obfSource = sourceDeobfuscator.obfuscateEntry(sourceClass); + ClassEntry obfDest = destDeobfuscator.obfuscateEntry(destClass); - BiMap uniqueMatches = m_classMatches.getUniqueMatches(); - boolean twoSelected = m_sourceClass != null && m_destClass != null; + BiMap uniqueMatches = classMatches.getUniqueMatches(); + boolean twoSelected = sourceClass != null && destClass != null; boolean isMatched = uniqueMatches.containsKey(obfSource) && uniqueMatches.containsValue(obfDest); boolean canMatch = !uniqueMatches.containsKey(obfSource) && !uniqueMatches.containsValue(obfDest); - GuiTricks.deactivateButton(m_matchButton); + GuiTricks.deactivateButton(matchButton); if (twoSelected) { if (isMatched) { - GuiTricks.activateButton(m_matchButton, "Unmatch", event -> onUnmatchClick()); + GuiTricks.activateButton(matchButton, "Unmatch", event -> onUnmatchClick()); } else if (canMatch) { - GuiTricks.activateButton(m_matchButton, "Match", event -> onMatchClick()); + GuiTricks.activateButton(matchButton, "Match", event -> onMatchClick()); } } } @@ -407,19 +399,19 @@ public class ClassMatchingGui { private void onMatchClick() { // precondition: source and dest classes are set correctly - ClassEntry obfSource = m_sourceDeobfuscator.obfuscateEntry(m_sourceClass); - ClassEntry obfDest = m_destDeobfuscator.obfuscateEntry(m_destClass); + ClassEntry obfSource = sourceDeobfuscator.obfuscateEntry(sourceClass); + ClassEntry obfDest = destDeobfuscator.obfuscateEntry(destClass); // remove the classes from their match - m_classMatches.removeSource(obfSource); - m_classMatches.removeDest(obfDest); + classMatches.removeSource(obfSource); + classMatches.removeDest(obfDest); // add them as matched classes - m_classMatches.add(new ClassMatch(obfSource, obfDest)); + classMatches.add(new ClassMatch(obfSource, obfDest)); ClassEntry nextClass = null; - if (m_advanceCheck.isSelected()) { - nextClass = m_sourceClasses.getNextClass(m_sourceClass); + if (advanceCheck.isSelected()) { + nextClass = sourceClasses.getNextClass(sourceClass); } save(); @@ -433,11 +425,11 @@ public class ClassMatchingGui { private void onUnmatchClick() { // precondition: source and dest classes are set to a unique match - ClassEntry obfSource = m_sourceDeobfuscator.obfuscateEntry(m_sourceClass); + ClassEntry obfSource = sourceDeobfuscator.obfuscateEntry(sourceClass); // remove the source to break the match, then add the source back as unmatched - m_classMatches.removeSource(obfSource); - m_classMatches.add(new ClassMatch(obfSource, null)); + classMatches.removeSource(obfSource); + classMatches.add(new ClassMatch(obfSource, null)); save(); updateMatches(); @@ -446,20 +438,20 @@ public class ClassMatchingGui { private void updateMatches() { updateDestMappings(); setDestClass(null); - m_destClasses.setClasses(null); + destClasses.setClasses(null); updateMatchButton(); // remember where we were in the source tree - String packageName = m_sourceClasses.getSelectedPackage(); + String packageName = sourceClasses.getSelectedPackage(); - setSourceType(m_sourceType); + setSourceType(sourceType); - m_sourceClasses.expandPackage(packageName); + sourceClasses.expandPackage(packageName); } private void save() { - if (m_saveListener != null) { - m_saveListener.save(m_classMatches); + if (saveListener != null) { + saveListener.save(classMatches); } } @@ -469,17 +461,17 @@ public class ClassMatchingGui { // compute a new matching ClassMatching matching = MappingsConverter.computeMatching( - m_sourceDeobfuscator.getJar(), m_sourceDeobfuscator.getJarIndex(), - m_destDeobfuscator.getJar(), m_destDeobfuscator.getJarIndex(), - m_classMatches.getUniqueMatches() + sourceDeobfuscator.getJar(), sourceDeobfuscator.getJarIndex(), + destDeobfuscator.getJar(), destDeobfuscator.getJarIndex(), + classMatches.getUniqueMatches() ); ClassMatches newMatches = new ClassMatches(matching.matches()); System.out.println(String.format("Automatch found %d new matches", - newMatches.getUniqueMatches().size() - m_classMatches.getUniqueMatches().size() + newMatches.getUniqueMatches().size() - classMatches.getUniqueMatches().size() )); // update the current matches - m_classMatches = newMatches; + classMatches = newMatches; save(); updateMatches(); } @@ -492,17 +484,17 @@ public class ClassMatchingGui { // make sure we have a source class if (sourceClass == null) { - sourceClass = m_sourceClasses.getSelectedClass(); + sourceClass = sourceClasses.getSelectedClass(); if (sourceClass != null) { - sourceClass = m_sourceClasses.getNextClass(sourceClass); + sourceClass = sourceClasses.getNextClass(sourceClass); } else { - sourceClass = m_sourceClasses.getFirstClass(); + sourceClass = sourceClasses.getFirstClass(); } } // set the source class setSourceClass(sourceClass, this::pickBestDestClass); - m_sourceClasses.setSelectionClass(sourceClass); + sourceClasses.setSelectionClass(sourceClass); } private void pickBestDestClass() { @@ -510,8 +502,8 @@ public class ClassMatchingGui { // then, pick the best dest class ClassEntry firstClass = null; ScoredClassEntry bestDestClass = null; - for (ClassSelectorPackageNode packageNode : m_destClasses.packageNodes()) { - for (ClassSelectorClassNode classNode : m_destClasses.classNodes(packageNode)) { + for (ClassSelectorPackageNode packageNode : destClasses.packageNodes()) { + for (ClassSelectorClassNode classNode : destClasses.classNodes(packageNode)) { if (firstClass == null) { firstClass = classNode.getClassEntry(); } @@ -533,14 +525,14 @@ public class ClassMatchingGui { } setDestClass(destClass); - m_destClasses.setSelectionClass(destClass); + destClasses.setSelectionClass(destClass); } private void toggleTop10Matches() { - if (m_sourceClass != null) { - m_destClasses.clearSelection(); - m_destClasses.setClasses(deobfuscateClasses(getLikelyMatches(m_sourceClass), m_destDeobfuscator)); - m_destClasses.expandAll(); + if (sourceClass != null) { + destClasses.clearSelection(); + destClasses.setClasses(deobfuscateClasses(getLikelyMatches(sourceClass), destDeobfuscator)); + destClasses.expandAll(); } } } diff --git a/src/main/java/cuchaz/enigma/gui/ClassSelector.java b/src/main/java/cuchaz/enigma/gui/ClassSelector.java index 435509e..8ece0a0 100644 --- a/src/main/java/cuchaz/enigma/gui/ClassSelector.java +++ b/src/main/java/cuchaz/enigma/gui/ClassSelector.java @@ -29,7 +29,7 @@ import java.util.*; public class ClassSelector extends JTree { - public static final Comparator DEOBF_CLASS_COMPARATOR = (a, b) -> a.getName().compareTo(b.getName()); + public static final Comparator DEOBF_CLASS_COMPARATOR = Comparator.comparing(ClassEntry::getName); private DefaultMutableTreeNode rootNodes; public interface ClassSelectionListener { @@ -177,25 +177,32 @@ public class ClassSelector extends JTree { // sort the packages List sortedPackageNames = Lists.newArrayList(packages.keySet()); - Collections.sort(sortedPackageNames, (a, b) -> { + sortedPackageNames.sort((a, b) -> + { // I can never keep this rule straight when writing these damn things... // a < b => -1, a == b => 0, a > b => +1 - if(b == null || a == null){ + if (b == null || a == null) + { return 0; } String[] aparts = a.split("/"); String[] bparts = b.split("/"); - for (int i = 0; true; i++) { - if (i >= aparts.length) { + for (int i = 0; true; i++) + { + if (i >= aparts.length) + { return -1; - } else if (i >= bparts.length) { + } + else if (i >= bparts.length) + { return 1; } int result = aparts[i].compareTo(bparts[i]); - if (result != 0) { + if (result != 0) + { return result; } } @@ -219,7 +226,7 @@ public class ClassSelector extends JTree { for (String packageName : packagedClassEntries.keySet()) { // sort the class entries List classEntriesInPackage = Lists.newArrayList(packagedClassEntries.get(packageName)); - Collections.sort(classEntriesInPackage, this.comparator); + classEntriesInPackage.sort(this.comparator); // create the nodes in order for (ClassEntry classEntry : classEntriesInPackage) { @@ -274,7 +281,7 @@ public class ClassSelector extends JTree { public String getExpansionState(JTree tree, int row) { TreePath rowPath = tree.getPathForRow(row); - StringBuffer buf = new StringBuffer(); + StringBuilder buf = new StringBuilder(); int rowCount = tree.getRowCount(); for (int i = row; i < rowCount; i++) { TreePath path = tree.getPathForRow(i); @@ -500,7 +507,7 @@ public class ClassSelector extends JTree { { List classNodes = classNodes(newPackageNode); classNodes.add(classNode); - Collections.sort(classNodes, (a, b) -> a.toString().compareTo(b.toString())); + classNodes.sort(Comparator.comparing(ClassSelectorClassNode::toString)); for (int i = 0; i < classNodes.size(); i++) if (classNodes.get(i) == classNode) return i; @@ -514,7 +521,7 @@ public class ClassSelector extends JTree { if (!packageNodes.contains(newPackageNode)) { packageNodes.add(newPackageNode); - Collections.sort(packageNodes, (a, b) -> a.toString().compareTo(b.toString())); + packageNodes.sort(Comparator.comparing(ClassSelectorPackageNode::toString)); } for (int i = 0; i < packageNodes.size(); i++) diff --git a/src/main/java/cuchaz/enigma/gui/CodeReader.java b/src/main/java/cuchaz/enigma/gui/CodeReader.java index 601e5b9..8225d8f 100644 --- a/src/main/java/cuchaz/enigma/gui/CodeReader.java +++ b/src/main/java/cuchaz/enigma/gui/CodeReader.java @@ -19,8 +19,6 @@ import java.awt.event.ActionListener; import javax.swing.JEditorPane; import javax.swing.SwingUtilities; import javax.swing.Timer; -import javax.swing.event.CaretEvent; -import javax.swing.event.CaretListener; import javax.swing.text.BadLocationException; import javax.swing.text.Highlighter.HighlightPainter; @@ -38,15 +36,15 @@ public class CodeReader extends JEditorPane { private static final long serialVersionUID = 3673180950485748810L; - private static final Object m_lock = new Object(); + private static final Object lock = new Object(); public interface SelectionListener { void onSelect(EntryReference reference); } - private SelectionHighlightPainter m_selectionHighlightPainter; - private SourceIndex m_sourceIndex; - private SelectionListener m_selectionListener; + private SelectionHighlightPainter selectionHighlightPainter; + private SourceIndex sourceIndex; + private SelectionListener selectionListener; public CodeReader() { @@ -58,38 +56,34 @@ public class CodeReader extends JEditorPane { kit.toggleComponent(this, "de.sciss.syntaxpane.components.TokenMarker"); // hook events - addCaretListener(new CaretListener() { - @Override - public void caretUpdate(CaretEvent event) { - if (m_selectionListener != null && m_sourceIndex != null) { - Token token = m_sourceIndex.getReferenceToken(event.getDot()); - if (token != null) { - m_selectionListener.onSelect(m_sourceIndex.getDeobfReference(token)); - } else { - m_selectionListener.onSelect(null); - } + addCaretListener(event -> + { + if (selectionListener != null && sourceIndex != null) { + Token token = sourceIndex.getReferenceToken(event.getDot()); + if (token != null) { + selectionListener.onSelect(sourceIndex.getDeobfReference(token)); + } else { + selectionListener.onSelect(null); } } }); - m_selectionHighlightPainter = new SelectionHighlightPainter(); - m_sourceIndex = null; - m_selectionListener = null; + selectionHighlightPainter = new SelectionHighlightPainter(); } public void setSelectionListener(SelectionListener val) { - m_selectionListener = val; + selectionListener = val; } public void setCode(String code) { // sadly, the java lexer is not thread safe, so we have to serialize all these calls - synchronized (m_lock) { + synchronized (lock) { setText(code); } } public SourceIndex getSourceIndex() { - return m_sourceIndex; + return sourceIndex; } public void decompileClass(ClassEntry classEntry, Deobfuscator deobfuscator) { @@ -110,33 +104,31 @@ public class CodeReader extends JEditorPane { setCode("(decompiling...)"); // run decompilation in a separate thread to keep ui responsive - new Thread() { - @Override - public void run() { + new Thread(() -> + { - // decompile it - CompilationUnit sourceTree = deobfuscator.getSourceTree(classEntry.getOutermostClassName()); - String source = deobfuscator.getSource(sourceTree); - setCode(source); - m_sourceIndex = deobfuscator.getSourceIndex(sourceTree, source, ignoreBadTokens); + // decompile it + CompilationUnit sourceTree = deobfuscator.getSourceTree(classEntry.getOutermostClassName()); + String source = deobfuscator.getSource(sourceTree); + setCode(source); + sourceIndex = deobfuscator.getSourceIndex(sourceTree, source, ignoreBadTokens); - if (callback != null) { - callback.run(); - } + if (callback != null) { + callback.run(); } - }.start(); + }).start(); } public void navigateToClassDeclaration(ClassEntry classEntry) { // navigate to the class declaration - Token token = m_sourceIndex.getDeclarationToken(classEntry); + Token token = sourceIndex.getDeclarationToken(classEntry); if (token == null) { // couldn't find the class declaration token, might be an anonymous class // look for any declaration in that class instead - for (Entry entry : m_sourceIndex.declarations()) { + for (Entry entry : sourceIndex.declarations()) { if (entry.getClassEntry().equals(classEntry)) { - token = m_sourceIndex.getDeclarationToken(entry); + token = sourceIndex.getDeclarationToken(entry); break; } } @@ -151,7 +143,7 @@ public class CodeReader extends JEditorPane { } public void navigateToToken(final Token token) { - navigateToToken(this, token, m_selectionHighlightPainter); + navigateToToken(this, token, selectionHighlightPainter); } // HACKHACK: someday we can update the main GUI to use this code reader @@ -167,34 +159,29 @@ public class CodeReader extends JEditorPane { Rectangle end = editor.modelToView(token.end); final Rectangle show = start.union(end); show.grow(start.width * 10, start.height * 6); - SwingUtilities.invokeLater(new Runnable() { - @Override - public void run() { - editor.scrollRectToVisible(show); - } - }); + SwingUtilities.invokeLater(() -> editor.scrollRectToVisible(show)); } catch (BadLocationException ex) { throw new Error(ex); } // highlight the token momentarily final Timer timer = new Timer(200, new ActionListener() { - private int m_counter = 0; - private Object m_highlight = null; + private int counter = 0; + private Object highlight = null; @Override public void actionPerformed(ActionEvent event) { - if (m_counter % 2 == 0) { + if (counter % 2 == 0) { try { - m_highlight = editor.getHighlighter().addHighlight(token.start, token.end, highlightPainter); + highlight = editor.getHighlighter().addHighlight(token.start, token.end, highlightPainter); } catch (BadLocationException ex) { // don't care } - } else if (m_highlight != null) { - editor.getHighlighter().removeHighlight(m_highlight); + } else if (highlight != null) { + editor.getHighlighter().removeHighlight(highlight); } - if (m_counter++ > 6) { + if (counter++ > 6) { Timer timer = (Timer) event.getSource(); timer.stop(); } diff --git a/src/main/java/cuchaz/enigma/gui/Gui.java b/src/main/java/cuchaz/enigma/gui/Gui.java index ed18777..7cb494f 100644 --- a/src/main/java/cuchaz/enigma/gui/Gui.java +++ b/src/main/java/cuchaz/enigma/gui/Gui.java @@ -62,23 +62,23 @@ public class Gui { private final MenuBar menuBar; public final PopupMenuBar popupMenu; - private JFrame frame; - private PanelEditor editor; - private JPanel classesPanel; - private JSplitPane m_splitClasses; - private PanelIdentifier m_infoPanel; - private ObfuscatedHighlightPainter m_obfuscatedHighlightPainter; - private DeobfuscatedHighlightPainter m_deobfuscatedHighlightPainter; - private OtherHighlightPainter m_otherHighlightPainter; - private SelectionHighlightPainter m_selectionHighlightPainter; - private JTree m_inheritanceTree; - private JTree m_implementationsTree; - private JTree m_callsTree; - private JList m_tokens; - private JTabbedPane m_tabs; + private JFrame frame; + private PanelEditor editor; + private JPanel classesPanel; + private JSplitPane splitClasses; + private PanelIdentifier infoPanel; + private ObfuscatedHighlightPainter obfuscatedHighlightPainter; + private DeobfuscatedHighlightPainter deobfuscatedHighlightPainter; + private OtherHighlightPainter otherHighlightPainter; + private SelectionHighlightPainter selectionHighlightPainter; + private JTree inheritanceTree; + private JTree implementationsTree; + private JTree callsTree; + private JList tokens; + private JTabbedPane tabs; // state - public EntryReference m_reference; + public EntryReference reference; public JFileChooser jarFileChooser; public JFileChooser enigmaMappingsFileChooser; @@ -118,22 +118,22 @@ public class Gui { this.deobfPanel = new PanelDeobf(this); // set up classes panel (don't add the splitter yet) - m_splitClasses = new JSplitPane(JSplitPane.VERTICAL_SPLIT, true, this.obfPanel, this.deobfPanel); - m_splitClasses.setResizeWeight(0.3); + splitClasses = new JSplitPane(JSplitPane.VERTICAL_SPLIT, true, this.obfPanel, this.deobfPanel); + splitClasses.setResizeWeight(0.3); this.classesPanel = new JPanel(); this.classesPanel.setLayout(new BorderLayout()); this.classesPanel.setPreferredSize(new Dimension(250, 0)); // init info panel - m_infoPanel = new PanelIdentifier(this); - m_infoPanel.clearReference(); + infoPanel = new PanelIdentifier(this); + infoPanel.clearReference(); // init editor DefaultSyntaxKit.initKit(); - m_obfuscatedHighlightPainter = new ObfuscatedHighlightPainter(); - m_deobfuscatedHighlightPainter = new DeobfuscatedHighlightPainter(); - m_otherHighlightPainter = new OtherHighlightPainter(); - m_selectionHighlightPainter = new SelectionHighlightPainter(); + obfuscatedHighlightPainter = new ObfuscatedHighlightPainter(); + deobfuscatedHighlightPainter = new DeobfuscatedHighlightPainter(); + otherHighlightPainter = new OtherHighlightPainter(); + selectionHighlightPainter = new SelectionHighlightPainter(); this.editor = new PanelEditor(this); JScrollPane sourceScroller = new JScrollPane(this.editor); this.editor.setContentType("text/java"); @@ -145,14 +145,14 @@ public class Gui { this.editor.setComponentPopupMenu(this.popupMenu); // init inheritance panel - m_inheritanceTree = new JTree(); - m_inheritanceTree.setModel(null); - m_inheritanceTree.addMouseListener(new MouseAdapter() { + inheritanceTree = new JTree(); + inheritanceTree.setModel(null); + inheritanceTree.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent event) { if (event.getClickCount() == 2) { // get the selected node - TreePath path = m_inheritanceTree.getSelectionPath(); + TreePath path = inheritanceTree.getSelectionPath(); if (path == null) { return; } @@ -172,17 +172,17 @@ public class Gui { }); JPanel inheritancePanel = new JPanel(); inheritancePanel.setLayout(new BorderLayout()); - inheritancePanel.add(new JScrollPane(m_inheritanceTree)); + inheritancePanel.add(new JScrollPane(inheritanceTree)); // init implementations panel - m_implementationsTree = new JTree(); - m_implementationsTree.setModel(null); - m_implementationsTree.addMouseListener(new MouseAdapter() { + implementationsTree = new JTree(); + implementationsTree.setModel(null); + implementationsTree.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent event) { if (event.getClickCount() == 2) { // get the selected node - TreePath path = m_implementationsTree.getSelectionPath(); + TreePath path = implementationsTree.getSelectionPath(); if (path == null) { return; } @@ -200,18 +200,18 @@ public class Gui { }); JPanel implementationsPanel = new JPanel(); implementationsPanel.setLayout(new BorderLayout()); - implementationsPanel.add(new JScrollPane(m_implementationsTree)); + implementationsPanel.add(new JScrollPane(implementationsTree)); // init call panel - m_callsTree = new JTree(); - m_callsTree.setModel(null); - m_callsTree.addMouseListener(new MouseAdapter() { + callsTree = new JTree(); + callsTree.setModel(null); + callsTree.addMouseListener(new MouseAdapter() { @SuppressWarnings("unchecked") @Override public void mouseClicked(MouseEvent event) { if (event.getClickCount() == 2) { // get the selected node - TreePath path = m_callsTree.getSelectionPath(); + TreePath path = callsTree.getSelectionPath(); if (path == null) { return; } @@ -228,28 +228,28 @@ public class Gui { } } }); - m_tokens = new JList<>(); - m_tokens.setCellRenderer(new TokenListCellRenderer(this.controller)); - m_tokens.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); - m_tokens.setLayoutOrientation(JList.VERTICAL); - m_tokens.addMouseListener(new MouseAdapter() { + tokens = new JList<>(); + tokens.setCellRenderer(new TokenListCellRenderer(this.controller)); + tokens.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); + tokens.setLayoutOrientation(JList.VERTICAL); + tokens.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent event) { if (event.getClickCount() == 2) { - Token selected = m_tokens.getSelectedValue(); + Token selected = tokens.getSelectedValue(); if (selected != null) { showToken(selected); } } } }); - m_tokens.setPreferredSize(new Dimension(0, 200)); - m_tokens.setMinimumSize(new Dimension(0, 200)); + tokens.setPreferredSize(new Dimension(0, 200)); + tokens.setMinimumSize(new Dimension(0, 200)); JSplitPane callPanel = new JSplitPane( JSplitPane.VERTICAL_SPLIT, true, - new JScrollPane(m_callsTree), - new JScrollPane(m_tokens) + new JScrollPane(callsTree), + new JScrollPane(tokens) ); callPanel.setResizeWeight(1); // let the top side take all the slack callPanel.resetToPreferredSizes(); @@ -257,14 +257,14 @@ public class Gui { // layout controls JPanel centerPanel = new JPanel(); centerPanel.setLayout(new BorderLayout()); - centerPanel.add(m_infoPanel, BorderLayout.NORTH); + centerPanel.add(infoPanel, BorderLayout.NORTH); centerPanel.add(sourceScroller, BorderLayout.CENTER); - m_tabs = new JTabbedPane(); - m_tabs.setPreferredSize(new Dimension(250, 0)); - m_tabs.addTab("Inheritance", inheritancePanel); - m_tabs.addTab("Implementations", implementationsPanel); - m_tabs.addTab("Call Graph", callPanel); - JSplitPane splitRight = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, true, centerPanel, m_tabs); + tabs = new JTabbedPane(); + tabs.setPreferredSize(new Dimension(250, 0)); + tabs.addTab("Inheritance", inheritancePanel); + tabs.addTab("Implementations", implementationsPanel); + tabs.addTab("Call Graph", callPanel); + JSplitPane splitRight = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, true, centerPanel, tabs); splitRight.setResizeWeight(1); // let the left side take all the slack splitRight.resetToPreferredSizes(); JSplitPane splitCenter = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, true, this.classesPanel, splitRight); @@ -314,7 +314,7 @@ public class Gui { // update gui this.frame.setTitle(Constants.NAME + " - " + jarName); this.classesPanel.removeAll(); - this.classesPanel.add(m_splitClasses); + this.classesPanel.add(splitClasses); setSource(null); // update menu @@ -375,7 +375,7 @@ public class Gui { if (token == null) { throw new IllegalArgumentException("Token cannot be null!"); } - CodeReader.navigateToToken(this.editor, token, m_selectionHighlightPainter); + CodeReader.navigateToToken(this.editor, token, selectionHighlightPainter); redraw(); } @@ -384,10 +384,10 @@ public class Gui { Collections.sort(sortedTokens); if (sortedTokens.size() > 1) { // sort the tokens and update the tokens panel - m_tokens.setListData(sortedTokens); - m_tokens.setSelectedIndex(0); + this.tokens.setListData(sortedTokens); + this.tokens.setSelectedIndex(0); } else { - m_tokens.setListData(new Vector<>()); + this.tokens.setListData(new Vector<>()); } // show the first token @@ -401,13 +401,13 @@ public class Gui { // color things based on the index if (obfuscatedTokens != null) { - setHighlightedTokens(obfuscatedTokens, m_obfuscatedHighlightPainter); + setHighlightedTokens(obfuscatedTokens, obfuscatedHighlightPainter); } if (deobfuscatedTokens != null) { - setHighlightedTokens(deobfuscatedTokens, m_deobfuscatedHighlightPainter); + setHighlightedTokens(deobfuscatedTokens, deobfuscatedHighlightPainter); } if (otherTokens != null) { - setHighlightedTokens(otherTokens, m_otherHighlightPainter); + setHighlightedTokens(otherTokens, otherHighlightPainter); } redraw(); @@ -425,73 +425,73 @@ public class Gui { private void showReference(EntryReference reference) { if (reference == null) { - m_infoPanel.clearReference(); + infoPanel.clearReference(); return; } - m_reference = reference; + this.reference = reference; - m_infoPanel.removeAll(); + infoPanel.removeAll(); if (reference.entry instanceof ClassEntry) { - showClassEntry((ClassEntry) m_reference.entry); - } else if (m_reference.entry instanceof FieldEntry) { - showFieldEntry((FieldEntry) m_reference.entry); - } else if (m_reference.entry instanceof MethodEntry) { - showMethodEntry((MethodEntry) m_reference.entry); - } else if (m_reference.entry instanceof ConstructorEntry) { - showConstructorEntry((ConstructorEntry) m_reference.entry); - } else if (m_reference.entry instanceof ArgumentEntry) { - showArgumentEntry((ArgumentEntry) m_reference.entry); - } else if (m_reference.entry instanceof LocalVariableEntry) { - showLocalVariableEntry((LocalVariableEntry) m_reference.entry); + showClassEntry((ClassEntry) this.reference.entry); + } else if (this.reference.entry instanceof FieldEntry) { + showFieldEntry((FieldEntry) this.reference.entry); + } else if (this.reference.entry instanceof MethodEntry) { + showMethodEntry((MethodEntry) this.reference.entry); + } else if (this.reference.entry instanceof ConstructorEntry) { + showConstructorEntry((ConstructorEntry) this.reference.entry); + } else if (this.reference.entry instanceof ArgumentEntry) { + showArgumentEntry((ArgumentEntry) this.reference.entry); + } else if (this.reference.entry instanceof LocalVariableEntry) { + showLocalVariableEntry((LocalVariableEntry) this.reference.entry); } else { - throw new Error("Unknown entry type: " + m_reference.entry.getClass().getName()); + throw new Error("Unknown entry type: " + this.reference.entry.getClass().getName()); } redraw(); } private void showLocalVariableEntry(LocalVariableEntry entry) { - addNameValue(m_infoPanel, "Variable", entry.getName()); - addNameValue(m_infoPanel, "Class", entry.getClassEntry().getName()); - addNameValue(m_infoPanel, "Method", entry.getBehaviorEntry().getName()); - addNameValue(m_infoPanel, "Index", Integer.toString(entry.getIndex())); - addNameValue(m_infoPanel, "Type", entry.getType().toString()); + addNameValue(infoPanel, "Variable", entry.getName()); + addNameValue(infoPanel, "Class", entry.getClassEntry().getName()); + addNameValue(infoPanel, "Method", entry.getBehaviorEntry().getName()); + addNameValue(infoPanel, "Index", Integer.toString(entry.getIndex())); + addNameValue(infoPanel, "Type", entry.getType().toString()); } private void showClassEntry(ClassEntry entry) { - addNameValue(m_infoPanel, "Class", entry.getName()); - addModifierComboBox(m_infoPanel, "Modifier", entry); + addNameValue(infoPanel, "Class", entry.getName()); + addModifierComboBox(infoPanel, "Modifier", entry); } private void showFieldEntry(FieldEntry entry) { - addNameValue(m_infoPanel, "Field", entry.getName()); - addNameValue(m_infoPanel, "Class", entry.getClassEntry().getName()); - addNameValue(m_infoPanel, "Type", entry.getType().toString()); - addModifierComboBox(m_infoPanel, "Modifier", entry); + addNameValue(infoPanel, "Field", entry.getName()); + addNameValue(infoPanel, "Class", entry.getClassEntry().getName()); + addNameValue(infoPanel, "Type", entry.getType().toString()); + addModifierComboBox(infoPanel, "Modifier", entry); } private void showMethodEntry(MethodEntry entry) { - addNameValue(m_infoPanel, "Method", entry.getName()); - addNameValue(m_infoPanel, "Class", entry.getClassEntry().getName()); - addNameValue(m_infoPanel, "Signature", entry.getSignature().toString()); - addModifierComboBox(m_infoPanel, "Modifier", entry); + addNameValue(infoPanel, "Method", entry.getName()); + addNameValue(infoPanel, "Class", entry.getClassEntry().getName()); + addNameValue(infoPanel, "Signature", entry.getSignature().toString()); + addModifierComboBox(infoPanel, "Modifier", entry); } private void showConstructorEntry(ConstructorEntry entry) { - addNameValue(m_infoPanel, "Constructor", entry.getClassEntry().getName()); + addNameValue(infoPanel, "Constructor", entry.getClassEntry().getName()); if (!entry.isStatic()) { - addNameValue(m_infoPanel, "Signature", entry.getSignature().toString()); - addModifierComboBox(m_infoPanel, "Modifier", entry); + addNameValue(infoPanel, "Signature", entry.getSignature().toString()); + addModifierComboBox(infoPanel, "Modifier", entry); } } private void showArgumentEntry(ArgumentEntry entry) { - addNameValue(m_infoPanel, "Argument", entry.getName()); - addNameValue(m_infoPanel, "Class", entry.getClassEntry().getName()); - addNameValue(m_infoPanel, "Method", entry.getBehaviorEntry().getName()); - addNameValue(m_infoPanel, "Index", Integer.toString(entry.getIndex())); + addNameValue(infoPanel, "Argument", entry.getName()); + addNameValue(infoPanel, "Class", entry.getClassEntry().getName()); + addNameValue(infoPanel, "Method", entry.getBehaviorEntry().getName()); + addNameValue(infoPanel, "Index", Integer.toString(entry.getIndex())); } private void addNameValue(JPanel container, String name, String value) { @@ -530,18 +530,18 @@ public class Gui { Token token = this.controller.getToken(pos); boolean isToken = token != null; - m_reference = this.controller.getDeobfReference(token); - boolean isClassEntry = isToken && m_reference.entry instanceof ClassEntry; - boolean isFieldEntry = isToken && m_reference.entry instanceof FieldEntry; - boolean isMethodEntry = isToken && m_reference.entry instanceof MethodEntry; - boolean isConstructorEntry = isToken && m_reference.entry instanceof ConstructorEntry; - boolean isInJar = isToken && this.controller.entryIsInJar(m_reference.entry); - boolean isRenameable = isToken && this.controller.referenceIsRenameable(m_reference); + reference = this.controller.getDeobfReference(token); + boolean isClassEntry = isToken && reference.entry instanceof ClassEntry; + boolean isFieldEntry = isToken && reference.entry instanceof FieldEntry; + boolean isMethodEntry = isToken && reference.entry instanceof MethodEntry; + boolean isConstructorEntry = isToken && reference.entry instanceof ConstructorEntry; + boolean isInJar = isToken && this.controller.entryIsInJar(reference.entry); + boolean isRenameable = isToken && this.controller.referenceIsRenameable(reference); if (isToken) { - showReference(m_reference); + showReference(reference); } else { - m_infoPanel.clearReference(); + infoPanel.clearReference(); } this.popupMenu.renameMenu.setEnabled(isRenameable); @@ -552,7 +552,7 @@ public class Gui { this.popupMenu.openPreviousMenu.setEnabled(this.controller.hasPreviousLocation()); this.popupMenu.toggleMappingMenu.setEnabled(isRenameable); - if (isToken && this.controller.entryHasDeobfuscatedName(m_reference.entry)) { + if (isToken && this.controller.entryHasDeobfuscatedName(reference.entry)) { this.popupMenu.toggleMappingMenu.setText("Reset to obfuscated"); } else { this.popupMenu.toggleMappingMenu.setText("Mark as deobfuscated"); @@ -564,8 +564,8 @@ public class Gui { // entry is not in the jar. Ignore it return; } - if (m_reference != null) { - this.controller.savePreviousReference(m_reference); + if (reference != null) { + this.controller.savePreviousReference(reference); } this.controller.openDeclaration(entry); } @@ -574,8 +574,8 @@ public class Gui { if (!this.controller.entryIsInJar(reference.getLocationClassEntry())) { return; } - if (m_reference != null) { - this.controller.savePreviousReference(m_reference); + if (this.reference != null) { + this.controller.savePreviousReference(this.reference); } this.controller.openReference(reference); } @@ -584,7 +584,7 @@ public class Gui { // init the text box final JTextField text = new JTextField(); - text.setText(m_reference.getNamableName()); + text.setText(reference.getNamableName()); text.setPreferredSize(new Dimension(360, text.getPreferredSize().height)); text.addKeyListener(new KeyAdapter() { @Override @@ -604,14 +604,14 @@ public class Gui { }); // find the label with the name and replace it with the text box - JPanel panel = (JPanel) m_infoPanel.getComponent(0); + JPanel panel = (JPanel) infoPanel.getComponent(0); panel.remove(panel.getComponentCount() - 1); panel.add(text); text.grabFocus(); int offset = text.getText().lastIndexOf('/') + 1; // If it's a class and isn't in the default package, assume that it's deobfuscated. - if (m_reference.getNameableEntry() instanceof ClassEntry && text.getText().contains("/") && offset != 0) + if (reference.getNameableEntry() instanceof ClassEntry && text.getText().contains("/") && offset != 0) text.select(offset, text.getText().length()); else text.selectAll(); @@ -623,7 +623,7 @@ public class Gui { String newName = text.getText(); if (saveName && newName != null && newName.length() > 0) { try { - this.controller.rename(m_reference, newName); + this.controller.rename(reference, newName); } catch (IllegalNameException ex) { text.setBorder(BorderFactory.createLineBorder(Color.red, 1)); text.setToolTipText(ex.getReason()); @@ -633,9 +633,9 @@ public class Gui { } // abort the rename - JPanel panel = (JPanel) m_infoPanel.getComponent(0); + JPanel panel = (JPanel) infoPanel.getComponent(0); panel.remove(panel.getComponentCount() - 1); - panel.add(Utils.unboldLabel(new JLabel(m_reference.getNamableName(), JLabel.LEFT))); + panel.add(Utils.unboldLabel(new JLabel(reference.getNamableName(), JLabel.LEFT))); this.editor.grabFocus(); @@ -644,95 +644,95 @@ public class Gui { public void showInheritance() { - if (m_reference == null) { + if (reference == null) { return; } - m_inheritanceTree.setModel(null); + inheritanceTree.setModel(null); - if (m_reference.entry instanceof ClassEntry) { + if (reference.entry instanceof ClassEntry) { // get the class inheritance - ClassInheritanceTreeNode classNode = this.controller.getClassInheritance((ClassEntry) m_reference.entry); + ClassInheritanceTreeNode classNode = this.controller.getClassInheritance((ClassEntry) reference.entry); // show the tree at the root TreePath path = getPathToRoot(classNode); - m_inheritanceTree.setModel(new DefaultTreeModel((TreeNode) path.getPathComponent(0))); - m_inheritanceTree.expandPath(path); - m_inheritanceTree.setSelectionRow(m_inheritanceTree.getRowForPath(path)); - } else if (m_reference.entry instanceof MethodEntry) { + inheritanceTree.setModel(new DefaultTreeModel((TreeNode) path.getPathComponent(0))); + inheritanceTree.expandPath(path); + inheritanceTree.setSelectionRow(inheritanceTree.getRowForPath(path)); + } else if (reference.entry instanceof MethodEntry) { // get the method inheritance - MethodInheritanceTreeNode classNode = this.controller.getMethodInheritance((MethodEntry) m_reference.entry); + MethodInheritanceTreeNode classNode = this.controller.getMethodInheritance((MethodEntry) reference.entry); // show the tree at the root TreePath path = getPathToRoot(classNode); - m_inheritanceTree.setModel(new DefaultTreeModel((TreeNode) path.getPathComponent(0))); - m_inheritanceTree.expandPath(path); - m_inheritanceTree.setSelectionRow(m_inheritanceTree.getRowForPath(path)); + inheritanceTree.setModel(new DefaultTreeModel((TreeNode) path.getPathComponent(0))); + inheritanceTree.expandPath(path); + inheritanceTree.setSelectionRow(inheritanceTree.getRowForPath(path)); } - m_tabs.setSelectedIndex(0); + tabs.setSelectedIndex(0); redraw(); } public void showImplementations() { - if (m_reference == null) { + if (reference == null) { return; } - m_implementationsTree.setModel(null); + implementationsTree.setModel(null); DefaultMutableTreeNode node = null; // get the class implementations - if (m_reference.entry instanceof ClassEntry) - node = this.controller.getClassImplementations((ClassEntry) m_reference.entry); + if (reference.entry instanceof ClassEntry) + node = this.controller.getClassImplementations((ClassEntry) reference.entry); else // get the method implementations - if (m_reference.entry instanceof MethodEntry) - node = this.controller.getMethodImplementations((MethodEntry) m_reference.entry); + if (reference.entry instanceof MethodEntry) + node = this.controller.getMethodImplementations((MethodEntry) reference.entry); if (node != null) { // show the tree at the root TreePath path = getPathToRoot(node); - m_implementationsTree.setModel(new DefaultTreeModel((TreeNode) path.getPathComponent(0))); - m_implementationsTree.expandPath(path); - m_implementationsTree.setSelectionRow(m_implementationsTree.getRowForPath(path)); + implementationsTree.setModel(new DefaultTreeModel((TreeNode) path.getPathComponent(0))); + implementationsTree.expandPath(path); + implementationsTree.setSelectionRow(implementationsTree.getRowForPath(path)); } - m_tabs.setSelectedIndex(1); + tabs.setSelectedIndex(1); redraw(); } public void showCalls() { - if (m_reference == null) { + if (reference == null) { return; } - if (m_reference.entry instanceof ClassEntry) { + if (reference.entry instanceof ClassEntry) { // look for calls to the default constructor // TODO: get a list of all the constructors and find calls to all of them - BehaviorReferenceTreeNode node = this.controller.getMethodReferences(new ConstructorEntry((ClassEntry) m_reference.entry, new Signature("()V"))); - m_callsTree.setModel(new DefaultTreeModel(node)); - } else if (m_reference.entry instanceof FieldEntry) { - FieldReferenceTreeNode node = this.controller.getFieldReferences((FieldEntry) m_reference.entry); - m_callsTree.setModel(new DefaultTreeModel(node)); - } else if (m_reference.entry instanceof MethodEntry) { - BehaviorReferenceTreeNode node = this.controller.getMethodReferences((MethodEntry) m_reference.entry); - m_callsTree.setModel(new DefaultTreeModel(node)); - } else if (m_reference.entry instanceof ConstructorEntry) { - BehaviorReferenceTreeNode node = this.controller.getMethodReferences((ConstructorEntry) m_reference.entry); - m_callsTree.setModel(new DefaultTreeModel(node)); + BehaviorReferenceTreeNode node = this.controller.getMethodReferences(new ConstructorEntry((ClassEntry) reference.entry, new Signature("()V"))); + callsTree.setModel(new DefaultTreeModel(node)); + } else if (reference.entry instanceof FieldEntry) { + FieldReferenceTreeNode node = this.controller.getFieldReferences((FieldEntry) reference.entry); + callsTree.setModel(new DefaultTreeModel(node)); + } else if (reference.entry instanceof MethodEntry) { + BehaviorReferenceTreeNode node = this.controller.getMethodReferences((MethodEntry) reference.entry); + callsTree.setModel(new DefaultTreeModel(node)); + } else if (reference.entry instanceof ConstructorEntry) { + BehaviorReferenceTreeNode node = this.controller.getMethodReferences((ConstructorEntry) reference.entry); + callsTree.setModel(new DefaultTreeModel(node)); } - m_tabs.setSelectedIndex(2); + tabs.setSelectedIndex(2); redraw(); } public void toggleMapping() { - if (this.controller.entryHasDeobfuscatedName(m_reference.entry)) { - this.controller.removeMapping(m_reference); + if (this.controller.entryHasDeobfuscatedName(reference.entry)) { + this.controller.removeMapping(reference); } else { - this.controller.markAsDeobfuscated(m_reference); + this.controller.markAsDeobfuscated(reference); } } diff --git a/src/main/java/cuchaz/enigma/gui/GuiController.java b/src/main/java/cuchaz/enigma/gui/GuiController.java index c2e202e..68fd484 100644 --- a/src/main/java/cuchaz/enigma/gui/GuiController.java +++ b/src/main/java/cuchaz/enigma/gui/GuiController.java @@ -50,7 +50,7 @@ public class GuiController { return this.isDirty; } - public void openJar(final JarFile jar) throws IOException { + public void openJar(final JarFile jar) { this.gui.onStartOpenJar(); this.deobfuscator = new Deobfuscator(jar); this.gui.onFinishOpenJar(this.deobfuscator.getJarName()); @@ -302,42 +302,40 @@ public class GuiController { this.gui.setSource("(deobfuscating...)"); // run the deobfuscator in a separate thread so we don't block the GUI event queue - new Thread() { - @Override - public void run() { - // decompile,deobfuscate the bytecode - CompilationUnit sourceTree = deobfuscator.getSourceTree(classEntry.getClassName()); - if (sourceTree == null) { - // decompilation of this class is not supported - gui.setSource("Unable to find class: " + classEntry); - return; - } - String source = deobfuscator.getSource(sourceTree); - index = deobfuscator.getSourceIndex(sourceTree, source); - gui.setSource(index.getSource()); - if (obfReference != null) { - showReference(obfReference); - } + new Thread(() -> + { + // decompile,deobfuscate the bytecode + CompilationUnit sourceTree = deobfuscator.getSourceTree(classEntry.getClassName()); + if (sourceTree == null) { + // decompilation of this class is not supported + gui.setSource("Unable to find class: " + classEntry); + return; + } + String source = deobfuscator.getSource(sourceTree); + index = deobfuscator.getSourceIndex(sourceTree, source); + gui.setSource(index.getSource()); + if (obfReference != null) { + showReference(obfReference); + } - // set the highlighted tokens - List obfuscatedTokens = Lists.newArrayList(); - List deobfuscatedTokens = Lists.newArrayList(); - List otherTokens = Lists.newArrayList(); - for (Token token : index.referenceTokens()) { - EntryReference reference = index.getDeobfReference(token); - if (referenceIsRenameable(reference)) { - if (entryHasDeobfuscatedName(reference.getNameableEntry())) { - deobfuscatedTokens.add(token); - } else { - obfuscatedTokens.add(token); - } + // set the highlighted tokens + List obfuscatedTokens = Lists.newArrayList(); + List deobfuscatedTokens = Lists.newArrayList(); + List otherTokens = Lists.newArrayList(); + for (Token token : index.referenceTokens()) { + EntryReference reference = index.getDeobfReference(token); + if (referenceIsRenameable(reference)) { + if (entryHasDeobfuscatedName(reference.getNameableEntry())) { + deobfuscatedTokens.add(token); } else { - otherTokens.add(token); + obfuscatedTokens.add(token); } + } else { + otherTokens.add(token); } - gui.setHighlightedTokens(obfuscatedTokens, deobfuscatedTokens, otherTokens); } - }.start(); + gui.setHighlightedTokens(obfuscatedTokens, deobfuscatedTokens, otherTokens); + }).start(); } public Deobfuscator getDeobfuscator() @@ -349,7 +347,7 @@ public class GuiController { { if (event.getStateChange() == ItemEvent.SELECTED) { - deobfuscator.changeModifier(gui.m_reference.entry, (Mappings.EntryModifier) event.getItem()); + deobfuscator.changeModifier(gui.reference.entry, (Mappings.EntryModifier) event.getItem()); this.isDirty = true; refreshCurrentClass(); } diff --git a/src/main/java/cuchaz/enigma/gui/MemberMatchingGui.java b/src/main/java/cuchaz/enigma/gui/MemberMatchingGui.java index ecc280d..671f85f 100644 --- a/src/main/java/cuchaz/enigma/gui/MemberMatchingGui.java +++ b/src/main/java/cuchaz/enigma/gui/MemberMatchingGui.java @@ -17,7 +17,6 @@ import java.awt.BorderLayout; import java.awt.Container; import java.awt.Dimension; import java.awt.FlowLayout; -import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; @@ -30,7 +29,6 @@ import javax.swing.text.Highlighter.HighlightPainter; import cuchaz.enigma.Constants; import cuchaz.enigma.Deobfuscator; -import cuchaz.enigma.analysis.EntryReference; import cuchaz.enigma.analysis.SourceIndex; import cuchaz.enigma.analysis.Token; import cuchaz.enigma.convert.ClassMatches; @@ -78,39 +76,38 @@ public class MemberMatchingGui { } // controls - private JFrame m_frame; - private Map m_sourceTypeButtons; - private ClassSelector m_sourceClasses; - private CodeReader m_sourceReader; - private CodeReader m_destReader; - private JButton m_matchButton; - private JButton m_unmatchableButton; - private JLabel m_sourceLabel; - private JLabel m_destLabel; - private HighlightPainter m_unmatchedHighlightPainter; - private HighlightPainter m_matchedHighlightPainter; - - private ClassMatches m_classMatches; - private MemberMatches m_memberMatches; - private Deobfuscator m_sourceDeobfuscator; - private Deobfuscator m_destDeobfuscator; - private SaveListener m_saveListener; - private SourceType m_sourceType; - private ClassEntry m_obfSourceClass; - private ClassEntry m_obfDestClass; - private T m_obfSourceEntry; - private T m_obfDestEntry; + private JFrame frame; + private Map sourceTypeButtons; + private ClassSelector sourceClasses; + private CodeReader sourceReader; + private CodeReader destReader; + private JButton matchButton; + private JButton unmatchableButton; + private JLabel sourceLabel; + private JLabel destLabel; + private HighlightPainter unmatchedHighlightPainter; + private HighlightPainter matchedHighlightPainter; + private ClassMatches classMatches; + private MemberMatches memberMatches; + private Deobfuscator sourceDeobfuscator; + private Deobfuscator destDeobfuscator; + private SaveListener saveListener; + private SourceType sourceType; + private ClassEntry obfSourceClass; + private ClassEntry obfDestClass; + private T obfSourceEntry; + private T obfDestEntry; public MemberMatchingGui(ClassMatches classMatches, MemberMatches fieldMatches, Deobfuscator sourceDeobfuscator, Deobfuscator destDeobfuscator) { - m_classMatches = classMatches; - m_memberMatches = fieldMatches; - m_sourceDeobfuscator = sourceDeobfuscator; - m_destDeobfuscator = destDeobfuscator; + this.classMatches = classMatches; + memberMatches = fieldMatches; + this.sourceDeobfuscator = sourceDeobfuscator; + this.destDeobfuscator = destDeobfuscator; // init frame - m_frame = new JFrame(Constants.NAME + " - Member Matcher"); - final Container pane = m_frame.getContentPane(); + frame = new JFrame(Constants.NAME + " - Member Matcher"); + final Container pane = frame.getContentPane(); pane.setLayout(new BorderLayout()); // init classes side @@ -124,47 +121,38 @@ public class MemberMatchingGui { JPanel sourceTypePanel = new JPanel(); classesPanel.add(sourceTypePanel); sourceTypePanel.setLayout(new BoxLayout(sourceTypePanel, BoxLayout.PAGE_AXIS)); - ActionListener sourceTypeListener = new ActionListener() { - @Override - public void actionPerformed(ActionEvent event) { - setSourceType(SourceType.valueOf(event.getActionCommand())); - } - }; + ActionListener sourceTypeListener = event -> setSourceType(SourceType.valueOf(event.getActionCommand())); ButtonGroup sourceTypeButtons = new ButtonGroup(); - m_sourceTypeButtons = Maps.newHashMap(); + this.sourceTypeButtons = Maps.newHashMap(); for (SourceType sourceType : SourceType.values()) { JRadioButton button = sourceType.newRadio(sourceTypeListener, sourceTypeButtons); - m_sourceTypeButtons.put(sourceType, button); + this.sourceTypeButtons.put(sourceType, button); sourceTypePanel.add(button); } - m_sourceClasses = new ClassSelector(null, ClassSelector.DEOBF_CLASS_COMPARATOR, false); - m_sourceClasses.setSelectionListener(this::setSourceClass); - JScrollPane sourceScroller = new JScrollPane(m_sourceClasses); + sourceClasses = new ClassSelector(null, ClassSelector.DEOBF_CLASS_COMPARATOR, false); + sourceClasses.setSelectionListener(this::setSourceClass); + JScrollPane sourceScroller = new JScrollPane(sourceClasses); classesPanel.add(sourceScroller); // init readers DefaultSyntaxKit.initKit(); - m_sourceReader = new CodeReader(); - m_sourceReader.setSelectionListener(new CodeReader.SelectionListener() { - @Override - public void onSelect(EntryReference reference) { - if (reference != null) { - onSelectSource(reference.entry); - } else { - onSelectSource(null); - } + sourceReader = new CodeReader(); + sourceReader.setSelectionListener(reference -> + { + if (reference != null) { + onSelectSource(reference.entry); + } else { + onSelectSource(null); } }); - m_destReader = new CodeReader(); - m_destReader.setSelectionListener(new CodeReader.SelectionListener() { - @Override - public void onSelect(EntryReference reference) { - if (reference != null) { - onSelectDest(reference.entry); - } else { - onSelectDest(null); - } + destReader = new CodeReader(); + destReader.setSelectionListener(reference -> + { + if (reference != null) { + onSelectDest(reference.entry); + } else { + onSelectDest(null); } }); @@ -173,14 +161,15 @@ public class MemberMatchingGui { @Override public void keyPressed(KeyEvent event) { if (event.getKeyCode() == KeyEvent.VK_M) - m_matchButton.doClick(); + matchButton.doClick(); } }; - m_sourceReader.addKeyListener(keyListener); - m_destReader.addKeyListener(keyListener); + sourceReader.addKeyListener(keyListener); + destReader.addKeyListener(keyListener); // init all the splits - JSplitPane splitRight = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, true, new JScrollPane(m_sourceReader), new JScrollPane(m_destReader)); + JSplitPane splitRight = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, true, new JScrollPane(sourceReader), new JScrollPane( + destReader)); splitRight.setResizeWeight(0.5); // resize 50:50 JSplitPane splitLeft = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, true, classesPanel, splitRight); splitLeft.setResizeWeight(0); // let the right side take all the slack @@ -192,102 +181,92 @@ public class MemberMatchingGui { bottomPanel.setLayout(new FlowLayout()); pane.add(bottomPanel, BorderLayout.SOUTH); - m_matchButton = new JButton(); - m_unmatchableButton = new JButton(); + matchButton = new JButton(); + unmatchableButton = new JButton(); - m_sourceLabel = new JLabel(); - bottomPanel.add(m_sourceLabel); - bottomPanel.add(m_matchButton); - bottomPanel.add(m_unmatchableButton); - m_destLabel = new JLabel(); - bottomPanel.add(m_destLabel); + sourceLabel = new JLabel(); + bottomPanel.add(sourceLabel); + bottomPanel.add(matchButton); + bottomPanel.add(unmatchableButton); + destLabel = new JLabel(); + bottomPanel.add(destLabel); // show the frame pane.doLayout(); - m_frame.setSize(1024, 576); - m_frame.setMinimumSize(new Dimension(640, 480)); - m_frame.setVisible(true); - m_frame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); + frame.setSize(1024, 576); + frame.setMinimumSize(new Dimension(640, 480)); + frame.setVisible(true); + frame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); - m_unmatchedHighlightPainter = new ObfuscatedHighlightPainter(); - m_matchedHighlightPainter = new DeobfuscatedHighlightPainter(); + unmatchedHighlightPainter = new ObfuscatedHighlightPainter(); + matchedHighlightPainter = new DeobfuscatedHighlightPainter(); // init state - m_saveListener = null; - m_obfSourceClass = null; - m_obfDestClass = null; - m_obfSourceEntry = null; - m_obfDestEntry = null; + saveListener = null; + obfSourceClass = null; + obfDestClass = null; + obfSourceEntry = null; + obfDestEntry = null; setSourceType(SourceType.getDefault()); updateButtons(); } protected void setSourceType(SourceType val) { - m_sourceType = val; + sourceType = val; updateSourceClasses(); } public void setSaveListener(SaveListener val) { - m_saveListener = val; + saveListener = val; } private void updateSourceClasses() { - String selectedPackage = m_sourceClasses.getSelectedPackage(); + String selectedPackage = sourceClasses.getSelectedPackage(); List deobfClassEntries = Lists.newArrayList(); - for (ClassEntry entry : m_sourceType.getObfSourceClasses(m_memberMatches)) { - deobfClassEntries.add(m_sourceDeobfuscator.deobfuscateEntry(entry)); + for (ClassEntry entry : sourceType.getObfSourceClasses(memberMatches)) { + deobfClassEntries.add(sourceDeobfuscator.deobfuscateEntry(entry)); } - m_sourceClasses.setClasses(deobfClassEntries); + sourceClasses.setClasses(deobfClassEntries); if (selectedPackage != null) { - m_sourceClasses.expandPackage(selectedPackage); + sourceClasses.expandPackage(selectedPackage); } for (SourceType sourceType : SourceType.values()) { - m_sourceTypeButtons.get(sourceType).setText(String.format("%s (%d)", - sourceType.name(), sourceType.getObfSourceClasses(m_memberMatches).size() + sourceTypeButtons.get(sourceType).setText(String.format("%s (%d)", + sourceType.name(), sourceType.getObfSourceClasses(memberMatches).size() )); } } protected void setSourceClass(ClassEntry sourceClass) { - m_obfSourceClass = m_sourceDeobfuscator.obfuscateEntry(sourceClass); - m_obfDestClass = m_classMatches.getUniqueMatches().get(m_obfSourceClass); - if (m_obfDestClass == null) { - throw new Error("No matching dest class for source class: " + m_obfSourceClass); + obfSourceClass = sourceDeobfuscator.obfuscateEntry(sourceClass); + obfDestClass = classMatches.getUniqueMatches().get(obfSourceClass); + if (obfDestClass == null) { + throw new Error("No matching dest class for source class: " + obfSourceClass); } - m_sourceReader.decompileClass(m_obfSourceClass, m_sourceDeobfuscator, false, new Runnable() { - @Override - public void run() { - updateSourceHighlights(); - } - }); - m_destReader.decompileClass(m_obfDestClass, m_destDeobfuscator, false, new Runnable() { - @Override - public void run() { - updateDestHighlights(); - } - }); + sourceReader.decompileClass(obfSourceClass, sourceDeobfuscator, false, this::updateSourceHighlights); + destReader.decompileClass(obfDestClass, destDeobfuscator, false, this::updateDestHighlights); } protected void updateSourceHighlights() { - highlightEntries(m_sourceReader, m_sourceDeobfuscator, m_memberMatches.matches().keySet(), m_memberMatches.getUnmatchedSourceEntries()); + highlightEntries(sourceReader, sourceDeobfuscator, memberMatches.matches().keySet(), memberMatches.getUnmatchedSourceEntries()); } protected void updateDestHighlights() { - highlightEntries(m_destReader, m_destDeobfuscator, m_memberMatches.matches().values(), m_memberMatches.getUnmatchedDestEntries()); + highlightEntries(destReader, destDeobfuscator, memberMatches.matches().values(), memberMatches.getUnmatchedDestEntries()); } private void highlightEntries(CodeReader reader, Deobfuscator deobfuscator, Collection obfMatchedEntries, Collection obfUnmatchedEntries) { reader.clearHighlights(); // matched fields - updateHighlighted(obfMatchedEntries, deobfuscator, reader, m_matchedHighlightPainter); + updateHighlighted(obfMatchedEntries, deobfuscator, reader, matchedHighlightPainter); // unmatched fields - updateHighlighted(obfUnmatchedEntries, deobfuscator, reader, m_unmatchedHighlightPainter); + updateHighlighted(obfUnmatchedEntries, deobfuscator, reader, unmatchedHighlightPainter); } private void updateHighlighted(Collection entries, Deobfuscator deobfuscator, CodeReader reader, HighlightPainter painter) @@ -303,8 +282,8 @@ public class MemberMatchingGui { } private boolean isSelectionMatched() { - return m_obfSourceEntry != null && m_obfDestEntry != null - && m_memberMatches.isMatched(m_obfSourceEntry, m_obfDestEntry); + return obfSourceEntry != null && obfDestEntry != null + && memberMatches.isMatched(obfSourceEntry, obfDestEntry); } protected void onSelectSource(Entry source) { @@ -324,12 +303,12 @@ public class MemberMatchingGui { @SuppressWarnings("unchecked") T sourceEntry = (T) source; - T obfSourceEntry = m_sourceDeobfuscator.obfuscateEntry(sourceEntry); - if (m_memberMatches.hasSource(obfSourceEntry)) { + T obfSourceEntry = sourceDeobfuscator.obfuscateEntry(sourceEntry); + if (memberMatches.hasSource(obfSourceEntry)) { setSource(obfSourceEntry); // look for a matched dest too - T obfDestEntry = m_memberMatches.matches().get(obfSourceEntry); + T obfDestEntry = memberMatches.matches().get(obfSourceEntry); if (obfDestEntry != null) { setDest(obfDestEntry); } @@ -356,12 +335,12 @@ public class MemberMatchingGui { @SuppressWarnings("unchecked") T destEntry = (T) dest; - T obfDestEntry = m_destDeobfuscator.obfuscateEntry(destEntry); - if (m_memberMatches.hasDest(obfDestEntry)) { + T obfDestEntry = destDeobfuscator.obfuscateEntry(destEntry); + if (memberMatches.hasDest(obfDestEntry)) { setDest(obfDestEntry); // look for a matched source too - T obfSourceEntry = m_memberMatches.matches().inverse().get(obfDestEntry); + T obfSourceEntry = memberMatches.matches().inverse().get(obfDestEntry); if (obfSourceEntry != null) { setSource(obfSourceEntry); } @@ -373,21 +352,21 @@ public class MemberMatchingGui { private void setSource(T obfEntry) { if (obfEntry == null) { - m_obfSourceEntry = null; - m_sourceLabel.setText(""); + obfSourceEntry = null; + sourceLabel.setText(""); } else { - m_obfSourceEntry = obfEntry; - m_sourceLabel.setText(getEntryLabel(obfEntry, m_sourceDeobfuscator)); + obfSourceEntry = obfEntry; + sourceLabel.setText(getEntryLabel(obfEntry, sourceDeobfuscator)); } } private void setDest(T obfEntry) { if (obfEntry == null) { - m_obfDestEntry = null; - m_destLabel.setText(""); + obfDestEntry = null; + destLabel.setText(""); } else { - m_obfDestEntry = obfEntry; - m_destLabel.setText(getEntryLabel(obfEntry, m_destDeobfuscator)); + obfDestEntry = obfEntry; + destLabel.setText(getEntryLabel(obfEntry, destDeobfuscator)); } } @@ -399,39 +378,23 @@ public class MemberMatchingGui { private void updateButtons() { - GuiTricks.deactivateButton(m_matchButton); - GuiTricks.deactivateButton(m_unmatchableButton); - - if (m_obfSourceEntry != null && m_obfDestEntry != null) { - if (m_memberMatches.isMatched(m_obfSourceEntry, m_obfDestEntry)) { - GuiTricks.activateButton(m_matchButton, "Unmatch", new ActionListener() { - @Override - public void actionPerformed(ActionEvent event) { - unmatch(); - } - }); - } else if (!m_memberMatches.isMatchedSourceEntry(m_obfSourceEntry) && !m_memberMatches.isMatchedDestEntry(m_obfDestEntry)) { - GuiTricks.activateButton(m_matchButton, "Match", new ActionListener() { - @Override - public void actionPerformed(ActionEvent event) { - match(); - } - }); - } - } else if (m_obfSourceEntry != null) { - GuiTricks.activateButton(m_unmatchableButton, "Set Unmatchable", new ActionListener() { - @Override - public void actionPerformed(ActionEvent event) { - unmatchable(); - } - }); - } + GuiTricks.deactivateButton(matchButton); + GuiTricks.deactivateButton(unmatchableButton); + + if (obfSourceEntry != null && obfDestEntry != null) { + if (memberMatches.isMatched(obfSourceEntry, obfDestEntry)) + GuiTricks.activateButton(matchButton, "Unmatch", event -> unmatch()); + else if (!memberMatches.isMatchedSourceEntry(obfSourceEntry) && !memberMatches.isMatchedDestEntry( + obfDestEntry)) + GuiTricks.activateButton(matchButton, "Match", event -> match()); + } else if (obfSourceEntry != null) + GuiTricks.activateButton(unmatchableButton, "Set Unmatchable", event -> unmatchable()); } protected void match() { // update the field matches - m_memberMatches.makeMatch(m_obfSourceEntry, m_obfDestEntry, m_sourceDeobfuscator, m_destDeobfuscator); + memberMatches.makeMatch(obfSourceEntry, obfDestEntry, sourceDeobfuscator, destDeobfuscator); save(); // update the ui @@ -445,7 +408,7 @@ public class MemberMatchingGui { protected void unmatch() { // update the field matches - m_memberMatches.unmakeMatch(m_obfSourceEntry, m_obfDestEntry, m_sourceDeobfuscator, m_destDeobfuscator); + memberMatches.unmakeMatch(obfSourceEntry, obfDestEntry, sourceDeobfuscator, destDeobfuscator); save(); // update the ui @@ -459,7 +422,7 @@ public class MemberMatchingGui { protected void unmatchable() { // update the field matches - m_memberMatches.makeSourceUnmatchable(m_obfSourceEntry, m_sourceDeobfuscator); + memberMatches.makeSourceUnmatchable(obfSourceEntry, sourceDeobfuscator); save(); // update the ui @@ -471,8 +434,8 @@ public class MemberMatchingGui { } private void save() { - if (m_saveListener != null) { - m_saveListener.save(m_memberMatches); + if (saveListener != null) { + saveListener.save(memberMatches); } } } diff --git a/src/main/java/cuchaz/enigma/gui/ScoredClassEntry.java b/src/main/java/cuchaz/enigma/gui/ScoredClassEntry.java index d1e2de0..bd9fe3d 100644 --- a/src/main/java/cuchaz/enigma/gui/ScoredClassEntry.java +++ b/src/main/java/cuchaz/enigma/gui/ScoredClassEntry.java @@ -17,14 +17,28 @@ public class ScoredClassEntry extends ClassEntry { private static final long serialVersionUID = -8798725308554217105L; - private float m_score; + private float score; public ScoredClassEntry(ClassEntry other, float score) { super(other); - m_score = score; + this.score = score; } public float getScore() { - return m_score; + return score; + } + + @Override + public int hashCode() { + return Float.hashCode(score) + super.hashCode(); + } + + @Override + public boolean equals(Object other) { + return super.equals(other) && other instanceof ScoredClassEntry && equals((ScoredClassEntry) other); + } + + public boolean equals(ScoredClassEntry other) { + return other != null && score == other.score; } } diff --git a/src/main/java/cuchaz/enigma/gui/dialog/CrashDialog.java b/src/main/java/cuchaz/enigma/gui/dialog/CrashDialog.java index 8d3df47..5c1d9ff 100644 --- a/src/main/java/cuchaz/enigma/gui/dialog/CrashDialog.java +++ b/src/main/java/cuchaz/enigma/gui/dialog/CrashDialog.java @@ -23,15 +23,15 @@ import cuchaz.enigma.utils.Utils; public class CrashDialog { - private static CrashDialog m_instance = null; + private static CrashDialog instance = null; - private JFrame m_frame; - private JTextArea m_text; + private JFrame frame; + private JTextArea text; private CrashDialog(JFrame parent) { // init frame - m_frame = new JFrame(Constants.NAME + " - Crash Report"); - final Container pane = m_frame.getContentPane(); + frame = new JFrame(Constants.NAME + " - Crash Report"); + final Container pane = frame.getContentPane(); pane.setLayout(new BorderLayout()); JLabel label = new JLabel(Constants.NAME + " has crashed! =("); @@ -39,9 +39,9 @@ public class CrashDialog { pane.add(label, BorderLayout.NORTH); // report panel - m_text = new JTextArea(); - m_text.setTabSize(2); - pane.add(new JScrollPane(m_text), BorderLayout.CENTER); + text = new JTextArea(); + text.setTabSize(2); + pane.add(new JScrollPane(text), BorderLayout.CENTER); // buttons panel JPanel buttonsPanel = new JPanel(); @@ -52,7 +52,7 @@ public class CrashDialog { JButton ignoreButton = new JButton("Ignore"); ignoreButton.addActionListener(event -> { // close (hide) the dialog - m_frame.setVisible(false); + frame.setVisible(false); }); buttonsPanel.add(ignoreButton); JButton exitButton = new JButton("Exit"); @@ -64,13 +64,13 @@ public class CrashDialog { pane.add(buttonsPanel, BorderLayout.SOUTH); // show the frame - m_frame.setSize(600, 400); - m_frame.setLocationRelativeTo(parent); - m_frame.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE); + frame.setSize(600, 400); + frame.setLocationRelativeTo(parent); + frame.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE); } public static void init(JFrame parent) { - m_instance = new CrashDialog(parent); + instance = new CrashDialog(parent); } public static void show(Throwable ex) { @@ -80,8 +80,8 @@ public class CrashDialog { String report = buf.toString(); // show it! - m_instance.m_text.setText(report); - m_instance.m_frame.doLayout(); - m_instance.m_frame.setVisible(true); + instance.text.setText(report); + instance.frame.doLayout(); + instance.frame.setVisible(true); } } diff --git a/src/main/java/cuchaz/enigma/gui/dialog/ProgressDialog.java b/src/main/java/cuchaz/enigma/gui/dialog/ProgressDialog.java index c752c86..8df22a7 100644 --- a/src/main/java/cuchaz/enigma/gui/dialog/ProgressDialog.java +++ b/src/main/java/cuchaz/enigma/gui/dialog/ProgressDialog.java @@ -87,15 +87,13 @@ public class ProgressDialog implements ProgressListener, AutoCloseable { } public static void runInThread(final JFrame parent, final ProgressRunnable runnable) { - new Thread() { - @Override - public void run() { - try (ProgressDialog progress = new ProgressDialog(parent)) { - runnable.run(progress); - } catch (Exception ex) { - throw new Error(ex); - } + new Thread(() -> + { + try (ProgressDialog progress = new ProgressDialog(parent)) { + runnable.run(progress); + } catch (Exception ex) { + throw new Error(ex); } - }.start(); + }).start(); } } diff --git a/src/main/java/cuchaz/enigma/gui/elements/MenuBar.java b/src/main/java/cuchaz/enigma/gui/elements/MenuBar.java index dcd7c93..0ccd537 100644 --- a/src/main/java/cuchaz/enigma/gui/elements/MenuBar.java +++ b/src/main/java/cuchaz/enigma/gui/elements/MenuBar.java @@ -42,16 +42,14 @@ public class MenuBar extends JMenuBar { item.addActionListener(event -> { if (this.gui.jarFileChooser.showOpenDialog(this.gui.getFrame()) == JFileChooser.APPROVE_OPTION) { // load the jar in a separate thread - new Thread() { - @Override - public void run() { - try { - gui.getController().openJar(new JarFile(gui.jarFileChooser.getSelectedFile())); - } catch (IOException ex) { - throw new Error(ex); - } + new Thread(() -> + { + try { + gui.getController().openJar(new JarFile(gui.jarFileChooser.getSelectedFile())); + } catch (IOException ex) { + throw new Error(ex); } - }.start(); + }).start(); } }); } @@ -177,9 +175,7 @@ public class MenuBar extends JMenuBar { { JMenuItem item = new JMenuItem("Rebuild Method Names"); menu.add(item); - item.addActionListener(event -> { - this.gui.getController().rebuildMethodNames(); - }); + item.addActionListener(event -> this.gui.getController().rebuildMethodNames()); this.rebuildMethodNamesMenu = item; } menu.addSeparator(); diff --git a/src/main/java/cuchaz/enigma/gui/elements/PopupMenuBar.java b/src/main/java/cuchaz/enigma/gui/elements/PopupMenuBar.java index 2b06342..e387ed3 100644 --- a/src/main/java/cuchaz/enigma/gui/elements/PopupMenuBar.java +++ b/src/main/java/cuchaz/enigma/gui/elements/PopupMenuBar.java @@ -53,7 +53,7 @@ public class PopupMenuBar extends JPopupMenu { } { JMenuItem menu = new JMenuItem("Go to Declaration"); - menu.addActionListener(event -> gui.navigateTo(gui.m_reference.entry)); + menu.addActionListener(event -> gui.navigateTo(gui.reference.entry)); menu.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_N, 0)); menu.setEnabled(false); this.add(menu); diff --git a/src/main/java/cuchaz/enigma/gui/node/ClassSelectorClassNode.java b/src/main/java/cuchaz/enigma/gui/node/ClassSelectorClassNode.java index 8341826..9f391f2 100644 --- a/src/main/java/cuchaz/enigma/gui/node/ClassSelectorClassNode.java +++ b/src/main/java/cuchaz/enigma/gui/node/ClassSelectorClassNode.java @@ -37,6 +37,11 @@ public class ClassSelectorClassNode extends DefaultMutableTreeNode { return other instanceof ClassSelectorClassNode && equals((ClassSelectorClassNode) other); } + @Override public int hashCode() + { + return 17 + (classEntry != null ? classEntry.hashCode() : 0); + } + @Override public void setUserObject(Object userObject) { String packageName = ""; diff --git a/src/main/java/cuchaz/enigma/gui/node/ClassSelectorPackageNode.java b/src/main/java/cuchaz/enigma/gui/node/ClassSelectorPackageNode.java index 31b4ebf..b3eb90e 100644 --- a/src/main/java/cuchaz/enigma/gui/node/ClassSelectorPackageNode.java +++ b/src/main/java/cuchaz/enigma/gui/node/ClassSelectorPackageNode.java @@ -48,6 +48,11 @@ public class ClassSelectorPackageNode extends DefaultMutableTreeNode { return other instanceof ClassSelectorPackageNode && equals((ClassSelectorPackageNode) other); } + @Override public int hashCode() + { + return packageName.hashCode(); + } + public boolean equals(ClassSelectorPackageNode other) { return other != null && this.packageName.equals(other.packageName); } -- cgit v1.2.3