package org.pitest.mutationtest.mocksupport;
import java.lang.instrument.ClassFileTransformer;
import java.lang.instrument.IllegalClassFormatException;
import java.security.ProtectionDomain;
import org.objectweb.asm.ClassReader;
import org.objectweb.asm.ClassVisitor;
import org.objectweb.asm.ClassWriter;
import org.pitest.bytecode.FrameOptions;
import org.pitest.functional.F;
import org.pitest.functional.predicate.Predicate;
public class BendJavassistToMyWillTransformer implements ClassFileTransformer {
private final Predicate<String> filter;
private final F<ClassWriter,ClassVisitor> transformation;
public BendJavassistToMyWillTransformer(final Predicate<String> filter, F<ClassWriter,ClassVisitor> transformation) {
this.filter = filter;
this.transformation = transformation;
}
@Override
public byte[] transform(final ClassLoader loader, final String className,
final Class<?> classBeingRedefined,
final ProtectionDomain protectionDomain, final byte[] classfileBuffer)
throws IllegalClassFormatException {
if (shouldInclude(className)) {
final ClassReader reader = new ClassReader(classfileBuffer);
final ClassWriter writer = new ClassWriter(
FrameOptions.pickFlags(classfileBuffer));
reader.accept(transformation.apply(writer),
ClassReader.EXPAND_FRAMES);
return writer.toByteArray();
} else {
return null;
}
}
private boolean shouldInclude(final String className) {
return this.filter.apply(className);
}
}