From 8e8609cd032d299f79307cfdd41998d331a876a7 Mon Sep 17 00:00:00 2001 From: gegy1000 Date: Sun, 12 May 2019 11:56:22 +0200 Subject: Simplify Plugin API and support all entry types --- src/main/java/cuchaz/enigma/Deobfuscator.java | 14 ++++++----- src/main/java/cuchaz/enigma/api/EnigmaPlugin.java | 20 +++++++--------- .../cuchaz/enigma/gui/DecompiledClassSource.java | 28 +++++++++------------- 3 files changed, 27 insertions(+), 35 deletions(-) (limited to 'src/main/java/cuchaz/enigma') diff --git a/src/main/java/cuchaz/enigma/Deobfuscator.java b/src/main/java/cuchaz/enigma/Deobfuscator.java index b4736d8..9060c1f 100644 --- a/src/main/java/cuchaz/enigma/Deobfuscator.java +++ b/src/main/java/cuchaz/enigma/Deobfuscator.java @@ -13,6 +13,7 @@ package cuchaz.enigma; import com.google.common.base.Functions; import com.google.common.base.Stopwatch; +import com.google.common.collect.Streams; import com.strobel.assembler.metadata.ITypeLoader; import com.strobel.assembler.metadata.MetadataSystem; import com.strobel.assembler.metadata.TypeDefinition; @@ -54,6 +55,7 @@ import java.util.jar.JarEntry; import java.util.jar.JarFile; import java.util.jar.JarOutputStream; import java.util.stream.Collectors; +import java.util.stream.Stream; public class Deobfuscator { @@ -73,10 +75,10 @@ public class Deobfuscator { this.jarIndex = JarIndex.empty(); this.jarIndex.indexJar(this.parsedJar, listener); - listener.accept("Initializing plugins..."); - for (EnigmaPlugin plugin : getPlugins()) { - plugin.onClassesLoaded(parsedJar.getClassDataMap(), parsedJar::getClassNode); - } + getPlugins().forEach(plugin -> { + listener.accept("Initializing plugin '" + plugin.getClass().getSimpleName() + "'"); + plugin.indexJar(parsedJar, jarIndex); + }); this.indexTreeBuilder = new IndexTreeBuilder(jarIndex); @@ -105,8 +107,8 @@ public class Deobfuscator { }); } - public ServiceLoader getPlugins() { - return plugins; + public Stream getPlugins() { + return Streams.stream(plugins); } public ParsedJar getJar() { diff --git a/src/main/java/cuchaz/enigma/api/EnigmaPlugin.java b/src/main/java/cuchaz/enigma/api/EnigmaPlugin.java index 3efe0dc..a5ec9c4 100644 --- a/src/main/java/cuchaz/enigma/api/EnigmaPlugin.java +++ b/src/main/java/cuchaz/enigma/api/EnigmaPlugin.java @@ -1,18 +1,14 @@ package cuchaz.enigma.api; -import org.objectweb.asm.tree.ClassNode; +import cuchaz.enigma.analysis.ParsedJar; +import cuchaz.enigma.analysis.index.JarIndex; +import cuchaz.enigma.translation.mapping.EntryRemapper; +import cuchaz.enigma.translation.representation.entry.Entry; -import javax.annotation.Nullable; -import java.util.Map; -import java.util.function.Function; +import java.util.Optional; -public abstract class EnigmaPlugin { - public void onClassesLoaded(Map classData, Function classNodeGetter) { +public interface EnigmaPlugin { + void indexJar(ParsedJar jar, JarIndex index); - } - - @Nullable - public String proposeFieldName(String owner, String name, String desc) { - return null; - } + Optional proposeName(Entry obfEntry, EntryRemapper remapper); } diff --git a/src/main/java/cuchaz/enigma/gui/DecompiledClassSource.java b/src/main/java/cuchaz/enigma/gui/DecompiledClassSource.java index 93643ab..1e96a06 100644 --- a/src/main/java/cuchaz/enigma/gui/DecompiledClassSource.java +++ b/src/main/java/cuchaz/enigma/gui/DecompiledClassSource.java @@ -4,18 +4,17 @@ import cuchaz.enigma.Deobfuscator; import cuchaz.enigma.analysis.EntryReference; import cuchaz.enigma.analysis.SourceIndex; import cuchaz.enigma.analysis.Token; -import cuchaz.enigma.api.EnigmaPlugin; import cuchaz.enigma.gui.highlight.TokenHighlightType; import cuchaz.enigma.translation.LocalNameGenerator; import cuchaz.enigma.translation.Translator; import cuchaz.enigma.translation.representation.TypeDescriptor; import cuchaz.enigma.translation.representation.entry.ClassEntry; import cuchaz.enigma.translation.representation.entry.Entry; -import cuchaz.enigma.translation.representation.entry.FieldEntry; import cuchaz.enigma.translation.representation.entry.LocalVariableDefEntry; import javax.annotation.Nullable; import java.util.*; +import java.util.stream.Stream; public class DecompiledClassSource { private final ClassEntry classEntry; @@ -55,10 +54,10 @@ public class DecompiledClassSource { highlightToken(movedToken, TokenHighlightType.DEOBFUSCATED); return translatedEntry.getSourceRemapName(); } else { - String proposedName = proposeName(deobfuscator, entry); - if (proposedName != null) { + Optional proposedName = proposeName(deobfuscator, entry); + if (proposedName.isPresent()) { highlightToken(movedToken, TokenHighlightType.PROPOSED); - return proposedName; + return proposedName.get(); } highlightToken(movedToken, TokenHighlightType.OBFUSCATED); @@ -73,18 +72,13 @@ public class DecompiledClassSource { return null; } - @Nullable - private String proposeName(Deobfuscator deobfuscator, Entry entry) { - if (entry instanceof FieldEntry) { - for (EnigmaPlugin plugin : deobfuscator.getPlugins()) { - String owner = entry.getContainingClass().getFullName(); - String proposal = plugin.proposeFieldName(owner, entry.getName(), ((FieldEntry) entry).getDesc().toString()); - if (proposal != null) { - return proposal; - } - } - } - return null; + private Optional proposeName(Deobfuscator deobfuscator, Entry entry) { + Stream proposals = deobfuscator.getPlugins() + .map(plugin -> plugin.proposeName(entry, deobfuscator.getMapper())) + .filter(Optional::isPresent) + .map(Optional::get); + + return proposals.findFirst(); } @Nullable -- cgit v1.2.3