package com.highway2urhell.transformer;
import java.lang.instrument.ClassFileTransformer;
import java.lang.instrument.IllegalClassFormatException;
import java.security.ProtectionDomain;
import java.util.List;
import java.util.Map;
import com.highway2urhell.CoreEngine;
import com.highway2urhell.domain.EntryPathData;
import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtMethod;
import javassist.LoaderClassPath;
public class LineNumberEntryPointTransformer implements ClassFileTransformer {
private Map<String, List<EntryPathData>> mapToTransform = null;
public LineNumberEntryPointTransformer(Map<String, List<EntryPathData>> mapTransform) {
mapToTransform = mapTransform;
}
public byte[] transform(ClassLoader loader, String className,
Class<?> classBeingRedefined, ProtectionDomain protectionDomain,
byte[] classfileBuffer) throws IllegalClassFormatException {
String classNameToTransform = null;
if (!mapToTransform.get(className).isEmpty()) {
try {
List<EntryPathData> listbd = mapToTransform.get(className);
ClassPool cp = ClassPool.getDefault();
cp.appendClassPath(new LoaderClassPath(loader));
classNameToTransform = listbd.get(0).getClassName();
CtClass cc = cp.get(classNameToTransform);
for (EntryPathData entry : listbd) {
getLineNumber(entry, cc);
}
} catch (Exception ex) {
System.err.println("Fail to Transform " + classNameToTransform+ ex);
}
}
return classfileBuffer;
}
private void getLineNumber(EntryPathData entry, CtClass cc) {
System.out.println(
"Going to Transform insertCodeWithPerf "+entry.getClassName()+"with methodName "+ entry.getMethodName()+" and signature "+entry.getSignatureName());
CtMethod m;
try {
m = cc.getMethod(entry.getMethodName(), entry.getSignatureName());
int lineNumber = m.getMethodInfo().getLineNumber(0);
entry.setLineNumber(Integer.valueOf(lineNumber));
// Update the data
CoreEngine.getInstance().updateLineNumberEntryPoint(entry);
} catch (Exception e) {
System.err.println("Error during read line number Code for className " + entry.getClassName() + " and methodName " + entry.getMethodName() + " fails msg "+e);
}
}
}