package de.twenty11.skysail.server.ext.osgi.monitor.agent.callback;
import java.util.HashMap;
import java.util.Map;
import javassist.ClassPool;
import javassist.CtMethod;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.ObjectWriter;
import de.twenty11.skysail.server.ext.osgi.monitor.agent.MethodIdentifier;
import de.twenty11.skysail.server.ext.osgi.monitor.agent.MethodInstrumentation;
import de.twenty11.skysail.server.ext.osgi.monitor.agent.callback.messages.RuntimeExceptionMessage;
import de.twenty11.skysail.server.ext.osgi.monitor.agent.descriptors.Param;
public abstract class OsgiMonitorCallback {
private static final Logger logger = LoggerFactory.getLogger(OsgiMonitorCallback.class);
private static Map<MethodIdentifier, MethodInstrumentation> methodCallbacks = new HashMap<MethodIdentifier, MethodInstrumentation>();
private CtMethod method;
protected static Logger agentLogger;
private static ObjectMapper objectMapper = new ObjectMapper();
private static ObjectWriter writer = objectMapper.writer().withDefaultPrettyPrinter();
private static boolean isOff = false;
// protected static StringBuilder handleParams(StringBuilder sb, Param[] params) {
// for (int i = 0; i < params.length; i++) {
// sb.append(params[i].toString());
// if (i < params.length - 1) {
// sb.append(",");
// }
// }
// return sb;
//
// }
// protected static String getLogMsgPrefix(String string, String methodName) {
// StringBuilder sb = new StringBuilder();
// sb.append("\"type\": \"").append(string).append("\", ").append("\"tstamp\": ").append(System.nanoTime())
// .append(", ").append("\"method\": \"").append(methodName).append("\",");
//
// return sb.toString();
// }
protected void refine(CtMethod method) {
this.method = method;
}
public CtMethod getMethod() {
return method;
}
public void instrument(String classIdentifier, CtMethod m, ClassPool classPool) throws Exception {
MethodIdentifier methodIdentifier = new MethodIdentifier(classIdentifier, m.getMethodInfo().getName(),
m.getSignature());
MethodInstrumentation methodCallback = methodCallbacks.get(methodIdentifier);
if (methodCallback == null) {
logger.error("no callback found for method {}", methodIdentifier);
}
methodCallback.instrument(m, classPool);
}
public void instrument(MethodIdentifier methodIdentifier, CtMethod m, ClassPool classPool) {
MethodInstrumentation methodCallback = methodCallbacks.get(methodIdentifier);
if (methodCallback == null) {
logger.error("no callback found for method {}", methodIdentifier);
}
methodCallback.instrument(m, classPool);
}
public void setAgentLogger(Logger agentlogger) {
OsgiMonitorCallback.agentLogger = agentlogger;
}
protected static void logJson(Object obj) {
if (isOff) {
return;
}
try {
String msg = writer.writeValueAsString(obj);
agentLogger.info(msg);
} catch (Exception e) {
e.printStackTrace();
}
}
protected static void logErrorJson(Object obj) {
if (isOff) {
return;
}
try {
String msg = writer.writeValueAsString(obj);
agentLogger.error(msg);
} catch (Exception e) {
e.printStackTrace();
}
}
protected static void addMethodCallback(MethodIdentifier methodIdentifier, MethodInstrumentation methodCallback) {
methodCallbacks.put(methodIdentifier, methodCallback);
}
public static void setOff() {
OsgiMonitorCallback.isOff = true;
}
public static void setOn() {
OsgiMonitorCallback.isOff = false;
}
}