}
if (test != null) {
// get 'annotation'
Element childNode = DOMUtil.getFirstChildElement(content);
XSAnnotationImpl annotation = null;
// first child could be an annotation
if (childNode != null
&& DOMUtil.getLocalName(childNode).equals(
SchemaSymbols.ELT_ANNOTATION)) {
annotation = traverseAnnotationDecl(childNode, attrs,
false, schemaDoc);
// now move on to the next child element
childNode = DOMUtil.getNextSiblingElement(childNode);
if (childNode != null) {
// it's an error to have something after the annotation, in an assertion
reportSchemaError("s4s-elt-invalid-content.1", new Object[]{DOMUtil.getLocalName(content),
DOMUtil.getLocalName(childNode)}, childNode);
}
} else {
String text = DOMUtil.getSyntheticAnnotation(childNode);
if (text != null) {
annotation = traverseSyntheticAnnotation(childNode,
text, attrs, false, schemaDoc);
}
}
XSObjectList annotations = null;
if (annotation != null) {
annotations = new XSObjectListImpl();
((XSObjectListImpl)annotations).addXSObject(annotation);
}
else {
//if no annotations are present add an empty list to the assertion
annotations = XSObjectListImpl.EMPTY_LIST;
}
// create an assertion object
XSAssertImpl assertImpl = new XSAssertImpl(typeDef,
annotations,
fSchemaHandler);
Test testExpr = new Test(new XPath20Assert(test, fSymbolTable,
new SchemaNamespaceSupport(schemaDoc.
fNamespaceSupport)), assertImpl);
assertImpl.setAssertKind(XSConstants.ASSERTION_FACET);
assertImpl.setTest(testExpr);
assertImpl.setXPathDefaultNamespace(xpathDefaultNamespace);
assertImpl.setXPath2NamespaceContext(new SchemaNamespaceSupport
(schemaDoc.fNamespaceSupport));
String assertMessage = XMLChar.trim(content.getAttributeNS(
SchemaSymbols.URI_XERCES_EXTENSIONS,
SchemaSymbols.ATT_ASSERT_MESSAGE));
if (!"".equals(assertMessage)) {
assertImpl.setMessage(assertMessage);
}
if (assertData == null) {
assertData = new Vector();
}
// add assertion object, to the list of assertions to be processed
assertData.addElement(assertImpl);
} else {
// 'test' attribute is mandatory in assert element
reportSchemaError("src-assert.3.13.1",
new Object[] { DOMUtil.getLocalName(content) },
content);
}
} else {
if (facet.equals(SchemaSymbols.ELT_MINLENGTH)) {
currentFacet = XSSimpleType.FACET_MINLENGTH;
}
else if (facet.equals(SchemaSymbols.ELT_MAXLENGTH)) {
currentFacet = XSSimpleType.FACET_MAXLENGTH;
}
else if (facet.equals(SchemaSymbols.ELT_MAXEXCLUSIVE)) {
currentFacet = XSSimpleType.FACET_MAXEXCLUSIVE;
}
else if (facet.equals(SchemaSymbols.ELT_MAXINCLUSIVE)) {
currentFacet = XSSimpleType.FACET_MAXINCLUSIVE;
}
else if (facet.equals(SchemaSymbols.ELT_MINEXCLUSIVE)) {
currentFacet = XSSimpleType.FACET_MINEXCLUSIVE;
}
else if (facet.equals(SchemaSymbols.ELT_MININCLUSIVE)) {
currentFacet = XSSimpleType.FACET_MININCLUSIVE;
}
else if (facet.equals(SchemaSymbols.ELT_TOTALDIGITS)) {
currentFacet = XSSimpleType.FACET_TOTALDIGITS;
}
else if (facet.equals(SchemaSymbols.ELT_FRACTIONDIGITS)) {
currentFacet = XSSimpleType.FACET_FRACTIONDIGITS;
}
else if (facet.equals(SchemaSymbols.ELT_WHITESPACE)) {
currentFacet = XSSimpleType.FACET_WHITESPACE;
}
else if (facet.equals(SchemaSymbols.ELT_LENGTH)) {
currentFacet = XSSimpleType.FACET_LENGTH;
}
else if (facet.equals(SchemaSymbols.ELT_MAXSCALE)) { //XML Schema 1.1
currentFacet = XSSimpleType.FACET_MAXSCALE;
}
else if (facet.equals(SchemaSymbols.ELT_MINSCALE)) { //XML Schema 1.1
currentFacet = XSSimpleType.FACET_MINSCALE;
}
else if (facet.equals(SchemaSymbols.ELT_EXPLICITTIMEZONE)){
currentFacet = XSSimpleType.FACET_EXPLICITTIMEZONE;
}
else {
break; // a non-facet
}
attrs = fAttrChecker.checkAttributes(content, false, schemaDoc);
// check for duplicate facets
if ((facetsPresent & currentFacet) != 0) {
// Ignore this facet, to avoid corrupting the previous facet
reportSchemaError("src-single-facet-value", new Object[]{facet}, content);
fAttrChecker.returnAttrArray (attrs, schemaDoc);
content = DOMUtil.getNextSiblingElement(content);
continue;
}
// The facet can't be used if the value is missing. Ignore
// this facet element.
if (attrs[XSAttributeChecker.ATTIDX_VALUE] == null) {
// Report an error if the "value" attribute is missing.
// If it's not missing, then its value is invalid, and an
// error should have already been reported by the
// attribute checker.
if (content.getAttributeNodeNS(null, "value") == null) {
reportSchemaError("s4s-att-must-appear", new Object[]{content.getLocalName(), SchemaSymbols.ATT_VALUE}, content);
}
fAttrChecker.returnAttrArray (attrs, schemaDoc);
content = DOMUtil.getNextSiblingElement(content);
continue;
}
facetsPresent |= currentFacet;
// check for fixed facet
if (((Boolean)attrs[XSAttributeChecker.ATTIDX_FIXED]).booleanValue()) {
facetsFixed |= currentFacet;
}
switch (currentFacet) {
case XSSimpleType.FACET_MINLENGTH:
xsFacets.minLength = ((XInt)attrs[XSAttributeChecker.ATTIDX_VALUE]).intValue();
break;
case XSSimpleType.FACET_MAXLENGTH:
xsFacets.maxLength = ((XInt)attrs[XSAttributeChecker.ATTIDX_VALUE]).intValue();
break;
case XSSimpleType.FACET_MAXEXCLUSIVE:
xsFacets.maxExclusive = (String)attrs[XSAttributeChecker.ATTIDX_VALUE];
break;
case XSSimpleType.FACET_MAXINCLUSIVE:
xsFacets.maxInclusive = (String)attrs[XSAttributeChecker.ATTIDX_VALUE];
break;
case XSSimpleType.FACET_MINEXCLUSIVE:
xsFacets.minExclusive = (String)attrs[XSAttributeChecker.ATTIDX_VALUE];
break;
case XSSimpleType.FACET_MININCLUSIVE:
xsFacets.minInclusive = (String)attrs[XSAttributeChecker.ATTIDX_VALUE];
break;
case XSSimpleType.FACET_TOTALDIGITS:
xsFacets.totalDigits = ((XInt)attrs[XSAttributeChecker.ATTIDX_VALUE]).intValue();
break;
case XSSimpleType.FACET_FRACTIONDIGITS:
xsFacets.fractionDigits = ((XInt)attrs[XSAttributeChecker.ATTIDX_VALUE]).intValue();
break;
case XSSimpleType.FACET_WHITESPACE:
xsFacets.whiteSpace = ((XInt)attrs[XSAttributeChecker.ATTIDX_VALUE]).shortValue();
break;
case XSSimpleType.FACET_LENGTH:
xsFacets.length = ((XInt)attrs[XSAttributeChecker.ATTIDX_VALUE]).intValue();
break;
case XSSimpleType.FACET_MAXSCALE:
xsFacets.maxScale = ((XInt)attrs[XSAttributeChecker.ATTIDX_VALUE]).intValue(); //XML Schema 1.1
break;
case XSSimpleType.FACET_MINSCALE:
xsFacets.minScale = ((XInt)attrs[XSAttributeChecker.ATTIDX_VALUE]).intValue(); //XML Schema 1.1
break;
case XSSimpleType.FACET_EXPLICITTIMEZONE:
xsFacets.explicitTimezone = ((XInt)attrs[XSAttributeChecker.ATTIDX_VALUE]).shortValue();
break;
}
Element child = DOMUtil.getFirstChildElement( content );
XSAnnotationImpl annotation = null;
if (child != null &&
DOMUtil.getLocalName(child).equals(SchemaSymbols.ELT_ANNOTATION)) {
// traverse annotation if any
annotation = traverseAnnotationDecl(child, attrs, false, schemaDoc);
child = DOMUtil.getNextSiblingElement(child);