Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  /*
   * ValidateWithXSD.java
   *
   * Copyright 2008 Mark Logic Corporation.
   * All rights reserved.
   *
   * This program is free software: you can redistribute it and/or modify
   * it under the terms of the GNU General Public License as published by
   * the Free Software Foundation, either version 2 of the License, or
  * (at your option) any later version.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  * GNU General Public License for more details.
  *
  * You should have received a copy of the GNU General Public License
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
 package com.xmlcalabash.library;
 
 
 
 import java.net.URI;

Author(s):
ndw
 
 public class ValidateWithXSD extends DefaultStep {
     private static final QName _assert_valid = new QName("""assert-valid");
     private static final QName _mode = new QName("""mode");
     private static final QName _use_location_hints = new QName("""use-location-hints");
     private static final QName _try_namespaces = new QName("""try-namespaces");
     private static final QName _line = new QName("line");
     private static final QName _column = new QName("column");
 
     private static final Class [] paramTypes = new Class [] {};
     private ReadablePipe source = null;
     private ReadablePipe schemas = null;
     private WritablePipe result = null;
     private URI docBaseURI = null;
     private Throwable validationException = null;

    
Creates a new instance of ValidateWithXSD
 
     public ValidateWithXSD(XProcRuntime runtimeXAtomicStep step) {
         super(runtime,step);
     }
 
     public void setInput(String portReadablePipe pipe) {
         if ("source".equals(port)) {
              = pipe;
         } else if ("schema".equals(port)) {
              = pipe;
         }
     }
 
     public void setOutput(String portWritablePipe pipe) {
          = pipe;
    }
    public void reset() {
        .resetReader();
        .resetWriter();
    }
    public void run() throws SaxonApiException {
        super.run();
        Processor proc = .getProcessor();
        SchemaManager manager = proc.getSchemaManager();
        if (manager == null) {
            validateWithXerces();
        } else {
            validateWithSaxonSA(manager);
        }
    }
    public void validateWithSaxonSA(SchemaManager managerthrows SaxonApiException {
        fine(.getNode(), "Validating with Saxon");
        // Saxon 9.2.0.4j introduces a clearSchemaCache method on Configuration.
        // Call it if it's available.
        try {
            Method clearSchemaCache = config.getClass().getMethod("clearSchemaCache");
            clearSchemaCache.invoke(config);
            finest(.getNode(), "Cleared schema cache.");
        } catch (NoSuchMethodException nsme) {
            // nop; oh, well
            finest(.getNode(), "Cannot reset schema cache.");
        } catch (IllegalAccessException nsme) {
            // nop; oh, well
            finest(.getNode(), "Cannot reset schema cache.");
        } catch (InvocationTargetException nsme) {
            // nop; oh, well
            finest(.getNode(), "Cannot reset schema cache.");
        }
        XdmNode doc = .read();
         = doc.getBaseURI();
        String namespace = S9apiUtils.getDocumentElement(doc).getNodeName().getNamespaceURI();
        boolean tryNamespaces = getOption(false) && !"".equals(namespace);
        // Populate the URI cache so that URI references in schema documents will find
        // the schemas provided preferentially
        Vector<XdmNodeschemaDocuments = new Vector<XdmNode> ();
        while (.moreDocuments()) {
            XdmNode schemaNode = .read();
            String targetNS = schemaNode.getBaseURI().toASCIIString();
            finer(.getNode(), "Caching input schema: " + targetNS);
            if (targetNS.equals(namespace)) {
                tryNamespaces = false;
            }
            schemaDocuments.add(schemaNode);
            .getResolver().cache(schemaNodeschemaNode.getBaseURI());
        }
        if (tryNamespaces) {
            // Need to load one more schema
            try {
                XdmNode nsSchemaDoc = .parse(namespacedoc.getBaseURI().toASCIIString(), false);
                schemaDocuments.add(nsSchemaDoc);
                .getResolver().cache(nsSchemaDocnsSchemaDoc.getBaseURI());
            } catch (Exception e) {
                // nevermind
            }
        }
        // FIXME: HACK! Do this the right way
        for (XdmNode schemaNode : schemaDocuments) {
            InputSource schemaSource = S9apiUtils.xdmToInputSource(schemaNode);
            schemaSource.setSystemId(schemaNode.getBaseURI().toASCIIString());
            SAXSource source = new SAXSource(schemaSource);
            manager.load(source);
        }
        XdmDestination destination = new XdmDestination();
        Controller controller = new Controller(config);
        Receiver receiver = destination.getReceiver(controller.getConfiguration());
        PipelineConfiguration pipe = controller.makePipelineConfiguration();
        receiver.setPipelineConfiguration(pipe);
        SchemaValidator validator = manager.newSchemaValidator();
        validator.setDestination(destination);
        validator.setErrorListener(new XSDErrorHandler());
        String mode = getOption("strict");
        validator.setLax("lax".equals(mode));
        boolean useHints = getOption(false);
        validator.setUseXsiSchemaLocation(useHints);
        
        try {
            finer(.getNode(), "Validating: " + doc.getBaseURI().toASCIIString());
            validator.validate(doc.asSource());
            if ( != null) {
                throw (SaxonApiException;
            }
        } catch (SaxonApiException sae) {
            if (getOption(,false)) {
                throw new XProcException(XProcConstants.stepError(53), sae);
            }
        }
        
        XdmNode valid = destination.getXdmNode();
        .write(valid);
    }
    private void validateWithXerces() throws SaxonApiException {
        fine(.getNode(), "Validating with Xerces");
        Vector<XdmNodeschemaDocuments = new Vector<XdmNode> ();
        while (.moreDocuments()) {
            XdmNode schemaNode = .read();
            schemaDocuments.add(schemaNode);
            .getResolver().cache(schemaNodeschemaNode.getBaseURI());
        }
        XdmNode doc = .read();
         = doc.getBaseURI();
        try {
            SchemaFactory factory = SchemaFactory.newInstance(.);
            .getConfigurer().getJaxpConfigurer().configSchemaFactory(factory);
            XdmNode schemaNode = schemaDocuments.get(0);
            InputSource is = S9apiUtils.xdmToInputSource(schemaNode);
            is.setSystemId(schemaNode.getBaseURI().toASCIIString());
            Schema schema = factory.newSchema(new SAXSource(is));
            Validator validator = schema.newValidator();
            validator.setErrorHandler(new XSDErrorHandler());
            InputSource docSource = S9apiUtils.xdmToInputSource(doc);
            docSource.setSystemId(doc.getBaseURI().toASCIIString());
            try {
                validator.validate(new SAXSource(docSource));
                if ( != null) {
                    throw (SAXParseException;
                }
            } catch (SAXParseException spe) {
                if (getOption(false)) {
                    throw new XProcException(XProcConstants.stepError(53), spe);
                }
            }
        } catch (SAXException se) {
            throw new XProcException(se);
        } catch (IOException ioe) {
            throw new XProcException(ioe);
        }
        .write(doc);
    }
    class XSDErrorHandler implements ErrorHandlerErrorListener {
        @Override
        public void fatalError(SAXParseException ethrows SAXException {
            error(e);
        }
        @Override
        public void error(SAXParseException ethrows SAXException {
            TreeWriter treeWriter = new TreeWriter();
            treeWriter.startDocument();
            treeWriter.addStartElement(.);
            if (e.getLineNumber()!=-1) {
                treeWriter.addAttribute(""+e.getLineNumber());
            }
            if (e.getColumnNumber()!=-1) {
                treeWriter.addAttribute(""+e.getColumnNumber());
            }
            treeWriter.startContent();
            treeWriter.addText(e.toString());
            treeWriter.addEndElement();
            treeWriter.addText("\n");
            treeWriter.endDocument();
            .reportError(treeWriter.getResult());
            if ( == null) {
                 = e;
            }
        }
        @Override
        public void warningSAXParseException e ) {
            // ignore warnings
        }
        @Override
        public void warning(TransformerException ethrows TransformerException {
            // Ignore warnings?
        }
        @Override
        public void error(TransformerException ethrows TransformerException {
            TreeWriter treeWriter = new TreeWriter();
            treeWriter.startDocument();
            treeWriter.addStartElement(.);
            SourceLocator loc = e.getLocator();
            if (loc != null) {
                if (loc.getLineNumber() != -1) {
                    treeWriter.addAttribute(""+loc.getLineNumber());
                }
                if (loc.getColumnNumber() != -1) {
                    treeWriter.addAttribute(""+loc.getColumnNumber());
                }
            }
            treeWriter.startContent();
            treeWriter.addText(e.toString());
            treeWriter.addEndElement();
            treeWriter.addText("\n");
            treeWriter.endDocument();
            .reportError(treeWriter.getResult());
            if ( == null) {
                 = e;
            }
        }
        @Override
        public void fatalError(TransformerException ethrows TransformerException {
            error(e);
        }
    }
New to GrepCode? Check out our FAQ X