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

/** @defgroup axis2_svc service
 * @ingroup axis2_desc
 * service represents the static structure of a service in a service group.
 * In Axis2 description hierarchy, a service lives inside the service group to
 * which it belongs.
 * services are configured in services.xml files located in the respective
 * service group folders of the services folder in the repository.
 * In services.xml file, services are declared in association with a given
 * service group or at top level as a stand alone service. In cases where a
 * service is configured without an associated service group, a service group
 * with the same name as that of the service would be created by the deployment
 * engine and the service would be associated with that newly created service
 * group. The deployment engine would create service instances to represent
 * those configured services in services.xml files and would associate them with
 * the respective service group in the configuration.
 * service encapsulates data on engaged module information, the XML schema
 * defined in WSDL that is associated with the service and the operations of
 * the service.
 * @{
 */

/**
 * @file axis2_svc.h
 */

#include <axutil_param_container.h>
#include <axis2_flow_container.h>
#include <axis2_op.h>
#include <axis2_svc_grp.h>
#include <axutil_qname.h>
#include <axutil_error.h>
#include <axutil_array_list.h>
#include <axis2_const.h>
#include <axis2_phase_resolver.h>
#include <axis2_module_desc.h>
#include <axis2_conf.h>
#include <axutil_string.h>
#include <axutil_stream.h>

#ifdef __cplusplus
extern "C"
{
#endif

    /** Type name for struct axis2_svc */
    typedef struct axis2_svc axis2_svc_t;

    struct axis2_svc_grp;
    struct axis2_flow_container;
    struct axutil_param_container;
    struct axis2_module_desc;
    struct axis2_conf;

    /**
     * Frees service.
     * @param svc pointer to service struct
     * @param env pointer to environment struct
     * @return void
     */
    AXIS2_EXTERN void AXIS2_CALL
    axis2_svc_free(
        axis2_svc_t * svc,
        const axutil_env_t * env);

    /**
     * Adds operation.
     * @param svc pointer to service struct
     * @param env pointer to environment struct
     * @param op pointer to operation struct, service assumes ownership of 
     * operation
     * @return AXIS2_SUCCESS on success, else AXIS2_FAILURE 
     */
    AXIS2_EXTERN axis2_status_t AXIS2_CALL
    axis2_svc_add_op(
        axis2_svc_t * svc,
        const axutil_env_t * env,
        struct axis2_op *op);

    /**
     * Gets operation corresponding to the given QName.
     * @param svc pointer to service struct
     * @param env pointer to environment struct
     * @param op_qname pointer to QName representing operation QName
     * @return pointer to operation corresponding to given QName
     */
    AXIS2_EXTERN struct axis2_op *AXIS2_CALL
    axis2_svc_get_op_with_qname(
        const axis2_svc_t * svc,
        const axutil_env_t * env,
        const axutil_qname_t * op_qname);

    /**
     * Gets the RESTful operation list corresponding to the given method
     * and first constant part of location.
     * @param svc pointer to service struct
     * @param env pointer to environment struct
     * @param http_method HTTPMethod
     * @param http_location HTTPLocation
     * @return pointer to operation corresponding to given method and
     * location
     */
    AXIS2_EXTERN axutil_array_list_t *AXIS2_CALL
    axis2_svc_get_rest_op_list_with_method_and_location(
        const axis2_svc_t * svc,
        const axutil_env_t * env,
        const axis2_char_t * http_method,
        const axis2_char_t * http_location);


    /**
     * Gets the RESTful operation map for a given service 
     * @param svc pointer to service struct
     * @param env pointer to environment struct
     * @return pointer to hash with the information 
     * (method, url)=> processing structure for each ops
     */
    AXIS2_EXTERN axutil_hash_t *AXIS2_CALL
    axis2_svc_get_rest_map(
        const axis2_svc_t * svc,
        const axutil_env_t * env);

    /**
     * Gets operation corresponding to the name.
     * @param svc pointer to service struct
     * @param env pointer to environment struct
     * @param op_name operation name string
     * @return pointer to operation corresponding to given name
     */
    AXIS2_EXTERN struct axis2_op *AXIS2_CALL
                axis2_svc_get_op_with_name(
                    const axis2_svc_t * svc,
                    const axutil_env_t * env,
                    const axis2_char_t * op_name);

    /**
     * Gets all operations of service.
     * @param svc pointer to service struct
     * @param env pointer to environment struct
     * @return pointer to hash map containing all operations of the service
     */
    AXIS2_EXTERN axutil_hash_t *AXIS2_CALL
    axis2_svc_get_all_ops(
        const axis2_svc_t * svc,
        const axutil_env_t * env);

    /**
     * Sets parent which is of type service group.
     * @param svc pointer to service struct
     * @param env pointer to environment struct
     * @param svc_grp pointer to parent service group
     * @return AXIS2_SUCCESS on success, else AXIS2_FAILURE 
     */
    AXIS2_EXTERN axis2_status_t AXIS2_CALL
    axis2_svc_set_parent(
        axis2_svc_t * svc,
        const axutil_env_t * env,
        struct axis2_svc_grp *svc_grp);

    /**
     * Gets parent which is of type service group.
     * @param svc pointer to service struct
     * @param env pointer to environment struct
     * @return pointer to parent service group
     */
    AXIS2_EXTERN struct axis2_svc_grp *AXIS2_CALL
                axis2_svc_get_parent(
                    const axis2_svc_t * svc,
                    const axutil_env_t * env);

    /**
     * Sets QName.
     * @param svc pointer to service struct
     * @param env pointer to environment struct
     * @param qname pointer to QName
     * @return AXIS2_SUCCESS on success, else AXIS2_FAILURE 
     */
    AXIS2_EXTERN axis2_status_t AXIS2_CALL
    axis2_svc_set_qname(
        axis2_svc_t * svc,
        const axutil_env_t * env,
        const axutil_qname_t * qname);

    /**
     * Gets QName.
     * @param svc pointer to service struct
     * @param env pointer to environment struct
     * @return pointer to QName
     */
    AXIS2_EXTERN const axutil_qname_t *AXIS2_CALL
    axis2_svc_get_qname(
        const axis2_svc_t * svc,
        const axutil_env_t * env);

    /**
     * Adds given parameter to operation.
     * @param svc pointer to service struct
     * @param env pointer to environment struct
     * @param param pointer to parameter, service assumes ownership of
     * parameter
     * @return AXIS2_SUCCESS on success, else AXIS2_FAILURE 
     */
    AXIS2_EXTERN axis2_status_t AXIS2_CALL
    axis2_svc_add_param(
        axis2_svc_t * svc,
        const axutil_env_t * env,
        axutil_param_t * param);

    /**
     * Gets named parameter.    
     * @param svc pointer to service struct
     * @param env pointer to environment struct
     * @param name name string
     * @return pointer to named parameter if exists, else NULL. Returns a 
     * reference, not a cloned copy    
     */
    AXIS2_EXTERN axutil_param_t *AXIS2_CALL
    axis2_svc_get_param(
        const axis2_svc_t * svc,
        const axutil_env_t * env,
        const axis2_char_t * name);

	/**
	 * Remove a parameter.
	 * @param svc pointer to service struct
	 * @param env pointer to the environment
	 * @Param param_name parameter name to be removed
	 */
	AXIS2_EXTERN axis2_status_t AXIS2_CALL
	axis2_svc_remove_param(
		const axis2_svc_t *svc,
		const axutil_env_t *env,
		const axis2_char_t *param_name);

    /**
     * Gets all parameters stored within service.
     * @param svc pointer to service struct
     * @param env pointer to environment struct
     * @return pointer to array list of parameters, returns a reference,
     * not a cloned copy
     */
    AXIS2_EXTERN axutil_array_list_t *AXIS2_CALL
    axis2_svc_get_all_params(
        const axis2_svc_t * svc,
        const axutil_env_t * env);

    /**
     * Checks if the named parameter is locked.
     * @param svc pointer to service struct
     * @param env pointer to environment struct
     * @param param_name parameter name
     * @return AXIS2_TRUE if the named parameter is locked, else AXIS2_FALSE
     */
    AXIS2_EXTERN axis2_bool_t AXIS2_CALL
    axis2_svc_is_param_locked(
        axis2_svc_t * svc,
        const axutil_env_t * env,
        const axis2_char_t * param_name);

    /**
     * Engages given module to service.
     * @param svc pointer to service struct
     * @param env pointer to environment struct
     * @param  module_desc pointer to module description to be engaged, 
     * service does not assume the ownership of module 
     * @param conf pointer to configuration, it is configuration that holds 
     * module information
     * @return AXIS2_SUCCESS on success, else AXIS2_FAILURE 
     */
    AXIS2_EXTERN axis2_status_t AXIS2_CALL
    axis2_svc_engage_module(
        axis2_svc_t * svc,
        const axutil_env_t * env,
        struct axis2_module_desc *module_desc,
        struct axis2_conf *conf);

    /**
     * Disengages given module from service.
     * @param svc pointer to service struct
     * @param env pointer to environment struct
     * @param  module_desc pointer to module description to be engaged, 
     * service does not assume the ownership of module 
     * @param conf pointer to configuration, it is configuration that holds 
     * module information
     * @return AXIS2_SUCCESS on success, else AXIS2_FAILURE 
     */
    AXIS2_EXTERN axis2_status_t AXIS2_CALL
    axis2_svc_disengage_module(
        axis2_svc_t * svc,
        const axutil_env_t * env,
        struct axis2_module_desc *module_desc,
        struct axis2_conf *conf);

    /**
     * Check whether a given module is engaged to the service.
     * @param svc pointer to service struct
     * @param env pointer to environment struct
     * @param  module_qname pointer to module qname to be engaged, 
     * @return AXIS2_TRUE if module is engaged, else AXIS2_FALSE 
     */
    AXIS2_EXTERN axis2_bool_t AXIS2_CALL
    axis2_svc_is_module_engaged(
        axis2_svc_t * svc,
        const axutil_env_t * env,
        axutil_qname_t * module_qname);

    /**
     * Return the engaged module list.
     * @param svc pointer to service struct
     * @param env pointer to environment struct
     * @return engaged module list 
     */
    AXIS2_EXTERN axutil_array_list_t *AXIS2_CALL
    axis2_svc_get_engaged_module_list(
        const axis2_svc_t * svc,
        const axutil_env_t * env);

    /**
     * Adds operations defined in a module to this service. It is possible 
     * to define operations that are associated to a module in a module.xml 
     * file. These operations in turn could be invoked in relation to a 
     * service. This method allows those module related operation to be 
     * added to a service. 
     * @param svc pointer to service struct
     * @param env pointer to environment struct
     * @param module_desc pointer to module description containing module
     * related operation information. service does not assume the ownership
     * of module description
     * @param conf pointer to configuration, it is configuration that stores 
     * the modules
     * @return AXIS2_SUCCESS on success, else AXIS2_FAILURE 
     */
    AXIS2_EXTERN axis2_status_t AXIS2_CALL
    axis2_svc_add_module_ops(
        axis2_svc_t * svc,
        const axutil_env_t * env,
        struct axis2_module_desc *module_desc,
        struct axis2_conf *axis2_config);

    /**
     * Adds given module description to engaged module list.
     * @param svc pointer to service struct
     * @param env pointer to environment struct
     * @param module_desc pointer to module description, service does not 
     * assume the ownership of module description
     * @return AXIS2_SUCCESS on success, else AXIS2_FAILURE 
     */
    /*AXIS2_EXTERN axis2_status_t AXIS2_CALL

       axis2_svc_add_to_engaged_module_list(axis2_svc_t *svc,
       const axutil_env_t *env,
       struct axis2_module_desc *module_desc); */

    /**
     * Gets all engaged modules.
     * @param svc pointer to service struct
     * @param env pointer to environment struct
     * @return pointer to array list containing all engaged modules
     */
    /*AXIS2_EXTERN axutil_array_list_t *AXIS2_CALL

       axis2_svc_get_all_engaged_modules(const axis2_svc_t *svc,
       const axutil_env_t *env); */

    /**
     * Sets style. Style can be either RPC or document literal.
     * @param svc pointer to service struct
     * @param env pointer to environment struct
     * @param style style of service as defined in WSDL
     * @return AXIS2_SUCCESS on success, else AXIS2_FAILURE 
     */
    AXIS2_EXTERN axis2_status_t AXIS2_CALL
    axis2_svc_set_style(
        axis2_svc_t * svc,
        const axutil_env_t * env,
        const axis2_char_t * style);

    /**
     * Gets style. Style can be either RPC or document literal.
     * @param svc pointer to service struct
     * @param env pointer to environment struct
     * @return string representing the style of service
     */
    AXIS2_EXTERN const axis2_char_t *AXIS2_CALL
    axis2_svc_get_style(
        const axis2_svc_t * svc,
        const axutil_env_t * env);

    /**
     * Gets in flow. In flow is the list of phases invoked
     * along in path.    
     * @param svc pointer to service struct
     * @param env pointer to environment struct
     * @return pointer to flow representing in flow
     */
    /*AXIS2_EXTERN struct axis2_flow *AXIS2_CALL

       axis2_svc_get_in_flow(const axis2_svc_t *svc,
       const axutil_env_t *env); */

    /**
     * Sets in flow. In flow is the list of phases invoked
     * along in path.    
     * @param svc pointer to service struct
     * @param env pointer to environment struct
     * @param in_flow pointer to flow representing in flow
     * @return AXIS2_SUCCESS on success, else AXIS2_FAILURE 
     */
    /*AXIS2_EXTERN axis2_status_t AXIS2_CALL

       axis2_svc_set_in_flow(axis2_svc_t *svc,
       const axutil_env_t *env,
       struct axis2_flow *in_flow); */

    /**
     * Gets out flow. Out flow is the list of phases invoked
     * along out path.    
     * @param svc pointer to service struct
     * @param env pointer to environment struct
     * @return pointer to flow representing out flow
     */
    /*AXIS2_EXTERN struct axis2_flow *AXIS2_CALL

       axis2_svc_get_out_flow(
       const axis2_svc_t *svc,
       const axutil_env_t *env); */

    /**
     * Sets out flow. Out flow is the list of phases invoked
     * along out path.    
     * @param svc pointer to service struct
     * @param env pointer to environment struct
     * @return out_flow pointer to flow representing out flow
     * @return AXIS2_SUCCESS on success, else AXIS2_FAILURE 
     */
    /*AXIS2_EXTERN axis2_status_t AXIS2_CALL

       axis2_svc_set_out_flow(
       axis2_svc_t *svc,
       const axutil_env_t *env,
       struct axis2_flow *out_flow); */

    /**
     * Gets fault in flow. Fault in flow is the list of phases invoked
     * along in path if a fault happens.    
     * @param svc pointer to service struct
     * @param env pointer to environment struct
     * @return pointer to flow representing fault in flow
     */
    /*AXIS2_EXTERN struct axis2_flow *AXIS2_CALL

       axis2_svc_get_fault_in_flow(
       const axis2_svc_t *svc,
       const axutil_env_t *env); */

    /**
     * Sets fault in flow. Fault in flow is the list of phases invoked
     * along in path if a fault happens.    
     * @param svc pointer to service struct
     * @param env pointer to environment struct
     * @param fault_flow pointer to flow representing fault in flow
     * @return AXIS2_SUCCESS on success, else AXIS2_FAILURE 
     */
    /*AXIS2_EXTERN axis2_status_t AXIS2_CALL

       axis2_svc_set_fault_in_flow(
       axis2_svc_t *svc,
       const axutil_env_t *env,
       struct axis2_flow *fault_flow); */

    /**
     * Gets fault out flow. Fault out flow is the list of phases invoked
     * along out path if a fault happens.    
     * @param svc pointer to service struct
     * @param env pointer to environment struct
     * @return pointer to flow representing fault out flow
     */
    /*AXIS2_EXTERN struct axis2_flow *AXIS2_CALL

       axis2_svc_get_fault_out_flow(
       const axis2_svc_t *svc,
       const axutil_env_t *env); */

    /**
     * Sets fault out flow. Fault out flow is the list of phases invoked
     * along out path if a fault happens.    
     * @param svc pointer to service struct
     * @param env pointer to environment struct
     * @param fault_flow pointer to flow representing fault out flow
     * @return AXIS2_SUCCESS on success, else AXIS2_FAILURE 
     */
    /*AXIS2_EXTERN axis2_status_t AXIS2_CALL

       axis2_svc_set_fault_out_flow(
       axis2_svc_t *svc,
       const axutil_env_t *env,
       struct axis2_flow *fault_flow); */

    /**
     * Gets operation corresponding to given SOAP Action.
     * @param svc pointer to service struct
     * @param env pointer to environment struct
     * @param soap_action SOAP action string
     * @return pointer to operation corresponding to given SOAP action if 
     * one exists, else NULL. Returns a reference, not a cloned copy
     */
    AXIS2_EXTERN struct axis2_op *AXIS2_CALL
                axis2_svc_get_op_by_soap_action(
                    const axis2_svc_t * svc,
                    const axutil_env_t * env,
                    const axis2_char_t * soap_action);

    /**
     * Gets operation corresponding to given SOAP Action and endpoint QName.
     * @param svc pointer to service struct
     * @param env pointer to environment struct
     * @param soap_action SOAP action string
     * @param endpoint pointer QName representing endpoint URI
     * @return pointer operation corresponding to given SOAP Action and 
     * endpoint QName.
     */
    /*AXIS2_EXTERN struct axis2_op *AXIS2_CALL

       axis2_svc_get_op_by_soap_action_and_endpoint(
       const axis2_svc_t *svc,
       const axutil_env_t *env,
       const axis2_char_t *soap_action,
       const axutil_qname_t *endpoint); */

    /**
     * Gets service name.
     * @param svc pointer to service struct
     * @param env pointer to environment struct
     * @return service name string
     */
    AXIS2_EXTERN const axis2_char_t *AXIS2_CALL
    axis2_svc_get_name(
        const axis2_svc_t * svc,
        const axutil_env_t * env);

    /**
     * Sets service name.
     * @param svc pointer to service struct
     * @param env pointer to environment struct
     * @param svc_name service name string
     * @return AXIS2_SUCCESS on success, else AXIS2_FAILURE 
     */
    AXIS2_EXTERN axis2_status_t AXIS2_CALL
    axis2_svc_set_name(
        axis2_svc_t * svc,
        const axutil_env_t * env,
        const axis2_char_t * svc_name);

    /**
     * Sets current time as last update time of the service.
     * @param svc pointer to service struct
     * @param env pointer to environment struct
     * @return AXIS2_SUCCESS on success, else AXIS2_FAILURE 
     */
    AXIS2_EXTERN axis2_status_t AXIS2_CALL
    axis2_svc_set_last_update(
        axis2_svc_t * svc,
        const axutil_env_t * env);

    /**
     * Gets last update time of the service.
     * @param svc pointer to service struct
     * @param env pointer to environment struct
     * @return last updated time in seconds
     */
    AXIS2_EXTERN long AXIS2_CALL
    axis2_svc_get_last_update(
        const axis2_svc_t * svc,
        const axutil_env_t * env);

    /**
     * Get the description of the services, which is in the
     * service.xml, <description> tag
     * @param svc pointer to service struct
     * @param env pointer to environment struct
     * @return services description string
     */
    AXIS2_EXTERN const axis2_char_t *AXIS2_CALL
    axis2_svc_get_svc_desc(
        const axis2_svc_t * svc,
        const axutil_env_t * env);

    /**
     * Set the description of the service which is in service.xml
     * @param svc pointer to service struct
     * @param env pointer to environment struct
     * @return AXIS2_SUCCESS on success, else AXIS2_FAILURE 
     */
    AXIS2_EXTERN axis2_status_t AXIS2_CALL
    axis2_svc_set_svc_desc(
        axis2_svc_t * svc,
        const axutil_env_t * env,
        const axis2_char_t * svc_desc);

    /**
     * Get the static wsdl file of the services, which is in the
     * service.xml, wsdl_path parameter
     * @param svc pointer to service struct
     * @param env pointer to environment struct
     * @return static wsdl file location
     */
    AXIS2_EXTERN const axis2_char_t *AXIS2_CALL
    axis2_svc_get_svc_wsdl_path(
        const axis2_svc_t * svc,
        const axutil_env_t * env);

    /**
     * Set the wsdl path of the service which is in service.xml
     * @param svc pointer to service struct
     * @param env pointer to environment struct
     * @return AXIS2_SUCCESS on success, else AXIS2_FAILURE 
     */
    AXIS2_EXTERN axis2_status_t AXIS2_CALL
    axis2_svc_set_svc_wsdl_path(
        axis2_svc_t * svc,
        const axutil_env_t * env,
        const axis2_char_t * wsdl_path);

    /**
     * Get the folder path on disk of the services, which is in the
     * service.xml
     * @param svc pointer to service struct
     * @param env pointer to environment struct
     * @return folder path on disk
     */
    AXIS2_EXTERN const axis2_char_t *AXIS2_CALL
    axis2_svc_get_svc_folder_path(
        const axis2_svc_t * svc,
        const axutil_env_t * env);

    /**
     * Set the folder path of the service which is in service.xml
     * @param svc pointer to service struct
     * @param env pointer to environment struct
     * @return AXIS2_SUCCESS on success, else AXIS2_FAILURE 
     */
    AXIS2_EXTERN axis2_status_t AXIS2_CALL
    axis2_svc_set_svc_folder_path(
        axis2_svc_t * svc,
        const axutil_env_t * env,
        const axis2_char_t * folder_path);

    /**
     * Gets the name of the file that holds the implementation of the 
     * service. service implementation is compiled into shared libraries 
     * and is placed in the respective sub folder in the services folder 
     * of Axis2 repository.
     * @param svc pointer to service struct
     * @param env pointer to environment struct
     * @return file name string
     */
    AXIS2_EXTERN const axis2_char_t *AXIS2_CALL
    axis2_svc_get_file_name(
        const axis2_svc_t * svc,
        const axutil_env_t * env);

    /**
     * Sets the name of the file that holds the implementation of the 
     * service. service implementation is compiled into shared libraries 
     * and is placed in the respective sub folder in the services folder 
     * of Axis2 repository.
     * @param svc pointer to service struct
     * @param env pointer to environment struct
     * @param file_name file name string
     * @return AXIS2_SUCCESS on success, else AXIS2_FAILURE 
     */
    AXIS2_EXTERN axis2_status_t AXIS2_CALL
    axis2_svc_set_file_name(
        axis2_svc_t * svc,
        const axutil_env_t * env,
        const axis2_char_t * file_name);

    /**
     * Gets all endpoints associated with the service.
     * @param svc pointer to service struct
     * @param env pointer to environment struct
     * @return pointer to hash map containing all endpoints
     */
    /*AXIS2_EXTERN axutil_hash_t *AXIS2_CALL

       axis2_svc_get_all_endpoints(
       const axis2_svc_t *svc,
       const axutil_env_t *env); */

    /**
     * Sets the list of endpoints associated with the service. 
     * @param svc pointer to service struct
     * @param env pointer to environment struct
     * @param endpoints pointer to hash map containing all endpoints
     * @return AXIS2_SUCCESS on success, else AXIS2_FAILURE 
     */
    /*AXIS2_EXTERN axis2_status_t AXIS2_CALL

       axis2_svc_set_all_endpoints(
       axis2_svc_t *svc,
       const axutil_env_t *env,
       axutil_hash_t *endpoints); */

    /**
     * Gets namespace. 
     * @param svc pointer to service struct
     * @param env pointer to environment struct
     * @return namespace URI string
     */
    /*AXIS2_EXTERN const axis2_char_t *AXIS2_CALL

       axis2_svc_get_namespace(
       const axis2_svc_t *svc,
       const axutil_env_t *env);
     */

    /**
     * Adds WS-Addressing mapping for a given operation. The services.xml
     * configuration file could specify a SOAP action that would map to 
     * one of the service operations. This method could be used to register 
     * that mapping against operations. WS-Addressing based dispatcher 
     * makes use of this mapping to identify the operation to be invoked,
     * given WSA action.
     * @param svc pointer to service struct
     * @param env pointer to environment struct
     * @param wsa_action WSA action string
     * @param op pointer to operation that maps to the given WSA action
     * @return AXIS2_SUCCESS on success, else AXIS2_FAILURE 
     */
    AXIS2_EXTERN axis2_status_t AXIS2_CALL
    axis2_svc_add_mapping(
        axis2_svc_t * svc,
        const axutil_env_t * env,
        const axis2_char_t * wsa_action,
        struct axis2_op *axis2_op);

    /**
     * Adds a REST mapping for a given RESTful operation. The services.xml
     * configuration file could specify a HTTP Method and Location that would
     * map to one of the service operations. This method could be used to register 
     * that mapping against operations. The REST based dispatcher makes use
     * of this mapping to identify the operation to be invoked, given the URL.
     * @param svc pointer to service struct
     * @param env pointer to environment struct
     * @param method REST HTTP Method
     * @param location REST HTTP Location
     * @param op pointer to operation that maps to the given WSA action
     * @return AXIS2_SUCCESS on success, else AXIS2_FAILURE 
     */
    AXIS2_EXTERN axis2_status_t AXIS2_CALL
    axis2_svc_add_rest_mapping(
        axis2_svc_t * svc,
        const axutil_env_t * env,
        const axis2_char_t * method,
        const axis2_char_t * location,
        struct axis2_op *axis2_op);

    /**
     * Adds a module qname to list of module QNames associated with service.
     * @param svc pointer to service struct
     * @param env pointer to environment struct
     * @param module_qname pointer to QName to be added, this method clones
     * the QName
     * @return AXIS2_SUCCESS on success, else AXIS2_FAILURE 
     */
    AXIS2_EXTERN axis2_status_t AXIS2_CALL
    axis2_svc_add_module_qname(
        axis2_svc_t * svc,
        const axutil_env_t * env,
        const axutil_qname_t * module_qname);

    /**
     * Gets all module QNames associated with the service as a list.
     * @param svc pointer to service struct
     * @param env pointer to environment struct
     * @return pointer to array list containing QNames
     */
    AXIS2_EXTERN axutil_array_list_t *AXIS2_CALL

    axis2_svc_get_all_module_qnames(
        const axis2_svc_t * svc,
        const axutil_env_t * env);

    /**
     * Checks if the XML schema location is adjusted.
     * @param svc pointer to service struct
     * @param env pointer to environment struct
     * @return AXIS2_TRUE if XML schema is adjusted, else AXIS2_FALSE
     */
    /*AXIS2_EXTERN axis2_bool_t AXIS2_CALL

       axis2_svc_is_schema_location_adjusted(
       axis2_svc_t *svc,
       const axutil_env_t *env);
     */

    /**
     * Sets the bool value indicating if the XML schema location is adjusted.
     * @param svc pointer to service struct
     * @param env pointer to environment struct
     * @param adjusted AXIS2_TRUE if XML schema is adjusted, else AXIS2_FALSE
     * @return AXIS2_SUCCESS on success, else AXIS2_FAILURE 
     */
    /*
    AXIS2_EXTERN axis2_status_t AXIS2_CALL

       axis2_svc_set_schema_location_adjusted(
       axis2_svc_t *svc,
       const axutil_env_t *env,
       const axis2_bool_t adjusted); */

    /**
     * Gets XML schema mapping table for service. 
     * @param svc pointer to service struct
     * @param env pointer to environment struct
     * @return pointer to hash map with XML schema mappings, returns a 
     * reference, not a cloned copy
     */
    /*
    AXIS2_EXTERN axutil_hash_t *AXIS2_CALL

       axis2_svc_axis2_svc_get_schema_mapping_table(
       const axis2_svc_t *svc,
       const axutil_env_t *env); */

    /**
     * Sets XML schema mapping table for service. 
     * @param svc pointer to service struct
     * @param env pointer to environment struct
     * @param table pointer to hash map with XML schema mappings, service 
     * assumes ownership of the map
     * @return AXIS2_SUCCESS on success, else AXIS2_FAILURE 
     */
    /*
       AXIS2_EXTERN axis2_status_t AXIS2_CALL

           axis2_svc_set_schema_mapping_table(
           axis2_svc_t *svc,
           const axutil_env_t *env,
           axutil_hash_t *table); */

    /**
     * Gets custom schema prefix.
     * @param svc pointer to service struct
     * @param env pointer to environment struct
     * @return custom schema prefix string
     */
    /*
       AXIS2_EXTERN const axis2_char_t *AXIS2_CALL

           axis2_svc_get_custom_schema_prefix(
           const axis2_svc_t *svc,
           const axutil_env_t *env); */

    /**
     * Sets custom schema prefix.
     * @param svc pointer to service struct
     * @param env pointer to environment struct
     * @param prefix custom schema prefix string
     * @return AXIS2_SUCCESS on success, else AXIS2_FAILURE 
     */
    /*
       AXIS2_EXTERN axis2_status_t AXIS2_CALL

           axis2_svc_set_custom_schema_prefix(
           axis2_svc_t *svc,
           const axutil_env_t *env,
           const axis2_char_t *prefix); */

    /**
     * Gets custom schema suffix.
     * @param svc pointer to service struct
     * @param env pointer to environment struct
     * @return custom schema suffix string
     */
    /*
    AXIS2_EXTERN const axis2_char_t *AXIS2_CALL

       axis2_svc_get_custom_schema_suffix(
       const axis2_svc_t *svc,
       const axutil_env_t *env); */

    /**
     * Sets custom schema suffix.
     * @param svc pointer to service struct
     * @param env pointer to environment struct
     * @param suffix custom schema suffix string
     * @return AXIS2_SUCCESS on success, else AXIS2_FAILURE 
     */
    /*
    AXIS2_EXTERN axis2_status_t AXIS2_CALL

       axis2_svc_set_custom_schema_suffix(
       axis2_svc_t *svc,
       const axutil_env_t *env,
       const axis2_char_t *suffix); */

    /**
     * Prints the schema to given stream.
     * @param svc pointer to service struct
     * @param env pointer to environment struct
     * @param out_stream stream to print to
     * @return AXIS2_SUCCESS on success, else AXIS2_FAILURE 
     */
    /*
       AXIS2_EXTERN axis2_status_t AXIS2_CALL

           axis2_svc_print_schema(
           axis2_svc_t *svc,
           const axutil_env_t *env,
           axutil_stream_t *out_stream); */

    /**
     * Gets the XML schema at the given index of XML schema array list.
     * @param svc pointer to service struct
     * @param env pointer to environment struct
     * @param index index of the XML schema to be retrieved
     * @return pointer to XML schema, returns a reference, not a cloned copy
     */
    /*AXIS2_EXTERN xml_schema_t *AXIS2_CALL

       axis2_svc_get_schema(
       const axis2_svc_t *svc,
       const axutil_env_t *env,
       const int index); */

    /**
     * Adds all namespaces in the namespace map to the XML schema at 
     * the given index of the XML schema array list.
     * @param svc pointer to service struct
     * @param env pointer to environment struct
     * @param index index of the XML schema to be processed
     * @return pointer to XML schema with namespaces added, 
     * returns a reference, not a cloned copy    
     */

    /*    AXIS2_EXTERN xml_schema_t *AXIS2_CALL

                axis2_svc_add_all_namespaces(
                    axis2_svc_t *svc,
                    const axutil_env_t *env,
                    int index);*/

    /**
     * Gets the list of XML schemas associated with service. 
     * @param svc pointer to service struct
     * @param env pointer to environment struct
     * @return pointer to array list of XML schemas, returns a reference,
     * not a cloned copy
     */
    /*
    AXIS2_EXTERN axutil_array_list_t *AXIS2_CALL

       axis2_svc_get_all_schemas(
       const axis2_svc_t *svc,
       const axutil_env_t *env); */

    /**
     * Adds the given XML schema to the list of XML schemas associated 
     * with the service.
     * @param svc pointer to service struct
     * @param env pointer to environment struct
     * @param schema pointer to XML schema struct, service assumes the 
     * ownership of struct
     * @return AXIS2_SUCCESS on success, else AXIS2_FAILURE 
     */
    /*
    AXIS2_EXTERN axis2_status_t AXIS2_CALL

       axis2_svc_add_schema(
       axis2_svc_t *svc,
       const axutil_env_t *env,
       xml_schema_t *schema); */

    /**
     * Adds the list of all XML schemas to service.
     * @param svc pointer to service struct
     * @param env pointer to environment struct
     * @param schemas pointer to array list containing XML schemas
     * @return AXIS2_SUCCESS on success, else AXIS2_FAILURE 
     */
    /*
       AXIS2_EXTERN axis2_status_t AXIS2_CALL

           axis2_svc_add_all_schemas(
           axis2_svc_t *svc,
           const axutil_env_t *env,
           axutil_array_list_t *schemas); */

    /**
     * Gets XML schema's target namespace.
     * @param svc pointer to service struct
     * @param env pointer to environment struct
     * @return XML schema target namespace string 
     */
    /*
       AXIS2_EXTERN const axis2_char_t *AXIS2_CALL

           axis2_svc_get_schema_target_ns(
           const axis2_svc_t *svc,
           const axutil_env_t *env); */

    /**
     * Sets XML schema's target namespace.
     * @param svc pointer to service struct
     * @param env pointer to environment struct
     * @param ns namespace string 
     * @return AXIS2_SUCCESS on success, else AXIS2_FAILURE 
     */
    /*
       AXIS2_EXTERN axis2_status_t AXIS2_CALL

           axis2_svc_set_schema_target_ns(
           axis2_svc_t *svc,
           const axutil_env_t *env,
           const axis2_char_t *ns); */

    /**
     * Gets XML schema's target namespace prefix.
     * @param svc pointer to service struct
     * @param env pointer to environment struct
     * @return XML schema target namespace prefix string 
     */
    /*
       AXIS2_EXTERN const axis2_char_t *AXIS2_CALL

           axis2_svc_get_schema_target_ns_prefix(
           const axis2_svc_t *svc,
           const axutil_env_t *env); */

    /**
     * Sets XML schema's target namespace prefix.
     * @param svc pointer to service struct
     * @param env pointer to environment struct
     * @param prefix namespace prefix string 
     * @return AXIS2_SUCCESS on success, else AXIS2_FAILURE 
     */
    /*
       AXIS2_EXTERN axis2_status_t AXIS2_CALL

           axis2_svc_set_schema_target_ns_prefix(
           axis2_svc_t *svc,
           const axutil_env_t *env,
           const axis2_char_t *prefix); */

    /**
     * Gets target namespace.
     * @param svc pointer to service struct
     * @param env pointer to environment struct
     * @return target namespace as a string 
     */
    AXIS2_EXTERN const axis2_char_t *AXIS2_CALL
    axis2_svc_get_target_ns(
        const axis2_svc_t * svc,
        const axutil_env_t * env);

    /**
     * Sets target namespace.
     * @param svc pointer to service struct
     * @param env pointer to environment struct
     * @param ns target namespace as a string 
     * @return AXIS2_SUCCESS on success, else AXIS2_FAILURE 
     */
    AXIS2_EXTERN axis2_status_t AXIS2_CALL
    saxis2_svc_et_target_ns(
        axis2_svc_t * svc,
        const axutil_env_t * env,
        const axis2_char_t * ns);

    /**
     * Gets target namespace prefix.
     * @param svc pointer to service struct
     * @param env pointer to environment struct
     * @return target namespace prefix string
     */
    AXIS2_EXTERN const axis2_char_t *AXIS2_CALL

    axis2_svc_get_target_ns_prefix(
        const axis2_svc_t * svc,
        const axutil_env_t * env);

    /**
     * Sets target namespace prefix.
     * @param svc pointer to service struct
     * @param env pointer to environment struct
     * @param prefix target namespace prefix string
     * @return AXIS2_SUCCESS on success, else AXIS2_FAILURE 
     */
    AXIS2_EXTERN axis2_status_t AXIS2_CALL
    axis2_svc_set_target_ns_prefix(
        axis2_svc_t * svc,
        const axutil_env_t * env,
        const axis2_char_t * prefix);

    /**
     * Gets XML schemas element corresponding to the given QName.
     * @param svc pointer to service struct
     * @param env pointer to environment struct
     * @param qname QName of the XML schema element to be retrieved
     * @return pointer to XML schema element, returns a reference, not a 
     * cloned copy
     */
    /*AXIS2_EXTERN xml_schema_element_t *AXIS2_CALL

       axis2_svc_get_schema_element(
       const axis2_svc_t *svc,
       const axutil_env_t *env,
       const axutil_qname_t *qname); */

    /**
     * Gets the namespace map with all namespaces related to service.
     * @param svc pointer to service struct
     * @param env pointer to environment struct
     * @return pointer to hash map containing all namespaces, returns a 
     * reference, not a cloned copy
     */
    AXIS2_EXTERN axutil_hash_t *AXIS2_CALL
    gaxis2_svc_et_ns_map(
        const axis2_svc_t * svc,
        const axutil_env_t * env);

    /**
     * Sets the namespace map with all namespaces related to service.
     * @param svc pointer to service struct
     * @param env pointer to environment struct
     * @param ns_map pointer to hash map containing all namespaces
     * @return AXIS2_SUCCESS on success, else AXIS2_FAILURE 
     */
    AXIS2_EXTERN axis2_status_t AXIS2_CALL
    axis2_svc_set_ns_map(
        axis2_svc_t * svc,
        const axutil_env_t * env,
        axutil_hash_t * ns_map);

    /**
     * Populates the schema mappings. This method is used in code generation
     * and WSDL generation (WSDL2C and C2WSDL). This method deals with the 
     * imported schemas that would be there in the WSDL.
     * @param svc pointer to service struct
     * @param env pointer to environment struct
     * @return AXIS2_SUCCESS on success, else AXIS2_FAILURE 
     */
    /*AXIS2_EXTERN axis2_status_t AXIS2_CALL

       axis2_svc_populate_schema_mappings(
       axis2_svc_t *svc,
       const axutil_env_t *env); */

    AXIS2_EXTERN axutil_param_container_t *AXIS2_CALL

    axis2_svc_get_param_container(
        const axis2_svc_t * svc,
        const axutil_env_t * env);

    AXIS2_EXTERN axis2_flow_container_t *AXIS2_CALL

    axis2_svc_get_flow_container(
        const axis2_svc_t * svc,
        const axutil_env_t * env);

    /**
     * Creates a service struct instance.
     * @param env pointer to environment struct
     * @return pointer to newly created service
     */
    AXIS2_EXTERN axis2_svc_t *AXIS2_CALL
    axis2_svc_create(
        const axutil_env_t * env);

    /**
     * Creates a service struct with given QName.
     * @param env pointer to environment struct
     * @param qname service QName
     * @return pointer to newly created service
     */
    AXIS2_EXTERN axis2_svc_t *AXIS2_CALL
    axis2_svc_create_with_qname(
        const axutil_env_t * env,
        const axutil_qname_t * qname);

    AXIS2_EXTERN void *AXIS2_CALL
    axis2_svc_get_impl_class(
        const axis2_svc_t * svc,
        const axutil_env_t * env);

    AXIS2_EXTERN axis2_status_t AXIS2_CALL
    axis2_svc_set_impl_class(
        axis2_svc_t * svc,
        const axutil_env_t * env,
        void *impl_class);

    /**
     * Gets base description.
     * @param svc pointer to message
     * @param env pointer to environment struct
     * @return pointer to base description struct
     */
    AXIS2_EXTERN axis2_desc_t *AXIS2_CALL
    axis2_svc_get_base(
        const axis2_svc_t * svc,
        const axutil_env_t * env);

	/* Get the mutex associated with this service 
	 * @param svc pointer to message
     * @param env pointer to environment struct
     * @return pointer to a axutil_thread_mutext_t
     */
	AXIS2_EXTERN axutil_thread_mutex_t * AXIS2_CALL
	axis2_svc_get_mutex(
		const axis2_svc_t * svc,
		const axutil_env_t * env);
    /** @} */
#ifdef __cplusplus
}
#endif
#endif                          /* AXIS2_SVC_H */
