From a430689c64737b2ed75445807d14d827c1573ef6 Mon Sep 17 00:00:00 2001 From: Agaricus Date: Sun, 17 Feb 2013 12:28:19 -0800 Subject: [PATCH] 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. --- .../java/net/md_5/specialsource/JarMapping.java | 2 +- .../java/net/md_5/specialsource/JarRemapper.java | 13 ++++++------- .../specialsource/MethodDescriptorTransformer.java | 5 +++-- .../specialsource/ShadeRelocationSimulator.java | 3 ++- 4 files changed, 12 insertions(+), 11 deletions(-) diff --git a/src/main/java/net/md_5/specialsource/JarMapping.java b/src/main/java/net/md_5/specialsource/JarMapping.java index 6258aef..a731727 100644 --- a/src/main/java/net/md_5/specialsource/JarMapping.java +++ b/src/main/java/net/md_5/specialsource/JarMapping.java @@ -33,7 +33,7 @@ import java.util.*; public class JarMapping { - public final Map packages = new HashMap(); + public final LinkedHashMap packages = new LinkedHashMap(); public final Map classes = new HashMap(); public final Map fields = new HashMap(); public final Map methods = new HashMap(); diff --git a/src/main/java/net/md_5/specialsource/JarRemapper.java b/src/main/java/net/md_5/specialsource/JarRemapper.java index d90c8b8..48c4755 100644 --- a/src/main/java/net/md_5/specialsource/JarRemapper.java +++ b/src/main/java/net/md_5/specialsource/JarRemapper.java @@ -33,10 +33,7 @@ import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; -import java.util.ArrayList; -import java.util.Enumeration; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.jar.JarEntry; import java.util.jar.JarOutputStream; import org.objectweb.asm.ClassReader; @@ -59,7 +56,7 @@ public class JarRemapper extends Remapper { return mapTypeName(typeName, jarMapping.packages, jarMapping.classes, typeName); } - public static String mapTypeName(String typeName, Map packageMap, Map classMap, String defaultIfUnmapped) { + public static String mapTypeName(String typeName, LinkedHashMap packageMap, Map classMap, String defaultIfUnmapped) { int index = typeName.indexOf('$'); String key = (index == -1) ? typeName : typeName.substring(0, index); 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) */ - private static String mapClassName(String className, Map packageMap, Map classMap) { + private static String mapClassName(String className, LinkedHashMap packageMap, Map classMap) { if (packageMap != null) { - for (String oldPackage : packageMap.keySet()) { + Iterator iter = packageMap.keySet().iterator(); + while (iter.hasNext()) { + String oldPackage = iter.next(); if (className.startsWith(oldPackage)) { String newPackage = packageMap.get(oldPackage); diff --git a/src/main/java/net/md_5/specialsource/MethodDescriptorTransformer.java b/src/main/java/net/md_5/specialsource/MethodDescriptorTransformer.java index 20bfbe8..1c24ff6 100644 --- a/src/main/java/net/md_5/specialsource/MethodDescriptorTransformer.java +++ b/src/main/java/net/md_5/specialsource/MethodDescriptorTransformer.java @@ -28,13 +28,14 @@ */ package net.md_5.specialsource; +import java.util.LinkedHashMap; import java.util.Map; public class MethodDescriptorTransformer { - private Map packageMap; + private LinkedHashMap packageMap; private Map classMap; - public MethodDescriptorTransformer(Map packageMap, Map classMap) { + public MethodDescriptorTransformer(LinkedHashMap packageMap, Map classMap) { this.packageMap = packageMap; this.classMap = classMap; } diff --git a/src/main/java/net/md_5/specialsource/ShadeRelocationSimulator.java b/src/main/java/net/md_5/specialsource/ShadeRelocationSimulator.java index c32772c..f573636 100644 --- a/src/main/java/net/md_5/specialsource/ShadeRelocationSimulator.java +++ b/src/main/java/net/md_5/specialsource/ShadeRelocationSimulator.java @@ -29,6 +29,7 @@ package net.md_5.specialsource; import java.util.HashMap; +import java.util.LinkedHashMap; import java.util.List; import java.util.Map; @@ -38,7 +39,7 @@ import java.util.Map; */ public class ShadeRelocationSimulator { - public Map relocations = new HashMap(); + public LinkedHashMap relocations = new LinkedHashMap(); // No relocations public static final ShadeRelocationSimulator IDENTITY = new ShadeRelocationSimulator();