Hi Everyone!

First of all I'd like to apologize to everyone who receives this mail twice, as
I've already posted this question to [EMAIL PROTECTED] The reason
for the cross-posting is that I haven't received any replies on the above
mentioned list in the last two days, and the problem is getting urgent. Also
the question may be relevant for both lists (as I don't know whether the
problem lies in Tomcat or in Xerces-J).

So my problem is described in the following message:

----- Forwarded message from  -----

To: [EMAIL PROTECTED]
Subject: Validating with an XML Schema in a JSP

Hi Everyone!

I really hope someone on this list has some answers for me, because this JSP
issue is driving me mad...

Environment: Tomcat 4.0.4 - fixed, cannot upgrade it.
             JDK 1.3.1_02 - fixed, cannot upgrade it.
             Xerces 2.5.0 - the latest official release.

I'm trying to develop a JSP to upload an XML file, validate it against a given
XML Schema and create a DOM from it. The upload is started from a simple HTML
form, which calls my JSP. The uploaded XML file is the simplest possible - XML
1.0, no namespaces, no DTD or Schema included. I have 'xercesImpl.jar' and
'xml-apis.jar' in my WEB-INF/lib directory, and any other classes I need in my
WEB-INF/classes directory. I also put the XSD file into the WEB-INF/classes
directory and use my own EntityResolver class to load it as a resource.

The JSP source code is the following:

-----------------------------------JSP source --------------------------------
<%@ page language="java"
    import="com.jspsmart.upload.*,
            org.w3c.dom.Document,
            org.apache.xerces.parsers.DOMParser,
            dca.store.BranchDetailsErrorHandler,
            dca.store.XSDResolver,
            java.io.StringReader,
            org.xml.sax.InputSource,
            org.xml.sax.SAXNotRecognizedException,
            org.xml.sax.SAXNotSupportedException,
            org.xml.sax.SAXException,
            java.io.IOException,
            java.io.InputStream"
%><jsp:useBean id="smartUploader" scope="page" class="com.jspsmart.upload.SmartUpload"
/><html>
  <head>
    <title>Uploading branch details XML</title>
  </head>
  <body onload="parent.steps.highlight (2)">
<%
final String EXTERNAL_NONAMESPACE_SCHEMA_LOCATION =
             
"http://apache.org/xml/properties/schema/external-noNamespaceSchemaLocation";;
final String BRANCH_SCHEMA =
             "branch.xsd";
final String XML_NAMESPACES =
             "http://xml.org/sax/features/namespaces";;
final String XML_VALIDATION =
             "http://xml.org/sax/features/validation";;
final String XML_SCHEMA_VALIDATION =
             "http://apache.org/xml/features/validation/schema";;

String        xmlContent = "";
Document      xmlDocument;
String        error = null;


try {
  smartUploader.initialize (pageContext);
  smartUploader.setTotalMaxFileSize (102400);
  smartUploader.upload ();

  // Printing the uploaded XML file into an HTML comment for debugging purposes
  out.println ("<!--");
  xmlContent = smartUploader.getFiles ().getFile (0).getContentString ();
  out.println (xmlContent);
  out.println ("-->");

} catch (IllegalArgumentException iax) {
  error = "No file was uploaded.";
}

if (error == null) {
  try {
    DOMParser parser = new DOMParser ();
    BranchDetailsErrorHandler errorHandler = new BranchDetailsErrorHandler ();
    XSDResolver xsdResolver = new XSDResolver ();

    // Printing the contents of branch.xsd into an HTML comment for debugging purposes
    InputStream is = xsdResolver.resolveEntity ("", "branch.xsd").getByteStream ();
    StringBuffer str = new StringBuffer ();
    byte b[] = new byte[1];
    while (is.read (b) != -1) {
      str.append (new String (b));
    }
    is.close ();
    out.println ("<!--");
    out.println (str);
    out.println ("-->");

    parser.setProperty (EXTERNAL_NONAMESPACE_SCHEMA_LOCATION, BRANCH_SCHEMA);
    parser.setFeature (XML_NAMESPACES, false);
    parser.setFeature (XML_VALIDATION, true);
    parser.setFeature (XML_SCHEMA_VALIDATION, true);
    parser.setErrorHandler (errorHandler);
    parser.setEntityResolver (xsdResolver);

    InputSource xmlSource = new InputSource (new StringReader (xmlContent));
    parser.parse (xmlSource);
    out.println (xsdResolver.getSystemIds () + "<br/>");
    if (errorHandler.isValidDocument ()) {
      xmlDocument = parser.getDocument ();
      out.println ("Document root element: " + xmlDocument.getDocumentElement 
().getTagName ());
    }
    else {
      error = "Invalid XML document: " + errorHandler.getMessage ();
    }
  } catch (SAXNotRecognizedException nre) {
    error = "Cannot parse document.";
  } catch (SAXNotSupportedException nse) {
    error = "Cannot parse document.";
  } catch (SAXException se) {
    error = "Invalid XML document: " + se.getMessage ();
  } catch (IOException ioe) {
    error = "Cannot parse document.";
  }
}

if (error != null) {
  out.println (error);
}
else {
  out.println ("No errors.");
}
%>
  </body>
</html>
----------------------------------------- End JSP source ---------------------

Details:
- The jspsmart.upload classes are free classes from www.jspsmart.com, which
simplify the process of extracting the uploaded files from the HTTP header.
- BranchDetailsErrorHandler is my own parser error handling class. It ignores
warnings, stores the information from errors and fatal errors, and on error or
fatal error flips a boolean 'valid' value to false. The isValidDocument ()
method returns this value, and the getMessage () method returns the saved error
details.
- XSDResolver is my own EntityResolver class. On each resolveEntity call it
stores the parameters, and if the systemId parameter is 'branch.xsd' then loads
the 'branch.xsd' file as a resource and returns it. The getSystemIds () method
returns all the call parameters as a String.
- As you can see I print the contents of both the uploaded XML file and the
resource XSD file into the page in HTML comments - both work fine.

The problem:
- If I use the same code in a simple Java application then everything works
flawlessly. The files are loaded, the XML is validated against the XSD and the
Document object is created without any problems. (The validation works as it
should - I've checked.)
- The same code in JSP however insists that the XML is not valid. The
errorHandler object is called with an error, and what's even more strange, the
error comes from the same place in the XML file. For example if I add one more
empty line to the XML file, the error message changes accordingly. (And yes,
I've checked, the XML is valid...)
- The JSP code doesn't even call the EntityResolver - something breaks at the
basic validation. Also if I comment out the SCHEMA_VALIDATION feature, the
setEntityResolver call and the EXTERNAL_NONAMESPACE_SCHEMA_LOCATION property
nothing changes. As far as I can tell, the code doesn't even get as far as
schema validation.

If you've read this far, I thank you, but if you also have any idea what might
be causing this behaviour in this JSP page, I'd be really grateful if you could
share it with me...

Thanks in advance:

        Andras Babos.

----- End forwarded message -----

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to