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);
              }
          }


Reply via email to