diff --git a/src/main/java/net/md_5/specialsource/JarMapping.java b/src/main/java/net/md_5/specialsource/JarMapping.java index bf66d53..becf561 100644 --- a/src/main/java/net/md_5/specialsource/JarMapping.java +++ b/src/main/java/net/md_5/specialsource/JarMapping.java @@ -28,14 +28,15 @@ */ package net.md_5.specialsource; +import net.md_5.specialsource.transformer.MavenShade; import net.md_5.specialsource.srg.CompactSrgWriter; import net.md_5.specialsource.srg.SrgWriter; import net.md_5.specialsource.srg.ISrgWriter; import net.md_5.specialsource.provider.IInheritanceProvider; -import net.md_5.specialsource.transformer.CSVMappingTransformer; -import net.md_5.specialsource.transformer.MethodDescriptorTransformer; -import net.md_5.specialsource.transformer.ChainTransformer; -import net.md_5.specialsource.transformer.JarMappingLoadTransformer; +import net.md_5.specialsource.transformer.MinecraftCodersPack; +import net.md_5.specialsource.transformer.MethodDescriptor; +import net.md_5.specialsource.transformer.ChainingTransformer; +import net.md_5.specialsource.transformer.MappingTransformer; import java.io.*; import java.util.*; @@ -140,8 +141,8 @@ public class JarMapping { File methodsCsv = URLDownloader.getLocalFile(dirname + sep + "methods.csv"); File packagesCsv = URLDownloader.getLocalFile(dirname + sep + "packages.csv"); // FML repackaging, optional - CSVMappingTransformer outputTransformer; - JarMappingLoadTransformer inputTransformer; + MinecraftCodersPack outputTransformer; + MappingTransformer inputTransformer; if (numericSrgNames) { // Wants numeric "srg" names -> descriptive "csv" names. To accomplish this: @@ -150,14 +151,14 @@ public class JarMapping { // 3. result: mcp->srg, similar to MCP ./reobfuscate --srgnames JarMapping chainMappings = new JarMapping(); chainMappings.loadMappingsDir(dirname, reverse, false/*ignoreCsv*/, false/*numeric*/); - inputTransformer = new ChainTransformer(new JarRemapper(chainMappings)); + inputTransformer = new ChainingTransformer(new JarRemapper(chainMappings)); ignoreCsv = true; // keep numeric srg as output } else { inputTransformer = null; } if (fieldsCsv.exists() && methodsCsv.exists()) { - outputTransformer = new CSVMappingTransformer(ignoreCsv ? null : fieldsCsv, ignoreCsv ? null : methodsCsv, packagesCsv); + outputTransformer = new MinecraftCodersPack(ignoreCsv ? null : fieldsCsv, ignoreCsv ? null : methodsCsv, packagesCsv); } else { outputTransformer = null; } @@ -167,11 +168,6 @@ public class JarMapping { } } - @Deprecated - public void loadMappingsDir(String dirname, boolean reverse, boolean ignoreCsv) throws IOException { - loadMappingsDir(dirname, reverse, ignoreCsv, false); - } - public void loadMappings(File file) throws IOException { loadMappings(new BufferedReader(new FileReader(file)), null, null, false); } @@ -189,15 +185,15 @@ public class JarMapping { */ public void loadMappings(String filename, boolean reverse, boolean numericSrgNames, String inShadeRelocation, String outShadeRelocation) throws IOException { // Optional shade relocation, on input or output names - JarMappingLoadTransformer inputTransformer = null; - JarMappingLoadTransformer outputTransformer = null; + MappingTransformer inputTransformer = null; + MappingTransformer outputTransformer = null; if (inShadeRelocation != null) { - inputTransformer = new ShadeRelocationSimulator(inShadeRelocation); + inputTransformer = new MavenShade(inShadeRelocation); } if (outShadeRelocation != null) { - outputTransformer = new ShadeRelocationSimulator(outShadeRelocation); + outputTransformer = new MavenShade(outShadeRelocation); } if (new File(filename).isDirectory() || filename.endsWith("/")) { @@ -229,12 +225,12 @@ public class JarMapping { * input/output transformations) * @throws IOException */ - public void loadMappings(BufferedReader reader, JarMappingLoadTransformer inputTransformer, JarMappingLoadTransformer outputTransformer, boolean reverse) throws IOException { + public void loadMappings(BufferedReader reader, MappingTransformer inputTransformer, MappingTransformer outputTransformer, boolean reverse) throws IOException { if (inputTransformer == null) { - inputTransformer = ShadeRelocationSimulator.IDENTITY; + inputTransformer = MavenShade.IDENTITY; } if (outputTransformer == null) { - outputTransformer = ShadeRelocationSimulator.IDENTITY; + outputTransformer = MavenShade.IDENTITY; } String line; @@ -256,7 +252,7 @@ public class JarMapping { /** * Parse a 'csrg' mapping format line and populate the data structures */ - private void parseCsrgLine(String line, JarMappingLoadTransformer inputTransformer, JarMappingLoadTransformer outputTransformer, boolean reverse) throws IOException { + private void parseCsrgLine(String line, MappingTransformer inputTransformer, MappingTransformer outputTransformer, boolean reverse) throws IOException { if (reverse) { throw new IllegalArgumentException("csrg reversed not supported"); // TODO: reverse csg (need to lookup remapped classes) } @@ -293,7 +289,7 @@ public class JarMapping { * Parse a standard 'srg' mapping format line and populate the data * structures */ - private void parseSrgLine(String line, JarMappingLoadTransformer inputTransformer, JarMappingLoadTransformer outputTransformer, boolean reverse) throws IOException { + private void parseSrgLine(String line, MappingTransformer inputTransformer, MappingTransformer outputTransformer, boolean reverse) throws IOException { String[] tokens = line.split(" "); String kind = tokens[0]; @@ -444,7 +440,7 @@ public class JarMapping { String key = oldMethod.owner + "/" + oldMethod.name + " " + oldMethod.descriptor; methods.put(key, newMethod.name); - MethodDescriptorTransformer methodDescriptorTransformer = new MethodDescriptorTransformer(null, classes); + MethodDescriptor methodDescriptorTransformer = new MethodDescriptor(null, classes); String oldDescriptor = methodDescriptorTransformer.transform(oldMethod.descriptor); if (full || !(oldMethod.name + " " + oldDescriptor).equals(newMethod.name + " " + newMethod.descriptor)) { diff --git a/src/main/java/net/md_5/specialsource/JarRemapper.java b/src/main/java/net/md_5/specialsource/JarRemapper.java index e5c694d..4e93f21 100644 --- a/src/main/java/net/md_5/specialsource/JarRemapper.java +++ b/src/main/java/net/md_5/specialsource/JarRemapper.java @@ -61,7 +61,7 @@ public class JarRemapper extends Remapper { return mapTypeName(typeName, jarMapping.packages, jarMapping.classes, typeName); } - public static String mapTypeName(String typeName, LinkedHashMap packageMap, Map classMap, String defaultIfUnmapped) { + public static String mapTypeName(String typeName, Map packageMap, Map classMap, String defaultIfUnmapped) { int index = typeName.indexOf('$'); String key = (index == -1) ? typeName : typeName.substring(0, index); String mapped = mapClassName(key, packageMap, classMap); @@ -72,7 +72,7 @@ public class JarRemapper extends Remapper { /** * Helper method to map a class name by package (prefix) or class (exact) */ - private static String mapClassName(String className, LinkedHashMap packageMap, Map classMap) { + private static String mapClassName(String className, Map packageMap, Map classMap) { if (packageMap != null) { Iterator iter = packageMap.keySet().iterator(); while (iter.hasNext()) { diff --git a/src/main/java/net/md_5/specialsource/transformer/ChainTransformer.java b/src/main/java/net/md_5/specialsource/transformer/ChainingTransformer.java similarity index 83% rename from src/main/java/net/md_5/specialsource/transformer/ChainTransformer.java rename to src/main/java/net/md_5/specialsource/transformer/ChainingTransformer.java index 5c30956..9d37201 100644 --- a/src/main/java/net/md_5/specialsource/transformer/ChainTransformer.java +++ b/src/main/java/net/md_5/specialsource/transformer/ChainingTransformer.java @@ -31,17 +31,18 @@ package net.md_5.specialsource.transformer; import net.md_5.specialsource.JarRemapper; /** - * Load a mapping 'chained' through another mapping + * Load a mapping 'chained' through another mapping. */ -public class ChainTransformer extends JarMappingLoadTransformer { +public class ChainingTransformer extends MappingTransformer { private final JarRemapper jarRemapper; + private final MethodDescriptor methodTransformer; - public ChainTransformer(JarRemapper jarRemapper) { + public ChainingTransformer(JarRemapper jarRemapper) { this.jarRemapper = jarRemapper; + this.methodTransformer = new MethodDescriptor(jarRemapper.jarMapping.packages, jarRemapper.jarMapping.classes); } - // TODO: make this less lame @Override public String transformClassName(String className) { return jarRemapper.map(className); @@ -59,7 +60,6 @@ public class ChainTransformer extends JarMappingLoadTransformer { @Override public String transformMethodDescriptor(String oldDescriptor) { - MethodDescriptorTransformer methodDescriptorTransformer = new MethodDescriptorTransformer(jarRemapper.jarMapping.packages, jarRemapper.jarMapping.classes); - return methodDescriptorTransformer.transform(oldDescriptor); + return methodTransformer.transform(oldDescriptor); } } diff --git a/src/main/java/net/md_5/specialsource/transformer/JarMappingLoadTransformer.java b/src/main/java/net/md_5/specialsource/transformer/MappingTransformer.java similarity index 97% rename from src/main/java/net/md_5/specialsource/transformer/JarMappingLoadTransformer.java rename to src/main/java/net/md_5/specialsource/transformer/MappingTransformer.java index 12613d4..8b0ee9b 100644 --- a/src/main/java/net/md_5/specialsource/transformer/JarMappingLoadTransformer.java +++ b/src/main/java/net/md_5/specialsource/transformer/MappingTransformer.java @@ -33,7 +33,7 @@ package net.md_5.specialsource.transformer; * * TODO: refactor with JarRemapper? */ -public abstract class JarMappingLoadTransformer { +public abstract class MappingTransformer { public String transformClassName(String className) { return className; diff --git a/src/main/java/net/md_5/specialsource/ShadeRelocationSimulator.java b/src/main/java/net/md_5/specialsource/transformer/MavenShade.java similarity index 84% rename from src/main/java/net/md_5/specialsource/ShadeRelocationSimulator.java rename to src/main/java/net/md_5/specialsource/transformer/MavenShade.java index b47b662..2992d1f 100644 --- a/src/main/java/net/md_5/specialsource/ShadeRelocationSimulator.java +++ b/src/main/java/net/md_5/specialsource/transformer/MavenShade.java @@ -26,23 +26,21 @@ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ -package net.md_5.specialsource; +package net.md_5.specialsource.transformer; -import net.md_5.specialsource.transformer.MethodDescriptorTransformer; -import net.md_5.specialsource.transformer.JarMappingLoadTransformer; import java.util.*; /** * Simulate a small subset of the maven-shade-plugin class relocation * functionality */ -public class ShadeRelocationSimulator extends JarMappingLoadTransformer { +public class MavenShade extends MappingTransformer { public LinkedHashMap relocations = new LinkedHashMap(); // No relocations - public static final ShadeRelocationSimulator IDENTITY = new ShadeRelocationSimulator(); + public static final MavenShade IDENTITY = new MavenShade(); - private ShadeRelocationSimulator() { + private MavenShade() { } /** @@ -50,7 +48,7 @@ public class ShadeRelocationSimulator extends JarMappingLoadTransformer { * * @param relocations */ - public ShadeRelocationSimulator(Map relocations) { + public MavenShade(Map relocations) { for (Map.Entry entry : relocations.entrySet()) { this.relocations.put(toInternalName(entry.getKey()), toInternalName(entry.getValue())); } @@ -62,7 +60,7 @@ public class ShadeRelocationSimulator extends JarMappingLoadTransformer { * * @param list */ - public ShadeRelocationSimulator(List list) { + public MavenShade(List list) { for (String pair : list) { int index = pair.indexOf("="); if (index == -1) { @@ -75,7 +73,7 @@ public class ShadeRelocationSimulator extends JarMappingLoadTransformer { } } - public ShadeRelocationSimulator(String string) { + public MavenShade(String string) { this(Arrays.asList(string.split(","))); } @@ -98,7 +96,7 @@ public class ShadeRelocationSimulator extends JarMappingLoadTransformer { @Override public String transformMethodDescriptor(String oldDescriptor) { - MethodDescriptorTransformer methodDescriptorTransformer = new MethodDescriptorTransformer(relocations, null); + MethodDescriptor methodDescriptorTransformer = new MethodDescriptor(relocations, null); return methodDescriptorTransformer.transform(oldDescriptor); } diff --git a/src/main/java/net/md_5/specialsource/transformer/MethodDescriptorTransformer.java b/src/main/java/net/md_5/specialsource/transformer/MethodDescriptor.java similarity index 94% rename from src/main/java/net/md_5/specialsource/transformer/MethodDescriptorTransformer.java rename to src/main/java/net/md_5/specialsource/transformer/MethodDescriptor.java index 6eaaddb..1256d30 100644 --- a/src/main/java/net/md_5/specialsource/transformer/MethodDescriptorTransformer.java +++ b/src/main/java/net/md_5/specialsource/transformer/MethodDescriptor.java @@ -28,16 +28,15 @@ */ package net.md_5.specialsource.transformer; -import java.util.LinkedHashMap; import java.util.Map; import net.md_5.specialsource.JarRemapper; -public class MethodDescriptorTransformer { +public class MethodDescriptor { - private LinkedHashMap packageMap; + private Map packageMap; private Map classMap; - public MethodDescriptorTransformer(LinkedHashMap packageMap, Map classMap) { + public MethodDescriptor(Map packageMap, Map classMap) { this.packageMap = packageMap; this.classMap = classMap; } diff --git a/src/main/java/net/md_5/specialsource/transformer/CSVMappingTransformer.java b/src/main/java/net/md_5/specialsource/transformer/MinecraftCodersPack.java similarity index 63% rename from src/main/java/net/md_5/specialsource/transformer/CSVMappingTransformer.java rename to src/main/java/net/md_5/specialsource/transformer/MinecraftCodersPack.java index a146b50..2ae0071 100644 --- a/src/main/java/net/md_5/specialsource/transformer/CSVMappingTransformer.java +++ b/src/main/java/net/md_5/specialsource/transformer/MinecraftCodersPack.java @@ -29,6 +29,7 @@ package net.md_5.specialsource.transformer; import au.com.bytecode.opencsv.CSVReader; +import com.google.common.base.Preconditions; import java.io.File; import java.io.FileReader; @@ -38,19 +39,16 @@ import java.util.Map; import net.md_5.specialsource.JarRemapper; /** - * For reading a .srg through MCP's fields.csv and methods.csv Maps func_### and - * field_### in input srg to "descriptive" names + * For reading a srg through MCP's fields.csv and methods.csv Maps func_### and + * field_### in input srg to "descriptive" names. */ -public class CSVMappingTransformer extends JarMappingLoadTransformer { +public class MinecraftCodersPack extends MappingTransformer { - private final Map fieldMap; // numeric srg name field_### -> descriptive csv name - private final Map methodMap; // numeric srg name func_### -> descriptive csv name + private final Map fieldMap = new HashMap(); // numeric srg name field_### -> descriptive csv name + private final Map methodMap = new HashMap(); // numeric srg name func_### -> descriptive csv name private final Map classPackageMap; // class src name -> repackaged full class name - public CSVMappingTransformer(File fieldsCsv, File methodsCsv, File packagesCsv) throws IOException { - fieldMap = new HashMap(); - methodMap = new HashMap(); - + public MinecraftCodersPack(File fieldsCsv, File methodsCsv, File packagesCsv) throws IOException { if (fieldsCsv != null && fieldsCsv.exists()) { readIntoMap(fieldsCsv, fieldMap); } @@ -65,12 +63,8 @@ public class CSVMappingTransformer extends JarMappingLoadTransformer { Map packages = new HashMap(); readIntoMap(packagesCsv, packages); - for (Map.Entry entry : packages.entrySet()) { - String classSimpleName = entry.getKey(); - String newPackageName = entry.getValue(); - - classPackageMap.put("net/minecraft/src/" + classSimpleName, newPackageName + "/" + classSimpleName); + classPackageMap.put("net/minecraft/src/" + entry.getKey(), entry.getValue() + "/" + entry.getKey()); } } else { // flat package (vanilla MCP) @@ -79,33 +73,40 @@ public class CSVMappingTransformer extends JarMappingLoadTransformer { } private void readIntoMap(File file, Map map) throws IOException { - CSVReader csvReader = new CSVReader(new FileReader(file)); - String[] line; + FileReader fileReader = null; + CSVReader csvReader = null; + try { + fileReader = new FileReader(file); + csvReader = new CSVReader(fileReader); - while ((line = csvReader.readNext()) != null) { - if (line.length == 0) { - continue; + String[] line; + while ((line = csvReader.readNext()) != null) { + if (line.length == 0) { + continue; + } + Preconditions.checkArgument(line.length >= 2, "Invalid csv line: %s", (Object) line); + map.put(line[0], line[1]); } - - if (line.length < 2) { - throw new IllegalArgumentException("Invalid csv line: " + line); + } finally { + if (csvReader != null) { + csvReader.close(); + } + if (fileReader != null) { + fileReader.close(); } - - String key = line[0]; - String value = line[1]; - - map.put(key, value); } } @Override public String transformFieldName(String className, String fieldName) { - return fieldMap.containsKey(fieldName) ? fieldMap.get(fieldName) : fieldName; + String mapped = fieldMap.get(fieldName); + return (mapped != null) ? mapped : fieldName; } @Override public String transformMethodName(String className, String methodName, String methodDescriptor) { - return methodMap.containsKey(methodName) ? methodMap.get(methodName) : methodName; + String mapped = methodMap.get(methodName); + return (mapped != null) ? mapped : methodName; } @Override @@ -114,12 +115,8 @@ public class CSVMappingTransformer extends JarMappingLoadTransformer { return className; } - String newPackage = classPackageMap.get(className); - if (newPackage == null) { - return className; - } - - return JarRemapper.mapTypeName(className, null, classPackageMap, className); + String mapped = classPackageMap.get(className); + return (mapped != null) ? JarRemapper.mapTypeName(className, null, classPackageMap, className) : className; } @Override @@ -128,7 +125,7 @@ public class CSVMappingTransformer extends JarMappingLoadTransformer { return oldDescriptor; } - MethodDescriptorTransformer methodDescriptorTransformer = new MethodDescriptorTransformer(null, classPackageMap); + MethodDescriptor methodDescriptorTransformer = new MethodDescriptor(null, classPackageMap); return methodDescriptorTransformer.transform(oldDescriptor); } }