| /* |
| * 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. |
| */ |
| /* |
| * $Id$ |
| */ |
| |
| /* |
| * |
| * SystemIdImpInclTest.java |
| * |
| */ |
| package org.apache.qetest.trax; |
| |
| import java.io.File; |
| import java.io.FileInputStream; |
| import java.io.FileOutputStream; |
| import java.io.IOException; |
| import java.io.InputStream; |
| import java.io.InputStreamReader; |
| import java.net.URL; |
| import java.net.URLConnection; |
| import java.util.Properties; |
| |
| import javax.xml.parsers.DocumentBuilder; |
| import javax.xml.parsers.DocumentBuilderFactory; |
| import javax.xml.parsers.SAXParser; |
| import javax.xml.parsers.SAXParserFactory; |
| import javax.xml.transform.Result; |
| import javax.xml.transform.Source; |
| import javax.xml.transform.Templates; |
| import javax.xml.transform.Transformer; |
| import javax.xml.transform.TransformerFactory; |
| import javax.xml.transform.dom.DOMSource; |
| import javax.xml.transform.sax.SAXSource; |
| import javax.xml.transform.sax.SAXTransformerFactory; |
| import javax.xml.transform.stream.StreamResult; |
| import javax.xml.transform.stream.StreamSource; |
| |
| import org.apache.qetest.FileBasedTest; |
| import org.apache.qetest.Logger; |
| import org.apache.qetest.OutputNameManager; |
| import org.apache.qetest.QetestUtils; |
| import org.apache.qetest.xsl.XSLTestfileInfo; |
| import org.w3c.dom.Node; |
| import org.xml.sax.InputSource; |
| import org.xml.sax.XMLReader; |
| |
| //------------------------------------------------------------------------- |
| |
| /** |
| * Test behavior of imports/includes with various setSystemId sources. |
| * <b>Note:</b> This test is directory-dependent, so if there are |
| * any fails, check the code to see what the test file is expecting |
| * the path/directory/etc. to be. |
| * //@todo More variations on kinds of systemIds: file: id's that |
| * are absolute, etc.; any/all other forms of id's like http: |
| * (which will require network resources available). |
| * |
| * @author shane_curcuru@lotus.com |
| * @version $Id$ |
| */ |
| public class SystemIdImpInclTest extends FileBasedTest |
| { |
| |
| /** |
| * Provides nextName(), currentName() functionality for tests |
| * that may produce any number of output files. |
| */ |
| protected OutputNameManager outNames; |
| |
| /** |
| * Name of a valid, known-good xsl/xml file pair we can use. |
| */ |
| protected XSLTestfileInfo testFileInfo = new XSLTestfileInfo(); |
| |
| /** |
| * Just basename of a valid, known-good file, both .xsl/.xml . |
| */ |
| protected String knownGoodBaseName = null; |
| |
| /** Gold filename for level0, i.e. one directory above the testfile. */ |
| protected String goldFileLevel0 = "SystemIdImpInclLevel0.out"; |
| |
| /** Gold filename for level1, i.e. the directory of the testfile. */ |
| protected String goldFileLevel1 = "SystemIdImpInclLevel1.out"; |
| |
| /** Gold filename for level2, i.e. a directory below the testfile. */ |
| protected String goldFileLevel2 = "SystemIdImpInclLevel2.out"; |
| |
| /** Gold filename for http, i.e. a from a webserver. */ |
| protected String goldFileHttp = "SystemIdImpInclHttp.out"; |
| |
| /** Subdirectory under test\tests\api for our xsl/xml files. */ |
| public static final String TRAX_SUBDIR = "trax"; |
| |
| /** Convenience variable for user.dir - cached during test. */ |
| protected String savedUserDir = null; |
| |
| /** Just initialize test name, comment, numTestCases. */ |
| public SystemIdImpInclTest() |
| { |
| numTestCases = 3; // Set numTestCases to 3 to skip the 4th one that does http: |
| testName = "SystemIdImpInclTest"; |
| testComment = "Test behavior of imports/includes with various setSystemId sources"; |
| } |
| |
| |
| /** |
| * Initialize this test - Set names of xml/xsl test files, |
| * cache user.dir property. |
| * |
| * @param p Properties to initialize from (unused) |
| * @return false if we should abort the test; true otherwise |
| */ |
| public boolean doTestFileInit(Properties p) |
| { |
| // Used for all tests; just dump files in trax subdir |
| File outSubDir = new File(outputDir + File.separator + TRAX_SUBDIR); |
| if (!outSubDir.mkdirs()) |
| reporter.logWarningMsg("Could not create output dir: " + outSubDir); |
| // Initialize an output name manager to that dir with .out extension |
| outNames = new OutputNameManager(outputDir + File.separator + TRAX_SUBDIR |
| + File.separator + testName, ".out"); |
| |
| String testBasePath = inputDir |
| + File.separator |
| + TRAX_SUBDIR |
| + File.separator; |
| String goldBasePath = goldDir |
| + File.separator |
| + TRAX_SUBDIR |
| + File.separator; |
| |
| // Just bare pathnames, not URI's |
| knownGoodBaseName = "SystemIdImpIncl"; |
| testFileInfo.inputName = testBasePath + knownGoodBaseName + ".xsl"; |
| testFileInfo.xmlName = testBasePath + knownGoodBaseName + ".xml"; |
| testFileInfo.goldName = goldBasePath + knownGoodBaseName + ".out"; |
| goldFileLevel0 = goldBasePath + goldFileLevel0; // just prepend path |
| goldFileLevel1 = goldBasePath + goldFileLevel1; // just prepend path |
| goldFileLevel2 = goldBasePath + goldFileLevel2; // just prepend path |
| goldFileHttp = goldBasePath + goldFileHttp; // just prepend path |
| |
| // Cache user.dir property |
| savedUserDir = System.getProperty("user.dir"); |
| reporter.logHashtable(Logger.STATUSMSG, System.getProperties(), "System.getProperties()"); |
| reporter.logHashtable(Logger.STATUSMSG, testProps, "testProps"); |
| |
| return true; |
| } |
| |
| |
| /** |
| * Cleanup this test - uncache user.dir property. |
| * |
| * @param p Properties to initialize from (if needed) |
| * @return false if we should abort the test; true otherwise |
| */ |
| public boolean doTestFileClose(Properties p) |
| { |
| // Uncache user.dir property |
| System.getProperties().put("user.dir", savedUserDir); |
| return true; |
| } |
| |
| |
| /** |
| * Simple StreamSources with different setSystemIds. |
| * |
| * @return false if we should abort the test; true otherwise |
| */ |
| public boolean testCase1() |
| { |
| reporter.testCaseInit("Simple StreamSources with different setSystemIds"); |
| |
| TransformerFactory factory = null; |
| try |
| { |
| factory = TransformerFactory.newInstance(); |
| } |
| catch (Throwable t) |
| { |
| reporter.checkFail("Problem creating factory; can't continue testcase"); |
| reporter.logThrowable(reporter.ERRORMSG, t, |
| "Problem creating factory; can't continue testcase"); |
| return true; |
| } |
| try |
| { |
| // Verify we can do basic transforms with readers/streams, |
| // with the 'normal' systemId |
| reporter.logInfoMsg("StreamSource.setSystemId(level1)"); |
| InputStream xslStream1 = new FileInputStream(testFileInfo.inputName); |
| Source xslSource1 = new StreamSource(xslStream1); |
| xslSource1.setSystemId(QetestUtils.filenameToURL(testFileInfo.inputName)); |
| |
| InputStream xmlStream1 = new FileInputStream(testFileInfo.xmlName); |
| Source xmlSource1 = new StreamSource(xmlStream1); |
| xmlSource1.setSystemId(QetestUtils.filenameToURL(testFileInfo.xmlName)); |
| |
| reporter.logTraceMsg("Create FileOutputStream to " + outNames.nextName()); |
| FileOutputStream fos1 = new FileOutputStream(outNames.currentName()); |
| Result result1 = new StreamResult(fos1); |
| |
| Templates templates1 = factory.newTemplates(xslSource1); |
| Transformer transformer1 = templates1.newTransformer(); |
| reporter.logInfoMsg("About to transform, systemId(level1)"); |
| transformer1.transform(xmlSource1, result1); |
| fos1.close(); // must close ostreams we own |
| if (Logger.PASS_RESULT |
| != fileChecker.check(reporter, |
| new File(outNames.currentName()), |
| new File(goldFileLevel1), |
| "transform after setSystemId(level1) into " + outNames.currentName()) |
| ) |
| reporter.logInfoMsg("transform after setSystemId(level1)... failure reason:" + fileChecker.getExtendedInfo()); |
| } |
| catch (Throwable t) |
| { |
| reporter.checkFail("Problem with setSystemId(level1)"); |
| reporter.logThrowable(reporter.ERRORMSG, t, "Problem with after setSystemId(level1)"); |
| } |
| |
| try |
| { |
| // Verify we can do basic transforms with readers/streams, |
| // systemId set up one level |
| reporter.logInfoMsg("StreamSource.setSystemId(level0)"); |
| InputStream xslStream1 = new FileInputStream(testFileInfo.inputName); |
| Source xslSource1 = new StreamSource(xslStream1); |
| xslSource1.setSystemId(QetestUtils.filenameToURL(inputDir + File.separator + knownGoodBaseName + ".xsl")); |
| |
| InputStream xmlStream1 = new FileInputStream(testFileInfo.xmlName); |
| Source xmlSource1 = new StreamSource(xmlStream1); |
| xmlSource1.setSystemId(QetestUtils.filenameToURL(inputDir + File.separator + knownGoodBaseName + ".xml")); |
| |
| reporter.logTraceMsg("Create FileOutputStream to " + outNames.nextName()); |
| FileOutputStream fos1 = new FileOutputStream(outNames.currentName()); |
| Result result1 = new StreamResult(fos1); |
| |
| Templates templates1 = factory.newTemplates(xslSource1); |
| Transformer transformer1 = templates1.newTransformer(); |
| reporter.logInfoMsg("About to transform, systemId(level0)"); |
| transformer1.transform(xmlSource1, result1); |
| fos1.close(); // must close ostreams we own |
| if (Logger.PASS_RESULT |
| != fileChecker.check(reporter, |
| new File(outNames.currentName()), |
| new File(goldFileLevel0), |
| "transform after setSystemId(level0) into " + outNames.currentName()) |
| ) |
| reporter.logInfoMsg("transform after setSystemId(level0)... failure reason:" + fileChecker.getExtendedInfo()); |
| } |
| catch (Throwable t) |
| { |
| reporter.checkFail("Problem with setSystemId(level0)"); |
| reporter.logThrowable(reporter.ERRORMSG, t, "Problem with setSystemId(level0)"); |
| } |
| |
| try |
| { |
| // Verify we can do basic transforms with readers/streams, |
| // with the systemId down one level |
| reporter.logInfoMsg("StreamSource.setSystemId(level2)"); |
| InputStream xslStream1 = new FileInputStream(testFileInfo.inputName); |
| Source xslSource1 = new StreamSource(xslStream1); |
| xslSource1.setSystemId(QetestUtils.filenameToURL(inputDir + "/trax/systemid/" + knownGoodBaseName + ".xsl")); |
| |
| InputStream xmlStream1 = new FileInputStream(testFileInfo.xmlName); |
| Source xmlSource1 = new StreamSource(xmlStream1); |
| xmlSource1.setSystemId(QetestUtils.filenameToURL(inputDir + "/trax/systemid/" + knownGoodBaseName + ".xml")); |
| |
| reporter.logTraceMsg("Create FileOutputStream to " + outNames.nextName()); |
| FileOutputStream fos1 = new FileOutputStream(outNames.currentName()); |
| Result result1 = new StreamResult(fos1); |
| |
| Templates templates1 = factory.newTemplates(xslSource1); |
| Transformer transformer1 = templates1.newTransformer(); |
| reporter.logInfoMsg("About to transform, systemId(level2)"); |
| transformer1.transform(xmlSource1, result1); |
| fos1.close(); // must close ostreams we own |
| if (Logger.PASS_RESULT |
| != fileChecker.check(reporter, |
| new File(outNames.currentName()), |
| new File(goldFileLevel2), |
| "transform after setSystemId(level2) into " + outNames.currentName()) |
| ) |
| reporter.logInfoMsg("transform after setSystemId(level2)... failure reason:" + fileChecker.getExtendedInfo()); |
| } |
| catch (Throwable t) |
| { |
| reporter.checkFail("Problem with setSystemId(level2)"); |
| reporter.logThrowable(reporter.ERRORMSG, t, "Problem with setSystemId(level2)"); |
| } |
| |
| try |
| { |
| // Verify we can do basic transforms with readers/streams, |
| // with the systemId down one level |
| reporter.logInfoMsg("StreamSource.setSystemId(xslonly level2)"); |
| InputStream xslStream1 = new FileInputStream(testFileInfo.inputName); |
| Source xslSource1 = new StreamSource(xslStream1); |
| xslSource1.setSystemId(QetestUtils.filenameToURL(inputDir + "/trax/systemid/" + knownGoodBaseName + ".xsl")); |
| |
| InputStream xmlStream1 = new FileInputStream(testFileInfo.xmlName); |
| Source xmlSource1 = new StreamSource(xmlStream1); |
| // Explicitly don't set the xmlId - shouldn't be needed |
| |
| reporter.logTraceMsg("Create FileOutputStream to " + outNames.nextName()); |
| FileOutputStream fos1 = new FileOutputStream(outNames.currentName()); |
| Result result1 = new StreamResult(fos1); |
| |
| Templates templates1 = factory.newTemplates(xslSource1); |
| Transformer transformer1 = templates1.newTransformer(); |
| reporter.logInfoMsg("About to transform, systemId(xslonly level2)"); |
| transformer1.transform(xmlSource1, result1); |
| fos1.close(); // must close ostreams we own |
| if (Logger.PASS_RESULT |
| != fileChecker.check(reporter, |
| new File(outNames.currentName()), |
| new File(goldFileLevel2), |
| "transform after setSystemId(xslonly level2) into " + outNames.currentName()) |
| ) |
| reporter.logInfoMsg("transform after setSystemId(xslonly level2)... failure reason:" + fileChecker.getExtendedInfo()); |
| } |
| catch (Throwable t) |
| { |
| reporter.checkFail("Problem with setSystemId(xslonly level2)"); |
| reporter.logThrowable(reporter.ERRORMSG, t, "Problem with setSystemId(xslonly level2)"); |
| } |
| reporter.testCaseClose(); |
| return true; |
| } |
| |
| /** |
| * Verify simple SAXSources with systemIds. |
| * |
| * @return false if we should abort the test; true otherwise |
| */ |
| public boolean testCase2() |
| { |
| reporter.testCaseInit("Verify simple SAXSources with systemIds"); |
| |
| TransformerFactory factory = null; |
| SAXTransformerFactory saxFactory = null; |
| InputSource xslInpSrc = null; |
| Source xslSource = null; |
| Source xmlSource = null; |
| try |
| { |
| factory = TransformerFactory.newInstance(); |
| saxFactory = (SAXTransformerFactory)factory; |
| } |
| catch (Throwable t) |
| { |
| reporter.checkFail("Problem creating factory; can't continue testcase"); |
| reporter.logThrowable(reporter.ERRORMSG, t, |
| "Problem creating factory; can't continue testcase"); |
| return true; |
| } |
| try |
| { |
| // Verify basic transforms with with various systemId |
| // and a SAXSource(InputSource(String)) |
| // level0: one level up |
| /******************************** |
| // SAXSource(impSrc(str)) level0, level2 |
| // Note: these cases may not be valid to test, since the setSystemId |
| // call will effectively overwrite the underlying InputSource's |
| // real systemId, and thus the stylesheet can't be built |
| // Answer: write a custom test case that parses the stylesheet |
| // and builds it, but doesn't get imports/includes until later |
| // when we have setSystemId |
| xslInpSrc = new InputSource(new InputStreamReader(new FileInputStream(testFileInfo.inputName), "UTF-8")); //@DEM |
| // xslInpSrc = new InputSource(new FileReader(testFileInfo.inputName)); @DEM |
| xslSource = new SAXSource(xslInpSrc); |
| |
| xmlSource = new StreamSource(new FileInputStream(testFileInfo.xmlName)); |
| xmlSource.setSystemId(QetestUtils.filenameToURL(testFileInfo.xmlName)); |
| |
| checkSourceWithSystemId(xslSource, QetestUtils.filenameToURL(inputDir + File.separator + knownGoodBaseName + ".xsl"), |
| xmlSource, goldFileLevel0, |
| "SAXSource(inpSrc(str)).systemId(level0: one up)"); |
| ********************************/ |
| // level1: same systemId as actual file |
| // @DEM changes are to allow test to run on various |
| // platforms regardeless of encodings; force it to |
| // be UTF-8 since that's what's checked in |
| xslInpSrc = new InputSource(new InputStreamReader(new FileInputStream(testFileInfo.inputName), "UTF-8")); //@DEM |
| // xslInpSrc = new InputSource(new FileReader(testFileInfo.inputName)); @DEM |
| xslSource = new SAXSource(xslInpSrc); |
| |
| xmlSource = new StreamSource(new FileInputStream(testFileInfo.xmlName)); |
| xmlSource.setSystemId(QetestUtils.filenameToURL(testFileInfo.xmlName)); |
| |
| checkSourceWithSystemId(xslSource, QetestUtils.filenameToURL(testFileInfo.inputName), |
| xmlSource, goldFileLevel1, |
| "SAXSource(inpSrc(str)).systemId(level1: same level)"); |
| |
| // level2: one level down |
| /******************************** |
| // SAXSource(impSrc(str)) level0, level2 |
| // Note: these cases may not be valid to test, since the setSystemId |
| // call will effectively overwrite the underlying InputSource's |
| // real systemId, and thus the stylesheet can't be built |
| // Answer: write a custom test case that parses the stylesheet |
| // and builds it, but doesn't get imports/includes until later |
| // when we have setSystemId |
| xslInpSrc = new InputSource(new InputStreamReader(new FileInputStream(testFileInfo.inputName), "UTF-8")); //@DEM |
| // xslInpSrc = new InputSource(new FileReader(testFileInfo.inputName)); @DEM |
| xslSource = new SAXSource(xslInpSrc); |
| |
| xmlSource = new StreamSource(new FileInputStream(testFileInfo.xmlName)); |
| xmlSource.setSystemId(QetestUtils.filenameToURL(testFileInfo.xmlName)); |
| |
| checkSourceWithSystemId(xslSource, QetestUtils.filenameToURL(inputDir + "/trax/systemid/" + knownGoodBaseName + ".xsl"), |
| xmlSource, goldFileLevel2, |
| "SAXSource(inpSrc(str)).systemId(level2: one down)"); |
| ********************************/ |
| reporter.logTraceMsg("@todo: add test for SAXSource with reset systemId (see code comments)"); |
| } |
| catch (Throwable t) |
| { |
| reporter.checkFail("Problem with SAXSources(1)"); |
| reporter.logThrowable(reporter.ERRORMSG, t, "Problem with SAXSources(1)"); |
| } |
| try |
| { |
| // Verify basic transforms with with various systemId |
| // and a SAXSource(InputSource(InputStream)) |
| // level0: one level up |
| xslInpSrc = new InputSource(new FileInputStream(testFileInfo.inputName)); |
| xslSource = new SAXSource(xslInpSrc); |
| |
| xmlSource = new StreamSource(new FileInputStream(testFileInfo.xmlName)); |
| xmlSource.setSystemId(QetestUtils.filenameToURL(testFileInfo.xmlName)); |
| |
| checkSourceWithSystemId(xslSource, QetestUtils.filenameToURL(inputDir + File.separator + knownGoodBaseName + ".xsl"), |
| xmlSource, goldFileLevel0, |
| "SAXSource(inpSrc(byteS)).systemId(level0: one up)"); |
| |
| // level1: same systemId as actual file |
| xslInpSrc = new InputSource(new FileInputStream(testFileInfo.inputName)); |
| xslSource = new SAXSource(xslInpSrc); |
| |
| xmlSource = new StreamSource(new FileInputStream(testFileInfo.xmlName)); |
| xmlSource.setSystemId(QetestUtils.filenameToURL(testFileInfo.xmlName)); |
| |
| checkSourceWithSystemId(xslSource, QetestUtils.filenameToURL(testFileInfo.inputName), |
| xmlSource, goldFileLevel1, |
| "SAXSource(inpSrc(byteS)).systemId(level1: same level)"); |
| |
| // level2: one level down |
| xslInpSrc = new InputSource(new FileInputStream(testFileInfo.inputName)); |
| xslSource = new SAXSource(xslInpSrc); |
| |
| xmlSource = new StreamSource(new FileInputStream(testFileInfo.xmlName)); |
| xmlSource.setSystemId(QetestUtils.filenameToURL(testFileInfo.xmlName)); |
| |
| checkSourceWithSystemId(xslSource, QetestUtils.filenameToURL(inputDir + "/trax/systemid/" + knownGoodBaseName + ".xsl"), |
| xmlSource, goldFileLevel2, |
| "SAXSource(inpSrc(byteS)).systemId(level2: one down)"); |
| |
| // Verify basic transforms with with various systemId |
| // and a SAXSource(InputSource(Reader)) |
| // level0: one level up |
| xslInpSrc = new InputSource(new InputStreamReader(new FileInputStream(testFileInfo.inputName), "UTF-8")); //@DEM |
| // xslInpSrc = new InputSource(new FileReader(testFileInfo.inputName)); @DEM |
| xslSource = new SAXSource(xslInpSrc); |
| |
| xmlSource = new StreamSource(new FileInputStream(testFileInfo.xmlName)); |
| xmlSource.setSystemId(QetestUtils.filenameToURL(testFileInfo.xmlName)); |
| |
| checkSourceWithSystemId(xslSource, QetestUtils.filenameToURL(inputDir + File.separator + knownGoodBaseName + ".xsl"), |
| xmlSource, goldFileLevel0, |
| "SAXSource(inpSrc(charS)).systemId(level0: one up)"); |
| |
| // level1: same systemId as actual file |
| xslInpSrc = new InputSource(new InputStreamReader(new FileInputStream(testFileInfo.inputName), "UTF-8")); //@DEM |
| // xslInpSrc = new InputSource(new FileReader(testFileInfo.inputName)); @DEM |
| xslSource = new SAXSource(xslInpSrc); |
| |
| xmlSource = new StreamSource(new FileInputStream(testFileInfo.xmlName)); |
| xmlSource.setSystemId(QetestUtils.filenameToURL(testFileInfo.xmlName)); |
| |
| checkSourceWithSystemId(xslSource, QetestUtils.filenameToURL(testFileInfo.inputName), |
| xmlSource, goldFileLevel1, |
| "SAXSource(inpSrc(charS)).systemId(level1: same level)"); |
| |
| // level2: one level down |
| xslInpSrc = new InputSource(new InputStreamReader(new FileInputStream(testFileInfo.inputName), "UTF-8")); //@DEM |
| // xslInpSrc = new InputSource(new FileReader(testFileInfo.inputName)); @DEM |
| xslSource = new SAXSource(xslInpSrc); |
| |
| xmlSource = new StreamSource(new FileInputStream(testFileInfo.xmlName)); |
| xmlSource.setSystemId(QetestUtils.filenameToURL(testFileInfo.xmlName)); |
| |
| checkSourceWithSystemId(xslSource, QetestUtils.filenameToURL(inputDir + "/trax/systemid/" + knownGoodBaseName + ".xsl"), |
| xmlSource, goldFileLevel2, |
| "SAXSource(inpSrc(charS)).systemId(level2: one down)"); |
| |
| // Verify basic transforms with with various systemId |
| // and a SAXSource(XMLReader, InputSource(various)) |
| // Be sure to use the JAXP methods only! |
| SAXParserFactory spfactory = SAXParserFactory.newInstance(); |
| spfactory.setNamespaceAware(true); |
| SAXParser saxParser = spfactory.newSAXParser(); |
| XMLReader reader = saxParser.getXMLReader(); |
| // level0: one level up, with a character stream |
| xslInpSrc = new InputSource(new InputStreamReader(new FileInputStream(testFileInfo.inputName), "UTF-8")); //@DEM |
| // xslInpSrc = new InputSource(new FileReader(testFileInfo.inputName)); @DEM |
| xslSource = new SAXSource(reader, xslInpSrc); |
| |
| xmlSource = new StreamSource(new FileInputStream(testFileInfo.xmlName)); |
| xmlSource.setSystemId(QetestUtils.filenameToURL(testFileInfo.xmlName)); |
| |
| checkSourceWithSystemId(xslSource, QetestUtils.filenameToURL(inputDir + File.separator + knownGoodBaseName + ".xsl"), |
| xmlSource, goldFileLevel0, |
| "SAXSource(reader, inpSrc(charS)).systemId(level0: one up)"); |
| |
| // level1: same systemId as actual file, with a systemId |
| saxParser = spfactory.newSAXParser(); |
| reader = saxParser.getXMLReader(); |
| xslInpSrc = new InputSource(testFileInfo.inputName); |
| xslSource = new SAXSource(reader, xslInpSrc); |
| |
| xmlSource = new StreamSource(new FileInputStream(testFileInfo.xmlName)); |
| xmlSource.setSystemId(QetestUtils.filenameToURL(testFileInfo.xmlName)); |
| |
| checkSourceWithSystemId(xslSource, QetestUtils.filenameToURL(testFileInfo.inputName), |
| xmlSource, goldFileLevel1, |
| "SAXSource(reader, inpSrc(str)).systemId(level1: same level)"); |
| |
| // level2: one level down, with a byte stream |
| saxParser = spfactory.newSAXParser(); |
| reader = saxParser.getXMLReader(); |
| xslInpSrc = new InputSource(new FileInputStream(testFileInfo.inputName)); |
| xslSource = new SAXSource(reader, xslInpSrc); |
| |
| xmlSource = new StreamSource(new FileInputStream(testFileInfo.xmlName)); |
| xmlSource.setSystemId(QetestUtils.filenameToURL(testFileInfo.xmlName)); |
| |
| checkSourceWithSystemId(xslSource, QetestUtils.filenameToURL(inputDir + "/trax/systemid/" + knownGoodBaseName + ".xsl"), |
| xmlSource, goldFileLevel2, |
| "SAXSource(reader, inpSrc(byteS)).systemId(level2: one down)"); |
| } |
| catch (Throwable t) |
| { |
| reporter.checkFail("Problem with SAXSources(2)"); |
| reporter.logThrowable(reporter.ERRORMSG, t, "Problem with SAXSources(2)"); |
| } |
| |
| reporter.testCaseClose(); |
| return true; |
| } |
| |
| /** |
| * Verify simple DOMSources with systemIds. |
| * |
| * @return false if we should abort the test; true otherwise |
| */ |
| public boolean testCase3() |
| { |
| reporter.testCaseInit("Verify simple DOMSources with systemIds"); |
| TransformerFactory factory = null; |
| DocumentBuilderFactory dfactory = null; |
| DocumentBuilder docBuilder = null; |
| Node xslNode = null; |
| Source xslSource = null; |
| Source xmlSource = null; |
| |
| try |
| { |
| factory = TransformerFactory.newInstance(); |
| dfactory = DocumentBuilderFactory.newInstance(); |
| dfactory.setNamespaceAware(true); |
| } |
| catch (Throwable t) |
| { |
| reporter.checkFail("Problem creating factory; can't continue testcase"); |
| reporter.logThrowable(reporter.ERRORMSG, t, |
| "Problem creating factory; can't continue testcase"); |
| return true; |
| } |
| try |
| { |
| docBuilder = dfactory.newDocumentBuilder(); |
| |
| // Verify basic transforms with with various systemId |
| // and a DOMSource(InputSource(String)) |
| // level0: one level up |
| reporter.logTraceMsg("about to parse(InputSource(" + QetestUtils.filenameToURL(testFileInfo.inputName) + "))"); |
| xslNode = docBuilder.parse(new InputSource(QetestUtils.filenameToURL(testFileInfo.inputName))); |
| xslSource = new DOMSource(xslNode); |
| |
| xmlSource = new StreamSource(new FileInputStream(testFileInfo.xmlName)); |
| xmlSource.setSystemId(QetestUtils.filenameToURL(testFileInfo.xmlName)); |
| |
| checkSourceWithSystemId(xslSource, QetestUtils.filenameToURL(inputDir + File.separator + knownGoodBaseName + ".xsl"), |
| xmlSource, goldFileLevel0, |
| "DOMSource(inpSrc(str)).systemId(level0: one up)"); |
| |
| // level1: same systemId as actual file |
| reporter.logTraceMsg("about to parse(InputSource(" + QetestUtils.filenameToURL(testFileInfo.inputName) + "))"); |
| xslNode = docBuilder.parse(new InputSource(QetestUtils.filenameToURL(testFileInfo.inputName))); |
| xslSource = new DOMSource(xslNode); |
| |
| xmlSource = new StreamSource(new FileInputStream(testFileInfo.xmlName)); |
| xmlSource.setSystemId(QetestUtils.filenameToURL(testFileInfo.xmlName)); |
| |
| checkSourceWithSystemId(xslSource, QetestUtils.filenameToURL(testFileInfo.inputName), |
| xmlSource, goldFileLevel1, |
| "DOMSource(inpSrc(str)).systemId(level1: same level)"); |
| |
| // level2: one level down |
| reporter.logTraceMsg("about to parse(InputSource(" + QetestUtils.filenameToURL(testFileInfo.inputName) + "))"); |
| xslNode = docBuilder.parse(new InputSource(QetestUtils.filenameToURL(testFileInfo.inputName))); |
| xslSource = new DOMSource(xslNode); |
| |
| xmlSource = new StreamSource(new FileInputStream(testFileInfo.xmlName)); |
| xmlSource.setSystemId(QetestUtils.filenameToURL(testFileInfo.xmlName)); |
| |
| checkSourceWithSystemId(xslSource, QetestUtils.filenameToURL(inputDir + "/trax/systemid/" + knownGoodBaseName + ".xsl"), |
| xmlSource, goldFileLevel2, |
| "DOMSource(inpSrc(str)).systemId(level2: one down)"); |
| |
| // Sample extra test: DOMSource that had systemId set |
| // differently in the constructor - tests that you can |
| // later call setSystemId and have it work |
| // level0: one level up |
| reporter.logTraceMsg("about to parse(InputSource(" + QetestUtils.filenameToURL(testFileInfo.inputName) + "))"); |
| xslNode = docBuilder.parse(new InputSource(QetestUtils.filenameToURL(testFileInfo.inputName))); |
| // Set the original systemId to itself, or level1 |
| xslSource = new DOMSource(xslNode, QetestUtils.filenameToURL(testFileInfo.inputName)); |
| |
| xmlSource = new StreamSource(new FileInputStream(testFileInfo.xmlName)); |
| xmlSource.setSystemId(QetestUtils.filenameToURL(testFileInfo.xmlName)); |
| |
| // Test it with a level0, or one level up systemId |
| checkSourceWithSystemId(xslSource, QetestUtils.filenameToURL(inputDir + File.separator + knownGoodBaseName + ".xsl"), |
| xmlSource, goldFileLevel0, |
| "DOMSource(inpSrc(str),sysId-level1).systemId(level0: one up)"); |
| } |
| catch (Throwable t) |
| { |
| reporter.checkFail("Problem with DOMSources(1)"); |
| reporter.logThrowable(reporter.ERRORMSG, t, "Problem with DOMSources(1)"); |
| } |
| |
| |
| |
| reporter.testCaseClose(); |
| return true; |
| } |
| |
| |
| /** |
| * Verify various simple Sources with http: systemIds. |
| * Test may be commented out until we have a better way to |
| * maintain and check for existence and correct content of |
| * stylesheets on the http server. |
| * |
| * @return false if we should abort the test; true otherwise |
| */ |
| public boolean testCase4() |
| { |
| reporter.testCaseInit("Verify various simple Sources with http: systemIds"); |
| |
| // This is the name of a directory on the apache server |
| // that has impincl\SystemIdInclude.xsl and |
| // impincl\SystemIdImport.xsl files on it - obviously, |
| // your JVM must have access to this server to successfully |
| // run this portion of the test! |
| String httpSystemIdBase = "http://xml.apache.org/xalan-j/test"; |
| |
| // Verify http connectivity |
| // If your JVM environment can't connect to the http: |
| // server, then we can't complete the test |
| // This could happen due to various network problems, |
| // not being connected, firewalls, etc. |
| try |
| { |
| reporter.logInfoMsg("verifing http connectivity before continuing testCase"); |
| // Note hard-coded path to one of the two files we'll be relying on |
| URL testURL = new URL(httpSystemIdBase + "/impincl/SystemIdInclude.xsl"); |
| URLConnection urlConnection = testURL.openConnection(); |
| // Ensure we don't get a cached copy |
| urlConnection.setUseCaches(false); |
| // Ensure we don't get asked interactive questions |
| urlConnection.setAllowUserInteraction(false); |
| // Actually connect to the document; will throw |
| // IOException if anything goes wrong |
| urlConnection.connect(); |
| // Convenience: log out when the doc was last modified |
| reporter.logInfoMsg(testURL.toString() + " last modified: " |
| + urlConnection.getLastModified()); |
| int contentLen = urlConnection.getContentLength(); |
| reporter.logStatusMsg("URL.getContentLength() was: " + contentLen); |
| if (contentLen < 1) |
| { |
| // if no content, throw 'fake' exception to |
| // short-circut test case |
| throw new IOException("URL.getContentLength() was: " + contentLen); |
| } |
| // Also verify that the file there contains (some of) the data we expect! |
| reporter.logTraceMsg("calling urlConnection.getContent()..."); |
| Object content = urlConnection.getContent(); |
| if (null == content) |
| { |
| // if no content, throw 'fake' exception to |
| // short-circut test case |
| throw new IOException("URL.getContent() was null!"); |
| } |
| reporter.logTraceMsg("getContent().toString() is now: " + content.toString()); |
| |
| //@todo we should also verify some key strings in the |
| // expected .xsl file here, if possible |
| } |
| catch (IOException ioe) |
| { |
| reporter.logThrowable(Logger.ERRORMSG, ioe, "Can't connect threw"); |
| reporter.logErrorMsg("Can't connect to: " + httpSystemIdBase |
| + "/impincl/SystemIdInclude.xsl, skipping testcase"); |
| reporter.checkPass("FAKE PASS RECORD; testCase was skipped"); |
| // Skip the rest of the testcase |
| reporter.testCaseClose(); |
| return true; |
| } |
| |
| |
| TransformerFactory factory = null; |
| Source xslSource = null; |
| Source xmlSource = null; |
| |
| try |
| { |
| factory = TransformerFactory.newInstance(); |
| } |
| catch (Throwable t) |
| { |
| reporter.checkFail("Problem creating factory; can't continue testcase"); |
| reporter.logThrowable(reporter.ERRORMSG, t, |
| "Problem creating factory; can't continue testcase"); |
| return true; |
| } |
| try |
| { |
| // Verify StreamSource from local disk with a |
| // http: systemId for imports/includes |
| xslSource = new StreamSource(new FileInputStream(testFileInfo.inputName)); |
| |
| xmlSource = new StreamSource(new FileInputStream(testFileInfo.xmlName)); |
| xmlSource.setSystemId(QetestUtils.filenameToURL(testFileInfo.xmlName)); |
| |
| // Note that the systemId set (the second argument below) |
| // must be the path to the proper 'directory' level |
| // on the webserver: setting it to just ".../test" |
| // will fail, since it be considered a file of that |
| // name, not the directory |
| checkSourceWithSystemId(xslSource, httpSystemIdBase + "/", |
| xmlSource, goldFileHttp, |
| "StreamSource().systemId(http:)"); |
| |
| xslSource = new StreamSource(new FileInputStream(testFileInfo.inputName)); |
| |
| xmlSource = new StreamSource(new FileInputStream(testFileInfo.xmlName)); |
| xmlSource.setSystemId(QetestUtils.filenameToURL(testFileInfo.xmlName)); |
| |
| checkSourceWithSystemId(xslSource, httpSystemIdBase + "/" + knownGoodBaseName + ".xsl", |
| xmlSource, goldFileHttp, |
| "StreamSource().systemId(http:)"); |
| } |
| catch (Throwable t) |
| { |
| reporter.checkFail("Problem with http systemIds(1)"); |
| reporter.logThrowable(reporter.ERRORMSG, t, "Problem with http systemIds(1)"); |
| } |
| |
| reporter.testCaseClose(); |
| return true; |
| } |
| |
| |
| /** |
| * Worker method to test setting SystemId and doing transform. |
| * Simply does:<pre> |
| * xslSrc.setSystemId(systemId); |
| * templates = factory.newTemplates(xslSrc); |
| * transformer = templates.newTransformer(); |
| * transformer.transform(xmlSrc, StreamResult(...)); |
| * fileChecker.check(... goldFileName, desc) |
| * </pre> |
| * Also catches any exceptions and logs them as fails. |
| * |
| * @param xslSrc Source to use for stylesheet |
| * @param systemId systemId to set on the stylesheet |
| * @param xmlSrc Source to use for XML input data |
| * @param goldFileName name of expected file to compare with |
| * @param desc description of this test |
| */ |
| public void checkSourceWithSystemId(Source xslSrc, String systemId, |
| Source xmlSrc, String goldFileName, |
| String desc) |
| { |
| reporter.logTraceMsg(desc + " (" + systemId + ")"); |
| try |
| { |
| TransformerFactory factory = TransformerFactory.newInstance(); |
| xslSrc.setSystemId(systemId); |
| |
| // Use the next available output name for result |
| FileOutputStream fos = new FileOutputStream(outNames.nextName()); |
| Result outputResult = new StreamResult(fos); |
| |
| Templates templates = factory.newTemplates(xslSrc); |
| Transformer transformer = templates.newTransformer(); |
| transformer.transform(xmlSrc, outputResult); |
| fos.close(); // must close ostreams we own |
| if (Logger.PASS_RESULT |
| != fileChecker.check(reporter, |
| new File(outNames.currentName()), |
| new File(goldFileName), |
| desc + " (" + systemId + ") into: " + outNames.currentName()) |
| ) |
| reporter.logInfoMsg(desc + "... failure reason:" + fileChecker.getExtendedInfo()); |
| } |
| catch (Throwable t) |
| { |
| reporter.checkFail(desc + " threw: " + t.toString()); |
| reporter.logThrowable(reporter.ERRORMSG, t, desc + " threw"); |
| } |
| } |
| |
| |
| /** |
| * Convenience method to print out usage information - update if needed. |
| * @return String denoting usage of this test class |
| */ |
| public String usage() |
| { |
| return ("Common [optional] options supported by SystemIdImpInclTest:\n" |
| + "(Note: assumes inputDir=.\\tests\\api)\n" |
| + "(Note: test is directory-dependent!)\n" |
| + super.usage()); // Grab our parent classes usage as well |
| } |
| |
| |
| /** |
| * Main method to run test from the command line - can be left alone. |
| * @param args command line argument array |
| */ |
| public static void main(String[] args) |
| { |
| SystemIdImpInclTest app = new SystemIdImpInclTest(); |
| app.doMain(args); |
| } |
| } |