/* * Copyright 2006 The Apache Software Foundation. * * Licensed 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 org.codehaus.mojo.xml.test; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStreamReader; import java.io.Reader; import java.io.StringReader; import java.io.StringWriter; import java.lang.reflect.InvocationTargetException; import javax.xml.transform.OutputKeys; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerException; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; import javax.xml.transform.stream.StreamSource; import org.codehaus.mojo.xml.TransformMojo; import org.codehaus.mojo.xml.transformer.TransformationSet; import org.codehaus.plexus.components.io.filemappers.FileExtensionMapper; import org.codehaus.plexus.util.FileUtils; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; /** * Test case for the {@link TransformMojo}. */ public class TransformMojoTest extends AbstractXmlMojoTestCase { protected String getGoal() { return "transform"; } /** * Common code for the it4, it6 and it10 test projects. */ public void runTestIt4( String dir, String targetFile ) throws Exception { TransformMojo mojo = (TransformMojo) newMojo( dir ); mojo.execute(); Document doc1 = parse( new File( dir, "xml/doc1.xml" ) ); doc1.normalize(); Document doc2 = parse( new File( dir, "target/generated-resources/xml/xslt/" + targetFile ) ); doc2.normalize(); Element doc1Element = doc1.getDocumentElement(); assertEquals( "doc1", doc1Element.getLocalName() ); assertNull( doc1Element.getNamespaceURI() ); Element doc2Element = doc2.getDocumentElement(); assertEquals( "doc2", doc2Element.getLocalName() ); assertNull( doc2Element.getNamespaceURI() ); Node text1 = doc1Element.getFirstChild(); assertNotNull( text1 ); assertNull( text1.getNextSibling() ); assertEquals( Node.TEXT_NODE, text1.getNodeType() ); Node text2 = doc2Element.getFirstChild(); assertNotNull( text2 ); assertNull( text2.getNextSibling() ); assertEquals( Node.TEXT_NODE, text2.getNodeType() ); assertEquals( text1.getNodeValue(), text2.getNodeValue() ); } /** * Builds the it4 test project. */ public void testIt4() throws Exception { runTestIt4( "src/test/it4", "doc1.xml" ); } /** * Builds the it5 test project. */ public void testIt5() throws Exception { final String dir = "src/test/it5"; runTest( dir ); Document doc1 = parse( new File( dir, "xml/doc1.xml" ) ); doc1.normalize(); Document doc2 = parse( new File( dir, "target/generated-resources/xml/xslt/doc1.xml" ) ); doc2.normalize(); Element doc1Element = doc1.getDocumentElement(); assertEquals( "doc1", doc1Element.getLocalName() ); assertNull( doc1Element.getNamespaceURI() ); Element doc2Element = doc2.getDocumentElement(); assertEquals( "doc2", doc2Element.getLocalName() ); assertNull( doc2Element.getNamespaceURI() ); Node text1 = doc1Element.getFirstChild(); assertNotNull( text1 ); assertNull( text1.getNextSibling() ); assertEquals( Node.TEXT_NODE, text1.getNodeType() ); Node text2 = doc2Element.getFirstChild(); assertNotNull( text2 ); assertNull( text2.getNextSibling() ); assertEquals( Node.TEXT_NODE, text2.getNodeType() ); assertEquals(text2.getNodeValue(), "parameter passed in"); } /** * Builds the it6 test project. */ public void testIt6() throws Exception { FileExtensionMapper fileExtensionMapper = new FileExtensionMapper(); fileExtensionMapper.setTargetExtension( ".fo" ); runTestIt4( "src/test/it6", "doc1.fo" ); } private String read( File file ) throws IOException { final StringBuffer sb = new StringBuffer(); final Reader reader = new InputStreamReader( new FileInputStream( file ), "UTF-8" ); final char[] buffer = new char[ 4096 ]; for ( ;; ) { final int res = reader.read( buffer ); if ( res == -1 ) { break; } if ( res > 0 ) { sb.append( buffer, 0, res ); } } reader.close(); return sb.toString(); } /** * Builds the it7 test project. */ public void testIt7() throws Exception { final File dir = new File( "src/test/it7" ); final File target = new File( dir, "target/generated-resources/xml/xslt/doc1.xml" ); TransformMojo mojo = (TransformMojo) newMojo( dir.getPath() ); FileUtils.fileDelete( target.getPath() ); mojo.execute(); String result = read( target ); assertFalse( result.startsWith( "<?xml" ) ); mojo = (TransformMojo) newMojo( "src/test/it7" ); TransformationSet[] transformationSets = (TransformationSet[]) getVariableValueFromObject( mojo, "transformationSets" ); transformationSets[0].getOutputProperties()[0].setValue( "no" ); FileUtils.fileDelete( target.getPath() ); mojo.execute(); result = read( target ); assertTrue( result.startsWith( "<?xml" ) ); } private String eval( Node contextNode, String str ) throws TransformerException, NoSuchMethodException, IllegalAccessException, InvocationTargetException { final String xsl = "<xsl:stylesheet version='1.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>\n" + "<xsl:template match='*'>\n" + "<xsl:value-of select='" + str + "'/>\n" + "</xsl:template>\n" + "</xsl:stylesheet>\n"; final StringWriter sw = new StringWriter(); final Transformer t = TransformMojo.newTransformerFactory( org.apache.xalan.processor.TransformerFactoryImpl.class.getName(), getClass().getClassLoader()).newTransformer( new StreamSource( new StringReader( xsl ) ) ); t.setOutputProperty( OutputKeys.OMIT_XML_DECLARATION, "yes" ); t.transform( new DOMSource( contextNode ), new StreamResult( sw ) ); return sw.toString(); } /** * Builds the it7 test project. */ public void testIt8() throws Exception { if ( !java1_6_Aware() ) { System.out.println( " skip test due to non compliance jvm version need 1.6" ); return; } final String dir = "src/test/it8"; runTest( dir ); Document doc1 = parse( new File( dir, "target/generated-resources/xml/xslt/doc1.xml" ) ); assertEquals("SAXON 8.7 from Saxonica", eval( doc1, "/root/vendor" ) ); assertEquals("http://www.saxonica.com/", eval( doc1, "/root/vendor-url" ) ); assertEquals("2.0", eval( doc1, "/root/version" ) ); } /** * Builds the it10 test project. */ public void testIt10() throws Exception { runTestIt4( "src/test/it10", "doc1.xml" ); } /** * Builds the it11 test project, tests in-place modification. */ public void testIt11() throws Exception { String projectPath = "src/test/it11"; File projectDirectory = new File( getBasedir(), projectPath ); File targetDirectory = new File( projectPath, "target" ); if ( targetDirectory.exists() ){ FileUtils.cleanDirectory( targetDirectory ); } File xmlInputDirectory = new File( projectDirectory, "xml" ); File xmlOutputDirectory = new File( targetDirectory, "generated-resources/xml/xslt" ); /* copy to target since that is in an SCM-ignored directory */ FileUtils.copyDirectory( xmlInputDirectory, xmlOutputDirectory, "*.xml" , null ); TransformMojo mojo = (TransformMojo) newMojo( projectPath ); mojo.execute(); String fileToTransform = "doc1.xml"; Document doc1 = parse( new File( xmlInputDirectory, fileToTransform ) ); doc1.normalize(); Document doc2 = parse( new File( xmlOutputDirectory, fileToTransform ) ); doc2.normalize(); Element doc1Element = doc1.getDocumentElement(); assertEquals( "doc1", doc1Element.getLocalName() ); assertNull( doc1Element.getNamespaceURI() ); Element doc2Element = doc2.getDocumentElement(); assertEquals( "doc2", doc2Element.getLocalName() ); assertNull( doc2Element.getNamespaceURI() ); Node text1 = doc1Element.getFirstChild(); assertNotNull( text1 ); assertNull( text1.getNextSibling() ); assertEquals( Node.TEXT_NODE, text1.getNodeType() ); Node text2 = doc2Element.getFirstChild(); assertNotNull( text2 ); assertNull( text2.getNextSibling() ); assertEquals( Node.TEXT_NODE, text2.getNodeType() ); assertEquals( text1.getNodeValue(), text2.getNodeValue() ); } }