From 5437eb4c9e0b374948250e007df4f548f9b459de Mon Sep 17 00:00:00 2001 From: Agaricus Date: Tue, 22 Jan 2013 00:17:48 -0800 Subject: [PATCH] Add remapping from csrg input file --- .../md_5/specialsource/CompactSrgReader.java | 33 +++++++++++++ .../net/md_5/specialsource/JarMapping.java | 16 +++++++ .../net/md_5/specialsource/SpecialSource.java | 48 ++++++++++++++----- 3 files changed, 85 insertions(+), 12 deletions(-) create mode 100644 src/main/java/net/md_5/specialsource/CompactSrgReader.java diff --git a/src/main/java/net/md_5/specialsource/CompactSrgReader.java b/src/main/java/net/md_5/specialsource/CompactSrgReader.java new file mode 100644 index 0000000..e5b5447 --- /dev/null +++ b/src/main/java/net/md_5/specialsource/CompactSrgReader.java @@ -0,0 +1,33 @@ +package net.md_5.specialsource; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileReader; +import java.io.IOException; + +public class CompactSrgReader { + public CompactSrgReader(File file, JarMapping jarMapping) throws IOException { + BufferedReader reader = new BufferedReader(new FileReader(file)); + + String line; + while((line = reader.readLine()) != null) { + String[] tokens = line.split(" "); + if (tokens.length == 2) { + String oldClassName = tokens[0]; + String newClassName = tokens[1]; + jarMapping.classes.put(oldClassName, newClassName); + } else if (tokens.length == 3) { + String oldClassName = tokens[0]; + String oldFieldName = tokens[1]; + String newFieldName = tokens[2]; + jarMapping.fields.put(oldClassName + "/" + oldFieldName, newFieldName); + } else if (tokens.length == 4) { + String oldClassName = tokens[0]; + String oldMethodName = tokens[1]; + String oldMethodDescriptor = tokens[2]; + String newMethodName = tokens[3]; + jarMapping.methods.put(oldClassName + "/" + oldMethodName + " " + oldMethodDescriptor, newMethodName); + } + } + } +} diff --git a/src/main/java/net/md_5/specialsource/JarMapping.java b/src/main/java/net/md_5/specialsource/JarMapping.java index d439678..68431ef 100644 --- a/src/main/java/net/md_5/specialsource/JarMapping.java +++ b/src/main/java/net/md_5/specialsource/JarMapping.java @@ -41,7 +41,23 @@ public class JarMapping { public final Map fields = new HashMap(); public final Map methods = new HashMap(); + /** + * Load a mapping given a .csrg file + * @param file + * @throws IOException + */ + public JarMapping(File file) throws IOException { + new CompactSrgReader(file, this); + } + /** + * Generate a mapping given an original jar and renamed jar + * @param oldJar Original jar + * @param newJar Renamed jar + * @param logfile Optional .srg file to output mappings to + * @param compact If true, generate .csrg logfile instead + * @throws IOException + */ public JarMapping(JarComparer oldJar, JarComparer newJar, File logfile, boolean compact) throws IOException { SpecialSource.validate(oldJar, newJar); diff --git a/src/main/java/net/md_5/specialsource/SpecialSource.java b/src/main/java/net/md_5/specialsource/SpecialSource.java index 7ce14e7..228a0d3 100644 --- a/src/main/java/net/md_5/specialsource/SpecialSource.java +++ b/src/main/java/net/md_5/specialsource/SpecialSource.java @@ -58,7 +58,11 @@ public class SpecialSource { .withRequiredArg() .ofType(File.class); - acceptsAll(asList("i", "remap-jar"), "Input jar to remap") + acceptsAll(asList("m", "srg-in"), "Mapping file input") + .withRequiredArg() + .ofType(File.class); + + acceptsAll(asList("i", "in-jar"), "Input jar to remap") .withRequiredArg() .ofType(File.class); @@ -78,9 +82,9 @@ public class SpecialSource { return; } - if (options == null || options.has("?") || !options.has("a") || !options.has("b")) { + if (options == null || options.has("?")) { try { - parser.printHelpOn(System.out); + parser.printHelpOn(System.err); return; } catch (IOException ex) { System.out.println(ex.getLocalizedMessage()); @@ -96,20 +100,40 @@ public class SpecialSource { return; }*/ - log("Reading jars"); - Jar jar1 = Jar.init((File)options.valueOf("first-jar")); - Jar jar2 = Jar.init((File)options.valueOf("second-jar")); + JarMapping jarMapping; - log("Creating jar compare"); - JarComparer visitor1 = new JarComparer(jar1); - JarComparer visitor2 = new JarComparer(jar2); - visit(new Pair(jar1, jar2), new Pair(visitor1, visitor2), new Pair(jar1.main, jar2.main)); + if (options.has("first-jar") && options.has("second-jar")) { + // Generate mappings from two otherwise-identical jars + log("Reading jars"); + Jar jar1 = Jar.init((File)options.valueOf("first-jar")); + Jar jar2 = Jar.init((File)options.valueOf("second-jar")); - JarMapping jarMapping = new JarMapping(visitor1, visitor2, (File)options.valueOf("srg-out"), options.has("c")); + log("Creating jar compare"); + JarComparer visitor1 = new JarComparer(jar1); + JarComparer visitor2 = new JarComparer(jar2); + visit(new Pair(jar1, jar2), new Pair(visitor1, visitor2), new Pair(jar1.main, jar2.main)); + + jarMapping = new JarMapping(visitor1, visitor2, (File)options.valueOf("srg-out"), options.has("compact")); + } else if (options.has("srg-in")) { + // Load mappings + log("Loading mappings"); + jarMapping = new JarMapping((File)options.valueOf("srg-in")); + } else { + System.err.println("No mappings given, first-jar/second-jar or srg-in required"); + parser.printHelpOn(System.err); + return; + } + log(jarMapping.classes.size()+" classes, "+jarMapping.fields.size()+" fields, "+jarMapping.methods.size()+" methods"); if (options.has("in-jar")) { + if (!options.has("out-jar")) { + System.err.println("No output jar given, in-jar requires in-jar"); + parser.printHelpOn(System.err); + return; + } + log("Remapping final jar"); - Jar jar3 = Jar.init((File)options.valueOf("remap-jar")); + Jar jar3 = Jar.init((File)options.valueOf("in-jar")); JarRemapper.renameJar(jar3, (File)options.valueOf("out-jar"), jarMapping); } }