/* * 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 #include #include #include #include #include #include #include #include #include #include #include #include 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, "\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; }