Example usage for org.objectweb.asm.commons SimpleRemapper SimpleRemapper

List of usage examples for org.objectweb.asm.commons SimpleRemapper SimpleRemapper

Introduction

In this page you can find the example usage for org.objectweb.asm.commons SimpleRemapper SimpleRemapper.

Prototype

public SimpleRemapper(final Map<String, String> mapping) 

Source Link

Document

Constructs a new SimpleRemapper with the given mapping.

Usage

From source file:com.github.jasmo.util.BytecodeHelper.java

License:Open Source License

public static void applyMappings(Map<String, ClassNode> classMap, Map<String, String> remap) {
    log.debug("Applying mappings [");
    for (Map.Entry<String, String> entry : remap.entrySet()) {
        String k = entry.getKey();
        String v = entry.getValue();
        if (k.equals(v))
            continue;
        // skip members with same name
        // field format =   [ "<owner>.<name>"          : "<newname>" ]
        // method format =  [ "<owner>.<name> <desc>"   : "<newname>" ]
        int n = k.indexOf('.');
        if (n != -1 && v.length() >= n && v.substring(n).equals(k)) {
            continue;
        }/*w w  w .  j  a  v a 2  s  .  c o  m*/
        log.debug(" Map {} to {}", entry.getKey(), entry.getValue());
    }
    log.debug("]");
    SimpleRemapper remapper = new SimpleRemapper(remap);
    for (ClassNode node : new ArrayList<>(classMap.values())) {
        ClassNode copy = new ClassNode();
        ClassRemapper adapter = new ClassRemapper(copy, remapper);
        node.accept(adapter);
        classMap.put(node.name, copy);
    }
}

From source file:com.googlecode.ddom.weaver.mixin.MergeAdapter.java

License:Apache License

@Override
public void visit(int version, int access, String name, String signature, String superName,
        String[] interfaces) {/*from w  w w  . j av a2 s. co  m*/
    finalName = name;
    Set<String> mergedInterfaces = new HashSet<String>();
    mergedInterfaces.addAll(Arrays.asList(interfaces));
    for (MixinInfo mixin : mixins) {
        mergedInterfaces.addAll(mixin.getContributedInterfaces());
    }
    super.visit(version, access, name, signature, superName,
            mergedInterfaces.toArray(new String[mergedInterfaces.size()]));
    Map<String, String> mapping = new HashMap<String, String>();
    for (MixinInfo mixin : mixins) {
        mapping.put(mixin.getName(), name);
    }
    remapper = new SimpleRemapper(mapping);
}

From source file:com.licel.jcardsim.utils.JavaCardApiProcessor.java

License:Apache License

public static void proxyClass(File buildDir, String proxyClassFile, String targetClassFile,
        boolean skipConstructor) throws IOException {
    File proxyFile = new File(buildDir, proxyClassFile.replace(".", File.separator) + ".class");
    FileInputStream fProxyClass = new FileInputStream(proxyFile);
    FileInputStream fTargetClass = new FileInputStream(
            new File(buildDir, targetClassFile.replace(".", File.separator) + ".class"));
    ClassReader crProxy = new ClassReader(fProxyClass);
    ClassNode cnProxy = new ClassNode();
    crProxy.accept(cnProxy, 0);/* w w w . j  a  v a 2  s.  c  o m*/
    ClassReader crTarget = new ClassReader(fTargetClass);
    ClassNode cnTarget = new ClassNode();
    crTarget.accept(cnTarget, 0);

    ClassNode cnProxyRemapped = new ClassNode();
    HashMap<String, String> map = new HashMap();
    map.put(cnProxy.name, cnTarget.name);
    // inner classes
    for (int i = 0; i < 10; i++) {
        map.put(cnProxy.name + "$1", cnTarget.name + "$1");
    }
    RemappingClassAdapter ra = new RemappingClassAdapter(cnProxyRemapped, new SimpleRemapper(map));
    cnProxy.accept(ra);

    ClassWriter cw = new ClassWriter(crTarget, 0);
    MergeAdapter ma = new MergeAdapter(cw, cnProxyRemapped, skipConstructor);
    cnTarget.accept(ma);
    fProxyClass.close();
    fTargetClass.close();
    FileOutputStream fos = new FileOutputStream(
            new File(buildDir, targetClassFile.replace(".", File.separator) + ".class"));
    fos.write(cw.toByteArray());
    fos.close();
    // remove proxy class
    proxyFile.delete();
}

From source file:com.licel.jcardsim.utils.JavaCardApiProcessor.java

License:Apache License

public static void copyClass(File buildDir, String proxyClassFile, String targetClassName, Map map)
        throws IOException {
    File sourceFile = new File(buildDir, proxyClassFile.replace(".", File.separator) + ".class");
    FileInputStream fProxyClass = new FileInputStream(sourceFile);
    ClassReader crProxy = new ClassReader(fProxyClass);
    ClassNode cnProxy = new ClassNode();
    crProxy.accept(cnProxy, 0);/*  www. j  a  v  a 2 s  .  com*/

    ClassWriter cw = new ClassWriter(0);
    map.put(cnProxy.name, targetClassName.replace(".", "/"));
    RemappingClassAdapter ra = new RemappingClassAdapter(cw, new SimpleRemapper(map));
    cnProxy.accept(ra);

    fProxyClass.close();
    FileOutputStream fos = new FileOutputStream(
            new File(buildDir, targetClassName.replace(".", File.separator) + ".class"));
    fos.write(cw.toByteArray());
    fos.close();

    // remove source class
    sourceFile.delete();
}

From source file:com.taobao.android.builder.tasks.app.databinding.DataBindingRenameTask.java

License:Apache License

/**
 * ?so/*from  w w  w  .  ja v a  2 s  .c  o  m*/
 */
@TaskAction
void createAwbPackages() throws ExecutionException, InterruptedException {

    AndroidDependencyTree androidDependencyTree = AtlasBuildContext.androidDependencyTrees
            .get(getVariantName());

    if (null == androidDependencyTree) {
        return;
    }

    ExecutorServicesHelper executorServicesHelper = new ExecutorServicesHelper(taskName, getLogger(), 0);
    List<Runnable> runnables = new ArrayList<>();

    for (final AwbBundle awbBundle : androidDependencyTree.getAwbBundles()) {

        runnables.add(new Runnable() {
            @Override
            public void run() {

                try {

                    File dataBindingClazzFolder = appVariantOutputContext.getVariantContext()
                            .getJAwbavaOutputDir(awbBundle);
                    String packageName = ManifestFileUtils.getPackage(awbBundle.getOrgManifestFile());
                    String appName = appVariantContext.getVariantConfiguration().getOriginalApplicationId();

                    //?
                    File dataMapperClazz = new File(dataBindingClazzFolder,
                            "android/databinding/DataBinderMapper.class");
                    if (!dataMapperClazz.exists()) {
                        throw new GradleException("missing datamapper class");
                    }

                    FileInputStream fileInputStream = new FileInputStream(dataMapperClazz);
                    ClassReader in1 = new ClassReader(fileInputStream);
                    ClassWriter cw = new ClassWriter(0);

                    Map<String, String> reMapping = new HashedMap();
                    reMapping.put(appName.replace(".", "/") + "/BR", packageName.replace(".", "/") + "/BR");
                    RemappingClassAdapter remappingClassAdapter = new RemappingClassAdapter(cw,
                            new SimpleRemapper(reMapping));
                    in1.accept(remappingClassAdapter, 8);

                    ClassReader in2 = new ClassReader(cw.toByteArray());
                    ClassWriter cw2 = new ClassWriter(0);
                    Set<String> renames = new HashSet<String>();
                    renames.add("android/databinding/DataBinderMapper");
                    in2.accept(
                            new ClassRenamer(cw2, renames, packageName.replace(".", "/") + "/DataBinderMapper"),
                            8);

                    File destClass = new File(dataBindingClazzFolder,
                            packageName.replace(".", "/") + "/DataBinderMapper.class");
                    destClass.getParentFile().mkdirs();
                    FileOutputStream fileOutputStream = new FileOutputStream(destClass);
                    fileOutputStream.write(cw2.toByteArray());
                    IOUtils.closeQuietly(fileOutputStream);
                    IOUtils.closeQuietly(fileInputStream);

                    FileUtils.deleteDirectory(new File(dataBindingClazzFolder, "android/databinding"));
                    FileUtils.deleteDirectory(new File(dataBindingClazzFolder, "com/android/databinding"));

                    File appDir = new File(dataBindingClazzFolder, appName.replace(".", "/"));
                    if (appDir.exists()) {

                        File[] files = appDir.listFiles(new FileFilter() {
                            @Override
                            public boolean accept(File pathname) {
                                return pathname.isFile() && !pathname.isDirectory();
                            }
                        });

                        for (File tmp : files) {
                            FileUtils.forceDelete(tmp);
                        }

                    }

                } catch (Throwable e) {
                    e.printStackTrace();
                    throw new GradleException("package awb failed");
                }

            }
        });

    }

    executorServicesHelper.execute(runnables);

}

From source file:com.taobao.android.builder.tools.asm.ClazzReplacer.java

License:Apache License

@Override
protected void handleClazz(JarFile jarFile, JarOutputStream jos, JarEntry ze, String pathName) {

    //            logger.log(pathName);
    if (reMapping.containsKey(pathName.substring(0, pathName.length() - 6))) {
        logger.info("[ClazzReplacer] remove class  " + pathName + " form " + jarFile);
        return;/*from  www.j  av  a  2  s. c om*/
    }

    try {
        InputStream in = jarFile.getInputStream(ze);
        ClassReader cr = new ClassReader(in);
        ClassWriter cw = new ClassWriter(0);
        RemappingClassAdapter remappingClassAdapter = new RemappingClassAdapter(cw,
                new SimpleRemapper(reMapping));
        cr.accept(remappingClassAdapter, ClassReader.EXPAND_FRAMES);

        InputStream inputStream = new ByteArrayInputStream(cw.toByteArray());
        copyStreamToJar(inputStream, jos, pathName, ze.getTime());

    } catch (Throwable e) {

        System.err.println("[ClazzReplacer] rewrite error > " + pathName);
        justCopy(jarFile, jos, ze, pathName);
    }

}

From source file:io.druid.query.topn.PooledTopNAlgorithm.java

License:Apache License

private static <T> T makeNewPooledTopNScanner(Class<? extends T> prototypeClass,
        Class<? extends Offset> specializingOffsetClass) {
    if (dontCopyClass) {
        try {// w w w  .j a  v  a  2s  .c o  m
            return prototypeClass.newInstance();
        } catch (InstantiationException | IllegalAccessException e) {
            throw new RuntimeException(e);
        }
    }
    ClassLoader cl = prototypeClass.getClassLoader();
    String prototypeClassName = prototypeClass.getName();
    String prototypeClassBytecodeName = prototypeClassName.replace('.', '/');
    String specializedClassName = prototypeClassName + "$Copy" + specializedClassCounter.getAndIncrement();
    ClassWriter specializedClassWriter = new ClassWriter(0);
    HashMap<String, String> remapping = new HashMap<>();
    remapping.put(prototypeClassBytecodeName, specializedClassName.replace('.', '/'));
    if (specializingOffsetClass != null) {
        remapping.put(Offset.class.getName().replace('.', '/'),
                specializingOffsetClass.getName().replace('.', '/'));
    }
    ClassVisitor classTransformer = new ClassRemapper(specializedClassWriter, new SimpleRemapper(remapping));
    String prototypeClassResource = prototypeClassBytecodeName + ".class";
    try (InputStream prototypeClassBytecodeStream = cl.getResourceAsStream(prototypeClassResource)) {
        ClassReader prototypeClassReader = new ClassReader(prototypeClassBytecodeStream);
        prototypeClassReader.accept(classTransformer, 0);
        byte[] specializedClassBytecode = specializedClassWriter.toByteArray();
        Class specializedClass = UNSAFE.defineClass(specializedClassName, specializedClassBytecode, 0,
                specializedClassBytecode.length, cl, prototypeClass.getProtectionDomain());
        return (T) specializedClass.newInstance();
    } catch (InstantiationException | IllegalAccessException | IOException e) {
        throw new RuntimeException(e);
    }
}

From source file:nl.hardijzer.fw.chainsrg.Method.java

License:Open Source License

public static Map<String, MappedClass> chain(Map<String, MappedClass> a, Map<String, MappedClass> b) {
    Map<String, String> aback = new TreeMap<String, String>();
    Map<String, String> bforward = new TreeMap<String, String>();
    for (String strFrom : a.keySet())
        aback.put(a.get(strFrom).strNewName, strFrom);
    for (String strFrom : b.keySet())
        bforward.put(strFrom, b.get(strFrom).strNewName);
    Remapper btoa = new SimpleRemapper(aback);
    Remapper btoc = new SimpleRemapper(bforward);

    Map<String, MappedClass> c = new TreeMap<String, MappedClass>();
    for (String strFrom : a.keySet()) {
        MappedClass mappedA = a.get(strFrom);
        MappedClass mappedB = b.get(mappedA.strNewName);
        if (mappedB != null) {
            //Remove from b, so we know which ones we already had.
            b.remove(mappedA.strNewName);
            //Uh-oh, chaining here!
            MappedClass mappedC = new MappedClass(mappedB.strNewName);
            mappedC.mapFields = chainFields(mappedA.mapFields, mappedB.mapFields);
            mappedC.mapMethods = chainMethods(mappedA.mapMethods, mappedB.mapMethods, btoa, btoc);
            c.put(strFrom, mappedC);//  ww w .jav  a 2  s .  c  o m
        } else {
            //We're safe, no actual chaining
            c.put(strFrom, mappedA);
        }
    }
    //Add in the unchained ones from B
    for (String strFrom : b.keySet()) {
        c.put(strFrom, b.get(strFrom));
    }
    return c;
}

From source file:org.apache.commons.weaver.normalizer.Normalizer.java

License:Apache License

/**
 * Rewrite classes as indicated by one entry of {@link #segregate(Iterable)}.
 * @param key {@link String} {@link Pair} indicating supertype and constructor signature
 * @param toMerge matching classes//ww  w  . java2  s. c  o  m
 * @throws IOException on I/O error
 */
private void rewrite(final Pair<String, String> key, final Set<ClassWrapper> toMerge) throws IOException {
    final String target = copy(key, toMerge.iterator().next());
    env.info("Merging %s identical %s implementations with constructor %s to type %s", toMerge.size(),
            key.getLeft(), key.getRight(), target);

    final Map<String, Map<String, ClassWrapper>> byEnclosingClass = byEnclosingClass(toMerge);
    for (final Map.Entry<String, Map<String, ClassWrapper>> entry : byEnclosingClass.entrySet()) {
        final String outer = entry.getKey();
        env.debug("Normalizing %s inner classes of %s", entry.getValue().size(), outer);
        final Map<String, String> classMap = new HashMap<>();
        for (final String merged : entry.getValue().keySet()) {
            classMap.put(merged, target);
        }
        final Remapper remapper = new SimpleRemapper(classMap);

        try (InputStream enclosingBytecode = env.getClassfile(outer).getInputStream()) {
            final ClassReader reader = new ClassReader(enclosingBytecode);
            reader.accept(new Remap(new WriteClass(reader), remapper, classMap, entry.getValue()), 0);
        }
        for (final String merged : entry.getValue().keySet()) {
            if (env.deleteClassfile(merged)) {
                env.debug("Deleted class %s", merged);
            } else {
                env.warn("Unable to delete class %s", merged);
            }
        }
    }
}