package org.openrdf.repository.object.helpers;
import java.io.PrintStream;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import org.openrdf.model.BNode;
import org.openrdf.model.Literal;
import org.openrdf.model.URI;
import org.openrdf.repository.RepositoryConnection;
public class ConnectionRecorder implements InvocationHandler {
public static RepositoryConnection wrap(RepositoryConnection conn) {
InvocationHandler handler = new ConnectionRecorder(conn);
ClassLoader cl = Thread.currentThread().getContextClassLoader();
Class<?>[] faces = new Class<?>[]{RepositoryConnection.class};
return (RepositoryConnection) Proxy.newProxyInstance(cl, faces, handler);
}
private RepositoryConnection conn;
private PrintStream out = System.out;
public ConnectionRecorder(RepositoryConnection conn) {
this.conn = conn;
}
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
String name = method.getName();
if (!name.startsWith("is") && !name.startsWith("get")) {
out.print("conn.");
out.print(name);
out.print("(");
if (args != null) {
for (int i=0; i<args.length; i++) {
if (i > 0) {
out.print(",");
}
print(args[i]);
}
}
out.println(");");
}
return method.invoke(conn, args);
}
private void print(Object object) {
if (object instanceof Object[]) {
out.print("new ");
out.print(object.getClass().getComponentType().getSimpleName());
out.print("[]{");
Object[] ar = (Object[]) object;
for (int i=0; i<ar.length; i++) {
if (i > 0) {
out.print(",");
}
print(ar[i]);
}
out.print("}");
} else if (object instanceof URI) {
out.print("new URIImpl(\"");
out.print(object);
out.print("\")");
} else if (object instanceof BNode) {
BNode bnode = (BNode) object;
out.print("new BNodeImpl(\"");
out.print(bnode.getID());
out.print("\")");
} else if (object instanceof Literal) {
Literal lit = (Literal) object;
out.print("new LiteralImpl(");
out.print(lit.toString());
out.print(")");
} else {
out.print(object);
}
}
}