
/*
 * 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;
}
