package com.google.code.joto.eventrecorder.spy.calls; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Proxy; import org.apache.commons.collections.Transformer; import com.google.code.joto.eventrecorder.writer.RecordEventWriter; /** * adapter for commons-collection Transformer, to wrap object with java.lang.Proxy * for writing event request/response to a RecordEventWriter * using MethodEventWriterInvocationHandler */ public class MethodEventWriterProxyTransformer implements Transformer { protected RecordEventWriter eventWriter; private String eventType; private String requestEventSubType; private String responseEventSubType; private ObjectReplacementMap objectReplacementMap; // ------------------------------------------------------------------------ public MethodEventWriterProxyTransformer( RecordEventWriter eventWriter, ObjectReplacementMap objectReplacementMap ) { this(eventWriter, MethodCallEventUtils.METHODCALL_EVENT_TYPE, MethodCallEventUtils.REQUEST_EVENT_SUBTYPE, MethodCallEventUtils.RESPONSE_EVENT_SUBTYPE, objectReplacementMap); } public MethodEventWriterProxyTransformer( RecordEventWriter eventWriter, String eventType, String requestEventSubType, String responseEventSubType, ObjectReplacementMap objectReplacementMap ) { this.eventWriter = eventWriter; this.eventType = eventType; this.requestEventSubType = requestEventSubType; this.responseEventSubType = responseEventSubType; this.objectReplacementMap = objectReplacementMap; } // ------------------------------------------------------------------------ @Override public Object transform(Object obj) { Class<?> objClass = obj.getClass(); Class<?>[] objInterfaces = objClass.getInterfaces(); Object resProxy = createProxy(objInterfaces, obj); return resProxy; } public <T> T createProxy(Class<?>[] proxyInterfaces, T targetObjCallToRecord) { ClassLoader classLoader = targetObjCallToRecord.getClass().getClassLoader(); InvocationHandler h = new MethodEventWriterInvocationHandler(targetObjCallToRecord, eventWriter, eventType, requestEventSubType, responseEventSubType, objectReplacementMap); @SuppressWarnings("unchecked") T resProxy = (T) Proxy.newProxyInstance(classLoader, proxyInterfaces, h); return resProxy; } }