Java Mailing List Archive

http://www.junlu.com/

Google
Google
Mailing List
Home
Forum Home
JBoss - Java Application Server
Struts - A MVC web framework
Tomcat - JSP/Servlet container
iText - An open source PDF Java Library
JDOM - JDOM XML Parser
J2EE - A mailing list for Java(tm) 2 Platform, Enterprise Edition
J2EE Pattern - An interest list for Sun Java Center J2EE Pattern Catalog
Servlet - A mailing list for discussion about Sun Microsystem's Java Servlet API Technology
JSP - A mailing list about Java Server Pages specification and reference
Struts & Hibernate
Subjects
JSP editor plugin for eclipse ?
org apache jasper JasperException: Unable to compile class for JSP
Tomcat: Connection reset by peer: socket write error
Cannot retrieve definition for form bean null
Struts Tiles Tutorial (free Struts training)
Where do I download Tomcat 4 0 6?
Data Access Object (DAO) pattern, example DAO 's
Where to download Tomcat v 4 1 24 from?
Tomcat 5 0 16 Requested resource not available
Oracle Connection Pooling in 3 2 2
Servlet : Session invalidate
Servlet action is currently unavailable
Tomcat/Struts Unicode Encoding/Decoding problems
Tomcat and webapplication specific java library path
Running a Simple JMS Example
Mapping in workers2 properties
org apache jasper JasperException
Cannot find message resources under key org apache struts action
   MESSAGE
problem with html:text bean throwing exception
Cannot find message resources under key org apache struts action MESSAGE
invalid direct reference problem with solution
Tool for jsp debug Try Sysdeo Eclipse Plugin
Tomcat 5 Cannot load JDBC driver class 'null ' SQL state: null
weblogic ejbc
java properties file
Jboss 3 2 3 Coyote Can 't re
Tomcat 5, Apache2 and mod jk2 integration problem
JBoss example problem new to J2EE
url string for connecting jboss to oracle
Value attribute of <html:checkbox
javax servlet ServletException: BeanUtils populate
HTTP Status 404 The requested resource is not available
5 0 18: Windows XP Pro vs Windows 2000
 
Validating with an XML Schema in a JSP

Validating with an XML Schema in a JSP

2003-10-13       - By Babos Andras

 Back
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 xerces-j-user@(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: xerces-j-user@(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 Source code of org.w3c.dom.Document,
           org.apache.xerces.parsers.DOMParser Source code of org.apache.xerces.parsers.DOMParser,
           dca.store.BranchDetailsErrorHandler,
           dca.store.XSDResolver,
           java.io.StringReader Source code of java.io.StringReader,
           org.xml.sax.InputSource Source code of org.xml.sax.InputSource,
           org.xml.sax.SAXNotRecognizedException Source code of org.xml.sax.SAXNotRecognizedException,
           org.xml.sax.SAXNotSupportedException Source code of org.xml.sax.SAXNotSupportedException,
           org.xml.sax.SAXException Source code of org.xml.sax.SAXException,
           java.io.IOException Source code of java.io.IOException,
           java.io.InputStream Source code of 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: tomcat-user-unsubscribe@(protected)
For additional commands, e-mail: tomcat-user-help@(protected)



©2008 junlu.com - Jax Systems, LLC, U.S.A.