| /* |
| * Copyright (c) 1999, 2015, Oracle and/or its affiliates. All rights reserved. |
| * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
| * |
| * This code is free software; you can redistribute it and/or modify it |
| * under the terms of the GNU General Public License version 2 only, as |
| * published by the Free Software Foundation. |
| * |
| * This code 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 |
| * version 2 for more details (a copy is included in the LICENSE file that |
| * accompanied this code). |
| * |
| * You should have received a copy of the GNU General Public License version |
| * 2 along with this work; if not, write to the Free Software Foundation, |
| * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. |
| * |
| * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
| * or visit www.oracle.com if you need additional information or have any |
| * questions. |
| */ |
| |
| package javax.xml.parsers.ptests; |
| |
| import static javax.xml.XMLConstants.W3C_XML_SCHEMA_NS_URI; |
| import static javax.xml.parsers.ptests.ParserTestConst.GOLDEN_DIR; |
| import static javax.xml.parsers.ptests.ParserTestConst.XML_DIR; |
| import static jaxp.library.JAXPTestUtilities.USER_DIR; |
| import static jaxp.library.JAXPTestUtilities.compareWithGold; |
| import static jaxp.library.JAXPTestUtilities.filenameToURL; |
| import static org.testng.Assert.assertEquals; |
| import static org.testng.Assert.assertFalse; |
| import static org.testng.Assert.assertNotNull; |
| import static org.testng.Assert.assertNull; |
| import static org.testng.Assert.assertTrue; |
| |
| import java.io.BufferedReader; |
| import java.io.Closeable; |
| import java.io.File; |
| import java.io.FileInputStream; |
| import java.io.FileNotFoundException; |
| import java.io.FilePermission; |
| import java.io.FileReader; |
| |
| import javax.xml.parsers.DocumentBuilder; |
| import javax.xml.parsers.DocumentBuilderFactory; |
| import javax.xml.parsers.FactoryConfigurationError; |
| import javax.xml.parsers.ParserConfigurationException; |
| import javax.xml.parsers.SAXParser; |
| import javax.xml.parsers.SAXParserFactory; |
| import javax.xml.transform.Transformer; |
| import javax.xml.transform.TransformerFactory; |
| import javax.xml.transform.dom.DOMSource; |
| import javax.xml.transform.sax.SAXResult; |
| |
| import jaxp.library.JAXPDataProvider; |
| import jaxp.library.JAXPFileBaseTest; |
| |
| import org.testng.annotations.DataProvider; |
| import org.testng.annotations.Test; |
| import org.w3c.dom.Document; |
| import org.w3c.dom.Element; |
| import org.w3c.dom.NodeList; |
| import org.xml.sax.InputSource; |
| import org.xml.sax.SAXException; |
| import org.xml.sax.helpers.DefaultHandler; |
| |
| /** |
| * @bug 8080907 |
| * This checks the methods of DocumentBuilderFactoryImpl. |
| */ |
| public class DocumentBuilderFactoryTest extends JAXPFileBaseTest { |
| /** |
| * DocumentBuilderFactory implementation class name. |
| */ |
| private static final String DOCUMENT_BUILDER_FACTORY_CLASSNAME = "com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl"; |
| |
| /** |
| * Provide valid DocumentBuilderFactory instantiation parameters. |
| * |
| * @return a data provider contains DocumentBuilderFactory instantiation parameters. |
| */ |
| @DataProvider(name = "parameters") |
| public Object[][] getValidateParameters() { |
| return new Object[][] { { DOCUMENT_BUILDER_FACTORY_CLASSNAME, null }, { DOCUMENT_BUILDER_FACTORY_CLASSNAME, this.getClass().getClassLoader() } }; |
| } |
| |
| /** |
| * Test for DocumentBuilderFactory.newInstance(java.lang.String |
| * factoryClassName, java.lang.ClassLoader classLoader) factoryClassName |
| * points to correct implementation of |
| * javax.xml.parsers.DocumentBuilderFactory , should return newInstance of |
| * DocumentBuilderFactory |
| * |
| * @param factoryClassName |
| * @param classLoader |
| * @throws ParserConfigurationException |
| */ |
| @Test(dataProvider = "parameters") |
| public void testNewInstance(String factoryClassName, ClassLoader classLoader) throws ParserConfigurationException { |
| DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(factoryClassName, classLoader); |
| DocumentBuilder builder = dbf.newDocumentBuilder(); |
| assertNotNull(builder); |
| } |
| |
| /** |
| * test for DocumentBuilderFactory.newInstance(java.lang.String |
| * factoryClassName, java.lang.ClassLoader classLoader) factoryClassName is |
| * null , should throw FactoryConfigurationError |
| * |
| * @param factoryClassName |
| * @param classLoader |
| */ |
| @Test(expectedExceptions = FactoryConfigurationError.class, dataProvider = "new-instance-neg", dataProviderClass = JAXPDataProvider.class) |
| public void testNewInstanceNeg(String factoryClassName, ClassLoader classLoader) { |
| DocumentBuilderFactory.newInstance(factoryClassName, classLoader); |
| } |
| |
| /** |
| * Test the default functionality of schema support method. |
| * @throws Exception If any errors occur. |
| */ |
| @Test |
| public void testCheckSchemaSupport1() throws Exception { |
| DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); |
| dbf.setValidating(true); |
| dbf.setNamespaceAware(true); |
| dbf.setAttribute("http://java.sun.com/xml/jaxp/properties/schemaLanguage", |
| W3C_XML_SCHEMA_NS_URI); |
| MyErrorHandler eh = MyErrorHandler.newInstance(); |
| DocumentBuilder db = dbf.newDocumentBuilder(); |
| db.setErrorHandler(eh); |
| db.parse(new File(XML_DIR, "test.xml")); |
| assertFalse(eh.isErrorOccured()); |
| } |
| |
| @DataProvider(name = "schema-source") |
| public Object[][] getSchemaSource() throws FileNotFoundException { |
| return new Object[][] { |
| { new FileInputStream(new File(XML_DIR, "test.xsd")) }, |
| { new InputSource(filenameToURL(XML_DIR + "test.xsd")) } }; |
| } |
| |
| /** |
| * Test the default functionality of schema support method. In |
| * this case the schema source property is set. |
| * @throws Exception If any errors occur. |
| */ |
| @Test(dataProvider = "schema-source") |
| public void testCheckSchemaSupport2(Object schemaSource) throws Exception { |
| try { |
| DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); |
| dbf.setValidating(true); |
| dbf.setNamespaceAware(true); |
| dbf.setAttribute("http://java.sun.com/xml/jaxp/properties/schemaLanguage", |
| W3C_XML_SCHEMA_NS_URI); |
| dbf.setAttribute("http://java.sun.com/xml/jaxp/properties/schemaSource", schemaSource); |
| MyErrorHandler eh = MyErrorHandler.newInstance(); |
| DocumentBuilder db = dbf.newDocumentBuilder(); |
| db.setErrorHandler(eh); |
| db.parse(new File(XML_DIR, "test1.xml")); |
| assertFalse(eh.isErrorOccured()); |
| } finally { |
| if (schemaSource instanceof Closeable) { |
| ((Closeable) schemaSource).close(); |
| } |
| } |
| |
| } |
| |
| /** |
| * Test the default functionality of schema support method. In |
| * this case the schema source property is set. |
| * @throws Exception If any errors occur. |
| */ |
| @Test(dataProvider = "schema-source") |
| public void testCheckSchemaSupport3(Object schemaSource) throws Exception { |
| try { |
| SAXParserFactory spf = SAXParserFactory.newInstance(); |
| spf.setValidating(true); |
| spf.setNamespaceAware(true); |
| SAXParser sp = spf.newSAXParser(); |
| sp.setProperty("http://java.sun.com/xml/jaxp/properties/schemaLanguage", |
| W3C_XML_SCHEMA_NS_URI); |
| sp.setProperty("http://java.sun.com/xml/jaxp/properties/schemaSource", schemaSource); |
| DefaultHandler dh = new DefaultHandler(); |
| // Not expect any unrecoverable error here. |
| sp.parse(new File(XML_DIR, "test1.xml"), dh); |
| } finally { |
| if (schemaSource instanceof Closeable) { |
| ((Closeable) schemaSource).close(); |
| } |
| } |
| } |
| |
| /** |
| * Test the default functionality of newInstance method. To test |
| * the isCoalescing method and setCoalescing This checks to see if the CDATA |
| * and text nodes got combined In that case it will print "<xml>This |
| * is not parsed</xml> yet". |
| * @throws Exception If any errors occur. |
| */ |
| @Test |
| public void testCheckDocumentBuilderFactory02() throws Exception { |
| DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); |
| dbf.setCoalescing(true); |
| DocumentBuilder docBuilder = dbf.newDocumentBuilder(); |
| Document doc = docBuilder.parse(new File(XML_DIR, "DocumentBuilderFactory01.xml")); |
| Element e = (Element) doc.getElementsByTagName("html").item(0); |
| NodeList nl = e.getChildNodes(); |
| assertEquals(nl.getLength(), 1); |
| } |
| |
| /** |
| * Test the isIgnoringComments. By default it is false. |
| */ |
| @Test |
| public void testCheckDocumentBuilderFactory03() { |
| DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); |
| assertFalse(dbf.isIgnoringComments()); |
| } |
| |
| /** |
| * Test the isValidating. By default it is false, set it to true and then |
| * use a document which is not valid. It should throw a warning or |
| * an error at least. The test passes in case retval 0 is set in the error |
| * method . |
| * @throws Exception If any errors occur. |
| */ |
| @Test |
| public void testCheckDocumentBuilderFactory04() throws Exception { |
| MyErrorHandler eh = MyErrorHandler.newInstance(); |
| DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); |
| dbf.setValidating(true); |
| DocumentBuilder db = dbf.newDocumentBuilder(); |
| db.setErrorHandler(eh); |
| db.parse(new File(XML_DIR, "DocumentBuilderFactory05.xml")); |
| assertTrue(eh.isErrorOccured()); |
| } |
| |
| /** |
| * Test the setValidating. By default it is false, use a |
| * document which is not valid. It should not throw a warning or an error. |
| * The test passes in case the return value equals 1. |
| * @throws Exception If any errors occur. |
| */ |
| @Test |
| public void testCheckDocumentBuilderFactory16() throws Exception { |
| MyErrorHandler eh = MyErrorHandler.newInstance(); |
| DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); |
| DocumentBuilder db = dbf.newDocumentBuilder(); |
| db.setErrorHandler(eh); |
| db.parse(new File(XML_DIR, "DocumentBuilderFactory05.xml")); |
| assertFalse(eh.isErrorOccured()); |
| } |
| |
| /** |
| * Test the setValidating. By default it is false, use a |
| * document which is valid. It should not throw a warning or an error. The |
| * test passes in case the return value equals 1. |
| * @throws Exception If any errors occur. |
| */ |
| @Test |
| public void testCheckDocumentBuilderFactory17() throws Exception { |
| MyErrorHandler eh = MyErrorHandler.newInstance(); |
| DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); |
| DocumentBuilder db = dbf.newDocumentBuilder(); |
| db.setErrorHandler(eh); |
| db.parse(new File(XML_DIR, "DocumentBuilderFactory04.xml")); |
| assertFalse(eh.isErrorOccured()); |
| } |
| |
| /** |
| * Test the isExpandEntityReferences. By default it is true. |
| * @throws Exception If any errors occur. |
| */ |
| @Test |
| public void testCheckDocumentBuilderFactory05() throws Exception { |
| try(FileInputStream fis = new FileInputStream(new File( |
| XML_DIR, "DocumentBuilderFactory02.xml"))) { |
| DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); |
| DocumentBuilder docBuilder = dbf.newDocumentBuilder(); |
| Document doc = docBuilder.parse(fis); |
| Element e = (Element) doc.getElementsByTagName("title").item(0); |
| NodeList nl = e.getChildNodes(); |
| assertTrue(dbf.isExpandEntityReferences()); |
| assertEquals(nl.item(0).getNodeValue().trim().charAt(0), 'W'); |
| } |
| } |
| |
| /** |
| * Test the default functionality of setValidating method. The |
| * XML file has a DTD which has namespaces defined. The parser takes care to |
| * check if the namespaces using elements and defined attributes are there |
| * or not. |
| * @throws Exception If any errors occur. |
| */ |
| @Test |
| public void testCheckDocumentBuilderFactory06() throws Exception { |
| DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); |
| dbf.setValidating(true); |
| DocumentBuilder db = dbf.newDocumentBuilder(); |
| MyErrorHandler eh = MyErrorHandler.newInstance(); |
| db.setErrorHandler(eh); |
| Document doc = db.parse(new File(XML_DIR, "DocumentBuilderFactory04.xml")); |
| assertTrue(doc instanceof Document); |
| assertFalse(eh.isErrorOccured()); |
| } |
| |
| /** |
| * Test the setExpandEntityReferences. |
| * @throws Exception If any errors occur. |
| */ |
| @Test |
| public void testCheckDocumentBuilderFactory07() throws Exception { |
| try (FileInputStream fis = new FileInputStream(new File( |
| XML_DIR, "DocumentBuilderFactory02.xml"))) { |
| DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); |
| dbf.setExpandEntityReferences(true); |
| DocumentBuilder docBuilder = dbf.newDocumentBuilder(); |
| Document doc = docBuilder.parse(fis); |
| Element e = (Element) doc.getElementsByTagName("title").item(0); |
| NodeList nl = e.getChildNodes(); |
| assertTrue(dbf.isExpandEntityReferences()); |
| assertEquals(nl.item(0).getNodeValue().trim().charAt(0), 'W'); |
| } |
| } |
| |
| /** |
| * Test the setExpandEntityReferences. |
| * @throws Exception If any errors occur. |
| */ |
| @Test |
| public void testCheckDocumentBuilderFactory08() throws Exception { |
| try (FileInputStream fis = new FileInputStream(new File( |
| XML_DIR, "DocumentBuilderFactory02.xml"))) { |
| DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); |
| dbf.setExpandEntityReferences(false); |
| DocumentBuilder docBuilder = dbf.newDocumentBuilder(); |
| Document doc = docBuilder.parse(fis); |
| Element e = (Element) doc.getElementsByTagName("title").item(0); |
| NodeList nl = e.getChildNodes(); |
| assertNull(nl.item(0).getNodeValue()); |
| } |
| } |
| |
| /** |
| * Test the setIgnoringComments. By default it is set to false. |
| * explicitly setting it to false, it recognizes the comment which is in |
| * Element Node Hence the Element's child node is not null. |
| * @throws Exception If any errors occur. |
| */ |
| @Test |
| public void testCheckDocumentBuilderFactory09() throws Exception { |
| try (FileInputStream fis = new FileInputStream(new File( |
| XML_DIR, "DocumentBuilderFactory07.xml"))) { |
| DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); |
| dbf.setIgnoringComments(false); |
| DocumentBuilder docBuilder = dbf.newDocumentBuilder(); |
| Document doc = docBuilder.parse(fis); |
| Element e = (Element) doc.getElementsByTagName("body").item(0); |
| NodeList nl = e.getChildNodes(); |
| assertNotNull(nl.item(0).getNodeValue()); |
| } |
| } |
| |
| /** |
| * This tests for the parse(InputSource). |
| * @throws Exception If any errors occur. |
| */ |
| @Test |
| public void testCheckDocumentBuilderFactory10() throws Exception { |
| try (BufferedReader br = new BufferedReader(new FileReader(new File( |
| XML_DIR, "DocumentBuilderFactory07.xml")))) { |
| DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); |
| DocumentBuilder docBuilder = dbf.newDocumentBuilder(); |
| Document doc = docBuilder.parse(new InputSource(br)); |
| assertNotNull(doc); |
| } |
| } |
| |
| /** |
| * This tests for the parse InputStream with SystemID as a second parameter. |
| * @throws Exception If any errors occur. |
| */ |
| @Test |
| public void testCheckDocumentBuilderFactory11() throws Exception { |
| try (FileInputStream fis = new FileInputStream(new File( |
| XML_DIR, "dbf10import.xsl"))) { |
| DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); |
| DocumentBuilder docBuilder = dbf.newDocumentBuilder(); |
| Document doc = docBuilder.parse(fis, new File(XML_DIR).toURI() |
| .toASCIIString()); |
| assertNotNull(doc); |
| } |
| } |
| |
| /** |
| * This tests for the parse InputStream with empty SystemID as a second |
| * parameter. |
| * @throws Exception If any errors occur. |
| */ |
| @Test |
| public void testCheckDocumentBuilderFactory12() throws Exception { |
| try (FileInputStream fis = new FileInputStream(new File( |
| XML_DIR, "dbf10import.xsl"))) { |
| DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); |
| DocumentBuilder docBuilder = dbf.newDocumentBuilder(); |
| Document doc = docBuilder.parse(fis, " "); |
| assertNotNull(doc); |
| } |
| } |
| |
| /** |
| * This tests for the parse(uri). |
| * @throws Exception If any errors occur. |
| */ |
| @Test |
| public void testCheckDocumentBuilderFactory13() throws Exception { |
| // Accesing default working directory. |
| String workingDir = getSystemProperty("user.dir"); |
| setPermissions(new FilePermission(workingDir + "/*", "read")); |
| DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); |
| DocumentBuilder docBuilder = dbf.newDocumentBuilder(); |
| Document doc = docBuilder.parse(new File(XML_DIR + "dbf10import.xsl") |
| .toURI().toASCIIString()); |
| assertNotNull(doc); |
| } |
| |
| /** |
| * This tests for the parse(uri) with empty string as parameter should |
| * throw Sax Exception. |
| * @throws Exception If any errors occur. |
| */ |
| @Test(expectedExceptions = SAXException.class) |
| public void testCheckDocumentBuilderFactory14() throws Exception { |
| // Accesing default working directory. |
| String workingDir = getSystemProperty("user.dir"); |
| setPermissions(new FilePermission(workingDir, "read")); |
| DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); |
| DocumentBuilder docBuilder = dbf.newDocumentBuilder(); |
| docBuilder.parse(""); |
| } |
| |
| /** |
| * This tests for the parse (uri) with null uri as parameter should throw |
| * IllegalArgumentException. |
| * @throws Exception If any errors occur. |
| * |
| */ |
| @Test(expectedExceptions = IllegalArgumentException.class) |
| public void testCheckDocumentBuilderFactory15() throws Exception { |
| DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); |
| DocumentBuilder docBuilder = dbf.newDocumentBuilder(); |
| String uri = null; |
| docBuilder.parse(uri); |
| } |
| |
| /** |
| * Test the setIgnoringComments. By default it is set to false, |
| * setting this to true, It does not recognize the comment, Here the |
| * nodelist has a length 0 because the ignoring comments is true. |
| * @throws Exception If any errors occur. |
| */ |
| @Test |
| public void testCheckIgnoringComments() throws Exception { |
| try (FileInputStream fis = new FileInputStream(new File( |
| XML_DIR, "DocumentBuilderFactory08.xml"))) { |
| DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); |
| dbf.setIgnoringComments(true); |
| DocumentBuilder docBuilder = dbf.newDocumentBuilder(); |
| Document doc = docBuilder.parse(fis); |
| Element e = (Element) doc.getElementsByTagName("body").item(0); |
| NodeList nl = e.getChildNodes(); |
| assertEquals(nl.getLength(), 0); |
| } |
| } |
| |
| /** |
| * Test the default behaviour of setIgnoringComments. By default |
| * it is set to false, this is similar to case 9 but not setIgnoringComments |
| * explicitly, it does not recognize the comment. |
| * @throws Exception If any errors occur. |
| */ |
| @Test |
| public void testCheckIgnoringComments1() throws Exception { |
| try (FileInputStream fis = new FileInputStream(new File( |
| XML_DIR, "DocumentBuilderFactory07.xml"))) { |
| DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); |
| DocumentBuilder docBuilder = dbf.newDocumentBuilder(); |
| Document doc = docBuilder.parse(fis); |
| Element e = (Element) doc.getElementsByTagName("body").item(0); |
| NodeList nl = e.getChildNodes(); |
| assertFalse(dbf.isIgnoringComments()); |
| assertNotNull(nl.item(0).getNodeValue()); |
| } |
| } |
| |
| /** |
| * Test for the isIgnoringElementContentWhitespace and the |
| * setIgnoringElementContentWhitespace. The xml file has all kinds of |
| * whitespace,tab and newline characters, it uses the MyNSContentHandler |
| * which does not invoke the characters callback when this |
| * setIgnoringElementContentWhitespace is set to true. |
| * @throws Exception If any errors occur. |
| */ |
| @Test |
| public void testCheckElementContentWhitespace() throws Exception { |
| String goldFile = GOLDEN_DIR + "dbfactory02GF.out"; |
| String outputFile = USER_DIR + "dbfactory02.out"; |
| MyErrorHandler eh = MyErrorHandler.newInstance(); |
| DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); |
| dbf.setValidating(true); |
| assertFalse(dbf.isIgnoringElementContentWhitespace()); |
| dbf.setIgnoringElementContentWhitespace(true); |
| DocumentBuilder db = dbf.newDocumentBuilder(); |
| db.setErrorHandler(eh); |
| Document doc = db.parse(new File(XML_DIR, "DocumentBuilderFactory06.xml")); |
| assertFalse(eh.isErrorOccured()); |
| DOMSource domSource = new DOMSource(doc); |
| TransformerFactory tfactory = TransformerFactory.newInstance(); |
| Transformer transformer = tfactory.newTransformer(); |
| SAXResult saxResult = new SAXResult(); |
| try(MyCHandler handler = MyCHandler.newInstance(new File(outputFile))) { |
| saxResult.setHandler(handler); |
| transformer.transform(domSource, saxResult); |
| } |
| assertTrue(compareWithGold(goldFile, outputFile)); |
| } |
| } |