WALA/com.ibm.wala.shrike/src/com/ibm/wala/shrike/instrumentation/CodeScraper.java

66 lines
2.2 KiB
Java

package com.ibm.wala.shrike.instrumentation;
import java.io.IOException;
import java.io.OutputStream;
import java.lang.instrument.ClassFileTransformer;
import java.lang.instrument.IllegalClassFormatException;
import java.lang.instrument.Instrumentation;
import java.nio.file.Files;
import java.nio.file.Path;
import java.security.ProtectionDomain;
import com.ibm.wala.shrikeCT.ClassReader;
import com.ibm.wala.shrikeCT.ClassReader.AttrIterator;
import com.ibm.wala.shrikeCT.InvalidClassFileException;
import com.ibm.wala.shrikeCT.SourceFileReader;
public class CodeScraper implements ClassFileTransformer {
private static final Path prefix;
static {
try {
prefix = Files.createTempDirectory("loggedClasses");
prefix.toFile().deleteOnExit();
} catch (final IOException problem) {
throw new RuntimeException(problem);
}
System.err.println("scraping to " + prefix);
}
@Override
public byte[] transform(ClassLoader loader, String className, Class<?> classBeingRedefined, ProtectionDomain protectionDomain,
byte[] classfileBuffer) throws IllegalClassFormatException {
try {
String sourceFile = null;
ClassReader reader = new ClassReader(classfileBuffer);
AttrIterator attrs = new ClassReader.AttrIterator();
reader.initClassAttributeIterator(attrs);
for (; attrs.isValid(); attrs.advance()) {
if (attrs.getName().equals("SourceFile")) {
SourceFileReader file = new SourceFileReader(attrs);
int index = file.getSourceFileCPIndex();
sourceFile = reader.getCP().getCPUtf8(index);
}
}
if (className == null || sourceFile == null || !sourceFile.endsWith("java") || true) try {
Path log = prefix.resolve(reader.getName() + ".class");
try (final OutputStream f = Files.newOutputStream(log)) {
f.write(classfileBuffer);
}
} catch (IOException e) {
assert false : e;
}
return classfileBuffer;
} catch (InvalidClassFileException e1) {
e1.printStackTrace();
throw new IllegalClassFormatException(e1.getLocalizedMessage());
}
}
public static void premain(Instrumentation inst) {
inst.addTransformer(new CodeScraper());
}
}