blob: 85574088c57e06d009377cce3508482a31be4592 [file] [log] [blame]
/*
* 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 <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <axis2_string_util.h>
#include <axis2_allocator.h>
#include <limits.h>
#include <axis2_string.h>
#include <axiom_util.h>
typedef struct xml_schema_builder_impl
{
xml_schema_builder_t builder;
axiom_node_t *root_node;
void *schema;
xml_schema_collection_t *collection;
int gen_no;
axis2_array_list_t *document_list;
axiom_node_t *schema_element;
}xml_schema_builder_impl_t;
#define AXIS2_INTF_TO_IMPL(builder) \
((xml_schema_builder_impl_t*)builder)
xml_schema_t* AXIS2_CALL
xml_schema_builder_build(
xml_schema_builder_t *builder,
const axis2_env_t *env,
axiom_document_t *om_doc,
axis2_char_t *uri);
xml_schema_t* AXIS2_CALL
xml_schema_builder_build_with_root_node(
xml_schema_builder_t *builder,
const axis2_env_t *env,
axiom_node_t *root,
axis2_char_t *uri);
axis2_status_t AXIS2_CALL
xml_schema_builder_free(
xml_schema_builder_t *builder,
const axis2_env_t *env);
static xml_schema_t*
handle_xml_schema_element(
xml_schema_builder_t *builder,
const axis2_env_t *env,
axiom_node_t *ele_node,
axis2_char_t *uri);
static xml_schema_annotation_t*
handle_annotation(
xml_schema_builder_t *builder,
const axis2_env_t *env,
axiom_node_t *ann_node,
axiom_node_t *sch_node);
static xml_schema_redefine_t*
handle_redefine(
xml_schema_builder_t *builder,
const axis2_env_t *env,
axiom_node_t *redefine_node,
axiom_node_t *sch_node);
static axis2_status_t
set_namespace_attributes(
xml_schema_builder_t* builder,
const axis2_env_t *env,
xml_schema_t *schema,
axiom_node_t *sch_node);
static axis2_status_t
put_namespace(
xml_schema_builder_t* builder,
const axis2_env_t *env,
axis2_char_t *prefix,
axis2_char_t *ns);
static xml_schema_simple_type_t*
handle_simple_type(
xml_schema_builder_t *builder,
const axis2_env_t *env,
axiom_node_t *simple_node,
axiom_node_t *sch_node);
static xml_schema_complex_type_t*
handle_complex_type(
xml_schema_builder_t *builder,
const axis2_env_t *env,
axiom_node_t *complex_node,
axiom_node_t *schema_node);
static xml_schema_simple_content_t*
handle_simple_content(
xml_schema_builder_t *builder,
const axis2_env_t *env,
axiom_node_t *simple_node,
axiom_node_t *schema_node);
static xml_schema_complex_content_t*
handle_complex_content(
xml_schema_builder_t *builder,
const axis2_env_t *env,
axiom_node_t *complex_node,
axiom_node_t *schema_node);
static xml_schema_simple_content_restriction_t*
handle_simple_content_restriction(
xml_schema_builder_t* builder,
const axis2_env_t *env,
axiom_node_t *res_node,
axiom_node_t *schema_node);
static xml_schema_simple_content_extension_t*
handle_simple_content_extension(
xml_schema_builder_t* builder,
const axis2_env_t *env,
axiom_node_t *sim_ext_node,
axiom_node_t *schema_node);
static xml_schema_complex_content_restriction_t*
handle_complex_content_restriction(
xml_schema_builder_t* builder,
const axis2_env_t *env,
axiom_node_t *res_node,
axiom_node_t *schema_node);
static xml_schema_complex_content_extension_t*
handle_complex_content_extension(
xml_schema_builder_t *builder,
const axis2_env_t *env,
axiom_node_t *cmp_ext_node,
axiom_node_t *schema_node);
static xml_schema_attribute_group_ref_t*
handle_attribute_group_ref(
xml_schema_builder_t *builder,
const axis2_env_t *env,
axiom_node_t *attr_grp_node,
axiom_node_t *schema_node);
static xml_schema_group_base_t*
handle_sequence(
xml_schema_builder_t *builder,
const axis2_env_t *env,
axiom_node_t *seq_node,
axiom_node_t *schema_node);
static xml_schema_any_t*
handle_any(
xml_schema_builder_t* builder,
const axis2_env_t *env,
axiom_node_t *any_node,
axiom_node_t *schema_node);
static xml_schema_group_base_t*
handle_choice(
xml_schema_builder_t* builder,
const axis2_env_t *env,
axiom_node_t *choice_node,
axiom_node_t *schema_node);
static xml_schema_group_base_t*
handle_all(
xml_schema_builder_t* builder,
const axis2_env_t *env,
axiom_node_t *all_node,
axiom_node_t *schema_node);
static xml_schema_group_t*
handle_group(
xml_schema_builder_t* builder,
const axis2_env_t *env,
axiom_node_t *group_node,
axiom_node_t *schema_node);
static xml_schema_attribute_group_t*
handle_attribute_group(
xml_schema_builder_t* builder,
const axis2_env_t *env,
axiom_node_t *attr_grp_node,
axiom_node_t *schema_node);
static xml_schema_any_attribute_t*
handle_any_attribute(
xml_schema_builder_t *builder,
const axis2_env_t *env,
axiom_node_t *any_attr_node,
axiom_node_t *schema_node);
static xml_schema_group_ref_t*
handle_group_ref(
xml_schema_builder_t *builder,
const axis2_env_t *env,
axiom_node_t *grp_ref_node,
axiom_node_t *schema_node);
static xml_schema_attribute_t*
handle_attribute(
xml_schema_builder_t *builder,
const axis2_env_t *env,
axiom_node_t *attr_node,
axiom_node_t *schema_node);
static xml_schema_element_t*
handle_element(
xml_schema_builder_t *builder,
const axis2_env_t *env,
axiom_node_t *ele_node,
axiom_node_t *schema_node,
axis2_bool_t is_global);
/*
static axis2_status_t
populate_element_namespaces(
xml_schema_builder_t *builder,
const axis2_env_t *env,
axiom_node_t *ele_node,
axis2_hash_t* ele_to_ns_map);
*/
static xml_schema_identity_constraint_t*
handle_constraint(
xml_schema_builder_t *builder,
const axis2_env_t *env,
axiom_node_t *attr_node,
axiom_node_t *schema_node,
int type);
static xml_schema_import_t*
handle_import(
xml_schema_builder_t *builder,
const axis2_env_t *env,
axiom_node_t *import_node,
axiom_node_t *schema_node);
static xml_schema_external_t *
handle_include(
xml_schema_builder_t *builder,
const axis2_env_t *env,
axiom_node_t *include_node,
axiom_node_t *schema_node);
static xml_schema_app_info_t*
handle_app_info(
xml_schema_builder_t *builder,
const axis2_env_t *env,
axiom_node_t *content);
static xml_schema_documentation_t*
handle_documentation(
xml_schema_builder_t *builder,
const axis2_env_t *env,
axiom_node_t *content);
static long
get_min_occurs(
const axis2_env_t *env,
axiom_node_t *content);
static long
get_max_occurs(
const axis2_env_t *env,
axiom_node_t *content);
static xml_schema_derivation_method_t*
get_derivation(
const axis2_env_t *env,
axiom_node_t *ele_node,
axis2_char_t *attr_name);
static axis2_char_t *
get_enum_string(
xml_schema_builder_t *builder,
const axis2_env_t *env,
axiom_element_t *om_ele,
axis2_char_t *attr_name);
xml_schema_t* AXIS2_CALL
xml_schema_builder_resolve_xml_schema(
xml_schema_builder_t *builder,
const axis2_env_t *env,
axis2_char_t *target_namespace,
axis2_char_t *schema_location,
axis2_char_t *base_uri);
static axis2_bool_t
value_exist_in_hash(
const axis2_env_t *env,
axis2_hash_t *ht,
axis2_char_t *value);
static xml_schema_form_t*
get_from_default(
const axis2_env_t *env,
axiom_node_t *ele_node,
axis2_char_t *attr_name);
static xml_schema_t *
resolve_xml_schema(
xml_schema_builder_t *builder,
const axis2_env_t *env,
axis2_char_t *target_namespace,
axis2_char_t *schema_location);
static xml_schema_t *
resolve_xml_schema_with_uri(
xml_schema_builder_t *builder,
const axis2_env_t *env,
axis2_char_t *target_namespace,
axis2_char_t *schema_location,
axis2_char_t *base_uri);
static xml_schema_annotation_t*
handle_annotation_with_element(
xml_schema_builder_t *builder,
const axis2_env_t *env,
axiom_node_t *ann_node);
AXIS2_EXTERN xml_schema_builder_t * AXIS2_CALL
xml_schema_builder_create(
const axis2_env_t *env,
xml_schema_collection_t *sch_collection)
{
xml_schema_builder_impl_t *builder_impl = NULL;
AXIS2_ENV_CHECK(env, NULL);
AXIS2_PARAM_CHECK(env->error, sch_collection, NULL);
builder_impl = (xml_schema_builder_impl_t *)
AXIS2_MALLOC(env->allocator, sizeof(xml_schema_builder_impl_t));
if(!builder_impl)
{
AXIS2_ERROR_SET(env->error, AXIS2_ERROR_NO_MEMORY, AXIS2_FAILURE);
return NULL;
}
builder_impl->builder.ops = NULL;
builder_impl->collection = NULL;
builder_impl->root_node = NULL;
builder_impl->schema = NULL;
builder_impl->gen_no = 0;
builder_impl->document_list = NULL;
builder_impl->schema = xml_schema_create(env, NULL, sch_collection);
if(!builder_impl->schema)
{
xml_schema_builder_free(&(builder_impl->builder), env);
return NULL;
}
builder_impl->collection = sch_collection;
builder_impl->builder.ops = AXIS2_MALLOC(env->allocator,
sizeof(xml_schema_builder_t));
if(!builder_impl->builder.ops)
{
AXIS2_ERROR_SET(env->error, AXIS2_ERROR_NO_MEMORY, AXIS2_FAILURE);
xml_schema_builder_free(&(builder_impl->builder), env);
return NULL;
}
builder_impl->document_list = axis2_array_list_create(env, 2);
builder_impl->builder.ops->free =
xml_schema_builder_free;
builder_impl->builder.ops->build =
xml_schema_builder_build;
builder_impl->builder.ops->build_with_root_node =
xml_schema_builder_build_with_root_node;
return &(builder_impl->builder);
}
xml_schema_t* AXIS2_CALL
xml_schema_builder_build(
xml_schema_builder_t *builder,
const axis2_env_t *env,
axiom_document_t *om_doc,
axis2_char_t *uri)
{
xml_schema_builder_impl_t *builder_impl = NULL;
axiom_node_t *root_node = NULL;
AXIS2_PARAM_CHECK(env->error, om_doc, NULL);
builder_impl = AXIS2_INTF_TO_IMPL(builder);
AXIS2_ARRAY_LIST_ADD(builder_impl->document_list, env, om_doc);
root_node = AXIOM_DOCUMENT_GET_ROOT_ELEMENT(om_doc, env);
if(!root_node)
return NULL;
return handle_xml_schema_element(builder, env, root_node, uri);
}
xml_schema_t* AXIS2_CALL
xml_schema_builder_build_with_root_node(
xml_schema_builder_t *builder,
const axis2_env_t *env,
axiom_node_t *root,
axis2_char_t *uri)
{
return handle_xml_schema_element(builder, env, root, uri);
}
axis2_status_t AXIS2_CALL
xml_schema_builder_free(
xml_schema_builder_t *builder,
const axis2_env_t *env)
{
xml_schema_builder_impl_t *builder_impl = NULL;
AXIS2_ENV_CHECK(env, AXIS2_FAILURE);
builder_impl = AXIS2_INTF_TO_IMPL(builder);
if(NULL != builder_impl->collection)
{
XML_SCHEMA_COLLECTION_FREE(builder_impl->collection, env);
}
if(NULL != builder_impl->builder.ops)
{
AXIS2_FREE(env->allocator, builder_impl->builder.ops);
builder_impl->builder.ops = NULL;
}
AXIS2_FREE(env->allocator, builder_impl);
builder_impl = NULL;
return AXIS2_SUCCESS;
}
static xml_schema_t*
handle_xml_schema_element(
xml_schema_builder_t *builder,
const axis2_env_t *env,
axiom_node_t *ele_node,
axis2_char_t *uri)
{
xml_schema_builder_impl_t *builder_impl = NULL;
axis2_hash_t *ht_sch2schemas = NULL;
axis2_array_list_t *schemas = NULL;
axis2_hash_t *namespaces = NULL;
axis2_char_t *target_ns = NULL;
/** element form default */
void *ele_form = NULL;
void *attr_form = NULL;
void *drv = NULL;
/** ele and node */
axiom_element_t *child_ele = NULL;
axiom_node_t *child_ele_node = NULL;
AXIS2_ENV_CHECK(env, NULL);
AXIS2_PARAM_CHECK(env->error, ele_node, NULL);
builder_impl = AXIS2_INTF_TO_IMPL(builder);
set_namespace_attributes( builder, env, builder_impl->schema, ele_node);
if(NULL != uri)
{
ht_sch2schemas = XML_SCHEMA_COLLECTION_GET_SYSTEMID2_SCHEMAS(
builder_impl->collection, env);
if(NULL != ht_sch2schemas)
{
axis2_hash_set(ht_sch2schemas, uri,
AXIS2_HASH_KEY_STRING, builder_impl->schema);
}
}
schemas =
XML_SCHEMA_COLLECTION_GET_SCHEMAS(builder_impl->collection, env);
if(NULL != schemas)
{
AXIS2_ARRAY_LIST_ADD(schemas, env, builder_impl->schema);
}
namespaces =
XML_SCHEMA_COLLECTION_GET_NAMESPACES(builder_impl->collection, env);
target_ns = XML_SCHEMA_GET_TARGET_NAMESPACE(builder_impl->schema, env);
if(NULL != namespaces && NULL != target_ns)
{
void *val = NULL;
val = axis2_hash_get(namespaces, target_ns, AXIS2_HASH_KEY_STRING);
if(!val)
{
/** value does not exist */
axis2_hash_set(namespaces, target_ns,
AXIS2_HASH_KEY_STRING, builder_impl->schema);
}
}
ele_form = get_from_default(env, ele_node, "elementFormDefault");
XML_SCHEMA_SET_ELEMENT_FORM_DEFAULT(builder_impl->schema, env, ele_form);
ele_form = NULL;
attr_form = get_from_default(env, ele_node, "attributeFormDefault");
XML_SCHEMA_SET_ATTR_FORM_DEFAULT(builder_impl->schema, env, attr_form);
attr_form = NULL;
drv = get_derivation(env, ele_node, "blockDefault");
XML_SCHEMA_SET_BLOCK_DEFAULT(builder_impl->schema, env, drv);
drv = NULL;
drv = get_derivation(env, ele_node, "finalDefault");
XML_SCHEMA_SET_FINAL_DEFAULT(builder_impl->schema, env, drv);
if(NULL != uri)
XML_SCHEMA_OBJ_SET_SOURCE_URI(builder_impl->schema, env, uri);
/***********
* for ( each childElement)
* if( simpleTypeElement)
* handleSimpleType
* else if( complexType)
* handleComplexType
* else if( element)
* handleElement
* else if( include)
* handleInclude
* else if( import)
* handleImport
* else if (group)
* handleGroup
* else if (attributeGroup)
* handleattributeGroup
* else if( attribute)
* handleattribute
* else if (redefine)
* handleRedefine
* else if(notation)
* handleNotation
*/
child_ele = axiom_util_get_first_child_element_with_uri(ele_node, env,
XML_SCHEMA_NS, &child_ele_node);
while( NULL != child_ele)
{
axis2_char_t *localname = NULL;
xml_schema_obj_collection_t *items = NULL;
xml_schema_obj_collection_t *includes = NULL;
localname = AXIOM_ELEMENT_GET_LOCALNAME(child_ele, env);
items = XML_SCHEMA_GET_ITEMS(builder_impl->schema, env);
includes = XML_SCHEMA_GET_INCLUDES(builder_impl->schema, env);
if(!localname)
continue;
if(AXIS2_STRCMP(localname,"simpleType") == 0)
{
void *type = NULL;
void *t = NULL;
axis2_qname_t *qn = NULL;
type = handle_simple_type(builder, env, child_ele_node, ele_node);
XML_SCHEMA_ADD_TYPE(builder_impl->schema, env, type);
if(NULL != items)
{
XML_SCHEMA_OBJ_COLLECTION_ADD(items, env, type);
}
qn = XML_SCHEMA_TYPE_GET_QNAME(type, env);
t = XML_SCHEMA_GET_TYPE_BY_QNAME(builder_impl->schema, env, qn);
if(NULL != qn)
{
axis2_char_t *u = NULL;
axis2_char_t *p = NULL;
u = AXIS2_QNAME_GET_URI(qn, env);
p = AXIS2_QNAME_GET_LOCALPART(qn, env);
XML_SCHEMA_COLLECTION_RESOLVE_TYPE(builder_impl->collection,
env, qn, type);
}
}
else if(AXIS2_STRCMP(localname, "complexType") == 0)
{
void *type = NULL;
axis2_qname_t *qn = NULL;
type = handle_complex_type(builder, env, child_ele_node, ele_node);
XML_SCHEMA_ADD_TYPE(builder_impl->schema, env, type);
if(NULL != items)
{
XML_SCHEMA_OBJ_COLLECTION_ADD(items, env, type);
}
qn = XML_SCHEMA_TYPE_GET_QNAME(type, env);
if(NULL != qn)
{
XML_SCHEMA_COLLECTION_RESOLVE_TYPE(
builder_impl->collection, env, qn, type);
}
}
else if(AXIS2_STRCMP(localname, "element") == 0)
{
void *sch_ele = NULL;
sch_ele = handle_element(builder, env, child_ele_node, ele_node, AXIS2_TRUE);
if(NULL != sch_ele)
{
axis2_qname_t *qualified_qname = NULL;
axis2_char_t *qname_uri = NULL; /* for debuging */
axis2_qname_t *ref_qname = NULL;
xml_schema_obj_table_t *elements = NULL;
elements = XML_SCHEMA_GET_ELEMENTS(builder_impl->schema, env);
qualified_qname = XML_SCHEMA_ELEMENT_GET_QNAME(sch_ele, env);
ref_qname = XML_SCHEMA_ELEMENT_GET_REF_NAME(sch_ele, env);
if(NULL != qualified_qname && NULL != elements)
{
qname_uri = AXIS2_QNAME_GET_URI(qualified_qname, env);
XML_SCHEMA_OBJ_TABLE_ADD(elements, env,
qualified_qname, sch_ele);
}
else if(NULL != ref_qname && NULL != elements)
{
XML_SCHEMA_OBJ_TABLE_ADD(elements, env, ref_qname, sch_ele);
}
if(NULL != items)
XML_SCHEMA_OBJ_COLLECTION_ADD(items, env, sch_ele);
}
}
else if(AXIS2_STRCMP(localname, "include") == 0)
{
void *inc_ele = NULL;
inc_ele = handle_include(builder, env, child_ele_node, ele_node);
if(NULL != includes)
XML_SCHEMA_OBJ_COLLECTION_ADD(includes, env, inc_ele);
if(NULL != items)
XML_SCHEMA_OBJ_COLLECTION_ADD(items, env, inc_ele);
}
else if(AXIS2_STRCMP(localname, "import") == 0)
{
void *import_ele = NULL;
import_ele = handle_import(builder, env, child_ele_node, ele_node);
if(NULL != includes)
XML_SCHEMA_OBJ_COLLECTION_ADD(includes, env, import_ele);
if(NULL != items)
XML_SCHEMA_OBJ_COLLECTION_ADD(items, env, import_ele);
}
else if(AXIS2_STRCMP(localname, "group"))
{
void *group = NULL;
xml_schema_obj_table_t *groups = NULL;
axis2_char_t *name = NULL;
group = handle_group(builder, env, child_ele_node, ele_node);
groups = XML_SCHEMA_GET_GROUPS(builder_impl->schema, env);
if(NULL != group)
{
name = XML_SCHEMA_GROUP_GET_NAME(group, env);
XML_SCHEMA_OBJ_TABLE_PUT(groups, env, name, group);
}
if(NULL != items)
XML_SCHEMA_OBJ_COLLECTION_ADD(items, env, group);
}
else if(AXIS2_STRCMP(localname,"attributeGroup") == 0)
{
void *attr_grp = NULL;
axis2_char_t *name = NULL;
xml_schema_obj_table_t *attr_grps = NULL;
attr_grp = handle_attribute_group(builder, env, child_ele_node,
ele_node);
attr_grps = XML_SCHEMA_GET_ATTR_GROUPS(builder_impl->schema, env);
if(NULL != attr_grp)
{
name = XML_SCHEMA_ATTRIBUTE_GROUP_GET_NAME(attr_grp, env);
XML_SCHEMA_OBJ_TABLE_PUT(attr_grps,
env, name, attr_grp);
XML_SCHEMA_OBJ_COLLECTION_ADD(items, env, attr_grp);
}
}
else if(AXIS2_STRCMP(localname, "attribute") == 0)
{
void *attr = NULL;
xml_schema_obj_table_t *attr_tbl = NULL;
attr = handle_attribute(builder, env, child_ele_node, ele_node);
attr_tbl = XML_SCHEMA_GET_ATTRS(builder_impl->schema, env);
if(NULL != attr)
{
axis2_qname_t *qn= NULL;
qn = XML_SCHEMA_ATTRIBUTE_GET_QNAME(attr, env);
XML_SCHEMA_OBJ_TABLE_ADD(attr_tbl, env, qn, attr);
XML_SCHEMA_OBJ_COLLECTION_ADD(items, env, attr);
}
}
else if(AXIS2_STRCMP(localname, "redefine") == 0)
{
void *redefine = NULL;
redefine = handle_redefine(builder, env, child_ele_node, ele_node);
XML_SCHEMA_OBJ_COLLECTION_ADD(includes, env, redefine);
}
else if(AXIS2_STRCMP(localname,"notation") == 0)
{
/**TODO implement notation */
}
else if(AXIS2_STRCMP(localname, "annotation") == 0)
{
void *annotation = NULL;
annotation = handle_annotation(builder, env, child_ele_node, ele_node);
XML_SCHEMA_ANNOTATED_SET_ANNOTATION(
builder_impl->schema, env, annotation);
}
child_ele = NULL;
child_ele = axiom_util_get_next_sibling_element_with_uri(child_ele_node, env,
XML_SCHEMA_NS, &child_ele_node);
}
return builder_impl->schema;
}
static xml_schema_annotation_t*
handle_annotation(
xml_schema_builder_t *builder,
const axis2_env_t *env,
axiom_node_t *ann_node,
axiom_node_t *sch_node)
{
void *annotation = NULL;
axiom_element_t *child_ele = NULL;
axiom_node_t *child_node = NULL;
axiom_element_t *ann_ele = NULL;
xml_schema_obj_collection_t *collection = NULL;
AXIS2_PARAM_CHECK(env->error, builder, NULL);
AXIS2_PARAM_CHECK(env->error, ann_node, NULL);
AXIS2_PARAM_CHECK(env->error, sch_node, NULL);
annotation = xml_schema_annotation_create(env);
collection = XML_SCHEMA_ANNOTATION_GET_ITEMS(annotation, env);
ann_ele = AXIOM_NODE_GET_DATA_ELEMENT(ann_node, env);
child_ele =
axiom_util_get_first_child_element(ann_ele, env, ann_node, &child_node);
while(NULL != child_ele)
{
axis2_char_t *localname = NULL;
localname = AXIOM_ELEMENT_GET_LOCALNAME(child_ele, env);
if(NULL != localname && AXIS2_STRCMP(localname, "documentation") == 0)
{
void *documentation = NULL;
documentation = xml_schema_documentation_create(env);
if(NULL != documentation)
{
axiom_child_element_iterator_t *ele_iter = NULL;
ele_iter = axiom_util_get_child_elements(child_ele, env, child_node);
if(NULL != ele_iter)
{
XML_SCHEMA_DOCUMENTATION_SET_MARKUP(documentation, env, ele_iter);
}
}
XML_SCHEMA_OBJ_COLLECTION_ADD(collection, env, documentation);
}
child_ele = axiom_util_get_first_child_element(child_ele , env, child_node, &child_node);
}
return annotation;
}
static xml_schema_redefine_t*
handle_redefine(
xml_schema_builder_t *builder,
const axis2_env_t *env,
axiom_node_t *redefine_node,
axiom_node_t *sch_node)
{
void *redefine = NULL;
void *schema = NULL;
axiom_element_t *redefine_ele = NULL;
axiom_element_t *child_ele = NULL;
axiom_node_t *child_ele_node = NULL;
axis2_char_t *schema_location = NULL;
xml_schema_obj_table_t *schema_types = NULL;
xml_schema_obj_collection_t *items = NULL;
AXIS2_PARAM_CHECK(env->error, redefine_node, NULL);
AXIS2_PARAM_CHECK(env->error, sch_node, NULL);
redefine_ele = (axiom_element_t*)AXIOM_NODE_GET_DATA_ELEMENT(redefine_node, env);
if(!redefine_ele)
return NULL;
redefine = xml_schema_redefine_create(env);
schema_location = AXIOM_ELEMENT_GET_ATTRIBUTE_VALUE_BY_NAME(
redefine_ele, env, "schemaLocation");
XML_SCHEMA_EXTERNAL_SET_SCHEMA_LOCATION(redefine, env, schema_location);
schema = resolve_xml_schema(builder, env, NULL, schema_location);
XML_SCHEMA_EXTERNAL_SET_SCHEMA(redefine, env, schema);
schema_types = XML_SCHEMA_REDEFINE_GET_SCHEMA_TYPES(redefine, env);
items = XML_SCHEMA_REDEFINE_GET_ITEMS(redefine, env);
child_ele = axiom_util_get_first_child_element_with_uri(
redefine_node, env, XML_SCHEMA_NS, &child_ele_node);
while(NULL != child_ele)
{
axis2_char_t *localname = NULL;
localname = AXIOM_ELEMENT_GET_LOCALNAME(child_ele, env);
if(AXIS2_STRCMP(localname, "simpleType") == 0)
{
void *type = NULL;
axis2_qname_t *qn = NULL;
type = handle_simple_type(builder, env, child_ele_node, sch_node);
qn = XML_SCHEMA_TYPE_GET_QNAME(type, env);
XML_SCHEMA_OBJ_TABLE_ADD(schema_types, env, qn, type);
XML_SCHEMA_OBJ_COLLECTION_ADD(items, env, type);
}
else if(AXIS2_STRCMP(localname,"complexType") == 0)
{
void *type = NULL;
axis2_qname_t *qn = NULL;
type = handle_complex_type(builder, env, child_ele_node, sch_node);
qn = XML_SCHEMA_TYPE_GET_QNAME(type, env);
XML_SCHEMA_OBJ_TABLE_ADD(schema_types, env, qn, type);
XML_SCHEMA_OBJ_COLLECTION_ADD(items, env, type);
}
else if(AXIS2_STRCMP(localname,"group") == 0)
{
void *grp = NULL;
axis2_char_t *name = NULL;
xml_schema_obj_table_t *groups = NULL;
groups = XML_SCHEMA_REDEFINE_GET_GROUP(redefine, env);
grp = handle_group(builder, env, child_ele_node, sch_node);
name = XML_SCHEMA_GROUP_GET_NAME(grp, env);
XML_SCHEMA_OBJ_TABLE_PUT(groups, env, name, grp);
XML_SCHEMA_OBJ_COLLECTION_ADD(items, env, grp);
}
else if(AXIS2_STRCMP(localname, "attributeGroup") == 0)
{
void *attr_grp = NULL;
xml_schema_obj_table_t *groups = NULL;
axis2_char_t *name = NULL;
attr_grp = handle_attribute_group(builder, env, child_ele_node, sch_node);
groups = XML_SCHEMA_REDEFINE_GET_ATTRIBUTE_GROUP(redefine, env);
name = XML_SCHEMA_ATTRIBUTE_GROUP_GET_NAME(attr_grp, env);
XML_SCHEMA_OBJ_TABLE_PUT(groups, env, name, attr_grp);
}
else if(AXIS2_STRCMP(localname, "annotation") == 0)
{
void *annotation = NULL;
annotation = handle_annotation_with_element(builder, env, child_ele_node);
XML_SCHEMA_ANNOTATED_SET_ANNOTATION(redefine, env, annotation);
}
}
return redefine;
}
static axis2_status_t
set_namespace_attributes(
xml_schema_builder_t* builder,
const axis2_env_t *env,
xml_schema_t *schema,
axiom_node_t *sch_node)
{
xml_schema_builder_impl_t *builder_impl = NULL;
axiom_node_t* parent_node = NULL;
axis2_hash_t *ht_ns = NULL;
axis2_hash_index_t *hi_ns = NULL;
axiom_element_t *om_ele = NULL;
axis2_hash_t *ht_sch_ns = NULL;
axis2_qname_t *target_ns_qn = NULL;
axis2_char_t *contain = NULL;
AXIS2_PARAM_CHECK(env->error, schema, AXIS2_FAILURE);
AXIS2_PARAM_CHECK(env->error, sch_node, AXIS2_FAILURE);
if(AXIOM_NODE_GET_NODE_TYPE(sch_node, env) != AXIOM_ELEMENT)
return AXIS2_FAILURE;
builder_impl = AXIS2_INTF_TO_IMPL(builder);
parent_node = AXIOM_NODE_GET_PARENT(sch_node, env);
if(NULL != parent_node &&
AXIOM_NODE_GET_NODE_TYPE(sch_node, env) == AXIOM_ELEMENT)
{
set_namespace_attributes(builder, env, schema, parent_node);
}
om_ele = AXIOM_NODE_GET_DATA_ELEMENT(sch_node, env);
if(!om_ele)
return AXIS2_FAILURE;
ht_ns = AXIOM_ELEMENT_GET_NAMESPACES(om_ele, env);
if(!ht_ns)
{ /* no namespaces available */
return AXIS2_SUCCESS;
}
ht_sch_ns = XML_SCHEMA_GET_PREFIX_TO_NAMESPACE_MAP(schema, env);
if(!ht_sch_ns)
return AXIS2_FAILURE;
for(hi_ns = axis2_hash_first(ht_ns, env); hi_ns;
hi_ns = axis2_hash_next(env, hi_ns))
{
void *val = NULL;
axis2_hash_this(hi_ns, NULL, NULL, &val);
if(NULL != val)
{
axis2_char_t *uri = NULL;
axis2_char_t *prefix = NULL;
uri = AXIOM_NAMESPACE_GET_URI((axiom_namespace_t*)val, env);
prefix =
AXIOM_NAMESPACE_GET_PREFIX((axiom_namespace_t*)val, env);
if(NULL != prefix && AXIS2_STRCMP(prefix,"") != 0)
{
axis2_hash_set(ht_sch_ns, prefix,
AXIS2_HASH_KEY_STRING, uri);
if(NULL != uri && AXIS2_STRCMP(uri, XML_SCHEMA_NS) == 0)
{
XML_SCHEMA_SET_SCHEMA_NS_PREFIX(schema, env, prefix);
}
}
else
{
/** default namespace [xmlns=""] */
axis2_hash_set(ht_sch_ns, "", AXIS2_HASH_KEY_STRING, uri);
}
}
}
target_ns_qn = axis2_qname_create(env, "targetNamespace", NULL, NULL);
contain = AXIOM_ELEMENT_GET_ATTRIBUTE_VALUE(om_ele, env, target_ns_qn);
if(NULL != target_ns_qn)
AXIS2_QNAME_FREE(target_ns_qn, env);
if(NULL != contain &&
(value_exist_in_hash(env, ht_sch_ns, contain)) == AXIS2_FALSE)
{
put_namespace(builder, env, "", contain);
if(AXIS2_STRCMP(contain,"") != 0)
{
XML_SCHEMA_SET_SCHEMA_NS_PREFIX(schema, env, contain);
}
}
if(NULL != contain && (AXIS2_STRCMP(contain, "") != 0) &&
(NULL != builder_impl->schema))
{
XML_SCHEMA_SET_TARGET_NAMESPACE(builder_impl->schema, env, contain);
}
return AXIS2_SUCCESS;
}
static axis2_status_t
put_namespace(
xml_schema_builder_t* builder,
const axis2_env_t *env,
axis2_char_t *prefix,
axis2_char_t *ns)
{
xml_schema_builder_impl_t *builder_impl = NULL;
axis2_hash_t *ht_sch_ns = NULL;
builder_impl = AXIS2_INTF_TO_IMPL(builder);
AXIS2_PARAM_CHECK(env->error, prefix, AXIS2_FAILURE);
AXIS2_PARAM_CHECK(env->error, ns , AXIS2_FAILURE);
ht_sch_ns = XML_SCHEMA_GET_PREFIX_TO_NAMESPACE_MAP(builder_impl->schema, env);
if(NULL != axis2_hash_get(ht_sch_ns, prefix, AXIS2_HASH_KEY_STRING))
{
/** key already exist */
axis2_char_t *gen_prefix = AXIS2_MALLOC(env->allocator, sizeof(10));
sprintf(gen_prefix, "gen%d", builder_impl->gen_no++);
axis2_hash_set(ht_sch_ns, gen_prefix, AXIS2_HASH_KEY_STRING, ns);
}
axis2_hash_set(ht_sch_ns, prefix, AXIS2_HASH_KEY_STRING, ns);
return AXIS2_SUCCESS;
}
static xml_schema_simple_type_t*
handle_simple_type(
xml_schema_builder_t *builder,
const axis2_env_t *env,
axiom_node_t *simple_node,
axiom_node_t *sch_node)
{
void *sim_type = NULL;
xml_schema_builder_impl_t *builder_impl = NULL;
axis2_char_t *attr_value = NULL;
axiom_element_t *sim_ele = NULL;
axiom_element_t *ele1 = NULL;
axiom_node_t *node1 = NULL;
axiom_element_t *union_ele = NULL;
axiom_node_t *union_node = NULL;
axiom_element_t *list_ele = NULL;
axiom_node_t *list_node = NULL;
axiom_element_t *restriction_ele = NULL;
axiom_node_t *restriction_node = NULL;
AXIS2_PARAM_CHECK(env->error, simple_node, NULL);
builder_impl = AXIS2_INTF_TO_IMPL(builder);
sim_type = xml_schema_simple_type_create(env, builder_impl->schema);
sim_ele = (axiom_element_t*)AXIOM_NODE_GET_DATA_ELEMENT(simple_node, env);
attr_value = AXIOM_ELEMENT_GET_ATTRIBUTE_VALUE_BY_NAME(sim_ele, env, "name");
if(NULL != attr_value)
{
XML_SCHEMA_TYPE_SET_NAME(sim_type, env, attr_value);
attr_value = NULL;
}
attr_value = AXIOM_ELEMENT_GET_ATTRIBUTE_VALUE_BY_NAME(sim_ele, env, "final");
if(NULL != attr_value)
{
void *drv_method = NULL;
if(AXIS2_STRCASECMP(attr_value, "all") == 0 ||
AXIS2_STRCASECMP(attr_value, "#all") == 0)
{
drv_method = xml_schema_derivation_method_create(env, XML_SCHEMA_CONST_ALL);
}
else
{
drv_method = xml_schema_derivation_method_create(env, attr_value);
}
attr_value = NULL;
}
ele1 = axiom_util_get_first_child_element_with_uri_localname(sim_ele, env,
simple_node, "annotation", XML_SCHEMA_NS, &node1);
if(NULL != ele1)
{
void *annotation = NULL;
annotation = handle_annotation_with_element(builder, env, node1);
XML_SCHEMA_ANNOTATED_SET_ANNOTATION(sim_type, env, annotation);
}
restriction_ele = axiom_util_get_first_child_element_with_uri_localname(sim_ele,
env, simple_node, "restriction", XML_SCHEMA_NS, &restriction_node);
if(NULL != restriction_ele)
{
void *restriction = NULL;
axiom_element_t *rest_ann_ele = NULL;
axiom_node_t *rest_ann_node = NULL;
axiom_element_t *inline_sim_ele = NULL;
axiom_node_t *inline_sim_node = NULL;
axiom_element_t *ele1 = NULL;
axiom_node_t *node1 = NULL;
axis2_char_t *attribute_value = NULL;
restriction = xml_schema_simple_type_restriction_create(env);
rest_ann_ele = axiom_util_get_first_child_element_with_uri_localname(restriction_ele,
env, restriction_node, "annotation", XML_SCHEMA_NS, &rest_ann_node);
if(NULL != rest_ann_ele)
{
void *rest_annotation = NULL;
rest_annotation = handle_annotation_with_element(builder, env, rest_ann_node);
XML_SCHEMA_ANNOTATED_SET_ANNOTATION(rest_annotation, env, rest_annotation);
}
inline_sim_ele = axiom_util_get_first_child_element_with_uri_localname(restriction_ele,
env, restriction_node, "simpleType", XML_SCHEMA_NS, &inline_sim_node);
attribute_value = AXIOM_ELEMENT_GET_ATTRIBUTE_VALUE_BY_NAME(restriction_ele, env,
"base");
if(NULL != attribute_value)
{
axis2_array_list_t *temp_list = NULL;
axis2_hash_t *ht_ns = NULL;
axis2_char_t *namesp = NULL;
axis2_array_list_t *last_list = NULL;
axis2_char_t *name = NULL;
axis2_qname_t *qn = NULL;
temp_list = axis2_tokenize(env, attribute_value, ':');
if(NULL != temp_list && AXIS2_ARRAY_LIST_SIZE(temp_list, env) >= 1)
{
namesp = (axis2_char_t *)AXIS2_ARRAY_LIST_GET(temp_list, env, 0);
}
ht_ns = XML_SCHEMA_GET_PREFIX_TO_NAMESPACE_MAP(builder_impl->schema, env);
namesp = axis2_hash_get(ht_ns, namesp, AXIS2_HASH_KEY_STRING);
last_list = axis2_last_token(env, attribute_value, ':');
name = AXIS2_ARRAY_LIST_GET(last_list, env, ':');
qn = axis2_qname_create(env, name, namesp, NULL);
XML_SCHEMA_SIMPLE_TYPE_RESTRICTION_SET_BASE_TYPE_NAME(restriction, env, qn);
}
else if(NULL != inline_sim_ele)
{
void *base_type = NULL;
base_type = handle_simple_type(builder , env,inline_sim_node, builder_impl->schema);
XML_SCHEMA_SIMPLE_TYPE_RESTRICTION_SET_BASE_TYPE(restriction, env, base_type);
}
ele1 = axiom_util_get_first_child_element_with_uri(restriction_node, env,
XML_SCHEMA_NS, &node1);
while(NULL != ele1)
{
axis2_char_t *localname = NULL;
void *annotation = NULL;
xml_schema_obj_collection_t *facets = NULL;
localname = AXIOM_ELEMENT_GET_LOCALNAME(ele1, env);
if(NULL != localname &&
AXIS2_STRCMP(localname, "annotation") != 0 &&
AXIS2_STRCMP(localname, "simpleType") != 0)
{
void *facet = NULL;
facet = xml_schema_facet_construct(env, node1);
annotation = axiom_util_get_first_child_element_with_uri_localname(ele1,
env, node1, "annotation", XML_SCHEMA_NS, &node1);
if(NULL != annotation)
{
void *facet_annotation = NULL;
facet_annotation = handle_annotation_with_element(builder, env, node1);
XML_SCHEMA_ANNOTATED_SET_ANNOTATION(facet, env, facet_annotation);
}
facets = XML_SCHEMA_SIMPLE_TYPE_RESTRICTION_GET_FACETS(restriction, env);
XML_SCHEMA_OBJ_COLLECTION_ADD(facets, env, facet);
}
ele1 = axiom_util_get_next_sibling_element_with_uri(node1, env,
XML_SCHEMA_NS, &node1);
}
XML_SCHEMA_SIMPLE_TYPE_SET_CONTENT(sim_type, env, restriction);
}
else if(NULL != (list_ele = axiom_util_get_first_child_element_with_uri_localname(sim_ele,
env, simple_node, "list", XML_SCHEMA_NS, &list_node)))
{
void *list = NULL;
axiom_element_t *inline_list_ele = NULL;
axiom_element_t *list_ann_ele = NULL;
axiom_node_t *list_ann_node = NULL;
list = xml_schema_simple_type_list_create(env);
attr_value = NULL;
attr_value = AXIOM_ELEMENT_GET_ATTRIBUTE_VALUE_BY_NAME(list_ele, env, "itemType");
if(NULL != attr_value)
{
axis2_array_list_t *namespaces_form_ele = NULL;
axis2_array_list_t *last_list = NULL;
axis2_char_t *name = NULL;
axis2_qname_t *item_type_qn = NULL;
axis2_char_t *ns = NULL;
axis2_char_t *key = NULL;
axis2_hash_t *ht_ns = NULL;
namespaces_form_ele = axis2_tokenize(env, attr_value, ':');
ht_ns = XML_SCHEMA_GET_PREFIX_TO_NAMESPACE_MAP(builder_impl->schema, env);
if(AXIS2_ARRAY_LIST_SIZE(namespaces_form_ele, env) > 1)
{
axis2_char_t *result = NULL;
key = AXIS2_ARRAY_LIST_GET(namespaces_form_ele, env, 0);
result = axis2_hash_get(ht_ns, key, AXIS2_HASH_KEY_STRING);
if(NULL == result)
{
/**TODO set error */
return NULL;
}
ns = (axis2_char_t*)result;
}
else
{
ns = XML_SCHEMA_GET_TARGET_NAMESPACE(builder_impl->schema, env);
}
last_list = axis2_last_token(env, attr_value, ':');
name = AXIS2_ARRAY_LIST_GET(last_list, env, 1);
item_type_qn = axis2_qname_create(env, name, ns, NULL);
XML_SCHEMA_SIMPLE_TYPE_LIST_SET_ITEM_TYPE_NAME(list, env, item_type_qn);
}
else if(NULL != (inline_list_ele =
axiom_util_get_first_child_element_with_uri_localname(list_ele, env,
list_node, "simpleType" ,XML_SCHEMA_NS, &list_node)))
{
void *base_type = NULL;
base_type = handle_simple_type(builder, env, list_node, sch_node);
XML_SCHEMA_SIMPLE_TYPE_LIST_SET_ITEM_TYPE(list, env, base_type);
}
list_ann_ele = axiom_util_get_first_child_element_with_uri_localname(
list_ele, env, list_node, "annotation", XML_SCHEMA_NS, &list_node);
if(NULL != list_ann_ele)
{
void *list_ann = NULL;
list_ann = handle_annotation_with_element(builder, env, list_ann_node);
XML_SCHEMA_ANNOTATED_SET_ANNOTATION(list, env, list_ann);
}
XML_SCHEMA_SIMPLE_TYPE_SET_CONTENT(sim_type, env, list);
}
else if(NULL != (union_ele =
axiom_util_get_first_child_element_with_uri_localname(union_ele, env, union_node,
"union", XML_SCHEMA_NS, &union_node)))
{
void *sch_union = NULL;
axis2_char_t *attr_value = NULL;
axiom_element_t *inline_uni_ele = NULL;
axiom_node_t *inline_uni_node = NULL;
axiom_element_t *union_ann_ele = NULL;
axiom_node_t *union_ann_node = NULL;
sch_union = xml_schema_unique_create(env);
attr_value = AXIOM_ELEMENT_GET_ATTRIBUTE_VALUE_BY_NAME(union_ele,
env,"memberTypes");
if(NULL != attr_value)
{
axis2_array_list_t *tokens = NULL;
axis2_array_list_t *v = NULL;
axis2_hash_t *ht_namespaces = NULL;
int i = 0;
XML_SCHEMA_SIMPLE_TYPE_UNION_SET_MEMBER_TYPES_SOURCE(sch_union,
env, attr_value);
ht_namespaces = XML_SCHEMA_GET_PREFIX_TO_NAMESPACE_MAP(
builder_impl->schema, env);
tokens = axis2_tokenize(env, attr_value, ' ');
v = axis2_array_list_create(env, 10);
for(i = 0; i < AXIS2_ARRAY_LIST_SIZE(v, env); i++)
{
axis2_char_t *localname = NULL;
axis2_char_t *prefix = NULL;
axis2_char_t *uri = NULL;
axis2_char_t *member = NULL;
axis2_char_t *mem_dup = NULL;
axis2_char_t *index = NULL;
axis2_qname_t *qn = NULL;
member = AXIS2_ARRAY_LIST_GET(v, env, i);
mem_dup = AXIS2_STRDUP(member, env);
index = strchr(mem_dup, ':');
if(NULL != index)
{
localname = index+1;
mem_dup[index - mem_dup] = '\0';
prefix = mem_dup;
}
else
{
localname = mem_dup;
}
uri = axis2_hash_get(ht_namespaces, prefix, AXIS2_HASH_KEY_STRING);
qn = axis2_qname_create(env, localname, uri, prefix);
/*
AXIS2_FREE(env->allocator, mem_dup);
AXIS2_FFRE(env->allocator, localname);
*/
AXIS2_ARRAY_LIST_ADD(v, env, qn);
}
XML_SCHEMA_SIMPLE_TYPE_UNION_SET_MEMBER_TYPES_QNAMES(sch_union, env, v);
}
inline_uni_ele = axiom_util_get_first_child_element_with_uri_localname(
union_ele, env, union_node, "simpleType", XML_SCHEMA_NS, &inline_uni_node);
while(NULL != inline_uni_ele)
{
xml_schema_obj_collection_t *base_types = NULL;
void *union_sim_type = NULL;
axis2_char_t *mem_types = NULL;
axis2_char_t *sim_type_name = NULL;
union_sim_type = handle_simple_type(builder, env, inline_uni_node, sch_node);
base_types = XML_SCHEMA_SIMPLE_TYPE_UNION_GET_BASE_TYPES(sch_union, env);
XML_SCHEMA_OBJ_COLLECTION_ADD(base_types, env, union_sim_type);
sim_type_name = XML_SCHEMA_TYPE_GET_NAME(union_sim_type, env);
mem_types = AXIS2_MALLOC(env->allocator, sizeof(strlen(sim_type_name)+ 3));
sprintf(mem_types, " %s", sim_type_name);
XML_SCHEMA_SIMPLE_TYPE_UNION_SET_MEMBER_TYPES_SOURCE(union_sim_type,
env, mem_types);
AXIS2_FREE(env->allocator, mem_types);
inline_uni_ele = axiom_util_get_next_sibling_element_with_uri_localname(
union_ele, env, union_node, "simpleType", XML_SCHEMA_NS, &inline_uni_node);
}
union_ann_ele = axiom_util_get_first_child_element_with_uri_localname(union_ele,
env, union_node, "annotation", XML_SCHEMA_NS, &union_ann_node);
if(NULL != union_ann_ele)
{
void *union_annotation = NULL;
union_annotation = handle_annotation_with_element(builder, env, union_ann_node);
XML_SCHEMA_ANNOTATED_SET_ANNOTATION(sch_union, env, union_annotation);
}
XML_SCHEMA_SIMPLE_TYPE_SET_CONTENT(sim_type, env, sch_union);
}
return sim_type;
}
static xml_schema_complex_type_t*
handle_complex_type(
xml_schema_builder_t *builder,
const axis2_env_t *env,
axiom_node_t *complex_node,
axiom_node_t *schema_node)
{
void *cmp_type = NULL;
axiom_element_t *cmp_ele = NULL;
axiom_element_t *ele1 = NULL;
axiom_node_t *node1 = NULL;
axis2_char_t *attr_value = NULL;
xml_schema_builder_impl_t *builder_impl = NULL;
builder_impl = AXIS2_INTF_TO_IMPL(builder);
cmp_type = xml_schema_complex_type_create(env, builder_impl->schema);
cmp_ele = (axiom_element_t*)AXIOM_NODE_GET_DATA_ELEMENT(complex_node, env);
attr_value = AXIOM_ELEMENT_GET_ATTRIBUTE_VALUE_BY_NAME(cmp_ele, env, "name");
if(NULL != attr_value)
{
XML_SCHEMA_TYPE_SET_NAME(cmp_type, env, attr_value);
attr_value = NULL;
}
ele1 = axiom_util_get_first_child_element_with_uri(complex_node , env,
XML_SCHEMA_NS, &node1);
while(NULL != ele1)
{
axis2_char_t *localname = NULL;
localname = AXIOM_ELEMENT_GET_LOCALNAME(ele1, env);
if(AXIS2_STRCMP(localname, "sequence") == 0)
{
void *sequence = NULL;
sequence = handle_sequence(builder, env,
node1, schema_node);
XML_SCHEMA_COMPLEX_TYPE_SET_PARTICLE(cmp_type, env, sequence);
}
else if(AXIS2_STRCMP(localname, "choice") == 0)
{
void *choice = NULL;
choice = handle_choice(builder, env,
node1, schema_node);
XML_SCHEMA_COMPLEX_TYPE_SET_PARTICLE(cmp_type, env, choice);
}
else if(AXIS2_STRCMP(localname, "all") == 0)
{
void *all = NULL;
all = handle_all(builder, env, node1, schema_node);
XML_SCHEMA_COMPLEX_TYPE_SET_PARTICLE(cmp_type, env, all);
}
else if(AXIS2_STRCMP(localname, "attribute") == 0)
{
void *attribute = NULL;
xml_schema_obj_collection_t *attributes = NULL;
attribute = handle_attribute(builder, env, node1, schema_node);
attributes = XML_SCHEMA_COMPLEX_TYPE_GET_ATTRIBUTES(cmp_type, env);
XML_SCHEMA_OBJ_COLLECTION_ADD(attributes, env, attribute);
}
else if(AXIS2_STRCMP(localname, "attributeGroup") == 0)
{
void *attr_grp = NULL;
xml_schema_obj_collection_t *attributes = NULL;
attr_grp = handle_attribute_group(builder, env, node1, schema_node);
attributes = XML_SCHEMA_COMPLEX_TYPE_GET_ATTRIBUTES(cmp_type, env);
XML_SCHEMA_OBJ_COLLECTION_ADD(attributes, env, attr_grp);
}
else if(AXIS2_STRCMP(localname, "group") == 0)
{
void *grp = NULL;
void *grp_particle = NULL;
grp = handle_group(builder, env, node1, schema_node);
grp_particle = XML_SCHEMA_GROUP_GET_PARTICLE(grp, env);
if(NULL == grp_particle)
{
XML_SCHEMA_COMPLEX_TYPE_SET_PARTICLE(cmp_type, env, grp);
}
else
{
XML_SCHEMA_COMPLEX_TYPE_SET_PARTICLE(cmp_type, env, grp_particle);
}
}
else if(AXIS2_STRCMP(localname, "simpleContent") == 0)
{
void *sim_cnt = NULL;
sim_cnt = handle_simple_content(builder, env,node1, schema_node);
XML_SCHEMA_COMPLEX_TYPE_SET_CONTENT_MODEL(cmp_type, env, sim_cnt);
}
else if(AXIS2_STRCMP(localname, "complexContent") == 0)
{
void *cmp_cnt = NULL;
cmp_cnt = handle_complex_content(builder, env, node1, schema_node);
XML_SCHEMA_COMPLEX_TYPE_SET_CONTENT_MODEL(cmp_type, env, cmp_cnt);
}
else if(AXIS2_STRCMP(localname, "annotation") == 0)
{
void *annotation = NULL;
annotation = handle_annotation_with_element(builder, env, node1);
XML_SCHEMA_ANNOTATED_SET_ANNOTATION(cmp_type, env, annotation);
}
else if(AXIS2_STRCMP(localname, "anyAttribute") == 0)
{
void *any_attr = NULL;
any_attr = handle_any_attribute(builder, env, node1, schema_node);
XML_SCHEMA_COMPLEX_TYPE_SET_ANY_ATTRIBUTE(cmp_type, env, any_attr);
}
ele1 = axiom_util_get_next_sibling_element_with_uri(node1, env,
XML_SCHEMA_NS, &node1);
}
attr_value = NULL;
attr_value = AXIOM_ELEMENT_GET_ATTRIBUTE_VALUE_BY_NAME(cmp_ele, env, "block");
if(NULL != attr_value)
{
void *drv_method = NULL;
if(AXIS2_STRCASECMP(attr_value, "all") == 0 ||
AXIS2_STRCASECMP(attr_value, "#all") == 0)
{
drv_method = xml_schema_derivation_method_create(env,
XML_SCHEMA_CONST_ALL);
XML_SCHEMA_COMPLEX_TYPE_SET_BLOCK(cmp_type, env, drv_method);
}
else
{
drv_method = xml_schema_derivation_method_create(env,
attr_value);
XML_SCHEMA_COMPLEX_TYPE_SET_BLOCK(cmp_type, env, drv_method);
}
attr_value = NULL;
}
attr_value = AXIOM_ELEMENT_GET_ATTRIBUTE_VALUE_BY_NAME(cmp_ele, env, "final");
if(NULL != attr_value)
{
void *drv_method = NULL;
if(AXIS2_STRCASECMP(attr_value, "all") == 0 ||
AXIS2_STRCASECMP(attr_value,"#all"))
{
drv_method = xml_schema_derivation_method_create(env,
XML_SCHEMA_CONST_ALL);
XML_SCHEMA_COMPLEX_TYPE_SET_BLOCK(cmp_type, env, drv_method); }
else
{
drv_method = xml_schema_derivation_method_create(env,
attr_value);
XML_SCHEMA_COMPLEX_TYPE_SET_BLOCK(cmp_type, env, drv_method); }
attr_value = NULL;
}
attr_value = AXIOM_ELEMENT_GET_ATTRIBUTE_VALUE_BY_NAME(cmp_ele, env, "abstract");
if(NULL != attr_value)
{
if(AXIS2_STRCASECMP(attr_value, "true") == 0)
{
XML_SCHEMA_COMPLEX_TYPE_SET_ABSTRACT(cmp_type, env, AXIS2_TRUE);
}
else
{
XML_SCHEMA_COMPLEX_TYPE_SET_ABSTRACT(cmp_type, env, AXIS2_FALSE);
}
attr_value = NULL;
}
attr_value = AXIOM_ELEMENT_GET_ATTRIBUTE_VALUE_BY_NAME(cmp_ele, env, "mixed");
if(NULL != attr_value)
{
if(AXIS2_STRCASECMP(attr_value, "true") == 0)
{
XML_SCHEMA_COMPLEX_TYPE_SET_MIXED(cmp_type, env, AXIS2_TRUE);
}
else
{
XML_SCHEMA_COMPLEX_TYPE_SET_MIXED(cmp_type, env, AXIS2_FALSE);
}
}
return cmp_type;
}
static xml_schema_simple_content_t*
handle_simple_content(
xml_schema_builder_t *builder,
const axis2_env_t *env,
axiom_node_t *simple_node,
axiom_node_t *schema_node)
{
void *sim_cnt = NULL;
axiom_element_t *sim_cnt_ele = NULL;
axiom_element_t *ele1 = NULL;
axiom_node_t *node1 = NULL;
sim_cnt = xml_schema_simple_content_create(env);
sim_cnt_ele = (axiom_element_t*)AXIOM_NODE_GET_DATA_ELEMENT(simple_node, env);
ele1 = axiom_util_get_first_child_element_with_uri(simple_node , env,
XML_SCHEMA_NS, &node1);
while(NULL != ele1)
{
axis2_char_t *localname = NULL;
localname = AXIOM_ELEMENT_GET_LOCALNAME(ele1, env);
if(AXIS2_STRCMP(localname, "restriction") == 0)
{
void *sim_res = NULL;
sim_res = handle_simple_content_restriction(builder, env,
node1, schema_node);
XML_SCHEMA_SIMPLE_CONTENT_SET_CONTENT(sim_cnt, env, sim_res);
}
else if(AXIS2_STRCMP(localname, "extension") == 0)
{
void *sim_ext = NULL;
sim_ext = handle_simple_content_extension(builder, env,
node1, schema_node);
XML_SCHEMA_SIMPLE_CONTENT_SET_CONTENT(sim_cnt, env, sim_ext);
}
else if(AXIS2_STRCMP(localname, "annotation") == 0)
{
void *annotation = NULL;
annotation = handle_annotation_with_element(builder, env, node1);
XML_SCHEMA_ANNOTATED_SET_ANNOTATION(sim_cnt, env, annotation);
}
ele1 = axiom_util_get_next_sibling_element_with_uri(node1, env,
XML_SCHEMA_NS, &node1);
}
return sim_cnt;
}
static xml_schema_complex_content_t*
handle_complex_content(
xml_schema_builder_t *builder,
const axis2_env_t *env,
axiom_node_t *complex_node,
axiom_node_t *schema_node)
{
void *cmp_cnt = NULL;
axiom_element_t *cmp_cnt_ele = NULL;
axiom_element_t *ele1 = NULL;
axiom_node_t *node1 = NULL;
cmp_cnt = xml_schema_complex_content_create(env);
cmp_cnt_ele = (axiom_element_t*)AXIOM_NODE_GET_DATA_ELEMENT(complex_node, env);
ele1 = axiom_util_get_first_child_element_with_uri(complex_node , env,
XML_SCHEMA_NS, &node1);
while(NULL != ele1)
{
axis2_char_t *localname = NULL;
localname = AXIOM_ELEMENT_GET_LOCALNAME(ele1, env);
if(AXIS2_STRCMP(localname, "restriction") == 0)
{
void *cmp_res = NULL;
cmp_res = handle_complex_content_restriction(builder, env,
node1, schema_node);
XML_SCHEMA_COMPLEX_CONTENT_SET_CONTENT(cmp_cnt, env, cmp_res);
}
else if(AXIS2_STRCMP(localname, "extension") == 0)
{
void *cmp_ext = NULL;
cmp_ext = handle_complex_content_extension(builder, env,
node1, schema_node);
XML_SCHEMA_COMPLEX_CONTENT_SET_CONTENT(cmp_cnt, env, cmp_ext);
}
else if(AXIS2_STRCMP(localname, "annotation") == 0)
{
void *annotation = NULL;
annotation = handle_annotation_with_element(builder, env, node1);
XML_SCHEMA_ANNOTATED_SET_ANNOTATION(cmp_cnt, env, annotation);
}
ele1 = axiom_util_get_next_sibling_element_with_uri(node1, env,
XML_SCHEMA_NS, &node1);
}
return cmp_cnt;
}
static xml_schema_simple_content_restriction_t*
handle_simple_content_restriction(
xml_schema_builder_t* builder,
const axis2_env_t *env,
axiom_node_t *res_node,
axiom_node_t *schema_node)
{
void *sim_cnt_res = NULL;
axiom_element_t *res_ele = NULL;
axis2_char_t *attr_value = NULL;
axiom_element_t *ele1 = NULL;
axiom_node_t *node1 = NULL;
xml_schema_builder_impl_t *builder_impl = NULL;
res_ele = (axiom_element_t*)
AXIOM_NODE_GET_DATA_ELEMENT(res_node, env);
sim_cnt_res = xml_schema_simple_content_restriction_create(env);
builder_impl = AXIS2_INTF_TO_IMPL(builder);
attr_value = AXIOM_ELEMENT_GET_ATTRIBUTE_VALUE_BY_NAME(res_ele, env, "base");
if(NULL != attr_value)
{
axis2_char_t *ns_from_ele = "";
axis2_array_list_t *list = NULL;
axis2_hash_t *namespaces = NULL;
axis2_char_t *result = NULL;
axis2_array_list_t* last_list = NULL;
axis2_char_t *name = NULL;
axis2_qname_t *qn = NULL;
if(NULL != strchr(attr_value, ':'))
{
list = axis2_tokenize(env, attr_value, ':');
ns_from_ele = AXIS2_ARRAY_LIST_GET(list, env, 0);
}
namespaces = XML_SCHEMA_GET_PREFIX_TO_NAMESPACE_MAP(builder_impl->schema, env);
result = axis2_hash_get(namespaces, ns_from_ele, AXIS2_HASH_KEY_STRING);
if(NULL == result)
{
/** TODO set error */
return NULL;
}
last_list = axis2_last_token(env, attr_value, ':');
if(NULL != last_list && AXIS2_ARRAY_LIST_SIZE(last_list, env) >= 2)
name = (axis2_char_t *)AXIS2_ARRAY_LIST_GET(last_list, env, 1);
qn = axis2_qname_create(env, name, result, NULL);
XML_SCHEMA_SIMPLE_CONTENT_RESTRICTION_SET_BASE_TYPE_NAME(sim_cnt_res, env, qn);
attr_value = NULL;
}
attr_value = AXIOM_ELEMENT_GET_ATTRIBUTE_VALUE_BY_NAME(res_ele, env, "id");
if(NULL != attr_value)
{
XML_SCHEMA_ANNOTATED_SET_ID(sim_cnt_res, env, attr_value);
}
ele1 = axiom_util_get_first_child_element_with_uri(res_node, env, XML_SCHEMA_NS, &node1);
if(NULL != ele1)
{
axis2_char_t *localname = NULL;
localname = AXIOM_ELEMENT_GET_LOCALNAME(ele1, env);
if(AXIS2_STRCMP(localname, "attribute") == 0)
{
void *attribute = NULL;
xml_schema_obj_collection_t *attributes = NULL;
attribute = handle_attribute(builder, env, node1, schema_node);
attributes = XML_SCHEMA_SIMPLE_CONTENT_RESTRICTION_GET_ATTRIBUTES(sim_cnt_res, env);
XML_SCHEMA_OBJ_COLLECTION_ADD(attributes, env, attribute);
}
else if(AXIS2_STRCMP(localname, "attributeGroup") == 0)
{
void *attr_grp_ref = NULL;
xml_schema_obj_collection_t *attributes = NULL;
attr_grp_ref = handle_attribute_group_ref(builder, env, node1, schema_node);
attributes = XML_SCHEMA_SIMPLE_CONTENT_RESTRICTION_GET_ATTRIBUTES(sim_cnt_res, env);
XML_SCHEMA_OBJ_COLLECTION_ADD(attributes, env, attr_grp_ref);
}
else if(AXIS2_STRCMP(localname, "simpleType") == 0)
{
void *simple_type = NULL;
simple_type = handle_simple_type(builder, env, node1, schema_node);
XML_SCHEMA_SIMPLE_CONTENT_RESTRICTION_SET_BASE_TYPE(sim_cnt_res, env, simple_type);
}
else if(AXIS2_STRCMP(localname, "annotation") == 0)
{
void *annotation = NULL;
annotation = handle_annotation_with_element(builder, env, node1);
XML_SCHEMA_ANNOTATED_SET_ANNOTATION(sim_cnt_res, env, annotation);
}
else
{
void *facet = NULL;
xml_schema_obj_collection_t *facets = NULL;
axiom_element_t *child_ele = NULL;
axiom_node_t *child_node = NULL;
facet = xml_schema_facet_construct(env, node1);
child_ele = axiom_util_get_first_child_element_with_uri_localname(ele1, env,
node1, "annotation", XML_SCHEMA_NS, &child_node);
while(NULL != child_ele)
{
void *annotation = NULL;
annotation = handle_annotation_with_element(builder, env, child_node);
XML_SCHEMA_ANNOTATED_SET_ANNOTATION(facet, env, annotation);
child_ele = axiom_util_get_next_sibling_element_with_uri_localname(child_ele,
env, child_node, "annotation", XML_SCHEMA_NS, &child_node);
}
facets = XML_SCHEMA_SIMPLE_CONTENT_RESTRICTION_GET_FACETS(sim_cnt_res, env);
XML_SCHEMA_OBJ_COLLECTION_ADD(facets, env, facet);
}
}
return sim_cnt_res;
}
static xml_schema_simple_content_extension_t*
handle_simple_content_extension(
xml_schema_builder_t* builder,
const axis2_env_t *env,
axiom_node_t *ext_node,
axiom_node_t *schema_node)
{
void *sim_cnt_ext = NULL;
axiom_element_t *ext_ele = NULL;
axis2_char_t *attr_value = NULL;
axiom_element_t *ele1 = NULL;
axiom_node_t *node1 = NULL;
xml_schema_builder_impl_t *builder_impl = NULL;
ext_ele = (axiom_element_t*)
AXIOM_NODE_GET_DATA_ELEMENT(ext_node, env);
sim_cnt_ext = xml_schema_simple_content_extension_create(env);
builder_impl = AXIS2_INTF_TO_IMPL(builder);
attr_value = AXIOM_ELEMENT_GET_ATTRIBUTE_VALUE_BY_NAME(ext_ele, env, "base");
if(NULL != attr_value)
{
axis2_char_t *ns_from_ele = "";
axis2_array_list_t *list = NULL;
axis2_hash_t *namespaces = NULL;
axis2_char_t *result = NULL;
axis2_array_list_t* last_list = NULL;
axis2_char_t *name = NULL;
axis2_qname_t *qn = NULL;
if(NULL != strchr(attr_value, ':'))
{
list = axis2_tokenize(env, attr_value, ':');
ns_from_ele = AXIS2_ARRAY_LIST_GET(list, env, 0);
}
namespaces = XML_SCHEMA_GET_PREFIX_TO_NAMESPACE_MAP(builder_impl->schema, env);
result = axis2_hash_get(namespaces, ns_from_ele, AXIS2_HASH_KEY_STRING);
if(NULL == result)
{
/** TODO set error */
return NULL;
}
last_list = axis2_last_token(env, attr_value, ':');
if(NULL != last_list && AXIS2_ARRAY_LIST_SIZE(last_list, env) >= 2)
name = (axis2_char_t *)AXIS2_ARRAY_LIST_GET(last_list, env, 1);
qn = axis2_qname_create(env, name, result, NULL);
XML_SCHEMA_SIMPLE_CONTENT_EXTENSION_SET_BASE_TYPE_NAME(sim_cnt_ext, env, qn);
}
ele1 = axiom_util_get_first_child_element_with_uri(ext_node, env, XML_SCHEMA_NS, &node1);
if(NULL != ele1)
{
axis2_char_t *localname = NULL;
localname = AXIOM_ELEMENT_GET_LOCALNAME(ele1, env);
if(AXIS2_STRCMP(localname, "attribute") == 0)
{
void *attribute = NULL;
xml_schema_obj_collection_t *attributes = NULL;
attribute = handle_attribute(builder, env, node1, schema_node);
attributes = XML_SCHEMA_SIMPLE_CONTENT_EXTENSION_GET_ATTRIBUTES(sim_cnt_ext, env);
XML_SCHEMA_OBJ_COLLECTION_ADD(attributes, env, attribute);
}
else if(AXIS2_STRCMP(localname, "attributeGroup") == 0)
{
void *attr_grp_ref = NULL;
xml_schema_obj_collection_t *attributes = NULL;
attr_grp_ref = handle_attribute_group_ref(builder, env, node1, schema_node);
attributes = XML_SCHEMA_SIMPLE_CONTENT_EXTENSION_GET_ATTRIBUTES(sim_cnt_ext, env);
XML_SCHEMA_OBJ_COLLECTION_ADD(attributes, env, attr_grp_ref);
}
else if(AXIS2_STRCMP(localname, "anyAttribute") == 0)
{
void *any_attr = NULL;
any_attr = handle_any_attribute(builder, env, node1, schema_node);
XML_SCHEMA_SIMPLE_CONTENT_EXTENSION_SET_ANY_ATTRIBUTE(sim_cnt_ext, env, any_attr);
}
else if(AXIS2_STRCMP(localname, "annotation") == 0)
{
void *annotation = NULL;
annotation = handle_annotation_with_element(builder, env, node1);
XML_SCHEMA_ANNOTATED_SET_ANNOTATION(sim_cnt_ext, env, annotation);
}
}
return sim_cnt_ext;
}
static xml_schema_complex_content_restriction_t*
handle_complex_content_restriction(
xml_schema_builder_t* builder,
const axis2_env_t *env,
axiom_node_t *res_node,
axiom_node_t *schema_node)
{
void *cmp_cnt_res = NULL;
axiom_element_t *res_ele = NULL;
axis2_char_t *attr_value = NULL;
axiom_element_t *ele1 = NULL;
axiom_node_t *node1 = NULL;
xml_schema_builder_impl_t *builder_impl = NULL;
res_ele = (axiom_element_t*)
AXIOM_NODE_GET_DATA_ELEMENT(res_node, env);
cmp_cnt_res = xml_schema_complex_content_create(env);
builder_impl = AXIS2_INTF_TO_IMPL(builder);
attr_value = AXIOM_ELEMENT_GET_ATTRIBUTE_VALUE_BY_NAME(res_ele, env, "base");
if(NULL != attr_value)
{
axis2_char_t *prefix = "";
axis2_array_list_t *list = NULL;
axis2_hash_t *namespaces = NULL;
axis2_char_t *result = NULL;
axis2_array_list_t* last_list = NULL;
axis2_char_t *name = NULL;
axis2_qname_t *qn = NULL;
if(NULL != strchr(attr_value, ':'))
{
list = axis2_tokenize(env, attr_value, ':');
prefix = AXIS2_ARRAY_LIST_GET(list, env, 0);
}
namespaces = XML_SCHEMA_GET_PREFIX_TO_NAMESPACE_MAP(builder_impl->schema, env);
result = axis2_hash_get(namespaces, prefix, AXIS2_HASH_KEY_STRING);
if(NULL == result)
{
/** TODO set error */
return NULL;
}
last_list = axis2_last_token(env, attr_value, ':');
if(NULL != last_list && AXIS2_ARRAY_LIST_SIZE(last_list, env) >= 2)
name = (axis2_char_t *)AXIS2_ARRAY_LIST_GET(last_list, env, 1);
qn = axis2_qname_create(env, name, result, NULL);
XML_SCHEMA_COMPLEX_CONTENT_EXTENSION_SET_BASE_TYPE_NAME(cmp_cnt_res, env, qn);
}
ele1 = axiom_util_get_first_child_element_with_uri(res_node, env, XML_SCHEMA_NS, &node1);
if(NULL != ele1)
{
axis2_char_t *localname = NULL;
localname = AXIOM_ELEMENT_GET_LOCALNAME(ele1, env);
if(AXIS2_STRCMP(localname, "sequence") == 0)
{
void *sequence = NULL;
sequence = handle_sequence(builder, env, node1, schema_node);
XML_SCHEMA_COMPLEX_CONTENT_RESTRICTION_SET_PARTICLE(cmp_cnt_res, env, sequence);
}
else if(AXIS2_STRCMP(localname, "choice") == 0)
{
void *choice = NULL;
choice = handle_choice(builder, env, node1, schema_node);
XML_SCHEMA_COMPLEX_CONTENT_RESTRICTION_SET_PARTICLE(cmp_cnt_res, env, choice);
}
else if(AXIS2_STRCMP(localname, "all") == 0)
{
void *all = NULL;
all = handle_all(builder, env, node1, schema_node);
XML_SCHEMA_COMPLEX_CONTENT_RESTRICTION_SET_PARTICLE(cmp_cnt_res, env, all);
}
if(AXIS2_STRCMP(localname, "attribute") == 0)
{
void *attribute = NULL;
xml_schema_obj_collection_t *attributes = NULL;
attribute = handle_attribute(builder, env, node1, schema_node);
attributes = XML_SCHEMA_COMPLEX_CONTENT_RESTRICTION_GET_ATTRIBUTES(cmp_cnt_res, env);
XML_SCHEMA_OBJ_COLLECTION_ADD(attributes, env, attribute);
}
else if(AXIS2_STRCMP(localname, "attributeGroup") == 0)
{
void *attr_grp_ref = NULL;
xml_schema_obj_collection_t *attributes = NULL;
attr_grp_ref = handle_attribute_group_ref(builder, env, node1, schema_node);
attributes = XML_SCHEMA_COMPLEX_CONTENT_RESTRICTION_GET_ATTRIBUTES(cmp_cnt_res, env);
XML_SCHEMA_OBJ_COLLECTION_ADD(attributes, env, attr_grp_ref);
}
else if(AXIS2_STRCMP(localname, "anyAttribute") == 0)
{
void *any_attr = NULL;
any_attr = handle_any_attribute(builder, env, node1, schema_node);
XML_SCHEMA_COMPLEX_CONTENT_RESTRICTION_SET_ANY_ATTRIBUTE(cmp_cnt_res, env, any_attr);
}
else if(AXIS2_STRCMP(localname, "annotation") == 0)
{
void *annotation = NULL;
annotation = handle_annotation_with_element(builder, env, node1);
XML_SCHEMA_ANNOTATED_SET_ANNOTATION(cmp_cnt_res, env, annotation);
}
}
return cmp_cnt_res;
}
static xml_schema_complex_content_extension_t*
handle_complex_content_extension(
xml_schema_builder_t *builder,
const axis2_env_t *env,
axiom_node_t *ext_node,
axiom_node_t *schema_node)
{
void *cmp_cnt_ext = NULL;
axiom_element_t *ext_ele = NULL;
axis2_char_t *attr_value = NULL;
axiom_element_t *ele1 = NULL;
axiom_node_t *node1 = NULL;
xml_schema_builder_impl_t *builder_impl = NULL;
ext_ele = (axiom_element_t*)
AXIOM_NODE_GET_DATA_ELEMENT(ext_node, env);
cmp_cnt_ext = xml_schema_complex_content_extension_create(env);
builder_impl = AXIS2_INTF_TO_IMPL(builder);
attr_value = AXIOM_ELEMENT_GET_ATTRIBUTE_VALUE_BY_NAME(ext_ele, env, "base");
if(NULL != attr_value)
{
axis2_char_t *ns_from_ele = "";
axis2_array_list_t *list = NULL;
axis2_hash_t *namespaces = NULL;
axis2_char_t *result = NULL;
axis2_array_list_t* last_list = NULL;
axis2_char_t *name = NULL;
axis2_qname_t *qn = NULL;
if(NULL != strchr(attr_value, ':'))
{
list = axis2_tokenize(env, attr_value, ':');
ns_from_ele = AXIS2_ARRAY_LIST_GET(list, env, 0);
}
namespaces = XML_SCHEMA_GET_PREFIX_TO_NAMESPACE_MAP(builder_impl->schema, env);
result = axis2_hash_get(namespaces, ns_from_ele, AXIS2_HASH_KEY_STRING);
if(NULL == result)
{
/** TODO set error */
return NULL;
}
last_list = axis2_last_token(env, attr_value, ':');
if(NULL != last_list && AXIS2_ARRAY_LIST_SIZE(last_list, env) >= 2)
name = (axis2_char_t *)AXIS2_ARRAY_LIST_GET(last_list, env, 1);
qn = axis2_qname_create(env, name, result, NULL);
XML_SCHEMA_COMPLEX_CONTENT_EXTENSION_SET_BASE_TYPE_NAME(cmp_cnt_ext, env, qn);
}
ele1 = axiom_util_get_first_child_element_with_uri(ext_node, env, XML_SCHEMA_NS, &node1);
if(NULL != ele1)
{
axis2_char_t *localname = NULL;
localname = AXIOM_ELEMENT_GET_LOCALNAME(ele1, env);
if(AXIS2_STRCMP(localname, "sequence") == 0)
{
void *sequence = NULL;
sequence = handle_sequence(builder, env, node1, schema_node);
XML_SCHEMA_COMPLEX_CONTENT_EXTENSION_SET_PARTICLE(cmp_cnt_ext, env, sequence);
}
else if(AXIS2_STRCMP(localname, "choice") == 0)
{
void *choice = NULL;
choice = handle_choice(builder, env, node1, schema_node);
XML_SCHEMA_COMPLEX_CONTENT_EXTENSION_SET_PARTICLE(cmp_cnt_ext, env, choice);
}
else if(AXIS2_STRCMP(localname, "all") == 0)
{
void *all = NULL;
all = handle_all(builder, env, node1, schema_node);
XML_SCHEMA_COMPLEX_CONTENT_EXTENSION_SET_PARTICLE(cmp_cnt_ext, env, all);
}
else if(AXIS2_STRCMP(localname, "attribute") == 0)
{
void *attribute = NULL;
xml_schema_obj_collection_t *attributes = NULL;
attribute = handle_attribute(builder, env, node1, schema_node);
attributes = XML_SCHEMA_COMPLEX_CONTENT_EXTENSION_GET_ATTRIBUTES(cmp_cnt_ext, env);
XML_SCHEMA_OBJ_COLLECTION_ADD(attributes, env, attribute);
}
else if(AXIS2_STRCMP(localname, "attributeGroup") == 0)
{
void *attr_grp_ref = NULL;
xml_schema_obj_collection_t *attributes = NULL;
attr_grp_ref = handle_attribute_group_ref(builder, env, node1, schema_node);
attributes = XML_SCHEMA_COMPLEX_CONTENT_EXTENSION_GET_ATTRIBUTES(cmp_cnt_ext, env);
XML_SCHEMA_OBJ_COLLECTION_ADD(attributes, env, attr_grp_ref);
}
else if(AXIS2_STRCMP(localname, "anyAttribute") == 0)
{
void *any_attr = NULL;
any_attr = handle_any_attribute(builder, env, node1, schema_node);
XML_SCHEMA_COMPLEX_CONTENT_EXTENSION_SET_ANY_ATTRIBUTE(cmp_cnt_ext, env, any_attr);
}
else if(AXIS2_STRCMP(localname, "annotation") == 0)
{
void *annotation = NULL;
annotation = handle_annotation_with_element(builder, env, node1);
XML_SCHEMA_ANNOTATED_SET_ANNOTATION(cmp_cnt_ext, env, annotation);
}
}
return cmp_cnt_ext;
}
static xml_schema_attribute_group_ref_t*
handle_attribute_group_ref(
xml_schema_builder_t *builder,
const axis2_env_t *env,
axiom_node_t *attr_grp_node,
axiom_node_t *schema_node)
{
void *attr_grp_ref = NULL;
axiom_element_t *ann_ele = NULL;
axiom_node_t *ann_node = NULL;
axis2_char_t *attr_value = NULL;
axiom_element_t *attr_grp_ele = NULL;
attr_grp_ref = xml_schema_attribute_group_ref_create(env);
attr_grp_ele = (axiom_element_t*)
AXIOM_NODE_GET_DATA_ELEMENT(attr_grp_node, env);
attr_value = AXIOM_ELEMENT_GET_ATTRIBUTE_VALUE_BY_NAME(attr_grp_ele,
env, "ref");
if(NULL != attr_value)
{
axis2_array_list_t *parts = NULL;
axis2_char_t *prefix = NULL;
axis2_hash_t *ht_ns = NULL;
axis2_char_t *uri = NULL;
axis2_char_t *ref = NULL;
axis2_array_list_t *last_list = NULL;
axis2_qname_t *ref_qname = NULL;
parts = axis2_tokenize(env, attr_value, ':');
if(NULL != parts && AXIS2_ARRAY_LIST_SIZE(parts, env) > 1)
{
prefix = AXIS2_ARRAY_LIST_GET(parts, env, 0);
ht_ns = XML_SCHEMA_GET_PREFIX_TO_NAMESPACE_MAP(
AXIS2_INTF_TO_IMPL(builder)->schema, env);
uri = axis2_hash_get(ht_ns, prefix, AXIS2_HASH_KEY_STRING);
if(NULL == uri)
{
/** TODO set error code */
return NULL;
}
}
last_list = axis2_last_token(env, attr_value, ':');
ref = AXIS2_ARRAY_LIST_GET(last_list, env, 1);
/** check this */
ref_qname = axis2_qname_create(env, ref, uri, NULL);
XML_SCHEMA_ATTRIBUTE_GROUP_REF_SET_REF_QNAME(attr_grp_ref, env, ref_qname); }
attr_value = NULL;
attr_value = AXIOM_ELEMENT_GET_ATTRIBUTE_VALUE_BY_NAME(attr_grp_ele, env, "id");
if(NULL != attr_value)
XML_SCHEMA_ANNOTATED_SET_ID(attr_grp_ref, env, attr_value);
ann_ele = axiom_util_get_first_child_element_with_uri_localname(attr_grp_ele, env,
attr_grp_node, "annotation", XML_SCHEMA_NS, &ann_node);
if(NULL != ann_ele)
{
void *annotation = handle_annotation_with_element(builder, env, ann_node);
XML_SCHEMA_ANNOTATED_SET_ANNOTATION(attr_grp_ref, env, annotation);
}
return attr_grp_ref;
}
static xml_schema_group_base_t*
handle_sequence(
xml_schema_builder_t *builder,
const axis2_env_t *env,
axiom_node_t *seq_node,
axiom_node_t *schema_node)
{
void *sequence = NULL;
axiom_element_t *ele1 = NULL;
axiom_node_t *node1 = NULL;
xml_schema_obj_collection_t *items = NULL;
sequence = xml_schema_sequence_create(env);
ele1 = axiom_util_get_first_child_element_with_uri(seq_node, env,
XML_SCHEMA_NS, &node1);
items = XML_SCHEMA_GROUP_BASE_GET_ITEMS(sequence, env);
while(NULL != ele1)
{
axis2_char_t *localname = NULL;
localname = AXIOM_ELEMENT_GET_LOCALNAME(ele1, env);
if(AXIS2_STRCMP(localname, "sequence") == 0)
{
void *seq = NULL;
seq = handle_sequence(builder, env, node1, schema_node);
XML_SCHEMA_OBJ_COLLECTION_ADD(items, env, seq);
}
else if(AXIS2_STRCMP(localname, "element") == 0)
{
void *element = NULL;
element = handle_element(builder, env,
node1, schema_node, AXIS2_FALSE);
XML_SCHEMA_OBJ_COLLECTION_ADD(items, env, element);
}
else if(AXIS2_STRCMP(localname, "group") == 0)
{
void *group = NULL;
group = handle_group_ref(builder, env, node1, schema_node);
XML_SCHEMA_OBJ_COLLECTION_ADD(items, env, group);
}
else if(AXIS2_STRCMP(localname, "choice") == 0)
{
void *choice_item = NULL;
choice_item = handle_choice(builder, env, node1, schema_node);
XML_SCHEMA_OBJ_COLLECTION_ADD(items, env, choice_item);
}
else if(AXIS2_STRCMP(localname, "any") == 0)
{
void *any = NULL;
any = handle_any(builder, env, node1, schema_node);
XML_SCHEMA_OBJ_COLLECTION_ADD(items, env, any);
}
else if(AXIS2_STRCMP(localname, "annotation") == 0)
{
void *annotation = NULL;
annotation = handle_annotation(builder, env, node1, schema_node);
XML_SCHEMA_ANNOTATED_SET_ANNOTATION(sequence, env, annotation);
}
ele1 = axiom_util_get_next_sibling_element_with_uri(node1, env,
XML_SCHEMA_NS, &node1);
}
return sequence;
}
static xml_schema_any_t*
handle_any(
xml_schema_builder_t* builder,
const axis2_env_t *env,
axiom_node_t *any_node,
axiom_node_t *schema_node)
{
axiom_element_t *any_ele = NULL;
void *any = NULL;
axis2_char_t *attr_value = NULL;
axis2_char_t *process_cnt = NULL;
void *pro_content = NULL;
axiom_element_t *annotation_ele = NULL;
axiom_node_t *annotation_node = NULL;
long min_occurs = 0;
long max_occurs = 0;
any = xml_schema_any_create(env);
any_ele = (axiom_element_t*)
AXIOM_NODE_GET_DATA_ELEMENT(any_node, env);
attr_value = AXIOM_ELEMENT_GET_ATTRIBUTE_VALUE_BY_NAME(any_ele, env,
"namespace");
if(NULL != attr_value)
XML_SCHEMA_ANY_SET_NAMESPACE(any, env, attr_value);
process_cnt = get_enum_string(builder, env, any_ele, "processContents");
if(NULL != process_cnt)
{
pro_content = xml_schema_content_processing_create(env, process_cnt);
XML_SCHEMA_ANY_SET_PROCESS_CONTENT(any, env, pro_content);
}
annotation_ele = axiom_util_get_first_child_element_with_uri_localname(any_ele, env,
any_node, "annotation", XML_SCHEMA_NS, &annotation_node);
if(NULL != annotation_ele)
{
void *annotation = NULL;
annotation = handle_annotation_with_element(builder, env, annotation_node);
XML_SCHEMA_ANNOTATED_SET_ANNOTATION(any, env, annotation);
}
min_occurs = get_min_occurs(env, any_node);
max_occurs = get_max_occurs(env, any_node);
XML_SCHEMA_PARTICLE_SET_MAX_OCCURS(any, env, max_occurs);
XML_SCHEMA_PARTICLE_SET_MIN_OCCURS(any, env, min_occurs);
return any;
}
static xml_schema_group_base_t*
handle_choice(
xml_schema_builder_t* builder,
const axis2_env_t *env,
axiom_node_t *choice_node,
axiom_node_t *schema_node)
{
void *choice = NULL;
axis2_char_t *attr_value = NULL;
axiom_element_t *choice_ele = NULL;
axiom_element_t *ele1 = NULL;
axiom_node_t *node1 = NULL;
xml_schema_obj_collection_t *items = NULL;
AXIS2_PARAM_CHECK(env->error, choice_node, NULL);
AXIS2_PARAM_CHECK(env->error, schema_node, NULL);
choice = xml_schema_choice_create(env);
choice_ele = (axiom_element_t*)
AXIOM_NODE_GET_DATA_ELEMENT(choice_node, env);
attr_value = AXIOM_ELEMENT_GET_ATTRIBUTE_VALUE_BY_NAME(choice_ele, env, "id");
if(NULL != attr_value)
XML_SCHEMA_ANNOTATED_SET_ID(choice, env, attr_value);
ele1 = axiom_util_get_first_child_element_with_uri(choice_node, env,
XML_SCHEMA_NS, &node1);
items = XML_SCHEMA_GROUP_BASE_GET_ITEMS(choice, env);
while(NULL != ele1)
{
axis2_char_t *localname = NULL;
localname = AXIOM_ELEMENT_GET_LOCALNAME(ele1, env);
if(AXIS2_STRCMP(localname, "sequence") == 0)
{
void *seq = NULL;
seq = handle_sequence(builder, env, node1, schema_node);
XML_SCHEMA_OBJ_COLLECTION_ADD(items, env, seq);
}
else if(AXIS2_STRCMP(localname, "element") == 0)
{
void *element = NULL;
element = handle_element(builder, env,
node1, schema_node, AXIS2_FALSE);
XML_SCHEMA_OBJ_COLLECTION_ADD(items, env, element);
}
else if(AXIS2_STRCMP(localname, "group") == 0)
{
void *group = NULL;
group = handle_group_ref(builder, env, node1, schema_node);
XML_SCHEMA_OBJ_COLLECTION_ADD(items, env, group);
}
else if(AXIS2_STRCMP(localname, "choice") == 0)
{
void *choice_item = NULL;
choice_item = handle_choice(builder, env, node1, schema_node);
XML_SCHEMA_OBJ_COLLECTION_ADD(items, env, choice_item); }
else if(AXIS2_STRCMP(localname, "any") == 0)
{
void *any = NULL;
any = handle_any(builder, env, node1, schema_node);
XML_SCHEMA_OBJ_COLLECTION_ADD(items, env, any);
}
else if(AXIS2_STRCMP(localname, "annotation") == 0)
{
void *annotation = NULL;
annotation = handle_annotation(builder, env, node1, schema_node);
XML_SCHEMA_ANNOTATED_SET_ANNOTATION(choice, env, annotation);
}
ele1 = axiom_util_get_first_child_element_with_uri(node1, env,
XML_SCHEMA_NS, &node1);
}
return choice;
}
static xml_schema_group_base_t*
handle_all(
xml_schema_builder_t* builder,
const axis2_env_t *env,
axiom_node_t *all_node,
axiom_node_t *schema_node)
{
void *all = NULL;
axiom_element_t *ele1 = NULL;
axiom_node_t *node1 = NULL;
all = xml_schema_all_create(env);
ele1 = axiom_util_get_first_child_element_with_uri(all_node, env,
XML_SCHEMA_NS, &node1);
while(NULL != ele1)
{
axis2_char_t *localname = NULL;
localname = AXIOM_ELEMENT_GET_LOCALNAME(ele1, env);
if(AXIS2_STRCMP(localname, "element") == 0)
{
void *element = NULL;
xml_schema_obj_collection_t *items = NULL;
element = handle_element(builder, env, node1,
schema_node, AXIS2_FALSE);
items = XML_SCHEMA_GROUP_BASE_GET_ITEMS(all, env);
XML_SCHEMA_OBJ_COLLECTION_ADD(items, env, element);
}
else if(AXIS2_STRCMP(localname,"annotation") == 0)
{
void *annotation = NULL;
annotation = handle_annotation_with_element(builder, env, node1);
XML_SCHEMA_ANNOTATED_SET_ANNOTATION(all, env, annotation);
}
ele1 = axiom_util_get_next_sibling_element_with_uri(node1, env,
XML_SCHEMA_NS, &node1);
}
return all;
}
static xml_schema_group_t*
handle_group(
xml_schema_builder_t* builder,
const axis2_env_t *env,
axiom_node_t *group_node,
axiom_node_t *schema_node)
{
axiom_element_t *grp_ele = NULL;
void *grp = NULL;
axis2_char_t *grp_name = NULL;
axiom_node_t *node1 = NULL;
axiom_element_t *ele1 = NULL;
grp = xml_schema_group_create(env);
grp_ele = (axiom_element_t *)AXIOM_NODE_GET_DATA_ELEMENT(
group_node, env);
grp_name = AXIOM_ELEMENT_GET_ATTRIBUTE_VALUE_BY_NAME(grp_ele, env,
"name");
XML_SCHEMA_GROUP_SET_NAME(grp, env, grp_name);
grp_ele = (axiom_element_t*)
AXIOM_NODE_GET_DATA_ELEMENT(group_node, env);
ele1 = axiom_util_get_first_child_element_with_uri(group_node, env,
XML_SCHEMA_NS, &node1);
while(NULL != ele1)
{
axis2_char_t *localname = NULL;
void *particle = NULL;
localname = AXIOM_ELEMENT_GET_LOCALNAME(ele1, env);
if(AXIS2_STRCMP(localname, "all") == 0)
{
particle = handle_all(builder, env, node1, schema_node);
XML_SCHEMA_GROUP_SET_PARTICLE(grp, env, particle);
}
else if(AXIS2_STRCMP(localname, "sequence") == 0)
{
particle = handle_sequence(builder, env, node1, schema_node);
XML_SCHEMA_GROUP_SET_PARTICLE(grp, env, particle);
}
else if(AXIS2_STRCMP(localname, "choice") == 0)
{
particle = handle_choice(builder, env, node1, schema_node);
XML_SCHEMA_GROUP_SET_PARTICLE(grp, env, particle);
}
else if(AXIS2_STRCMP(localname, "annotation") == 0)
{
void *grp_annotation = NULL;
grp_annotation =
handle_annotation_with_element(builder, env, node1);
XML_SCHEMA_ANNOTATED_SET_ANNOTATION(grp, env, grp_annotation);
}
ele1 = axiom_util_get_next_sibling_element_with_uri(node1, env,
XML_SCHEMA_NS, &node1);
}
return grp;
}
static xml_schema_attribute_group_t*
handle_attribute_group(
xml_schema_builder_t* builder,
const axis2_env_t *env,
axiom_node_t *attr_grp_node,
axiom_node_t *schema_node)
{
void *attr_grp = NULL;
axis2_char_t *attr_value = NULL;
axiom_element_t *attr_grp_ele = NULL;
axiom_element_t *ele1 = NULL;
axiom_node_t *node1 = NULL;
attr_grp = xml_schema_any_attribute_create(env);
attr_grp_ele = AXIOM_NODE_GET_DATA_ELEMENT(attr_grp_node, env);
attr_value = AXIOM_ELEMENT_GET_ATTRIBUTE_VALUE_BY_NAME(attr_grp_ele, env, "name");
if(NULL != attr_value)
{
XML_SCHEMA_ATTRIBUTE_GROUP_SET_NAME(attr_grp, env, attr_value);
attr_value = NULL;
}
attr_value = AXIOM_ELEMENT_GET_ATTRIBUTE_VALUE_BY_NAME(attr_grp_ele, env, "id");
if(NULL != attr_value)
{
XML_SCHEMA_ANNOTATED_SET_ID(attr_grp, env, attr_value);
}
ele1 = axiom_util_get_first_child_element_with_uri(node1, env,
XML_SCHEMA_NS, &node1);
while(NULL != ele1)
{
axis2_char_t *localname = NULL;
localname = AXIOM_ELEMENT_GET_LOCALNAME(ele1, env);
if(AXIS2_STRCMP(localname, "attribute") == 0)
{
void *attr = NULL;
xml_schema_obj_collection_t *attributes = NULL;
attr = handle_attribute(builder, env, node1, schema_node);
attributes = XML_SCHEMA_ATTRIBUTE_GROUP_GET_ATTRIBUTES(attr_grp, env);
XML_SCHEMA_OBJ_COLLECTION_ADD(attributes, env, attr);
}
else if(AXIS2_STRCMP(localname, "attributeGroup") == 0)
{
void *attr_grp_ref = NULL;
xml_schema_obj_collection_t *attributes = NULL;
attr_grp_ref = handle_attribute_group_ref(builder, env, node1, schema_node);
attributes = XML_SCHEMA_ATTRIBUTE_GROUP_GET_ATTRIBUTES(attr_grp, env);
XML_SCHEMA_OBJ_COLLECTION_ADD(attributes, env, attr_grp_ref);
}
else if(AXIS2_STRCMP(localname, "anyAttribute") == 0)
{
void *any_attr = NULL;
any_attr = handle_any_attribute(builder, env, node1, schema_node);
XML_SCHEMA_ATTRIBUTE_GROUP_SET_ANY_ATTRIBUTE(attr_grp, env, any_attr);
}
else if(AXIS2_STRCMP(localname, "annotation") == 0)
{
void *annotation = NULL;
annotation = handle_annotation_with_element(builder, env, node1);
XML_SCHEMA_ANNOTATED_SET_ANNOTATION(attr_grp, env, annotation);
}
ele1 = axiom_util_get_first_child_element_with_uri(node1, env,
XML_SCHEMA_NS, &node1);
}
return attr_grp;
}
static xml_schema_any_attribute_t*
handle_any_attribute(
xml_schema_builder_t *builder,
const axis2_env_t *env,
axiom_node_t *any_attr_node,
axiom_node_t *schema_node)
{
void *any_attr = NULL;
axiom_element_t *any_attr_ele = NULL;
axis2_char_t *attr_value = NULL;
axiom_element_t *ann_ele = NULL;
axiom_node_t *ann_node = NULL;
xml_schema_builder_impl_t *builder_impl = NULL;
builder_impl = AXIS2_INTF_TO_IMPL(builder);
any_attr = xml_schema_any_attribute_create(env);
any_attr_ele = (axiom_element_t*)
AXIOM_NODE_GET_DATA_ELEMENT(any_attr_node, env);
attr_value = AXIOM_ELEMENT_GET_ATTRIBUTE_VALUE_BY_NAME(any_attr_ele, env, "namespace");
if(NULL != attr_value)
{
XML_SCHEMA_ANY_ATTRIBUTE_SET_NAMESPACE(any_attr, env, attr_value);
attr_value = NULL;
}
attr_value = AXIOM_ELEMENT_GET_ATTRIBUTE_VALUE_BY_NAME(any_attr_ele, env, "processContents");
if(NULL != attr_value)
{
axis2_char_t* content_processing = NULL;
void *cnt_processnig = NULL;
content_processing = get_enum_string(builder, env, any_attr_ele, "processContents");
cnt_processnig = xml_schema_content_processing_create(env, content_processing);
XML_SCHEMA_ANY_ATTRIBUTE_SET_PROCESS_CONTENT(any_attr, env, cnt_processnig);
attr_value = NULL;
}
attr_value = AXIOM_ELEMENT_GET_ATTRIBUTE_VALUE_BY_NAME(any_attr_ele, env, "id");
if(NULL != attr_value)
{
XML_SCHEMA_ANNOTATED_SET_ID(any_attr, env, attr_value);
attr_value = NULL;
}
ann_ele = axiom_util_get_first_child_element_with_uri_localname(any_attr_ele, env,
any_attr_node, "annotation", XML_SCHEMA_NS, &ann_node);
if(NULL != ann_ele)
{
void *annotation = NULL;
annotation = handle_annotation_with_element(builder, env, any_attr_node);
XML_SCHEMA_ANNOTATED_SET_ANNOTATION(any_attr, env, annotation);
}
return any_attr;
}
static xml_schema_group_ref_t*
handle_group_ref(
xml_schema_builder_t *builder,
const axis2_env_t *env,
axiom_node_t *grp_ref_node,
axiom_node_t *schema_node)
{
void *group = NULL;
axiom_element_t *grp_ref_ele = NULL;
axis2_char_t *attr_value = NULL;
axiom_element_t *ann_ele = NULL;
axiom_node_t *ann_node = NULL;
axiom_element_t *ele1 = NULL;
axiom_node_t *node1 = NULL;
axis2_hash_t *ht_ns = NULL;
group = xml_schema_group_ref_create(env);
grp_ref_ele = AXIOM_NODE_GET_DATA_ELEMENT(grp_ref_node, env);
ann_ele = axiom_util_get_first_child_element_with_uri_localname(
grp_ref_ele, env, grp_ref_node, "annotation", XML_SCHEMA_NS, &ann_node);
if(NULL != ann_ele)
{
void *annotation = NULL;
annotation = handle_annotation_with_element(builder, env, ann_node);
XML_SCHEMA_ANNOTATED_SET_ANNOTATION(group, env, annotation);
}
attr_value = AXIOM_ELEMENT_GET_ATTRIBUTE_VALUE_BY_NAME(ann_ele, env, "ref");
if(NULL != attr_value)
{
axis2_array_list_t* parts = NULL;
axis2_char_t *prefix = "";
axis2_char_t *result = NULL;
axis2_array_list_t *last_list = NULL;
axis2_char_t *ref= NULL;
axis2_qname_t *ref_qname = NULL;
parts = axis2_tokenize(env, attr_value, ':');
ht_ns = XML_SCHEMA_GET_PREFIX_TO_NAMESPACE_MAP(
AXIS2_INTF_TO_IMPL(builder)->schema, env);
if(AXIS2_ARRAY_LIST_SIZE(parts, env) > 1)
prefix = (axis2_char_t*)AXIS2_ARRAY_LIST_GET(parts, env, 1);
result = axis2_hash_get(ht_ns, prefix, AXIS2_HASH_KEY_STRING);
if(NULL == result)
{
/**TODO set error */
return NULL;
}
last_list = axis2_last_token(env, attr_value, ':');
ref = AXIS2_ARRAY_LIST_GET(last_list, env, 1);
ref_qname = axis2_qname_create(env, ref, XML_SCHEMA_NS, NULL);
return group;
}
ele1 = axiom_util_get_first_child_element_with_uri(grp_ref_node, env,
XML_SCHEMA_NS, &node1);
while(NULL != ele1)
{
axis2_char_t *localname = NULL;
localname = AXIOM_ELEMENT_GET_LOCALNAME(ele1, env);
if(AXIS2_STRCMP(localname, "sequence") == 0)
{
void *seq = NULL;
seq = handle_sequence(builder, env, node1, schema_node);
XML_SCHEMA_GROUP_REF_SET_PARTICLE(group, env, seq);
}
else if(AXIS2_STRCMP(localname, "all") == 0)
{
void *all = NULL;
all = handle_all(builder, env, node1, schema_node);
XML_SCHEMA_GROUP_REF_SET_PARTICLE(group, env, all);
}
else if(AXIS2_STRCMP(localname, "choice") == 0)
{
void *choice = NULL;
choice = handle_choice(builder, env, node1, schema_node);
XML_SCHEMA_GROUP_REF_SET_PARTICLE(group, env, choice);
}
}
return group;
}
static xml_schema_attribute_t*
handle_attribute(
xml_schema_builder_t *builder,
const axis2_env_t *env,
axiom_node_t *attr_node,
axiom_node_t *schema_node)
{
void *attr = NULL;
axiom_element_t *attr_ele = NULL;
xml_schema_builder_impl_t *builder_impl = NULL;
axis2_char_t *attr_value = NULL;
axis2_char_t *target_namespace = NULL;
axiom_element_t *sim_ele = NULL;
axiom_node_t *sim_node = NULL;
axiom_element_t *ann_ele = NULL;
axiom_node_t *ann_node = NULL;
attr_ele = (axiom_element_t*)
AXIOM_NODE_GET_DATA_ELEMENT(attr_node, env);
builder_impl = AXIS2_INTF_TO_IMPL(builder);
target_namespace = XML_SCHEMA_GET_TARGET_NAMESPACE(builder_impl->schema, env);
attr = xml_schema_attribute_create(env);
attr_value = AXIOM_ELEMENT_GET_ATTRIBUTE_VALUE_BY_NAME(attr_ele, env, "name");
if(NULL != attr_value)
{
axis2_qname_t *qn = NULL;
XML_SCHEMA_ATTRIBUTE_SET_NAME(attr, env, attr_value);
qn = axis2_qname_create(env, attr_value, target_namespace, NULL);
XML_SCHEMA_ATTRIBUTE_SET_QNAME(attr, env, qn);
}
attr_value = NULL;
attr_value = AXIOM_ELEMENT_GET_ATTRIBUTE_VALUE_BY_NAME(attr_ele, env, "type");
if(NULL != attr_value)
{
axis2_array_list_t *args = NULL;
axis2_char_t *namesp = NULL;
axis2_char_t *prefix = NULL;
axis2_array_list_t *last_list = NULL;
axis2_char_t *name = NULL;
axis2_qname_t *qn = NULL;
args = axis2_tokenize(env, attr_value, ':');
if(AXIS2_ARRAY_LIST_SIZE(args, env) > 1)
{
axis2_hash_t *ht_ns = NULL;
axiom_namespace_t *ns = NULL;
ht_ns = AXIOM_ELEMENT_GET_NAMESPACES(attr_ele, env);
prefix = AXIS2_ARRAY_LIST_GET(args, env, 0);
if(NULL != ht_ns)
{
ns = axis2_hash_get(ht_ns, prefix, AXIS2_HASH_KEY_STRING);
if(NULL != ns)
{
namesp = AXIOM_NAMESPACE_GET_URI(ns, env);
}
}
else
{
namesp = XML_SCHEMA_GET_NAMESPACE(builder_impl->schema,
env, prefix);
}
if(namesp == NULL)
{
/** TODO set error */
return NULL;
}
}
else
{
namesp = XML_SCHEMA_GET_NAMESPACE(builder_impl->schema,
env, "");
}
last_list = axis2_last_token(env, attr_value, ':');
name = AXIS2_ARRAY_LIST_GET(last_list, env, 1);
qn = axis2_qname_create(env, name, namesp, NULL);
XML_SCHEMA_ATTRIBUTE_SET_SCHEMA_TYPE_NAME(attr, env, qn);
}
attr_value = NULL;
if(NULL != (attr_value =
AXIOM_ELEMENT_GET_ATTRIBUTE_VALUE_BY_NAME(attr_ele, env, "default")))
{
XML_SCHEMA_ATTRIBUTE_SET_DEFAULT_VALUE(attr, env, attr_value);
attr_value = NULL;
}
if(NULL != (attr_value = AXIOM_ELEMENT_GET_ATTRIBUTE_VALUE_BY_NAME(attr_ele, env, "fixed")))
{
XML_SCHEMA_ATTRIBUTE_SET_FIXED_VALUE(attr, env, attr_value);
attr_value = NULL;
}
if(NULL != (attr_value =
AXIOM_ELEMENT_GET_ATTRIBUTE_VALUE_BY_NAME(attr_ele, env, "form")))
{
axis2_char_t* form_value = NULL;
void *form = NULL;
form_value = get_enum_string(builder, env, attr_ele, "form");
form = xml_schema_form_create(env, form_value);
XML_SCHEMA_ATTRIBUTE_SET_SCHEMA_FORM(attr, env, form);
}
if(NULL != (attr_value = AXIOM_ELEMENT_GET_ATTRIBUTE_VALUE_BY_NAME(attr_ele, env, "id")))
{
XML_SCHEMA_ANNOTATED_SET_ID(attr, env, attr_value);
attr_value = NULL;
}
if(NULL != (attr_value = AXIOM_ELEMENT_GET_ATTRIBUTE_VALUE_BY_NAME(attr_ele, env, "use")))
{
axis2_char_t* use_value = NULL;
void *use = NULL;
use_value = get_enum_string(builder, env, attr_ele, "use");
use = xml_schema_use_create(env, use_value);
XML_SCHEMA_ATTRIBUTE_SET_SCHEMA_FORM(attr, env, use);
}
if(NULL != (attr_value = AXIOM_ELEMENT_GET_ATTRIBUTE_VALUE_BY_NAME(attr_ele, env, "id")))
{
XML_SCHEMA_ANNOTATED_SET_ID(attr, env, attr_value);
attr_value = NULL;
}
if(NULL != (attr_value = AXIOM_ELEMENT_GET_ATTRIBUTE_VALUE_BY_NAME(attr_ele, env, "ref")))
{
axis2_array_list_t *ns_list = NULL;
axis2_char_t *namesp = NULL;
axis2_array_list_t *last_list = NULL;
axis2_char_t *name = NULL;
axis2_qname_t *ref_name = NULL;
ns_list = axis2_tokenize(env, attr_value, ':');
if(AXIS2_ARRAY_LIST_SIZE(ns_list, env) > 1)
{
axis2_char_t *result = NULL;
axis2_hash_t *ns_hash = NULL;
axis2_char_t *prefix = NULL;
axis2_char_t *xml_prefix = NULL;
prefix = AXIS2_ARRAY_LIST_GET(ns_list, env, 1);
xml_prefix = AXIS2_ARRAY_LIST_GET(ns_list, env, 1);
ns_hash = XML_SCHEMA_GET_PREFIX_TO_NAMESPACE_MAP(builder_impl->schema, env);
result = axis2_hash_get(ns_hash, prefix, AXIS2_HASH_KEY_STRING);
if(NULL == result && NULL != xml_prefix && AXIS2_STRCMP(xml_prefix, XML_SCHEMANS_PREFIX))
result = XML_SCHEMANS_URI;
if(NULL == result)
{
/**TODO set error */
return NULL;
}
namesp = result;
}
else
{
namesp = XML_SCHEMA_GET_TARGET_NAMESPACE(builder_impl->schema, env);
}
last_list = axis2_last_token(env, attr_value, ':');
name = AXIS2_ARRAY_LIST_GET(last_list, env, 1);
ref_name = axis2_qname_create(env, name, namesp, NULL);
XML_SCHEMA_ATTRIBUTE_SET_REF_NAME(attr, env, ref_name);
XML_SCHEMA_ATTRIBUTE_SET_NAME(attr, env, name);
}
sim_ele = axiom_util_get_first_child_element_with_uri_localname(attr_ele,
env, attr_node, "simpleType", XML_SCHEMA_NS, &sim_node);
if(NULL != sim_ele)
{
void *sim_type = NULL;
sim_type = handle_simple_type(builder, env, sim_node,
schema_node);
XML_SCHEMA_ATTRIBUTE_SET_SCHEMA_TYPE(attr, env, sim_type);
}
ann_ele = axiom_util_get_first_child_element_with_uri_localname(attr_ele,
env, attr_node, "annotation", XML_SCHEMA_NS, &ann_node);
if(NULL != ann_ele)
{
void *annotation = NULL;
annotation = handle_annotation_with_element(builder, env, ann_node);
XML_SCHEMA_ANNOTATED_SET_ANNOTATION(attr, env, annotation);
}
/**
NamedNodeMap attrNodes = attrEl.getAttributes();
Vector attrs = new Vector();
for (int i = 0; i < attrNodes.getLength(); i++) {
Attr att = (Attr) attrNodes.item(i);
if (!att.getName().equals("name") &&
!att.getName().equals("type") &&
!att.getName().equals("default") &&
!att.getName().equals("fixed") &&
!att.getName().equals("form") &&
!att.getName().equals("id") &&
!att.getName().equals("use") &&
!att.getName().equals("ref")) {
attrs.add(att);
String value = att.getValue();
if (value.indexOf(":") > -1) {
String prefix = value.substring(0, value.indexOf(":"));
String namespace = (String) schema.namespaces.get(prefix);
if (namespace != null) {
Attr nsAttr = attrEl.getOwnerDocument().createAttribute("xmlns:" + prefix);
nsAttr.setValue(namespace);
attrs.add(nsAttr);
}
}
}
}
if (attrs.size() > 0)
attr.setUnhandledAttributes((Attr[]) attrs.toArray(new Attr[0]));
*/
return attr;
}
static xml_schema_element_t*
handle_element(
xml_schema_builder_t *builder,
const axis2_env_t *env,
axiom_node_t *ele_node,
axiom_node_t *schema_node,
axis2_bool_t is_global)
{
void *sch_ele= NULL;
axis2_char_t *attr_value = NULL;
axiom_element_t *om_ele = NULL;
axis2_bool_t is_qualified = AXIS2_FALSE;
void *ele_form_default = NULL;
xml_schema_builder_impl_t *builder_impl = NULL;
axis2_char_t *form_value = NULL;
axis2_char_t *ns = NULL;
axis2_char_t *element_name = NULL;
axiom_element_t *ann_ele = NULL;
axiom_node_t *ann_node = NULL;
axiom_element_t *sim_type_ele = NULL;
axiom_node_t *sim_type_node = NULL;
axiom_element_t *com_type_ele = NULL;
axiom_node_t *com_type_node = NULL;
axiom_element_t *key__ele = NULL;
axiom_node_t *key_node = NULL;
axiom_element_t *keyref_ele = NULL;
axiom_node_t *keyref_node = NULL;
axiom_element_t *unique_ele = NULL;
axiom_node_t *unique_node = NULL;
int max_occurs = 0;
int min_occurs = 0;
AXIS2_PARAM_CHECK(env->error, ele_node, NULL);
builder_impl = AXIS2_INTF_TO_IMPL(builder);
sch_ele = xml_schema_element_create(env);
om_ele = AXIOM_NODE_GET_DATA_ELEMENT(ele_node, env);
element_name = AXIOM_ELEMENT_GET_ATTRIBUTE_VALUE_BY_NAME(om_ele, env,
"name");
if(NULL != element_name)
{
XML_SCHEMA_ELEMENT_SET_NAME(sch_ele, env, element_name);
}
ele_form_default = XML_SCHEMA_GET_ELEMENT_FORM_DEFAULT(
builder_impl->schema, env);
form_value = XML_SCHEMA_ENUM_GET_VALUE(ele_form_default, env);
if(NULL != form_value &&
AXIS2_STRCMP(form_value, XML_SCHEMA_FORM_QUALIFIED) == 0)
{
is_qualified = AXIS2_TRUE;
}
attr_value = AXIOM_ELEMENT_GET_ATTRIBUTE_VALUE_BY_NAME(om_ele, env, "form");
if(NULL != attr_value)
{
void *form_def = NULL;
form_def = xml_schema_form_create(env, attr_value);
XML_SCHEMA_ELEMENT_SET_FORM(sch_ele, env, form_def);
if(AXIS2_STRCMP(attr_value, "qualified") == 0)
is_qualified = AXIS2_TRUE;
}
if(AXIS2_TRUE == is_qualified || AXIS2_TRUE == is_global)
ns = XML_SCHEMA_GET_TARGET_NAMESPACE(builder_impl->schema, env);
if(NULL != element_name)
{
axis2_qname_t *qn = NULL;
qn = axis2_qname_create(env, element_name, ns , NULL);
XML_SCHEMA_ELEMENT_SET_QNAME(sch_ele, env, qn);
}
ann_ele = axiom_util_get_first_child_element_with_uri_localname(om_ele, env,
ele_node, "annotation", XML_SCHEMA_NS, &ann_node);
if(NULL != ann_ele)
{
void *annotation = NULL;
annotation = handle_annotation_with_element(builder, env, ann_node);
XML_SCHEMA_ANNOTATED_SET_ANNOTATION(sch_ele, env, annotation);
}
attr_value = NULL;
if(NULL != (attr_value = AXIOM_ELEMENT_GET_ATTRIBUTE_VALUE_BY_NAME(om_ele, env, "type")) )
{
axis2_array_list_t *args = NULL;
axis2_char_t *namesp = NULL;
axis2_char_t *prefix = NULL;
axis2_array_list_t *last_list = NULL;
axis2_char_t *type_name = NULL;
axis2_qname_t *type_qname = NULL;
void *type = NULL;
args = axis2_tokenize(env, attr_value, ':');
if(AXIS2_ARRAY_LIST_SIZE(args, env) > 1)
{
axis2_hash_t *ht_ns = NULL;
axiom_namespace_t *ns = NULL;
ht_ns = AXIOM_ELEMENT_GET_NAMESPACES(om_ele, env);
prefix = AXIS2_ARRAY_LIST_GET(args, env, 0);
if(NULL != ht_ns)
{
ns = axis2_hash_get(ht_ns, prefix, AXIS2_HASH_KEY_STRING);
if(NULL != ns)
namesp = AXIOM_NAMESPACE_GET_URI(ns, env);
}
if(NULL == namesp)
{ /** namespace not found */
namesp = XML_SCHEMA_GET_NAMESPACE(builder_impl->schema,
env, prefix);
}
if(namesp == NULL)
{
/** TODO set error */
return NULL;
}
}
else
{
namesp = XML_SCHEMA_GET_NAMESPACE(builder_impl->schema,
env, "");
}
last_list = axis2_last_token(env, attr_value, ':');
type_name = AXIS2_ARRAY_LIST_GET(last_list, env, 1);
type_qname = axis2_qname_create(env, type_name, namesp, NULL);
XML_SCHEMA_ELEMENT_SET_SCHEMA_TYPE_QNAME(sch_ele, env, type_qname);
type = XML_SCHEMA_COLLECTION_GET_TYPE_BY_QNAME(
builder_impl->collection, env, type_qname);
if(NULL != type)
{
XML_SCHEMA_COLLECTION_ADD_UNRESOLVED_TYPE(
builder_impl->collection, env, type_qname, sch_ele);
}
XML_SCHEMA_ELEMENT_SET_SCHEMA_TYPE(sch_ele, env, type); }
else if(NULL != (attr_value = AXIOM_ELEMENT_GET_ATTRIBUTE_VALUE_BY_NAME(om_ele, env, "ref")))
{
axis2_array_list_t *args = NULL;
axis2_array_list_t *last_list = NULL;
axis2_char_t *ref_name = NULL;
axis2_char_t *args0 = NULL;
axis2_char_t *namesp = NULL;
axis2_hash_t *ht_ns = NULL;
axis2_qname_t *qn = NULL;
args = axis2_tokenize(env, attr_value, ':');
ht_ns = XML_SCHEMA_GET_PREFIX_TO_NAMESPACE_MAP(builder_impl->schema, env);
if(AXIS2_ARRAY_LIST_SIZE(args, env) > 0)
{
axis2_char_t *result = NULL;
args0 = AXIS2_ARRAY_LIST_GET(args, env, 0);
result = axis2_hash_get(ht_ns, args0, AXIS2_HASH_KEY_STRING);
if(!result)
{
/**TODO set error */
return NULL;
}
namesp = result;
}
else
{
namesp = XML_SCHEMA_GET_TARGET_NAMESPACE(builder_impl->schema, env);
}
last_list = axis2_last_token(env, attr_value, ':');
ref_name = AXIS2_ARRAY_LIST_GET(last_list, env, 1);
qn = axis2_qname_create(env, ref_name, namesp, NULL);
XML_SCHEMA_ELEMENT_SET_REF_NAME(sch_ele, env, qn);
XML_SCHEMA_ELEMENT_SET_NAME(sch_ele, env, ref_name);
}
if(NULL != (sim_type_ele = axiom_util_get_first_child_element_with_uri_localname(
om_ele, env, ele_node, "simpleType", XML_SCHEMA_NS, &sim_type_node)))
{
void *sim_type = NULL;
axis2_qname_t *qn = NULL;
sim_type = handle_simple_type(builder, env, sim_type_node, ele_node);
XML_SCHEMA_ELEMENT_SET_SCHEMA_TYPE(sch_ele, env, sim_type);
qn = XML_SCHEMA_TYPE_GET_QNAME(sim_type, env);
XML_SCHEMA_ELEMENT_SET_SCHEMA_TYPE_QNAME(sch_ele, env, qn);
}
else if(NULL != (com_type_ele = axiom_util_get_first_child_element_with_uri_localname(
om_ele, env, ele_node, "complexType", XML_SCHEMA_NS, &com_type_node)))
{
void *cmp_type = NULL;
cmp_type = handle_complex_type(builder, env, com_type_node, schema_node);
XML_SCHEMA_ELEMENT_SET_SCHEMA_TYPE(sch_ele, env, cmp_type);
}
else if(NULL != (key__ele = axiom_util_get_first_child_element_with_uri_localname(
om_ele, env, ele_node, "key", XML_SCHEMA_NS, &key_node)))
{
void *key = NULL;
xml_schema_obj_collection_t *constraints = NULL;
key = handle_constraint(builder, env, key_node, schema_node, XML_SCHEMA_KEY);
constraints = XML_SCHEMA_ELEMENT_GET_CONSTRAINTS(sch_ele, env);
XML_SCHEMA_OBJ_COLLECTION_ADD(constraints, env, key);
}
else if(NULL != (keyref_ele = axiom_util_get_first_child_element_with_uri_localname(
om_ele, env, ele_node, "keyref", XML_SCHEMA_NS, &keyref_node)))
{
void *keyref = NULL;
xml_schema_obj_collection_t *constraints = NULL;
axis2_char_t *attr_val = NULL;
keyref = handle_constraint(builder, env, keyref_node, schema_node, XML_SCHEMA_KEYREF);
constraints = XML_SCHEMA_ELEMENT_GET_CONSTRAINTS(sch_ele, env);
attr_val = AXIOM_ELEMENT_GET_ATTRIBUTE_VALUE_BY_NAME(om_ele, env, "keyref");
if(NULL != attr_val)
{
axis2_array_list_t *args = NULL;
axis2_array_list_t *last_list = NULL;
axis2_char_t *ref_name = NULL;
axis2_char_t *args0 = NULL;
axis2_char_t *namesp = NULL;
axis2_hash_t *ht_ns = NULL;
axis2_qname_t *qn = NULL;
args = axis2_tokenize(env, attr_val, ':');
ht_ns = XML_SCHEMA_GET_PREFIX_TO_NAMESPACE_MAP(builder_impl->schema, env);
if(AXIS2_ARRAY_LIST_SIZE(args, env) > 0)
{
axis2_char_t *result = NULL;
args0 = AXIS2_ARRAY_LIST_GET(args, env, 0);
result = axis2_hash_get(ht_ns, args0, AXIS2_HASH_KEY_STRING);
if(!result)
{
/**TODO set error */
return NULL;
}
namesp = result;
}
else
{
namesp = XML_SCHEMA_GET_TARGET_NAMESPACE(builder_impl->schema, env);
}
last_list = axis2_last_token(env, attr_val, ':');
ref_name = AXIS2_ARRAY_LIST_GET(last_list, env, 1);
qn = axis2_qname_create(env, ref_name, namesp, NULL);
XML_SCHEMA_IDENTITY_CONSTRAINT_SET_REFER(keyref, env, qn);
}
XML_SCHEMA_OBJ_COLLECTION_ADD(constraints, env, keyref);
}
else if(NULL != (unique_ele = axiom_util_get_first_child_element_with_uri_localname(
om_ele, env, ele_node, "unique", XML_SCHEMA_NS, &unique_node)))
{
void *unique = NULL;
xml_schema_obj_collection_t *constraints = NULL;
unique = handle_constraint(builder, env, unique_node, schema_node, XML_SCHEMA);
constraints = XML_SCHEMA_ELEMENT_GET_CONSTRAINTS(sch_ele, env);
XML_SCHEMA_OBJ_COLLECTION_ADD(constraints, env, unique);
}
attr_value = NULL;
if(NULL != (attr_value = AXIOM_ELEMENT_GET_ATTRIBUTE_VALUE_BY_NAME(om_ele, env, "abstract")))
{
if(AXIS2_STRCMP(attr_value,"true") == 0)
XML_SCHEMA_ELEMENT_SET_ABSTRACT(sch_ele, env, AXIS2_TRUE);
else if(AXIS2_STRCMP(attr_value,"false") == 0)
XML_SCHEMA_ELEMENT_SET_ABSTRACT(sch_ele, env, AXIS2_FALSE);
attr_value = NULL;
}
if(NULL != (attr_value = AXIOM_ELEMENT_GET_ATTRIBUTE_VALUE_BY_NAME(om_ele, env, "block")))
{
void *block = NULL;
block = get_derivation(env, ele_node, "block");
XML_SCHEMA_ELEMENT_SET_BLOCK(sch_ele, env, block);
attr_value = NULL;
}
if(NULL != (attr_value = AXIOM_ELEMENT_GET_ATTRIBUTE_VALUE_BY_NAME(om_ele, env, "default")))
{
XML_SCHEMA_ELEMENT_SET_DEFAULT_VALUE(sch_ele, env, attr_value);
attr_value = NULL;
}
if(NULL != (attr_value = AXIOM_ELEMENT_GET_ATTRIBUTE_VALUE_BY_NAME(om_ele, env, "final")))
{
void *final_drv = NULL;
final_drv = get_derivation(env, ele_node, "final");
XML_SCHEMA_ELEMENT_SET_FINAL(sch_ele, env, final_drv);
attr_value = NULL;
}
if(NULL != (attr_value = AXIOM_ELEMENT_GET_ATTRIBUTE_VALUE_BY_NAME(om_ele, env, "fixed")))
{
XML_SCHEMA_ELEMENT_SET_FIXED_VALUE(sch_ele, env, attr_value);
attr_value = NULL;
}
if(NULL != (attr_value = AXIOM_ELEMENT_GET_ATTRIBUTE_VALUE_BY_NAME(om_ele, env, "id")))
{
XML_SCHEMA_ANNOTATED_SET_ID(sch_ele, env, attr_value);
attr_value = NULL;
}
if(NULL != (attr_value = AXIOM_ELEMENT_GET_ATTRIBUTE_VALUE_BY_NAME(om_ele, env, "nillable")))
{
if(AXIS2_STRCMP(attr_value,"true") == 0)
XML_SCHEMA_ELEMENT_SET_NILLABLE(sch_ele, env, AXIS2_TRUE);
else if(AXIS2_STRCMP(attr_value,"false") == 0)
XML_SCHEMA_ELEMENT_SET_NILLABLE(sch_ele, env, AXIS2_FALSE);
attr_value = NULL;
}
max_occurs = get_max_occurs(env, ele_node);
min_occurs = get_min_occurs(env, ele_node);
XML_SCHEMA_PARTICLE_SET_MAX_OCCURS(sch_ele, env, max_occurs);
XML_SCHEMA_PARTICLE_SET_MIN_OCCURS(sch_ele, env, min_occurs);
return sch_ele;
}
/*
static axis2_status_t
populate_element_namespaces(
xml_schema_builder_t *builder,
const axis2_env_t *env,
axiom_node_t *ele_node,
axis2_hash_t* ele_to_ns_map)
{
axiom_element_t *ele = NULL;
axis2_hash_t *ns_hash = NULL;
AXIS2_PARAM_CHECK(env->error, ele_node, AXIS2_FAILURE);
AXIS2_PARAM_CHECK(env->error, ele_to_ns_map, AXIS2_FAILURE);
ele = (axiom_element_t*)AXIOM_NODE_GET_DATA_ELEMENT(ele_node, env);
ns_hash = AXIOM_ELEMENT_GET_NAMESPACES(ele, env);
if(NULL != ns_hash)
{
axis2_hash_index_t *hi = NULL;
for(hi = axis2_hash_first(ns_hash, env);
hi; hi = axis2_hash_next(env, hi))
{
void *val = NULL;
axis2_hash_this(hi, NULL, NULL, &val);
if(NULL != val)
{
axiom_namespace_t *ns = NULL;
axis2_char_t *uri = NULL;
axis2_char_t *prefix = NULL;
ns = (axiom_namespace_t*)val;
uri = AXIOM_NAMESPACE_GET_URI(ns, env);
prefix = AXIOM_NAMESPACE_GET_PREFIX(ns, env);
axis2_hash_set(ele_to_ns_map, AXIS2_STRDUP(prefix, env),
AXIS2_HASH_KEY_STRING, AXIS2_STRDUP(uri, env));
}
}
}
return AXIS2_SUCCESS;
}
*/
static xml_schema_identity_constraint_t*
handle_constraint(
xml_schema_builder_t *builder,
const axis2_env_t *env,
axiom_node_t *cnst_node,
axiom_node_t *schema_node,
int type)
{
void *constraint = NULL;
axiom_element_t *cnst_ele = NULL;
axis2_char_t *attr_value = NULL;
xml_schema_builder_impl_t *builder_impl = NULL;
axiom_element_t *ele1 = NULL;
axiom_node_t *node1 = NULL;
axis2_char_t *localname = NULL;
if(type == XML_SCHEMA_KEY)
{
constraint = xml_schema_key_create(env);
}
else if(type == XML_SCHEMA_KEYREF)
{
constraint = xml_schema_keyref_create(env);
}
else if(type == XML_SCHEMA_UNIQUE)
{
constraint = xml_schema_unique_create(env);
}
else
{ return NULL;
}
builder_impl = AXIS2_INTF_TO_IMPL(builder);
cnst_ele = (axiom_element_t*)AXIOM_NODE_GET_DATA_ELEMENT(cnst_node, env);
attr_value = AXIOM_ELEMENT_GET_ATTRIBUTE_VALUE_BY_NAME(cnst_ele, env, "name");
if(NULL != attr_value)
XML_SCHEMA_IDENTITY_CONSTRAINT_SET_NAME(constraint, env, attr_value);
attr_value = NULL;
attr_value = AXIOM_ELEMENT_GET_ATTRIBUTE_VALUE_BY_NAME(cnst_ele, env, "refer");
if(NULL != attr_value)
{
axis2_array_list_t *ns_from_ele = NULL;
axis2_array_list_t *last_list = NULL;
axis2_char_t *ns = NULL;
axis2_char_t *name = NULL;
axis2_qname_t *qname = NULL;
ns_from_ele = axis2_tokenize(env, attr_value, ':');
/** check this */
if(NULL != ns_from_ele && AXIS2_ARRAY_LIST_SIZE(ns_from_ele, env) > 1)
{
axis2_char_t *ns1 = NULL;
axis2_hash_t *namespaces_ht = NULL;
ns1 = AXIS2_ARRAY_LIST_GET(ns_from_ele, env, 0);
namespaces_ht =
XML_SCHEMA_GET_PREFIX_TO_NAMESPACE_MAP(builder_impl->schema, env);
ns = axis2_hash_get(namespaces_ht, ns1, AXIS2_HASH_KEY_STRING);
}
else
{
ns = XML_SCHEMA_GET_TARGET_NAMESPACE(builder_impl->schema, env);
}
last_list = axis2_last_token(env, attr_value, ':');
name = AXIS2_ARRAY_LIST_GET(last_list, env, 1);
XML_SCHEMA_IDENTITY_CONSTRAINT_SET_NAME(constraint, env, name);
qname = axis2_qname_create(env, name, ns, NULL);
XML_SCHEMA_IDENTITY_CONSTRAINT_SET_REFER(constraint, env, qname);
}
ele1 = axiom_util_get_first_child_element_with_uri(cnst_node, env,
XML_SCHEMA_NS, &node1);
while(NULL != ele1)
{
localname = AXIOM_ELEMENT_GET_LOCALNAME(ele1, env);
if(AXIS2_STRCMP(localname, "selector") == 0)
{
void *sel_xpath = NULL;
axiom_element_t *ann_ele = NULL;
axiom_node_t *ann_node = NULL;
axis2_char_t *attr_value = NULL;
sel_xpath = xml_schema_xpath_create(env);
attr_value = AXIOM_ELEMENT_GET_ATTRIBUTE_VALUE_BY_NAME(ele1, env, "xpath");
XML_SCHEMA_XPATH_SET_XPATH(sel_xpath, env, attr_value);
ann_ele = axiom_util_get_first_child_element_with_uri_localname(ele1,
env, node1 , "annotation", XML_SCHEMA_NS, &ann_node);
if(NULL != ann_ele)
{
void *annotation = handle_annotation_with_element(builder, env, ann_node);
XML_SCHEMA_ANNOTATED_SET_ANNOTATION(sel_xpath, env, annotation);
}
XML_SCHEMA_IDENTITY_CONSTRAINT_SET_SELECTOR(constraint, env, sel_xpath);
}
else if(AXIS2_STRCMP(localname, "field") == 0)
{
void *field_xpath = NULL;
axiom_element_t *ann_ele = NULL;
axiom_node_t *ann_node = NULL;
xml_schema_obj_collection_t *fields = NULL;
axis2_char_t *attr_value = NULL;
field_xpath = xml_schema_xpath_create(env);
attr_value = AXIOM_ELEMENT_GET_ATTRIBUTE_VALUE_BY_NAME(ele1, env, "xpath");
XML_SCHEMA_XPATH_SET_XPATH(field_xpath, env, attr_value);
fields = XML_SCHEMA_IDENTITY_CONSTRAINT_GET_FIELDS(constraint, env);
XML_SCHEMA_OBJ_COLLECTION_ADD(fields, env, field_xpath);
ann_ele = axiom_util_get_first_child_element_with_uri_localname(
ele1, env, node1, "annotation", XML_SCHEMA_NS, &ann_node);
if(NULL != ann_ele)
{
void *annotation = NULL;
annotation = handle_annotation_with_element(builder, env, ann_node);
XML_SCHEMA_ANNOTATED_SET_ANNOTATION(field_xpath, env, annotation);
}
}
else if(AXIS2_STRCMP(localname, "annotation") == 0)
{
void *constraint_annotation = handle_annotation_with_element(builder, env, node1);
XML_SCHEMA_ANNOTATED_SET_ANNOTATION(constraint, env, constraint_annotation);
}
ele1 = axiom_util_get_next_sibling_element_with_uri(node1, env,
XML_SCHEMA_NS, &node1);
}
return constraint;
}
static xml_schema_import_t*
handle_import(
xml_schema_builder_t *builder,
const axis2_env_t *env,
axiom_node_t *import_node,
axiom_node_t *schema_node)
{
void *import = NULL;
xml_schema_builder_impl_t *builder_impl = NULL;
axiom_element_t *ann_ele = NULL;
axiom_node_t* ann_node = NULL;
axiom_element_t *import_ele = NULL;
axis2_char_t *ns = NULL;
axis2_char_t *sch_location = NULL;
import_ele = (axiom_element_t*)AXIOM_NODE_GET_DATA_ELEMENT(import_node, env);
import = xml_schema_import_create(env);
builder_impl = AXIS2_INTF_TO_IMPL(builder);
ann_ele = axiom_util_get_first_child_element_with_uri_localname(import_ele, env,
import_node, "annotation", XML_SCHEMA_NS, &ann_node);
if(NULL != ann_ele)
{
void *import_ann = NULL;
import_ann = handle_annotation_with_element(builder, env, ann_node);
XML_SCHEMA_ANNOTATED_SET_ANNOTATION(import, env, import_ann);
}
ns = AXIOM_ELEMENT_GET_ATTRIBUTE_VALUE_BY_NAME(import_ele, env, "namespace");
sch_location = AXIOM_ELEMENT_GET_ATTRIBUTE_VALUE_BY_NAME(import_ele, env, "schemaLocation");
XML_SCHEMA_IMPORT_SET_NAMESPACE(import, env, ns);
XML_SCHEMA_EXTERNAL_SET_SCHEMA_LOCATION(import, env, sch_location);
if(NULL != sch_location && (AXIS2_STRCMP(sch_location, "") != 0))
{
axis2_char_t *source_uri = NULL;
source_uri = XML_SCHEMA_OBJ_GET_SOURCE_URI(builder_impl->schema, env);
if(NULL != source_uri)
{
void *schema = NULL;
schema = resolve_xml_schema_with_uri(builder , env, ns, sch_location, source_uri);
XML_SCHEMA_EXTERNAL_SET_SCHEMA(import, env, schema);
}
else
{
void *schema = NULL;
schema = resolve_xml_schema(builder, env, ns, sch_location);
XML_SCHEMA_EXTERNAL_SET_SCHEMA(import, env, schema);
}
}
return import;
}
static xml_schema_external_t *
handle_include(
xml_schema_builder_t *builder,
const axis2_env_t *env,
axiom_node_t *include_node,
axiom_node_t *schema_node)
{
void* include = NULL;
axiom_element_t *inc_ele= NULL;
axiom_element_t *ann_ele = NULL;
axiom_node_t *ann_node = NULL;
axis2_char_t *sch_location = NULL;
axis2_char_t *source_uri = NULL;
xml_schema_builder_impl_t *builder_impl = NULL;
void *sch = NULL;
AXIS2_PARAM_CHECK(env->error, include_node, NULL);
builder_impl = AXIS2_INTF_TO_IMPL(builder);
include = xml_schema_include_create(env);
inc_ele = AXIOM_NODE_GET_DATA_ELEMENT(include_node, env);
ann_ele = axiom_util_get_first_child_element_with_uri_localname(inc_ele, env,
include_node, "annotation", XML_SCHEMA_NS, &ann_node);
if(NULL != ann_ele)
{
void *include_annotation = NULL;
include_annotation = handle_annotation_with_element(builder, env, ann_node);
XML_SCHEMA_ANNOTATED_SET_ANNOTATION(include, env, include_annotation);
}
sch_location =
AXIOM_ELEMENT_GET_ATTRIBUTE_VALUE_BY_NAME(inc_ele, env, "schemaLocation");
source_uri = XML_SCHEMA_OBJ_GET_SOURCE_URI(builder_impl->schema, env);
if(NULL != source_uri)
{
sch_location = XML_SCHEMA_EXTERNAL_GET_SCHEMA_LOCATION(include, env);
sch = resolve_xml_schema_with_uri(builder, env, NULL, sch_location, source_uri);
XML_SCHEMA_EXTERNAL_SET_SCHEMA(include, env ,sch);
}
else
{
sch_location = XML_SCHEMA_EXTERNAL_GET_SCHEMA_LOCATION(include, env);
sch = resolve_xml_schema(builder, env, NULL, sch_location);
}
return include;
}
static xml_schema_annotation_t*
handle_annotation_with_element(
xml_schema_builder_t *builder,
const axis2_env_t *env,
axiom_node_t *ann_node)
{
xml_schema_obj_collection_t *content = NULL;
void *app_info_obj = NULL;
void *docs_obj = NULL;
axiom_element_t *ann_ele = NULL;
axiom_element_t* app_info_ele = NULL;
axiom_node_t* app_info_node = NULL;
axiom_element_t* doc_ele = NULL;
axiom_node_t* doc_node = NULL;
void *annotation = NULL;
annotation = xml_schema_annotation_create(env);
content = XML_SCHEMA_ANNOTATION_GET_ITEMS(annotation, env);
ann_ele = (axiom_element_t*)AXIOM_NODE_GET_DATA_ELEMENT(ann_node, env);
app_info_ele = axiom_util_get_first_child_element_with_uri_localname(
ann_ele, env, ann_node,"appinfo" ,XML_SCHEMA_NS, &app_info_node);
while(NULL != app_info_ele)
{
app_info_obj = handle_app_info(builder, env, app_info_node);
XML_SCHEMA_OBJ_COLLECTION_ADD(content, env, app_info_obj);
app_info_obj = NULL;
app_info_ele = axiom_util_get_next_sibling_element_with_uri_localname(app_info_ele, env,
app_info_node, "appinfo", XML_SCHEMA_NS, &app_info_node);
}
doc_ele = axiom_util_get_first_child_element_with_uri_localname(ann_ele, env,
ann_node, "documentation", XML_SCHEMA_NS, &doc_node);
while(NULL != doc_ele)
{
docs_obj = handle_documentation(builder, env, doc_node);
XML_SCHEMA_OBJ_COLLECTION_ADD(content, env, docs_obj);
docs_obj = NULL;
doc_ele = axiom_util_get_next_sibling_element_with_uri_localname(doc_ele, env,
doc_node, "documentation", XML_SCHEMA_NS, &doc_node);
}
return annotation;
}
static xml_schema_app_info_t*
handle_app_info(
xml_schema_builder_t *builder,
const axis2_env_t *env,
axiom_node_t *content)
{
void *app_info = NULL;
axiom_element_t *cnt_ele = NULL;
axiom_child_element_iterator_t *ele_iter = NULL;
axis2_char_t *attr_value = NULL;
AXIS2_PARAM_CHECK(env->error, content, NULL);
app_info = xml_schema_app_info_create(env);
cnt_ele = AXIOM_NODE_GET_DATA_ELEMENT(content, env);
ele_iter = axiom_util_get_child_elements(cnt_ele, env, content);
attr_value = AXIOM_ELEMENT_GET_ATTRIBUTE_VALUE_BY_NAME(cnt_ele, env, "source");
if(!ele_iter && !AXIOM_CHILD_ELEMENT_ITERATOR_HAS_NEXT(ele_iter, env))
return NULL;
XML_SCHEMA_APP_INFO_SET_SOURCE(app_info, env, attr_value);
XML_SCHEMA_APP_INFO_SET_MARKUP(app_info, env, ele_iter);
return app_info;
}
static xml_schema_documentation_t*
handle_documentation(
xml_schema_builder_t *builder,
const axis2_env_t *env,
axiom_node_t *content)
{
void *documentation = NULL;
axiom_child_element_iterator_t *ele_iter = NULL;
axiom_element_t *cnt_ele = NULL;
axis2_char_t *attr_value = NULL;
axis2_char_t *xmllang = NULL;
AXIS2_PARAM_CHECK(env->error, content, NULL);
documentation = xml_schema_documentation_create(env);
cnt_ele = (axiom_element_t*)
AXIOM_NODE_GET_DATA_ELEMENT(content, env);
ele_iter = axiom_util_get_child_elements(cnt_ele, env, content);
attr_value = AXIOM_ELEMENT_GET_ATTRIBUTE_VALUE_BY_NAME(cnt_ele, env, "source");
/** TODO check this */
xmllang = AXIOM_ELEMENT_GET_ATTRIBUTE_VALUE_BY_NAME(cnt_ele, env, "xml:lang");
if(!attr_value && !xmllang &&
(!ele_iter || !AXIOM_CHILD_ELEMENT_ITERATOR_NEXT(ele_iter, env)))
return NULL;
XML_SCHEMA_DOCUMENTATION_SET_SOURCE(documentation, env, attr_value);
XML_SCHEMA_DOCUMENTATION_SET_LANGUAGE(documentation, env, xmllang);
XML_SCHEMA_DOCUMENTATION_SET_MARKUP(documentation, env, ele_iter);
return documentation;
}
static long
get_min_occurs(
const axis2_env_t *env,
axiom_node_t *ele_node)
{
axis2_char_t *attr_value = NULL;
axiom_element_t *om_ele = NULL;
if(!ele_node || AXIOM_NODE_GET_NODE_TYPE(ele_node, env) != AXIOM_ELEMENT)
return AXIS2_FAILURE;
om_ele = (axiom_element_t*)
AXIOM_NODE_GET_DATA_ELEMENT(ele_node, env);
attr_value = AXIOM_ELEMENT_GET_ATTRIBUTE_VALUE_BY_NAME(om_ele, env, "minOccurs");
if(NULL != attr_value)
{
if(AXIS2_STRCMP(attr_value,"unbounded") == 0)
{
return LONG_MIN;
}
else
return atol(attr_value);
}
return -1;
}
static long
get_max_occurs(
const axis2_env_t *env,
axiom_node_t *ele_node)
{
axiom_element_t *om_ele = NULL;
axis2_char_t *attr_value = NULL;
if(!ele_node || AXIOM_NODE_GET_NODE_TYPE(ele_node, env) != AXIOM_ELEMENT)
return AXIS2_FAILURE;
om_ele = (axiom_element_t*)
AXIOM_NODE_GET_DATA_ELEMENT(ele_node, env);
attr_value = AXIOM_ELEMENT_GET_ATTRIBUTE_VALUE_BY_NAME(om_ele, env, "maxOccurs");
if(NULL != attr_value)
{
if(AXIS2_STRCMP(attr_value, "unbounded") == 0)
{
return LONG_MAX;
}
else
{
return atol(attr_value);
}
}
return 1;
}
static xml_schema_derivation_method_t*
get_derivation(
const axis2_env_t *env,
axiom_node_t *ele_node,
axis2_char_t *attr_name)
{
axis2_char_t *attr_value = NULL;
axiom_element_t *om_ele = NULL;
if(!ele_node || !attr_name)
return NULL;
if(AXIOM_NODE_GET_NODE_TYPE(ele_node, env) != AXIOM_ELEMENT)
return NULL;
om_ele = (axiom_element_t*)AXIOM_NODE_GET_DATA_ELEMENT(ele_node, env);
attr_value = AXIOM_ELEMENT_GET_ATTRIBUTE_VALUE_BY_NAME(om_ele, env, attr_name);
if(NULL != attr_value && AXIS2_STRCMP(attr_value,"") != 0)
{
/** TODO trim attr_value */
if(AXIS2_STRCMP(attr_value,"#all") == 0)
{
return xml_schema_derivation_method_create(env, XML_SCHEMA_CONST_ALL);
}
else
return xml_schema_derivation_method_create(env, attr_value);
}
else
return xml_schema_derivation_method_create(env, XML_SCHEMA_CONST_NONE);
}
static axis2_char_t *
get_enum_string(
xml_schema_builder_t *builder,
const axis2_env_t *env,
axiom_element_t *om_ele,
axis2_char_t *attr_name)
{
axis2_char_t *attr_value = NULL;
if(!om_ele && !attr_name)
return NULL;
attr_value = AXIOM_ELEMENT_GET_ATTRIBUTE_VALUE_BY_NAME(om_ele, env, attr_name);
if(NULL != attr_value)
{
axis2_char_t *atr_val = NULL;
atr_val = AXIS2_STRDUP(attr_value, env);
return (axis2_char_t*)AXIS2_STRTRIM(env, atr_val, NULL);
}
return XML_SCHEMA_CONST_NONE;
}
static axis2_bool_t
value_exist_in_hash(
const axis2_env_t *env,
axis2_hash_t *ht,
axis2_char_t *value)
{
void *val = NULL;
axis2_hash_index_t *hi = NULL;
if(!value || !ht)
return AXIS2_FALSE;
for(hi = axis2_hash_first(ht, env); hi;
hi = axis2_hash_next( env, hi))
{
axis2_hash_this(hi, NULL, NULL, &val);
if(NULL != val )
{
axis2_char_t *htvalue = NULL;
htvalue = (axis2_char_t *)val;
if(AXIS2_STRCMP(value, htvalue) == 0)
return AXIS2_TRUE;
}
}
return AXIS2_FALSE;
}
static xml_schema_form_t*
get_from_default(
const axis2_env_t *env,
axiom_node_t *ele_node,
axis2_char_t *attr_name)
{
axiom_element_t *om_ele = NULL;
if(NULL != ele_node &&
AXIOM_NODE_GET_NODE_TYPE(ele_node , env) == AXIOM_ELEMENT)
{
axis2_char_t *value = NULL;
om_ele = (axiom_element_t*)AXIOM_NODE_GET_DATA_ELEMENT(ele_node, env);
value = AXIOM_ELEMENT_GET_ATTRIBUTE_VALUE_BY_NAME(om_ele, env, attr_name);
if(NULL != value)
return xml_schema_form_create(env, value);
else
return xml_schema_form_create(env, "unqualified");
}
return NULL;
}
static xml_schema_t *
resolve_xml_schema(
xml_schema_builder_t *builder,
const axis2_env_t *env,
axis2_char_t *target_namespace,
axis2_char_t *schema_location)
{
axis2_char_t *base_uri = NULL;
xml_schema_builder_impl_t *builder_impl = NULL;
builder_impl = AXIS2_INTF_TO_IMPL(builder);
base_uri = XML_SCHEMA_COLLECTION_GET_BASE_URI(
builder_impl->collection, env);
return resolve_xml_schema_with_uri(builder,env,
target_namespace, schema_location, base_uri);
}
static xml_schema_t *
resolve_xml_schema_with_uri(
xml_schema_builder_t *builder,
const axis2_env_t *env,
axis2_char_t *target_namespace,
axis2_char_t *schema_location,
axis2_char_t *base_uri)
{
axiom_xml_reader_t *xml_reader = NULL;
axiom_document_t *om_doc = NULL;
axiom_stax_builder_t *om_builder = NULL;
xml_schema_t *schema = NULL;
xml_schema_builder_impl_t *sch_builder_impl = NULL;
xml_schema_input_source_t *input_source = NULL;
axis2_char_t *system_id = NULL;
sch_builder_impl = AXIS2_INTF_TO_IMPL(builder);
input_source = xml_schema_url_resolver_resolve_entity(env,
target_namespace, schema_location, base_uri);
if(!sch_builder_impl->collection)
return NULL;
if(NULL != input_source)
{
system_id = XML_SCHEMA_INPUT_SOURCE_GET_SYSTEM_ID(input_source, env);
if(NULL != system_id)
{
schema = XML_SCHEMA_COLLECTION_GET_SCHEMA(
sch_builder_impl->collection, env, system_id);
}
}
else
{
return NULL;
}
if(NULL != schema)
{
return schema;
}
xml_reader = axiom_xml_reader_create_for_file(env, system_id, NULL);
if(!xml_reader)
return NULL;
om_builder = axiom_stax_builder_create(env, xml_reader);
if(!om_builder)
return NULL;
om_doc = axiom_document_create(env, NULL, om_builder);
AXIOM_DOCUMENT_BUILD_ALL(om_doc, env);
return XML_SCHEMA_COLLECTION_READ_DOCUMENT_WITH_URI(
sch_builder_impl->collection , env, om_doc, base_uri);
}