
/*
 * 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);

    /**
     * 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 */
