Add support for remapping subpackages in package map

Change data structure to a linked hash map, preserving insertion
order. This allows subpackages to be inserted into the package
map for remapping, before their parent package. For example,
A/B/C -> X and A/B -> Y. With the unordered HashMap data structure,
this was not possible (reliably). With LinkedHashMap, now it is.
This commit is contained in:
Agaricus 2013-02-17 12:28:19 -08:00
parent fc8bae3e04
commit a430689c64
4 changed files with 12 additions and 11 deletions

View File

@ -33,7 +33,7 @@ import java.util.*;
public class JarMapping { public class JarMapping {
public final Map<String, String> packages = new HashMap<String, String>(); public final LinkedHashMap<String, String> packages = new LinkedHashMap<String, String>();
public final Map<String, String> classes = new HashMap<String, String>(); public final Map<String, String> classes = new HashMap<String, String>();
public final Map<String, String> fields = new HashMap<String, String>(); public final Map<String, String> fields = new HashMap<String, String>();
public final Map<String, String> methods = new HashMap<String, String>(); public final Map<String, String> methods = new HashMap<String, String>();

View File

@ -33,10 +33,7 @@ import java.io.File;
import java.io.FileOutputStream; import java.io.FileOutputStream;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.util.ArrayList; import java.util.*;
import java.util.Enumeration;
import java.util.List;
import java.util.Map;
import java.util.jar.JarEntry; import java.util.jar.JarEntry;
import java.util.jar.JarOutputStream; import java.util.jar.JarOutputStream;
import org.objectweb.asm.ClassReader; import org.objectweb.asm.ClassReader;
@ -59,7 +56,7 @@ public class JarRemapper extends Remapper {
return mapTypeName(typeName, jarMapping.packages, jarMapping.classes, typeName); return mapTypeName(typeName, jarMapping.packages, jarMapping.classes, typeName);
} }
public static String mapTypeName(String typeName, Map<String, String> packageMap, Map<String, String> classMap, String defaultIfUnmapped) { public static String mapTypeName(String typeName, LinkedHashMap<String, String> packageMap, Map<String, String> classMap, String defaultIfUnmapped) {
int index = typeName.indexOf('$'); int index = typeName.indexOf('$');
String key = (index == -1) ? typeName : typeName.substring(0, index); String key = (index == -1) ? typeName : typeName.substring(0, index);
String mapped = mapClassName(key, packageMap, classMap); String mapped = mapClassName(key, packageMap, classMap);
@ -70,9 +67,11 @@ public class JarRemapper extends Remapper {
/** /**
* Helper method to map a class name by package (prefix) or class (exact) * Helper method to map a class name by package (prefix) or class (exact)
*/ */
private static String mapClassName(String className, Map<String, String> packageMap, Map<String, String> classMap) { private static String mapClassName(String className, LinkedHashMap<String, String> packageMap, Map<String, String> classMap) {
if (packageMap != null) { if (packageMap != null) {
for (String oldPackage : packageMap.keySet()) { Iterator<String> iter = packageMap.keySet().iterator();
while (iter.hasNext()) {
String oldPackage = iter.next();
if (className.startsWith(oldPackage)) { if (className.startsWith(oldPackage)) {
String newPackage = packageMap.get(oldPackage); String newPackage = packageMap.get(oldPackage);

View File

@ -28,13 +28,14 @@
*/ */
package net.md_5.specialsource; package net.md_5.specialsource;
import java.util.LinkedHashMap;
import java.util.Map; import java.util.Map;
public class MethodDescriptorTransformer { public class MethodDescriptorTransformer {
private Map<String, String> packageMap; private LinkedHashMap<String, String> packageMap;
private Map<String, String> classMap; private Map<String, String> classMap;
public MethodDescriptorTransformer(Map<String, String> packageMap, Map<String, String> classMap) { public MethodDescriptorTransformer(LinkedHashMap<String, String> packageMap, Map<String, String> classMap) {
this.packageMap = packageMap; this.packageMap = packageMap;
this.classMap = classMap; this.classMap = classMap;
} }

View File

@ -29,6 +29,7 @@
package net.md_5.specialsource; package net.md_5.specialsource;
import java.util.HashMap; import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@ -38,7 +39,7 @@ import java.util.Map;
*/ */
public class ShadeRelocationSimulator { public class ShadeRelocationSimulator {
public Map<String, String> relocations = new HashMap<String, String>(); public LinkedHashMap<String, String> relocations = new LinkedHashMap<String, String>();
// No relocations // No relocations
public static final ShadeRelocationSimulator IDENTITY = new ShadeRelocationSimulator(); public static final ShadeRelocationSimulator IDENTITY = new ShadeRelocationSimulator();