blob: 7677f05faa9b71bdcd08be8ee5956f24ff8c6f84 [file] [log] [blame]
/*
* 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.
*/
#include <axis2_om_element.h>
#include <axis2_om_attribute.h>
#include <axis2_om_namespace.h>
#include <axis2_xml_writer.h>
#include <string.h>
axis2_om_namespace_t *AXIS2_CALL
axis2_om_element_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);
axis2_status_t AXIS2_CALL
axis2_om_element_declare_namespace (axis2_om_element_t *om_element,
axis2_env_t **env,
axis2_om_node_t * node,
axis2_om_namespace_t * ns);
axis2_om_namespace_t *AXIS2_CALL
axis2_om_element_find_namespace_with_qname (axis2_om_element_t *om_element,
axis2_env_t **env,
axis2_om_node_t * node,
axis2_qname_t * qname);
axis2_om_namespace_t *AXIS2_CALL
axis2_om_element_find_declared_namespace (axis2_om_element_t *om_element,
axis2_env_t **env,
const axis2_char_t *uri,
const axis2_char_t *prefix);
axis2_status_t AXIS2_CALL
axis2_om_element_add_attribute (axis2_om_element_t *element,
axis2_env_t **env,
axis2_om_attribute_t *attribute,
axis2_om_node_t *element_node);
axis2_om_attribute_t *AXIS2_CALL
axis2_om_element_get_attribute(axis2_om_element_t *element,
axis2_env_t **env,
axis2_qname_t * qname);
axis2_status_t AXIS2_CALL
axis2_om_element_free (axis2_om_element_t *element,
axis2_env_t **env);
axis2_status_t AXIS2_CALL
axis2_om_element_serialize_start_part(axis2_om_element_t * element,
axis2_env_t **env,
axis2_om_output_t *om_output);
axis2_status_t AXIS2_CALL
axis2_om_element_serialize_end_part (axis2_om_element_t * element,
axis2_env_t **env,
axis2_om_output_t * om_output);
axis2_char_t* AXIS2_CALL
axis2_om_element_get_localname(axis2_om_element_t *om_element,
axis2_env_t **env);
axis2_status_t AXIS2_CALL
axis2_om_element_set_localname(axis2_om_element_t *om_element,
axis2_env_t **env,
const axis2_char_t *localname);
axis2_om_namespace_t *AXIS2_CALL
axis2_om_element_get_namespace(axis2_om_element_t *om_element,
axis2_env_t **env);
axis2_status_t AXIS2_CALL
axis2_om_element_set_namespace(axis2_om_element_t *om_element,
axis2_env_t **env,
axis2_om_namespace_t *ns,
axis2_om_node_t *node);
axis2_hash_t * AXIS2_CALL
axis2_om_element_get_all_attributes(axis2_om_element_t *om_element,
axis2_env_t **env);
axis2_hash_t* AXIS2_CALL
axis2_om_element_get_all_namespaces(axis2_om_element_t *om_element,
axis2_env_t **env);
axis2_qname_t* AXIS2_CALL
axis2_om_element_get_qname(axis2_om_element_t *om_element,
axis2_env_t **env);
axis2_om_children_iterator_t* AXIS2_CALL
axis2_om_element_get_children(axis2_om_element_t *om_element,
axis2_env_t **env,
axis2_om_node_t *element_node);
axis2_om_children_qname_iterator_t* AXIS2_CALL
axis2_om_element_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);
axis2_om_element_t* AXIS2_CALL
axis2_om_element_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);
axis2_status_t AXIS2_CALL
axis2_om_element_remove_attribute(axis2_om_element_t *om_element,
axis2_env_t **env,
axis2_om_attribute_t *om_attribute);
axis2_om_element_t* AXIS2_CALL
axis2_om_element_get_first_element(axis2_om_element_t *om_element,
axis2_env_t **env,
axis2_om_node_t *element_node,
axis2_om_node_t **first_ele_node);
axis2_char_t* AXIS2_CALL
axis2_om_element_get_text(axis2_om_element_t *om_element,
axis2_env_t **env,
axis2_om_node_t *element_node);
axis2_status_t AXIS2_CALL
axis2_om_element_set_text(axis2_om_element_t *om_element,
axis2_env_t **env,
axis2_char_t *text,
axis2_om_node_t *element_node);
axis2_char_t* AXIS2_CALL
axis2_om_element_to_string(axis2_om_element_t *om_element,
axis2_env_t **env,
axis2_om_node_t *element_node);
axis2_om_child_element_iterator_t * AXIS2_CALL
axis2_om_element_get_child_elements(axis2_om_element_t *om_element,
axis2_env_t **env,
axis2_om_node_t *element_node);
/************************** end function prototypes **********************/
typedef struct axis2_om_element_impl
{
axis2_om_element_t om_element;
/** Element's namespace */
axis2_om_namespace_t *ns;
/** Element's local name */
axis2_char_t *localname;
/** List of attributes */
axis2_hash_t *attributes;
/** List of namespaces */
axis2_hash_t *namespaces;
axis2_qname_t *qname;
}axis2_om_element_impl_t;
/************************************Macro *****************************/
#define AXIS2_INTF_TO_IMPL(om_element) ((axis2_om_element_impl_t*)om_element)
#define AXIS2_IMPL_TO_INTF(element) &(element->om_element)
/**********************************************************************/
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)
{
axis2_om_element_impl_t *element;
AXIS2_ENV_CHECK(env, NULL);
if (!localname || !node)
{
AXIS2_ERROR_SET_ERROR_NUMBER((*env)->error, AXIS2_ERROR_INVALID_NULL_PARAM);
AXIS2_ERROR_SET_STATUS_CODE((*env)->error, AXIS2_FAILURE);
return NULL;
}
(*node) = axis2_om_node_create (env);
if (!(*node))
{
AXIS2_ERROR_SET_ERROR_NUMBER((*env)->error, AXIS2_ERROR_NO_MEMORY);
AXIS2_ERROR_SET_STATUS_CODE((*env)->error, AXIS2_FAILURE);
return NULL;
}
element = (axis2_om_element_impl_t *) AXIS2_MALLOC ((*env)->allocator,
sizeof (axis2_om_element_impl_t));
if (!element)
{
AXIS2_FREE ((*env)->allocator, (*node));
AXIS2_ERROR_SET_ERROR_NUMBER((*env)->error, AXIS2_ERROR_NO_MEMORY);
AXIS2_ERROR_SET_STATUS_CODE((*env)->error, AXIS2_FAILURE);
return NULL;
}
element->ns = NULL;
element->localname = NULL;
element->attributes = NULL;
element->namespaces = NULL;
element->qname = NULL;
element->localname = (axis2_char_t *) AXIS2_STRDUP(localname,env);
if (!element->localname)
{
AXIS2_FREE ((*env)->allocator, element);
AXIS2_FREE ((*env)->allocator, (*node));
AXIS2_ERROR_SET_ERROR_NUMBER((*env)->error, AXIS2_ERROR_NO_MEMORY);
AXIS2_ERROR_SET_STATUS_CODE((*env)->error, AXIS2_FAILURE);
return NULL;
}
if (parent)
{
AXIS2_OM_NODE_SET_PARENT((*node), env, parent);
AXIS2_OM_NODE_ADD_CHILD(parent, env, (*node));
}
AXIS2_OM_NODE_SET_BUILD_STATUS((*node), env, AXIS2_FALSE);
AXIS2_OM_NODE_SET_NODE_TYPE((*node), env, AXIS2_OM_ELEMENT);
AXIS2_OM_NODE_SET_DATA_ELEMENT((*node), env, element);
if (ns)
{
element->ns =
axis2_om_element_find_namespace (AXIS2_IMPL_TO_INTF(element), env, *node,
AXIS2_OM_NAMESPACE_GET_URI(ns, env),
AXIS2_OM_NAMESPACE_GET_PREFIX(ns, env));
if (!(element->ns))
{
if (axis2_om_element_declare_namespace(&(element->om_element),
env, *node, ns) == AXIS2_SUCCESS)
element->ns = ns;
}
}
element->om_element.ops = NULL;
element->om_element.ops = (axis2_om_element_ops_t *)AXIS2_MALLOC(
(*env)->allocator,
sizeof(axis2_om_element_ops_t));
if (!element->om_element.ops)
{
AXIS2_FREE ((*env)->allocator, element->localname);
AXIS2_FREE ((*env)->allocator, element);
AXIS2_FREE ((*env)->allocator,(*node));
AXIS2_ERROR_SET_ERROR_NUMBER((*env)->error, AXIS2_ERROR_NO_MEMORY);
AXIS2_ERROR_SET_STATUS_CODE((*env)->error, AXIS2_FAILURE);
return NULL;
}
/* set function pointers */
element->om_element.ops->find_namespace =
axis2_om_element_find_namespace;
element->om_element.ops->declare_namespace =
axis2_om_element_declare_namespace;
element->om_element.ops->find_namespace_with_qname =
axis2_om_element_find_namespace_with_qname;
element->om_element.ops->add_attribute =
axis2_om_element_add_attribute;
element->om_element.ops->get_attribute =
axis2_om_element_get_attribute;
element->om_element.ops->free = axis2_om_element_free;
element->om_element.ops->serialize_start_part =
axis2_om_element_serialize_start_part;
element->om_element.ops->serialize_end_part =
axis2_om_element_serialize_end_part;
element->om_element.ops->set_localname =
axis2_om_element_set_localname;
element->om_element.ops->set_namespace =
axis2_om_element_set_namespace;
element->om_element.ops->get_localname =
axis2_om_element_get_localname;
element->om_element.ops->get_namespace =
axis2_om_element_get_namespace;
element->om_element.ops->find_declared_namespace =
axis2_om_element_find_declared_namespace;
element->om_element.ops->get_all_attributes =
axis2_om_element_get_all_attributes;
element->om_element.ops->get_all_namespaces =
axis2_om_element_get_all_namespaces;
element->om_element.ops->get_qname =
axis2_om_element_get_qname;
element->om_element.ops->get_children =
axis2_om_element_get_children;
element->om_element.ops->get_children_with_qname =
axis2_om_element_get_children_with_qname;
element->om_element.ops->get_first_child_with_qname =
axis2_om_element_get_first_child_with_qname;
element->om_element.ops->remove_attribute =
axis2_om_element_remove_attribute;
element->om_element.ops->set_text =
axis2_om_element_set_text;
element->om_element.ops->get_text =
axis2_om_element_get_text;
element->om_element.ops->get_first_element =
axis2_om_element_get_first_element;
element->om_element.ops->to_string =
axis2_om_element_to_string;
element->om_element.ops->get_child_elements =
axis2_om_element_get_child_elements;
return &(element->om_element);
}
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)
{
axis2_om_element_t *element = NULL;
AXIS2_ENV_CHECK(env, NULL);
if (!qname || !(*node))
{
AXIS2_ERROR_SET_ERROR_NUMBER((*env)->error, AXIS2_ERROR_INVALID_NULL_PARAM);
AXIS2_ERROR_SET_STATUS_CODE((*env)->error, AXIS2_FAILURE);
return NULL;
}
/* TODO:handle namespace in the following */
element = axis2_om_element_create (env, parent,
AXIS2_QNAME_GET_LOCALPART(qname, env), NULL, node);
if (*node)
{
axis2_om_element_t *ele =
((axis2_om_element_t *)AXIS2_OM_NODE_GET_DATA_ELEMENT((*node), env));
if ( AXIS2_INTF_TO_IMPL(ele)->ns)
{
axis2_om_namespace_t *ns = AXIS2_INTF_TO_IMPL(ele)->ns;
AXIS2_INTF_TO_IMPL(element)->ns =
axis2_om_element_find_namespace (element, env, *node,
AXIS2_OM_NAMESPACE_GET_URI(ns, env),
AXIS2_OM_NAMESPACE_GET_PREFIX(ns, env));
if (!(AXIS2_INTF_TO_IMPL(element)->ns))
{
if (axis2_om_element_declare_namespace(element, env, *node, ns) == AXIS2_SUCCESS)
(AXIS2_INTF_TO_IMPL(element)->ns) = ns;
}
}
}
return element;
}
axis2_om_namespace_t * AXIS2_CALL
axis2_om_element_find_namespace (axis2_om_element_t *ele,
axis2_env_t **env,
axis2_om_node_t * node,
const axis2_char_t * uri,
const axis2_char_t * prefix)
{
void *ns = NULL;
axis2_hash_index_t *hashindex;
axis2_om_element_t *element = NULL;
axis2_om_node_t *parent = NULL;
AXIS2_ENV_CHECK(env, NULL);
if (!node)
{
AXIS2_ERROR_SET_ERROR_NUMBER((*env)->error, AXIS2_ERROR_INVALID_NULL_PARAM);
AXIS2_ERROR_SET_STATUS_CODE((*env)->error, AXIS2_FAILURE);
return NULL;
}
if (!AXIS2_OM_NODE_GET_DATA_ELEMENT(node, env) ||
AXIS2_OM_NODE_GET_NODE_TYPE(node, env) != AXIS2_OM_ELEMENT)
{
/* wrong element type or null node */
AXIS2_ERROR_SET_ERROR_NUMBER((*env)->error, AXIS2_ERROR_INVALID_NODE_TYPE);
AXIS2_ERROR_SET_STATUS_CODE((*env)->error, AXIS2_FAILURE);
return NULL;
}
element = (axis2_om_element_t *) AXIS2_OM_NODE_GET_DATA_ELEMENT(node, env);
if (AXIS2_INTF_TO_IMPL(element)->namespaces)
if (!prefix || axis2_strcmp ( prefix, "") == 0)
{
for (hashindex = axis2_hash_first (AXIS2_INTF_TO_IMPL(element)->namespaces, env);
hashindex; hashindex = axis2_hash_next (env, hashindex))
{
axis2_hash_this (hashindex, NULL, NULL, &ns);
if (ns &&
axis2_strcmp (AXIS2_OM_NAMESPACE_GET_URI(
(axis2_om_namespace_t *) (ns), env),uri) == 0)
{
AXIS2_FREE ((*env)->allocator, hashindex);
return (axis2_om_namespace_t *) (ns);
}
}
ns = NULL;
}
if (AXIS2_INTF_TO_IMPL(element)->namespaces && prefix)
{ ns = axis2_hash_get (AXIS2_INTF_TO_IMPL(element)->namespaces, prefix,
AXIS2_HASH_KEY_STRING);
if (ns)
{
return (axis2_om_namespace_t*)ns;
}
}
parent = AXIS2_OM_NODE_GET_PARENT(node, env);
if ((parent != NULL) &&
(AXIS2_OM_NODE_GET_NODE_TYPE(parent, env) == AXIS2_OM_ELEMENT))
{
return axis2_om_element_find_namespace (
(axis2_om_element_t*)AXIS2_OM_NODE_GET_DATA_ELEMENT(node, env),
env, parent, uri, prefix);
}
return NULL;
}
axis2_status_t AXIS2_CALL
axis2_om_element_declare_namespace (axis2_om_element_t *ele,
axis2_env_t **env,
axis2_om_node_t *node,
axis2_om_namespace_t *ns)
{
axis2_om_namespace_t *declared_ns = NULL;
axis2_om_element_t *element = NULL;
AXIS2_ENV_CHECK(env, AXIS2_FAILURE);
if (!node || !ns)
{
AXIS2_ERROR_SET_ERROR_NUMBER((*env)->error, AXIS2_ERROR_INVALID_NULL_PARAM);
AXIS2_ERROR_SET_STATUS_CODE((*env)->error, AXIS2_FAILURE);
return AXIS2_FAILURE;
}
declared_ns = axis2_om_element_find_namespace(ele, env, node,
AXIS2_OM_NAMESPACE_GET_URI(ns, env),
AXIS2_OM_NAMESPACE_GET_PREFIX(ns ,env));
if (declared_ns)
{
/*Namespace already declared, so return */
return AXIS2_SUCCESS;
}
element = (axis2_om_element_t *) AXIS2_OM_NODE_GET_DATA_ELEMENT(node, env);
if (!element)
{
AXIS2_ERROR_SET_ERROR_NUMBER((*env)->error, AXIS2_ERROR_INVALID_NULL_PARAM);
AXIS2_ERROR_SET_STATUS_CODE((*env)->error, AXIS2_FAILURE);
return AXIS2_FAILURE;
}
if (!(AXIS2_INTF_TO_IMPL(element)->namespaces))
{
AXIS2_INTF_TO_IMPL(element)->namespaces = axis2_hash_make (env);
if (!(AXIS2_INTF_TO_IMPL(element)->namespaces))
return AXIS2_FAILURE;
}
if (AXIS2_OM_NAMESPACE_GET_PREFIX(ns,env))
{ axis2_hash_set (AXIS2_INTF_TO_IMPL(element)->namespaces,
AXIS2_OM_NAMESPACE_GET_PREFIX(ns,env),
AXIS2_HASH_KEY_STRING, ns);
}
else
{
axis2_hash_set (AXIS2_INTF_TO_IMPL(element)->namespaces,
"default", AXIS2_HASH_KEY_STRING, ns);
}
return AXIS2_SUCCESS;
}
axis2_om_namespace_t * AXIS2_CALL
axis2_om_element_find_declared_namespace (axis2_om_element_t *om_element,
axis2_env_t **env,
const axis2_char_t * uri,
const axis2_char_t * prefix)
{
axis2_hash_index_t *hash_index = NULL;
void *ns = NULL;
axis2_om_element_impl_t *om_element_impl = NULL;
AXIS2_ENV_CHECK(env, NULL);
AXIS2_PARAM_CHECK((*env)->error, uri, NULL);
om_element_impl = AXIS2_INTF_TO_IMPL(om_element);
if (!(om_element_impl->namespaces))
{
return NULL;
}
if (!prefix || AXIS2_STRCMP(prefix, "") == 0)
{
for (hash_index = axis2_hash_first (om_element_impl->namespaces, env);
hash_index; hash_index = axis2_hash_next (env, hash_index))
{
axis2_hash_this (hash_index, NULL, NULL, &ns);
if (AXIS2_STRCMP(AXIS2_OM_NAMESPACE_GET_URI(
(axis2_om_namespace_t *)(ns), env), uri) == 0)
{
AXIS2_FREE ((*env)->allocator, hash_index);
return (axis2_om_namespace_t *) (ns);
}
}
ns = NULL;
return NULL;
}
ns = axis2_hash_get (om_element_impl->namespaces, prefix, AXIS2_HASH_KEY_STRING);
if (ns)
return (axis2_om_namespace_t *) ns;
else
return NULL;
}
axis2_om_namespace_t * AXIS2_CALL
axis2_om_element_find_namespace_with_qname (axis2_om_element_t *element,
axis2_env_t **env,
axis2_om_node_t *node,
axis2_qname_t *qname)
{
AXIS2_ENV_CHECK(env, NULL);
if (!node || !qname)
{
AXIS2_ERROR_SET_ERROR_NUMBER((*env)->error,
AXIS2_ERROR_INVALID_NULL_PARAM);
AXIS2_ERROR_SET_STATUS_CODE((*env)->error, AXIS2_FAILURE);
return NULL;
}
if (AXIS2_QNAME_GET_URI(qname, env))
{
return axis2_om_element_find_namespace (element, env, node,
AXIS2_QNAME_GET_URI(qname, env),
AXIS2_QNAME_GET_PREFIX(qname, env));
}
else
{
return NULL;
}
}
axis2_status_t AXIS2_CALL
axis2_om_element_add_attribute (axis2_om_element_t *om_element,
axis2_env_t **env,
axis2_om_attribute_t *attribute,
axis2_om_node_t *element_node)
{
axis2_qname_t *qname = NULL;
axis2_om_element_impl_t *om_element_impl = NULL;
axis2_om_namespace_t *om_namespace = NULL;
axis2_om_namespace_t *temp_ns = NULL;
AXIS2_ENV_CHECK(env, AXIS2_FAILURE);
AXIS2_PARAM_CHECK((*env)->error, attribute, AXIS2_FAILURE);
om_element_impl = AXIS2_INTF_TO_IMPL(om_element);
om_namespace = AXIS2_OM_ATTRIBUTE_GET_NAMESPACE(attribute, env);
if(om_namespace)
{
temp_ns = AXIS2_OM_ELEMENT_FIND_NAMESPACE
(om_element, env,
element_node,
AXIS2_OM_NAMESPACE_GET_URI(om_namespace, env),
AXIS2_OM_NAMESPACE_GET_PREFIX(om_namespace, env));
if(!temp_ns)
{
AXIS2_OM_ELEMENT_DECLARE_NAMESPACE(om_element, env,
element_node, om_namespace);
}
}
if(!(om_element_impl->attributes))
{
om_element_impl->attributes = axis2_hash_make (env);
if (!(om_element_impl->attributes))
return AXIS2_FAILURE;
}
qname = AXIS2_OM_ATTRIBUTE_GET_QNAME(attribute, env);
if (qname)
{
axis2_char_t *name = AXIS2_QNAME_TO_STRING(qname, env);
axis2_hash_set (om_element_impl->attributes,
name, AXIS2_HASH_KEY_STRING,
attribute);
}
return ((qname) ? AXIS2_SUCCESS : AXIS2_FAILURE);
}
axis2_om_attribute_t * AXIS2_CALL
axis2_om_element_get_attribute (axis2_om_element_t *om_element,
axis2_env_t **env,
axis2_qname_t *qname)
{
axis2_om_element_impl_t *element_impl = NULL;
axis2_char_t *name = NULL;
axis2_om_attribute_t *attr = NULL;
AXIS2_ENV_CHECK(env, NULL);
element_impl = AXIS2_INTF_TO_IMPL(om_element);
if (!qname)
{
AXIS2_ERROR_SET_ERROR_NUMBER((*env)->error,
AXIS2_ERROR_INVALID_NULL_PARAM);
AXIS2_ERROR_SET_STATUS_CODE((*env)->error, AXIS2_FAILURE);
return NULL;
}
name = AXIS2_QNAME_TO_STRING(qname, env);
if (element_impl->attributes)
{
attr = (axis2_om_attribute_t*) (axis2_hash_get(element_impl->attributes, name, AXIS2_HASH_KEY_STRING));
}
return attr;
}
axis2_status_t AXIS2_CALL
axis2_om_element_free (axis2_om_element_t *om_element,
axis2_env_t **env)
{
axis2_status_t status = AXIS2_SUCCESS;
axis2_om_element_impl_t *element_impl = NULL;
AXIS2_ENV_CHECK(env, AXIS2_FAILURE);
element_impl = AXIS2_INTF_TO_IMPL(om_element);
if (element_impl->localname)
{
AXIS2_FREE ((*env)->allocator,element_impl->localname);
}
if (element_impl->ns)
{
/* it is the responsibility of the element where the namespace is declared to free it */
}
if (element_impl->attributes)
{
axis2_hash_index_t *hi;
void *val = NULL;
for (hi = axis2_hash_first (element_impl->attributes, env); hi;
hi = axis2_hash_next ( env, hi))
{
axis2_hash_this (hi, NULL, NULL, &val);
if (val)
status = AXIS2_OM_ATTRIBUTE_FREE ((axis2_om_attribute_t *)val, env);
else
{
status = AXIS2_FAILURE;
}
val = NULL;
}
axis2_hash_free (AXIS2_INTF_TO_IMPL(om_element)->attributes, env);
}
if (element_impl->namespaces)
{
axis2_hash_index_t *hi;
void *val = NULL;
for (hi = axis2_hash_first (element_impl->namespaces, env); hi;
hi = axis2_hash_next ( env, hi))
{
axis2_hash_this (hi, NULL, NULL, &val);
if (val)
AXIS2_OM_NAMESPACE_FREE ((axis2_om_namespace_t *)val, env);
val = NULL;
}
axis2_hash_free (element_impl->namespaces, env);
/*TODO: free namespaces */
/* need to iterate and free individual namespaces */
}
if(element_impl->qname)
AXIS2_QNAME_FREE(element_impl->qname, env);
AXIS2_FREE ((*env)->allocator, om_element->ops);
AXIS2_FREE ((*env)->allocator, element_impl);
return status;
}
axis2_status_t AXIS2_CALL
axis2_om_element_serialize_start_part (axis2_om_element_t *om_element,
axis2_env_t **env,
axis2_om_output_t *om_output)
{
int status = AXIS2_SUCCESS;
axis2_om_element_impl_t *ele_impl = NULL;
AXIS2_ENV_CHECK(env, AXIS2_FAILURE);
if (!om_output)
{
AXIS2_ERROR_SET_ERROR_NUMBER((*env)->error,
AXIS2_ERROR_INVALID_NULL_PARAM);
AXIS2_ERROR_SET_STATUS_CODE((*env)->error, AXIS2_FAILURE);
return AXIS2_FAILURE;
}
ele_impl = AXIS2_INTF_TO_IMPL(om_element);
if (ele_impl->ns &&
AXIS2_OM_NAMESPACE_GET_URI(ele_impl->ns, env) &&
AXIS2_OM_NAMESPACE_GET_PREFIX(ele_impl->ns, env))
{
status = axis2_om_output_write (om_output, env,
AXIS2_OM_ELEMENT, 3,
ele_impl->localname,
AXIS2_OM_NAMESPACE_GET_URI(ele_impl->ns, env),
AXIS2_OM_NAMESPACE_GET_PREFIX(ele_impl->ns, env));
}
else if (ele_impl->ns &&
AXIS2_OM_NAMESPACE_GET_URI(ele_impl->ns, env) &&
!AXIS2_OM_NAMESPACE_GET_PREFIX(ele_impl->ns, env))
{
status =
axis2_om_output_write (om_output, env,
AXIS2_OM_ELEMENT, 2,
ele_impl->localname,
AXIS2_OM_NAMESPACE_GET_URI(ele_impl->ns, env));
}
else
{
status = axis2_om_output_write (om_output, env,
AXIS2_OM_ELEMENT, 1, ele_impl->localname);
}
if (ele_impl->attributes)
{
axis2_hash_index_t *hi;
void *val;
for (hi = axis2_hash_first (ele_impl->attributes, env); hi;
hi = axis2_hash_next (env, hi))
{
axis2_hash_this (hi, NULL, NULL, &val);
if (val)
status =
AXIS2_OM_ATTRIBUTE_SERIALIZE ((axis2_om_attribute_t *)val,
env, om_output);
else
{
status = AXIS2_FAILURE;
}
}
}
if (ele_impl->namespaces)
{
axis2_hash_index_t *hi;
void *val;
for (hi = axis2_hash_first ( ele_impl->namespaces, env); hi;
hi = axis2_hash_next (env, hi))
{
axis2_hash_this (hi, NULL, NULL, &val);
if (val)
status =
AXIS2_OM_NAMESPACE_SERIALIZE((axis2_om_namespace_t *)val,
env, om_output);
else
{
status = AXIS2_FAILURE;
}
}
}
return status;
}
axis2_status_t AXIS2_CALL
axis2_om_element_serialize_end_part (axis2_om_element_t *om_element,
axis2_env_t **env,
axis2_om_output_t * om_output)
{
int status = AXIS2_SUCCESS;
if (!om_output)
{
AXIS2_ERROR_SET_ERROR_NUMBER((*env)->error ,
AXIS2_ERROR_INVALID_NULL_PARAM);
AXIS2_ERROR_SET_STATUS_CODE((*env)->error , AXIS2_FAILURE);
return AXIS2_FAILURE;
}
status =
axis2_om_output_write (om_output, env, AXIS2_OM_ELEMENT, 0);
return status;
}
axis2_char_t* AXIS2_CALL
axis2_om_element_get_localname(axis2_om_element_t *om_element,
axis2_env_t **env)
{
AXIS2_ENV_CHECK(env, NULL);
return AXIS2_INTF_TO_IMPL(om_element)->localname;
}
axis2_status_t AXIS2_CALL
axis2_om_element_set_localname(axis2_om_element_t *om_element,
axis2_env_t **env,
const axis2_char_t *localname)
{
AXIS2_ENV_CHECK(env, AXIS2_FAILURE);
AXIS2_PARAM_CHECK((*env)->error, localname, AXIS2_FAILURE);
AXIS2_INTF_TO_IMPL(om_element)->localname =
(axis2_char_t*)AXIS2_STRDUP(localname,env);
return AXIS2_SUCCESS;
}
axis2_om_namespace_t *AXIS2_CALL
axis2_om_element_get_namespace(axis2_om_element_t *om_element,
axis2_env_t **env)
{
AXIS2_ENV_CHECK(env, NULL);
return AXIS2_INTF_TO_IMPL(om_element)->ns;
}
axis2_status_t AXIS2_CALL
axis2_om_element_set_namespace(axis2_om_element_t *om_element,
axis2_env_t **env,
axis2_om_namespace_t *ns,
axis2_om_node_t *node)
{
axis2_om_namespace_t *om_ns = NULL;
axis2_status_t status = AXIS2_FAILURE;
AXIS2_ENV_CHECK(env, AXIS2_FAILURE);
AXIS2_PARAM_CHECK((*env)->error,ns , AXIS2_FAILURE);
om_ns = axis2_om_element_find_namespace(om_element, env, node,
AXIS2_OM_NAMESPACE_GET_URI(ns, env),
AXIS2_OM_NAMESPACE_GET_PREFIX(ns , env));
if(!om_ns)
{
status = axis2_om_element_declare_namespace(om_element, env, node, ns);
AXIS2_INTF_TO_IMPL(om_element)->ns = ns;
}
else
AXIS2_INTF_TO_IMPL(om_element)->ns = om_ns;
return AXIS2_SUCCESS;
}
axis2_hash_t * AXIS2_CALL
axis2_om_element_get_all_attributes(axis2_om_element_t *om_element,
axis2_env_t **env)
{
AXIS2_ENV_CHECK(env, NULL);
return AXIS2_INTF_TO_IMPL(om_element)->attributes;
}
axis2_hash_t* AXIS2_CALL
axis2_om_element_get_all_namespaces
(axis2_om_element_t *om_element,
axis2_env_t **env)
{
AXIS2_ENV_CHECK(env, NULL);
return AXIS2_INTF_TO_IMPL(om_element)->namespaces;
}
axis2_qname_t* AXIS2_CALL
axis2_om_element_get_qname(axis2_om_element_t *om_element,
axis2_env_t **env)
{
axis2_om_namespace_t *ns = NULL;
axis2_om_element_impl_t *om_element_impl = NULL;
AXIS2_ENV_CHECK(env, NULL);
om_element_impl = AXIS2_INTF_TO_IMPL(om_element);
if(om_element_impl->qname)
{
return om_element_impl->qname;
}
else
{
ns = AXIS2_OM_ELEMENT_GET_NAMESPACE(om_element, env);
if(ns)
{
if(AXIS2_OM_NAMESPACE_GET_PREFIX(ns, env))
{
om_element_impl->qname = axis2_qname_create(env ,
om_element_impl->localname,
AXIS2_OM_NAMESPACE_GET_URI(ns, env),
AXIS2_OM_NAMESPACE_GET_PREFIX(ns, env));
}
else
{
om_element_impl->qname = axis2_qname_create(env,
om_element_impl->localname,
AXIS2_OM_NAMESPACE_GET_URI(ns, env),
NULL);
}
}
else
{
om_element_impl->qname = axis2_qname_create(env,
om_element_impl->localname,
NULL, NULL);
}
}
return om_element_impl->qname;
}
axis2_om_children_iterator_t* AXIS2_CALL
axis2_om_element_get_children(axis2_om_element_t *om_element,
axis2_env_t **env,
axis2_om_node_t *element_node)
{
AXIS2_ENV_CHECK(env, NULL);
AXIS2_PARAM_CHECK((*env)->error, element_node, NULL);
return axis2_om_children_iterator_create(env,
AXIS2_OM_NODE_GET_FIRST_CHILD(element_node, env));
}
axis2_om_children_qname_iterator_t* AXIS2_CALL
axis2_om_element_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)
{
AXIS2_ENV_CHECK(env, NULL);
AXIS2_PARAM_CHECK((*env)->error, element_node, NULL);
return axis2_om_children_qname_iterator_create(env,
AXIS2_OM_NODE_GET_FIRST_CHILD(element_node, env),
element_qname);
}
axis2_om_element_t* AXIS2_CALL
axis2_om_element_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)
{
axis2_om_node_t *om_node = NULL;
axis2_om_children_qname_iterator_t *children_iterator = NULL;
AXIS2_ENV_CHECK(env, NULL);
AXIS2_PARAM_CHECK((*env)->error, element_qname, NULL);
AXIS2_PARAM_CHECK((*env)->error, element_node, NULL);
children_iterator = axis2_om_children_qname_iterator_create(env,
AXIS2_OM_NODE_GET_FIRST_CHILD(element_node, env),
element_qname);
if (!children_iterator)
return NULL;
if(AXIS2_OM_CHILDREN_QNAME_ITERATOR_HAS_NEXT(children_iterator, env))
{
om_node = AXIS2_OM_CHILDREN_QNAME_ITERATOR_NEXT(children_iterator, env);
}
if(om_node && (AXIS2_OM_NODE_GET_NODE_TYPE(om_node, env) == AXIS2_OM_ELEMENT))
{
AXIS2_OM_CHILDREN_QNAME_ITERATOR_FREE(children_iterator, env);
if(child_node){ *child_node = om_node; }
return (axis2_om_element_t*)AXIS2_OM_NODE_GET_DATA_ELEMENT(om_node, env);
}
else
{
AXIS2_OM_CHILDREN_QNAME_ITERATOR_FREE(children_iterator, env);
return NULL;
}
return NULL;
}
axis2_status_t AXIS2_CALL
axis2_om_element_remove_attribute(axis2_om_element_t *om_element,
axis2_env_t **env,
axis2_om_attribute_t *om_attribute)
{
axis2_om_element_impl_t *om_element_impl = NULL;
axis2_qname_t *qname = NULL;
AXIS2_ENV_CHECK(env, AXIS2_FAILURE);
AXIS2_PARAM_CHECK((*env)->error, om_attribute, AXIS2_FAILURE);
om_element_impl = AXIS2_INTF_TO_IMPL(om_element);
qname = AXIS2_OM_ATTRIBUTE_GET_QNAME(om_attribute, env);
if (qname && (om_element_impl->attributes))
{ axis2_hash_set (om_element_impl->attributes,
qname, sizeof (axis2_qname_t), NULL);
return AXIS2_SUCCESS;
}
return AXIS2_FAILURE;
}
axis2_om_element_t* AXIS2_CALL
axis2_om_element_get_first_element(axis2_om_element_t *om_element,
axis2_env_t **env,
axis2_om_node_t *element_node,
axis2_om_node_t **first_ele_node)
{
axis2_om_node_t *temp_node = NULL;
AXIS2_ENV_CHECK(env, NULL);
AXIS2_PARAM_CHECK((*env)->error, element_node, NULL);
temp_node = AXIS2_OM_NODE_GET_FIRST_CHILD(element_node, env);
while(temp_node != NULL)
{
if(AXIS2_OM_NODE_GET_NODE_TYPE(temp_node, env) == AXIS2_OM_ELEMENT)
{
if(first_ele_node){ *first_ele_node = temp_node;}
return (axis2_om_element_t *)AXIS2_OM_NODE_GET_DATA_ELEMENT(temp_node, env);
}
else
{
temp_node = AXIS2_OM_NODE_GET_NEXT_SIBLING(temp_node, env);
}
}
return NULL;
}
axis2_char_t* AXIS2_CALL
axis2_om_element_get_text(axis2_om_element_t *om_element,
axis2_env_t **env,
axis2_om_node_t *element_node)
{
axis2_char_t* dest = NULL;
axis2_char_t* temp_text = NULL;
axis2_om_text_t* text_node = NULL;
axis2_om_node_t* temp_node = NULL;
AXIS2_ENV_CHECK(env, NULL);
AXIS2_PARAM_CHECK((*env)->error, element_node, NULL);
temp_node = AXIS2_OM_NODE_GET_FIRST_CHILD(element_node, env);
while(temp_node)
{
if(AXIS2_OM_NODE_GET_NODE_TYPE(temp_node, env) == AXIS2_OM_TEXT)
{
int dest_len = 0;
int curr_len = 0;
axis2_char_t *temp_dest = NULL;
text_node = (axis2_om_text_t *)AXIS2_OM_NODE_GET_DATA_ELEMENT(temp_node, env);
temp_text = AXIS2_OM_TEXT_GET_VALUE(text_node, env);
if(dest && temp_text && AXIS2_STRCMP(temp_text, "") != 0)
{
dest_len = AXIS2_STRLEN(dest);
curr_len = dest_len + AXIS2_STRLEN(temp_text);
temp_dest = AXIS2_MALLOC((*env)->allocator, (curr_len +1 )*sizeof(axis2_char_t));
memcpy(temp_dest, dest, dest_len*sizeof(axis2_char_t));
memcpy((temp_dest + dest_len * sizeof(axis2_char_t)), temp_text, curr_len - dest_len);
temp_dest[curr_len] = '\0';
AXIS2_FREE((*env)->allocator, dest);
dest = NULL;
dest = temp_dest;
}
else if(!dest && temp_text && AXIS2_STRCMP(temp_text, "") != 0)
{
dest = AXIS2_STRDUP(temp_text, env);
}
}
temp_node = AXIS2_OM_NODE_GET_NEXT_SIBLING(temp_node, env);
}
return dest;
}
axis2_status_t AXIS2_CALL
axis2_om_element_set_text(axis2_om_element_t *om_element,
axis2_env_t **env,
axis2_char_t *text,
axis2_om_node_t *element_node)
{
axis2_om_node_t* temp_node = NULL;
axis2_om_text_t* om_text = NULL;
axis2_om_node_t* node_to_free = NULL;
AXIS2_ENV_CHECK(env, AXIS2_FAILURE);
AXIS2_PARAM_CHECK((*env)->error, text, AXIS2_FAILURE);
AXIS2_PARAM_CHECK((*env)->error, element_node, AXIS2_FAILURE);
temp_node = AXIS2_OM_NODE_GET_FIRST_CHILD(element_node, env);
while( temp_node != NULL)
{
if(AXIS2_OM_NODE_GET_NODE_TYPE(temp_node, env) == AXIS2_OM_TEXT)
{
node_to_free = AXIS2_OM_NODE_DETACH(temp_node, env);
AXIS2_OM_NODE_FREE_TREE(node_to_free, env);
}
temp_node = AXIS2_OM_NODE_GET_NEXT_SIBLING(temp_node, env);
}
temp_node = NULL;
om_text = axis2_om_text_create(env, NULL, text, &temp_node);
AXIS2_OM_NODE_ADD_CHILD(element_node, env, temp_node);
return AXIS2_SUCCESS;
}
axis2_char_t* AXIS2_CALL
axis2_om_element_to_string(axis2_om_element_t *om_element,
axis2_env_t **env,
axis2_om_node_t *element_node)
{
int status = AXIS2_SUCCESS;
axis2_om_output_t *om_output = NULL;
axis2_xml_writer_t *xml_writer = NULL;
axis2_char_t *xml = NULL;
AXIS2_ENV_CHECK(env, NULL);
AXIS2_PARAM_CHECK((*env)->error, element_node, NULL);
xml_writer = axis2_xml_writer_create_for_memory(env, NULL, AXIS2_TRUE, 0);
om_output = axis2_om_output_create(env, xml_writer);
status = AXIS2_OM_NODE_SERIALIZE(element_node, env, om_output);
if(status == AXIS2_SUCCESS)
{
xml = AXIS2_XML_WRITER_GET_XML(xml_writer, env);
}
AXIS2_OM_OUTPUT_FREE(om_output, env);
return xml;
}
axis2_om_child_element_iterator_t * AXIS2_CALL
axis2_om_element_get_child_elements(axis2_om_element_t *om_element,
axis2_env_t **env,
axis2_om_node_t *element_node)
{
axis2_om_node_t *first_node = NULL;
axis2_om_element_t *ele = NULL;
AXIS2_ENV_CHECK(env, NULL);
AXIS2_PARAM_CHECK((*env)->error, element_node, NULL);
ele = AXIS2_OM_ELEMENT_GET_FIRST_ELEMENT(om_element, env, element_node, &first_node);
if(ele && first_node)
{
return axis2_om_child_element_iterator_create(env, first_node);
}
else return NULL;
}