short facetsPresent = 0 ;
short facetsFixed = 0; // facets that have fixed="true"
String facet;
boolean hasQName = containsQName(baseValidator);
Vector enumData = null;
XSObjectListImpl enumAnnotations = null;
XSObjectListImpl patternAnnotations = null;
Vector enumNSDecls = hasQName ? new Vector() : null;
int currentFacet = 0;
xsFacets.reset();
while (content != null) {
// General Attribute Checking
Object[] attrs = null;
facet = DOMUtil.getLocalName(content);
if (facet.equals(SchemaSymbols.ELT_ENUMERATION)) {
attrs = fAttrChecker.checkAttributes(content, false, schemaDoc, hasQName);
String enumVal = (String)attrs[XSAttributeChecker.ATTIDX_VALUE];
// The facet can't be used if the value is missing. Ignore
// this facet element.
if (enumVal == null) {
reportSchemaError("s4s-att-must-appear", new Object[]{SchemaSymbols.ELT_ENUMERATION, SchemaSymbols.ATT_VALUE}, content);
fAttrChecker.returnAttrArray (attrs, schemaDoc);
content = DOMUtil.getNextSiblingElement(content);
continue;
}
NamespaceSupport nsDecls = (NamespaceSupport)attrs[XSAttributeChecker.ATTIDX_ENUMNSDECLS];
// for NOTATION types, need to check whether there is a notation
// declared with the same name as the enumeration value.
if (baseValidator.getVariety() == XSSimpleType.VARIETY_ATOMIC &&
baseValidator.getPrimitiveKind() == XSSimpleType.PRIMITIVE_NOTATION) {
// need to use the namespace context returned from checkAttributes
schemaDoc.fValidationContext.setNamespaceSupport(nsDecls);
Object notation = null;
try{
QName temp = (QName)fQNameDV.validate(enumVal, schemaDoc.fValidationContext, null);
// try to get the notation decl. if failed, getGlobalDecl
// reports an error, so we don't need to report one again.
notation = fSchemaHandler.getGlobalDecl(schemaDoc, XSDHandler.NOTATION_TYPE, temp, content);
}catch(InvalidDatatypeValueException ex){
reportSchemaError(ex.getKey(), ex.getArgs(), content);
}
if (notation == null) {
// Either the QName value is invalid, or it doens't
// resolve to a notation declaration.
// Ignore this facet, to avoid instance validation problems
fAttrChecker.returnAttrArray (attrs, schemaDoc);
content = DOMUtil.getNextSiblingElement(content);
continue;
}
// restore to the normal namespace context
schemaDoc.fValidationContext.setNamespaceSupport(schemaDoc.fNamespaceSupport);
}
if (enumData == null){
enumData = new Vector();
enumAnnotations = new XSObjectListImpl();
}
enumData.addElement(enumVal);
enumAnnotations.addXSObject(null);
if (hasQName)
enumNSDecls.addElement(nsDecls);
Element child = DOMUtil.getFirstChildElement( content );
if (child != null &&
DOMUtil.getLocalName(child).equals(SchemaSymbols.ELT_ANNOTATION)) {
// traverse annotation if any
enumAnnotations.addXSObject(enumAnnotations.getLength()-1,traverseAnnotationDecl(child, attrs, false, schemaDoc));
child = DOMUtil.getNextSiblingElement(child);
}
else {
String text = DOMUtil.getSyntheticAnnotation(content);
if (text != null) {
enumAnnotations.addXSObject(enumAnnotations.getLength()-1, traverseSyntheticAnnotation(content, text, attrs, false, schemaDoc));
}
}
if (child !=null) {
reportSchemaError("s4s-elt-must-match.1", new Object[]{"enumeration", "(annotation?)", DOMUtil.getLocalName(child)}, child);
}
}
else if (facet.equals(SchemaSymbols.ELT_PATTERN)) {
attrs = fAttrChecker.checkAttributes(content, false, schemaDoc);
String patternVal = (String)attrs[XSAttributeChecker.ATTIDX_VALUE];
// The facet can't be used if the value is missing. Ignore
// this facet element.
if (patternVal == null) {
reportSchemaError("s4s-att-must-appear", new Object[]{SchemaSymbols.ELT_PATTERN, SchemaSymbols.ATT_VALUE}, content);
fAttrChecker.returnAttrArray (attrs, schemaDoc);
content = DOMUtil.getNextSiblingElement(content);
continue;
}
if (fPattern.length() == 0) {
fPattern.append(patternVal);
} else {
// ---------------------------------------------
//datatypes: 5.2.4 pattern: src-multiple-pattern
// ---------------------------------------------
fPattern.append("|");
fPattern.append(patternVal);
}
Element child = DOMUtil.getFirstChildElement( content );
if (child != null &&
DOMUtil.getLocalName(child).equals(SchemaSymbols.ELT_ANNOTATION)) {
// traverse annotation if any
if (patternAnnotations == null){
patternAnnotations = new XSObjectListImpl();
}
patternAnnotations.addXSObject(traverseAnnotationDecl(child, attrs, false, schemaDoc));
child = DOMUtil.getNextSiblingElement(child);
}
else {
String text = DOMUtil.getSyntheticAnnotation(content);
if (text != null) {
if (patternAnnotations == null){
patternAnnotations = new XSObjectListImpl();
}
patternAnnotations.addXSObject(traverseSyntheticAnnotation(content, text, attrs, false, schemaDoc));
}
}
if (child !=null) {
reportSchemaError("s4s-elt-must-match.1", new Object[]{"pattern", "(annotation?)", DOMUtil.getLocalName(child)}, child);
}