diff --git a/src/main/java/net/md_5/specialsource/JarRemapper.java b/src/main/java/net/md_5/specialsource/JarRemapper.java index ecbc38d..ba12ed5 100644 --- a/src/main/java/net/md_5/specialsource/JarRemapper.java +++ b/src/main/java/net/md_5/specialsource/JarRemapper.java @@ -50,7 +50,7 @@ public class JarRemapper extends Remapper { private final List inheritanceProviders; private final JarMapping jarMapping; - private JarRemapper(JarMapping jarMapping, List inheritanceProviders) throws IOException { + public JarRemapper(JarMapping jarMapping, List inheritanceProviders) throws IOException { this.jarMapping = jarMapping; this.inheritanceProviders = inheritanceProviders; } @@ -115,15 +115,12 @@ public class JarRemapper extends Remapper { return mapped == null ? name : mapped; } - public static void renameJar(Jar jar, File target, JarMapping jarMapping, boolean live) throws IOException { + /** + * Remap all the classes in a jar, writing a new jar to the target + */ + public void remapJar(Jar jar, File target) throws IOException { JarOutputStream out = new JarOutputStream(new FileOutputStream(target)); try { - List inheritanceProviders = new ArrayList(); - inheritanceProviders.add(new JarInheritanceProvider(jar)); - if (live) { - inheritanceProviders.add(new RuntimeInheritanceProvider()); - } - JarRemapper self = new JarRemapper(jarMapping, inheritanceProviders); if (jar == null) { return; } @@ -137,12 +134,8 @@ public class JarRemapper extends Remapper { if (name.endsWith(".class")) { name = name.substring(0, name.length() - CLASS_LEN); - ClassReader reader = new ClassReader(is); - ClassWriter wr = new ClassWriter(0); - RemappingClassAdapter mapper = new RemappingClassAdapter(wr, self); - reader.accept(mapper, ClassReader.EXPAND_FRAMES); - data = wr.toByteArray(); - String newName = self.map(name); + data = remapClassFile(is); + String newName = map(name); entry = new JarEntry(newName == null ? name : newName + ".class"); @@ -167,4 +160,15 @@ public class JarRemapper extends Remapper { out.close(); } } + + /** + * Remap an individual class given an InputStream to its bytecode + */ + public byte[] remapClassFile(InputStream is) throws IOException { + ClassReader reader = new ClassReader(is); + ClassWriter wr = new ClassWriter(0); + RemappingClassAdapter mapper = new RemappingClassAdapter(wr, this); + reader.accept(mapper, ClassReader.EXPAND_FRAMES); + return wr.toByteArray(); + } } diff --git a/src/main/java/net/md_5/specialsource/SpecialSource.java b/src/main/java/net/md_5/specialsource/SpecialSource.java index f12a449..42f801d 100644 --- a/src/main/java/net/md_5/specialsource/SpecialSource.java +++ b/src/main/java/net/md_5/specialsource/SpecialSource.java @@ -30,6 +30,7 @@ package net.md_5.specialsource; import java.io.File; import java.io.IOException; +import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -145,7 +146,16 @@ public class SpecialSource { log("Remapping final jar"); Jar jar3 = Jar.init((File) options.valueOf("in-jar")); - JarRemapper.renameJar(jar3, (File) options.valueOf("out-jar"), jarMapping, options.has("live")); + + List inheritanceProviders = new ArrayList(); + inheritanceProviders.add(new JarInheritanceProvider(jar3)); + if (options.has("live")) { + inheritanceProviders.add(new RuntimeInheritanceProvider()); + } + + + JarRemapper jarRemapper = new JarRemapper(jarMapping, inheritanceProviders); + jarRemapper.remapJar(jar3, (File) options.valueOf("out-jar")); } }