package de.twenty11.skysail.server.ext.osgi.monitor.agent.instrumentation.bundlecontext;
import javassist.ClassPool;
import javassist.CtMethod;
import javassist.bytecode.LocalVariableAttribute;
import javassist.bytecode.MethodInfo;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import de.twenty11.skysail.server.ext.osgi.monitor.agent.MethodInstrumentation;
public class RegisterServiceInstrumentation extends MethodInstrumentation {
private static final Logger logger = LoggerFactory.getLogger(MethodInstrumentation.class);
public RegisterServiceInstrumentation(String callbackClassName, String callbackMethodName) {
super(callbackClassName, callbackMethodName);
}
@Override
public void instrument(CtMethod m, ClassPool classPool) {
super.instrument(m, classPool);
// MethodInfo methodInfo = m.getMethodInfo();
//
// LocalVariableAttribute table = (LocalVariableAttribute) methodInfo.getCodeAttribute().getAttribute(
// javassist.bytecode.LocalVariableAttribute.tag);
//
// int index = 2;
// String first = getVariableName(index++, methodInfo, table);
// String second = getVariableName(index++, methodInfo, table);
// String third = getVariableName(index++, methodInfo, table);
//
// String code = null;
// String methodName = m.getName();
//
// code = getInsertBefore(callbackClassName, callbackMethodName,
// Param.fromObject("this"), Param.fromObject(first), Param.fromObject(second), Param.fromObject(third));
//
// logger.info(code);
// try {
// m.insertBefore(code);
// } catch (Exception e) {
// e.printStackTrace();
// }
insertBeforeMethod(defaultBeforeCode(callbackClassName, m));
insertCatchMethod(defaultCatchCode(m, callbackMethodName, classPool));
}
private String getVariableName(int index, MethodInfo methodInfo, LocalVariableAttribute table) {
int frameWithNameAtConstantPool = table.nameIndex(index);
String variableName = methodInfo.getConstPool().getUtf8Info(frameWithNameAtConstantPool);
return variableName;
}
}