/*
* Copyright 2004,2005 The Apache Software Foundation.
*
* Licensed 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.
*/

#ifndef AXIS2_PHASE_H
#define AXIS2_PHASE_H

/**
 * @defgroup axis2_phase phases
 * @ingroup axis2_engine
 * phase is a logical unit of execution in the Axis2 engine's execution flows.
 * A phase encapsulates one or more handlers in a given sequence to be invoked. 
 * The sequencing of handlers within a phase are often defined by module 
 * configuration which specifies where in the phase's handler chain a given 
 * handler should be placed.
 * Calling invoke on phase triggers invoke on the handlers stored within the 
 * phase in the sequence they are ordered. 
 * @{
 */

/**
 * @file axis2_phase.h
 */

#include <axis2_defines.h>
#include <axis2_env.h>
#include <axis2_handler.h>
#include <axis2_handler_desc.h>
#include <axis2_array_list.h>
#include <axis2_qname.h>

/** 
 * A given handler's location within the list of handlers is before a particular
 * handler and after another particular handler. 
 */
#define AXIS2_PHASE_BOTH_BEFORE_AFTER  0

/** 
 * A given handler's location within the list of handlers is before another 
 * given handler.
 */
#define AXIS2_PHASE_BEFORE  1

/** 
 * A given handler's location within the list of handlers is after another 
 * given handler.
 */
#define AXIS2_PHASE_AFTER  2

/** 
 * A given handler's location within the list of handlers could be anywhere in
 * the list.
 */
#define AXIS2_PHASE_ANYWHERE  3

#ifdef __cplusplus
extern "C"
{
#endif

    /** Type name for axis2_phase_ops */
    typedef struct axis2_phase_ops axis2_phase_ops_t;
    /** Type name for axis2_phase */
    typedef struct axis2_phase axis2_phase_t;
        
    struct axis2_msg_ctx;

    /**
     * phase ops struct.
     * Encapsulator struct for operations of axis2_phase.
     */
    struct axis2_phase_ops
    {
        /**
         * Adds given handler to the specified position in the handler array list.
         * @param phase pointer to phase struct
         * @param env pointer to environment struct
         * @param index index
         * @param handler pointer to handler, phase does not assume the 
         * ownership of the handler
         * @return AXIS2_SUCCESS on success, else AXIS2_FAILURE 
         */
        axis2_status_t (AXIS2_CALL *
                add_handler_at)(
                    axis2_phase_t *phase,
                    const axis2_env_t *env,
                    const int index,
                    axis2_handler_t *handler);
        
        /**
         * Adds the given handler to the end of the handler list.
         * @param phase pointer to phase
         * @param env pointer to environment struct
         * @param handler pointer to handler, phase does not assume the 
         * ownership of the handler 
         * @return AXIS2_SUCCESS on success, else AXIS2_FAILURE 
         */
        axis2_status_t (AXIS2_CALL *
                add_handler)(
                    axis2_phase_t *phase,
                    const axis2_env_t *env,
                    axis2_handler_t *handler);
                    
         /**
          * Invokes the phase. This function will in turn call invoke method of
          * each handler in the handler list, in sequence, starting from the 
          * beginning of the list to the end of the list.
          * @param phase pointer to phase
          * @param env pointer to environment struct
          * @param msg_ctx pointer to message context
          * @return AXIS2_SUCCESS on success, else AXIS2_FAILURE 
          */
        axis2_status_t (AXIS2_CALL *
                invoke)(
                    axis2_phase_t *phase,
                    const axis2_env_t *env,
                    struct axis2_msg_ctx *msg_ctx);
        /**
         * Gets phase name.
         * @param phase pointer to phase
         * @param env pointer to environment struct
         * @return returns name of phase
         */
        const axis2_char_t *(AXIS2_CALL *
                get_name)(
                    const axis2_phase_t *phase,
                    const axis2_env_t *env);

        /**
         * Gets handler count in the handler list.
         * @param phase pointer to phase
         * @param env pointer to environment struct
         * @return the number of handlers in the handler list
         */
        int (AXIS2_CALL *
                get_handler_count)( 
                    const axis2_phase_t *phase,
                    const axis2_env_t *env);

        /**
         * Sets the first handler in the handler list.
         * @param phase pointer to phase
         * @param env pointer to environment struct
         * @param handler pointer to handler, phase does not assume the 
         * ownership of the handler
         * @return AXIS2_SUCCESS on success, else AXIS2_FAILURE 
         */
        axis2_status_t (AXIS2_CALL *
                set_first_handler)(
                    axis2_phase_t *phase,
                    const axis2_env_t *env,
                    axis2_handler_t *handler);
                    
        /**
         * Sets the last handler in the handler list.
         * @param phase pointer to phase
         * @param env pointer to environment struct
         * @param handler pointer to handler, phase does not assume the 
         * ownership of the handler
         * @return AXIS2_SUCCESS on success, else AXIS2_FAILURE 
         */
        axis2_status_t (AXIS2_CALL *
                set_last_handler)(  
                    axis2_phase_t *phase,
                    const axis2_env_t *env,
                    axis2_handler_t *handler);
                    
        /**
         * Adds handler within the handler description to the list of handlers 
         * in the phase.
         * @param phase pointer to phase
         * @param env pointer to environment struct
         * @param handler_desc pointer to handler description, phase does not 
         * assume the ownership of neither the handler description not the handler
         * within the handler description
         * @return AXIS2_SUCCESS on success, else AXIS2_FAILURE 
         */
        axis2_status_t (AXIS2_CALL *
                add_handler_desc)(
                    axis2_phase_t *phase,
                    const axis2_env_t *env,
                    axis2_handler_desc_t *handler_desc);
                    
        /**
         * Inserts the handler into handler list of the phase based on the phase
         * rules associated with the handler. This function takes into account 
         * the before rules of the handler. Before rules specify the location
         * of a current handler in the handler list, before which the given 
         * handler is to be placed.
         * @param phase pointer to phase
         * @param env pointer to environment struct
         * @param handler pointer to handler, phase does not assume the 
         * ownership of the handler
         * @return AXIS2_SUCCESS on success, else AXIS2_FAILURE 
         */
        axis2_status_t (AXIS2_CALL *
                insert_before)(
                    axis2_phase_t *phase,
                    const axis2_env_t *env,
                    axis2_handler_t *handler);

        /**
         * Inserts the handler into handler list of the phase based on the phase
         * rules associated with the handler. This function takes into account 
         * the after rules of the handler. After rules specify the location
         * of a current handler in the handler list, after which the given 
         * handler is to be placed.
         * @param phase pointer to phase
         * @param env pointer to environment struct
         * @param handler pointer to handler, phase does not assume the 
         * ownership of the handler
         * @return AXIS2_SUCCESS on success, else AXIS2_FAILURE 
         */
        axis2_status_t (AXIS2_CALL *
                insert_after)(
                    axis2_phase_t *phase,
                    const axis2_env_t *env,
                    axis2_handler_t *handler);

        /**
         * Inserts the handler into handler list of the phase based on both 
         * before and after phase rules associated with the handler. 
         * This method assume that both the before and after cannot be the same 
         * handler . That condition is not checked by this function. 
         * It should be checked before calling this function
         * @param phase pointer to phase
         * @param env pointer to environment struct
         * @param handler pointer to handler, phase does not assume the 
         * ownership of the handler
         * @return AXIS2_SUCCESS on success, else AXIS2_FAILURE 
         */
        axis2_status_t (AXIS2_CALL *
                insert_before_and_after)(
                    axis2_phase_t *phase,
                    const axis2_env_t *env,
                    axis2_handler_t *handler);

        /**
         * Inserts the handler to the correct location in the handler list of 
         * the phase. Location is evaluated based on the phase rules.
         * @param phase pointer to phase
         * @param env pointer to environment struct
         * @param handler_desc pointer to handler description, phase does not 
         * assume the ownership of neither the handler description not the handler
         * within the handler description
         * @return AXIS2_SUCCESS on success, else AXIS2_FAILURE 
         */
        axis2_status_t (AXIS2_CALL *
                insert_handler_desc)(
                    axis2_phase_t *phase,
                    const axis2_env_t *env,
                    axis2_handler_desc_t *handler_desc);

        /**
         * Gets all the handlers in the phase.
         * @param phase pointer to phase
         * @param env pointer to environment struct
         * @return pointer to array list containing the list of handlers
         */
        axis2_array_list_t *(AXIS2_CALL *
                get_all_handlers)(
                    const axis2_phase_t *phase,
                    const axis2_env_t *env);

        /**
         * Invokes handlers starting from the given handler index.
         * @param phase pointer to phase
         * @param env pointer to environment struct
         * @param paused_handler_index index of the handler to start the 
         * invocation from
         * @param msg_ctx pointer to message context
         * @return AXIS2_SUCCESS on success, else AXIS2_FAILURE 
         */
        axis2_status_t (AXIS2_CALL *
                invoke_start_from_handler)(
                    axis2_phase_t *phase,
                    const axis2_env_t *env,
                    const int paused_handler_index,
                    struct axis2_msg_ctx *msg_ctx);

        /**
         * Frees phase struct.
         * @param phase pointer to phase
         * @param env pointer to environment struct
         * @return AXIS2_SUCCESS on success, else AXIS2_FAILURE 
         */
        axis2_status_t (AXIS2_CALL *
                free)(
                    axis2_phase_t *phase,
                    const axis2_env_t *env);

    };

    /**
     * phase struct.
     */
    struct axis2_phase
    {
        /** operations of phase */
        axis2_phase_ops_t *ops;
    };


    /**
     * creates phase struct instance.
     * @param env pointer to environment struct
     * @param phase_name name of the phase to be created
     * @return pointer to newly created phase
     */
    AXIS2_EXTERN axis2_phase_t *AXIS2_CALL
    axis2_phase_create(
            const axis2_env_t *env,
            const axis2_char_t *phase_name);

/** Add handler at a given location to the phase's list of handlers.
    @sa axis2_phase_ops#add_handler_at */
#define AXIS2_PHASE_ADD_HANDLER_AT(phase, env, index, handler) \
      ((phase)->ops->add_handler_at(phase, env, index, handler))

/** Adds the given handler to the end of the handler list.
    @sa axis2_phase_ops#add_handler */
#define AXIS2_PHASE_ADD_HANDLER(phase, env, handler) \
      ((phase)->ops->add_handler(phase, env, handler))

/** Adds the handler within given handler description to the handler list.
    @sa axis2_phase_ops#add_handler_desc */
#define AXIS2_PHASE_ADD_HANDLER_DESC(phase, env, handler_desc) \
      ((phase)->ops->add_handler_desc(phase, env, handler_desc))

/** 
 * Invokes phase, this method will call invoke of all the handlers in the list 
 * in sequence.
 * @sa axis2_phase_ops#invoke */
#define AXIS2_PHASE_INVOKE(phase, env, msg_ctx) \
       ((phase)->ops->invoke(phase, env, msg_ctx))

/** Gets phase name.
    @sa axis2_phase_ops#set_name */
#define AXIS2_PHASE_GET_NAME(phase, env) \
      ((phase)->ops->get_name(phase, env))

/** Gets handler count.
    @sa axis2_phase_ops#get_handler_count */
#define AXIS2_PHASE_GET_HANDLER_COUNT(phase, env) \
      ((phase)->ops->get_handler_count(phase, env))

/** Sets the first handler.
    @sa axis2_phase_ops#set_first_handler */
#define AXIS2_PHASE_SET_FIRST_HANDLER(phase, env, handler) \
      ((phase)->ops->set_first_handler(phase, env, handler))

/** Sets the last handler of the handler list.
    @sa axis2_phase_ops#set_last_handler */
#define AXIS2_PHASE_SET_LAST_HANDLER(phase, env, handler) \
      ((phase)->ops->set_last_handler(phase, env, handler))

/** Inserts given handler based on the before phase rules of the handler.
    @sa axis2_phase_ops#insert_before */
#define AXIS2_PHASE_INSERT_BEFORE(phase, env, handler) \
      ((phase)->ops->insert_before(phase, env, handler))

/** Inserts given handler based on the after phase rules of the handler.
    @sa axis2_phase_ops#insert_after */
#define AXIS2_PHASE_INSERT_AFTER(phase, env, handler) \
      ((phase)->ops->insert_after(phase, env, handler))

/** Inserts given handler based on the both before and after  phase rules of 
    the handler. 
    @sa axis2_phase_ops#insert_before_and_after */
#define AXIS2_PHASE_INSERT_BEFORE_AND_AFTER(phase, env, handler) \
      ((phase)->ops->insert_before_and_after(phase, env, handler))

/** Inserts the handler within given handler description to the handler list. 
    @sa axis2_phase_ops#insert_handler_desc */
#define AXIS2_PHASE_INSERT_HANDLER_DESC(phase, env, handler_desc) \
      ((phase)->ops->insert_handler_desc(phase, env, handler_desc))

/** Gets all handlers as an array list.
    @sa axis2_phase_ops#get_all_handlers */
#define AXIS2_PHASE_GET_ALL_HANDLERS(phase, env) \
      ((phase)->ops->get_all_handlers(phase, env))

/** Invoke phase starting from given handler.
    @sa axis2_phase_ops#invoke_start_from_handler */
#define AXIS2_PHASE_INVOKE_START_FROM_HANDLER(phase, env, paused_handler_index, \
        msg_ctx) \
      ((phase)->ops->invoke_start_from_handler(phase, env, paused_handler_index, \
        msg_ctx))

/** Frees phase struct.
    @sa axis2_phase_ops#free */
#define AXIS2_PHASE_FREE(phase, env) \
      ((phase)->ops->free(phase, env))

    /** @} */

#ifdef __cplusplus
}
#endif

#endif    /* AXIS2_PHASE_H */
