| /* |
| * Licensed to the Apache Software Foundation (ASF) under one or more |
| * contributor license agreements. See the NOTICE file distributed with |
| * this work for additional information regarding copyright ownership. |
| * The ASF licenses this file to You under the Apache License, Version 2.0 |
| * (the "License"); you may not use this file except in compliance with |
| * the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| package jaxp; |
| |
| import javax.xml.parsers.DocumentBuilder; |
| import javax.xml.parsers.DocumentBuilderFactory; |
| import javax.xml.parsers.SAXParser; |
| import javax.xml.parsers.SAXParserFactory; |
| |
| import junit.framework.TestCase; |
| |
| import org.xml.sax.ErrorHandler; |
| import org.xml.sax.SAXException; |
| import org.xml.sax.SAXParseException; |
| import org.xml.sax.XMLReader; |
| |
| /** |
| * Test JAXP 1.2 specific features |
| * |
| * @author Edwin Goei |
| * |
| * @version $Id$ |
| */ |
| public class JAXP12Tests extends TestCase implements JAXPConstants { |
| protected DocumentBuilderFactory dbf; |
| protected DocumentBuilder db; |
| protected DocumentBuilder dbn; |
| protected DocumentBuilder dbnv; |
| |
| SAXParserFactory spf; |
| SAXParser spn; |
| SAXParser spnv; |
| |
| public JAXP12Tests(String name) { |
| super(name); |
| } |
| |
| private static class MyErrorHandler implements ErrorHandler { |
| public void fatalError(SAXParseException x) throws SAXException { |
| x.printStackTrace(); |
| fail("ErrorHandler#fatalError() should not have been" + |
| " called: " + |
| x.getMessage() + |
| " [line = " + x.getLineNumber() + ", systemId = " + |
| x.getSystemId() + "]"); |
| } |
| public void error(SAXParseException x) throws SAXException { |
| x.printStackTrace(); |
| fail("ErrorHandler#error() should not have been called: " + |
| x.getMessage() + |
| " [line = " + x.getLineNumber() + ", systemId = " + |
| x.getSystemId() + "]"); |
| } |
| public void warning(SAXParseException x) throws SAXException { |
| x.printStackTrace(); |
| fail("ErrorHandler#warning() should not have been called: " |
| + x.getMessage() + |
| " [line = " + x.getLineNumber() + ", systemId = " + |
| x.getSystemId() + "]"); |
| } |
| } |
| |
| /** |
| * Overrides method error() to see if it was ever called |
| */ |
| private static class ErrorHandlerCheck extends MyErrorHandler { |
| Boolean gotError = Boolean.FALSE; |
| public void error(SAXParseException x) throws SAXException { |
| gotError = Boolean.TRUE; |
| throw x; |
| } |
| public Object getStatus() { |
| return gotError; |
| } |
| }; |
| |
| protected void setUp() throws Exception { |
| dbf = DocumentBuilderFactory.newInstance(); |
| db = dbf.newDocumentBuilder(); // non-namespaceAware version |
| dbf.setNamespaceAware(true); |
| dbn = dbf.newDocumentBuilder(); // namespaceAware version |
| dbn.setErrorHandler(new MyErrorHandler()); |
| dbf.setValidating(true); |
| dbnv = dbf.newDocumentBuilder(); // validating version |
| dbnv.setErrorHandler(new MyErrorHandler()); |
| |
| spf = SAXParserFactory.newInstance(); |
| spf.setNamespaceAware(true); |
| spn = spf.newSAXParser(); |
| spf.setValidating(true); |
| spnv = spf.newSAXParser(); |
| } |
| |
| /** |
| * Should not cause a validation error. Problem is that you get same |
| * result if no validation is occurring at all. See other tests that |
| * checks that validation actually occurs. |
| */ |
| public void testSaxParseXSD() throws Exception { |
| spnv.setProperty(JAXP_SCHEMA_LANGUAGE, W3C_XML_SCHEMA); |
| XMLReader xr = spnv.getXMLReader(); |
| xr.setErrorHandler(new MyErrorHandler()); |
| xr.parse(new InputData("personal-schema.xml")); |
| } |
| |
| /** |
| * Should cause a validation error. Checks that validation is indeed |
| * occurring. Warning: does not actually check for particular |
| * validation error, but assumes any exception thrown is a validation |
| * error of the type we expect. |
| */ |
| public void testSaxParseXSD2() throws Exception { |
| spnv.setProperty(JAXP_SCHEMA_LANGUAGE, W3C_XML_SCHEMA); |
| XMLReader xr = spnv.getXMLReader(); |
| |
| ErrorHandlerCheck meh = new ErrorHandlerCheck(); |
| xr.setErrorHandler(meh); |
| try { |
| xr.parse(new InputData("personal-schema-err.xml")); |
| fail("ErrorHandler.error() should have thrown a SAXParseException"); |
| } catch (SAXException x) { |
| assertEquals("Should have caused validation error.", |
| Boolean.TRUE, meh.getStatus()); |
| } |
| } |
| |
| /** |
| * Check that setting schemaSource overrides xsi: hint in instance doc |
| */ |
| public void testSaxParseSchemaSource() throws Exception { |
| spnv.setProperty(JAXP_SCHEMA_LANGUAGE, W3C_XML_SCHEMA); |
| spnv.setProperty(JAXP_SCHEMA_SOURCE, new InputData("personal.xsd")); |
| XMLReader xr = spnv.getXMLReader(); |
| xr.setErrorHandler(new MyErrorHandler()); |
| xr.parse(new InputData("personal-schema-badhint.xml")); |
| xr.parse(new InputData("personal-schema-nohint.xml")); |
| } |
| |
| /** |
| * Turn on DTD validation and expect an error b/c instance doc has no |
| * doctypedecl |
| */ |
| public void testSaxParseNoXSD() throws Exception { |
| XMLReader xr = spnv.getXMLReader(); |
| |
| ErrorHandlerCheck meh = new ErrorHandlerCheck(); |
| xr.setErrorHandler(meh); |
| try { |
| xr.parse(new InputData("personal-schema.xml")); |
| fail("ErrorHandler.error() should have thrown a SAXParseException"); |
| } catch (SAXException x) { |
| assertEquals("Should have caused validation error.", |
| Boolean.TRUE, meh.getStatus()); |
| } |
| } |
| |
| /** |
| * Should not cause a validation error. Problem is that you get same |
| * result if no validation is occurring at all. See other tests that |
| * checks that validation actually occurs. |
| */ |
| public void testDomParseXSD() throws Exception { |
| dbf.setNamespaceAware(true); |
| dbf.setValidating(true); |
| dbf.setAttribute(JAXP_SCHEMA_LANGUAGE, W3C_XML_SCHEMA); |
| DocumentBuilder mydb = dbf.newDocumentBuilder(); |
| mydb.setErrorHandler(new MyErrorHandler()); |
| mydb.parse(new InputData("personal-schema.xml")); |
| } |
| |
| /** |
| * Should cause a validation error. Checks that validation is indeed |
| * occurring. Warning: does not actually check for particular |
| * validation error, but assumes any exception thrown is a validation |
| * error of the type we expect. |
| */ |
| public void testDomParseXSD2() throws Exception { |
| dbf.setNamespaceAware(true); |
| dbf.setValidating(true); |
| dbf.setAttribute(JAXP_SCHEMA_LANGUAGE, W3C_XML_SCHEMA); |
| DocumentBuilder mydb = dbf.newDocumentBuilder(); |
| |
| ErrorHandlerCheck meh = new ErrorHandlerCheck(); |
| mydb.setErrorHandler(meh); |
| try { |
| mydb.parse(new InputData("personal-schema-err.xml")); |
| fail("ErrorHandler.error() should have thrown a SAXParseException"); |
| } catch (SAXException x) { |
| assertEquals("Should have caused validation error.", |
| Boolean.TRUE, meh.getStatus()); |
| } |
| } |
| |
| /** |
| * Check that setting schemaSource overrides xsi: hint in instance doc |
| */ |
| public void testDomParseSchemaSource() throws Exception { |
| dbf.setNamespaceAware(true); |
| dbf.setValidating(true); |
| dbf.setAttribute(JAXP_SCHEMA_LANGUAGE, W3C_XML_SCHEMA); |
| dbf.setAttribute(JAXP_SCHEMA_SOURCE, new InputData("personal.xsd")); |
| DocumentBuilder mydb = dbf.newDocumentBuilder(); |
| mydb.setErrorHandler(new MyErrorHandler()); |
| mydb.parse(new InputData("personal-schema-badhint.xml")); |
| mydb.parse(new InputData("personal-schema-nohint.xml")); |
| } |
| |
| /** |
| * Turn on DTD validation and expect an error b/c instance doc has no |
| * doctypedecl |
| */ |
| public void testDomParseNoXSD() throws Exception { |
| dbf.setNamespaceAware(true); |
| dbf.setValidating(true); |
| DocumentBuilder mydb = dbf.newDocumentBuilder(); |
| |
| ErrorHandlerCheck meh = new ErrorHandlerCheck(); |
| mydb.setErrorHandler(meh); |
| try { |
| mydb.parse(new InputData("personal-schema.xml")); |
| fail("ErrorHandler.error() should have thrown a SAXParseException"); |
| } catch (SAXException x) { |
| assertEquals("Should have caused validation error.", |
| Boolean.TRUE, meh.getStatus()); |
| } |
| } |
| |
| |
| } |