/* | |
* Licensed to the Apache Software Foundation (ASF) under one or more | |
* contributor license agreements. See the NOTICE file distributed with | |
* this work for additional information regarding copyright ownership. | |
* The ASF licenses this file to You under the Apache License, Version 2.0 | |
* (the "License"); you may not use this file except in compliance with | |
* the License. You may obtain a copy of the License at | |
* | |
* http://www.apache.org/licenses/LICENSE-2.0 | |
* | |
* Unless required by applicable law or agreed to in writing, software | |
* distributed under the License is distributed on an "AS IS" BASIS, | |
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
* See the License for the specific language governing permissions and | |
* limitations under the License. | |
*/ | |
#include <axiom_stax_builder.h> | |
#include <axiom_document.h> | |
#include <axiom_node.h> | |
#include <axiom_element.h> | |
#include <axiom_text.h> | |
#include <axiom_data_source.h> | |
#include <axutil_stream.h> | |
#include <axutil_log_default.h> | |
#include <axutil_error_default.h> | |
#include <axiom_xml_reader.h> | |
#include <stdio.h> | |
#include <axiom_xml_writer.h> | |
#include <axutil_env.h> | |
axiom_node_t * return_policy_element(axis2_char_t *name, const axutil_env_t *env, axis2_char_t *wsdl_name); | |
axis2_char_t * get_policy_ref(axiom_node_t * node, const axutil_env_t * env); | |
void get_all_policy(axis2_char_t * element_name, const axutil_env_t * env, axutil_array_list_t * policy_node_list, axis2_char_t *wsdl_name); | |
/** | |
Define the environment related variables globaly so that they are available | |
for both functions | |
*/ | |
axutil_allocator_t *allocator = NULL; | |
axutil_env_t *environment = NULL; | |
axutil_stream_t *stream = NULL; | |
axutil_error_t *error = NULL; | |
axutil_log_t *axis_log = NULL; | |
FILE *f = NULL; | |
FILE *o = NULL; | |
/** a method that demonstrate creating a om model using an xml file */ | |
int AXIS2_CALL read_input(char *buffer, int size, void* ctx) | |
{ | |
int len = 0; | |
char* pos = NULL; | |
len = fread(buffer, sizeof(char), size, f); | |
if (buffer) | |
pos = strstr(buffer, "---"); | |
if (pos) | |
{ | |
len = pos - buffer; | |
*pos = '\0'; | |
} | |
return len; | |
} | |
int | |
main(int argc, char *argv[]) | |
{ | |
axutil_qname_t * qname = NULL; | |
axiom_node_t *policy_node = NULL, *node = NULL; | |
axiom_xml_writer_t *writer = NULL; | |
axiom_output_t *om_output = NULL; | |
axis2_char_t * pol_ref = NULL; | |
axiom_element_t * policy_element = NULL, *ele = NULL; | |
axiom_node_t *child_node = NULL; | |
axutil_array_list_t * policy_array = NULL; | |
char *buffer = NULL; | |
const char *file_name = "C:\\OMWsdl\\wsdltest\\debug\\PolicyAttachments.wsdl"; | |
const char *out_file_name = "C:\\OMWsdl\\wsdltest\\debug\\out.xml"; | |
allocator = axutil_allocator_init(NULL); | |
axis_log = axutil_log_create(allocator, NULL, NULL); | |
error = axutil_error_create(allocator); | |
environment = axutil_env_create_with_error_log(allocator, error, axis_log); | |
policy_array = axutil_array_list_create(environment, 10); | |
//get all the policy values of "Binding_2B" | |
get_all_policy("Binding-2B", environment, policy_array, file_name); | |
node = (axiom_node_t *) axutil_array_list_get(policy_array, environment, 2); | |
ele = (axiom_element_t *)axiom_node_get_data_element(node, environment); | |
qname = axiom_element_get_qname(ele, environment, node); | |
printf("qname %s\n", axutil_qname_get_uri(qname, environment)); | |
writer = axiom_xml_writer_create_for_memory(environment, NULL, AXIS2_TRUE, 0, | |
AXIS2_XML_PARSER_TYPE_BUFFER); | |
om_output = axiom_output_create(environment, writer); | |
axiom_node_serialize(node, environment , om_output); | |
buffer = (axis2_char_t*)axiom_xml_writer_get_xml(writer, environment); | |
if (buffer) | |
{ | |
//printf(outfilename); | |
o = fopen("C:\\OMWsdl\\wsdltest\\debug\\out.xml","w"); | |
if (!o) | |
return -1; | |
printf("Printing the Buffer...\n"); | |
printf("%s", buffer); | |
fprintf(o,"<?xml version=\"1.0\" ?>\n%s",buffer); | |
} | |
axiom_output_free(om_output, environment); | |
fclose(f); | |
axutil_env_free(environment); | |
return 0; | |
} | |
axiom_node_t * return_policy_element(axis2_char_t * name, const axutil_env_t * env, axis2_char_t * wsdl_name) | |
{ | |
axiom_element_t *ele1 = NULL, *ele2 = NULL; | |
axiom_document_t *document = NULL; | |
axiom_node_t *node1 = NULL, *node2 = NULL, *policy_node = NULL; | |
axiom_namespace_t* ns = NULL; | |
axiom_xml_reader_t *reader = NULL; | |
axiom_stax_builder_t *builder = NULL; | |
char *buffer = NULL; | |
axiom_attribute_t * attr = NULL; | |
axis2_char_t * value = NULL; | |
axis2_char_t * val = NULL; | |
axutil_hash_t *attr_hash = NULL; | |
axis2_char_t *xml_output = NULL; | |
axutil_hash_index_t *hi; | |
f = fopen(wsdl_name, "r"); | |
if (!f) | |
return NULL; | |
reader = axiom_xml_reader_create_for_io(environment, read_input, NULL , NULL, NULL); | |
if (!reader) | |
{ | |
printf("ERROR CREATING PULLPARSER"); | |
return NULL; | |
} | |
builder = axiom_stax_builder_create(environment, reader); | |
if (!builder) | |
{ | |
printf("ERROR CREATING PULL PARSER"); | |
return NULL; | |
} | |
document = axiom_stax_builder_get_document(builder, environment); | |
if (!document) | |
return NULL; | |
node1 = axiom_document_get_root_element(document, environment); | |
if (!node1) | |
{ | |
printf(" root element null "); | |
axiom_stax_builder_free(builder, environment); | |
return NULL; | |
} | |
do | |
{ | |
node2 = axiom_document_build_next(document , environment); | |
if (!node2) | |
break; | |
if (axiom_node_get_node_type(node2, environment) == AXIOM_ELEMENT) | |
{ | |
ele2 = (axiom_element_t*) axiom_node_get_data_element(node2, environment); | |
attr_hash = axiom_element_get_all_attributes(ele2, environment); | |
if (attr_hash) | |
{ | |
hi = axutil_hash_first(attr_hash, environment); | |
axutil_hash_this(hi, NULL, NULL, &attr); | |
if (axutil_strcmp(axiom_attribute_get_value(attr, environment), name) == 0) | |
{ | |
policy_node = node2; | |
} | |
} | |
} | |
}while (node2); | |
return policy_node; | |
} | |
axis2_char_t * get_policy_ref(axiom_node_t *node, const axutil_env_t * env) | |
{ | |
axiom_element_t *policy_element = NULL; | |
axiom_children_iterator_t *children_iter = NULL; | |
axiom_node_t *child_node = NULL; | |
axutil_qname_t *qname = NULL; | |
axis2_char_t * value = NULL; | |
axis2_char_t * val = NULL; | |
axiom_attribute_t * attr = NULL; | |
policy_element = (axiom_element_t *) axiom_node_get_data_element(node, env); | |
children_iter = axiom_element_get_children(policy_element, env, node); | |
while(axiom_children_iterator_has_next(children_iter, env)) | |
{ | |
child_node = axiom_children_iterator_next(children_iter, env); | |
if(axiom_node_get_node_type(child_node, environment) == AXIOM_ELEMENT) | |
{ | |
policy_element = (axiom_element_t*) axiom_node_get_data_element(child_node, environment); | |
if (axutil_strcmp(axiom_element_get_localname(policy_element, environment), "PolicyReference") == 0) | |
{ | |
qname = axutil_qname_create(environment, "URI", NULL, NULL); | |
attr = axiom_element_get_attribute(policy_element, environment, qname); | |
if (attr) | |
{ | |
value = axiom_attribute_get_value(attr, environment); | |
val = axutil_string_substring_starting_at(value, 1); | |
return val; | |
} | |
} | |
} | |
} | |
return NULL; | |
} | |
void get_all_policy(axis2_char_t * element_name, const axutil_env_t * env, axutil_array_list_t * policy_node_list, axis2_char_t *wsdl_name) | |
{ | |
axutil_hash_t *attr_hash = NULL; | |
axutil_hash_index_t *hi = NULL; | |
axiom_element_t *element = NULL; | |
axiom_attribute_t *attribute = NULL; | |
axis2_char_t * attribute_val = NULL; | |
axiom_node_t * parent_policy_node = NULL, *parent_node = NULL; | |
parent_node = return_policy_element(element_name, env, wsdl_name); | |
if (!parent_node) | |
return; | |
parent_policy_node = return_policy_element(get_policy_ref(parent_node, env), env, wsdl_name); | |
axutil_array_list_add(policy_node_list, env, parent_policy_node); | |
if (axiom_node_get_node_type(parent_node, env) == AXIOM_ELEMENT) | |
{ | |
element = (axiom_element_t*) axiom_node_get_data_element(parent_node, env); | |
attr_hash = axiom_element_get_all_attributes(element, env); | |
if (attr_hash) | |
{ | |
hi = axutil_hash_next(env, axutil_hash_first(attr_hash, env)); | |
do | |
{ | |
if (hi) | |
{ | |
axutil_hash_this(hi, NULL, NULL, &attribute); | |
attribute_val = axiom_attribute_get_value(attribute, env); | |
attribute_val = axutil_rindex(attribute_val, ':'); | |
attribute_val = axutil_string_substring_starting_at(attribute_val,1); | |
get_all_policy(attribute_val, env, policy_node_list, wsdl_name); | |
hi = axutil_hash_next(env, hi); | |
} | |
}while (hi); | |
} | |
} | |
return; | |
} |