package com.yammer.telemetry.agent.jdbc;
import com.yammer.telemetry.agent.handlers.SubTypeInstrumentationHandler;
import javassist.*;
import java.io.IOException;
public class JdbcDriverClassHandler extends SubTypeInstrumentationHandler {
public JdbcDriverClassHandler() {
super("java.sql.Driver");
}
@Override
protected boolean transform(CtClass cc, ClassPool pool) throws NotFoundException, CannotCompileException, IOException {
CtMethod connect;
try {
connect = cc.getDeclaredMethod("connect", new CtClass[]{pool.get("java.lang.String"), pool.get("java.util.Properties")});
if (Modifier.isAbstract(connect.getModifiers())) {
// Don't modify abstract connect() methods.
return false;
}
} catch (NotFoundException e) {
// This is okay, it just means this particular driver doesn't have a connect(String, Properties).
return false;
}
// Copy the method to a uniquely named location that won't conflict with anything.
CtMethod copiedConnect = CtNewMethod.copy(connect, cc.makeUniqueName("connect"), cc, null);
copiedConnect.setModifiers(Modifier.PRIVATE);
cc.addMethod(copiedConnect);
pool.importPackage("com.yammer.telemetry.agent.jdbc");
connect.setBody("{ return new InstrumentedConnection($1, $proceed($$)); }", "this", copiedConnect.getName());
return true;
}
}