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

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

Introduction

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

Prototype

public ClassRemapper(final ClassVisitor classVisitor, final Remapper remapper) 

Source Link

Document

Constructs a new ClassRemapper .

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 ww.  j a  va 2s  .  co  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.navercorp.pinpoint.profiler.instrument.lambda.LambdaFactoryTest.java

License:Apache License

private void renameClass(ClassReader reader, ClassVisitor classVisitor) {
    String className = "com/navercorp/pinpoint/profiler/instrument/lambda/mock/UnsafeClassMock";
    Remapper remapper = new SimpleRemapper(className, className + "2");
    ClassRemapper classRemapper = new ClassRemapper(classVisitor, remapper);
    reader.accept(classRemapper, 0);/*from ww  w .  j a  v  a2  s.c  o m*/
}

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 {/*from w  w  w  .  ja  va 2 s.  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:net.fabricmc.tinyremapper.TinyRemapper.java

License:Open Source License

private byte[] apply(final RClass cls) {
    ClassReader reader = new ClassReader(cls.data);
    ClassWriter writer = new ClassWriter(0);
    int flags = removeFrames ? ClassReader.SKIP_FRAMES : ClassReader.EXPAND_FRAMES;
    reader.accept(new ClassRemapper(check ? new CheckClassAdapter(writer) : writer, remapper), flags);
    // TODO: compute frames (-Xverify:all -XX:-FailOverToOldVerifier)

    return writer.toByteArray();
}

From source file:org.bdgenomics.adam.shade.ParquetAvroWorkaroundShader.java

License:Apache License

private void addRemappedClass(RelocatorRemapper remapper, JarOutputStream jos, File jar, String name,
        InputStream is) throws IOException, MojoExecutionException {
    if (!remapper.hasRelocators()) {
        try {/*from   w w w .j  av a  2s  .co  m*/
            jos.putNextEntry(new JarEntry(name));
            IOUtil.copy(is, jos);
        } catch (ZipException e) {
            getLogger().debug("We have a duplicate " + name + " in " + jar);
        }

        return;
    }

    ClassReader cr = new ClassReader(is);

    // We don't pass the ClassReader here. This forces the ClassWriter to rebuild the constant pool.
    // Copying the original constant pool should be avoided because it would keep references
    // to the original class names. This is not a problem at runtime (because these entries in the
    // constant pool are never used), but confuses some tools such as Felix' maven-bundle-plugin
    // that use the constant pool to determine the dependencies of a class.
    ClassWriter cw = new ClassWriter(0);

    final String pkg = name.substring(0, name.lastIndexOf('/') + 1);
    ClassVisitor cv = new ClassRemapper(cw, remapper) {
        @Override
        public void visitSource(final String source, final String debug) {
            if (source == null) {
                super.visitSource(source, debug);
            } else {
                final String fqSource = pkg + source;
                final String mappedSource = remapper.map(fqSource);
                final String filename = mappedSource.substring(mappedSource.lastIndexOf('/') + 1);
                super.visitSource(filename, debug);
            }
        }
    };

    try {
        cr.accept(cv, ClassReader.EXPAND_FRAMES);
    } catch (Throwable ise) {
        throw new MojoExecutionException("Error in ASM processing class " + name, ise);
    }

    byte[] renamedClass = cw.toByteArray();

    // Need to take the .class off for remapping evaluation
    String mappedName = remapper.map(name.substring(0, name.indexOf('.')));

    try {
        // Now we put it back on so the class file is written out with the right extension.
        jos.putNextEntry(new JarEntry(mappedName + ".class"));

        IOUtil.copy(renamedClass, jos);
    } catch (ZipException e) {
        getLogger().debug("We have a duplicate " + mappedName + " in " + jar);
    }
}

From source file:org.glowroot.agent.weaving.PluginClassRenamer.java

License:Apache License

private LazyDefinedClass build(String internalName, byte[] origBytes) throws IOException {
    processed.add(internalName);/*  w  w w.j a v  a  2 s. co m*/
    PluginClassRemapper remapper = new PluginClassRemapper();
    ImmutableLazyDefinedClass.Builder builder = ImmutableLazyDefinedClass.builder()
            .type(Type.getObjectType(remapper.mapType(internalName)));
    ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS);
    ClassVisitor cv = new ClassRemapper(cw, remapper);
    ClassReader cr = new ClassReader(origBytes);
    cr.accept(cv, 0);
    builder.bytes(cw.toByteArray());
    for (String unprocessed : remapper.unprocessed) {
        builder.addDependencies(build(unprocessed));
    }
    return builder.build();
}

From source file:org.gradle.ShadedJar.java

License:Apache License

private void analyse(FileCollection sourceFiles, final ClassGraph classes, final PrintWriter writer) {
    final PackagePatterns ignored = new PackagePatterns(Collections.singleton("java"));
    sourceFiles.getAsFileTree().visit(new FileVisitor() {
        boolean seenManifest;

        public void visitDir(FileVisitDetails dirDetails) {
        }// w  w  w .  j  a  v a2 s .  com

        public void visitFile(FileVisitDetails fileDetails) {
            writer.print(fileDetails.getPath() + ": ");
            if (fileDetails.getPath().endsWith(".class")) {
                try {
                    ClassReader reader;
                    InputStream inputStream = new BufferedInputStream(fileDetails.open());
                    try {
                        reader = new ClassReader(inputStream);
                    } finally {
                        inputStream.close();
                    }
                    final ClassDetails details = classes.get(reader.getClassName());
                    details.visited = true;
                    ClassWriter classWriter = new ClassWriter(0);
                    reader.accept(new ClassRemapper(classWriter, new Remapper() {
                        public String map(String name) {
                            if (ignored.matches(name)) {
                                return name;
                            }
                            ClassDetails dependencyDetails = classes.get(name);
                            if (dependencyDetails != details) {
                                details.dependencies.add(dependencyDetails);
                            }
                            return dependencyDetails.outputClassName;
                        }
                    }), ClassReader.EXPAND_FRAMES);

                    writer.println("mapped class name: " + details.outputClassName);
                    File outputFile = new File(classesDir, details.outputClassName.concat(".class"));
                    outputFile.getParentFile().mkdirs();
                    OutputStream outputStream = new FileOutputStream(outputFile);
                    try {
                        outputStream.write(classWriter.toByteArray());
                    } finally {
                        outputStream.close();
                    }
                } catch (Exception exception) {
                    throw new ClassAnalysisException("Could not transform class from " + fileDetails.getFile(),
                            exception);
                }
            } else if (fileDetails.getPath().endsWith(".properties")
                    && classes.unshadedPackages.matches(fileDetails.getPath())) {
                writer.println("include");
                classes.addResource(new ResourceDetails(fileDetails.getPath(), fileDetails.getFile()));
            } else if (fileDetails.getPath().equals(JarFile.MANIFEST_NAME) && !seenManifest) {
                seenManifest = true;
                classes.manifest = new ResourceDetails(fileDetails.getPath(), fileDetails.getFile());
            } else {
                writer.println("skipped");
            }
        }
    });
}

From source file:org.gradle.ShadedJarCreator.java

License:Apache License

private void visitClassDirectory(final Path dir, final ClassGraph classes, final PackagePatterns ignored,
        final PrintWriter writer) throws IOException {
    Files.walkFileTree(dir, new FileVisitor<Path>() {
        boolean seenManifest;

        @Override/* w ww .  j a  v  a2  s  . c  o  m*/
        public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {
            return FileVisitResult.CONTINUE;
        }

        @Override
        public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
            writer.print(file.getFileName().toString() + ": ");
            if (file.toString().endsWith(".class")) {
                try {
                    ClassReader reader;
                    try (InputStream inputStream = Files.newInputStream(file)) {
                        reader = new ClassReader(inputStream);
                    }
                    final ClassDetails details = classes.get(reader.getClassName());
                    details.visited = true;
                    ClassWriter classWriter = new ClassWriter(0);
                    reader.accept(new ClassRemapper(classWriter, new Remapper() {
                        public String map(String name) {
                            if (ignored.matches(name)) {
                                return name;
                            }
                            ClassDetails dependencyDetails = classes.get(name);
                            if (dependencyDetails != details) {
                                details.dependencies.add(dependencyDetails);
                            }
                            return dependencyDetails.outputClassName;
                        }
                    }), ClassReader.EXPAND_FRAMES);

                    writer.println("mapped class name: " + details.outputClassName);
                    File outputFile = new File(classesDir, details.outputClassName.concat(".class"));
                    outputFile.getParentFile().mkdirs();
                    try (OutputStream outputStream = new FileOutputStream(outputFile)) {
                        outputStream.write(classWriter.toByteArray());
                    }
                } catch (Exception exception) {
                    throw new ClassAnalysisException("Could not transform class from " + file.toFile(),
                            exception);
                }
            } else if (file.toString().endsWith(".properties")
                    && classes.unshadedPackages.matches(file.toString())) {
                writer.println("include");
                classes.addResource(new ResourceDetails(file.toString(), file.toFile()));
            } else if (file.toString().equals(JarFile.MANIFEST_NAME) && !seenManifest) {
                seenManifest = true;
                classes.manifest = new ResourceDetails(file.toString(), file.toFile());
            } else {
                writer.println("skipped");
            }
            return FileVisitResult.CONTINUE;
        }

        @Override
        public FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException {
            return FileVisitResult.TERMINATE;
        }

        @Override
        public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException {
            return FileVisitResult.CONTINUE;
        }
    });
}

From source file:org.spongepowered.server.launch.transformer.deobf.DeobfuscationTransformer.java

License:MIT License

ClassVisitor createClassRemapper(ClassReader reader, ClassVisitor cv) {
    return new ClassRemapper(cv, this);
}

From source file:org.wildfly.swarm.jaxrs.runtime.DefaultApplicationFactory.java

License:Apache License

public static byte[] create(String name, String path) throws IOException {
    ClassReader reader = new ClassReader(basicClassBytes());

    String slashName = name.replace('.', '/');

    ClassWriter writer = new ClassWriter(0);
    Remapper remapper = new Remapper() {
        @Override//from  w w w .ja  va  2 s .  c  o  m
        public String map(String typeName) {
            if (typeName.equals("org/wildfly/swarm/jaxrs/runtime/DefaultApplication")) {
                return slashName;
            }
            return super.map(typeName);
        }
    };

    ClassRemapper adapter = new ClassRemapper(writer, remapper);
    reader.accept(adapter, 0);

    AnnotationVisitor ann = writer.visitAnnotation("Ljavax/ws/rs/ApplicationPath;", true);
    ann.visit("value", path);
    ann.visitEnd();
    writer.visitEnd();

    return writer.toByteArray();
}