/*
 * 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_SVC_H
#define AXIS2_SVC_H

/**
  * @file axis2_svc.h
  * @brief axis2 service interface
  */

#include <axis2_param_container.h>
#include <axis2_flow_container.h>
#include <axis2_wsdl_svc.h>
#include <axis2_op.h>
#include <axis2_svc_grp.h>
#include <axis2_qname.h>
#include <axis2_error.h>
#include <axis2_array_list.h>
#include <axis2.h>
#include <axis2_phase_resolver.h>
#include <axis2_module_desc.h>
#include <axis2_conf.h>
#include <axis2_wsdl_soap_op.h>
#include <axis2_string.h>
#include <axis2_wsdl_endpoint.h>

#ifdef __cplusplus
extern "C"
{
#endif

/** @defgroup axis2_svc Service description
  * @ingroup axis2_core_description
  * @{
  */

struct axis2_wsdl_endpoint;
struct axis2_svc_grp;
struct axis2_op;
struct axis2_flow_container;
struct axis2_param_container;
struct axis2_wsdl_svc;
struct axis2_wsdl_interface; 
struct axis2_module_desc; 
struct axis2_conf;
struct axis2_wsdl_soap_op;    
typedef struct axis2_svc_ops axis2_svc_ops_t;   
typedef struct axis2_svc axis2_svc_t;
    
/** 
 * @brief Service ops struct
 * Encapsulator struct for ops of axis2_svc
 */    
struct axis2_svc_ops
{
	axis2_status_t (AXIS2_CALL *
    free) (axis2_svc_t *svc, 
            axis2_env_t **env);

	axis2_status_t (AXIS2_CALL *
    add_op) (axis2_svc_t *svc, 
                    axis2_env_t **env,
                    struct axis2_op *op);

	struct axis2_op *(AXIS2_CALL *
    get_op_with_qname) (axis2_svc_t *svc, 
                                  axis2_env_t **env,
                                  axis2_qname_t *op_qname);

	struct axis2_op *(AXIS2_CALL *
    get_op_with_name) (axis2_svc_t *svc, 
                                axis2_env_t **env,
                                const axis2_char_t * op_name);

	axis2_hash_t *(AXIS2_CALL *
    get_ops) (axis2_svc_t *svc, 
                     axis2_env_t **env);

	axis2_status_t (AXIS2_CALL *
    set_parent) (axis2_svc_t *svc, 
                    axis2_env_t **env,
                    struct axis2_svc_grp *svc_grp);

	struct axis2_svc_grp *(AXIS2_CALL *
    get_parent) (axis2_svc_t *svc, 
                 axis2_env_t **env);
	
    axis2_status_t (AXIS2_CALL *
    set_qname) (axis2_svc_t *svc, 
                axis2_env_t **env,
                axis2_qname_t *qname);
    
	axis2_qname_t *(AXIS2_CALL *
    get_qname) (const axis2_svc_t *svc, 
               axis2_env_t **env);

	axis2_status_t (AXIS2_CALL *
    add_param) (axis2_svc_t *svc, 
                axis2_env_t **env,
                axis2_param_t *param);

	axis2_param_t *(AXIS2_CALL *
    get_param) (axis2_svc_t *svc, 
                axis2_env_t **env,
                const axis2_char_t *name);

	axis2_array_list_t *(AXIS2_CALL *
    get_params) (axis2_svc_t *svc, 
                    axis2_env_t **env);
	
	axis2_bool_t (AXIS2_CALL *
    is_param_locked) (axis2_svc_t *svc, 
                        axis2_env_t **env,
                        axis2_char_t *param_name);
                                                
    axis2_status_t (AXIS2_CALL *
    set_svc_interface) (axis2_svc_t *svc,
                            axis2_env_t **env,
                            struct axis2_wsdl_interface *svc_interface);
                                
    struct axis2_wsdl_interface * (AXIS2_CALL *
    get_svc_interface) (axis2_svc_t *svc,
                                axis2_env_t **env);                               

                                
    /**
     * To ebgage a module it is reuired to use this method
     *
     * @param moduleref
     * @throws AxisFault
     */
    axis2_status_t (AXIS2_CALL *
    engage_module) (axis2_svc_t *svc,
                    axis2_env_t **env,
                    struct axis2_module_desc * moduleref,
                    struct axis2_conf * axis2_config);
    
    /**
     * To add a opeartion to a service if a module requird to do so
     *
     * @param module
     */
    axis2_status_t (AXIS2_CALL *
    add_module_ops) (axis2_svc_t *svc,
                                axis2_env_t **env,
                                struct axis2_module_desc * module_desc,
                                struct axis2_conf * axis2_config); 
                                    
    axis2_status_t (AXIS2_CALL *
    add_to_engaged_module_list) (axis2_svc_t *svc,
                                    axis2_env_t **env,
                                    struct axis2_module_desc *module_name);  
                                        
    /**
     * Method getEngadgedModules
     *
     * @return Collection
     */
    axis2_array_list_t * (AXIS2_CALL *
    get_engaged_modules) (axis2_svc_t *svc,
                          axis2_env_t **env);
    
    /**
     * To get the WSDL opeartion element in servic einterface
     * @param opName  <code>QName</cde>
     * @return  WSDLOperation <code>WSDLOperation</code>
     */
    void * (AXIS2_CALL *
    get_wsdl_op) (axis2_svc_t *svc,
                                    axis2_env_t **env,
                                    axis2_qname_t *op_name);
    
       /**
     * Method setContextPath
     *
     * @param contextPath
     */
    axis2_status_t (AXIS2_CALL *
    set_context_path) (axis2_svc_t *svc,
                        axis2_env_t **env,
                        axis2_char_t *context_path);
    
    /**
     * Method getContextPath
     *
     * @return  context path
     */
    axis2_char_t * (AXIS2_CALL *
    get_context_path) (axis2_svc_t *svc,
                       axis2_env_t **env);
    
    /**
     * Method setStyle
     *
     * @param style
     */
    axis2_status_t (AXIS2_CALL *
    set_style) (axis2_svc_t *svc,
                axis2_env_t **env,
                axis2_char_t * style);
    
    /**
     * Method getStyle
     *
     * @return axis2_char_t *
     */
    axis2_char_t * (AXIS2_CALL *
    get_style) (axis2_svc_t *svc,
                axis2_env_t **env);
    
    /**
     * Method getInFlow
     *
     * @return struct axis2_flow *
     */
    struct axis2_flow * (AXIS2_CALL *
    get_inflow) (axis2_svc_t *svc,
                 axis2_env_t **env);
    
    /**
     * Method setInFlow
     *
     * @param inFlow
     */
    axis2_status_t (AXIS2_CALL *
    set_inflow) (axis2_svc_t *svc,
                    axis2_env_t **env,
                    struct axis2_flow *inflow);
    
    /**
     * Method getOutFlow
     *
     * @return struct axis2_flow *
     */
    struct axis2_flow * (AXIS2_CALL *
    get_outflow) (axis2_svc_t *svc,
                                axis2_env_t **env);
    
    /**
     * Method setOutFlow
     *
     * @param outFlow
     */
    axis2_status_t (AXIS2_CALL *
    set_outflow) (axis2_svc_t *svc,
                                axis2_env_t **env,
                                struct axis2_flow *outflow);
    
    /**
     * Method getFaultInFlow
     *
     * @return struct axis2_flow *
     */
    struct axis2_flow *(AXIS2_CALL *
    get_fault_inflow) (axis2_svc_t *svc,
                                axis2_env_t **env);
    
    /**
     * Method setFaultInFlow
     *
     * @param fault_flow
     */
    axis2_status_t (AXIS2_CALL *
    set_fault_inflow) (axis2_svc_t *svc,
                                axis2_env_t **env,
                                struct axis2_flow *fault_flow);
    
    struct axis2_flow * (AXIS2_CALL *
    get_fault_outflow) (axis2_svc_t *svc,
                                axis2_env_t **env);
    
    axis2_status_t (AXIS2_CALL *
    set_fault_outflow) (axis2_svc_t *svc,
                        axis2_env_t **env,
                        struct axis2_flow *fault_flow);
    
    /**
     * This method will return the op given particular SOAP Action.
     * This method should only be called if there is only one Endpoint is defined
     * for this Service. If more than one Endpoint exists one of them will be picked.
     * If more than one Operation is found with the given
     * SOAP Action; null will be ruturned. If no particular Operation is found with
     * the given SOAP Action; null will be returned.
     *
     * @param soapAction SOAP Action defined for the particular Operation
     * @return A struct axis2_op * if a unque Operation can be found with the given SOAP Action
     *         otherwise will return null.
     */
    struct axis2_op * (AXIS2_CALL *
    get_op_by_soap_action) (axis2_svc_t *svc,
                                    axis2_env_t **env,
                                    axis2_char_t *soap_action);
    
    /**
     * This method will return the op given the particular endpoing and the
     * particular SOAP Action. If more than one Operation is found with the given
     * SOAP Action; null will be ruturned. If no particular Operation is found with
     * the given SOAP Action; null will be returned
     *
     * @param endpoint   Particular Enpoint in which the bining is defined with the particular SOAP
     *                   Action.
     * @param soapAction SOAP Action defined for the particular Operation
     * @return A struct axis2_op * if a unque Operation can be found with the given SOAP Action
     *         otherwise will return null.
     */
    struct axis2_op * (AXIS2_CALL *
    get_op_by_soap_action_and_endpoint) (axis2_svc_t *svc,
                                    axis2_env_t **env,
                                    axis2_char_t *soap_action,
                                    axis2_qname_t * endpoint);       
    
     /**
     * To get the description about the service
     *                                                                  
     * @return axis2_char_t *
     */
    axis2_char_t * (AXIS2_CALL *
    get_axis2_svc_name) (axis2_svc_t *svc,
                                axis2_env_t **env);
    
    /**
     * Set the description about the service
     *
     * @param axissvcname
     */
    axis2_status_t (AXIS2_CALL *
    set_axis2_svc_name) (axis2_svc_t *svc,
                                axis2_env_t **env,
                                axis2_char_t *axis2_svc_name);
    
    /**
     * This method will set the current time as last update time of the service
     */
    axis2_status_t (AXIS2_CALL *
    set_last_update) (axis2_svc_t *svc,
                                axis2_env_t **env);
    
    long (AXIS2_CALL *
    get_last_update) (axis2_svc_t *svc,
                                axis2_env_t **env);
    
    axis2_char_t * (AXIS2_CALL *
    get_filename) (axis2_svc_t *svc,
                                axis2_env_t **env);
    
    axis2_status_t (AXIS2_CALL *
    set_filename) (axis2_svc_t *svc,
                                axis2_env_t **env,
                                axis2_char_t *filename);
    
    axis2_hash_t * (AXIS2_CALL *
    get_endpoints) (axis2_svc_t *svc,
                                axis2_env_t **env);
    
    axis2_status_t (AXIS2_CALL *
    set_endpoints) (axis2_svc_t *svc,
                    axis2_env_t **env,
                    axis2_hash_t * endpoints);
    
    axis2_status_t (AXIS2_CALL *
    set_endpoint)(axis2_svc_t *svc,
                    axis2_env_t **env,
                    struct axis2_wsdl_endpoint * endpoint);
    
    struct axis2_wsdl_endpoint * (AXIS2_CALL *
    get_endpoint) (axis2_svc_t *svc,
                    axis2_env_t **env,
                    axis2_qname_t * qname);
    
    axis2_char_t * (AXIS2_CALL *
    get_namespace) (axis2_svc_t *svc,
                  axis2_env_t **env);
    
    /**
     * To add the was action paramater into has map so that was action based dispatch can support
     */
    axis2_status_t (AXIS2_CALL *
    add_mapping) (axis2_svc_t *svc,
                axis2_env_t **env,
                axis2_char_t * mapping_key , 
                struct axis2_op * axis2_op);
 
    axis2_status_t (AXIS2_CALL *
    add_module_ref) (axis2_svc_t *svc,
                                axis2_env_t **env,
                                axis2_qname_t *moduleref);
    
    axis2_array_list_t *(AXIS2_CALL *
    get_modules) (axis2_svc_t *svc,
                            axis2_env_t **env);                
};

/** 
 * @brief Service struct
  *	Axis2 Service  
 */
struct axis2_svc
{
	axis2_svc_ops_t *ops; 
    struct axis2_param_container *param_container;
    struct axis2_flow_container *flow_container;
    struct axis2_wsdl_svc *wsdl_svc;    

};

/** 
 * Creates service struct with qname
 * @return pointer to newly created service
 */
AXIS2_DECLARE(axis2_svc_t *)
axis2_svc_create (axis2_env_t **env);

/** 
 * Creates service struct with qname
 * @param qname ualified name
 * @return pointer to newly created service
 */
AXIS2_DECLARE(axis2_svc_t *)
axis2_svc_create_with_qname (axis2_env_t **env, 
                                axis2_qname_t *qname);

/** 
 * Creates service struct with wsdl service
 * @param wsdl_svc wsdl service
 * @return pointer to newly created service
 */
AXIS2_DECLARE(axis2_svc_t *)
axis2_svc_create_with_wsdl_svc (axis2_env_t **env, 
                                struct axis2_wsdl_svc *wsdl_svc);

/**************************** Start of function macros ************************/

#define AXIS2_SVC_FREE(svc, env) ((svc)->ops->free (svc, env))

#define AXIS2_SVC_ADD_OP(svc, env, op) \
		((svc)->ops->add_op (svc, env, op))

#define AXIS2_SVC_GET_OP_WITH_QNAME(svc, env, op_qname) \
		((svc)->ops->get_op_with_qname (svc, env, op_qname))

#define AXIS2_SVC_GET_OP_WITH_NAME(svc, env, op_name) \
		((svc)->ops->get_op_with_name (svc, env, op_name))

#define AXIS2_SVC_GET_OPS(svc, env) ((svc)->ops->get_ops (svc, env))

#define AXIS2_SVC_SET_PARENT(svc, env , svc_grp) ((svc)->ops->set_parent \
        (svc, env, svc_grp))

#define AXIS2_SVC_GET_PARENT(svc, env) ((svc)->ops->get_parent (svc, env))

#define AXIS2_SVC_SET_QNAME(svc, env, qname) ((svc)->ops->set_qname(svc , env, qname))

#define AXIS2_SVC_GET_QNAME(svc, env) ((svc)->ops->get_qname(svc , env))
		
#define AXIS2_SVC_ADD_PARAM(svc, env, param) ((svc)->ops->add_param(svc , env, param))
		
#define AXIS2_SVC_GET_PARAM(svc, env, name) ((svc)->ops->get_param(svc , env, name))
		
#define AXIS2_SVC_GET_PARAMS(svc, env) ((svc)->ops->get_params(svc , env))
		
#define AXIS2_SVC_IS_PARAM_LOCKED(svc, env, param_name) \
        ((svc)->ops->is_param_locked(svc, env, param_name))

#define AXIS2_SVC_SET_SVC_INTERFACE(svc, env, svc_interface) \
        ((svc)->ops->set_svc_interface(svc, env, svc_interface))

#define AXIS2_SVC_GET_SVC_INTERFACE(svc, env) \
        ((svc)->ops->get_svc_interface(svc, env))       

#define AXIS2_SVC_ENGAGE_MODULE(svc, env, moduleref, axis2_config) \
        ((svc)->ops->engage_module(svc, env, moduleref, axis2_config))

#define AXIS2_SVC_ADD_MODULE_OPS(svc, env, module_desc, axis2_config) \
        ((svc)->ops->add_module_ops(svc, env, module_desc, axis2_config))

#define AXIS2_SVC_ADD_TO_ENGAGED_MODULE_LIST(svc, env, module_name) \
        ((svc)->ops->add_to_engaged_module_list(svc, env, module_name))

#define AXIS2_SVC_GET_ENGAGED_MODULES(svc, env) \
        ((svc)->ops->get_engaged_modules(svc, env))

#define AXIS2_SVC_GET_WSDL_OP(svc, env, op_name) \
        ((svc)->ops->get_wsdl_op(svc, env, op_name))

#define AXIS2_SVC_SET_CONTEXT_PATH(svc, env, context_path) \
        ((svc)->ops->set_context_path(svc, env, context_path))

#define AXIS2_SVC_GET_CONTEXT_PATH(svc, env) \
        ((svc)->ops->get_context_path(svc, env))

#define AXIS2_SVC_SET_STYLE(svc, env, style) \
        ((svc)->ops->set_style(svc, env, style))

#define AXIS2_SVC_GET_STYLE(svc, env) \
        ((svc)->ops->get_style(svc, env))

#define AXIS2_SVC_GET_INFLOW(svc, env) \
        ((svc)->ops->get_inflow(svc, env))

#define AXIS2_SVC_SET_INFLOW(svc, env, inflow) \
        ((svc)->ops->set_inflow(svc, env, inflow))

#define AXIS2_SVC_GET_OUTFLOW(svc, env) \
        ((svc)->ops->get_outflow(svc, env))

#define AXIS2_SVC_SET_OUTFLOW(svc, env, outflow) \
        ((svc)->ops->set_outflow(svc, env, outflow))

#define AXIS2_SVC_GET_FAULT_INFLOW(svc, env) \
        ((svc)->ops->get_fault_inflow(svc, env))

#define AXIS2_SVC_SET_FAULT_INFLOW(svc, env, fault_inflow) \
        ((svc)->ops->set_fault_inflow(svc, env, fault_inflow))

#define AXIS2_SVC_GET_FAULT_OUTFLOW(svc, env) \
        ((svc)->ops->get_fault_outflow(svc, env))

#define AXIS2_SVC_SET_FAULT_OUTFLOW(svc, env, fault_outflow) \
        ((svc)->ops->set_fault_outflow(svc, env, fault_outflow))

#define AXIS2_SVC_GET_OP_BY_SOAP_ACTION(svc, env, soap_action) \
        ((svc)->ops->get_op_by_soap_action(svc, env, soap_action))

#define AXIS2_SVC_GET_OP_BY_SOAP_ACTION_AND_ENDPOINT(svc, env, soap_action, endpoint) \
        ((svc)->ops->get_op_by_soap_action_and_endpoint(svc, env, soap_action, endpoint))

#define AXIS2_SVC_GET_AXIS2_SVC_NAME(svc, env) \
        ((svc)->ops->get_axis2_svc_name(svc, env))

#define AXIS2_SVC_SET_AXIS2_SVC_NAME(svc, env, axis2_svc_name) \
        ((svc)->ops->set_axis2_svc_name(svc, env, axis2_svc_name))

#define AXIS2_SVC_SET_LAST_UPDATE(svc, env) \
        ((svc)->ops->set_last_update(svc, env))

#define AXIS2_SVC_GET_LAST_UPDATE(svc, env) \
        ((svc)->ops->get_last_update(svc, env))

#define AXIS2_SVC_GET_FILENAME(svc, env) \
        ((svc)->ops->get_filename(svc, env))

#define AXIS2_SVC_SET_FILENAME(svc, env, filename) \
        ((svc)->ops->set_filename(svc, env, filename))

#define AXIS2_SVC_GET_ENDPOINTS(svc, env) \
        ((svc)->ops->get_endpoints(svc, env))

#define AXIS2_SVC_SET_ENDPOINTS(svc, env, endpoints) \
        ((svc)->ops->set_endpoints(svc, env, endpoints))

#define AXIS2_SVC_SET_ENDPOINT(svc, env, endpoint) \
        ((svc)->ops->set_endpoint(svc, env, endpoint))

#define AXIS2_SVC_GET_ENDPOINT(svc, env, qname) \
        ((svc)->ops->get_endpoint(svc, env, qname))

#define AXIS2_SVC_GET_QNAMESPACE(svc, env) \
        ((svc)->ops->get_namespace(svc, env))

#define AXIS2_SVC_ADD_MAPPING(svc, env, mapping_key, axis2_opt) \
        ((svc)->ops->add_mapping(svc, env, mapping_key, axis2_opt))

#define AXIS2_SVC_ADD_MODULE_REF(svc, env, moduleref) \
        ((svc)->ops->add_module_ref(svc, env, moduleref))
        
#define AXIS2_SVC_GET_MODULES(svc, env) \
        ((svc)->ops->get_modules(svc, env))

/**************************** End of function macros **************************/

/** @} */
#ifdef __cplusplus
}
#endif
#endif                          /* AXIS2_SVC_H */
