blob: e0231d89887f94149e0dd98e29d32f9b381a651e [file] [log] [blame]
/*
* 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.
*/
#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 <axutil_env.h>
#include <axis2_handler.h>
#include <axis2_handler_desc.h>
#include <axutil_array_list.h>
#include <axutil_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 */
typedef struct axis2_phase axis2_phase_t;
struct axis2_msg_ctx;
/**
* 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_EXTERN axis2_status_t AXIS2_CALL
axis2_phase_add_handler_at(
axis2_phase_t * phase,
const axutil_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_EXTERN axis2_status_t AXIS2_CALL
axis2_phase_add_handler(
axis2_phase_t * phase,
const axutil_env_t * env,
axis2_handler_t * handler);
/**
* Remove the given handler from 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_EXTERN axis2_status_t AXIS2_CALL
axis2_phase_remove_handler(
axis2_phase_t * phase,
const axutil_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_EXTERN axis2_status_t AXIS2_CALL
axis2_phase_invoke(
axis2_phase_t * phase,
const axutil_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
*/
AXIS2_EXTERN const axis2_char_t *AXIS2_CALL
axis2_phase_get_name(
const axis2_phase_t * phase,
const axutil_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
*/
AXIS2_EXTERN int AXIS2_CALL
axis2_phase_get_handler_count(
const axis2_phase_t * phase,
const axutil_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_EXTERN axis2_status_t AXIS2_CALL
axis2_phase_set_first_handler(
axis2_phase_t * phase,
const axutil_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_EXTERN axis2_status_t AXIS2_CALL
axis2_phase_set_last_handler(
axis2_phase_t * phase,
const axutil_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_EXTERN axis2_status_t AXIS2_CALL
axis2_phase_add_handler_desc(
axis2_phase_t * phase,
const axutil_env_t * env,
axis2_handler_desc_t * handler_desc);
/**
* Remove handler within the handler description from 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_EXTERN axis2_status_t AXIS2_CALL
axis2_phase_remove_handler_desc(
axis2_phase_t * phase,
const axutil_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_EXTERN axis2_status_t AXIS2_CALL
axis2_phase_insert_before(
axis2_phase_t * phase,
const axutil_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_EXTERN axis2_status_t AXIS2_CALL
axis2_phase_insert_after(
axis2_phase_t * phase,
const axutil_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_EXTERN axis2_status_t AXIS2_CALL
axis2_phase_insert_before_and_after(
axis2_phase_t * phase,
const axutil_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_EXTERN axis2_status_t AXIS2_CALL
axis2_phase_insert_handler_desc(
axis2_phase_t * phase,
const axutil_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_EXTERN axutil_array_list_t *AXIS2_CALL
axis2_phase_get_all_handlers(
const axis2_phase_t * phase,
const axutil_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_EXTERN axis2_status_t AXIS2_CALL
axis2_phase_invoke_start_from_handler(
axis2_phase_t * phase,
const axutil_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 void
*/
AXIS2_EXTERN void AXIS2_CALL
axis2_phase_free(
axis2_phase_t * phase,
const axutil_env_t * env);
/**
* 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 axutil_env_t * env,
const axis2_char_t * phase_name);
AXIS2_EXTERN axis2_status_t AXIS2_CALL
axis2_phase_increment_ref(
axis2_phase_t * phase,
const axutil_env_t * env);
#ifdef __cplusplus
}
#endif
#endif /* AXIS2_PHASE_H */