I spent the day (actually yesterday) trying to get Schema validation working a
bit better. A diff to
org/apache/xerces/validators/schema/XSchemaValidator.java and a description is
appended below for anyone who wants to use it.
George
*******************************************
reportSchemaError() was printing a stack trace for each validation error. It
was also eating the exceptions thrown instead of
propagating them back up the call stack. I commented out the try/catch block
so the calling application gets the exception and can
decide if a stack trace is appropriate. I left printStackTrace alone where it
was being called in "can't get here" situations.
A few System.exit() calls were commented out. They should never be called but
I'm not fond of having them around in APIs.
traverseAttributeDecl() was looking for the old 'required="true"' on an
attribute definition instead of 'minOccurs="1"' to decide if
an attribute was required or not.
The datatypes 'negative-integer', 'positive-integer', 'non-negative-integer',
and 'non-positive-integer' weren't being correctly
added to the datatype registry and were therefore unavailable.
*** xschemavalidatororig.java Wed Jan 05 15:12:30 2000
--- xschemavalidator.java Fri Jan 07 01:20:12 2000
***************
*** 1683,1694 ****
catch (SAXException se) {
se.getException().printStackTrace();
System.err.println("error parsing schema file");
! System.exit(1);
}
catch (Exception e) {
e.printStackTrace();
System.err.println("error parsing schema file");
! System.exit(1);
}
fSchemaDocument = fSchemaParser.getDocument();
if (fSchemaDocument == null) {
--- 1683,1694 ----
catch (SAXException se) {
se.getException().printStackTrace();
System.err.println("error parsing schema file");
! // System.exit(1);
}
catch (Exception e) {
e.printStackTrace();
System.err.println("error parsing schema file");
! // System.exit(1);
}
fSchemaDocument = fSchemaParser.getDocument();
if (fSchemaDocument == null) {
***************
*** 1703,1709 ****
}
catch (Exception e) {
e.printStackTrace(System.err);
! System.exit(1);
}
}
--- 1703,1709 ----
}
catch (Exception e) {
e.printStackTrace(System.err);
! // System.exit(1);
}
}
***************
*** 2206,2212 ****
return index;
}
! public int traverseDatatypeDecl(Element datatypeDecl) {
int newTypeName =
fStringPool.addSymbol(datatypeDecl.getAttribute(ATT_NAME));
int export =
fStringPool.addSymbol(datatypeDecl.getAttribute(ATT_EXPORT));
--- 2206,2212 ----
return index;
}
! public int traverseDatatypeDecl(Element datatypeDecl) throws Exception {
int newTypeName =
fStringPool.addSymbol(datatypeDecl.getAttribute(ATT_NAME));
int export =
fStringPool.addSymbol(datatypeDecl.getAttribute(ATT_EXPORT));
***************
*** 2449,2455 ****
// attribute default type
int attDefaultType = -1;
int attDefaultValue = -1;
! boolean required =
attrDecl.getAttribute("required").equals("true");
if (required) {
attDefaultType = fStringPool.addSymbol("#REQUIRED");
} else {
--- 2449,2455 ----
// attribute default type
int attDefaultType = -1;
int attDefaultValue = -1;
! boolean required =
attrDecl.getAttribute("minOccurs").equals("1");
if (required) {
attDefaultType = fStringPool.addSymbol("#REQUIRED");
} else {
***************
*** 3011,3027 ****
return -1;
}
! private void reportSchemaError(int major, Object args[]) {
! try {
fErrorReporter.reportError(fErrorReporter.getLocator(),
SchemaMessageProvider.SCHEMA_DOMAIN,
major,
SchemaMessageProvider.MSG_NONE,
args,
XMLErrorReporter.ERRORTYPE_RECOVERABLE_ERROR);
! } catch (Exception e) {
! e.printStackTrace();
! }
}
//
--- 3011,3027 ----
return -1;
}
! private void reportSchemaError(int major, Object args[]) throws
Exception {
! // try {
fErrorReporter.reportError(fErrorReporter.getLocator(),
SchemaMessageProvider.SCHEMA_DOMAIN,
major,
SchemaMessageProvider.MSG_NONE,
args,
XMLErrorReporter.ERRORTYPE_RECOVERABLE_ERROR);
! // } catch (Exception e) {
! // e.printStackTrace();
! // }
}
//
***************
*** 3113,3119 ****
String integerSubtypeTable[][] = {
{ "non-negative-integer", DatatypeValidator.MININCLUSIVE , "0"},
! { "postive-integer", DatatypeValidator.MININCLUSIVE, "1"},
{ "non-positive-integer", DatatypeValidator.MAXINCLUSIVE, "0"},
{ "negative-integer", DatatypeValidator.MAXINCLUSIVE, "-1"}
};
--- 3113,3119 ----
String integerSubtypeTable[][] = {
{ "non-negative-integer", DatatypeValidator.MININCLUSIVE , "0"},
! { "positive-integer", DatatypeValidator.MININCLUSIVE, "1"},
{ "non-positive-integer", DatatypeValidator.MAXINCLUSIVE, "0"},
{ "negative-integer", DatatypeValidator.MAXINCLUSIVE, "-1"}
};
***************
*** 3149,3155 ****
} catch (UnknownFacetException ufe) {
System.out.println("Internal error initializing registry
- Unknown facet: "+integerSubtypeTable[i][0]);
}
! fRegistry.put(integerSubtypeTable[0], v);
}
}
--- 3149,3155 ----
} catch (UnknownFacetException ufe) {
System.out.println("Internal error initializing registry
- Unknown facet: "+integerSubtypeTable[i][0]);
}
! fRegistry.put(integerSubtypeTable[i][0], v);
}
}