001 /* 002 * (c) 2003-2005, 2009, 2010 ThoughtWorks Ltd 003 * All rights reserved. 004 * 005 * The software in this package is published under the terms of the BSD 006 * style license a copy of which has been included with this distribution in 007 * the LICENSE.txt file. 008 * 009 * Created on 10-May-2004 010 */ 011 package com.thoughtworks.proxy.toys.decorate; 012 013 import java.io.Serializable; 014 import java.lang.reflect.Method; 015 016 /** 017 * Identity implementation for a Decorator. The implementation will just pass through any values. Override all methods 018 * that should behave differently. 019 * 020 * @author Dan North 021 * @since 1.0 022 */ 023 public abstract class Decorator<T> implements Serializable { 024 private static final long serialVersionUID = 1L; 025 026 /** 027 * Called before a method is invoked on an object, to possibly decorate the arguments being passed to the method 028 * invocation. 029 * 030 * @param proxy the proxy the method will be invoked on 031 * @param method the method to be invoked 032 * @param args the arguments being passed to the method 033 * @return the decorated arguments (typically just the ones supplied) 034 * @since 1.0 035 */ 036 public Object[] beforeMethodStarts(final T proxy, final Method method, final Object[] args) { 037 return args; 038 } 039 040 /** 041 * Called on the way back from a method invocation, to possibly decorate the result. 042 * 043 * @param proxy the proxy the method was be invoked on 044 * @param method the invoked method 045 * @param args the arguments passed to the method 046 * @param result the result of the method invocation 047 * @return the decorated result (typically just the supplied result) 048 * @since 1.0 049 */ 050 public Object decorateResult(final T proxy, final Method method, final Object[] args, final Object result) { 051 return result; 052 } 053 054 /** 055 * Called when a called method fails, to possibly decorate the type of error. 056 * 057 * @param proxy the proxy the method was be invoked on 058 * @param method the invoked method 059 * @param args the arguments passed to the method 060 * @param cause the original exception thrown 061 * @return the decorated exception (typically just the supplied cause) 062 * @since 1.0 063 */ 064 public Throwable decorateTargetException( 065 final T proxy, final Method method, final Object[] args, final Throwable cause) { 066 return cause; 067 } 068 069 /** 070 * Called when a method cannot be invoked, to possibly decorate the type of error. 071 * 072 * @param proxy the proxy the method was be invoked on 073 * @param method the invoked method 074 * @param args the arguments passed to the method 075 * @param cause the original exception thrown 076 * @return the decorated exception (typically just the supplied cause) 077 * @since 1.0 078 */ 079 public Exception decorateInvocationException( 080 final T proxy, final Method method, final Object[] args, final Exception cause) { 081 return cause; 082 } 083 }