Add remapping from csrg input file

This commit is contained in:
Agaricus 2013-01-22 00:17:48 -08:00
parent 642612e1c3
commit 5437eb4c9e
3 changed files with 85 additions and 12 deletions

View File

@ -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);
}
}
}
}

View File

@ -41,7 +41,23 @@ public class JarMapping {
public final Map<String, String> fields = new HashMap<String, String>();
public final Map<String, String> methods = new HashMap<String, String>();
/**
* 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);

View File

@ -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<Jar>(jar1, jar2), new Pair<JarComparer>(visitor1, visitor2), new Pair<String>(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<Jar>(jar1, jar2), new Pair<JarComparer>(visitor1, visitor2), new Pair<String>(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);
}
}