package dk.kb.yggdrasil.xslt; import java.io.ByteArrayInputStream; import java.io.File; import java.net.URL; import javax.xml.transform.stream.StreamSource; import org.junit.Assert; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.JUnit4; import dk.kb.yggdrasil.exceptions.YggdrasilException; @RunWith(JUnit4.class) public class TestXslt { @Test public void testContentFile() throws Exception { testXslt("valhal/xml/content_file.xml", "xslt/file.xsl"); } @Test public void testContentFileUpdate() throws Exception { testXslt("valhal/xml/content_file_update.xml", "xslt/file.xsl"); } @Test public void testInstance() throws Exception { testXslt("valhal/xml/instance.xml", "xslt/instance.xsl"); } @Test public void testInstanceWithUnorderedMultipleFiles() throws Exception { testXslt("valhal/xml/instance_with_unordered_multiple_files.xml", "xslt/instance.xsl"); } @Test public void testInstanceUpdate() throws Exception { testXslt("valhal/xml/instance_update.xml", "xslt/instance.xsl"); } @Test public void testInstanceNamespacelessMods() throws Exception { testXslt("valhal/xml/namespaceless_mods.xml", "xslt/instance.xsl"); } public void testXslt(String xmlFilename, String xslFilename) throws Exception { URL url; File file; StreamSource source; XslTransformer transformer; boolean bool; url = this.getClass().getClassLoader().getResource(""); File cacheDir = new File(new File(url.getFile()), "entity_cache"); if (!cacheDir.exists() && !cacheDir.mkdirs()) { Assert.fail("Could not make entity_cache directory!"); } XslUriResolver uriResolver = new XslUriResolver(); XslErrorListener errorListener = new XslErrorListener(); XmlEntityResolver entityResolver = new XmlEntityResolver(cacheDir); XmlErrorHandler errorHandler = new XmlErrorHandler(); XmlValidator xmlValidator = new XmlValidator(); XmlValidationResult result = new XmlValidationResult(); /* * Try to initialize and validate some XSL files. */ try { url = this.getClass().getClassLoader().getResource(xslFilename); file = new File(url.getFile()); source = new StreamSource(file); //source.setSystemId(file.getPath()); transformer = XslTransformer.getTransformer(source); Assert.assertNotNull(transformer); url = this.getClass().getClassLoader().getResource(xmlFilename); file = new File(url.getFile()); source = new StreamSource(file); byte[] bytes = transformer.transform(source, uriResolver, errorListener); /* * With ErrorHandler. */ bool = xmlValidator.testStructuralValidity(new ByteArrayInputStream(bytes), entityResolver, errorHandler, result); Assert.assertTrue(xmlFilename, bool); Assert.assertNull(result.systemId); Assert.assertFalse(result.bDtdUsed); Assert.assertTrue(result.bXsdUsed); Assert.assertEquals(0, errorHandler.numberOfErrors); Assert.assertEquals(0, errorHandler.numberOfFatalErrors); Assert.assertEquals(0, errorHandler.numberOfWarnings); Assert.assertTrue(result.bWellformed); Assert.assertFalse(result.bValid); bool = xmlValidator.testDefinedValidity(new ByteArrayInputStream(bytes), entityResolver, errorHandler, result); Assert.assertTrue("Should create valid xml from file '" + xmlFilename + "' with xslt '" + xslFilename + "'", bool); Assert.assertNull(result.systemId); Assert.assertFalse(result.bDtdUsed); Assert.assertTrue(result.bXsdUsed); Assert.assertEquals(0, errorHandler.numberOfErrors); Assert.assertEquals(0, errorHandler.numberOfFatalErrors); Assert.assertEquals(0, errorHandler.numberOfWarnings); Assert.assertTrue(result.bWellformed); Assert.assertTrue(result.bValid); /* * Without ErrorHandler. */ bool = xmlValidator.testStructuralValidity(new ByteArrayInputStream(bytes), entityResolver, null, result); Assert.assertTrue(bool); Assert.assertNull(result.systemId); Assert.assertFalse(result.bDtdUsed); Assert.assertTrue(result.bXsdUsed); Assert.assertTrue(result.bWellformed); Assert.assertFalse(result.bValid); bool = xmlValidator.testDefinedValidity(new ByteArrayInputStream(bytes), entityResolver, null, result); Assert.assertTrue(bool); Assert.assertNull(result.systemId); Assert.assertFalse(result.bDtdUsed); Assert.assertTrue(result.bXsdUsed); Assert.assertTrue(result.bWellformed); Assert.assertTrue(result.bValid); /* * Validity only with ErrorHandler. */ bool = xmlValidator.testDefinedValidity(new ByteArrayInputStream(bytes), entityResolver, errorHandler, result); Assert.assertTrue(bool); Assert.assertNull(result.systemId); Assert.assertFalse(result.bDtdUsed); Assert.assertTrue(result.bXsdUsed); Assert.assertEquals(0, errorHandler.numberOfErrors); Assert.assertEquals(0, errorHandler.numberOfFatalErrors); Assert.assertEquals(0, errorHandler.numberOfWarnings); Assert.assertTrue(result.bWellformed); Assert.assertTrue(result.bValid); /* * Validity only without ErrorHandler. */ bool = xmlValidator.testDefinedValidity(new ByteArrayInputStream(bytes), entityResolver, null, result); Assert.assertTrue(bool); Assert.assertNull(result.systemId); Assert.assertFalse(result.bDtdUsed); Assert.assertTrue(result.bXsdUsed); Assert.assertTrue(result.bWellformed); Assert.assertTrue(result.bValid); } catch (YggdrasilException e) { e.printStackTrace(); Assert.fail("Unexpected exception: " + e.getMessage()); } catch (Exception e) { e.printStackTrace(); Assert.fail("Unexpected exception: " + e.getMessage()); } } }