/*
 * Copyright 2004,2005 The Apache Software Foundation.
 *
 * Licensed 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 <xml_schema_includes.h>
#include <stdio.h>
#include <axis2_env.h>
#include <axis2_utils_defines.h>

axis2_status_t
xml_schema_test(
    axis2_env_t *env,
    axis2_char_t *filename)
{
    axiom_xml_reader_t *xml_reader      = NULL;
    axiom_stax_builder_t *om_builder = NULL;
    axiom_document_t *om_doc         = NULL;
    xml_schema_collection_t *schema_collection = NULL;
    xml_schema_t *schema          = NULL;
    axiom_xml_reader_init();
    xml_reader =
        axiom_xml_reader_create_for_file(env, filename, NULL);
    if (!xml_reader)
        return AXIS2_FAILURE;

    om_builder = axiom_stax_builder_create(env, xml_reader);

    om_doc = AXIOM_STAX_BUILDER_GET_DOCUMENT(om_builder, env);

    AXIOM_DOCUMENT_BUILD_ALL(om_doc, env);
    schema_collection = xml_schema_collection_create(env);

    schema = XML_SCHEMA_COLLECTION_READ_DOCUMENT(
                schema_collection, env, om_doc);

    if (schema)
    {
        axis2_char_t *buffer = NULL;
        printf("\n parsing schema is successful \n");
        buffer = XML_SCHEMA_SERIALIZE(schema, env);
        printf("%s", buffer);
        if (buffer)
            AXIS2_FREE(env->allocator, buffer);
    }
    if (schema_collection)
    {
        XML_SCHEMA_COLLECTION_FREE(schema_collection, env);
    }
    AXIOM_STAX_BUILDER_FREE(om_builder, env);
    axiom_xml_reader_cleanup();

    return AXIS2_SUCCESS;
}

int main(int argc, char *argv[])
{
    axis2_env_t *env = NULL;
    axis2_char_t *filename = NULL;
    if (argc > 1)
    {
        filename = argv[1];
        printf("filename:%s\n", filename);
    }
    else
    {
        printf("Give an XML schema file as the first argument\n");
    }
    env = axis2_env_create_all("test.log", 1);
    xml_schema_test(env, filename);
    return 0;
}

