/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */
package org.apache.felix.ipojo;

import java.lang.reflect.Constructor;
import java.lang.reflect.Member;
import java.lang.reflect.Method;

/**
* Method interceptor.
* A class implementing this interface is able to be notified of method invocations (
* i.e. entries, exits, and errors).
* The listener needs to be register on the instance manager with the
* {@link InstanceManager#register(org.apache.felix.ipojo.parser.MethodMetadata, MethodInterceptor)}
* method.
* Events are sent before the method entry (onEntry), after the method returns (onExit),
* when an error is thrown by the method (onError), and before the after either a returns or an error (onFinally).
*
* Instead of a {@link Method} object, the callbacks received a {@link Member} object which can be either a {@link Method}
* or a {@link Constructor}.
* @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
*/
public interface MethodInterceptor {

    /**
     * This method is called when a thread enters in a method.
     * The given argument array is created from the method argument.
     * @param pojo the pojo on which the method is called.
     * @param method the invoked method.
     * @param args the arguments array.
     */
    void onEntry(Object pojo, Member method, Object[] args);

    /**
     * This method is called when the execution exits a method :
     * before a <code>return</code>.
     * If the given returned object is <code>null</code>, either the method is
     * <code>void</code>, or it returns <code>null</code>.
     * This method must not modify the returned object.
     * @param pojo the pojo on which the method exits.
     * @param method the exiting method.
     * @param returnedObj the the returned object (boxed for primitive type)
     */
    void onExit(Object pojo, Member method, Object returnedObj);

    /**
     * This method is called when the execution throws an exception in the given
     * method.
     * @param pojo the pojo on which the method was accessed.
     * @param method the invoked method.
     * @param throwable the thrown exception
     */
    void onError(Object pojo, Member method, Throwable throwable);

    /**
     * This method is called when the execution of a method is going to terminate :
     * just before to throw an exception or before to return.
     * (onError or onExit was already called).
     * @param pojo the pojo on which the method was accessed.
     * @param method the invoked method.
     */
    void onFinally(Object pojo, Member method);

}
