You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commons-dev@ws.apache.org by ro...@apache.org on 2008/09/25 18:41:12 UTC
svn commit: r699014 [2/2] -
/webservices/commons/trunk/modules/XmlSchema/src/main/java/org/apache/ws/commons/schema/SchemaBuilder.java
Modified: webservices/commons/trunk/modules/XmlSchema/src/main/java/org/apache/ws/commons/schema/SchemaBuilder.java
URL: http://svn.apache.org/viewvc/webservices/commons/trunk/modules/XmlSchema/src/main/java/org/apache/ws/commons/schema/SchemaBuilder.java?rev=699014&r1=699013&r2=699014&view=diff
==============================================================================
--- webservices/commons/trunk/modules/XmlSchema/src/main/java/org/apache/ws/commons/schema/SchemaBuilder.java (original)
+++ webservices/commons/trunk/modules/XmlSchema/src/main/java/org/apache/ws/commons/schema/SchemaBuilder.java Thu Sep 25 09:41:11 2008
@@ -1,1928 +1,1980 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.ws.commons.schema;
-
-import org.apache.ws.commons.schema.XmlSchemaCollection.SchemaKey;
-import org.apache.ws.commons.schema.constants.Constants;
-import org.apache.ws.commons.schema.extensions.ExtensionRegistry;
-import org.apache.ws.commons.schema.utils.NodeNamespaceContext;
-import org.apache.ws.commons.schema.utils.TargetNamespaceValidator;
-import org.apache.ws.commons.schema.utils.XDOMUtil;
-import org.apache.ws.commons.schema.utils.DOMUtil;
-import org.w3c.dom.*;
-import org.xml.sax.InputSource;
-
-import javax.xml.namespace.NamespaceContext;
-import javax.xml.namespace.QName;
-import javax.xml.parsers.DocumentBuilderFactory;
-import java.util.StringTokenizer;
-import java.util.Vector;
-
-public class SchemaBuilder {
- Document doc;
- XmlSchema schema;
- XmlSchemaCollection collection;
- private final TargetNamespaceValidator validator;
- DocumentBuilderFactory docFac;
-
- /**
- * The extension registry to be used while building the
- * schema model
- */
- private ExtensionRegistry extReg = null;
-
- public ExtensionRegistry getExtReg() {
- return extReg;
- }
-
- public void setExtReg(ExtensionRegistry extReg) {
- this.extReg = extReg;
- }
-
- /**
- * Schema builder constructor
- * @param collection
- */
- SchemaBuilder(XmlSchemaCollection collection,
- TargetNamespaceValidator validator) {
- this.collection = collection;
- this.validator = validator;
-
- if (collection.getExtReg() != null) {
- this.extReg = collection.getExtReg();
- }
-
- schema = new XmlSchema();
- }
-
- /**
- * build method taking in a document and a validation handler
- * @param doc
- * @param uri
- * @param veh
- */
- XmlSchema build(Document doc, String uri, ValidationEventHandler veh) {
- Element schemaEl = doc.getDocumentElement();
- XmlSchema xmlSchema = handleXmlSchemaElement(schemaEl, uri);
- xmlSchema.setInputEncoding(DOMUtil.getInputEncoding(doc));
- return xmlSchema;
- }
-
- /**
- * handles the schema element
- * @param schemaEl
- * @param uri
- */
- XmlSchema handleXmlSchemaElement(Element schemaEl, String uri) {
- // get all the attributes along with the namespace declns
- schema.setNamespaceContext(new NodeNamespaceContext(schemaEl));
- setNamespaceAttributes(schema, schemaEl);
-
- XmlSchemaCollection.SchemaKey schemaKey = new XmlSchemaCollection.SchemaKey(
- schema.logicalTargetNamespace, uri);
- if (!collection.containsSchema(schemaKey)) {
- collection.addSchema(schemaKey, schema);
- schema.parent = collection; // establish parentage now.
- } else {
- throw new XmlSchemaException("Schema name conflict in collection. Namespace: " + schema.logicalTargetNamespace);
- }
-
- schema.setElementFormDefault(this.getFormDefault(schemaEl,
- "elementFormDefault"));
- schema.setAttributeFormDefault(this.getFormDefault(schemaEl,
- "attributeFormDefault"));
- schema.setBlockDefault(this.getDerivation(schemaEl, "blockDefault"));
- schema.setFinalDefault(this.getDerivation(schemaEl, "finalDefault"));
- /* set id attribute */
- if (schemaEl.hasAttribute("id")) {
- schema.id = schemaEl.getAttribute("id");
- }
-
- schema.setSourceURI(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
- * else if (annotation)
- * handleAnnotation
- */
-
- Element el = XDOMUtil.getFirstChildElementNS(schemaEl,
- XmlSchema.SCHEMA_NS);
- if (el == null
- && XDOMUtil.getFirstChildElementNS(schemaEl,
- "http://www.w3.org/1999/XMLSchema") != null) {
- throw new XmlSchemaException(
- "Schema defined using \"http://www.w3.org/1999/XMLSchema\" is not supported. "
- + "Please update the schema to the \""
- + XmlSchema.SCHEMA_NS + "\" namespace");
- }
- for (; el != null; el = XDOMUtil.getNextSiblingElementNS(el,
- XmlSchema.SCHEMA_NS)) {
-
- // String elPrefix = el.getPrefix() == null ? "" : el.getPrefix();
- //if(elPrefix.equals(schema.schema_ns_prefix)) {
- if (el.getLocalName().equals("simpleType")) {
- XmlSchemaType type = handleSimpleType(schema, el, schemaEl);
- schema.addType(type);
- schema.items.add(type);
- collection.resolveType(type.getQName(), type);
- } else if (el.getLocalName().equals("complexType")) {
- XmlSchemaType type = handleComplexType(schema, el, schemaEl);
- schema.addType(type);
- schema.items.add(type);
- collection.resolveType(type.getQName(), type);
- } else if (el.getLocalName().equals("element")) {
- XmlSchemaElement element = handleElement(schema, el, schemaEl,
- true);
- if (element.qualifiedName != null)
- schema.elements.collection.put(element.qualifiedName,
- element);
- else if (element.refName != null)
- schema.elements.collection.put(element.refName, element);
- schema.items.add(element);
- } else if (el.getLocalName().equals("include")) {
- XmlSchemaInclude include = handleInclude(schema, el, schemaEl);
- schema.includes.add(include);
- schema.items.add(include);
-
- } else if (el.getLocalName().equals("import")) {
- XmlSchemaImport schemaImport = handleImport(schema, el,
- schemaEl);
- schema.includes.add(schemaImport);
- schema.items.add(schemaImport);
-
- } else if (el.getLocalName().equals("group")) {
- XmlSchemaGroup group = handleGroup(schema, el, schemaEl);
- schema.groups.collection.put(group.name, group);
- schema.items.add(group);
- } else if (el.getLocalName().equals("attributeGroup")) {
- XmlSchemaAttributeGroup group = handleAttributeGroup(schema,
- el, schemaEl);
- schema.attributeGroups.collection.put(group.name, group);
- schema.items.add(group);
- } else if (el.getLocalName().equals("attribute")) {
- XmlSchemaAttribute attr = handleAttribute(schema, el, schemaEl,
- true); //pass true to indicate that it is a top level child
- schema.attributes.collection.put(attr.qualifiedName, attr);
- schema.items.add(attr);
- } else if (el.getLocalName().equals("redefine")) {
- XmlSchemaRedefine redefine = handleRedefine(schema, el,
- schemaEl);
- schema.includes.add(redefine);
- } else if (el.getLocalName().equals("notation")) {
- XmlSchemaNotation notation = handleNotation(el);
- schema.notations.collection.put(new QName(schema
- .getTargetNamespace(), notation.name), notation);
- schema.items.add(notation);
- } else if (el.getLocalName().equals("annotation")) {
- XmlSchemaAnnotation annotation = handleAnnotation(el);
- schema.setAnnotation(annotation);
- }
- }
-
- //add the extesibility components
- processExtensibilityComponents(schema, schemaEl);
-
- return schema;
- }
-
- private XmlSchemaNotation handleNotation(Element notationEl) {
-
- XmlSchemaNotation notation = new XmlSchemaNotation();
-
- if (notationEl.hasAttribute("id")) {
- notation.id = notationEl.getAttribute("id");
- }
-
- if (notationEl.hasAttribute("name")) {
- notation.name = notationEl.getAttribute("name");
- }
-
- if (notationEl.hasAttribute("public")) {
- notation.publicNotation = notationEl.getAttribute("public");
- }
-
- if (notationEl.hasAttribute("system")) {
- notation.system = notationEl.getAttribute("system");
- }
-
- Element annotationEl = XDOMUtil.getFirstChildElementNS(notationEl,
- XmlSchema.SCHEMA_NS, "annotation");
-
- if (annotationEl != null) {
- XmlSchemaAnnotation annotation = handleAnnotation(annotationEl);
- notation.setAnnotation(annotation);
- }
-
- return notation;
- }
-
- /**
- * Handle redefine
- * @param schema
- * @param redefineEl
- * @param schemaEl
- * @return
- */
- private XmlSchemaRedefine handleRedefine(XmlSchema schema,
- Element redefineEl, Element schemaEl) {
-
- XmlSchemaRedefine redefine = new XmlSchemaRedefine();
- redefine.schemaLocation = redefineEl.getAttribute("schemaLocation");
- final TargetNamespaceValidator validator = newIncludeValidator(schema);
-
- if (schema.getSourceURI() != null) {
- redefine.schema = resolveXmlSchema(schema.logicalTargetNamespace,
- redefine.schemaLocation, schema.getSourceURI(), validator);
- } else {
- redefine.schema = resolveXmlSchema(schema.logicalTargetNamespace,
- redefine.schemaLocation, validator);
- }
-
- /*
- * FIXME - This seems not right. Since the redefine should take into account
- * the attributes of the original element we cannot just build the type
- * defined in the redefine section - what we need to do is to get the original type
- * object and modify it. However one may argue (quite reasonably) that the purpose
- * of this object model is to provide just the representation and not the validation
- * (as it has been always the case)
- */
-
- for (Element el = XDOMUtil.getFirstChildElementNS(redefineEl,
- XmlSchema.SCHEMA_NS); el != null; el = XDOMUtil
- .getNextSiblingElementNS(el, XmlSchema.SCHEMA_NS)) {
-
- if (el.getLocalName().equals("simpleType")) {
- XmlSchemaType type = handleSimpleType(schema, el, schemaEl);
-
- redefine.schemaTypes.collection.put(type.getQName(), type);
- redefine.items.add(type);
- } else if (el.getLocalName().equals("complexType")) {
-
- XmlSchemaType type = handleComplexType(schema, el, schemaEl);
-
- redefine.schemaTypes.collection.put(type.getQName(), type);
- redefine.items.add(type);
- } else if (el.getLocalName().equals("group")) {
- XmlSchemaGroup group = handleGroup(schema, el, schemaEl);
- redefine.groups.collection.put(group.name, group);
- redefine.items.add(group);
- } else if (el.getLocalName().equals("attributeGroup")) {
- XmlSchemaAttributeGroup group = handleAttributeGroup(schema,
- el, schemaEl);
-
- redefine.attributeGroups.collection.put(group.name, group);
- redefine.items.add(group);
- } else if (el.getLocalName().equals("annotation")) {
- XmlSchemaAnnotation annotation = handleAnnotation(el);
- redefine.setAnnotation(annotation);
- }
- // }
- }
- return redefine;
- }
-
- void setNamespaceAttributes(XmlSchema schema, Element schemaEl) {
- //no targetnamespace found !
- if (schemaEl.getAttributeNode("targetNamespace") != null) {
- String contain = schemaEl.getAttribute("targetNamespace");
- schema.setTargetNamespace(contain);
- } else {
- //do nothing here
- }
- if (validator != null) {
- validator.validate(schema);
- }
- }
-
- /**
- * Handles simple types
- * @param schema
- * @param simpleEl
- * @param schemaEl
- */
- XmlSchemaSimpleType handleSimpleType(XmlSchema schema, Element simpleEl,
- Element schemaEl) {
- XmlSchemaSimpleType simpleType = new XmlSchemaSimpleType(schema);
- if (simpleEl.hasAttribute("name")) {
- simpleType.name = simpleEl.getAttribute("name");
- }
-
- if (simpleEl.hasAttribute("final")) {
- String finalstr = simpleEl.getAttribute("final");
-
- if (finalstr.equalsIgnoreCase("all")
- | finalstr.equalsIgnoreCase("#all"))
-
- simpleType.setFinal(new XmlSchemaDerivationMethod(
- Constants.BlockConstants.ALL));
- else
- simpleType.setFinal(new XmlSchemaDerivationMethod(finalstr));
- }
-
- Element simpleTypeAnnotationEl = XDOMUtil.getFirstChildElementNS(
- simpleEl, XmlSchema.SCHEMA_NS, "annotation");
-
- if (simpleTypeAnnotationEl != null) {
- XmlSchemaAnnotation simpleTypeAnnotation = handleAnnotation(simpleTypeAnnotationEl);
-
- simpleType.setAnnotation(simpleTypeAnnotation);
- }
-
- Element unionEl, listEl, restrictionEl;
-
- if ((restrictionEl = XDOMUtil.getFirstChildElementNS(simpleEl,
- XmlSchema.SCHEMA_NS, "restriction")) != null) {
-
- XmlSchemaSimpleTypeRestriction restriction = new XmlSchemaSimpleTypeRestriction();
-
- Element restAnnotationEl = XDOMUtil.getFirstChildElementNS(
- restrictionEl, XmlSchema.SCHEMA_NS, "annotation");
-
- if (restAnnotationEl != null) {
- XmlSchemaAnnotation restAnnotation = handleAnnotation(restAnnotationEl);
- restriction.setAnnotation(restAnnotation);
- }
- /** if (restriction has a base attribute )
- * set the baseTypeName and look up the base type
- * else if( restricion has a SimpleType Element as child)
- * get that element and do a handleSimpleType;
- * get the children of restriction other than annotation
- * and simpleTypes and construct facets from it;
- *
- * set the restriction has the content of the simpleType
- *
- **/
-
- Element inlineSimpleType = XDOMUtil.getFirstChildElementNS(
- restrictionEl, XmlSchema.SCHEMA_NS, "simpleType");
-
- if (restrictionEl.hasAttribute("base")) {
- NamespaceContext ctx = new NodeNamespaceContext(restrictionEl);
- restriction.baseTypeName = getRefQName(restrictionEl
- .getAttribute("base"), ctx);
- } else if (inlineSimpleType != null) {
-
- restriction.baseType = handleSimpleType(schema,
- inlineSimpleType, schemaEl);
- }
- for (Element el = XDOMUtil.getFirstChildElementNS(restrictionEl,
- XmlSchema.SCHEMA_NS); el != null; el = XDOMUtil
- .getNextSiblingElementNS(el, XmlSchema.SCHEMA_NS)) {
-
- if (!el.getLocalName().equals("annotation")
- && !el.getLocalName().equals("simpleType")) {
-
- XmlSchemaFacet facet = XmlSchemaFacet.construct(el);
- Element annotation = XDOMUtil.getFirstChildElementNS(el,
- XmlSchema.SCHEMA_NS, "annotation");
-
- if (annotation != null) {
- XmlSchemaAnnotation facetAnnotation = handleAnnotation(annotation);
- facet.setAnnotation(facetAnnotation);
- }
- restriction.facets.add(facet);
- }
-
- }
- simpleType.content = restriction;
-
- } else if ((listEl = XDOMUtil.getFirstChildElementNS(simpleEl,
- XmlSchema.SCHEMA_NS, "list")) != null) {
-
- XmlSchemaSimpleTypeList list = new XmlSchemaSimpleTypeList();
-
- /******
- * if( list has an itemType attribute )
- * set the baseTypeName and look up the base type
- * else if( list has a SimpleTypeElement as child)
- * get that element and do a handleSimpleType
- *
- * set the list has the content of the simpleType
- */
- Element inlineListType, listAnnotationEl;
- if (listEl.hasAttribute("itemType")) {
- String name = listEl.getAttribute("itemType");
- list.itemTypeName = getRefQName(name, listEl);
- } else if ((inlineListType = XDOMUtil.getFirstChildElementNS(
- listEl, XmlSchema.SCHEMA_NS, "simpleType")) != null) {
-
- list.itemType = handleSimpleType(schema, inlineListType,
- schemaEl);
- }
-
- if ((listAnnotationEl = XDOMUtil.getFirstChildElementNS(listEl,
- XmlSchema.SCHEMA_NS, "annotation")) != null) {
-
- XmlSchemaAnnotation listAnnotation = handleAnnotation(listAnnotationEl);
-
- list.setAnnotation(listAnnotation);
- }
- simpleType.content = list;
-
- } else if ((unionEl = XDOMUtil.getFirstChildElementNS(simpleEl,
- XmlSchema.SCHEMA_NS, "union")) != null) {
-
- XmlSchemaSimpleTypeUnion union = new XmlSchemaSimpleTypeUnion();
-
- /******
- * if( union has a memberTypes attribute )
- * add the memberTypeSources string
- * for (each memberType in the list )
- * lookup(memberType)
- * for( all SimpleType child Elements)
- * add the simpleTypeName (if any) to the memberType Sources
- * do a handleSimpleType with the simpleTypeElement
- */
- if (unionEl.hasAttribute("memberTypes")) {
- String memberTypes = unionEl.getAttribute("memberTypes");
- union.memberTypesSource = memberTypes;
- Vector v = new Vector();
- StringTokenizer tokenizer = new StringTokenizer(memberTypes,
- " ");
- while (tokenizer.hasMoreTokens()) {
- String member = tokenizer.nextToken();
- v.add(getRefQName(member, unionEl));
- }
- union.memberTypesQNames = new QName[v.size()];
- v.copyInto(union.memberTypesQNames);
- }
-
- Element inlineUnionType = XDOMUtil.getFirstChildElementNS(unionEl,
- XmlSchema.SCHEMA_NS, "simpleType");
- while (inlineUnionType != null) {
-
- XmlSchemaSimpleType unionSimpleType = handleSimpleType(schema,
- inlineUnionType, schemaEl);
-
- union.baseTypes.add(unionSimpleType);
-
- if (unionSimpleType.name != null) {
- union.memberTypesSource += " " + unionSimpleType.name;
- }
-
- inlineUnionType = XDOMUtil.getNextSiblingElementNS(
- inlineUnionType, XmlSchema.SCHEMA_NS, "simpleType");
- }
-
- //NodeList annotations = unionEl.getElementsByTagNameNS(
- //XmlSchema.SCHEMA_NS, "annotation");
- Element unionAnnotationEl = XDOMUtil.getFirstChildElementNS(
- unionEl, XmlSchema.SCHEMA_NS, "annotation");
-
- if (unionAnnotationEl != null) {
- XmlSchemaAnnotation unionAnnotation = handleAnnotation(unionAnnotationEl);
-
- union.setAnnotation(unionAnnotation);
- }
- simpleType.content = union;
- }
-
- //process extra attributes and elements
- processExtensibilityComponents(simpleType, simpleEl);
-
- return simpleType;
- }
-
- private QName getRefQName(String pName, Node pNode) {
- return getRefQName(pName, new NodeNamespaceContext(pNode));
- }
-
- private QName getRefQName(String pName, NamespaceContext pContext) {
- final int offset = pName.indexOf(':');
- String uri;
- final String localName;
- final String prefix;
- if (offset == -1) {
- uri = pContext.getNamespaceURI(Constants.DEFAULT_NS_PREFIX);
- if (Constants.NULL_NS_URI.equals(uri)) {
- return new QName(Constants.NULL_NS_URI, pName);
- }
- localName = pName;
- prefix = Constants.DEFAULT_NS_PREFIX;
- } else {
- prefix = pName.substring(0, offset);
- uri = pContext.getNamespaceURI(prefix);
- if (uri == null || Constants.NULL_NS_URI.equals(uri)) {
- if (schema.parent != null
- && schema.parent.getNamespaceContext() != null) {
- uri = schema.parent.getNamespaceContext().getNamespaceURI(
- prefix);
- }
- }
-
- if (uri == null || Constants.NULL_NS_URI.equals(uri)) {
- throw new IllegalStateException("The prefix " + prefix
- + " is not bound.");
- }
- localName = pName.substring(offset + 1);
- }
- return new QName(uri, localName, prefix);
- }
-
- /**
- * Handle complex types
- * @param schema
- * @param complexEl
- * @param schemaEl
- */
- XmlSchemaComplexType handleComplexType(XmlSchema schema, Element complexEl,
- Element schemaEl) {
-
- /******
- * set the complexTypeName if any
- * for( eachChildNode)
- * if ( simpleContent)
- * if( restrcition)
- * handle_simple_content_restriction
- * else if( extension)
- * handle_simple_content_extension
- * break; // it has to be the only child
- * else if( complexContent)
- * if( restriction)
- * handle_complex_content_restriction
- * else if( extension)
- * handle_complex_content_extension
- * break; // it has to be the only child
- * else if( group)
- * if( group has ref)
- * store the group name
- * else
- * handleGroup
- * else if( sequence )
- * handleSequence
- * else if( all )
- * handleAll
- * else if(choice)
- * handleChoice
- * else if(attribute)
- * handleAttribute
- * else if(attributeGroup)
- * handleAttributeGroup
- * else if(anyAttribute)
- * handleAnyAttribute
- */
-
- XmlSchemaComplexType ct = new XmlSchemaComplexType(schema);
-
- if (complexEl.hasAttribute("name")) {
-
- //String namespace = (schema.targetNamespace==null)?
- // "":schema.targetNamespace;
-
- ct.name = complexEl.getAttribute("name");
- }
- for (Element el = XDOMUtil.getFirstChildElementNS(complexEl,
- XmlSchema.SCHEMA_NS); el != null; el = XDOMUtil
- .getNextSiblingElementNS(el, XmlSchema.SCHEMA_NS)) {
-
- //String elPrefix = el.getPrefix() == null ? "" :
- //el.getPrefix();
- //if(elPrefix.equals(schema.schema_ns_prefix)) {
- if (el.getLocalName().equals("sequence")) {
- ct.particle = handleSequence(schema, el, schemaEl);
- } else if (el.getLocalName().equals("choice")) {
- ct.particle = handleChoice(schema, el, schemaEl);
- } else if (el.getLocalName().equals("all")) {
- ct.particle = handleAll(schema, el, schemaEl);
- } else if (el.getLocalName().equals("attribute")) {
- ct.attributes.add(handleAttribute(schema, el, schemaEl));
- } else if (el.getLocalName().equals("attributeGroup")) {
- ct.attributes.add(handleAttributeGroupRef(el));
- } else if (el.getLocalName().equals("group")) {
- XmlSchemaGroupRef group = handleGroupRef(schema, el, schemaEl);
- ct.particle = (group.particle == null) ? (XmlSchemaParticle) group
- : group.particle;
- } else if (el.getLocalName().equals("simpleContent")) {
- ct.contentModel = handleSimpleContent(schema, el, schemaEl);
- } else if (el.getLocalName().equals("complexContent")) {
- ct.contentModel = handleComplexContent(schema, el, schemaEl);
- } else if (el.getLocalName().equals("annotation")) {
- ct.setAnnotation(handleAnnotation(el));
- } else if (el.getLocalName().equals("anyAttribute")) {
- ct.setAnyAttribute(handleAnyAttribute(schema, el, schemaEl));
- }
- //}
- }
- if (complexEl.hasAttribute("block")) {
- String blockStr = complexEl.getAttribute("block");
- if (blockStr.equalsIgnoreCase("all")
- | blockStr.equalsIgnoreCase("#all")) {
-
- ct.setBlock(new XmlSchemaDerivationMethod(
- Constants.BlockConstants.ALL));
- } else
- ct.setBlock(new XmlSchemaDerivationMethod(blockStr));
- //ct.setBlock(new XmlSchemaDerivationMethod(block));
- }
- if (complexEl.hasAttribute("final")) {
- String finalstr = complexEl.getAttribute("final");
- if (finalstr.equalsIgnoreCase("all")
- | finalstr.equalsIgnoreCase("#all")) {
-
- ct.setFinal(new XmlSchemaDerivationMethod(
- Constants.BlockConstants.ALL));
- } else
- ct.setFinal(new XmlSchemaDerivationMethod(finalstr));
- }
- if (complexEl.hasAttribute("abstract")) {
- String abs = complexEl.getAttribute("abstract");
- if (abs.equalsIgnoreCase("true"))
- ct.setAbstract(true);
- else
- ct.setAbstract(false);
- }
- if (complexEl.hasAttribute("mixed")) {
- String mixed = complexEl.getAttribute("mixed");
- if (mixed.equalsIgnoreCase("true"))
- ct.setMixed(true);
- else
- ct.setMixed(false);
- }
-
- //process extra attributes and elements
- processExtensibilityComponents(ct, complexEl);
-
- return ct;
- }
-
- private XmlSchemaSimpleContent handleSimpleContent(XmlSchema schema,
- Element simpleEl, Element schemaEl) {
-
- XmlSchemaSimpleContent simpleContent = new XmlSchemaSimpleContent();
-
- for (Element el = XDOMUtil.getFirstChildElementNS(simpleEl,
- XmlSchema.SCHEMA_NS); el != null; el = XDOMUtil
- .getNextSiblingElementNS(el, XmlSchema.SCHEMA_NS)) {
-
- if (el.getLocalName().equals("restriction")) {
- simpleContent.content = handleSimpleContentRestriction(schema,
- el, schemaEl);
- } else if (el.getLocalName().equals("extension")) {
- simpleContent.content = handleSimpleContentExtension(schema,
- el, schemaEl);
- } else if (el.getLocalName().equals("annotation")) {
- simpleContent.setAnnotation(handleAnnotation(el));
- }
- }
- return simpleContent;
- }
-
- private XmlSchemaComplexContent handleComplexContent(XmlSchema schema,
- Element complexEl, Element schemaEl) {
-
- XmlSchemaComplexContent complexContent = new XmlSchemaComplexContent();
-
- for (Element el = XDOMUtil.getFirstChildElementNS(complexEl,
- XmlSchema.SCHEMA_NS); el != null; el = XDOMUtil
- .getNextSiblingElementNS(el, XmlSchema.SCHEMA_NS)) {
-
- if (el.getLocalName().equals("restriction")) {
- complexContent.content = handleComplexContentRestriction(
- schema, el, schemaEl);
- } else if (el.getLocalName().equals("extension")) {
- complexContent.content = handleComplexContentExtension(schema,
- el, schemaEl);
- } else if (el.getLocalName().equals("annotation")) {
- complexContent.setAnnotation(handleAnnotation(el));
- }
- }
-
- if (complexEl.hasAttribute("mixed")) {
- String mixed = complexEl.getAttribute("mixed");
- if (mixed.equalsIgnoreCase("true"))
- complexContent.setMixed(true);
- else
- complexContent.setMixed(false);
- }
-
- return complexContent;
- }
-
- private XmlSchemaSimpleContentRestriction handleSimpleContentRestriction(
- XmlSchema schema, Element restrictionEl, Element schemaEl) {
-
- XmlSchemaSimpleContentRestriction restriction = new XmlSchemaSimpleContentRestriction();
-
- if (restrictionEl.hasAttribute("base")) {
- String name = restrictionEl.getAttribute("base");
- restriction.baseTypeName = getRefQName(name, restrictionEl);
- }
-
- if (restrictionEl.hasAttribute("id"))
- restriction.id = restrictionEl.getAttribute("id");
-
- // check back simpleContent tag children to add attributes and simpleType if any occur
- for (Element el = XDOMUtil.getFirstChildElementNS(restrictionEl,
- XmlSchema.SCHEMA_NS); el != null; el = XDOMUtil
- .getNextSiblingElementNS(el, XmlSchema.SCHEMA_NS)) {
-
- if (el.getLocalName().equals("attribute")) {
- XmlSchemaAttribute attr = handleAttribute(schema, el, schemaEl);
- restriction.attributes.add(attr);
- } else if (el.getLocalName().equals("attributeGroup")) {
- XmlSchemaAttributeGroupRef attrGroup = handleAttributeGroupRef(el);
- restriction.attributes.add(attrGroup);
- } else if (el.getLocalName().equals("simpleType")) {
- restriction.baseType = handleSimpleType(schema, el, schemaEl);
- } else if (el.getLocalName().equals("anyAttribute")) {
- restriction.anyAttribute = handleAnyAttribute(schema, el,
- schemaEl);
- } else if (el.getLocalName().equals("annotation")) {
- restriction.setAnnotation(handleAnnotation(el));
- } else {
- XmlSchemaFacet facet = XmlSchemaFacet.construct(el);
- NodeList annotations = el.getElementsByTagNameNS(
- XmlSchema.SCHEMA_NS, "annotation");
-
- if (annotations.getLength() > 0) {
- XmlSchemaAnnotation facetAnnotation = handleAnnotation(el);
- facet.setAnnotation(facetAnnotation);
- }
- restriction.facets.add(facet);
- }
- }
- return restriction;
- }
-
- private XmlSchemaSimpleContentExtension handleSimpleContentExtension(
- XmlSchema schema, Element extEl, Element schemaEl) {
-
- XmlSchemaSimpleContentExtension ext = new XmlSchemaSimpleContentExtension();
-
- if (extEl.hasAttribute("base")) {
- String name = extEl.getAttribute("base");
- ext.baseTypeName = getRefQName(name, extEl);
- }
-
- for (Element el = XDOMUtil.getFirstChildElementNS(extEl,
- XmlSchema.SCHEMA_NS); el != null; el = XDOMUtil
- .getNextSiblingElementNS(el, XmlSchema.SCHEMA_NS)) {
-
- if (el.getLocalName().equals("attribute")) {
- XmlSchemaAttribute attr = handleAttribute(schema, el, schemaEl);
- ext.attributes.add(attr);
- } else if (el.getLocalName().equals("attributeGroup")) {
- XmlSchemaAttributeGroupRef attrGroup = handleAttributeGroupRef(el);
- ext.attributes.add(attrGroup);
- } else if (el.getLocalName().equals("anyAttribute")) {
- ext.anyAttribute = handleAnyAttribute(schema, el, schemaEl);
- } else if (el.getLocalName().equals("annotation")) {
- XmlSchemaAnnotation ann = handleAnnotation(el);
- ext.setAnnotation(ann);
- }
- }
- return ext;
- }
-
- private XmlSchemaComplexContentRestriction handleComplexContentRestriction(
- XmlSchema schema, Element restrictionEl, Element schemaEl) {
-
- XmlSchemaComplexContentRestriction restriction = new XmlSchemaComplexContentRestriction();
-
- if (restrictionEl.hasAttribute("base")) {
- String name = restrictionEl.getAttribute("base");
- restriction.baseTypeName = getRefQName(name, restrictionEl);
- }
- for (Element el = XDOMUtil.getFirstChildElementNS(restrictionEl,
- XmlSchema.SCHEMA_NS); el != null; el = XDOMUtil
- .getNextSiblingElementNS(el, XmlSchema.SCHEMA_NS)) {
-
- if (el.getLocalName().equals("sequence")) {
- restriction.particle = handleSequence(schema, el, schemaEl);
- } else if (el.getLocalName().equals("choice")) {
- restriction.particle = handleChoice(schema, el, schemaEl);
- } else if (el.getLocalName().equals("all")) {
- restriction.particle = handleAll(schema, el, schemaEl);
- } else if (el.getLocalName().equals("attribute")) {
- restriction.attributes
- .add(handleAttribute(schema, el, schemaEl));
- } else if (el.getLocalName().equals("attributeGroup")) {
- restriction.attributes.add(handleAttributeGroupRef(el));
- } else if (el.getLocalName().equals("group")) {
- restriction.particle = handleGroupRef(schema, el, schemaEl);
- } else if (el.getLocalName().equals("anyAttribute")) {
- restriction.anyAttribute = handleAnyAttribute(schema, el,
- schemaEl);
- } else if (el.getLocalName().equals("annotation")) {
- restriction.setAnnotation(handleAnnotation(el));
- }
- }
- return restriction;
- }
-
- private XmlSchemaComplexContentExtension handleComplexContentExtension(
- XmlSchema schema, Element extEl, Element schemaEl) {
-
- XmlSchemaComplexContentExtension ext = new XmlSchemaComplexContentExtension();
-
- if (extEl.hasAttribute("base")) {
- String name = extEl.getAttribute("base");
- ext.baseTypeName = getRefQName(name, extEl);
- }
-
- for (Element el = XDOMUtil.getFirstChildElementNS(extEl,
- XmlSchema.SCHEMA_NS); el != null; el = XDOMUtil
- .getNextSiblingElementNS(el, XmlSchema.SCHEMA_NS)) {
-
- if (el.getLocalName().equals("sequence")) {
- ext.particle = handleSequence(schema, el, schemaEl);
- } else if (el.getLocalName().equals("choice")) {
- ext.particle = handleChoice(schema, el, schemaEl);
- } else if (el.getLocalName().equals("all")) {
- ext.particle = handleAll(schema, el, schemaEl);
- } else if (el.getLocalName().equals("attribute")) {
- ext.attributes.add(handleAttribute(schema, el, schemaEl));
- } else if (el.getLocalName().equals("attributeGroup")) {
- ext.attributes.add(handleAttributeGroupRef(el));
- } else if (el.getLocalName().equals("group")) {
- ext.particle = handleGroupRef(schema, el, schemaEl);
- } else if (el.getLocalName().equals("anyAttribute")) {
- ext.anyAttribute = handleAnyAttribute(schema, el, schemaEl);
- } else if (el.getLocalName().equals("annotation")) {
- ext.setAnnotation(handleAnnotation(el));
- }
- }
- return ext;
- }
-
- private XmlSchemaAttributeGroupRef handleAttributeGroupRef(
- Element attrGroupEl) {
-
- XmlSchemaAttributeGroupRef attrGroup = new XmlSchemaAttributeGroupRef();
-
- if (attrGroupEl.hasAttribute("ref")) {
- String ref = attrGroupEl.getAttribute("ref");
- attrGroup.refName = getRefQName(ref, attrGroupEl);
- }
-
- if (attrGroupEl.hasAttribute("id"))
- attrGroup.id = attrGroupEl.getAttribute("id");
-
- Element annotationEl = XDOMUtil.getFirstChildElementNS(attrGroupEl,
- XmlSchema.SCHEMA_NS, "annotation");
-
- if (annotationEl != null) {
- XmlSchemaAnnotation annotation = handleAnnotation(annotationEl);
- attrGroup.setAnnotation(annotation);
- }
- return attrGroup;
- }
-
- private XmlSchemaSequence handleSequence(XmlSchema schema,
- Element sequenceEl, Element schemaEl) {
-
- XmlSchemaSequence sequence = new XmlSchemaSequence();
-
- //handle min and max occurences
- sequence.minOccurs = getMinOccurs(sequenceEl);
- sequence.maxOccurs = getMaxOccurs(sequenceEl);
-
- for (Element el = XDOMUtil.getFirstChildElementNS(sequenceEl,
- XmlSchema.SCHEMA_NS); el != null; el = XDOMUtil
- .getNextSiblingElementNS(el, XmlSchema.SCHEMA_NS)) {
-
- if (el.getLocalName().equals("sequence")) {
- XmlSchemaSequence seq = handleSequence(schema, el, schemaEl);
- sequence.items.add(seq);
- } else if (el.getLocalName().equals("element")) {
- XmlSchemaElement element = handleElement(schema, el, schemaEl,
- false);
- sequence.items.add(element);
- } else if (el.getLocalName().equals("group")) {
- XmlSchemaGroupRef group = handleGroupRef(schema, el, schemaEl);
- sequence.items.add(group);
- } else if (el.getLocalName().equals("choice")) {
- XmlSchemaChoice choice = handleChoice(schema, el, schemaEl);
- sequence.items.add(choice);
- } else if (el.getLocalName().equals("any")) {
- XmlSchemaAny any = handleAny(schema, el, schemaEl);
- sequence.items.add(any);
- } else if (el.getLocalName().equals("annotation")) {
- XmlSchemaAnnotation annotation = handleAnnotation(el);
- sequence.setAnnotation(annotation);
- }
- }
- return sequence;
- }
-
- /** @noinspection UnusedParameters*/
- private XmlSchemaAny handleAny(XmlSchema schema, Element anyEl,
- Element schemaEl) {
-
- XmlSchemaAny any = new XmlSchemaAny();
-
- if (anyEl.hasAttribute("namespace"))
- any.namespace = anyEl.getAttribute("namespace");
-
- if (anyEl.hasAttribute("processContents")) {
- String processContent = getEnumString(anyEl, "processContents");
-
- any.processContent = new XmlSchemaContentProcessing(processContent);
- }
-
- Element annotationEl = XDOMUtil.getFirstChildElementNS(anyEl,
- XmlSchema.SCHEMA_NS, "annotation");
-
- if (annotationEl != null) {
- XmlSchemaAnnotation annotation = handleAnnotation(annotationEl);
- any.setAnnotation(annotation);
- }
- any.minOccurs = getMinOccurs(anyEl);
- any.maxOccurs = getMaxOccurs(anyEl);
-
- return any;
- }
-
- private XmlSchemaChoice handleChoice(XmlSchema schema, Element choiceEl,
- Element schemaEl) {
- XmlSchemaChoice choice = new XmlSchemaChoice();
-
- if (choiceEl.hasAttribute("id"))
- choice.id = choiceEl.getAttribute("id");
-
- choice.minOccurs = getMinOccurs(choiceEl);
- choice.maxOccurs = getMaxOccurs(choiceEl);
-
- for (Element el = XDOMUtil.getFirstChildElementNS(choiceEl,
- XmlSchema.SCHEMA_NS); el != null; el = XDOMUtil
- .getNextSiblingElementNS(el, XmlSchema.SCHEMA_NS)) {
-
- if (el.getLocalName().equals("sequence")) {
- XmlSchemaSequence seq = handleSequence(schema, el, schemaEl);
- choice.items.add(seq);
- } else if (el.getLocalName().equals("element")) {
- XmlSchemaElement element = handleElement(schema, el, schemaEl,
- false);
- choice.items.add(element);
- } else if (el.getLocalName().equals("group")) {
- XmlSchemaGroupRef group = handleGroupRef(schema, el, schemaEl);
- choice.items.add(group);
- } else if (el.getLocalName().equals("choice")) {
- XmlSchemaChoice choiceItem = handleChoice(schema, el, schemaEl);
- choice.items.add(choiceItem);
- } else if (el.getLocalName().equals("any")) {
- XmlSchemaAny any = handleAny(schema, el, schemaEl);
- choice.items.add(any);
- } else if (el.getLocalName().equals("annotation")) {
- XmlSchemaAnnotation annotation = handleAnnotation(el);
- choice.setAnnotation(annotation);
- }
- }
- return choice;
- }
-
- private XmlSchemaAll handleAll(XmlSchema schema, Element allEl,
- Element schemaEl) {
-
- XmlSchemaAll all = new XmlSchemaAll();
-
- //handle min and max occurences
- all.minOccurs = getMinOccurs(allEl);
- all.maxOccurs = getMaxOccurs(allEl);
-
- for (Element el = XDOMUtil.getFirstChildElementNS(allEl,
- XmlSchema.SCHEMA_NS); el != null; el = XDOMUtil
- .getNextSiblingElementNS(el, XmlSchema.SCHEMA_NS)) {
-
- if (el.getLocalName().equals("element")) {
- XmlSchemaElement element = handleElement(schema, el, schemaEl,
- false);
- all.items.add(element);
- } else if (el.getLocalName().equals("annotation")) {
- XmlSchemaAnnotation annotation = handleAnnotation(el);
- all.setAnnotation(annotation);
- }
- }
- return all;
- }
-
- private XmlSchemaGroup handleGroup(XmlSchema schema, Element groupEl,
- Element schemaEl) {
-
- XmlSchemaGroup group = new XmlSchemaGroup();
- group.name = new QName(schema.getTargetNamespace(), groupEl
- .getAttribute("name"));
-
- for (Element el = XDOMUtil.getFirstChildElementNS(groupEl,
- XmlSchema.SCHEMA_NS); el != null; el = XDOMUtil
- .getNextSiblingElementNS(el, XmlSchema.SCHEMA_NS)) {
-
- if (el.getLocalName().equals("all")) {
- group.particle = handleAll(schema, el, schemaEl);
- } else if (el.getLocalName().equals("sequence")) {
- group.particle = handleSequence(schema, el, schemaEl);
- } else if (el.getLocalName().equals("choice")) {
- group.particle = handleChoice(schema, el, schemaEl);
- } else if (el.getLocalName().equals("annotation")) {
- XmlSchemaAnnotation groupAnnotation = handleAnnotation(el);
- group.setAnnotation(groupAnnotation);
- }
- }
- return group;
- }
-
- private XmlSchemaAttributeGroup handleAttributeGroup(XmlSchema schema,
- Element groupEl, Element schemaEl) {
- XmlSchemaAttributeGroup attrGroup = new XmlSchemaAttributeGroup();
-
- if (groupEl.hasAttribute("name"))
- attrGroup.name = new QName(schema.getTargetNamespace(), groupEl
- .getAttribute("name"));
- if (groupEl.hasAttribute("id"))
- attrGroup.id = groupEl.getAttribute("id");
-
- for (Element el = XDOMUtil.getFirstChildElementNS(groupEl,
- XmlSchema.SCHEMA_NS); el != null; el = XDOMUtil
- .getNextSiblingElementNS(el, XmlSchema.SCHEMA_NS)) {
-
- if (el.getLocalName().equals("attribute")) {
- XmlSchemaAttribute attr = handleAttribute(schema, el, schemaEl);
- attrGroup.attributes.add(attr);
- } else if (el.getLocalName().equals("attributeGroup")) {
- XmlSchemaAttributeGroupRef attrGroupRef = handleAttributeGroupRef(el);
- attrGroup.attributes.add(attrGroupRef);
- } else if (el.getLocalName().equals("anyAttribute")) {
- attrGroup.anyAttribute = handleAnyAttribute(schema, el,
- schemaEl);
- } else if (el.getLocalName().equals("annotation")) {
- XmlSchemaAnnotation ann = handleAnnotation(el);
- attrGroup.setAnnotation(ann);
- }
- }
- return attrGroup;
- }
-
- /** @noinspection UnusedParameters*/
- private XmlSchemaAnyAttribute handleAnyAttribute(XmlSchema schema,
- Element anyAttrEl, Element schemaEl) {
-
- XmlSchemaAnyAttribute anyAttr = new XmlSchemaAnyAttribute();
-
- if (anyAttrEl.hasAttribute("namespace"))
- anyAttr.namespace = anyAttrEl.getAttribute("namespace");
-
- if (anyAttrEl.hasAttribute("processContents")) {
-
- String contentProcessing = getEnumString(anyAttrEl,
- "processContents");
-
- anyAttr.processContent = new XmlSchemaContentProcessing(
- contentProcessing);
- }
- if (anyAttrEl.hasAttribute("id"))
- anyAttr.id = anyAttrEl.getAttribute("id");
-
- Element annotationEl = XDOMUtil.getFirstChildElementNS(anyAttrEl,
- XmlSchema.SCHEMA_NS, "annotation");
-
- if (annotationEl != null) {
- XmlSchemaAnnotation annotation = handleAnnotation(annotationEl);
-
- anyAttr.setAnnotation(annotation);
- }
- return anyAttr;
- }
-
- private XmlSchemaGroupRef handleGroupRef(XmlSchema schema, Element groupEl,
- Element schemaEl) {
-
- XmlSchemaGroupRef group = new XmlSchemaGroupRef();
-
- group.maxOccurs = getMaxOccurs(groupEl);
- group.minOccurs = getMinOccurs(groupEl);
-
- Element annotationEl = XDOMUtil.getFirstChildElementNS(groupEl,
- XmlSchema.SCHEMA_NS, "annotation");
-
- if (annotationEl != null) {
- XmlSchemaAnnotation annotation = handleAnnotation(annotationEl);
-
- group.setAnnotation(annotation);
- }
-
- if (groupEl.hasAttribute("ref")) {
- String ref = groupEl.getAttribute("ref");
- group.refName = getRefQName(ref, groupEl);
- return group;
- }
- for (Element el = XDOMUtil.getFirstChildElementNS(groupEl,
- XmlSchema.SCHEMA_NS); el != null; el = XDOMUtil
- .getNextSiblingElement(el)) {
-
- if (el.getLocalName().equals("sequence")) {
- group.particle = handleSequence(schema, el, schemaEl);
- } else if (el.getLocalName().equals("all")) {
- group.particle = handleAll(schema, el, schemaEl);
- } else if (el.getLocalName().equals("choice")) {
- group.particle = handleChoice(schema, el, schemaEl);
- }
- }
- return group;
- }
-
- private QName newLocalQName(String pLocalName) {
- String uri = schema.logicalTargetNamespace;
- if (uri == null) {
- uri = Constants.NULL_NS_URI;
- }
- return new QName(uri, pLocalName);
- }
-
- /**
- * Process non-toplevel attributes
- * @param schema
- * @param attrEl
- * @param schemaEl
- * @return
- */
- private XmlSchemaAttribute handleAttribute(XmlSchema schema,
- Element attrEl, Element schemaEl) {
- return handleAttribute(schema, attrEl, schemaEl, false);
- }
-
- /**
- * Process attributes
- * @param schema
- * @param attrEl
- * @param schemaEl
- * @param topLevel
- * @return
- */
- private XmlSchemaAttribute handleAttribute(XmlSchema schema,
- Element attrEl, Element schemaEl, boolean topLevel) {
- //todo: need to implement different rule of attribute such as
- //restriction between ref and name. This can be implemented
- //in the compile function
- XmlSchemaAttribute attr = new XmlSchemaAttribute();
-
- if (attrEl.hasAttribute("name")) {
- String name = attrEl.getAttribute("name");
- //String namespace = (schema.targetNamespace==null)?
- // "" :schema.targetNamespace;
-
- attr.name = name;
- }
-
- boolean isQualified = schema.getAttributeFormDefault().getValue()
- .equals(XmlSchemaForm.QUALIFIED);
- if (attr.name != null) {
- final String name = attr.name;
- if (topLevel) {
- attr.qualifiedName = newLocalQName(name);
- } else {
- attr.qualifiedName = (isQualified) ? newLocalQName(name)
- : new QName(name);
- }
- }
-
- if (attrEl.hasAttribute("type")) {
- String name = attrEl.getAttribute("type");
- attr.schemaTypeName = getRefQName(name, attrEl);
- }
-
- if (attrEl.hasAttribute("default"))
- attr.defaultValue = attrEl.getAttribute("default");
-
- if (attrEl.hasAttribute("fixed"))
- attr.fixedValue = attrEl.getAttribute("fixed");
-
- if (attrEl.hasAttribute("form")) {
- String formValue = getEnumString(attrEl, "form");
- attr.form = new XmlSchemaForm(formValue);
- }
- if (attrEl.hasAttribute("id"))
- attr.id = attrEl.getAttribute("id");
-
- if (attrEl.hasAttribute("use")) {
- String useType = getEnumString(attrEl, "use");
- attr.use = new XmlSchemaUse(useType);
- }
- if (attrEl.hasAttribute("ref")) {
- String name = attrEl.getAttribute("ref");
- attr.refName = getRefQName(name, attrEl);
- attr.name = name;
- }
-
- Element simpleTypeEl = XDOMUtil.getFirstChildElementNS(attrEl,
- XmlSchema.SCHEMA_NS, "simpleType");
-
- if (simpleTypeEl != null) {
- attr.schemaType = handleSimpleType(schema, simpleTypeEl, schemaEl);
- }
-
- Element annotationEl = XDOMUtil.getFirstChildElementNS(attrEl,
- XmlSchema.SCHEMA_NS, "annotation");
-
- if (annotationEl != null) {
- XmlSchemaAnnotation annotation = handleAnnotation(annotationEl);
-
- attr.setAnnotation(annotation);
- }
-
- NamedNodeMap attrNodes = attrEl.getAttributes();
- Vector attrs = new Vector();
- NodeNamespaceContext ctx = null;
- for (int i = 0; i < attrNodes.getLength(); i++) {
- Attr att = (Attr) attrNodes.item(i);
- String attName = att.getName();
- if (!attName.equals("name") && !attName.equals("type")
- && !attName.equals("default") && !attName.equals("fixed")
- && !attName.equals("form") && !attName.equals("id")
- && !attName.equals("use") && !attName.equals("ref")) {
-
- attrs.add(att);
- String value = att.getValue();
-
- if (value.indexOf(":") > -1) {
- // there is a possiblily of some namespace mapping
- String prefix = value.substring(0, value.indexOf(":"));
- if (ctx == null) {
- ctx = new NodeNamespaceContext(attrEl);
- }
- String namespace = ctx.getNamespaceURI(prefix);
- if (!Constants.NULL_NS_URI.equals(namespace)) {
- 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]));
-
- //process extra attributes and elements
- processExtensibilityComponents(attr, attrEl);
- return attr;
- }
-
- /*
- * handle_simple_content_restriction
- *
- * if( restriction has base attribute )
- * set the baseType
- * else if( restriciton has an inline simpleType )
- * handleSimpleType
- * add facets if any to the restriction
- */
-
- /*
- * handle_simple_content_extension
- *
- * extension should have a base name and cannot have any inline defn
- * for( each childNode )
- * if( attribute)
- * handleAttribute
- * else if( attributeGroup)
- * handleAttributeGroup
- * else if( anyAttribute)
- * handleAnyAttribute
- */
-
- /*
- * ********
- * handle_complex_content_restriction
- */
- /**
- * handle elements
- * @param schema
- * @param el
- * @param schemaEl
- * @param isGlobal
- */
- XmlSchemaElement handleElement(XmlSchema schema, Element el,
- Element schemaEl, boolean isGlobal) {
-
- XmlSchemaElement element = new XmlSchemaElement();
-
- if (el.getAttributeNode("name") != null)
- element.name = el.getAttribute("name");
-
- // String namespace = (schema.targetNamespace==null)?
- // "" : schema.targetNamespace;
-
- boolean isQualified = schema.getElementFormDefault().getValue().equals(
- XmlSchemaForm.QUALIFIED);
- if (el.hasAttribute("form")) {
- String formDef = el.getAttribute("form");
- element.form = new XmlSchemaForm(formDef);
- isQualified = formDef.equals(XmlSchemaForm.QUALIFIED);
- }
-
- if (element.name != null) {
- final String name = element.name;
- element.qualifiedName = (isQualified || isGlobal) ? newLocalQName(name)
- : new QName(Constants.NULL_NS_URI, name);
- }
-
- Element annotationEl = XDOMUtil.getFirstChildElementNS(el,
- XmlSchema.SCHEMA_NS, "annotation");
-
- if (annotationEl != null) {
- XmlSchemaAnnotation annotation = handleAnnotation(annotationEl);
-
- element.setAnnotation(annotation);
- }
- if (el.getAttributeNode("type") != null) {
- String typeName = el.getAttribute("type");
- QName typeQName = element.schemaTypeName = getRefQName(typeName, el);
-
- XmlSchemaType type = collection.getTypeByQName(typeQName);
- if (type == null) {
- // Could be a forward reference...
- collection.addUnresolvedType(typeQName, element);
- }
- element.schemaType = type;
- } else if (el.getAttributeNode("ref") != null) {
- String refName = el.getAttribute("ref");
- QName refQName = getRefQName(refName, el);
- element.setRefName(refQName);
- element.name = refQName.getLocalPart();
- }
-
- Element simpleTypeEl, complexTypeEl, keyEl, keyrefEl, uniqueEl;
-
- if ((simpleTypeEl = XDOMUtil.getFirstChildElementNS(el,
- XmlSchema.SCHEMA_NS, "simpleType")) != null) {
-
- XmlSchemaSimpleType simpleType = handleSimpleType(schema,
- simpleTypeEl, schemaEl);
- element.schemaType = simpleType;
- element.schemaTypeName = simpleType.getQName();
- } else if ((complexTypeEl = XDOMUtil.getFirstChildElementNS(el,
- XmlSchema.SCHEMA_NS, "complexType")) != null) {
-
- element.schemaType = handleComplexType(schema, complexTypeEl,
- schemaEl);
- }
-
- if ((keyEl = XDOMUtil.getFirstChildElementNS(el, XmlSchema.SCHEMA_NS,
- "key")) != null) {
- while (keyEl != null) {
- element.constraints.add(handleConstraint(keyEl, "Key"));
- keyEl = XDOMUtil.getNextSiblingElement(keyEl, "key");
- }
- }
-
- if ((keyrefEl = XDOMUtil.getFirstChildElementNS(el,
- XmlSchema.SCHEMA_NS, "keyref")) != null) {
- while (keyrefEl != null) {
- XmlSchemaKeyref keyRef = (XmlSchemaKeyref) handleConstraint(
- keyrefEl, "Keyref");
- if (keyrefEl.hasAttribute("refer")) {
- String name = keyrefEl.getAttribute("refer");
- keyRef.refer = getRefQName(name, el);
- }
- element.constraints.add(keyRef);
- keyrefEl = XDOMUtil.getNextSiblingElement(keyrefEl, "keyref");
- }
- }
-
- if ((uniqueEl = XDOMUtil.getFirstChildElementNS(el,
- XmlSchema.SCHEMA_NS, "unique")) != null) {
- while (uniqueEl != null) {
- element.constraints.add(handleConstraint(uniqueEl, "Unique"));
- uniqueEl = XDOMUtil.getNextSiblingElement(uniqueEl, "unique");
- }
- }
-
- if (el.hasAttribute("abstract")) {
- element.isAbstract = Boolean.valueOf(el.getAttribute("abstract"))
- .booleanValue();
- }
-
- if (el.hasAttribute("block"))
- element.block = getDerivation(el, "block");
-
- if (el.hasAttribute("default"))
- element.defaultValue = el.getAttribute("default");
-
- if (el.hasAttribute("final"))
- element.finalDerivation = getDerivation(el, "final");
-
- if (el.hasAttribute("fixed"))
- element.fixedValue = el.getAttribute("fixed");
-
- if (el.hasAttribute("id"))
- element.id = el.getAttribute("id");
-
- if (el.hasAttribute("nillable"))
- element.isNillable = Boolean.valueOf(el.getAttribute("nillable"))
- .booleanValue();
-
- if (el.hasAttribute("substitutionGroup")) {
- String substitutionGroup = el.getAttribute("substitutionGroup");
- element.setSubstitutionGroup(getRefQName(substitutionGroup, el));
- }
-
- element.minOccurs = getMinOccurs(el);
- element.maxOccurs = getMaxOccurs(el);
-
- //process extra attributes and elements
- processExtensibilityComponents(element, el);
-
- return element;
- }
-
- private XmlSchemaIdentityConstraint handleConstraint(Element constraintEl,
- String type) {
-
- try {
- XmlSchemaIdentityConstraint constraint = (XmlSchemaIdentityConstraint) Class
- .forName("org.apache.ws.commons.schema.XmlSchema" + type)
- .newInstance();
-
- if (constraintEl.hasAttribute("name"))
- constraint.name = constraintEl.getAttribute("name");
-
- if (constraintEl.hasAttribute("refer")) {
- String name = constraintEl.getAttribute("refer");
- ((XmlSchemaKeyref) constraint).refer = getRefQName(name,
- constraintEl);
- }
- for (Element el = XDOMUtil.getFirstChildElementNS(constraintEl,
- XmlSchema.SCHEMA_NS); el != null; el = XDOMUtil
- .getNextSiblingElementNS(el, XmlSchema.SCHEMA_NS)) {
-
- // String elPrefix = el.getPrefix() == null ? ""
- // : el.getPrefix();
- //if(elPrefix.equals(schema.schema_ns_prefix)) {
- if (el.getLocalName().equals("selector")) {
- XmlSchemaXPath selectorXPath = new XmlSchemaXPath();
- selectorXPath.xpath = el.getAttribute("xpath");
-
- Element annotationEl = XDOMUtil.getFirstChildElementNS(el,
- XmlSchema.SCHEMA_NS, "annotation");
- if (annotationEl != null) {
- XmlSchemaAnnotation annotation = handleAnnotation(annotationEl);
-
- selectorXPath.setAnnotation(annotation);
- }
- constraint.selector = selectorXPath;
- } else if (el.getLocalName().equals("field")) {
- XmlSchemaXPath fieldXPath = new XmlSchemaXPath();
- fieldXPath.xpath = el.getAttribute("xpath");
- constraint.fields.add(fieldXPath);
-
- Element annotationEl = XDOMUtil.getFirstChildElementNS(el,
- XmlSchema.SCHEMA_NS, "annotation");
-
- if (annotationEl != null) {
- XmlSchemaAnnotation annotation = handleAnnotation(annotationEl);
-
- fieldXPath.setAnnotation(annotation);
- }
- } else if (el.getLocalName().equals("annotation")) {
- XmlSchemaAnnotation constraintAnnotation = handleAnnotation(el);
- constraint.setAnnotation(constraintAnnotation);
- }
- }
- return constraint;
- } catch (ClassNotFoundException e) {
- throw new XmlSchemaException(e.getMessage());
- } catch (InstantiationException e) {
- throw new XmlSchemaException(e.getMessage());
- } catch (IllegalAccessException e) {
- throw new XmlSchemaException(e.getMessage());
- }
- }
-
- /**
- * Hanlde the import
- * @param schema
- * @param importEl
- * @param schemaEl
- * @return XmlSchemaObject
- */
- XmlSchemaImport handleImport(XmlSchema schema, Element importEl,
- Element schemaEl) {
-
- XmlSchemaImport schemaImport = new XmlSchemaImport();
-
- Element annotationEl = XDOMUtil.getFirstChildElementNS(importEl,
- XmlSchema.SCHEMA_NS, "annotation");
-
- if (annotationEl != null) {
- XmlSchemaAnnotation importAnnotation = handleAnnotation(annotationEl);
- schemaImport.setAnnotation(importAnnotation);
- }
-
- final String uri = schemaImport.namespace = importEl
- .getAttribute("namespace");
- schemaImport.schemaLocation = importEl.getAttribute("schemaLocation");
-
- TargetNamespaceValidator validator = new TargetNamespaceValidator() {
- private boolean isEmpty(String pValue) {
- return pValue == null || Constants.NULL_NS_URI.equals(pValue);
- }
-
- public void validate(XmlSchema pSchema) {
- final boolean valid;
- if (isEmpty(uri)) {
- valid = isEmpty(pSchema.syntacticalTargetNamespace);
- } else {
- valid = pSchema.syntacticalTargetNamespace.equals(uri);
- }
- if (!valid) {
- throw new XmlSchemaException(
- "An imported schema was announced to have the namespace "
- + uri + ", but has the namespace "
- + pSchema.syntacticalTargetNamespace);
- }
- }
- };
- if ((schemaImport.schemaLocation != null)
- && (!schemaImport.schemaLocation.equals(""))) {
- if (schema.getSourceURI() != null) {
- schemaImport.schema = resolveXmlSchema(uri,
- schemaImport.schemaLocation, schema.getSourceURI(),
- validator);
- } else {
- schemaImport.schema = resolveXmlSchema(schemaImport.namespace,
- schemaImport.schemaLocation, validator);
- }
- }
- return schemaImport;
- }
-
- /**
- * Handles the include
- * @param schema
- * @param includeEl
- * @param schemaEl
- */
- XmlSchemaInclude handleInclude(final XmlSchema schema, Element includeEl,
- Element schemaEl) {
-
- XmlSchemaInclude include = new XmlSchemaInclude();
-
- Element annotationEl = XDOMUtil.getFirstChildElementNS(includeEl,
- XmlSchema.SCHEMA_NS, "annotation");
-
- if (annotationEl != null) {
- XmlSchemaAnnotation includeAnnotation = handleAnnotation(annotationEl);
- include.setAnnotation(includeAnnotation);
- }
-
- include.schemaLocation = includeEl.getAttribute("schemaLocation");
-
- //includes are not supposed to have a target namespace
- // we should be passing in a null in place of the target
- //namespace
-
- final TargetNamespaceValidator validator = newIncludeValidator(schema);
- if (schema.getSourceURI() != null) {
- include.schema = resolveXmlSchema(schema.logicalTargetNamespace,
- include.schemaLocation, schema.getSourceURI(), validator);
- } else {
- include.schema = resolveXmlSchema(schema.logicalTargetNamespace,
- include.schemaLocation, validator);
- }
-
- //process extra attributes and elements
- processExtensibilityComponents(include, includeEl);
- return include;
- }
-
- private TargetNamespaceValidator newIncludeValidator(final XmlSchema schema) {
- return new TargetNamespaceValidator() {
- private boolean isEmpty(String pValue) {
- return pValue == null || Constants.NULL_NS_URI.equals(pValue);
- }
-
- public void validate(XmlSchema pSchema) {
- if (isEmpty(pSchema.syntacticalTargetNamespace)) {
- pSchema.logicalTargetNamespace = schema.logicalTargetNamespace;
- } else {
- if (!pSchema.syntacticalTargetNamespace
- .equals(schema.logicalTargetNamespace)) {
- String msg = "An included schema was announced to have the default target namespace";
- if (!isEmpty(schema.logicalTargetNamespace)) {
- msg += " or the target namespace "
- + schema.logicalTargetNamespace;
- }
- throw new XmlSchemaException(msg
- + ", but has the target namespace "
- + pSchema.logicalTargetNamespace);
- }
- }
- }
- };
- }
-
- /**
- * Handles the annotation
- * Traversing if encounter appinfo or documentation
- * add it to annotation collection
- *
- */
- XmlSchemaAnnotation handleAnnotation(Element annotEl) {
- XmlSchemaObjectCollection content = new XmlSchemaObjectCollection();
- XmlSchemaAppInfo appInfoObj;
- XmlSchemaDocumentation docsObj;
-
- for (Element appinfo = XDOMUtil.getFirstChildElementNS(annotEl,
- XmlSchema.SCHEMA_NS, "appinfo"); appinfo != null; appinfo = XDOMUtil
- .getNextSiblingElementNS(appinfo, XmlSchema.SCHEMA_NS,
- "appinfo")) {
-
- appInfoObj = handleAppInfo(appinfo);
- if (appInfoObj != null) {
- content.add(appInfoObj);
- }
- }
- for (Element documentation = XDOMUtil.getFirstChildElementNS(annotEl,
- XmlSchema.SCHEMA_NS, "documentation"); documentation != null; documentation = XDOMUtil
- .getNextSiblingElementNS(documentation,
-
- XmlSchema.SCHEMA_NS, "documentation")) {
-
- docsObj = handleDocumentation(documentation);
- if (docsObj != null) {
- content.add(docsObj);
- }
- }
-
- XmlSchemaAnnotation annotation = new XmlSchemaAnnotation();
- annotation.items = content;
-
- //process extra attributes and elements
- processExtensibilityComponents(annotation, annotEl);
- return annotation;
- }
-
- /**
- * create new XmlSchemaAppinfo and add value goten from element
- * to this obj
- * @param content
- */
- XmlSchemaAppInfo handleAppInfo(Element content) {
- XmlSchemaAppInfo appInfo = new XmlSchemaAppInfo();
- NodeList markup = getChildren(content);
-
- if (!content.hasAttribute("source")
- && (markup == null || markup.getLength() <= 0)) {
- return null;
- }
- appInfo.setSource(getAttribute(content, "source"));
- appInfo.setMarkup(markup);
- return appInfo;
- }
-
- //iterate each documentation element, create new XmlSchemaAppinfo and add to collection
- XmlSchemaDocumentation handleDocumentation(Element content) {
- XmlSchemaDocumentation documentation = new XmlSchemaDocumentation();
- NodeList markup = getChildren(content);
-
- if (!content.hasAttribute("source")
- && !content.hasAttribute("xml:lang")
- && (markup == null || markup.getLength() <= 0))
- return null;
-
- documentation.setSource(getAttribute(content, "source"));
- documentation.setLanguage(getAttribute(content, "xml:lang"));
- documentation.setMarkup(getChildren(content));
-
- return documentation;
- }
-
- private String getAttribute(Element content, String attrName) {
- if (content.hasAttribute(attrName))
- return content.getAttribute(attrName);
- return null;
- }
-
- private NodeList getChildren(Element content) {
- NodeList childs = content.getChildNodes();
- if (childs.getLength() > 0)
- return childs;
- return null;
- }
-
- long getMinOccurs(Element el) {
- try {
- if (el.getAttributeNode("minOccurs") != null) {
- String value = el.getAttribute("minOccurs");
- if (value.equals("unbounded"))
- return Long.MAX_VALUE;
- else
- return Long.parseLong(value);
- }
- return 1;
- } catch (java.lang.NumberFormatException e) {
- return 1;
- }
- }
-
- long getMaxOccurs(Element el) {
- try {
- if (el.getAttributeNode("maxOccurs") != null) {
- String value = el.getAttribute("maxOccurs");
- if (value.equals("unbounded"))
- return Long.MAX_VALUE;
- else
- return Long.parseLong(value);
- }
- return 1;
- } catch (java.lang.NumberFormatException e) {
- return 1;
- }
- }
-
- XmlSchemaForm getFormDefault(Element el, String attrName) {
- if (el.getAttributeNode(attrName) != null) {
- String value = el.getAttribute(attrName);
- return new XmlSchemaForm(value);
- } else
- return new XmlSchemaForm("unqualified");
- }
-
- //Check value entered by user and change according to .net spec,
- //according to w3c spec have to be "#all"
- //but in .net the valid enum value is "all".
- XmlSchemaDerivationMethod getDerivation(Element el, String attrName) {
- if (el.hasAttribute(attrName) && !el.getAttribute(attrName).equals("")) {
- //#all | List of (extension | restriction | substitution
- String derivationMethod = el.getAttribute(attrName).trim();
- if (derivationMethod.equals("#all"))
- return new XmlSchemaDerivationMethod(
- Constants.BlockConstants.ALL);
- else
- return new XmlSchemaDerivationMethod(derivationMethod);
- }
- return new XmlSchemaDerivationMethod(Constants.BlockConstants.NONE);
- }
-
- //Check value entered by user and change according to .net spec, user
- String getEnumString(Element el, String attrName) {
- if (el.hasAttribute(attrName)) {
- return el.getAttribute(attrName).trim();
- }
- return Constants.BlockConstants.NONE;
- }
-
- /**
- * Resolve the schemas
- * @param targetNamespace
- * @param schemaLocation
- */
- XmlSchema resolveXmlSchema(String targetNamespace, String schemaLocation,
- String baseUri, TargetNamespaceValidator validator) {
-
- //use the entity resolver provided if the schema location is present null
- if (schemaLocation != null && !"".equals(schemaLocation)) {
- InputSource source = collection.schemaResolver.resolveEntity(
- targetNamespace, schemaLocation, baseUri);
-
- //the entity resolver was unable to resolve this!!
- if (source == null) {
- //try resolving it with the target namespace only with the
- //known namespace map
- XmlSchema schema = collection.getKnownSchema(targetNamespace);
- if (schema != null) {
- return schema;
- }else{
- return null;
- }
- }
- final String systemId = source.getSystemId() == null ? schemaLocation
- : source.getSystemId();
- final SchemaKey key = new XmlSchemaCollection.SchemaKey(
- targetNamespace, systemId);
- XmlSchema schema = collection.getSchema(key);
- if (schema != null) {
- return schema;
- }
- if (collection.check(key)) {
- collection.push(key);
- try {
- return collection.read(source, null, validator);
- } catch (Exception e) {
- throw new RuntimeException(e);
- } finally {
- collection.pop();
- }
- }
- }else{
- XmlSchema schema = collection.getKnownSchema(targetNamespace);
- if (schema != null) {
- return schema;
- }
- }
-
- return null;
- }
-
- /**
- * Resolve the schemas
- * @param targetNamespace
- * @param schemaLocation
- */
- XmlSchema resolveXmlSchema(String targetNamespace, String schemaLocation,
- TargetNamespaceValidator validator) {
- return resolveXmlSchema(targetNamespace, schemaLocation,
- collection.baseUri, validator);
-
- }
-
- /**
- * A generic method to process the extra attributes and the the extra
- * elements present within the schema.
- * What are considered extensions are child elements with non schema namespace
- * and child attributes with any namespace
- * @param schemaObject
- * @param parentElement
- */
- private void processExtensibilityComponents(XmlSchemaObject schemaObject,
- Element parentElement) {
-
- if (extReg != null) {
- //process attributes
- NamedNodeMap attributes = parentElement.getAttributes();
- for (int i = 0; i < attributes.getLength(); i++) {
- Attr attribute = (Attr) attributes.item(i);
-
- String namespaceURI = attribute.getNamespaceURI();
- String name = attribute.getLocalName();
-
- if (namespaceURI != null
- && !"".equals(namespaceURI)
- && //ignore unqualified attributes
- !namespaceURI
- .startsWith(Constants.XMLNS_ATTRIBUTE_NS_URI) && //ignore namespaces
- !Constants.URI_2001_SCHEMA_XSD.equals(namespaceURI))
- //does not belong to the schema namespace by any chance!
- {
- QName qName = new QName(namespaceURI, name);
- extReg.deserializeExtension(schemaObject, qName, attribute);
-
- }
- }
-
- //process elements
- NodeList allChildren = parentElement.getChildNodes();
- for (int i = 0; i < allChildren.getLength(); i++) {
- if (allChildren.item(i).getNodeType() == Node.ELEMENT_NODE) {
-
- Element extElement = (Element) allChildren.item(i);
-
- String namespaceURI = extElement.getNamespaceURI();
- String name = extElement.getLocalName();
-
- if (namespaceURI != null
- && !Constants.URI_2001_SCHEMA_XSD
- .equals(namespaceURI))
- //does not belong to the schema namespace
- {
- QName qName = new QName(namespaceURI, name);
- extReg.deserializeExtension(schemaObject, qName,
- extElement);
-
- }
- }
- }
- }
-
- }
-
-}
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.ws.commons.schema;
+
+import org.apache.ws.commons.schema.XmlSchemaCollection.SchemaKey;
+import org.apache.ws.commons.schema.constants.Constants;
+import org.apache.ws.commons.schema.extensions.ExtensionRegistry;
+import org.apache.ws.commons.schema.utils.NodeNamespaceContext;
+import org.apache.ws.commons.schema.utils.TargetNamespaceValidator;
+import org.apache.ws.commons.schema.utils.XDOMUtil;
+import org.apache.ws.commons.schema.utils.DOMUtil;
+import org.w3c.dom.*;
+import org.xml.sax.InputSource;
+
+import javax.xml.namespace.NamespaceContext;
+import javax.xml.namespace.QName;
+import javax.xml.parsers.DocumentBuilderFactory;
+
+import java.lang.ref.SoftReference;
+import java.util.Hashtable;
+import java.util.StringTokenizer;
+import java.util.Vector;
+
+public class SchemaBuilder {
+ Document doc;
+ XmlSchema schema;
+ XmlSchemaCollection collection;
+ private final TargetNamespaceValidator validator;
+ DocumentBuilderFactory docFac;
+
+ /**
+ * The extension registry to be used while building the
+ * schema model
+ */
+ private ExtensionRegistry extReg = null;
+
+ public ExtensionRegistry getExtReg() {
+ return extReg;
+ }
+
+ public void setExtReg(ExtensionRegistry extReg) {
+ this.extReg = extReg;
+ }
+
+ /*
+ * cache of previously resolved schema documents.
+ *
+ * This cache might be usefull when an application has multiple webservices that each have WSDL documents
+ * that import the same schema, for example. On app startup, we may wish to cache XmlSchema objects so we
+ * don't build up the schema graph multiple times.
+ *
+ * key - use a combination of thread id and all three parameters passed to resolveXmlSchema to give minimal thread safety*
+ * value - XmlSchema object wrapped in a SoftReference to encourage GC in low memory situations
+ *
+ * *CAUTION: XmlSchema objects are not likely to be thread-safe. This cache should
+ * only be used, then cleared, by callers aware of its existence. It is VERY important that users of this
+ * cache call clearCache() after they are done.
+ *
+ * Usage of the cache is controlled by calling initCache() which will initialize resolvedSchemas to non-null
+ * Clearing of cache is done by calling clearCache() which will clear and nullify resolvedSchemas
+ *
+ */
+ private static Hashtable resolvedSchemas = null;
+
+ /**
+ * Schema builder constructor
+ * @param collection
+ */
+ SchemaBuilder(XmlSchemaCollection collection,
+ TargetNamespaceValidator validator) {
+ this.collection = collection;
+ this.validator = validator;
+
+ if (collection.getExtReg() != null) {
+ this.extReg = collection.getExtReg();
+ }
+
+ schema = new XmlSchema();
+ }
+
+ public static void initCache() {
+ resolvedSchemas = new Hashtable();
+ }
+
+ public static void clearCache() {
+ resolvedSchemas.clear(); // necessary?
+ resolvedSchemas = null;
+ }
+
+ /**
+ * build method taking in a document and a validation handler
+ * @param doc
+ * @param uri
+ * @param veh
+ */
+ XmlSchema build(Document doc, String uri, ValidationEventHandler veh) {
+ Element schemaEl = doc.getDocumentElement();
+ XmlSchema xmlSchema = handleXmlSchemaElement(schemaEl, uri);
+ xmlSchema.setInputEncoding(DOMUtil.getInputEncoding(doc));
+ return xmlSchema;
+ }
+
+ /**
+ * handles the schema element
+ * @param schemaEl
+ * @param uri
+ */
+ XmlSchema handleXmlSchemaElement(Element schemaEl, String uri) {
+ // get all the attributes along with the namespace declns
+ schema.setNamespaceContext(new NodeNamespaceContext(schemaEl));
+ setNamespaceAttributes(schema, schemaEl);
+
+ XmlSchemaCollection.SchemaKey schemaKey = new XmlSchemaCollection.SchemaKey(
+ schema.logicalTargetNamespace, uri);
+ if (!collection.containsSchema(schemaKey)) {
+ collection.addSchema(schemaKey, schema);
+ schema.parent = collection; // establish parentage now.
+ } else {
+ throw new XmlSchemaException("Schema name conflict in collection. Namespace: " + schema.logicalTargetNamespace);
+ }
+
+ schema.setElementFormDefault(this.getFormDefault(schemaEl,
+ "elementFormDefault"));
+ schema.setAttributeFormDefault(this.getFormDefault(schemaEl,
+ "attributeFormDefault"));
+ schema.setBlockDefault(this.getDerivation(schemaEl, "blockDefault"));
+ schema.setFinalDefault(this.getDerivation(schemaEl, "finalDefault"));
+ /* set id attribute */
+ if (schemaEl.hasAttribute("id")) {
+ schema.id = schemaEl.getAttribute("id");
+ }
+
+ schema.setSourceURI(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
+ * else if (annotation)
+ * handleAnnotation
+ */
+
+ Element el = XDOMUtil.getFirstChildElementNS(schemaEl,
+ XmlSchema.SCHEMA_NS);
+ if (el == null
+ && XDOMUtil.getFirstChildElementNS(schemaEl,
+ "http://www.w3.org/1999/XMLSchema") != null) {
+ throw new XmlSchemaException(
+ "Schema defined using \"http://www.w3.org/1999/XMLSchema\" is not supported. "
+ + "Please update the schema to the \""
+ + XmlSchema.SCHEMA_NS + "\" namespace");
+ }
+ for (; el != null; el = XDOMUtil.getNextSiblingElementNS(el,
+ XmlSchema.SCHEMA_NS)) {
+
+ // String elPrefix = el.getPrefix() == null ? "" : el.getPrefix();
+ //if(elPrefix.equals(schema.schema_ns_prefix)) {
+ if (el.getLocalName().equals("simpleType")) {
+ XmlSchemaType type = handleSimpleType(schema, el, schemaEl);
+ schema.addType(type);
+ schema.items.add(type);
+ collection.resolveType(type.getQName(), type);
+ } else if (el.getLocalName().equals("complexType")) {
+ XmlSchemaType type = handleComplexType(schema, el, schemaEl);
+ schema.addType(type);
+ schema.items.add(type);
+ collection.resolveType(type.getQName(), type);
+ } else if (el.getLocalName().equals("element")) {
+ XmlSchemaElement element = handleElement(schema, el, schemaEl,
+ true);
+ if (element.qualifiedName != null)
+ schema.elements.collection.put(element.qualifiedName,
+ element);
+ else if (element.refName != null)
+ schema.elements.collection.put(element.refName, element);
+ schema.items.add(element);
+ } else if (el.getLocalName().equals("include")) {
+ XmlSchemaInclude include = handleInclude(schema, el, schemaEl);
+ schema.includes.add(include);
+ schema.items.add(include);
+
+ } else if (el.getLocalName().equals("import")) {
+ XmlSchemaImport schemaImport = handleImport(schema, el,
+ schemaEl);
+ schema.includes.add(schemaImport);
+ schema.items.add(schemaImport);
+
+ } else if (el.getLocalName().equals("group")) {
+ XmlSchemaGroup group = handleGroup(schema, el, schemaEl);
+ schema.groups.collection.put(group.name, group);
+ schema.items.add(group);
+ } else if (el.getLocalName().equals("attributeGroup")) {
+ XmlSchemaAttributeGroup group = handleAttributeGroup(schema,
+ el, schemaEl);
+ schema.attributeGroups.collection.put(group.name, group);
+ schema.items.add(group);
+ } else if (el.getLocalName().equals("attribute")) {
+ XmlSchemaAttribute attr = handleAttribute(schema, el, schemaEl,
+ true); //pass true to indicate that it is a top level child
+ schema.attributes.collection.put(attr.qualifiedName, attr);
+ schema.items.add(attr);
+ } else if (el.getLocalName().equals("redefine")) {
+ XmlSchemaRedefine redefine = handleRedefine(schema, el,
+ schemaEl);
+ schema.includes.add(redefine);
+ } else if (el.getLocalName().equals("notation")) {
+ XmlSchemaNotation notation = handleNotation(el);
+ schema.notations.collection.put(new QName(schema
+ .getTargetNamespace(), notation.name), notation);
+ schema.items.add(notation);
+ } else if (el.getLocalName().equals("annotation")) {
+ XmlSchemaAnnotation annotation = handleAnnotation(el);
+ schema.setAnnotation(annotation);
+ }
+ }
+
+ //add the extesibility components
+ processExtensibilityComponents(schema, schemaEl);
+
+ return schema;
+ }
+
+ private XmlSchemaNotation handleNotation(Element notationEl) {
+
+ XmlSchemaNotation notation = new XmlSchemaNotation();
+
+ if (notationEl.hasAttribute("id")) {
+ notation.id = notationEl.getAttribute("id");
+ }
+
+ if (notationEl.hasAttribute("name")) {
+ notation.name = notationEl.getAttribute("name");
+ }
+
+ if (notationEl.hasAttribute("public")) {
+ notation.publicNotation = notationEl.getAttribute("public");
+ }
+
+ if (notationEl.hasAttribute("system")) {
+ notation.system = notationEl.getAttribute("system");
+ }
+
+ Element annotationEl = XDOMUtil.getFirstChildElementNS(notationEl,
+ XmlSchema.SCHEMA_NS, "annotation");
+
+ if (annotationEl != null) {
+ XmlSchemaAnnotation annotation = handleAnnotation(annotationEl);
+ notation.setAnnotation(annotation);
+ }
+
+ return notation;
+ }
+
+ /**
+ * Handle redefine
+ * @param schema
+ * @param redefineEl
+ * @param schemaEl
+ * @return
+ */
+ private XmlSchemaRedefine handleRedefine(XmlSchema schema,
+ Element redefineEl, Element schemaEl) {
+
+ XmlSchemaRedefine redefine = new XmlSchemaRedefine();
+ redefine.schemaLocation = redefineEl.getAttribute("schemaLocation");
+ final TargetNamespaceValidator validator = newIncludeValidator(schema);
+
+ if (schema.getSourceURI() != null) {
+ redefine.schema = resolveXmlSchema(schema.logicalTargetNamespace,
+ redefine.schemaLocation, schema.getSourceURI(), validator);
+ } else {
+ redefine.schema = resolveXmlSchema(schema.logicalTargetNamespace,
+ redefine.schemaLocation, validator);
+ }
+
+ /*
+ * FIXME - This seems not right. Since the redefine should take into account
+ * the attributes of the original element we cannot just build the type
+ * defined in the redefine section - what we need to do is to get the original type
+ * object and modify it. However one may argue (quite reasonably) that the purpose
+ * of this object model is to provide just the representation and not the validation
+ * (as it has been always the case)
+ */
+
+ for (Element el = XDOMUtil.getFirstChildElementNS(redefineEl,
+ XmlSchema.SCHEMA_NS); el != null; el = XDOMUtil
+ .getNextSiblingElementNS(el, XmlSchema.SCHEMA_NS)) {
+
+ if (el.getLocalName().equals("simpleType")) {
+ XmlSchemaType type = handleSimpleType(schema, el, schemaEl);
+
+ redefine.schemaTypes.collection.put(type.getQName(), type);
+ redefine.items.add(type);
+ } else if (el.getLocalName().equals("complexType")) {
+
+ XmlSchemaType type = handleComplexType(schema, el, schemaEl);
+
+ redefine.schemaTypes.collection.put(type.getQName(), type);
+ redefine.items.add(type);
+ } else if (el.getLocalName().equals("group")) {
+ XmlSchemaGroup group = handleGroup(schema, el, schemaEl);
+ redefine.groups.collection.put(group.name, group);
+ redefine.items.add(group);
+ } else if (el.getLocalName().equals("attributeGroup")) {
+ XmlSchemaAttributeGroup group = handleAttributeGroup(schema,
+ el, schemaEl);
+
+ redefine.attributeGroups.collection.put(group.name, group);
+ redefine.items.add(group);
+ } else if (el.getLocalName().equals("annotation")) {
+ XmlSchemaAnnotation annotation = handleAnnotation(el);
+ redefine.setAnnotation(annotation);
+ }
+ // }
+ }
+ return redefine;
+ }
+
+ void setNamespaceAttributes(XmlSchema schema, Element schemaEl) {
+ //no targetnamespace found !
+ if (schemaEl.getAttributeNode("targetNamespace") != null) {
+ String contain = schemaEl.getAttribute("targetNamespace");
+ schema.setTargetNamespace(contain);
+ } else {
+ //do nothing here
+ }
+ if (validator != null) {
+ validator.validate(schema);
+ }
+ }
+
+ /**
+ * Handles simple types
+ * @param schema
+ * @param simpleEl
+ * @param schemaEl
+ */
+ XmlSchemaSimpleType handleSimpleType(XmlSchema schema, Element simpleEl,
+ Element schemaEl) {
+ XmlSchemaSimpleType simpleType = new XmlSchemaSimpleType(schema);
+ if (simpleEl.hasAttribute("name")) {
+ simpleType.name = simpleEl.getAttribute("name");
+ }
+
+ if (simpleEl.hasAttribute("final")) {
+ String finalstr = simpleEl.getAttribute("final");
+
+ if (finalstr.equalsIgnoreCase("all")
+ | finalstr.equalsIgnoreCase("#all"))
+
+ simpleType.setFinal(new XmlSchemaDerivationMethod(
+ Constants.BlockConstants.ALL));
+ else
+ simpleType.setFinal(new XmlSchemaDerivationMethod(finalstr));
+ }
+
+ Element simpleTypeAnnotationEl = XDOMUtil.getFirstChildElementNS(
+ simpleEl, XmlSchema.SCHEMA_NS, "annotation");
+
+ if (simpleTypeAnnotationEl != null) {
+ XmlSchemaAnnotation simpleTypeAnnotation = handleAnnotation(simpleTypeAnnotationEl);
+
+ simpleType.setAnnotation(simpleTypeAnnotation);
+ }
+
+ Element unionEl, listEl, restrictionEl;
+
+ if ((restrictionEl = XDOMUtil.getFirstChildElementNS(simpleEl,
+ XmlSchema.SCHEMA_NS, "restriction")) != null) {
+
+ XmlSchemaSimpleTypeRestriction restriction = new XmlSchemaSimpleTypeRestriction();
+
+ Element restAnnotationEl = XDOMUtil.getFirstChildElementNS(
+ restrictionEl, XmlSchema.SCHEMA_NS, "annotation");
+
+ if (restAnnotationEl != null) {
+ XmlSchemaAnnotation restAnnotation = handleAnnotation(restAnnotationEl);
+ restriction.setAnnotation(restAnnotation);
+ }
+ /** if (restriction has a base attribute )
+ * set the baseTypeName and look up the base type
+ * else if( restricion has a SimpleType Element as child)
+ * get that element and do a handleSimpleType;
+ * get the children of restriction other than annotation
+ * and simpleTypes and construct facets from it;
+ *
+ * set the restriction has the content of the simpleType
+ *
+ **/
+
+ Element inlineSimpleType = XDOMUtil.getFirstChildElementNS(
+ restrictionEl, XmlSchema.SCHEMA_NS, "simpleType");
+
+ if (restrictionEl.hasAttribute("base")) {
+ NamespaceContext ctx = new NodeNamespaceContext(restrictionEl);
+ restriction.baseTypeName = getRefQName(restrictionEl
+ .getAttribute("base"), ctx);
+ } else if (inlineSimpleType != null) {
+
+ restriction.baseType = handleSimpleType(schema,
+ inlineSimpleType, schemaEl);
+ }
+ for (Element el = XDOMUtil.getFirstChildElementNS(restrictionEl,
+ XmlSchema.SCHEMA_NS); el != null; el = XDOMUtil
+ .getNextSiblingElementNS(el, XmlSchema.SCHEMA_NS)) {
+
+ if (!el.getLocalName().equals("annotation")
+ && !el.getLocalName().equals("simpleType")) {
+
+ XmlSchemaFacet facet = XmlSchemaFacet.construct(el);
+ Element annotation = XDOMUtil.getFirstChildElementNS(el,
+ XmlSchema.SCHEMA_NS, "annotation");
+
+ if (annotation != null) {
+ XmlSchemaAnnotation facetAnnotation = handleAnnotation(annotation);
+ facet.setAnnotation(facetAnnotation);
+ }
+ restriction.facets.add(facet);
+ }
+
+ }
+ simpleType.content = restriction;
+
+ } else if ((listEl = XDOMUtil.getFirstChildElementNS(simpleEl,
+ XmlSchema.SCHEMA_NS, "list")) != null) {
+
+ XmlSchemaSimpleTypeList list = new XmlSchemaSimpleTypeList();
+
+ /******
+ * if( list has an itemType attribute )
+ * set the baseTypeName and look up the base type
+ * else if( list has a SimpleTypeElement as child)
+ * get that element and do a handleSimpleType
+ *
+ * set the list has the content of the simpleType
+ */
+ Element inlineListType, listAnnotationEl;
+ if (listEl.hasAttribute("itemType")) {
+ String name = listEl.getAttribute("itemType");
+ list.itemTypeName = getRefQName(name, listEl);
+ } else if ((inlineListType = XDOMUtil.getFirstChildElementNS(
+ listEl, XmlSchema.SCHEMA_NS, "simpleType")) != null) {
+
+ list.itemType = handleSimpleType(schema, inlineListType,
+ schemaEl);
+ }
+
+ if ((listAnnotationEl = XDOMUtil.getFirstChildElementNS(listEl,
+ XmlSchema.SCHEMA_NS, "annotation")) != null) {
+
+ XmlSchemaAnnotation listAnnotation = handleAnnotation(listAnnotationEl);
+
+ list.setAnnotation(listAnnotation);
+ }
+ simpleType.content = list;
+
+ } else if ((unionEl = XDOMUtil.getFirstChildElementNS(simpleEl,
+ XmlSchema.SCHEMA_NS, "union")) != null) {
+
+ XmlSchemaSimpleTypeUnion union = new XmlSchemaSimpleTypeUnion();
+
+ /******
+ * if( union has a memberTypes attribute )
+ * add the memberTypeSources string
+ * for (each memberType in the list )
+ * lookup(memberType)
+ * for( all SimpleType child Elements)
+ * add the simpleTypeName (if any) to the memberType Sources
+ * do a handleSimpleType with the simpleTypeElement
+ */
+ if (unionEl.hasAttribute("memberTypes")) {
+ String memberTypes = unionEl.getAttribute("memberTypes");
+ union.memberTypesSource = memberTypes;
+ Vector v = new Vector();
+ StringTokenizer tokenizer = new StringTokenizer(memberTypes,
+ " ");
+ while (tokenizer.hasMoreTokens()) {
+ String member = tokenizer.nextToken();
+ v.add(getRefQName(member, unionEl));
+ }
+ union.memberTypesQNames = new QName[v.size()];
+ v.copyInto(union.memberTypesQNames);
+ }
+
+ Element inlineUnionType = XDOMUtil.getFirstChildElementNS(unionEl,
+ XmlSchema.SCHEMA_NS, "simpleType");
+ while (inlineUnionType != null) {
+
+ XmlSchemaSimpleType unionSimpleType = handleSimpleType(schema,
+ inlineUnionType, schemaEl);
+
+ union.baseTypes.add(unionSimpleType);
+
+ if (unionSimpleType.name != null) {
+ union.memberTypesSource += " " + unionSimpleType.name;
+ }
+
+ inlineUnionType = XDOMUtil.getNextSiblingElementNS(
+ inlineUnionType, XmlSchema.SCHEMA_NS, "simpleType");
+ }
+
+ //NodeList annotations = unionEl.getElementsByTagNameNS(
+ //XmlSchema.SCHEMA_NS, "annotation");
+ Element unionAnnotationEl = XDOMUtil.getFirstChildElementNS(
+ unionEl, XmlSchema.SCHEMA_NS, "annotation");
+
+ if (unionAnnotationEl != null) {
+ XmlSchemaAnnotation unionAnnotation = handleAnnotation(unionAnnotationEl);
+
+ union.setAnnotation(unionAnnotation);
+ }
+ simpleType.content = union;
+ }
+
+ //process extra attributes and elements
+ processExtensibilityComponents(simpleType, simpleEl);
+
+ return simpleType;
+ }
+
+ private QName getRefQName(String pName, Node pNode) {
+ return getRefQName(pName, new NodeNamespaceContext(pNode));
+ }
+
+ private QName getRefQName(String pName, NamespaceContext pContext) {
+ final int offset = pName.indexOf(':');
+ String uri;
+ final String localName;
+ final String prefix;
+ if (offset == -1) {
+ uri = pContext.getNamespaceURI(Constants.DEFAULT_NS_PREFIX);
+ if (Constants.NULL_NS_URI.equals(uri)) {
+ return new QName(Constants.NULL_NS_URI, pName);
+ }
+ localName = pName;
+ prefix = Constants.DEFAULT_NS_PREFIX;
+ } else {
+ prefix = pName.substring(0, offset);
+ uri = pContext.getNamespaceURI(prefix);
+ if (uri == null || Constants.NULL_NS_URI.equals(uri)) {
+ if (schema.parent != null
+ && schema.parent.getNamespaceContext() != null) {
+ uri = schema.parent.getNamespaceContext().getNamespaceURI(
+ prefix);
+ }
+ }
+
+ if (uri == null || Constants.NULL_NS_URI.equals(uri)) {
+ throw new IllegalStateException("The prefix " + prefix
+ + " is not bound.");
+ }
+ localName = pName.substring(offset + 1);
+ }
+ return new QName(uri, localName, prefix);
+ }
+
+ /**
+ * Handle complex types
+ * @param schema
+ * @param complexEl
+ * @param schemaEl
+ */
+ XmlSchemaComplexType handleComplexType(XmlSchema schema, Element complexEl,
+ Element schemaEl) {
+
+ /******
+ * set the complexTypeName if any
+ * for( eachChildNode)
+ * if ( simpleContent)
+ * if( restrcition)
+ * handle_simple_content_restriction
+ * else if( extension)
+ * handle_simple_content_extension
+ * break; // it has to be the only child
+ * else if( complexContent)
+ * if( restriction)
+ * handle_complex_content_restriction
+ * else if( extension)
+ * handle_complex_content_extension
+ * break; // it has to be the only child
+ * else if( group)
+ * if( group has ref)
+ * store the group name
+ * else
+ * handleGroup
+ * else if( sequence )
+ * handleSequence
+ * else if( all )
+ * handleAll
+ * else if(choice)
+ * handleChoice
+ * else if(attribute)
+ * handleAttribute
+ * else if(attributeGroup)
+ * handleAttributeGroup
+ * else if(anyAttribute)
+ * handleAnyAttribute
+ */
+
+ XmlSchemaComplexType ct = new XmlSchemaComplexType(schema);
+
+ if (complexEl.hasAttribute("name")) {
+
+ //String namespace = (schema.targetNamespace==null)?
+ // "":schema.targetNamespace;
+
+ ct.name = complexEl.getAttribute("name");
+ }
+ for (Element el = XDOMUtil.getFirstChildElementNS(complexEl,
+ XmlSchema.SCHEMA_NS); el != null; el = XDOMUtil
+ .getNextSiblingElementNS(el, XmlSchema.SCHEMA_NS)) {
+
+ //String elPrefix = el.getPrefix() == null ? "" :
+ //el.getPrefix();
+ //if(elPrefix.equals(schema.schema_ns_prefix)) {
+ if (el.getLocalName().equals("sequence")) {
+ ct.particle = handleSequence(schema, el, schemaEl);
+ } else if (el.getLocalName().equals("choice")) {
+ ct.particle = handleChoice(schema, el, schemaEl);
+ } else if (el.getLocalName().equals("all")) {
+ ct.particle = handleAll(schema, el, schemaEl);
+ } else if (el.getLocalName().equals("attribute")) {
+ ct.attributes.add(handleAttribute(schema, el, schemaEl));
+ } else if (el.getLocalName().equals("attributeGroup")) {
+ ct.attributes.add(handleAttributeGroupRef(el));
+ } else if (el.getLocalName().equals("group")) {
+ XmlSchemaGroupRef group = handleGroupRef(schema, el, schemaEl);
+ ct.particle = (group.particle == null) ? (XmlSchemaParticle) group
+ : group.particle;
+ } else if (el.getLocalName().equals("simpleContent")) {
+ ct.contentModel = handleSimpleContent(schema, el, schemaEl);
+ } else if (el.getLocalName().equals("complexContent")) {
+ ct.contentModel = handleComplexContent(schema, el, schemaEl);
+ } else if (el.getLocalName().equals("annotation")) {
+ ct.setAnnotation(handleAnnotation(el));
+ } else if (el.getLocalName().equals("anyAttribute")) {
+ ct.setAnyAttribute(handleAnyAttribute(schema, el, schemaEl));
+ }
+ //}
+ }
+ if (complexEl.hasAttribute("block")) {
[... 1305 lines stripped ...]