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