/*
 * 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_HANDLER_DESC_H
#define AXIS2_HANDLER_DESC_H

/**
 * @defgroup axis2_handler_desc handler description
 * @ingroup axis2_desc
 * handler description captures information on a handler. Each handler in the 
 * system has an associated handler description. Deployment engine would create 
 * handler descriptions based on configuration information. When handlers are 
 * loaded from shared libraries, the information captured in handler description
 * would be used.
 * @{
 */

/**
 * @file axis2_handler_desc.h
 */

#include <axis2_utils_defines.h>
#include <axis2_qname.h>
#include <axis2_param.h>
#include <axis2_param_container.h>
#include <axis2_phase_rule.h>
#include <axis2_handler.h>

#ifdef __cplusplus
extern "C"
{
#endif

    /** Type name for struct axis2_handler_desc */
    typedef struct axis2_handler_desc axis2_handler_desc_t;
    /** Type name for struct axis2_handler_desc_ops  */
    typedef struct axis2_handler_desc_ops axis2_handler_desc_ops_t;

    /**
     * handler description ops struct.
     * Encapsulator struct for ops of axis2_handler_desc.
     */
    struct axis2_handler_desc_ops
    {
        /**
         * Gets QName.
         * @param handler_desc pointer to handler description
         * @param env pointer to environment struct
         * @return pointer to QName, returns a reference, not a cloned copy
         */
        const axis2_qname_t *(AXIS2_CALL *
                get_qname)(
                    const axis2_handler_desc_t *handler_desc,
                    const axis2_env_t *env);

        /**
         * Sets QName.
         * @param handler_desc pointer to handler description
         * @param env pointer to environment struct
         * @param qname pointer to QName, handler description creates a clone
         * of QName
         * @return AXIS2_SUCCESS on success, else AXIS2_FAILURE
         */
        axis2_status_t (AXIS2_CALL *
                set_qname)(
                    axis2_handler_desc_t *handler_desc,
                    const axis2_env_t *env,
                    const axis2_qname_t *qname);

        /**
         * Gets phase rules.
         * @param handler_desc pointer to handler description
         * @param env pointer to environment struct
         * @return pointer to phase rule struct containing phase rules
         */
        axis2_phase_rule_t *(AXIS2_CALL *
                get_rules)(
                    const axis2_handler_desc_t *handler_desc,
                    const axis2_env_t *env);

        /**
         * Sets phase rules.
         * @param handler_desc pointer to handler description
         * @param env pointer to environment struct
         * @param phase_rule pointer to phase rule struct, handler description
         * assumes ownership of the struct
         * @return AXIS2_SUCCESS on success, else AXIS2_FAILURE
         */
        axis2_status_t (AXIS2_CALL *
                set_rules)(
                    axis2_handler_desc_t *handler_desc,
                    const axis2_env_t *env,
                    axis2_phase_rule_t *phase_rule);

        /**
         * Gets named parameter.
         * @param handler_desc pointer to handler description
         * @param env pointer to environment struct
         * @param name parameter name string 
         * @return pointer to parameter if found, else NULL. Return a reference
         * not a cloned copy
         */
        axis2_param_t *(AXIS2_CALL *
                get_param)(
                    const axis2_handler_desc_t *handler_desc,
                    const axis2_env_t *env,
                    const axis2_char_t *name);

        /**
         * Adds given parameter to the parameter list.
         * @param handler_desc pointer to handler description
         * @param env pointer to environment struct
         * @param param pointer to param
         * @return AXIS2_SUCCESS on success, else AXIS2_FAILURE
         */
        axis2_status_t (AXIS2_CALL *
                add_param)(
                    axis2_handler_desc_t *handler_desc,
                    const axis2_env_t *env,
                    axis2_param_t *param);

        /**
         * Gets all parameters stored within handler description.
         * @param handler_desc pointer to handler description
         * @param env pointer to environment struct
         * @return pointer to array list containing parameters, returns a 
         * reference, not a cloned copy
         */
        axis2_array_list_t *(AXIS2_CALL *
                get_all_params)(
                    const axis2_handler_desc_t *handler_desc,
                    const axis2_env_t *env);

        /**
         * Checks if the named parameter is locked at any level
         * @param handler_desc pointer to handler description
         * @param env pointer to environment struct
         * @param param_name parameter name string 
         * @return AXIS2_TRUE if the parameter is locked, else AXIS2_FALSE
         */
        axis2_bool_t (AXIS2_CALL *
                is_param_locked)(
                    const axis2_handler_desc_t *handler_desc,
                    const axis2_env_t *env, 
                    const axis2_char_t *param_name);

        /**
         * Gets the handler associated with the handler description.
         * @param handler_desc pointer to handler description
         * @param env pointer to environment struct
         * @return pointer to handler, returns a reference, not a cloned copy
         */
        axis2_handler_t *(AXIS2_CALL *
                get_handler)(
                    const axis2_handler_desc_t *handler_desc,
                    const axis2_env_t *env);

        /**
         * Sets the handler associated with the handler description.
         * @param handler_desc pointer to handler description
         * @param env pointer to environment struct
         * @param handler pointer to handler, handler description assumes
         * the ownership of the handler
         * @return AXIS2_SUCCESS on success, else AXIS2_FAILURE
         */
        axis2_status_t (AXIS2_CALL *
                set_handler)(
                    axis2_handler_desc_t *handler_desc,
                    const axis2_env_t *env,
                    axis2_handler_t *handler);

        /**
         * Gets the class name. Class name is the name of the shared library 
         * file that contains the implementation of the handler.
         * @param handler_desc pointer to handler description
         * @param env pointer to environment struct
         * @return class name string
         */
        const axis2_char_t *(AXIS2_CALL *
                get_class_name)(
                    const axis2_handler_desc_t *handler_desc,
                    const axis2_env_t *env);

        /**
         * Sets the class name. Class name is the name of the shared library 
         * file that contains the implementation of the handler.
         * @param handler_desc pointer to handler description
         * @param env pointer to environment struct
         * @param class_name class name string
         * @return AXIS2_SUCCESS on success, else AXIS2_FAILURE
         */
        axis2_status_t (AXIS2_CALL *
                set_class_name)(
                    axis2_handler_desc_t *handler_desc,
                    const axis2_env_t *env,
                    const axis2_char_t *class_name);

        /**
         * Gets the parent. Parent of handler description is of type parameter
         * container.
         * @param handler_desc pointer to handler description
         * @param env pointer to environment struct
         * @return pointer to parent parameter container, returns a reference,
         * not a cloned copy
         */
        axis2_param_container_t *(AXIS2_CALL *
                get_parent)(
                    const axis2_handler_desc_t *handler_desc,
                    const axis2_env_t *env);

        /**
         * Gets the parent. Parent of handler description is of type parameter
         * container.
         * @param handler_desc pointer to handler description
         * @param env pointer to environment struct
         * @param parent pointer to parent parameter container struct, handler
         * description assumes ownership of struct
         * @return AXIS2_SUCCESS on success, else AXIS2_FAILURE
         */
        axis2_status_t (AXIS2_CALL *
                set_parent)(
                    axis2_handler_desc_t *handler_desc,
                    const axis2_env_t *env,
                    axis2_param_container_t *parent);

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

    };

    /**
     * handler description struct
     */
    struct axis2_handler_desc
    {
        /** handler description related ops */
        axis2_handler_desc_ops_t *ops;

        /** parameter container */
        axis2_param_container_t *param_container;

    };


    /**
     * Creates handler description struct instance.
     * @param env pointer to env pointer to environment struct
     * @param qname pointer to QName of handler, can be NULL, create function 
     * clones this    
     * @return pointer to newly created handler description struct
     */
    AXIS2_EXTERN axis2_handler_desc_t *AXIS2_CALL
    axis2_handler_desc_create_with_qname(
        const axis2_env_t *env, 
        const axis2_qname_t *qname);

/** Gets handler associated with handler description.
    @sa axis2_handler_desc_ops#get_handler */
#define AXIS2_HANDLER_DESC_GET_HANDLER(handler_desc, env) \
        ((handler_desc)->ops->get_handler(handler_desc, env))

/** Sets handler associated with handler description.
    @sa axis2_handler_desc_ops#set_handler */
#define AXIS2_HANDLER_DESC_SET_HANDLER(handler_desc, env, handler) \
        ((handler_desc)->ops->set_handler(handler_desc, env, handler))

/** Gets rules.
    @sa axis2_handler_desc_ops#get_rules */
#define AXIS2_HANDLER_DESC_GET_RULES(handler_desc, env) \
        ((handler_desc)->ops->get_rules(handler_desc, env))

/** Sets rules.
    @sa axis2_handler_desc_ops#set_rules */
#define AXIS2_HANDLER_DESC_SET_RULES(handler_desc, env, rules) \
        ((handler_desc)->ops->set_rules(handler_desc, env, rules))

/** Gets QName.
    @sa axis2_handler_desc_ops#get_qname */
#define AXIS2_HANDLER_DESC_GET_QNAME(handler_desc, env) \
        ((handler_desc)->ops->get_qname(handler_desc, env))

/** Sets QName.
    @sa axis2_handler_desc_ops#set_qname */
#define AXIS2_HANDLER_DESC_SET_QNAME(handler_desc, env, name) \
        ((handler_desc)->ops->set_qname(handler_desc, env, name))

/** Gets parameter with given name.
    @sa axis2_handler_desc_ops#get_param */
#define AXIS2_HANDLER_DESC_GET_PARAM(handler_desc, env, name) \
        ((handler_desc)->ops->get_param(handler_desc, env, name))

/** Adds parameter to parameter list.
    @sa axis2_handler_desc_ops#add_param */
#define AXIS2_HANDLER_DESC_ADD_PARAM(handler_desc, env, param) \
        ((handler_desc)->ops->add_param(handler_desc, env, param))

/** Gets class name of handler.
    @sa axis2_handler_desc_ops#get_class_name */
#define AXIS2_HANDLER_DESC_GET_CLASS_NAME(handler_desc, env) \
        ((handler_desc)->ops->get_class_name(handler_desc, env))

/** Sets class name of handler.
    @sa axis2_handler_desc_ops#set_class_name */
#define AXIS2_HANDLER_DESC_SET_CLASS_NAME(handler_desc, env, class_name) \
        ((handler_desc)->ops->set_class_name(handler_desc, env, class_name))

/** Gets parent.
    @sa axis2_handler_desc_ops#get_parent */
#define AXIS2_HANDLER_DESC_GET_PARENT(handler_desc, env) \
        ((handler_desc)->ops->get_parent(handler_desc, env))

/** Sets parent.
    @sa axis2_handler_desc_ops#set_parent */
#define AXIS2_HANDLER_DESC_SET_PARENT(handler_desc, env, parent) \
        ((handler_desc)->ops->set_parent(handler_desc, env, parent))

/** Frees handler description.
    @sa axis2_handler_desc_ops#free */
#define AXIS2_HANDLER_DESC_FREE(handler_desc, env) \
        ((handler_desc)->ops->free(handler_desc, env))

/** @} */

#ifdef __cplusplus
}
#endif

#endif    /* AXIS2_HANDLER_DESC_H */
