From a75ede936bab7d60c912fbcdda24d901ae50aba6 Mon Sep 17 00:00:00 2001 From: shankar Date: Tue, 23 Mar 2010 07:10:27 +0000 Subject: refactoring. git-svn-id: http://svn.apache.org/repos/asf/axis/axis2/c/core/trunk@926481 13f79535-47bb-0310-9956-ffa450edef68 --- axiom/src/om/om_stax_builder.c | 429 ++++++++++++++++++++--------------------- 1 file changed, 205 insertions(+), 224 deletions(-) (limited to 'axiom/src/om/om_stax_builder.c') diff --git a/axiom/src/om/om_stax_builder.c b/axiom/src/om/om_stax_builder.c index 399a711..77a8c3e 100644 --- a/axiom/src/om/om_stax_builder.c +++ b/axiom/src/om/om_stax_builder.c @@ -25,16 +25,17 @@ #include #include "axiom_node_internal.h" #include "axiom_stax_builder_internal.h" +#include "axiom_document_internal.h" struct axiom_stax_builder { - /** pull parser instance used by the om_builder */ axiom_xml_reader_t *parser; /** last node the om_builder found */ axiom_node_t *lastnode; + /** root node of the xml document */ axiom_node_t *root_node; /** document associated with the om_builder */ @@ -43,16 +44,12 @@ struct axiom_stax_builder /** done building the document? */ axis2_bool_t done; - /** parser was accessed? */ - axis2_bool_t parser_accessed; - - /** caching enabled? */ - axis2_bool_t cache; - /** current event */ int current_event; + /** Indicate the current element level. */ int element_level; + axutil_hash_t *declared_namespaces; }; @@ -68,11 +65,10 @@ axiom_stax_builder_create( if(!om_builder) { AXIS2_ERROR_SET(env->error, AXIS2_ERROR_NO_MEMORY, AXIS2_FAILURE); + AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "Insufficient memory to create stax builder"); return NULL; } - om_builder->cache = AXIS2_TRUE; - om_builder->parser_accessed = AXIS2_FALSE; om_builder->done = AXIS2_FALSE; om_builder->lastnode = NULL; om_builder->document = NULL; @@ -91,6 +87,134 @@ axiom_stax_builder_create( return om_builder; } +AXIS2_EXTERN void AXIS2_CALL +axiom_stax_builder_free( + axiom_stax_builder_t * om_builder, + const axutil_env_t * env) +{ + if(!om_builder) + { + return; + } + if(om_builder->declared_namespaces) + { + axutil_hash_free(om_builder->declared_namespaces, env); + om_builder->declared_namespaces = NULL; + } + + if(om_builder->document) + { + axiom_document_free(om_builder->document, env); + om_builder->document = NULL; + } + else + { + if(om_builder->root_node) + { + axiom_node_free_tree(om_builder->root_node, env); + om_builder->root_node = NULL; + } + } + + if(om_builder->parser) + { + axiom_xml_reader_free(om_builder->parser, env); + om_builder->parser = NULL; + } + + AXIS2_FREE(env->allocator, om_builder); + + return; +} + +AXIS2_EXTERN void AXIS2_CALL +axiom_stax_builder_free_self( + axiom_stax_builder_t * om_builder, + const axutil_env_t * env) +{ + + axiom_node_t *temp_node = NULL; + axiom_node_t *nodes[256]; + axiom_node_t *om_node = NULL; + int count = 0; + + om_node = om_builder->root_node; + + nodes[count++] = om_node; + + if(om_node) + { + do + { + + axiom_node_set_builder(om_node, env, NULL); + axiom_node_set_document(om_node, env, NULL); + + temp_node = axiom_node_get_first_child(om_node, env); + /* serialize children of this node */ + if(temp_node) + { + om_node = temp_node; + nodes[count++] = om_node; + } + else + { + temp_node = axiom_node_get_next_sibling(om_node, env); + if(temp_node) + { + om_node = temp_node; + nodes[count - 1] = om_node; + } + else + { + while(count > 1 && !temp_node) + { + count--; + om_node = nodes[count - 1]; + temp_node = axiom_node_get_next_sibling(om_node, env); + } + if(temp_node && count > 1) + { + om_node = temp_node; + nodes[count - 1] = om_node; + } + else + { + count--; + } + } + } + } + while(count > 0); + } + if(om_builder->declared_namespaces) + { + axutil_hash_free(om_builder->declared_namespaces, env); + om_builder->declared_namespaces = NULL; + } + + if(om_builder->parser) + { + axiom_xml_reader_free(om_builder->parser, env); + om_builder->parser = NULL; + } + if(om_builder->document) + { + axiom_document_free_self(om_builder->document, env); + om_builder->document = NULL; + } + AXIS2_FREE(env->allocator, om_builder); + return; +} + +AXIS2_EXTERN axiom_document_t *AXIS2_CALL +axiom_stax_builder_get_document( + axiom_stax_builder_t * om_builder, + const axutil_env_t * env) +{ + return om_builder->document; +} + static axis2_status_t axiom_stax_builder_process_attributes( axiom_stax_builder_t * om_builder, @@ -556,19 +680,14 @@ axiom_stax_builder_end_element( return AXIS2_SUCCESS; } -AXIS2_EXTERN axiom_node_t *AXIS2_CALL +axiom_node_t *AXIS2_CALL axiom_stax_builder_next( axiom_stax_builder_t * om_builder, const axutil_env_t * env) { int token = 0; axiom_node_t *node = NULL; - AXIS2_ENV_CHECK(env, NULL); - if(!om_builder->parser) - { - return NULL; - } do { if(om_builder->done) @@ -585,11 +704,6 @@ axiom_stax_builder_next( om_builder->current_event = token; - if(!(om_builder->cache)) - { - return NULL; - } - switch(token) { case AXIOM_XML_READER_START_DOCUMENT: @@ -649,134 +763,7 @@ axiom_stax_builder_next( return node; } -AXIS2_EXTERN void AXIS2_CALL -axiom_stax_builder_free( - axiom_stax_builder_t * om_builder, - const axutil_env_t * env) -{ - AXIS2_ENV_CHECK(env, AXIS2_FAILURE); - if(!om_builder) - { - return; - } - if(om_builder->declared_namespaces) - { - axutil_hash_free(om_builder->declared_namespaces, env); - om_builder->declared_namespaces = NULL; - } - - if(om_builder->document) - { - axiom_document_free(om_builder->document, env); - om_builder->document = NULL; - } - else - { - if(om_builder->root_node) - { - axiom_node_free_tree(om_builder->root_node, env); - om_builder->root_node = NULL; - } - } - - if(om_builder->parser) - { - axiom_xml_reader_free(om_builder->parser, env); - om_builder->parser = NULL; - } - - AXIS2_FREE(env->allocator, om_builder); - - return; -} - -AXIS2_EXTERN void AXIS2_CALL -axiom_stax_builder_free_self( - axiom_stax_builder_t * om_builder, - const axutil_env_t * env) -{ - - axiom_node_t *temp_node = NULL; - axiom_node_t *nodes[256]; - axiom_node_t *om_node = NULL; - int count = 0; - - om_node = om_builder->root_node; - - nodes[count++] = om_node; - - if(om_node) - { - do - { - - axiom_node_set_builder(om_node, env, NULL); - axiom_node_set_document(om_node, env, NULL); - temp_node = axiom_node_get_first_child(om_node, env); - /* serialize children of this node */ - if(temp_node) - { - om_node = temp_node; - nodes[count++] = om_node; - } - else - { - temp_node = axiom_node_get_next_sibling(om_node, env); - if(temp_node) - { - om_node = temp_node; - nodes[count - 1] = om_node; - } - else - { - while(count > 1 && !temp_node) - { - count--; - om_node = nodes[count - 1]; - temp_node = axiom_node_get_next_sibling(om_node, env); - } - if(temp_node && count > 1) - { - om_node = temp_node; - nodes[count - 1] = om_node; - } - else - { - count--; - } - } - } - } - while(count > 0); - } - if(om_builder->declared_namespaces) - { - axutil_hash_free(om_builder->declared_namespaces, env); - om_builder->declared_namespaces = NULL; - } - - if(om_builder->parser) - { - axiom_xml_reader_free(om_builder->parser, env); - om_builder->parser = NULL; - } - if(om_builder->document) - { - axiom_document_free_self(om_builder->document, env); - om_builder->document = NULL; - } - AXIS2_FREE(env->allocator, om_builder); - return; -} - -AXIS2_EXTERN axiom_document_t *AXIS2_CALL -axiom_stax_builder_get_document( - axiom_stax_builder_t * om_builder, - const axutil_env_t * env) -{ - return om_builder->document; -} /** * moves the reader to next event and returns the token returned by the xml_reader , @@ -784,7 +771,7 @@ axiom_stax_builder_get_document( * @param environment Environment. MUST NOT be NULL. * @return next event axiom_xml_reader_event_types. Returns -1 on error */ -AXIS2_EXTERN int AXIS2_CALL +int AXIS2_CALL axiom_stax_builder_next_with_token( axiom_stax_builder_t * om_builder, const axutil_env_t * env) @@ -814,12 +801,6 @@ axiom_stax_builder_next_with_token( return -1; } - if(!om_builder->cache) - { - AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "Caching disabled"); - return -1; - } - switch(token) { case AXIOM_XML_READER_START_DOCUMENT: @@ -909,74 +890,10 @@ axiom_stax_builder_next_with_token( return token; } -AXIS2_EXTERN axis2_status_t AXIS2_CALL -axiom_stax_builder_discard_current_element( - axiom_stax_builder_t * om_builder, - const axutil_env_t * env) -{ - axiom_node_t *element = NULL; - axiom_node_t *prev_node = NULL; - axiom_node_t *parent = NULL; - - AXIS2_ENV_CHECK(env, AXIS2_FAILURE); - - element = om_builder->lastnode; - - if(axiom_node_is_complete(element, env) || !(om_builder->cache)) - { - AXIS2_ERROR_SET(env->error, AXIS2_ERROR_INVALID_BUILDER_STATE_CANNOT_DISCARD, AXIS2_FAILURE); - return AXIS2_FAILURE; - } - - om_builder->cache = AXIS2_FALSE; - do - { - while(axiom_xml_reader_next(om_builder->parser, env) != AXIOM_XML_READER_END_ELEMENT) - ; - } - while(!(axiom_node_is_complete(element, env))); - - /*All children of this element is pulled now */ - - prev_node = axiom_node_get_previous_sibling(element, env); - if(prev_node) - { - axiom_node_free_tree(axiom_node_get_next_sibling(prev_node, env), env); - axiom_node_set_next_sibling(prev_node, env, NULL); - } - else - { - parent = axiom_node_get_parent(element, env); - axiom_node_free_tree(axiom_node_get_first_child(parent, env), env); - axiom_node_set_first_child(parent, env, NULL); - om_builder->lastnode = parent; - } - om_builder->cache = AXIS2_TRUE; - - return AXIS2_SUCCESS; -} - -AXIS2_EXTERN axiom_xml_reader_t *AXIS2_CALL -axiom_stax_builder_get_parser( - axiom_stax_builder_t * om_builder, - const axutil_env_t * env) -{ - return om_builder->parser; -} - -AXIS2_EXTERN void AXIS2_CALL -axiom_stax_builder_set_cache( - axiom_stax_builder_t * om_builder, - const axutil_env_t * env, - axis2_bool_t enable_cache) -{ - om_builder->cache = enable_cache; -} - /** internal function for soap om_builder only */ -AXIS2_EXTERN int AXIS2_CALL +int AXIS2_CALL axiom_stax_builder_get_current_event( axiom_stax_builder_t * om_builder, const axutil_env_t * env) @@ -987,7 +904,7 @@ axiom_stax_builder_get_current_event( /** internal function for soap om_builder only */ -AXIS2_EXTERN axiom_node_t *AXIS2_CALL +axiom_node_t *AXIS2_CALL axiom_stax_builder_get_lastnode( axiom_stax_builder_t * om_builder, const axutil_env_t * env) @@ -998,7 +915,7 @@ axiom_stax_builder_get_lastnode( /** internal function for soap om_builder only */ -AXIS2_EXTERN axis2_bool_t AXIS2_CALL +axis2_bool_t AXIS2_CALL axiom_stax_builder_is_complete( axiom_stax_builder_t * om_builder, const axutil_env_t * env) @@ -1009,7 +926,7 @@ axiom_stax_builder_is_complete( /** internal function for soap om_builder only */ -AXIS2_EXTERN axis2_status_t AXIS2_CALL +axis2_status_t AXIS2_CALL axiom_stax_builder_set_lastnode( axiom_stax_builder_t * om_builder, const axutil_env_t * env, @@ -1022,7 +939,7 @@ axiom_stax_builder_set_lastnode( /** internal function for soap om_builder only */ -AXIS2_EXTERN int AXIS2_CALL +int AXIS2_CALL axiom_stax_builder_get_element_level( axiom_stax_builder_t * om_builder, const axutil_env_t * env) @@ -1033,7 +950,7 @@ axiom_stax_builder_get_element_level( /** internal function for soap om_builder only */ -AXIS2_EXTERN axis2_status_t AXIS2_CALL +axis2_status_t AXIS2_CALL axiom_stax_builder_set_element_level( axiom_stax_builder_t * om_builder, const axutil_env_t * env, @@ -1069,4 +986,68 @@ axiom_stax_builder_create_om_doctype( axiom_xml_reader_xml_free(om_builder->parser, env, doc_value); return doctype_node; } + +AXIS2_EXTERN axis2_status_t AXIS2_CALL +axiom_stax_builder_discard_current_element( + axiom_stax_builder_t * om_builder, + const axutil_env_t * env) +{ + axiom_node_t *element = NULL; + axiom_node_t *prev_node = NULL; + axiom_node_t *parent = NULL; + + AXIS2_ENV_CHECK(env, AXIS2_FAILURE); + + element = om_builder->lastnode; + + if(axiom_node_is_complete(element, env) || !(om_builder->cache)) + { + AXIS2_ERROR_SET(env->error, AXIS2_ERROR_INVALID_BUILDER_STATE_CANNOT_DISCARD, AXIS2_FAILURE); + return AXIS2_FAILURE; + } + + om_builder->cache = AXIS2_FALSE; + do + { + while(axiom_xml_reader_next(om_builder->parser, env) != AXIOM_XML_READER_END_ELEMENT) + ; + } + while(!(axiom_node_is_complete(element, env))); + + /*All children of this element is pulled now */ + + prev_node = axiom_node_get_previous_sibling(element, env); + if(prev_node) + { + axiom_node_free_tree(axiom_node_get_next_sibling(prev_node, env), env); + axiom_node_set_next_sibling(prev_node, env, NULL); + } + else + { + parent = axiom_node_get_parent(element, env); + axiom_node_free_tree(axiom_node_get_first_child(parent, env), env); + axiom_node_set_first_child(parent, env, NULL); + om_builder->lastnode = parent; + } + om_builder->cache = AXIS2_TRUE; + + return AXIS2_SUCCESS; +} + +AXIS2_EXTERN axiom_xml_reader_t *AXIS2_CALL +axiom_stax_builder_get_parser( + axiom_stax_builder_t * om_builder, + const axutil_env_t * env) +{ + return om_builder->parser; +} + +AXIS2_EXTERN void AXIS2_CALL +axiom_stax_builder_set_cache( + axiom_stax_builder_t * om_builder, + const axutil_env_t * env, + axis2_bool_t enable_cache) +{ + om_builder->cache = enable_cache; +} #endif -- cgit v1.1-32-gdbae