001 // Copyright 2011 The Apache Software Foundation
002 //
003 // Licensed under the Apache License, Version 2.0 (the "License");
004 // you may not use this file except in compliance with the License.
005 // You may obtain a copy of the License at
006 //
007 // http://www.apache.org/licenses/LICENSE-2.0
008 //
009 // Unless required by applicable law or agreed to in writing, software
010 // distributed under the License is distributed on an "AS IS" BASIS,
011 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
012 // See the License for the specific language governing permissions and
013 // limitations under the License.
014
015 package org.apache.tapestry5.plastic;
016
017 import java.lang.reflect.Method;
018
019 /**
020 * A representation of the invocation of a method that allows the behavior of the method to be advised: either by
021 * changing parameter values, or by changing the return value, or by catch or throwing different exceptions. Provides
022 * access to annotations on the advised method.
023 *
024 * @see MethodAdvice
025 */
026 public interface MethodInvocation extends MethodInvocationResult, AnnotationAccess
027 {
028 /** The instance on which the method was originally invoked. */
029 Object getInstance();
030
031 InstanceContext getInstanceContext();
032
033 /**
034 * Proceed with the method invocation, either chaining into the next {@link MethodAdvice} added to the method, or
035 * ultimately into the actual method implementation. The method may throw a checked exception, which will be caught
036 * and be reported as {@link #didThrowCheckedException()}.
037 *
038 * @return this method invocation, for a fluent API
039 */
040 MethodInvocation proceed();
041
042 /**
043 * Overrides the return value of the method. The value provided will be cast to the actual return type
044 * (or, if the return type is a primitive value, the value will be cast to the corresponding wrapper type and then
045 * converted to a primitive).
046 * <p>
047 * Overriding the return value clears any checked exception.
048 *
049 * @param returnValue
050 * @return this method invocation, for a fluent API
051 * @throws NullPointerException
052 * if the method's return type is a primitive and null is provided
053 */
054 MethodInvocation setReturnValue(Object returnValue);
055
056 /**
057 * Returns the parameter at the given index. Primitive types will be wrapped as they are returned.
058 *
059 * @param index
060 * of parameter to access
061 * @return parameter value
062 */
063 Object getParameter(int index);
064
065 /**
066 * Changes a parameter value. The value will be cast to the parameter's type. For primitive types, the
067 * value will be cast to the corresponding wrapper type.
068 *
069 * @param index
070 * index of parameter to modify
071 * @param newValue
072 * new value for parameter
073 * @return this method invocation, for a fluent API
074 */
075 MethodInvocation setParameter(int index, Object newValue);
076
077 /**
078 * Sets the checked exception; this can be used to indicate failure for the method, or
079 * to cancel the thrown exception (by setting the exception to null).
080 *
081 * @param exception
082 * new checked exception, or null
083 * @return this method invocation, for a fluent API
084 */
085 MethodInvocation setCheckedException(Exception exception);
086
087 /** Returns the method being invoked. */
088 Method getMethod();
089 }