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

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

Introduction

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

Prototype

Remapper

Source Link

Usage

From source file:com.alibaba.hotswap.processor.v.VClassGenerateVisitor.java

License:Open Source License

public VClassGenerateVisitor(ClassVisitor cv) {
    super(new VClassRemapperVisitor(cv, new Remapper() {

        public String mapType(String type) {
            if (HotswapRuntime.hasClassMeta(type) && type.equals(HotswapThreadLocalUtil.getClassName())) {
                int v = HotswapRuntime.getClassMeta(type).loadedIndex;
                return type + HotswapConstants.V_CLASS_PATTERN + v;
            }/*from  w w  w  . j a  va  2 s  .  c o  m*/

            return type;
        }
    }));
}

From source file:com.github.dcevm.TestClassAdapter.java

License:Open Source License

public TestClassAdapter(ClassVisitor cv, final Map<String, String> typeMappings) {
    super(cv, new Remapper() {
        @Override/*ww w  .  ja va2 s  .  c o m*/
        public String map(String type) {
            return typeMappings.containsKey(type) ? typeMappings.get(type) : type;
        }
    });
}

From source file:com.wolvereness.overmapped.OverMapped.java

License:Open Source License

private void process() throws Throwable {
    validateInput();/*from ww w  .  j a  v a 2s .  c o  m*/

    final MultiProcessor executor = MultiProcessor.newMultiProcessor(cores - 1,
            new ThreadFactoryBuilder().setDaemon(true)
                    .setNameFormat(OverMapped.class.getName() + "-processor-%d")
                    .setUncaughtExceptionHandler(this).build());
    final Future<?> fileCopy = executor.submit(new Callable<Object>() {
        @Override
        public Object call() throws Exception {
            if (original != null) {
                if (original.exists()) {
                    original.delete();
                }
                Files.copy(input, original);
            }
            return null;
        }
    });
    final Future<Iterable<?>> mappings = executor.submit(new Callable<Iterable<?>>() {
        @Override
        public Iterable<?> call() throws Exception {
            final Object yaml = new Yaml().load(Files.toString(maps, Charset.forName("UTF8")));
            if (yaml instanceof Iterable)
                return (Iterable<?>) yaml;
            if (yaml instanceof Map)
                return ImmutableList.of(yaml);
            throw new ClassCastException(String.format("%s (%s) implements neither %s nor %s", yaml,
                    yaml == null ? Object.class : yaml.getClass(), Iterable.class, Map.class));
        }
    });

    final Map<String, ByteClass> byteClasses = newLinkedHashMap();
    final List<Pair<ZipEntry, byte[]>> fileEntries = newArrayList();

    readClasses(executor, byteClasses, fileEntries);

    try {
        reorderEntries(byteClasses);
    } catch (final CircularOrderException ex) {
        final Throwable throwable = new MojoFailureException("Circular class hiearchy detected");
        throwable.initCause(ex);
        throw throwable;
    }

    final Multimap<String, String> depends = processDepends(byteClasses);
    final Multimap<String, String> rdepends = processReverseDepends(depends);

    final BiMap<String, String> nameMaps = HashBiMap.create(byteClasses.size());
    final BiMap<String, String> inverseNameMaps = nameMaps.inverse();

    final BiMap<Signature, Signature> signatureMaps = HashBiMap.create();
    final BiMap<Signature, Signature> inverseSignatureMaps = signatureMaps.inverse();

    final Map<Signature, Integer> flags = newHashMap();

    final Remapper inverseMapper = new Remapper() {
        @Override
        public String map(final String typeName) {
            final String name = inverseNameMaps.get(typeName);
            if (name != null)
                return name;
            return typeName;
        }
    };

    prepareSignatures(byteClasses, rdepends, nameMaps, signatureMaps);

    final Signature.MutableSignature signature = Signature.newMutableSignature("", "", "");
    final Set<String> searchCache = newHashSet();

    for (final Object mapping : mappings.get()) {
        final Map<?, ?> map = (Map<?, ?>) mapping;

        for (final SubRoutine subRoutine : SubRoutine.SUB_ROUTINES) {
            try {
                subRoutine.invoke(this, byteClasses, depends, rdepends, nameMaps, inverseNameMaps,
                        signatureMaps, inverseSignatureMaps, inverseMapper, signature, searchCache, flags, map);
            } catch (final Exception ex) {
                final Throwable throwable = new MojoFailureException("Failed to parse mappings in " + mapping);
                throwable.initCause(ex);
                throw throwable;
            }
        }
    }

    try {
        fileCopy.get();
    } catch (final ExecutionException ex) {
        throw new MojoFailureException(String.format("Could not copy `%s' to `%s'", input, original));
    }

    writeToFile(executor, byteClasses, fileEntries, nameMaps, signatureMaps, flags);

    executor.shutdown();

    final Pair<Thread, Throwable> uncaught = this.uncaught;
    if (uncaught != null)
        throw new MojoExecutionException(String.format("Uncaught exception in %s", uncaught.getLeft()),
                uncaught.getRight());
}

From source file:de.bodden.tamiflex.normalizer.ClassRenamer.java

License:Open Source License

/**
 * Renames references to generated classes according to the mapping <code>fromTo</code>
 * in the bytecode <code>classBytes</code>.
 * @param fromTo This map must contain, for every generated class c an entry that maps c to
 *       some other valid class name. Generated classes are such classes whose name is matched by
 *       {@link Hasher#containsGeneratedClassName(String)}.
 * @param classBytes The bytecode in which the renaming should take place. This array wil remain
 *       unmodified.//  ww w  . jav a2  s  .c om
 * @return The bytecode containing the renamed references.
 */
public static byte[] replaceClassNamesInBytes(final Map<String, String> fromTo, byte[] classBytes) {
    ClassReader creader = new ClassReader(classBytes);
    ClassWriter writer = new ClassWriter(ClassWriter.COMPUTE_MAXS);
    RemappingClassAdapter visitor = new RemappingClassAdapter(writer, new Remapper() {
        //rename a type reference
        @Override
        public String map(String typeName) {
            String newName = fromTo.get(typeName);
            if (Hasher.containsGeneratedClassName(typeName) && newName == null) {
                throw new NoHashedNameException(typeName);
            }
            if (newName != null)
                typeName = newName;
            return super.map(typeName);
        }
    }) {
        //visit the body of the method
        @Override
        public MethodVisitor visitMethod(int access, String name, String desc, String signature,
                String[] exceptions) {
            MethodVisitor mv = super.visitMethod(access, name, desc, signature, exceptions);
            mv = new RemappingStringConstantAdapter(mv, new StringRemapper() {
                //rename any string constants
                @Override
                public String remapStringConstant(String constant) {
                    //string constants will refer to the type using a dotted name; replace dots by slashes... 
                    String slashed = slashed(constant);
                    String to = fromTo.get(slashed);
                    if (Hasher.containsGeneratedClassName(slashed) && to == null) {
                        throw new NoHashedNameException(slashed);
                    }
                    if (to != null)
                        constant = dotted(to);
                    return super.remapStringConstant(constant);
                }
            });
            return mv;
        }
    };
    creader.accept(visitor, 0);
    return writer.toByteArray();
}

From source file:de.bodden.tamiflex.normalizer.Hasher.java

License:Open Source License

public synchronized static void generateHashNumber(final String theClassName, byte[] classBytes)
        throws NoHashedNameException {
    boolean usingAssertions = false;
    assert usingAssertions = true;

    //if we don't use assertions then simply return if the hash code was alread computed
    if (!usingAssertions && generatedClassNameToHashedClassName.containsKey(theClassName))
        return;//from  w w w  .ja  v  a2  s.  c  o  m

    assert containsGeneratedClassName(theClassName) : "Class " + theClassName + " contains no generated name.";
    ClassReader creader = new ClassReader(classBytes);
    ClassWriter writer = new ClassWriter(ClassWriter.COMPUTE_MAXS);
    RemappingClassAdapter visitor = new RemappingClassAdapter(writer, new Remapper() {

        @Override
        public String map(String typeName) {
            if (theClassName.equals(typeName))
                return "$$$NORMALIZED$$$";
            String newName = generatedClassNameToHashedClassName.get(typeName);
            if (Hasher.containsGeneratedClassName(typeName) && newName == null) {
                throw new NoHashedNameException(typeName);
            }
            if (newName != null)
                typeName = newName;
            return super.map(typeName);
        }
    }) {
        @Override
        public void visitSource(String source, String debug) {
            /* we ignore the source-file attribute during hashing;
             * the position at which this attribute is inserted is kind of random,
             * and can therefore lead to unwanted noise */
        }

        @Override
        public MethodVisitor visitMethod(int access, String name, String desc, String signature,
                String[] exceptions) {
            MethodVisitor mv = super.visitMethod(access, name, desc, signature, exceptions);
            mv = new RemappingStringConstantAdapter(mv, new StringRemapper() {
                @Override
                public String remapStringConstant(String constant) {
                    String slashed = slashed(constant);
                    if (theClassName.equals(slashed))
                        return "$$$NORMALIZED$$$";
                    String to = generatedClassNameToHashedClassName.get(slashed);
                    if (!theClassName.equals(slashed) && Hasher.containsGeneratedClassName(slashed)
                            && to == null) {
                        throw new NoHashedNameException(slashed);
                    }
                    if (to != null)
                        constant = dotted(to);
                    return super.remapStringConstant(constant);
                }
            });
            return mv;
        }
    };
    creader.accept(visitor, 0);
    byte[] renamed = writer.toByteArray();
    ////////
    String hash = SHAHash.SHA1(renamed);
    for (String infix : instableNames) {
        if (theClassName.contains(infix)) {
            String hashedName = theClassName.substring(0, theClassName.indexOf(infix) + infix.length())
                    + "$HASHED$" + hash;

            assert !generatedClassNameToHashedClassName.containsKey(theClassName)
                    || generatedClassNameToHashedClassName.get(theClassName)
                            .equals(hashedName) : "Hashed names not stable for " + theClassName + ": "
                                    + generatedClassNameToHashedClassName.get(theClassName) + "," + hashedName;

            generatedClassNameToHashedClassName.put(theClassName, hashedName);
        }
    }
    assert generatedClassNameToHashedClassName.containsKey(theClassName);
}

From source file:de.bodden.tamiflex.normalizer.ReferencedClassesExtracter.java

License:Open Source License

public ReferencedClassesExtracter(ClassVisitor cv, final Set<String> res) {
    super(cv, new Remapper() {
        @Override/*from  w ww .  j av  a 2 s.c  o  m*/
        public String map(String typeName) {
            if (containsGeneratedClassName(typeName))
                res.add(typeName);
            return super.map(typeName);
        }
    });
    this.res = res;
}

From source file:edu.ubc.mirrors.holographs.jdkplugins.GeneratedBytecodeProvider.java

License:Open Source License

public byte[] getGeneratedConstructorAccessorBytecode(ClassMirror classMirror) {
    VirtualMachineMirror vm = classMirror.getVM();
    try {/*from   w  w w .j av a  2s .c  o  m*/
        ClassMirror consClass = vm.findBootstrapClassMirror(Constructor.class.getName());
        FieldMirror accessorField = consClass.getDeclaredField("constructorAccessor");
        ClassMirror delegatingClass = vm
                .findBootstrapClassMirror("sun.reflect.DelegatingConstructorAccessorImpl");
        FieldMirror delegateField = delegatingClass.getDeclaredField("delegate");
        for (ObjectMirror method : consClass.getInstances()) {
            InstanceMirror m = (InstanceMirror) method;
            ObjectMirror accessor = m.get(accessorField);
            if (accessor != null) {
                while (accessor.getClassMirror().equals(delegatingClass)) {
                    accessor = ((InstanceMirror) accessor).get(delegateField);
                }

                if (accessor.getClassMirror().equals(classMirror)) {
                    ConstructorMirror consMirror = Reflection.constructorMirrorForConstructorInstance(m);

                    // Could cache this per VM, but likely not worth it.
                    ClassMirror classClass = vm.findBootstrapClassMirror(Class.class.getName());
                    ClassMirror generatorClass = vm
                            .findBootstrapClassMirror("sun.reflect.MethodAccessorGenerator");
                    MethodMirror generateMethod = generatorClass.getDeclaredMethod("generateConstructor",
                            "java.lang.Class", "java.lang.Class[]", "java.lang.Class[]", "int");

                    // This will have the side-effect of defining a new class, but it should
                    // be totally transparent.
                    InstanceMirror generator = generatorClass.getConstructor()
                            .newInstance(ThreadHolograph.currentThreadMirror());
                    InstanceMirror duplicateAccessor = (InstanceMirror) generateMethod.invoke(
                            ThreadHolograph.currentThreadMirror(), generator, consMirror.getDeclaringClass(),
                            Reflection.toArray(classClass, consMirror.getParameterTypes()),
                            Reflection.toArray(classClass, consMirror.getExceptionTypes()),
                            consMirror.getModifiers());
                    ClassMirror newClass = duplicateAccessor.getClassMirror();

                    // Rename from whatever was generated to what we want.
                    byte[] generatedBytecode = newClass.getBytecode();
                    ClassWriter classWriter = new ClassWriter(ClassWriter.COMPUTE_MAXS);
                    ClassVisitor visitor = classWriter;
                    final String internalName = classMirror.getClassName().replace('.', '/');
                    final String generatedInternalName = newClass.getClassName().replace('.', '/');
                    visitor = new RemappingClassAdapter(visitor, new Remapper() {
                        @Override
                        public String map(String typeName) {
                            if (typeName.equals(generatedInternalName)) {
                                return internalName;
                            }
                            return super.map(typeName);
                        }
                    });
                    new ClassReader(generatedBytecode).accept(visitor, 0);
                    return classWriter.toByteArray();
                }
            }
        }
    } catch (IllegalAccessException e) {
        throw new RuntimeException(e);
    } catch (SecurityException e) {
        throw new RuntimeException(e);
    } catch (NoSuchMethodException e) {
        throw new RuntimeException(e);
    } catch (MirrorInvocationTargetException e) {
        throw new RuntimeException(e);
    }

    return null;
}

From source file:edu.ubc.mirrors.holographs.jdkplugins.GeneratedBytecodeProvider.java

License:Open Source License

public byte[] getGeneratedMethodAccessorBytecode(ClassMirror classMirror) {
    VirtualMachineMirror vm = classMirror.getVM();
    try {/*ww  w.ja v a2  s.c o  m*/
        ClassMirror methodClass = vm.findBootstrapClassMirror(Method.class.getName());
        FieldMirror accessorField = methodClass.getDeclaredField("methodAccessor");
        ClassMirror delegatingClass = vm.findBootstrapClassMirror("sun.reflect.DelegatingMethodAccessorImpl");
        FieldMirror delegateField = delegatingClass.getDeclaredField("delegate");
        for (ObjectMirror method : methodClass.getInstances()) {
            InstanceMirror m = (InstanceMirror) method;
            ObjectMirror accessor = m.get(accessorField);
            if (accessor != null) {
                while (accessor.getClassMirror().equals(delegatingClass)) {
                    accessor = ((InstanceMirror) accessor).get(delegateField);
                }

                if (accessor.getClassMirror().equals(classMirror)) {
                    MethodMirror methodMirror = Reflection.methodMirrorForMethodInstance(m);

                    // Could cache this per VM, but likely not worth it.
                    ClassMirror classClass = vm.findBootstrapClassMirror(Class.class.getName());
                    ClassMirror generatorClass = vm
                            .findBootstrapClassMirror("sun.reflect.MethodAccessorGenerator");
                    MethodMirror generateMethod = generatorClass.getDeclaredMethod("generateMethod",
                            "java.lang.Class", "java.lang.String", "java.lang.Class[]", "java.lang.Class",
                            "java.lang.Class[]", "int");

                    // This will have the side-effect of defining a new class, but it should
                    // be totally transparent.
                    InstanceMirror generator = generatorClass.getConstructor()
                            .newInstance(ThreadHolograph.currentThreadMirror());
                    InstanceMirror duplicateAccessor = (InstanceMirror) generateMethod.invoke(
                            ThreadHolograph.currentThreadMirror(), generator, methodMirror.getDeclaringClass(),
                            vm.makeString(methodMirror.getName()),
                            Reflection.toArray(classClass, methodMirror.getParameterTypes()),
                            methodMirror.getReturnType(),
                            Reflection.toArray(classClass, methodMirror.getExceptionTypes()),
                            methodMirror.getModifiers());
                    ClassMirror newClass = duplicateAccessor.getClassMirror();

                    // Rename from whatever was generated to what we want.
                    byte[] generatedBytecode = newClass.getBytecode();
                    ClassWriter classWriter = new ClassWriter(ClassWriter.COMPUTE_MAXS);
                    ClassVisitor visitor = classWriter;
                    final String internalName = classMirror.getClassName().replace('.', '/');
                    final String generatedInternalName = newClass.getClassName().replace('.', '/');
                    visitor = new RemappingClassAdapter(visitor, new Remapper() {
                        @Override
                        public String map(String typeName) {
                            if (typeName.equals(generatedInternalName)) {
                                return internalName;
                            }
                            return super.map(typeName);
                        }
                    });
                    new ClassReader(generatedBytecode).accept(visitor, 0);
                    return classWriter.toByteArray();
                }
            }
        }
    } catch (IllegalAccessException e) {
        throw new RuntimeException(e);
    } catch (SecurityException e) {
        throw new RuntimeException(e);
    } catch (NoSuchMethodException e) {
        throw new RuntimeException(e);
    } catch (MirrorInvocationTargetException e) {
        throw new RuntimeException(e);
    }

    return null;
}

From source file:jtaint.RemappingMiscClassAdapter.java

License:Apache License

public RemappingMiscClassAdapter(final ClassVisitor cv, final Map typeMap) {
    super(cv, new Remapper() {
        public String map(String typeName) {
            if (typeMap.containsKey(typeName))
                return (String) typeMap.get(typeName);
            return typeName;
        }//from  ww  w  . j  a  va 2s. c  om
    });
}

From source file:jtaint.RemappingStringClassAdapter.java

License:Apache License

public RemappingStringClassAdapter(ClassVisitor cv) {
    super(cv, new Remapper() {
        public String map(String typeName) {
            if (stringMap.containsKey(typeName))
                return (String) stringMap.get(typeName);
            return typeName;
        }/*from   w w w .  j a  v a  2s  .c  o  m*/
    });
}