You are viewing a plain text version of this content. The canonical link for it is here.
Posted to axis-cvs@ws.apache.org by sh...@apache.org on 2010/02/02 07:50:24 UTC
svn commit: r905530 - in /webservices/axis2/trunk/c/axiom: include/ src/om/
src/parser/libxml2/ src/soap/
Author: shankar
Date: Tue Feb 2 06:49:42 2010
New Revision: 905530
URL: http://svn.apache.org/viewvc?rev=905530&view=rev
Log:
refactoring, adding comments.
Modified:
webservices/axis2/trunk/c/axiom/include/axiom_soap_builder.h
webservices/axis2/trunk/c/axiom/include/axiom_stax_builder.h
webservices/axis2/trunk/c/axiom/include/axiom_xml_reader.h
webservices/axis2/trunk/c/axiom/src/om/axiom_stax_builder_internal.h
webservices/axis2/trunk/c/axiom/src/om/om_stax_builder.c
webservices/axis2/trunk/c/axiom/src/parser/libxml2/libxml2_reader_wrapper.c
webservices/axis2/trunk/c/axiom/src/soap/soap11_builder_helper.c
webservices/axis2/trunk/c/axiom/src/soap/soap_body.c
webservices/axis2/trunk/c/axiom/src/soap/soap_builder.c
Modified: webservices/axis2/trunk/c/axiom/include/axiom_soap_builder.h
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/c/axiom/include/axiom_soap_builder.h?rev=905530&r1=905529&r2=905530&view=diff
==============================================================================
--- webservices/axis2/trunk/c/axiom/include/axiom_soap_builder.h (original)
+++ webservices/axis2/trunk/c/axiom/include/axiom_soap_builder.h Tue Feb 2 06:49:42 2010
@@ -89,10 +89,9 @@
const axutil_env_t * env);
/**
- *
+ * Builds next element of the OM structure
* @param builder pointer to the SOAP Builder struct
* @param env Environment. MUST NOT be NULL
- *
* @return AXIS2_SUCCESS if the next element is present else AXIS2_FAILURE
*/
AXIS2_EXTERN axis2_status_t AXIS2_CALL
@@ -163,20 +162,6 @@
const axutil_env_t * env);
/**
- * Process and verifies namespace data of @param om_node
- * @param builder pointer to the SOAP Builder struct
- * @param env Environment. MUST NOT be NULL
- *
- * @return AXIS2_SUCCESS on success else AXIS2_FAILURE
- */
- AXIS2_EXTERN axis2_status_t AXIS2_CALL
- axiom_soap_builder_process_namespace_data(
- axiom_soap_builder_t * builder,
- const axutil_env_t * env,
- axiom_node_t * om_node,
- axis2_bool_t is_soap_element);
-
- /**
* Set the MIME body parts
* @param builder pointer to the SOAP Builder struct
* @param env Environment. MUST NOT be NULL
Modified: webservices/axis2/trunk/c/axiom/include/axiom_stax_builder.h
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/c/axiom/include/axiom_stax_builder.h?rev=905530&r1=905529&r2=905530&view=diff
==============================================================================
--- webservices/axis2/trunk/c/axiom/include/axiom_stax_builder.h (original)
+++ webservices/axis2/trunk/c/axiom/include/axiom_stax_builder.h Tue Feb 2 06:49:42 2010
@@ -124,10 +124,10 @@
const axutil_env_t * env);
/**
- * moves the reader to next event and returns the token returned
- * by the xml_reader , returns -1 on error
- * @param builder pointer to stax builder struct to be used
+ * moves the reader to next event and returns the token returned by the xml_reader ,
+ * @param builder pointer to STAX builder struct to be used
* @param environment Environment. MUST NOT be NULL.
+ * @return next event axiom_xml_reader_event_types. Returns -1 on error
*/
AXIS2_EXTERN int AXIS2_CALL
axiom_stax_builder_next_with_token(
Modified: webservices/axis2/trunk/c/axiom/include/axiom_xml_reader.h
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/c/axiom/include/axiom_xml_reader.h?rev=905530&r1=905529&r2=905530&view=diff
==============================================================================
--- webservices/axis2/trunk/c/axiom/include/axiom_xml_reader.h (original)
+++ webservices/axis2/trunk/c/axiom/include/axiom_xml_reader.h Tue Feb 2 06:49:42 2010
@@ -51,14 +51,14 @@
typedef enum axiom_xml_reader_event_types
{
- AXIOM_XML_READER_START_DOCUMENT = 0,
- AXIOM_XML_READER_START_ELEMENT,
- AXIOM_XML_READER_END_ELEMENT,
- AXIOM_XML_READER_SPACE,
- AXIOM_XML_READER_EMPTY_ELEMENT,
- AXIOM_XML_READER_CHARACTER,
+ AXIOM_XML_READER_START_DOCUMENT = 0, /* <?xml version="1.0" encoding="utf-8"?> */
+ AXIOM_XML_READER_START_ELEMENT, /* <element> */
+ AXIOM_XML_READER_END_ELEMENT, /* </element> */
+ AXIOM_XML_READER_SPACE, /* <x> </x>*//*event is for value, not for x*/
+ AXIOM_XML_READER_EMPTY_ELEMENT, /* <element/> */
+ AXIOM_XML_READER_CHARACTER, /* <x>text</x>*//*event is for text, not for x*/
AXIOM_XML_READER_ENTITY_REFERENCE,
- AXIOM_XML_READER_COMMENT,
+ AXIOM_XML_READER_COMMENT, /* <!--comment--> */
AXIOM_XML_READER_PROCESSING_INSTRUCTION,
AXIOM_XML_READER_CDATA,
AXIOM_XML_READER_DOCUMENT_TYPE
Modified: webservices/axis2/trunk/c/axiom/src/om/axiom_stax_builder_internal.h
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/c/axiom/src/om/axiom_stax_builder_internal.h?rev=905530&r1=905529&r2=905530&view=diff
==============================================================================
--- webservices/axis2/trunk/c/axiom/src/om/axiom_stax_builder_internal.h (original)
+++ webservices/axis2/trunk/c/axiom/src/om/axiom_stax_builder_internal.h Tue Feb 2 06:49:42 2010
@@ -50,21 +50,21 @@
const axutil_env_t * env,
axiom_node_t * om_node);
- AXIS2_EXTERN int AXIS2_CALL
- axiom_stax_builder_get_element_level(
- axiom_stax_builder_t * builder,
- const axutil_env_t * env);
+ AXIS2_EXTERN axiom_node_t *AXIS2_CALL
+ axiom_stax_builder_get_lastnode(
+ axiom_stax_builder_t * builder,
+ const axutil_env_t * env);
AXIS2_EXTERN axis2_status_t AXIS2_CALL
-
axiom_stax_builder_set_element_level(
axiom_stax_builder_t * builder,
const axutil_env_t * env,
int element_level);
- AXIS2_EXTERN axiom_node_t *AXIS2_CALL
- axiom_stax_builder_get_lastnode(
- axiom_stax_builder_t * builder,
- const axutil_env_t * env);
+
+ AXIS2_EXTERN int AXIS2_CALL
+ axiom_stax_builder_get_element_level(
+ axiom_stax_builder_t * builder,
+ const axutil_env_t * env);
/** @} */
Modified: webservices/axis2/trunk/c/axiom/src/om/om_stax_builder.c
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/c/axiom/src/om/om_stax_builder.c?rev=905530&r1=905529&r2=905530&view=diff
==============================================================================
--- webservices/axis2/trunk/c/axiom/src/om/om_stax_builder.c (original)
+++ webservices/axis2/trunk/c/axiom/src/om/om_stax_builder.c Tue Feb 2 06:49:42 2010
@@ -62,11 +62,9 @@
axiom_xml_reader_t * parser)
{
axiom_stax_builder_t *om_builder = NULL;
- AXIS2_ENV_CHECK(env, NULL);
AXIS2_PARAM_CHECK(env->error, parser, NULL);
om_builder = (axiom_stax_builder_t *)AXIS2_MALLOC(env->allocator, sizeof(axiom_stax_builder_t));
-
if(!om_builder)
{
AXIS2_ERROR_SET(env->error, AXIS2_ERROR_NO_MEMORY, AXIS2_FAILURE);
@@ -82,9 +80,7 @@
om_builder->current_event = -1;
om_builder->root_node = NULL;
om_builder->element_level = 0;
-
om_builder->declared_namespaces = axutil_hash_make(env);
-
om_builder->document = axiom_document_create(env, NULL, om_builder);
if(!om_builder->document)
{
@@ -95,7 +91,7 @@
return om_builder;
}
-axis2_status_t
+static axis2_status_t
axiom_stax_builder_process_attributes(
axiom_stax_builder_t * om_builder,
const axutil_env_t * env,
@@ -205,7 +201,7 @@
return status;
}
-axiom_node_t *
+static axiom_node_t *
axiom_stax_builder_create_om_text(
axiom_stax_builder_t * om_builder,
const axutil_env_t * env)
@@ -259,54 +255,7 @@
return 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_status_t
+static axis2_status_t
axiom_stax_builder_process_namespaces(
axiom_stax_builder_t * om_builder,
const axutil_env_t * env,
@@ -439,7 +388,7 @@
return status;
}
-axiom_node_t *
+static axiom_node_t *
axiom_stax_builder_create_om_element(
axiom_stax_builder_t * om_builder,
const axutil_env_t * env,
@@ -533,7 +482,7 @@
return element_node;
}
-axiom_node_t *
+static axiom_node_t *
axiom_stax_builder_create_om_comment(
axiom_stax_builder_t * om_builder,
const axutil_env_t * env)
@@ -592,7 +541,7 @@
return comment_node;
}
-axiom_node_t *
+static axiom_node_t *
axiom_stax_builder_create_om_doctype(
axiom_stax_builder_t * om_builder,
const axutil_env_t * env)
@@ -620,7 +569,7 @@
return doctype_node;
}
-axiom_node_t *
+static axiom_node_t *
axiom_stax_builder_create_om_processing_instruction(
axiom_stax_builder_t * om_builder,
const axutil_env_t * env)
@@ -675,7 +624,7 @@
return pi_node;
}
-AXIS2_EXTERN axis2_status_t AXIS2_CALL
+static axis2_status_t
axiom_stax_builder_end_element(
axiom_stax_builder_t * om_builder,
const axutil_env_t * env)
@@ -933,125 +882,48 @@
}
/**
- This is an internal function
- */
-
-AXIS2_EXTERN int AXIS2_CALL
-axiom_stax_builder_get_current_event(
- axiom_stax_builder_t * om_builder,
- const axutil_env_t * env)
-{
- AXIS2_PARAM_CHECK(env->error, om_builder, AXIS2_FAILURE);
- return om_builder->current_event;
-}
-
-/**
- This is an internal function
- */
-AXIS2_EXTERN axiom_node_t *AXIS2_CALL
-axiom_stax_builder_get_lastnode(
- axiom_stax_builder_t * om_builder,
- const axutil_env_t * env)
-{
- AXIS2_PARAM_CHECK(env->error, om_builder, NULL);
- return om_builder->lastnode;
-}
-
-/**
- This is an internal function
- */
-AXIS2_EXTERN axis2_bool_t AXIS2_CALL
-axiom_stax_builder_is_complete(
- axiom_stax_builder_t * om_builder,
- const axutil_env_t * env)
-{
- AXIS2_ENV_CHECK(env, AXIS2_FALSE);
- return om_builder->done;
-}
-
-/**
- This is an internal function to be used by soap om_builder only
- */
-AXIS2_EXTERN axis2_status_t AXIS2_CALL
-axiom_stax_builder_set_lastnode(
- axiom_stax_builder_t * om_builder,
- const axutil_env_t * env,
- axiom_node_t * om_node)
-{
- AXIS2_PARAM_CHECK(env->error, om_node, AXIS2_FAILURE);
- AXIS2_PARAM_CHECK(env->error, om_builder, AXIS2_FAILURE);
-
- om_builder->lastnode = om_node;
- return AXIS2_SUCCESS;
-}
-
-/**
- internal function for soap om_builder only
- */
+ * moves the reader to next event and returns the token returned by the xml_reader ,
+ * @param builder pointer to STAX builder struct to be used
+ * @param environment Environment. MUST NOT be NULL.
+ * @return next event axiom_xml_reader_event_types. Returns -1 on error
+ */
AXIS2_EXTERN int AXIS2_CALL
-axiom_stax_builder_get_element_level(
- axiom_stax_builder_t * om_builder,
- const axutil_env_t * env)
-{
- AXIS2_PARAM_CHECK(env->error, om_builder, -1);
- return om_builder->element_level;
-}
-
-/**
- internal function for soap om_builder only
- */
-AXIS2_EXTERN axis2_status_t AXIS2_CALL
-axiom_stax_builder_set_element_level(
- axiom_stax_builder_t * om_builder,
- const axutil_env_t * env,
- int element_level)
-{
- AXIS2_PARAM_CHECK(env->error, om_builder, AXIS2_FAILURE);
- om_builder->element_level = element_level;
- return AXIS2_SUCCESS;
-}
-
-int AXIS2_CALL
axiom_stax_builder_next_with_token(
axiom_stax_builder_t * om_builder,
const axutil_env_t * env)
{
int token = 0;
void *val = NULL;
- /* axutil_env_t* thread = NULL;*/
- /* thread = axutil_env_create(env->allocator);*/
- /* env = thread;*/
- if(!om_builder)
+
+ if((!om_builder) || (!om_builder->parser))
{
+ AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "Invalid OM builder");
return -1;
}
if(om_builder->done)
{
AXIS2_ERROR_SET(env->error, AXIS2_ERROR_BUILDER_DONE_CANNOT_PULL, AXIS2_FAILURE);
- return -1;
- }
-
- if(!om_builder->parser)
- {
+ AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "OM is fully built. Nothing more to build");
return -1;
}
token = axiom_xml_reader_next(om_builder->parser, env);
-
om_builder->current_event = token;
if(token == -1)
{
om_builder->done = AXIS2_TRUE;
+ AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "Error when reading xml");
return -1;
}
- if(!(om_builder->cache))
+ if(!om_builder->cache)
{
- AXIS2_LOG_DEBUG(env->log, AXIS2_LOG_SI, "Cacheing disabled");
+ AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "Caching disabled");
return -1;
}
+
switch(token)
{
case AXIOM_XML_READER_START_DOCUMENT:
@@ -1133,6 +1005,52 @@
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(
@@ -1151,3 +1069,72 @@
om_builder->cache = enable_cache;
}
+/**
+ internal function for soap om_builder only
+ */
+AXIS2_EXTERN int AXIS2_CALL
+axiom_stax_builder_get_current_event(
+ axiom_stax_builder_t * om_builder,
+ const axutil_env_t * env)
+{
+ return om_builder->current_event;
+}
+
+/**
+ internal function for soap om_builder only
+ */
+AXIS2_EXTERN axiom_node_t *AXIS2_CALL
+axiom_stax_builder_get_lastnode(
+ axiom_stax_builder_t * om_builder,
+ const axutil_env_t * env)
+{
+ return om_builder->lastnode;
+}
+
+/**
+ internal function for soap om_builder only
+ */
+AXIS2_EXTERN axis2_bool_t AXIS2_CALL
+axiom_stax_builder_is_complete(
+ axiom_stax_builder_t * om_builder,
+ const axutil_env_t * env)
+{
+ return om_builder->done;
+}
+
+/**
+ internal function for soap om_builder only
+ */
+AXIS2_EXTERN axis2_status_t AXIS2_CALL
+axiom_stax_builder_set_lastnode(
+ axiom_stax_builder_t * om_builder,
+ const axutil_env_t * env,
+ axiom_node_t * om_node)
+{
+ om_builder->lastnode = om_node;
+ return AXIS2_SUCCESS;
+}
+
+/**
+ internal function for soap om_builder only
+ */
+AXIS2_EXTERN int AXIS2_CALL
+axiom_stax_builder_get_element_level(
+ axiom_stax_builder_t * om_builder,
+ const axutil_env_t * env)
+{
+ return om_builder->element_level;
+}
+
+/**
+ internal function for soap om_builder only
+ */
+AXIS2_EXTERN axis2_status_t AXIS2_CALL
+axiom_stax_builder_set_element_level(
+ axiom_stax_builder_t * om_builder,
+ const axutil_env_t * env,
+ int element_level)
+{
+ om_builder->element_level = element_level;
+ return AXIS2_SUCCESS;
+}
Modified: webservices/axis2/trunk/c/axiom/src/parser/libxml2/libxml2_reader_wrapper.c
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/c/axiom/src/parser/libxml2/libxml2_reader_wrapper.c?rev=905530&r1=905529&r2=905530&view=diff
==============================================================================
--- webservices/axis2/trunk/c/axiom/src/parser/libxml2/libxml2_reader_wrapper.c (original)
+++ webservices/axis2/trunk/c/axiom/src/parser/libxml2/libxml2_reader_wrapper.c Tue Feb 2 06:49:42 2010
@@ -196,32 +196,18 @@
}
parser->event_map[XML_READER_TYPE_ELEMENT] = AXIOM_XML_READER_START_ELEMENT;
-
- parser->event_map[XML_READER_TYPE_ELEMENT] = AXIOM_XML_READER_START_ELEMENT;
-
parser->event_map[XML_READER_TYPE_DOCUMENT] = AXIOM_XML_READER_START_DOCUMENT;
-
parser->event_map[XML_READER_TYPE_TEXT] = AXIOM_XML_READER_CHARACTER;
-
parser->event_map[XML_READER_TYPE_CDATA] = AXIOM_XML_READER_CHARACTER;
-
parser->event_map[XML_READER_TYPE_SIGNIFICANT_WHITESPACE] = AXIOM_XML_READER_SPACE;
-
parser->event_map[XML_READER_TYPE_WHITESPACE] = AXIOM_XML_READER_SPACE;
-
parser->event_map[XML_READER_TYPE_END_ELEMENT] = AXIOM_XML_READER_END_ELEMENT;
-
parser->event_map[XML_READER_TYPE_ENTITY_REFERENCE] = AXIOM_XML_READER_ENTITY_REFERENCE;
-
parser->event_map[XML_READER_TYPE_END_ENTITY] = AXIOM_XML_READER_SPACE;
-
parser->event_map[XML_READER_TYPE_ENTITY] = AXIOM_XML_READER_SPACE;
-
parser->event_map[XML_READER_TYPE_PROCESSING_INSTRUCTION]
= AXIOM_XML_READER_PROCESSING_INSTRUCTION;
-
parser->event_map[XML_READER_TYPE_COMMENT] = AXIOM_XML_READER_COMMENT;
-
parser->event_map[XML_READER_TYPE_DOCUMENT_TYPE] = AXIOM_XML_READER_DOCUMENT_TYPE;
return AXIS2_SUCCESS;
}
Modified: webservices/axis2/trunk/c/axiom/src/soap/soap11_builder_helper.c
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/c/axiom/src/soap/soap11_builder_helper.c?rev=905530&r1=905529&r2=905530&view=diff
==============================================================================
--- webservices/axis2/trunk/c/axiom/src/soap/soap11_builder_helper.c (original)
+++ webservices/axis2/trunk/c/axiom/src/soap/soap11_builder_helper.c Tue Feb 2 06:49:42 2010
@@ -73,8 +73,6 @@
builder_helper->fault_code_present = AXIS2_FALSE;
builder_helper->fault_string_present = AXIS2_FALSE;
builder_helper->last_processed_node = NULL;
- builder_helper->om_builder = NULL;
-
builder_helper->soap_builder = soap_builder;
builder_helper->om_builder = om_builder;
Modified: webservices/axis2/trunk/c/axiom/src/soap/soap_body.c
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/c/axiom/src/soap/soap_body.c?rev=905530&r1=905529&r2=905530&view=diff
==============================================================================
--- webservices/axis2/trunk/c/axiom/src/soap/soap_body.c (original)
+++ webservices/axis2/trunk/c/axiom/src/soap/soap_body.c Tue Feb 2 06:49:42 2010
@@ -127,40 +127,43 @@
return;
}
+/**
+ * Indicates whether a soap fault is available with this soap body
+ * @param soap_body axiom_soap_body struct
+ * @param env environment must not be null
+ * @return AXIS2_TRUE if fault is available, AXIS2_FALSE otherwise
+ */
AXIS2_EXTERN axis2_bool_t AXIS2_CALL
axiom_soap_body_has_fault(
axiom_soap_body_t * soap_body,
const axutil_env_t * env)
{
- int status = AXIS2_SUCCESS;
-
if(soap_body->soap_fault)
{
soap_body->has_fault = AXIS2_TRUE;
- return AXIS2_TRUE;
}
else
{
- if(soap_body->soap_builder)
+ while(!axiom_node_is_complete(soap_body->om_ele_node, env))
{
- while(!(soap_body->soap_fault)
- && !(axiom_node_is_complete(soap_body->om_ele_node, env)))
+ if(axiom_soap_builder_next(soap_body->soap_builder, env) != AXIS2_SUCCESS)
{
- status = axiom_soap_builder_next(soap_body->soap_builder, env);
- if(status == AXIS2_FAILURE)
- {
- return AXIS2_FALSE;
- }
+ /* problem in building the SOAP body. Note that has_fault is about soap fault,
+ * not about problem in building the node. So, even though there is a problem
+ * building the body, has_fault should be AXIS2_FALSE
+ */
+ break;
}
+
if(soap_body->soap_fault)
{
soap_body->has_fault = AXIS2_TRUE;
- return AXIS2_TRUE;
+ break;
}
}
}
- return AXIS2_FALSE;
+ return soap_body->has_fault;
}
/**
Modified: webservices/axis2/trunk/c/axiom/src/soap/soap_builder.c
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/c/axiom/src/soap/soap_builder.c?rev=905530&r1=905529&r2=905530&view=diff
==============================================================================
--- webservices/axis2/trunk/c/axiom/src/soap/soap_builder.c (original)
+++ webservices/axis2/trunk/c/axiom/src/soap/soap_builder.c Tue Feb 2 06:49:42 2010
@@ -27,20 +27,11 @@
#include "_axiom_soap_fault.h"
#include <axutil_http_chunked_stream.h>
-axis2_status_t
-axiom_soap_builder_create_om_element(
- axiom_soap_builder_t * soap_builder,
- const axutil_env_t * env,
- axiom_node_t * current_node,
- int current_event);
-
static axis2_status_t
axiom_soap_builder_construct_node(
axiom_soap_builder_t * soap_builder,
const axutil_env_t * env,
- axiom_node_t * parent,
- axiom_node_t * om_element_node,
- axis2_bool_t is_soap_envelope);
+ axiom_node_t * om_element_node);
static axis2_status_t
axiom_soap_builder_identify_soap_version(
@@ -54,11 +45,22 @@
const axutil_env_t * env);
static axis2_status_t
-axiom_soap_builder_construct_node_for_empty_element(
+axiom_soap_builder_process_namespace_data(
axiom_soap_builder_t * soap_builder,
const axutil_env_t * env,
- axiom_node_t * parent,
- axiom_node_t * om_element_node);
+ axiom_node_t * om_node);
+
+static axis2_status_t
+axiom_soap_builder_construct_soap_header(
+ axiom_soap_builder_t *soap_builder,
+ const axutil_env_t *env,
+ axiom_node_t *om_node);
+
+static axis2_status_t
+axiom_soap_builder_construct_soap_body(
+ axiom_soap_builder_t *soap_builder,
+ const axutil_env_t *env,
+ axiom_node_t *om_node);
struct axiom_soap_builder
{
@@ -297,172 +299,164 @@
return NULL;
}
+/**
+ * Builds next element of the OM structure
+ * @param builder pointer to the SOAP Builder struct
+ * @param env Environment. MUST NOT be NULL
+ * @return AXIS2_SUCCESS if the next element is present else AXIS2_FAILURE
+ */
AXIS2_EXTERN axis2_status_t AXIS2_CALL
axiom_soap_builder_next(
axiom_soap_builder_t * soap_builder,
const axutil_env_t * env)
{
- axiom_node_t *lastnode = NULL;
int current_event = AXIS2_MAX_EVENT;
- axiom_node_t *current_node = NULL;
int status = AXIS2_SUCCESS;
- if(!soap_builder)
+ if((!soap_builder) || (soap_builder->done) || (!soap_builder->om_builder))
{
+ AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "Invalid soap builder");
return AXIS2_FAILURE;
}
- if(soap_builder->done)
- {
- return AXIS2_FAILURE;
- }
- if(!(soap_builder->om_builder))
- {
- return AXIS2_FAILURE;
- }
- lastnode = axiom_stax_builder_get_lastnode(soap_builder->om_builder, env);
- if(!lastnode)
+ /* Get the status of previous node before building next node. We need the previous state of the
+ * node to identify very first element, which is SOAP Envelope. If last_node_status is
+ * AXIS2_BUILDER_LAST_NODE_NULL, then it means next node is SOAP Envelope
+ */
+ if(axiom_stax_builder_get_lastnode(soap_builder->om_builder, env))
{
- soap_builder->last_node_status = AXIS2_BUILDER_LAST_NODE_NULL;
+ soap_builder->last_node_status = AXIS2_BUILDER_LAST_NODE_NOT_NULL;
}
else
{
- soap_builder->last_node_status = AXIS2_BUILDER_LAST_NODE_NOT_NULL;
+ soap_builder->last_node_status = AXIS2_BUILDER_LAST_NODE_NULL;
}
+
current_event = axiom_stax_builder_next_with_token(soap_builder->om_builder, env);
- if(current_event == -1)
+ if(current_event == AXIOM_XML_READER_START_ELEMENT
+ || current_event == AXIOM_XML_READER_EMPTY_ELEMENT)
{
- soap_builder->done = AXIS2_TRUE;
- return AXIS2_FAILURE;
- }
- if(current_event == AXIOM_XML_READER_EMPTY_ELEMENT || current_event
- == AXIOM_XML_READER_START_ELEMENT)
- {
- current_node = axiom_stax_builder_get_lastnode(soap_builder->om_builder, env);
+ axiom_node_t *current_node = axiom_stax_builder_get_lastnode(soap_builder->om_builder, env);
if(current_node)
{
- status = axiom_soap_builder_create_om_element(soap_builder, env, current_node,
- current_event);
+ status = axiom_soap_builder_construct_node(soap_builder, env, current_node);
}
else
- return AXIS2_FAILURE;
+ {
+ /* there is an error. So, don't continue building it */
+ soap_builder->done = AXIS2_TRUE;
+ status = AXIS2_FAILURE;
+ AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "Error occurred when building node");
+ }
}
+ else if(current_event == -1)
+ {
+ /* there is an error. So, don't continue building it */
+ soap_builder->done = AXIS2_TRUE;
+ status = AXIS2_FAILURE;
+ AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "Error occurred when building node");
+ }
+
+ /* for any other event types, return AXIS2_SUCCESS as the return value. */
return status;
}
-AXIS2_EXTERN axiom_node_t *AXIS2_CALL axiom_soap_builder_get_document_element(
+AXIS2_EXTERN axiom_node_t *AXIS2_CALL
+axiom_soap_builder_get_document_element(
axiom_soap_builder_t * soap_builder,
const axutil_env_t * env)
{
- if (soap_builder->soap_envelope)
+ axiom_node_t *document_node = NULL;
+ if(soap_builder->soap_envelope)
{
- return axiom_soap_envelope_get_base_node(soap_builder->soap_envelope,
- env);
+ document_node = axiom_soap_envelope_get_base_node(soap_builder->soap_envelope, env);
}
- else
- return NULL;
-}
-axis2_status_t
-axiom_soap_builder_create_om_element(
- axiom_soap_builder_t * soap_builder,
- const axutil_env_t * env,
- axiom_node_t * current_node,
- int current_event)
-{
- int ret_val = AXIS2_SUCCESS;
- AXIS2_PARAM_CHECK(env->error, current_node, AXIS2_FAILURE);
- if(!soap_builder)
- {
- return AXIS2_FAILURE;
- }
- if(soap_builder->last_node_status == AXIS2_BUILDER_LAST_NODE_NULL)
- {
- ret_val = axiom_soap_builder_construct_node(soap_builder, env, NULL, current_node,
- AXIS2_TRUE);
- }
- else
- {
- int element_level = 0;
- axiom_node_t *parent_node = NULL;
- parent_node = axiom_node_get_parent(current_node, env);
- if(!soap_builder->om_builder)
- {
- return AXIS2_FAILURE;
- }
- element_level = axiom_stax_builder_get_element_level(soap_builder->om_builder, env);
- if(parent_node && element_level == 1 && current_event == AXIOM_XML_READER_EMPTY_ELEMENT)
- {
- ret_val = axiom_soap_builder_construct_node_for_empty_element(soap_builder, env,
- parent_node, current_node);
- }
- else if(parent_node)
- {
- ret_val = axiom_soap_builder_construct_node(soap_builder, env, parent_node,
- current_node, AXIS2_FALSE);
- }
- else
- return AXIS2_FAILURE;
- }
- return ret_val;
+ return document_node;
}
static axis2_status_t
axiom_soap_builder_construct_node(
axiom_soap_builder_t * soap_builder,
const axutil_env_t * env,
- axiom_node_t * parent,
- axiom_node_t * om_element_node,
- axis2_bool_t is_soap_envelope)
+ axiom_node_t * om_element_node)
{
- axiom_element_t *parent_ele = NULL;
- axis2_char_t *parent_localname = NULL;
-
axiom_element_t *om_element = NULL;
const axis2_char_t *ele_localname = NULL;
-
int element_level = 0;
int status = AXIS2_SUCCESS;
+ axiom_node_t *parent = NULL;
- AXIS2_PARAM_CHECK(env->error, om_element_node, AXIS2_FAILURE);
- if(!soap_builder)
- {
- return AXIS2_FAILURE;
- }
- if(!soap_builder->om_builder)
- {
- return AXIS2_FAILURE;
- }
- /** get element level of this om element */
- element_level = axiom_stax_builder_get_element_level(soap_builder->om_builder, env);
- if(axiom_stax_builder_get_current_event(soap_builder->om_builder, env)
- == AXIOM_XML_READER_EMPTY_ELEMENT)
- {
- /* if it is an empty element, increase the element level to ensurer processing
- * header block logic, as the following logic assumes
- * empty elements to be full elements. */
- element_level++;
- }
- /* get om element struct from node */
+ /* get OM element struct from node */
om_element = (axiom_element_t *)axiom_node_get_data_element(om_element_node, env);
if(!om_element)
{
+ AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "Cannot construct node. Invalid element");
return AXIS2_FAILURE;
}
- /* get element localname */
+
+ /* get element local name */
ele_localname = axiom_element_get_localname(om_element, env);
if(!ele_localname)
{
+ AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "Cannot construct node. Invalid element name");
return AXIS2_FAILURE;
}
+
+ parent = axiom_node_get_parent(om_element_node, env);
+ if(!parent)
+ {
+ /* parent node doesn't exist means, this should be SOAP Envelope */
+ if(soap_builder->last_node_status != AXIS2_BUILDER_LAST_NODE_NULL)
+ {
+ /* this means, there are two elements in the first level */
+ AXIS2_ERROR_SET(env->error,
+ AXIS2_ERROR_SOAP_MESSAGE_FIRST_ELEMENT_MUST_CONTAIN_LOCAL_NAME, AXIS2_FAILURE);
+ AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI,
+ "Soap message can contain only one SOAP Envelope as the top level element");
+ return AXIS2_FAILURE;
+ }
+
+ if(axutil_strcasecmp(ele_localname, AXIOM_SOAP_ENVELOPE_LOCAL_NAME) != 0)
+ {
+ AXIS2_ERROR_SET(env->error,
+ AXIS2_ERROR_SOAP_MESSAGE_FIRST_ELEMENT_MUST_CONTAIN_LOCAL_NAME, AXIS2_FAILURE);
+ AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "SOAP message first element must be Envelope");
+ return AXIS2_FAILURE;
+ }
+
+ /** create a null soap envelope struct */
+ soap_builder->soap_envelope = axiom_soap_envelope_create_null(env);
+ if(!soap_builder->soap_envelope)
+ {
+ AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "Unable to create SOAP Envelope");
+ return AXIS2_FAILURE;
+ }
+
+ /** wrap this OM node in it */
+ axiom_soap_envelope_set_base_node(soap_builder->soap_envelope, env, om_element_node);
+ axiom_soap_envelope_set_builder(soap_builder->soap_envelope, env, soap_builder);
+ status = axiom_soap_builder_process_namespace_data(soap_builder, env, om_element_node);
+ if(status != AXIS2_SUCCESS)
+ {
+ AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "SOAP Envelope is having invalid namespace");
+ }
+
+ return status;
+ }
+
+ /** a parent node exist , so not soap envelope. Can be either header/body/children of them */
+
/* start: handle MTOM stuff */
if(axutil_strcmp(ele_localname, AXIS2_XOP_INCLUDE) == 0)
{
axiom_namespace_t *ns = NULL;
while(!axiom_node_is_complete(om_element_node, env))
+ {
axiom_stax_builder_next_with_token(soap_builder->om_builder, env);
+ }
ns = axiom_element_get_namespace(om_element, env, om_element_node);
if(ns)
@@ -497,8 +491,8 @@
axutil_url_decode(env, id_decoded, id_decoded);
data_handler = (axiom_data_handler_t *)axutil_hash_get(
- soap_builder-> mime_body_parts, (void *)id_decoded,
- AXIS2_HASH_KEY_STRING);
+ soap_builder-> mime_body_parts, (void *)id_decoded,
+ AXIS2_HASH_KEY_STRING);
if(data_handler)
{
axiom_text_t *data_text = NULL;
@@ -508,11 +502,11 @@
axiom_node_free_tree(om_element_node, env);
data_text = axiom_text_create_with_data_handler(env,
- parent, data_handler, &data_om_node);
+ parent, data_handler, &data_om_node);
axiom_text_set_content_id(data_text, env, id_decoded);
axiom_stax_builder_set_lastnode(soap_builder->om_builder,
- env, parent);
+ env, parent);
}
if(id_decoded)
{
@@ -529,282 +523,273 @@
}
/* end: handle MTOM stuff */
- if(parent)
+ /** get element level of this OM element */
+ element_level = axiom_stax_builder_get_element_level(soap_builder->om_builder, env);
+ if(axiom_stax_builder_get_current_event(soap_builder->om_builder, env)
+ == AXIOM_XML_READER_EMPTY_ELEMENT)
{
+ /* if it is an empty element, increase the element level to ensure processing header
+ * block logic, as the following logic assumes empty elements to be full elements. */
+ ++element_level;
+ }
- /** a parent node exist , so not soap envelope element */
- parent_ele = (axiom_element_t *)axiom_node_get_data_element(parent, env);
- if(parent_ele)
+ if(element_level == 2)
+ {
+ /* At this level, we can only have soap:Header or soap:Body */
+ status = axiom_soap_builder_process_namespace_data(soap_builder, env, om_element_node);
+ if(status != AXIS2_SUCCESS)
{
- parent_localname = axiom_element_get_localname(parent_ele, env);
+ AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "invalid SOAP namespace");
+ return AXIS2_FAILURE;
}
- }
- if(!parent && is_soap_envelope)
- {
- /** this is the soap envelope element */
- if(axutil_strcasecmp(ele_localname, AXIOM_SOAP_ENVELOPE_LOCAL_NAME) != 0)
+ if(axutil_strcmp(ele_localname, AXIOM_SOAP_HEADER_LOCAL_NAME) == 0)
+ {
+ /* this is the soap header element */
+ status = axiom_soap_builder_construct_soap_header(soap_builder, env, om_element_node);
+ }
+ else if(axutil_strcmp(ele_localname, AXIOM_SOAP_BODY_LOCAL_NAME) == 0)
+ {
+ /* This is the SOAP Body element */
+ status = axiom_soap_builder_construct_soap_body(soap_builder, env, om_element_node);
+ }
+ else
{
AXIS2_ERROR_SET(env->error,
- AXIS2_ERROR_SOAP_MESSAGE_FIRST_ELEMENT_MUST_CONTAIN_LOCAL_NAME, AXIS2_FAILURE);
+ AXIS2_ERROR_SOAP_BUILDER_ENVELOPE_CAN_HAVE_ONLY_HEADER_AND_BODY, AXIS2_FAILURE);
AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI,
- "SOAP message first element must contain a localname");
- return AXIS2_FAILURE;
+ "SOAP builder found a child element other than header or body in envelope element");
+ status = AXIS2_FAILURE;
}
+ return status;
+ }
+ else if(element_level == 3)
+ {
+ axiom_element_t *parent_ele = NULL;
+ axis2_char_t *parent_localname = NULL;
- /** create a null soap envelope struct */
- soap_builder->soap_envelope = axiom_soap_envelope_create_null(env);
- if(!soap_builder->soap_envelope)
+ parent_ele = (axiom_element_t *)axiom_node_get_data_element(parent, env);
+ if(parent_ele)
{
- return AXIS2_FAILURE;
+ parent_localname = axiom_element_get_localname(parent_ele, env);
}
- /** wrap this om node in it */
- status = axiom_soap_envelope_set_base_node(soap_builder->soap_envelope, env,
- om_element_node);
- axiom_soap_envelope_set_builder(soap_builder->soap_envelope, env, soap_builder);
- status = axiom_soap_builder_process_namespace_data(soap_builder, env, om_element_node,
- AXIS2_TRUE);
- if(status == AXIS2_FAILURE)
+ if(!parent_localname)
{
+ AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "Cannot identify parent element local name");
return AXIS2_FAILURE;
}
- }
- else if(element_level == 2)
- {
- if(axutil_strcmp(ele_localname, AXIOM_SOAP_HEADER_LOCAL_NAME) == 0)
- {
- /** this is the soap header element */
+ if(axutil_strcasecmp(parent_localname, AXIOM_SOAP_HEADER_LOCAL_NAME) == 0)
+ {
+ axiom_soap_header_block_t *header_block = NULL;
axiom_soap_header_t *soap_header = NULL;
- if(soap_builder->header_present)
- {
- AXIS2_ERROR_SET(env->error, AXIS2_ERROR_SOAP_BUILDER_MULTIPLE_HEADERS_ENCOUNTERED,
- AXIS2_FAILURE);
- AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "SOAP builder encountered multiple headers");
- return AXIS2_FAILURE;
- }
- if(soap_builder->body_present)
- {
- AXIS2_ERROR_SET(env->error, AXIS2_ERROR_SOAP_BUILDER_HEADER_BODY_WRONG_ORDER,
- AXIS2_FAILURE);
- AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI,
- "SOAP builder encountered body element first and header next");
- return AXIS2_FAILURE;
- }
- soap_builder->header_present = AXIS2_TRUE;
-
- soap_header = axiom_soap_header_create(env);
+ soap_header = axiom_soap_envelope_get_header(soap_builder->soap_envelope, env);
if(!soap_header)
{
+ AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "Cannot get SOAP Header from OM Envelope");
return AXIS2_FAILURE;
}
- axiom_soap_header_set_base_node(soap_header, env, om_element_node);
-
- axiom_soap_envelope_set_header(soap_builder->soap_envelope, env, soap_header);
-
- axiom_soap_header_set_builder(soap_header, env, soap_builder);
- axiom_soap_header_set_soap_version(soap_header, env, soap_builder->soap_version);
-
- status = axiom_soap_builder_process_namespace_data(soap_builder, env, om_element_node,
- AXIS2_TRUE);
- if(status == AXIS2_FAILURE)
+ header_block = axiom_soap_header_block_create(env);
+ if(!header_block)
{
+ AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "Cannot create SOAP Header block");
return AXIS2_FAILURE;
}
+ axiom_soap_header_block_set_base_node(header_block, env, om_element_node);
+ axiom_soap_header_set_header_block(soap_header, env, header_block);
+ axiom_soap_header_block_set_soap_version(header_block, env, soap_builder->soap_version);
+ return AXIS2_SUCCESS;
}
- else if(axutil_strcmp(ele_localname, AXIOM_SOAP_BODY_LOCAL_NAME) == 0)
+ else if(axutil_strcasecmp(parent_localname, AXIOM_SOAP_BODY_LOCAL_NAME) == 0)
{
-
axiom_soap_body_t *soap_body = NULL;
- if(soap_builder->body_present)
+ axiom_soap_fault_t *soap_fault = NULL;
+ axiom_namespace_t *env_ns = NULL;
+
+ if(axutil_strcasecmp(ele_localname, AXIOM_SOAP_BODY_FAULT_LOCAL_NAME) != 0)
{
- AXIS2_ERROR_SET(env->error,
- AXIS2_ERROR_SOAP_BUILDER_MULTIPLE_BODY_ELEMENTS_ENCOUNTERED, AXIS2_FAILURE);
- AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI,
- "SOAP builder multiple body elements encountered");
- return AXIS2_FAILURE;
+ /* We don't need to process any children of SOAP Body, which is not a soap fault. */
+ return AXIS2_SUCCESS;
+ }
+ env_ns = axiom_soap_envelope_get_namespace(soap_builder->soap_envelope, env);
+ if(!env_ns)
+ {
+ AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "Cannot get soap envelope namespace");
+ return AXIS2_FAILURE;
}
- soap_builder->body_present = AXIS2_TRUE;
- soap_body = axiom_soap_body_create(env);
+ soap_body = axiom_soap_envelope_get_body(soap_builder->soap_envelope, env);
if(!soap_body)
{
+ AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "Cannot get soap body from OM Envelope");
return AXIS2_FAILURE;
}
- axiom_soap_body_set_base_node(soap_body, env, om_element_node);
- axiom_soap_body_set_builder(soap_body, env, soap_builder);
+ soap_fault = axiom_soap_fault_create(env);
+ if(!soap_fault)
+ {
+ AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "Cannot create SOAP Fault structure");
+ return AXIS2_FAILURE;
+ }
- axiom_soap_envelope_set_body(soap_builder->soap_envelope, env, soap_body);
+ axiom_soap_fault_set_base_node(soap_fault, env, om_element_node);
+ axiom_soap_body_set_fault(soap_body, env, soap_fault);
+ axiom_soap_fault_set_builder(soap_fault, env, soap_builder);
+ soap_builder->processing_fault = AXIS2_TRUE;
+ soap_builder->processing_mandatory_fault_elements = AXIS2_TRUE;
- status = axiom_soap_builder_process_namespace_data(soap_builder, env, om_element_node,
- AXIS2_TRUE);
+ if(axutil_strcmp(AXIOM_SOAP12_SOAP_ENVELOPE_NAMESPACE_URI,
+ axiom_namespace_get_uri(env_ns, env)) == 0)
+ {
+ soap_builder->builder_helper = axiom_soap12_builder_helper_create(env, soap_builder);
+ }
+ else if(axutil_strcmp(AXIOM_SOAP11_SOAP_ENVELOPE_NAMESPACE_URI,
+ axiom_namespace_get_uri(env_ns, env)) == 0)
+ {
+ soap_builder->builder_helper = axiom_soap11_builder_helper_create(
+ env, soap_builder,soap_builder->om_builder);
+ }
- if(status == AXIS2_FAILURE)
+ if(!soap_builder->builder_helper)
{
+ AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "Cannot create soap builder helper");
return AXIS2_FAILURE;
}
+ return AXIS2_SUCCESS;
}
- else if(parent_localname && axutil_strcasecmp(parent_localname,
- AXIOM_SOAP_HEADER_LOCAL_NAME) && axutil_strcasecmp(parent_localname,
- AXIOM_SOAP_BODY_LOCAL_NAME))
+ else
{
AXIS2_ERROR_SET(env->error,
AXIS2_ERROR_SOAP_BUILDER_ENVELOPE_CAN_HAVE_ONLY_HEADER_AND_BODY, AXIS2_FAILURE);
AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI,
- "SOAP builder found a child element other than header or "
- "body in envelope element");
+ "SOAP builder found a child element other than header or body in envelope element");
return AXIS2_FAILURE;
}
}
- else if((element_level == 3) && parent_localname && axutil_strcasecmp(parent_localname,
- AXIOM_SOAP_HEADER_LOCAL_NAME) == 0)
- {
- axiom_soap_header_block_t *header_block = NULL;
- axiom_soap_header_t *soap_header = NULL;
-
- soap_header = axiom_soap_envelope_get_header(soap_builder->soap_envelope, env);
- if(!soap_header)
- {
- return AXIS2_FAILURE;
- }
-
- header_block = axiom_soap_header_block_create(env);
- if(!header_block)
- {
- return AXIS2_FAILURE;
- }
-
- axiom_soap_header_block_set_base_node(header_block, env, om_element_node);
-
- axiom_soap_header_set_header_block(soap_header, env, header_block);
-
- axiom_soap_header_block_set_soap_version(header_block, env, soap_builder->soap_version);
-
- }
- else if((element_level == 3) && parent_localname && axutil_strcasecmp(parent_localname,
- AXIOM_SOAP_BODY_LOCAL_NAME) == 0 && axutil_strcasecmp(ele_localname,
- AXIOM_SOAP_BODY_FAULT_LOCAL_NAME) == 0)
+ else if(element_level > 3 && soap_builder->processing_fault)
{
- axiom_soap_body_t *soap_body = NULL;
- axiom_soap_fault_t *soap_fault = NULL;
- axiom_namespace_t *env_ns = NULL;
-
- env_ns = axiom_soap_envelope_get_namespace(soap_builder->soap_envelope, env);
- if(!env_ns)
+ if(soap_builder->soap_version == AXIOM_SOAP11)
{
- return AXIS2_FAILURE;
+ status = axiom_soap11_builder_helper_handle_event((axiom_soap11_builder_helper_t *)
+ soap_builder->builder_helper, env, om_element_node, element_level);
}
- soap_body = axiom_soap_envelope_get_body(soap_builder->soap_envelope, env);
-
- if(!soap_body)
+ else if(soap_builder->soap_version == AXIOM_SOAP12)
{
- return AXIS2_FAILURE;
+ status = axiom_soap12_builder_helper_handle_event((axiom_soap12_builder_helper_t *)
+ soap_builder->builder_helper, env, om_element_node, element_level);
}
- soap_fault = axiom_soap_fault_create(env);
- if(!soap_fault)
+ else
{
- return AXIS2_FAILURE;
+ AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "Unknown SOAP Version");
+ status = AXIS2_FAILURE;
}
- axiom_soap_fault_set_base_node(soap_fault, env, om_element_node);
-
- axiom_soap_body_set_fault(soap_body, env, soap_fault);
+ }
+ return status;
+}
- axiom_soap_fault_set_builder(soap_fault, env, soap_builder);
+static axis2_status_t
+axiom_soap_builder_construct_soap_header(
+ axiom_soap_builder_t *soap_builder,
+ const axutil_env_t *env,
+ axiom_node_t *om_node)
+{
+ axiom_soap_header_t *soap_header = NULL;
+ if(soap_builder->header_present)
+ {
+ AXIS2_ERROR_SET(env->error, AXIS2_ERROR_SOAP_BUILDER_MULTIPLE_HEADERS_ENCOUNTERED,
+ AXIS2_FAILURE);
+ AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "SOAP builder encountered multiple headers");
+ return AXIS2_FAILURE;
+ }
+ if(soap_builder->body_present)
+ {
+ AXIS2_ERROR_SET(env->error, AXIS2_ERROR_SOAP_BUILDER_HEADER_BODY_WRONG_ORDER,
+ AXIS2_FAILURE);
+ AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI,
+ "SOAP builder encountered body element first and header next");
+ return AXIS2_FAILURE;
+ }
- soap_builder->processing_fault = AXIS2_TRUE;
+ soap_builder->header_present = AXIS2_TRUE;
+ soap_header = axiom_soap_header_create(env);
+ if(!soap_header)
+ {
+ AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "Unable to create SOAP Header");
+ return AXIS2_FAILURE;
+ }
- soap_builder->processing_mandatory_fault_elements = AXIS2_TRUE;
+ axiom_soap_header_set_base_node(soap_header, env, om_node);
+ axiom_soap_envelope_set_header(soap_builder->soap_envelope, env, soap_header);
+ axiom_soap_header_set_builder(soap_header, env, soap_builder);
+ axiom_soap_header_set_soap_version(soap_header, env, soap_builder->soap_version);
- if(axutil_strcmp(AXIOM_SOAP12_SOAP_ENVELOPE_NAMESPACE_URI, axiom_namespace_get_uri(env_ns,
- env)) == 0)
- {
- soap_builder->builder_helper = axiom_soap12_builder_helper_create(env, soap_builder);
- if(!(soap_builder->builder_helper))
- {
- return AXIS2_FAILURE;
- }
- }
- else if(axutil_strcmp(AXIOM_SOAP11_SOAP_ENVELOPE_NAMESPACE_URI, axiom_namespace_get_uri(
- env_ns, env)) == 0)
- {
- soap_builder->builder_helper = axiom_soap11_builder_helper_create(env, soap_builder,
- soap_builder->om_builder);
- if(!(soap_builder->builder_helper))
- {
- return AXIS2_FAILURE;
- }
- }
+ return AXIS2_SUCCESS;
+}
+static axis2_status_t
+axiom_soap_builder_construct_soap_body(
+ axiom_soap_builder_t *soap_builder,
+ const axutil_env_t *env,
+ axiom_node_t *om_node)
+{
+ axiom_soap_body_t *soap_body = NULL;
+ if(soap_builder->body_present)
+ {
+ AXIS2_ERROR_SET(env->error,
+ AXIS2_ERROR_SOAP_BUILDER_MULTIPLE_BODY_ELEMENTS_ENCOUNTERED, AXIS2_FAILURE);
+ AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI,
+ "SOAP builder multiple body elements encountered");
+ return AXIS2_FAILURE;
}
- else if(element_level > 3 && soap_builder->processing_fault)
+
+ soap_builder->body_present = AXIS2_TRUE;
+ soap_body = axiom_soap_body_create(env);
+ if(!soap_body)
{
- if(soap_builder->soap_version == AXIOM_SOAP11)
- {
- status = axiom_soap11_builder_helper_handle_event(
- ((axiom_soap11_builder_helper_t *)(soap_builder->builder_helper)), env,
- om_element_node, element_level);
+ AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "Unable to create SOAP Body");
+ return AXIS2_FAILURE;
+ }
- }
- else if(soap_builder->soap_version == AXIOM_SOAP12)
- {
- status = axiom_soap12_builder_helper_handle_event(
- ((axiom_soap12_builder_helper_t *)(soap_builder->builder_helper)), env,
- om_element_node, element_level);
- }
+ axiom_soap_body_set_base_node(soap_body, env, om_node);
+ axiom_soap_body_set_builder(soap_body, env, soap_builder);
+ axiom_soap_envelope_set_body(soap_builder->soap_envelope, env, soap_body);
- }
- return status;
+ return AXIS2_SUCCESS;
}
-
-AXIS2_EXTERN axis2_status_t AXIS2_CALL
+/* check whether the namespace of given node is either SOAP11 or SOAP12 namespace */
+static axis2_status_t
axiom_soap_builder_process_namespace_data(
axiom_soap_builder_t * soap_builder,
const axutil_env_t * env,
- axiom_node_t * om_node,
- axis2_bool_t is_soap_element)
+ axiom_node_t * om_node)
{
axiom_element_t *om_ele = NULL;
axiom_namespace_t *om_ns = NULL;
- axis2_char_t *ns_uri = NULL;
-
- if(!om_node)
- {
- return AXIS2_FAILURE;
- }
- if(!is_soap_element)
+ om_ele = (axiom_element_t *)axiom_node_get_data_element(om_node, env);
+ om_ns = axiom_element_get_namespace(om_ele, env, om_node);
+ if(om_ns)
{
- return AXIS2_SUCCESS;
- }
- if(axiom_node_get_node_type(om_node, env) == AXIOM_ELEMENT)
- {
- om_ele = (axiom_element_t *)axiom_node_get_data_element(om_node, env);
- if(om_ele)
+ axis2_char_t *ns_uri = NULL;
+ ns_uri = axiom_namespace_get_uri(om_ns, env);
+ if(ns_uri)
{
- om_ns = axiom_element_get_namespace(om_ele, env, om_node);
- if(om_ns)
+ if((axutil_strcmp(ns_uri, AXIOM_SOAP11_SOAP_ENVELOPE_NAMESPACE_URI) == 0)
+ || (axutil_strcmp(ns_uri, AXIOM_SOAP12_SOAP_ENVELOPE_NAMESPACE_URI) == 0))
{
- ns_uri = axiom_namespace_get_uri(om_ns, env);
- if(ns_uri && (axutil_strcmp(ns_uri, AXIOM_SOAP11_SOAP_ENVELOPE_NAMESPACE_URI) != 0)
- && (axutil_strcmp(ns_uri, AXIOM_SOAP12_SOAP_ENVELOPE_NAMESPACE_URI) != 0))
- {
- AXIS2_ERROR_SET(env->error, AXIS2_ERROR_INVALID_SOAP_NAMESPACE_URI,
- AXIS2_FAILURE);
- AXIS2_LOG_DEBUG(env->log, AXIS2_LOG_SI,
- "AXIS2_ERROR_INVALID_SOAP_NAMESPACE_URI");
- return AXIS2_FAILURE;
- }
-
+ return AXIS2_SUCCESS;
}
}
}
- return AXIS2_SUCCESS;
+
+ AXIS2_ERROR_SET(env->error, AXIS2_ERROR_INVALID_SOAP_NAMESPACE_URI, AXIS2_FAILURE);
+ AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "Invalid SOAP Namespace URI");
+ return AXIS2_FAILURE;
}
static axis2_status_t
@@ -977,149 +962,6 @@
return AXIS2_SUCCESS;
}
-static axis2_status_t
-axiom_soap_builder_construct_node_for_empty_element(
- axiom_soap_builder_t * soap_builder,
- const axutil_env_t * env,
- axiom_node_t * parent,
- axiom_node_t * om_element_node)
-{
- axiom_element_t *parent_ele = NULL;
- axis2_char_t *parent_localname = NULL;
-
- axiom_element_t *om_element = NULL;
- axis2_char_t *ele_localname = NULL;
-
- int element_level = 0;
- int status = AXIS2_SUCCESS;
-
- AXIS2_PARAM_CHECK(env->error, om_element_node, AXIS2_FAILURE);
- if(!soap_builder)
- {
- return AXIS2_FAILURE;
- }
- if(!soap_builder->om_builder)
- {
- return AXIS2_FAILURE;
- }
- element_level = axiom_stax_builder_get_element_level(soap_builder->om_builder, env);
-
- om_element = (axiom_element_t *)axiom_node_get_data_element(om_element_node, env);
- if(!om_element)
- {
- return AXIS2_FAILURE;
- }
- ele_localname = axiom_element_get_localname(om_element, env);
- if(!ele_localname)
- {
- return AXIS2_FAILURE;
- }
- if(!parent)
- {
- return AXIS2_FAILURE;
- }
- parent_ele = (axiom_element_t *)axiom_node_get_data_element(parent, env);
- if(!parent_ele)
- {
- return AXIS2_FAILURE;
- }
- parent_localname = axiom_element_get_localname(parent_ele, env);
- if(!parent_localname)
- {
- return AXIS2_FAILURE;
- }
- if(element_level == 1)
- {
- if(axutil_strcmp(ele_localname, AXIOM_SOAP_HEADER_LOCAL_NAME) == 0)
- {
-
- /** this is the soap header element */
- axiom_soap_header_t *soap_header = NULL;
- if(soap_builder->header_present)
- {
- AXIS2_ERROR_SET(env->error, AXIS2_ERROR_SOAP_BUILDER_MULTIPLE_HEADERS_ENCOUNTERED,
- AXIS2_FAILURE);
- AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "SOAP builder encountered multiple headers");
- return AXIS2_FAILURE;
- }
- if(soap_builder->body_present)
- {
- AXIS2_ERROR_SET(env->error, AXIS2_ERROR_SOAP_BUILDER_HEADER_BODY_WRONG_ORDER,
- AXIS2_FAILURE);
- AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI,
- "SOAP builder encountered body element first and header next");
- return AXIS2_FAILURE;
- }
-
- soap_builder->header_present = AXIS2_TRUE;
-
- soap_header = axiom_soap_header_create(env);
- if(!soap_header)
- {
- return AXIS2_FAILURE;
- }
- axiom_soap_header_set_base_node(soap_header, env, om_element_node);
-
- axiom_soap_envelope_set_header(soap_builder->soap_envelope, env, soap_header);
-
- axiom_soap_header_set_builder(soap_header, env, soap_builder);
-
- axiom_soap_header_set_soap_version(soap_header, env, soap_builder->soap_version);
-
- status = axiom_soap_builder_process_namespace_data(soap_builder, env, om_element_node,
- AXIS2_TRUE);
- if(status == AXIS2_FAILURE)
- {
- return AXIS2_FAILURE;
- }
- }
- else if(axutil_strcmp(ele_localname, AXIOM_SOAP_BODY_LOCAL_NAME) == 0)
- {
-
- axiom_soap_body_t *soap_body = NULL;
- if(soap_builder->body_present)
- {
- AXIS2_ERROR_SET(env->error,
- AXIS2_ERROR_SOAP_BUILDER_MULTIPLE_BODY_ELEMENTS_ENCOUNTERED, AXIS2_FAILURE);
- AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI,
- "SOAP builder multiple body elements encountered");
- return AXIS2_FAILURE;
-
- }
- soap_builder->body_present = AXIS2_TRUE;
-
- soap_body = axiom_soap_body_create(env);
- if(!soap_body)
- {
- return AXIS2_FAILURE;
- }
- axiom_soap_body_set_base_node(soap_body, env, om_element_node);
-
- axiom_soap_body_set_builder(soap_body, env, soap_builder);
-
- axiom_soap_envelope_set_body(soap_builder->soap_envelope, env, soap_body);
-
- status = axiom_soap_builder_process_namespace_data(soap_builder, env, om_element_node,
- AXIS2_TRUE);
-
- if(status == AXIS2_FAILURE)
- {
- return AXIS2_FAILURE;
- }
- }
- else
- {
- AXIS2_ERROR_SET(env->error,
- AXIS2_ERROR_SOAP_BUILDER_ENVELOPE_CAN_HAVE_ONLY_HEADER_AND_BODY, AXIS2_FAILURE);
- AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI,
- "SOAP builder found a child element other than header or "
- "body in envelope element");
- return AXIS2_FAILURE;
- }
- }
- return status;
-}
-
AXIS2_EXTERN axutil_hash_t *AXIS2_CALL
axiom_soap_builder_get_mime_body_parts(
axiom_soap_builder_t * builder,