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    }