diff --git a/log4j.properties b/log4j.properties index 2c729b69..d5004a0b 100644 --- a/log4j.properties +++ b/log4j.properties @@ -1,4 +1,4 @@ -log4j.rootLogger=info, stdout, file +log4j.rootLogger=warn, stdout, file log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout @@ -8,3 +8,5 @@ log4j.appender.file=org.apache.log4j.FileAppender log4j.appender.file.File=romraider.log log4j.appender.file.layout=org.apache.log4j.PatternLayout log4j.appender.file.layout.ConversionPattern=%-5r %-5p [%t] - %m%n + +log4j.logger.com.romraider.util.proxy.TimeWrapper=trace diff --git a/src/com/romraider/io/j2534/api/J2534ConnectionManager.java b/src/com/romraider/io/j2534/api/J2534ConnectionManager.java index 67191105..2eed8f46 100644 --- a/src/com/romraider/io/j2534/api/J2534ConnectionManager.java +++ b/src/com/romraider/io/j2534/api/J2534ConnectionManager.java @@ -30,13 +30,15 @@ import static com.romraider.io.j2534.op20.OpenPort20.CONFIG_P4_MIN; import static com.romraider.io.j2534.op20.OpenPort20.FLAG_ISO9141_NO_CHECKSUM; import static com.romraider.io.j2534.op20.OpenPort20.PROTOCOL_ISO9141; import static com.romraider.util.ParamChecker.checkNotNull; +import static com.romraider.util.proxy.Proxifier.proxy; +import com.romraider.util.proxy.TimerWrapper; import org.apache.log4j.Logger; import static org.apache.log4j.Logger.getLogger; public final class J2534ConnectionManager implements ConnectionManager { private static final Logger LOGGER = getLogger(J2534ConnectionManager.class); // private final J2534 api = new Old_J2534OpenPort20(PROTOCOL_ISO9141); - private final J2534 api = new J2534OpenPort20(PROTOCOL_ISO9141); + private final J2534 api = proxy(new J2534OpenPort20(PROTOCOL_ISO9141), TimerWrapper.class); private int channelId; private int deviceId; private int msgId; diff --git a/src/com/romraider/util/proxy/Proxifier.java b/src/com/romraider/util/proxy/Proxifier.java new file mode 100644 index 00000000..59915f58 --- /dev/null +++ b/src/com/romraider/util/proxy/Proxifier.java @@ -0,0 +1,27 @@ +package com.romraider.util.proxy; + +import java.lang.reflect.Constructor; +import static java.lang.reflect.Proxy.newProxyInstance; + +public final class Proxifier { + public static T proxy(T t, Class cls) { + Wrapper wrapper = instantiate(cls, t); + return proxy(t, wrapper); + } + + private static T proxy(T t, Wrapper wrapper) { + Class cls = t.getClass(); + ClassLoader loader = cls.getClassLoader(); + Class[] interfaces = cls.getInterfaces(); + return (T) newProxyInstance(loader, interfaces, wrapper); + } + + private static Wrapper instantiate(Class wrapper, T t) { + try { + Constructor constructor = wrapper.getConstructor(Object.class); + return (Wrapper) constructor.newInstance(t); + } catch (Exception e) { + throw new RuntimeException(e); + } + } +} diff --git a/src/com/romraider/util/proxy/TimerWrapper.java b/src/com/romraider/util/proxy/TimerWrapper.java new file mode 100644 index 00000000..c01603ca --- /dev/null +++ b/src/com/romraider/util/proxy/TimerWrapper.java @@ -0,0 +1,33 @@ +package com.romraider.util.proxy; + +import static com.romraider.util.ParamChecker.checkNotNull; +import org.apache.log4j.Logger; +import static org.apache.log4j.Logger.getLogger; +import static java.lang.System.currentTimeMillis; +import java.lang.reflect.Method; + +public final class TimerWrapper implements Wrapper { + private static final Logger LOGGER = getLogger(TimerWrapper.class); + private final Object delegate; + + public TimerWrapper(Object delegate) { + checkNotNull(delegate); + this.delegate = delegate; + } + + public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { + long start = currentTimeMillis(); + try { + return method.invoke(delegate, args); + } finally { + long time = currentTimeMillis() - start; + log(method, time); + } + } + + private void log(Method method, long time) { + String c = delegate.getClass().getSimpleName(); + String m = method.getName(); + LOGGER.trace("[TIMER] - " + c + "." + m + ": " + time + "ms"); + } +} diff --git a/src/com/romraider/util/proxy/Wrapper.java b/src/com/romraider/util/proxy/Wrapper.java new file mode 100644 index 00000000..8afb113c --- /dev/null +++ b/src/com/romraider/util/proxy/Wrapper.java @@ -0,0 +1,6 @@ +package com.romraider.util.proxy; + +import java.lang.reflect.InvocationHandler; + +public interface Wrapper extends InvocationHandler { +}