/*
 * 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_OM_ELEMENT_H
#define AXIS2_OM_ELEMENT_H

#include <axis2_om_namespace.h>
#include <axis2_om_attribute.h>
#include <axis2_om_output.h>
#include <axis2_om_node.h>
#include <axis2_om_children_iterator.h>
#include <axis2_om_children_qname_iterator.h>
#include <axis2_om_child_element_iterator.h>
#include <axis2_hash.h>
#include <axis2.h>

#ifdef __cplusplus
extern "C"
{
#endif

    typedef struct axis2_om_element axis2_om_element_t;
    typedef struct axis2_om_element_ops axis2_om_element_ops_t;

/**
 * @defgroup axis2_om_element OM Element
 * @ingroup axis2_om 
 * @{
 */


    /** 
    * @brief OM element ops struct
    * Encapsulator struct for ops of axis2_om_element
    */
AXIS2_DECLARE_DATA   struct axis2_om_element_ops
    {
       /*
        * Find a namespace in the scope of the document.
        * Start to find from the given node and go up the hierarchy.
        * @param om_element pointer to om_element_struct contained in
        *        node , 
        * @param env Environment. MUST NOT be NULL.
        * @param node node containing an instance of an OM element,cannot be NULL.
        * @param uri namespace uri..
        * @param prefix namespace prefix. can be NULL.
        * @return pointer to the namespace, if found, else NULL. On error, returns 
        *           NULL and sets error code in environment,s error
        */
        axis2_om_namespace_t* (AXIS2_CALL *find_namespace)
                                        (axis2_om_element_t *om_element,
                                         axis2_env_t **env,
                                         axis2_om_node_t *node,
                                         const axis2_char_t *uri,
                                         const axis2_char_t *prefix);
      /**
        * Declare a namespace in current element (in the scope of this element ).
        * It checks to see if it is already declared.
        * @param om_element contained in the om node struct
        * @param env Environment. MUST NOT be NULL.
        * @param node node containing an instance of an OM element.
        * @param ns pointer to the namespace struct to be declared
        * @return satus of the op. AXIS2_SUCCESS on success else AXIS2_FAILURE.
        */
        axis2_status_t (AXIS2_CALL *declare_namespace)
                                        (axis2_om_element_t *om_element,
                                         axis2_env_t **env,
                                         axis2_om_node_t *node,
                                         axis2_om_namespace_t * ns);
       /**
        * Finds a namespace using qname
        * Start to find from the given node and go up the hierarchy.
        * @param om_element om_element contained in node
        * @param env Environment. MUST NOT be NULL.
        * @param node node containing an instance of an OM element, cannot be NULL.                                        
        * @param qname qname of the namespace to be found. cannot be NULL.
        * @return pointer to the namespace, if found, else NULL. On error, returns 
        *           NULL and sets the error code in environment's error struct.
        */
         axis2_om_namespace_t *(AXIS2_CALL *find_namespace_with_qname)
                                            (axis2_om_element_t *om_element,
                                             axis2_env_t **env,
                                             axis2_om_node_t *node,
                                             axis2_qname_t *qname);

      /**
        * Adds an attribute to current element
        * @param om_element element to which the attribute is to be added.cannot be NULL.
        * @param env Environment. MUST NOT be NULL.
        * @param attribute attribute to be added.
        * @param node axis2_om_node_t node that om_element is contained in
        * @return satus of the op. AXIS2_SUCCESS on success else AXIS2_FAILURE.
        */
         axis2_status_t (AXIS2_CALL *add_attribute)(axis2_om_element_t *om_element,
                                                    axis2_env_t **env,
                                                    axis2_om_attribute_t *attribute,
                                                    axis2_om_node_t *node);

      /**
        * Gets (finds) the attribute with the given qname
        * @param element element whose attribute is to be found. 
        * @param env Environment. MUST NOT be NULL.
        * @qname qname qname of the attribute to be found. should not be NULL.
        * @return a pointer to the attribute with given qname if found, else NULL.
        *           On error, returns NULL and sets the error code in environment's error struct.
        */
         axis2_om_attribute_t *(AXIS2_CALL *get_attribute) 
                                            (axis2_om_element_t *om_element,
                                             axis2_env_t **env,
                                             axis2_qname_t * qname);

      /**
        * Frees given element 
        * @param element OM element to be freed.
        * @param env Environment. MUST NOT be NULL.
         * @return satus of the op. AXIS2_SUCCESS on success ,AXIS2_FAILURE on error.
        */
         axis2_status_t (AXIS2_CALL *free) (axis2_om_element_t *element,
                                            axis2_env_t **env);

      /**
        * Serializes the start part of the given element
        * @param element element to be serialized.
        * @param env Environment. MUST NOT be NULL.
        * @param om_output OM output handler to be used in serializing
        * @return satus of the op. AXIS2_SUCCESS on success else AXIS2_FAILURE
        */
        axis2_status_t (AXIS2_CALL *serialize_start_part)
                                                (axis2_om_element_t *om_element,
                                                 axis2_env_t **env,
                                                 axis2_om_output_t * om_output);

      /**
        * Serializes the end part of the given element. serialize_start_part must 
        *     have been called before calling this method.
        * @param om_element element to be serialized.
        * @param env Environment must not be null.
        * @param om_output OM output handler to be used in serializing
        * @return satus of the op. AXIS2_SUCCESS on success else AXIS2_FAILURE
        */
        axis2_status_t (AXIS2_CALL *serialize_end_part)
                                                    (axis2_om_element_t *om_element,
                                                     axis2_env_t **env,
                                                     axis2_om_output_t * om_output);
       /**
        *  finds a namespace in current elements scope
        * @param om_element
        * @param env environemt must not be null
        * @param uri namespace uri
        * @param prefix prefix 
        * @return axis2_om_namespace_t if found, else return NULL
        */ 
        
        axis2_om_namespace_t* (AXIS2_CALL *find_declared_namespace)
                                        (axis2_om_element_t *om_element,
                                         axis2_env_t **env,
                                         const axis2_char_t *uri,
                                         const axis2_char_t *prefix);
                                                             
                                                        
       /**
        * returns the localname of this element
        * @param om_element om_element struct
        * @param env environment struct
        * @returns localname of element, returns NULL on error.
        */        
        axis2_char_t* (AXIS2_CALL *get_localname)(axis2_om_element_t *om_element,
                                                  axis2_env_t **env);
       /**
        * set the localname of this element
        * @param om_element om_element_struct to with localname is set
        * @param env environment struct
        * @localname text value to be set as localname 
        * @returns status code of op, AXIS2_SUCCESS on success,
        *                   AXIS2_FAILURE on error.
        */
        axis2_status_t (AXIS2_CALL *set_localname)(axis2_om_element_t *om_element,
                                                  axis2_env_t **env,
                                                  const axis2_char_t *localname);
        /**
         * get the namespace  of om_element 
         * @param om_element om_element struct
         * @param env environemt, MUST NOT be NULL.
         * @returns pointer to axis2_om_namespace_t struct 
         *          NULL if there is no namespace associated with the element,
         *          NULL on error with error code set to environment's error
         */
        axis2_om_namespace_t *(AXIS2_CALL *get_namespace)
                                                (axis2_om_element_t *om_element,
                                                 axis2_env_t **env);
       /**
        * set the namespace of the element
        * @param om_element Om_element struct
        * @param env environment must not be null
        * @param ns pointer to namespace
        * @returns status code of the op , NULL on error with error code 
        *                  set to environment's error
        */                                         
        axis2_status_t (AXIS2_CALL *set_namespace)(axis2_om_element_t *om_element,
                                                   axis2_env_t **env,
                                                   axis2_om_namespace_t *ns,
                                                   axis2_om_node_t *node);
        /**
         * get  the attribute list of the element 
         * @param om_element om element
         * @param env environment must not be null
         * @returns axis2_hash poiner to attributes hash
         * This hash table is read only 
         */
        axis2_hash_t* (AXIS2_CALL *get_all_attributes)
                                             (axis2_om_element_t *om_element,
                                             axis2_env_t **env);
        /**
         * get the namespace list of the element
         * @param om_element om element
         * @param env environment
         * @returns axis2_hash pointer to namespaces hash
         * this hash table is read only
         */                                             
        axis2_hash_t* (AXIS2_CALL *get_all_namespaces)
                                            (axis2_om_element_t *om_element,
                                             axis2_env_t **env);
        /**
         *@return qname of this element                                            
         */
        axis2_qname_t* (AXIS2_CALL *get_qname)(axis2_om_element_t *om_element,
                                                axis2_env_t **env);
        
       /**
        *   returns a list of children iterator
        *   iterators free function must be called by user
        */        
        axis2_om_children_iterator_t*(AXIS2_CALL *get_children)
                                      (axis2_om_element_t *om_element,
                                       axis2_env_t **env,
                                       axis2_om_node_t *element_node);
                                      
       /**
        *   returns a list of children iterator with qname
        *   returned iterator's free function must be called by user
        */        
                                                
        axis2_om_children_qname_iterator_t *(AXIS2_CALL *get_children_with_qname)
                            (axis2_om_element_t *om_element,
                             axis2_env_t **env,
                             axis2_qname_t *element_qname,
                             axis2_om_node_t* element_node);
        /**
         * returns the om_element corresponding to element_qname
         */                            
        
        axis2_om_element_t* (AXIS2_CALL *get_first_child_with_qname)
                            (axis2_om_element_t *om_element,
                             axis2_env_t **env,
                             axis2_qname_t *element_qname,
                             axis2_om_node_t* element_node,
                             axis2_om_node_t **child_node);                       
        /**
         * removes an attribute from the element attribute list
         * user must free this attribute, element free function does not free 
         * attributes that are not is it's attribute list
         * @param om_element
         * @param env
         * @param om_attribute attribute to be removed
         * @return AXIS2_SUCCESS if attribute was found and removed, else 
         *           AXIS2_FAILURE
         */         
        axis2_status_t (AXIS2_CALL *remove_attribute)
                            (axis2_om_element_t *om_element,
                             axis2_env_t **env,
                             axis2_om_attribute_t *om_attribute); 
        /**
         * Sets the text of the given element.
         *caution - This method will wipe out all the text elements (and hence any
         * mixed content) before setting the text
         */
        axis2_status_t (AXIS2_CALL *set_text)(axis2_om_element_t *om_element,
                                              axis2_env_t **env,
                                              axis2_char_t *text,
                                              axis2_om_node_t *element_node); 
        /**
         * select all the text children and concat them to a single string
         * @param element node , the container node of this om element
         * @return the contanated text of all text childrens text values
         *         return null if no text children is avilable or on error
         */                                              
        axis2_char_t* (AXIS2_CALL *
        get_text)(axis2_om_element_t *om_element,
                                             axis2_env_t **env,
                                             axis2_om_node_t *element_node);
        
        /**
         * returns the first child om element of this om element node
         * @param element_node the container node of this om_element
         * @return om_element if one is availble otherwise return NULL
         */
        axis2_om_element_t* (AXIS2_CALL *
        get_first_element)(axis2_om_element_t *om_element,
                             axis2_env_t **env,
                             axis2_om_node_t *element_node,
                             axis2_om_node_t **first_element_node);  
        /**
         * returns the serilized text of this element and its children
         * @param element_node the container node this on element is contained 
         * @return a char array of xml , returns NULL on error
         */
        axis2_char_t* (AXIS2_CALL *
        to_string)(axis2_om_element_t *om_element,
                      axis2_env_t **env,
                      axis2_om_node_t *element_node);
        /**
         * returns an iterator with child elements of type AXIS2_OM_ELEMENT
         * iterator must be freed by user
         * @param om_element
         * @param element_node
         * @param env enviroment must not be null
         * @returns axis2_om_child_element_iterator_t , NULL on error                                             
         */
         axis2_om_child_element_iterator_t* (AXIS2_CALL *
         get_child_elements)
                        (axis2_om_element_t *om_element,
                         axis2_env_t **env,
                         axis2_om_node_t *element_node);                                                                     
                                                                                
    };

    
  /**
    * \brief OM element struct
    * Handles the XML element in OM
    */
    struct axis2_om_element
    {
        /** ops of attribute struct */
        axis2_om_element_ops_t *ops;

    };

  /**
    * Creates an OM element with given local name
    * @param env Environment. MUST NOT be NULL.
    * @param parent parent of the element node to be created. can be NULL.
    * @param localname local name of the elment. cannot be NULL.
    * @param ns namespace of the element.  can be NULL.
    * @param node This is an out parameter. cannot be NULL.
    *                       Returns the node corresponding to the comment created.
    *                       Node type will be set to AXIS2_OM_ELEMENT
    * @return a pointer to the newly created element struct
    */
    AXIS2_DECLARE(axis2_om_element_t *)
    axis2_om_element_create (axis2_env_t **env,
                             axis2_om_node_t *parent,
                             const axis2_char_t *localname,
                             axis2_om_namespace_t *ns,
                             axis2_om_node_t **node);

  /**
    * Creates an OM element with given qname
    * @param env Environment. MUST NOT be NULL.
    * @param parent parent of the element node to be created. can be NULL.
    * @param qname qname of the elment.cannot be NULL.
    * @param node This is an out parameter. cannot be NULL.
    *                       Returns the node corresponding to the comment created.
    *                       Node type will be set to AXIS2_OM_ELEMENT
    * @return a pointer to the newly created element struct
    */
    AXIS2_DECLARE(axis2_om_element_t *) 
    axis2_om_element_create_with_qname (axis2_env_t **env,
                                        axis2_om_node_t *parent,
                                        axis2_qname_t *qname,
                                        axis2_om_node_t ** node);

/** finds given namespace with respect to given node */
#define AXIS2_OM_ELEMENT_FIND_NAMESPACE(om_element,env,om_node, uri, prefix) \
        ((om_element)->ops->find_namespace (om_element, env,om_node, uri, prefix))
        
/** declares given namespace with respect to the given node */
#define AXIS2_OM_ELEMENT_DECLARE_NAMESPACE(om_element, env , om_node, ns) \
        ((om_element)->ops->declare_namespace (om_element, env, om_node, ns))

/** finds namespace with given qname */
#define AXIS2_OM_ELEMENT_FIND_NAMESPACE_WITH_QNAME (om_element, env, om_node, qname) \
        ((om_element)->ops->find_namespace_with_qname (om_element, environment, om_node, qname))
        
/** adds given attribute to given element */
#define AXIS2_OM_ELEMENT_ADD_ATTRIBUTE(om_element, env, attribute, element_node) \
        ((om_element)->ops->add_attribute(om_element , env, attribute, element_node))
        
/** gets (finds) given attribute in given element */
#define AXIS2_OM_ELEMENT_GET_ATTRIBUTE(om_element, env, qname) \
        ((om_element)->ops->get_attribute(om_element, env, qname))
        
/** free an om element */
#define AXIS2_OM_ELEMENT_FREE(om_element, env) \
        ((om_element)->ops->free(om_element, env))
        
/** serialize the start part of given element */
#define AXIS2_OM_ELEMENT_SERIALIZE_START_PART(om_element, env, om_output) \
        ((om_element)->ops->serialize_start_part(om_element, env, om_output))
        
/** serialize the end part of given element */
#define AXIS2_OM_ELEMENT_SERIALIZE_END_PART(om_element, env, om_output) \
        ((om_element)->ops->serialize_end_part(om_element, env, om_output))
/** get localname */
#define AXIS2_OM_ELEMENT_GET_LOCALNAME(om_element, env)\
        ((om_element)->ops->get_localname(om_element,env))
/** get namespace of this element */        
#define AXIS2_OM_ELEMENT_GET_NAMESPACE(om_element, env) \
        ((om_element)->ops->get_namespace(om_element, env))
/** set localname */        
#define AXIS2_OM_ELEMENT_SET_LOCALNAME(om_element, env, localname) \
        ((om_element)->ops->set_localname(om_element, env, localname))
/** set namespace */        
#define AXIS2_OM_ELEMENT_SET_NAMESPACE(om_element, env, ns , node) \
        ((om_element)->ops->set_namespace(om_element, env, ns, node))

#define AXIS2_OM_ELEMENT_FIND_DECLARED_NAMESPACE(om_element, env, uri, prefix) \
        ((om_element)->ops->find_declared_namespace(om_element, env, uri, prefix))        
        
#define AXIS2_OM_ELEMENT_GET_QNAME(om_element, env) \
        ((om_element)->ops->get_qname(om_element, env))

#define AXIS2_OM_ELEMENT_GET_ALL_ATTRIBUTES(om_element, env) \
        ((om_element)->ops->get_all_attributes(om_element, env))

#define AXIS2_OM_ELEMENT_GET_ALL_NAMESPACES(om_element, env) \
        ((om_element)->ops->get_all_namespaces(om_element, env)) 
        
#define AXIS2_OM_ELEMENT_GET_CHILDREN(om_element, env, element_node) \
        ((om_element)->ops->get_children(om_element, env, element_node))

#define AXIS2_OM_ELEMENT_GET_CHILDREN_WITH_QNAME(om_element, env, \
            element_qname, element_node) \
        ((om_element)->ops->get_children_with_qname(om_element,\
            env, element_qname, element_node))

#define AXIS2_OM_ELEMENT_GET_FIRST_CHILD_WITH_QNAME(om_element, env,\
            element_qname, element_node , child_node) \
        ((om_element)->ops->get_first_child_with_qname(om_element, env, \
            element_qname, element_node, child_node))

#define AXIS2_OM_ELEMENT_REMOVE_ATTRIBUTE(om_element, env, om_attribute) \
        ((om_element)->ops->remove_attribute(om_element, env, om_attribute))

#define AXIS2_OM_ELEMENT_GET_FIRST_ELEMENT(om_element, env, element_node, first_node) \
        ((om_element)->ops->get_first_element(om_element, env, element_node, first_node))

#define AXIS2_OM_ELEMENT_GET_TEXT(om_element, env, element_node) \
        ((om_element)->ops->get_text(om_element, env, element_node))

#define AXIS2_OM_ELEMENT_SET_TEXT(om_element, env, text, element_node) \
        ((om_element)->ops->set_text(om_element, env, text, element_node))

#define AXIS2_OM_ELEMENT_TO_STRING(om_element, env, element_node) \
        ((om_element)->ops->to_string(om_element, env, element_node)) 
               
#define AXIS2_OM_ELEMENT_GET_CHILD_ELEMENTS(om_element, env, element_node) \
        ((om_element)->ops->get_child_elements(om_element, env, element_node))                
                
/** @} */


#ifdef __cplusplus
}
#endif

#endif    /* AXIS2_OM_ELEMENT_H */
