Hi, I am developing a simple generic (wsdl/schema-independent) SOAP
message validatior class that uses Xerces.
The problem I have is that I use an string based schema (not an URI
nor a file) because I want to use WSDL's schema. The validation only
works when an schema location is specified in the XML instance:

<fi:fish
xmlns:fi="http://globalip:8080/fish";
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
xsi:schemaLocation="http://globalip:8080/fish
http://192.168.82.29:8080/fisherWS/fish.xsd";>

But I would like it to work without schema location:
<fi:fish
xmlns:fi="http://globalip:8080/fish";>

I have been reading the Xerces doc (properties and features) and I
coded the config in such a way:
        private String VALIDATION = "http://xml.org/sax/features/validation";;
        private String SCHEMA = 
"http://apache.org/xml/features/validation/schema";;
        private String SCHEMA_FULL_CHECKING =
"http://apache.org/xml/features/validation/schema-full-checking";;
        private String WARN_ON_DUPLICATE_ATTDEF =
"http://apache.org/xml/features/validation/warn-on-duplicate-attdef";;

        parser.setFeature(LOAD_EXTERNAL_DTD, true);
        parser.setFeature(VALIDATION, true);
        parser.setFeature(SCHEMA, true);
        parser.setFeature(SCHEMA_FULL_CHECKING, true);
        parser.setFeature(WARN_ON_DUPLICATE_ATTDEF, true);

Thanks in advance,
Pau

The full source code is:

import org.w3c.dom.*;
import java.io.FileNotFoundException;
import java.net.UnknownHostException;
import org.w3c.dom.Element;
import org.xml.sax.SAXParseException;
import org.xml.sax.SAXException;
import org.xml.sax.ErrorHandler;
import org.xml.sax.helpers.XMLReaderFactory;
import org.xml.sax.InputSource;
import java.io.StringReader;
import javax.xml.soap.SOAPBody;
import org.xml.sax.XMLReader;
import javax.xml.soap.SOAPEnvelope;
import org.apache.axis.MessageContext;
import org.apache.catalina.util.SchemaResolver;
import org.xml.sax.helpers.DefaultHandler;
import java.io.IOException;
import org.apache.tomcat.util.digester.Digester;

public class SOAPvalidator {
        private String VALIDATION = "http://xml.org/sax/features/validation";;

        private String SCHEMA = 
"http://apache.org/xml/features/validation/schema";;

        /**
         * String constant used for the schema full checking feature of the 
Xerces
         * parser.
         *
         * @build 10
         */
        private String SCHEMA_FULL_CHECKING =
"http://apache.org/xml/features/validation/schema-full-checking";;

        /**
         * String constant used for the warn on duplicate attribute definition
         * feature of the Xerces parser.
         *
         * @build 10
         */
        private String WARN_ON_DUPLICATE_ATTDEF =
"http://apache.org/xml/features/validation/warn-on-duplicate-attdef";;

        /**
         * String constant used for the warn on undeclared element definition
         * feature of the Xerces parser.
         *
         * @build 10
         */
        private String LOAD_EXTERNAL_DTD =
"http://apache.org/xml/features/nonvalidating/load-external-dtd";;

        // Name of the parser to use to create the xmlReader.
        String parserName = "org.apache.xerces.parsers.SAXParser";

        XMLReader parser = null;

        DefaultHandler defaultHandler = null;

        public SOAPvalidator() {
                try {
                        parser = XMLReaderFactory.createXMLReader(parserName);
                        // load schema\dtd
                        parser.setFeature(LOAD_EXTERNAL_DTD, true);
                        // turn on validation
                        parser.setFeature(VALIDATION, true);
                        parser.setFeature(SCHEMA, true);
                        parser.setFeature(SCHEMA_FULL_CHECKING, true);
                        parser.setFeature(WARN_ON_DUPLICATE_ATTDEF, true);
                        defaultHandler = new SAXErrorHandler();
                } catch (Exception e) {

                }
        }

        public void validateSOAPmessage() {
                try {
                        MessageContext context = org.apache.axis.MessageContext
                                        .getCurrentContext();
                        SOAPEnvelope env = 
context.getRequestMessage().getSOAPEnvelope();
                        SOAPBody sb = env.getBody();
                        System.out.println("SB fc: " + sb.getLastChild());
                        String XMLinstance = sb.getLastChild().toString();
                        SAXErrorHandler errorHandler = new SAXErrorHandler();
                        validateFile(new InputSource(new 
StringReader(XMLinstance)), errorHandler);
                } catch (Exception e) {

                }
        }

        public void validateFile(InputSource source, DefaultHandler handler)
                        throws SAXException, IOException {
                Digester digester = new Digester(parser);

                // make schema resolver so the parser knows where to find the 
schema
                SchemaResolver resolver = new SchemaResolver(digester);

                parser.setEntityResolver(resolver);
                parser.setErrorHandler(handler);

                // parsing the file with validation turned on no content 
handler needed
                parser.parse(source);

        }

}

/**
* This class is used to handle any errors that occur durring parsing.
*
* @build 10
*/
class SAXErrorHandler extends DefaultHandler {
        /**
         * Called by parser when an error is encountered while parsing the XML 
file.
         *
         * @build 10
         * @param ex
         *            is th exception that describes the error
         */
        public void error(SAXParseException ex) {
                System.out.println("SOAP message error: " + ex.getMessage());
                // parseError.append("\n");
                // parseError.append(ex.getMessage());
                // errorCount++;
        }

        /**
         * Called by parser when an fatalError is encountered while parsing the 
XML
         * file.
         *
         * @build 10
         * @param ex
         *            is th exception that describes the error
         */
        public void fatalError(SAXParseException ex) {
                System.out.println("SOAP message fatal error: " + 
ex.getMessage());

                // parseError.append("\n");
                // parseError.append(ex.getMessage());
                // errorCount++;
        }

        /**
         * Called by parser when an warning is encountered while parsing the XML
         * file.
         *
         * @build 10
         * @param ex
         *            is th exception that describes the error
         */
        public void warning(SAXParseException ex) {
                System.out.println("SOAP message warning: " + ex.getMessage());

                // parseError.append("\n");
                // parseError.append(ex.getMessage());
                // errorCount++;
        }
}

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

Reply via email to