package com.yammer.telemetry.agent.handlers;
import com.yammer.telemetry.instrumentation.ClassInstrumentationHandler;
import javassist.CannotCompileException;
import javassist.ClassPool;
import javassist.CtClass;
import javassist.NotFoundException;
import java.io.IOException;
import java.util.logging.Logger;
public abstract class SubTypeInstrumentationHandler implements ClassInstrumentationHandler {
private static final Logger LOGGER = Logger.getLogger(SubTypeInstrumentationHandler.class.getName());
protected final String superTypeName;
private boolean enabled = true;
public SubTypeInstrumentationHandler(String superTypeName) {
this.superTypeName = superTypeName;
}
public boolean isEnabled() {
return enabled;
}
@Override
public final boolean transformed(CtClass cc, ClassPool pool) {
try {
if (canTransform(cc, pool)) {
return transform(cc, pool);
}
} catch (NotFoundException | CannotCompileException | IOException e) {
// Disable the handler for the remainder.
LOGGER.warning("Error instrumenting " + cc.getName() + ": " + e.toString() + " [" + getClass().getName() + "]");
enabled = false;
}
return false;
}
private boolean canTransform(CtClass cc, ClassPool pool) throws NotFoundException {
return isEnabled() && cc.subtypeOf(pool.get(superTypeName));
}
protected abstract boolean transform(CtClass cc, ClassPool pool) throws NotFoundException, CannotCompileException, IOException;
}