From 00fcd0550fcdda621c2e4662f6ddd55ce673b931 Mon Sep 17 00:00:00 2001 From: Gegy Date: Thu, 24 Jan 2019 14:48:32 +0200 Subject: [WIP] Mapping rework (#91) * Move packages * Mapping & entry refactor: first pass * Fix deobf -> obf tree remapping * Resolve various issues * Give all entries the potential for parents and treat inner classes as children * Deobf UI tree elements * Tests pass * Sort mapping output * Fix delta tracking * Index separation and first pass for #97 * Keep track of remapped jar index * Fix child entries not being remapped * Drop non-root entries * Track dropped mappings * Fix enigma mapping ordering * EntryTreeNode interface * Small tweaks * Naive full index remap on rename * Entries can resolve to more than one root entry * Support alternative resolution strategies * Bridge method resolution * Tests pass * Fix mappings being used where there are none * Fix methods with different descriptors being considered unique. closes #89 --- src/main/java/cuchaz/enigma/CommandMain.java | 57 ++++++++++++++++++---------- 1 file changed, 38 insertions(+), 19 deletions(-) (limited to 'src/main/java/cuchaz/enigma/CommandMain.java') diff --git a/src/main/java/cuchaz/enigma/CommandMain.java b/src/main/java/cuchaz/enigma/CommandMain.java index 6c8caa4..a84cd5e 100644 --- a/src/main/java/cuchaz/enigma/CommandMain.java +++ b/src/main/java/cuchaz/enigma/CommandMain.java @@ -11,11 +11,15 @@ package cuchaz.enigma; -import cuchaz.enigma.Deobfuscator.ProgressListener; -import cuchaz.enigma.mapping.Mappings; -import cuchaz.enigma.mapping.MappingsEnigmaReader; +import cuchaz.enigma.translation.mapping.EntryMapping; +import cuchaz.enigma.translation.mapping.serde.MappingFormat; +import cuchaz.enigma.translation.mapping.tree.EntryTree; import java.io.File; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.Locale; import java.util.jar.JarFile; public class CommandMain { @@ -52,7 +56,7 @@ public class CommandMain { private static void decompile(String[] args) throws Exception { File fileJarIn = getReadableFile(getArg(args, 1, "in jar", true)); File fileJarOut = getWritableFolder(getArg(args, 2, "out folder", true)); - File fileMappings = getReadableFile(getArg(args, 3, "mappings file", false)); + Path fileMappings = getReadablePath(getArg(args, 3, "mappings file", false)); Deobfuscator deobfuscator = getDeobfuscator(fileMappings, new JarFile(fileJarIn)); deobfuscator.writeSources(fileJarOut, new ConsoleProgressListener()); } @@ -60,43 +64,47 @@ public class CommandMain { private static void deobfuscate(String[] args) throws Exception { File fileJarIn = getReadableFile(getArg(args, 1, "in jar", true)); File fileJarOut = getWritableFile(getArg(args, 2, "out jar", true)); - File fileMappings = getReadableFile(getArg(args, 3, "mappings file", false)); + Path fileMappings = getReadablePath(getArg(args, 3, "mappings file", false)); Deobfuscator deobfuscator = getDeobfuscator(fileMappings, new JarFile(fileJarIn)); deobfuscator.writeJar(fileJarOut, new ConsoleProgressListener()); } - private static Deobfuscator getDeobfuscator(File fileMappings, JarFile jar) throws Exception { + private static Deobfuscator getDeobfuscator(Path fileMappings, JarFile jar) throws Exception { System.out.println("Reading jar..."); Deobfuscator deobfuscator = new Deobfuscator(jar); if (fileMappings != null) { System.out.println("Reading mappings..."); - Mappings mappings = new MappingsEnigmaReader().read(fileMappings); + EntryTree mappings = chooseEnigmaFormat(fileMappings).read(fileMappings); deobfuscator.setMappings(mappings); } return deobfuscator; } private static void convertMappings(String[] args) throws Exception { - File fileMappings = getReadableFile(getArg(args, 1, "enigma mapping", true)); + Path fileMappings = getReadablePath(getArg(args, 1, "enigma mapping", true)); File result = getWritableFile(getArg(args, 2, "enigma mapping", true)); String name = getArg(args, 3, "format desc", true); - Mappings.FormatType formatType; + MappingFormat saveFormat; try { - formatType = Mappings.FormatType.valueOf(name.toUpperCase()); + saveFormat = MappingFormat.valueOf(name.toUpperCase(Locale.ROOT)); } catch (IllegalArgumentException e) { throw new IllegalArgumentException(name + "is not a valid mapping format!"); } System.out.println("Reading mappings..."); - Mappings mappings = new MappingsEnigmaReader().read(fileMappings); + + MappingFormat readFormat = chooseEnigmaFormat(fileMappings); + EntryTree mappings = readFormat.read(fileMappings); System.out.println("Saving new mappings..."); - switch (formatType) { - case SRG_FILE: - mappings.saveSRGMappings(result); - break; - default: - mappings.saveEnigmaMappings(result, Mappings.FormatType.ENIGMA_FILE != formatType); - break; + + saveFormat.write(mappings, result.toPath(), new ConsoleProgressListener()); + } + + private static MappingFormat chooseEnigmaFormat(Path path) { + if (Files.isDirectory(path)) { + return MappingFormat.ENIGMA_DIRECTORY; + } else { + return MappingFormat.ENIGMA_FILE; } } @@ -149,6 +157,17 @@ public class CommandMain { return file; } + private static Path getReadablePath(String path) { + if (path == null) { + return null; + } + Path file = Paths.get(path).toAbsolutePath(); + if (!Files.exists(file)) { + throw new IllegalArgumentException("Cannot find file: " + file.toString()); + } + return file; + } + public static class ConsoleProgressListener implements ProgressListener { private static final int ReportTime = 5000; // 5s @@ -166,7 +185,7 @@ public class CommandMain { } @Override - public void onProgress(int numDone, String message) { + public void step(int numDone, String message) { long now = System.currentTimeMillis(); boolean isLastUpdate = numDone == this.totalWork; boolean shouldReport = isLastUpdate || now - this.lastReportTime > ReportTime; -- cgit v1.2.3