/*
 * 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_WSDL_DESC_H
#define AXIS2_WSDL_DESC_H

/**
 * @file axis2_wsdl_desc.h
 * @brief Axis2 Wsdl interface interface
 */

#include <axis2_const.h>
#include <axis2_error.h>
#include <axis2_defines.h>
#include <axis2_env.h>
#include <axis2_allocator.h>
#include <axis2_hash.h>
#include <axis2_array_list.h>
#include <axis2_qname.h>

#ifdef __cplusplus
extern "C"
{
#endif
    
struct axis2_wsdl_op;
struct axis2_wsdl_component;
struct axis2_wsdl_include;
struct axis2_wsdl_import;
struct axis2_wsdl_types;
struct axis2_wsdl_msg_ref;
struct axis2_wsdl_fault_ref;
struct axis2_wsdl_feature;
struct axis2_wsdl_property;
struct axis2_wsdl_binding;
struct axis2_wsdl_binding_fault;
struct axis2_wsdl_binding_op;
struct axis2_wsdl_extensible_attribute;
struct axis2_wsdl_interface;

typedef struct axis2_wsdl_desc axis2_wsdl_desc_t;
typedef struct axis2_wsdl_desc_ops axis2_wsdl_desc_ops_t;

/** @defgroup axis2_wsdl_desc Wsdl Description
 * @ingroup axis2_wsdl
 * @{
 */


/** 
 * @brief Wsdl Description ops struct
 * Encapsulator struct for ops of axis2_wsdl_desc
 */
 struct axis2_wsdl_desc_ops
{
   /** De-allocate memory
      * @return status code
      */
   axis2_status_t (AXIS2_CALL *
    free)(axis2_wsdl_desc_t *wsdl_desc,
          const axis2_env_t *env);

    /**
     * Returns a Map of <code>wsdl_bindings</code> Objects keyed by the 
     * <code>axis2_qname_t</code> of the Binding.
     *
     * @return
     */
    axis2_hash_t *(AXIS2_CALL *
    get_bindings)(axis2_wsdl_desc_t *wsdl_desc,  
                                    const axis2_env_t *env);
    
    /**
     * Sets the whole new set of Bindings to the axis2_wsd_desc.
     *
     * @param bindings
     */
    axis2_status_t (AXIS2_CALL *
    set_bindings)(axis2_wsdl_desc_t *wsdl_desc,
                                    const axis2_env_t *env,
                                    axis2_hash_t *bindings);
    
    /**
     * The axis2_wsdl_binding Will be added to the map keyed  with its own qname.
     * If the  axis2_wsdl_binding is null it will not be added.
     * If the axis2_wsdl_binding is not null and  Binding name is null then
     * error is set.
     *
     * @param binding <code>axis2_wsdl_binding</code> Object
     */
    axis2_status_t (AXIS2_CALL *
    add_binding)(axis2_wsdl_desc_t *wsdl_desc,
                                const axis2_env_t *env,
                                struct axis2_wsdl_binding *binding);
    
    /**
     * Retrives the <code>axis2_wsdl_binding_t</code> by its qname. Wil return NULL
     * if <code>axis2_wsdl_binding_t</code> is not found.
     *
     * @param qname The qname of the Binding.
     * @return
     */
    struct axis2_wsdl_binding *(AXIS2_CALL *
    get_binding)(axis2_wsdl_desc_t *wsdl_desc,
                                    const axis2_env_t *env,
                                    axis2_qname_t *qname);
    
    /**
     * The Interface component will be added to the map keyed with its own name.
     * If the Interface is NULL it will not be added.
     * If the interface name is NULL an Error will be set and return.
     *
     * @param interface
     */
    axis2_status_t (AXIS2_CALL *
    add_interface)(axis2_wsdl_desc_t *wsdl_desc,
                                    const axis2_env_t *env,
                                    struct axis2_wsdl_interface *interface);
    
    /**
     * The Interface will be returned if it exsists,
     * otherwise null will be returned.
     *
     * @param qname qname of the Interface.
     * @return The Interface with the relavent qname
     */
    struct axis2_wsdl_interface *(AXIS2_CALL *
    get_interface)(axis2_wsdl_desc_t *wsdl_desc,
                                    const axis2_env_t *env,
                                    axis2_qname_t *qname);
    
    /**
     * Method get_interfaces
     *
     * @return
     */
    axis2_hash_t *(AXIS2_CALL *
    get_interfaces)(axis2_wsdl_desc_t *wsdl_desc,
                                const axis2_env_t *env);
    
    /**
     * Method set_interfaces
     *
     * @param interfaces
     */
    axis2_status_t (AXIS2_CALL *
    set_interfaces)(axis2_wsdl_desc_t *wsdl_desc,
                                const axis2_env_t *env,
                                axis2_hash_t *interfaces);
    
    /**
     * Method get_svcs
     *
     * @return map of axis2_wsdl_svc's
     */
    axis2_hash_t *(AXIS2_CALL *
    get_svcs)(axis2_wsdl_desc_t *wsdl_desc,
                                const axis2_env_t *env);
    
    /**
     * Method set_svcs
     *
     * @param svcs
     */
    axis2_status_t (AXIS2_CALL *
    set_svcs)(axis2_wsdl_desc_t *wsdl_desc,
                                const axis2_env_t *env,
                                axis2_hash_t *svcs);
    
    /**
     * Will return the <code>axis2_wsdl_svc </code> if found otherwise return NULL.
     *
     * @param qname <code>qname</code> of the svc
     * @return The svc with the relevant qname
     */
    struct axis2_wsdl_svc *(AXIS2_CALL *
    get_svc)(axis2_wsdl_desc_t *wsdl_desc,
                                    const axis2_env_t *env,
                                    axis2_qname_t *qname);
    
    /**
     * Will add the <code>axis2_wsdl_svc_t</code> to the map.
     * If svc is NULL it will not be added.
     * If the <code>axis2_wsdl_svc_t</code> name is NULL an error will be set.
     *
     * @param svc
     */
    axis2_status_t (AXIS2_CALL *
    add_svc)(axis2_wsdl_desc_t *wsdl_desc,
                                    const axis2_env_t *env,
                                    struct axis2_wsdl_svc *svc);
    
    /**
     * Method get_target_namespace
     *
     * @return
     */
    axis2_char_t *(AXIS2_CALL *
    get_target_namespace)(axis2_wsdl_desc_t *wsdl_desc,
                                            const axis2_env_t *env);
    
    /**
     * Method set_target_namespace
     *
     * @param target_namespace
     */
    axis2_status_t (AXIS2_CALL *
    set_target_namespace)(axis2_wsdl_desc_t *wsdl_desc,
                                            const axis2_env_t *env,
                                            axis2_char_t *target_namespace);
    
    /**
     * Method get_types
     *
     * @return
     */
    struct axis2_wsdl_types *(AXIS2_CALL *
    get_types)(axis2_wsdl_desc_t *wsdl_desc,
                                const axis2_env_t *env);
    
    /**
     * Method axis2_wsdl_desc_set_types
     *
     * @param types
     */
    axis2_status_t (AXIS2_CALL *
    set_types)(axis2_wsdl_desc_t *wsdl_desc,
                                const axis2_env_t *env,
                                struct axis2_wsdl_types *types);
    
    /**
     * Gets the name attribute of the WSDL 1.1 Definitions Element
     *
     * @return
     */
    axis2_qname_t *(AXIS2_CALL *
    get_wsdl1_def_name)(axis2_wsdl_desc_t *wsdl_desc,
                                        const axis2_env_t *env);
    
    /**
     * Sets the name attribute of the WSDL 1.1 Definitions Element
     *
     * @param wsdl1_def_name
     */
    axis2_status_t (AXIS2_CALL *
    set_wsdl1_def_name)(axis2_wsdl_desc_t *wsdl_desc,
                                        const axis2_env_t *env,
                                        axis2_qname_t *wsdl1_def_name);
    
    /**
     * Will return the Namespace URI as a String if there exists an
     * Namespace URI associated with the given prefix, in the Definition
     * Component, Will return NULL if not found.
     *
     * @param prefix Prefix defined in the Definitions elemet in the WSDL file
     * @return The Namespace URI for the prefix.
     */
    axis2_char_t *(AXIS2_CALL *
    get_namespace)(axis2_wsdl_desc_t *wsdl_desc,
                                    const axis2_env_t *env,
                                    axis2_char_t *prefix);
    
    /**
     * Will return all the Namespaces associated with the Definition
     * Component and will be keyed by the Napespace Prefix.
     *
     * @return
     */
    axis2_hash_t *(AXIS2_CALL *
    get_namespaces)(axis2_wsdl_desc_t *wsdl_desc,
                                    const axis2_env_t *env);
    
    /**
     * Sets the Namespaces associated with the Difinition Component
     * and they should be keyed by its Namespace Prefix.
     *
     * @param namespaces
     */
    axis2_status_t (AXIS2_CALL *
    set_namespaces)(axis2_wsdl_desc_t *wsdl_desc,
                                const axis2_env_t *env,
                                axis2_hash_t *namespaces);
    
    /**
     * Returns the WSDL Imports in an <code>axis2_array_list_t</code>
     *
     * @return
     */
    axis2_array_list_t *(AXIS2_CALL *
    get_imports)(axis2_wsdl_desc_t *wsdl_desc,
                                const axis2_env_t *env);
    
    /**
     * Sets the imports as an <code>axis2_array_list_t</code>
     *
     * @param imports
     */
    axis2_status_t (AXIS2_CALL *
    set_imports)(axis2_wsdl_desc_t *wsdl_desc,
                                const axis2_env_t *env,
                                axis2_array_list_t *imports);
    
    /**
     * Adds an import to the list.
     *
     * @param wsdl_import
     */
    axis2_status_t (AXIS2_CALL *
    add_import)(axis2_wsdl_desc_t *wsdl_desc,
                                const axis2_env_t *env,
                                struct axis2_wsdl_import *wsdl_import);
    
    /**
     * Returns the Includes in an <code>axis2_array_list_t</code>
     *
     * @return
     */
    axis2_array_list_t *(AXIS2_CALL *
    get_includes)(axis2_wsdl_desc_t *wsdl_desc,
                                const axis2_env_t *env);
    
    /**
     * Sets the includes as an <code>axis2_array_list_t</code>
     *
     * @param includes
     */
    axis2_status_t (AXIS2_CALL *
    set_includes) (axis2_wsdl_desc_t *wsdl_desc,
                                const axis2_env_t *env,
                                axis2_array_list_t *includes);
    
    /**
     * Adds an wsdl include to the list.
     *
     * @param wsdl_include
     */
    axis2_status_t (AXIS2_CALL *
    add_include) (axis2_wsdl_desc_t *wsdl_desc,
                                const axis2_env_t *env,
                                struct axis2_wsdl_include *wsdl_include);
    
    struct axis2_wsdl_binding *(AXIS2_CALL *
    get_first_binding) (axis2_wsdl_desc_t *wsdl_desc,
                      const axis2_env_t *env);

};

/** 
 * @brief Wsdl container struct
 *   Property for params  
 */  
 struct axis2_wsdl_desc
{
   axis2_wsdl_desc_ops_t *ops;
    struct axis2_wsdl_component *component;
};

/**
 * Creates wsdl property struct
 * @return pointer to newly created wsdl property
 */
AXIS2_EXTERN axis2_wsdl_desc_t * AXIS2_CALL 
axis2_wsdl_desc_create (const axis2_env_t *env);

/*************************** Function macros **********************************/

#define AXIS2_WSDL_DESC_FREE(wsdl_desc, env) \
      ((wsdl_desc)->ops->free (wsdl_desc, env))

#define AXIS2_WSDL_DESC_GET_BINDINGS(wsdl_desc, env) \
      ((wsdl_desc)->ops->get_bindings (wsdl_desc, env))

#define AXIS2_WSDL_DESC_SET_BINDINGS(wsdl_desc, env, bindings) \
      ((wsdl_desc)->ops->set_bindings (wsdl_desc, env, bindings))

#define AXIS2_WSDL_DESC_ADD_BINDING(wsdl_desc, env, binding) \
      ((wsdl_desc)->ops->add_binding (wsdl_desc, env, binding))

#define AXIS2_WSDL_DESC_GET_BINDING(wsdl_desc, env, qname) \
      ((wsdl_desc)->ops->get_binding (wsdl_desc, env, qname))

#define AXIS2_WSDL_DESC_ADD_INTERFACE(wsdl_desc, env, interface) \
      ((wsdl_desc)->ops->add_interface (wsdl_desc, env, interface))
        
#define AXIS2_WSDL_DESC_GET_INTERFACE(wsdl_desc, env, qname) \
      ((wsdl_desc)->ops->get_interface (wsdl_desc, env, qname))

#define AXIS2_WSDL_DESC_GET_INTERFACES(wsdl_desc, env) \
      ((wsdl_desc)->ops->get_interfaces (wsdl_desc, env))        

#define AXIS2_WSDL_DESC_SET_INTERFACES(wsdl_desc, env, interfaces) \
      ((wsdl_desc)->ops->set_interfaces (wsdl_desc, env, interfaces))
        
#define AXIS2_WSDL_DESC_GET_SVCS(wsdl_desc, env) \
      ((wsdl_desc)->ops->get_svcs (wsdl_desc, env))
        
#define AXIS2_WSDL_DESC_SET_SVCS(wsdl_desc, env, svcs) \
      ((wsdl_desc)->ops->set_svcs (wsdl_desc, env, svcs))
        
#define AXIS2_WSDL_DESC_GET_SVC(wsdl_desc, env, qname) \
      ((wsdl_desc)->ops->get_svc (wsdl_desc, env, qname))

#define AXIS2_WSDL_DESC_ADD_SVC(wsdl_desc, env, svc) \
      ((wsdl_desc)->ops->add_svc (wsdl_desc, env, svc))

#define AXIS2_WSDL_DESC_GET_TARGET_NAMESPACE(wsdl_desc, env) \
      ((wsdl_desc)->ops->get_target_namespace (wsdl_desc, env))
        
#define AXIS2_WSDL_DESC_SET_TARGET_NAMESPACE(wsdl_desc, env, target_namespace) \
      ((wsdl_desc)->ops->set_target_namespace (wsdl_desc, env, target_namespace))
        
#define AXIS2_WSDL_DESC_GET_TYPES(wsdl_desc, env) \
      ((wsdl_desc)->ops->get_types (wsdl_desc, env))
        
#define AXIS2_WSDL_DESC_SET_TYPES(wsdl_desc, env, types) \
      ((wsdl_desc)->ops->set_types (wsdl_desc, env, types))

#define AXIS2_WSDL_DESC_GET_WSDL1_DEF_NAME(wsdl_desc, env) \
      ((wsdl_desc)->ops->get_wsdl1_def_name (wsdl_desc, env))
        
#define AXIS2_WSDL_DESC_SET_WSDL1_DEF_NAME(wsdl_desc, env, wsdl1_def_qname) \
      ((wsdl_desc)->ops->set_wsdl1_def_name (wsdl_desc, env, wsdl1_def_qname))

#define AXIS2_WSDL_DESC_GET_NAMESPACE(wsdl_desc, env, prefix) \
      ((wsdl_desc)->ops->get_namespace (wsdl_desc, env, prefix))

#define AXIS2_WSDL_DESC_GET_NAMESPACES(wsdl_desc, env) \
      ((wsdl_desc)->ops->get_namespaces (wsdl_desc, env))
        
#define AXIS2_WSDL_DESC_SET_NAMESPACES(wsdl_desc, env, namespaces) \
      ((wsdl_desc)->ops->set_namespace (wsdl_desc, env, namespaces))
        
#define AXIS2_WSDL_DESC_GET_IMPORTS(wsdl_desc, env) \
      ((wsdl_desc)->ops->get_imports (wsdl_desc, env))
        
#define AXIS2_WSDL_DESC_SET_IMPORTS(wsdl_desc, env, imports) \
      ((wsdl_desc)->ops->set_imports (wsdl_desc, env, imports))

#define AXIS2_WSDL_DESC_ADD_IMPORT(wsdl_desc, env, wsdl_import) \
      ((wsdl_desc)->ops->add_import (wsdl_desc, env, wsdl_import))
        
#define AXIS2_WSDL_DESC_GET_INCLUDES(wsdl_desc, env) \
      ((wsdl_desc)->ops->get_includes (wsdl_desc, env))

#define AXIS2_WSDL_DESC_SET_INCLUDES(wsdl_desc, env, includes) \
      ((wsdl_desc)->ops->set_includes (wsdl_desc, env, includes))

#define AXIS2_WSDL_DESC_ADD_INCLUDE(wsdl_desc, env, wsdl_include) \
      ((wsdl_desc)->ops->add_include (wsdl_desc, env, wsdl_include))
           
/*************************** End of function macros ***************************/

/** @} */

#ifdef __cplusplus
}
#endif
#endif  /* AXIS2_WSDL_DESC_H */
