"indent-amount" output property ignored when using JAXP API
-----------------------------------------------------------

                 Key: XALANJ-2551
                 URL: https://issues.apache.org/jira/browse/XALANJ-2551
             Project: XalanJ2
          Issue Type: Bug
      Security Level: No security risk; visible to anyone (Ordinary problems in 
Xalan projects.  Anybody can view the issue.)
          Components: JAXP
    Affects Versions: 2.7.1
         Environment: os.name=Linux
java.vm.vendor=Sun Microsystems Inc.
java.runtime.version=1.6.0_24-b07
            Reporter: Morten Hattesen


It seems that Xalan 2.7.1 ignores the 
{{"{http://xml.apache.org/xslt}indent-amount"}} Transformer output property, 
when using the JAXP API, and setting the output property via the 
{{TransformerIdentityImpl.setOutputProperties(Properties)}} method.

The attached unit test shows, that when setting the 
{{"{http://xml.apache.org/xslt}indent-amount"}} output property on an identity 
transform with the source XML {{<root><child/></root>}}, the output indentation 
depends on which method is used to set the output property:

*Using {{Transformer.setOutputProperty(String key, String value)}}:*
{code}
<root>
    <child/>
</root>
{code}

*Using {{Transformer.setOutputProperties(Properties oformat)}}:*
{code}
<root>
<child/>
</root>
{code}

======================= JUnit 4 Unit Test ========================
package org.softee.xml.transform.xalan;

import static org.junit.Assert.*;

import java.io.StringReader;
import java.io.StringWriter;
import java.util.Map.Entry;
import java.util.Properties;

import javax.xml.transform.OutputKeys;
import javax.xml.transform.Result;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;

import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;

public class XalanIndentationTest {
    private static final String TRANSFORMER_FACTORY_INDENT_NUMBER = 
"indent-number";
    private static final int INDENT_AMOUNT = 4;
    private static final String INDENT_AMOUNT_PROPERTY = 
"{http://xml.apache.org/xslt}indent-amount";;
    private static final String SOURCE_XML = "<root><child/></root>";
    private static final String OUTPUT_PROPERTY_YES = "yes";
    
    private TransformerFactory factory;
    private Properties outputProperties;
    
    @Before
    public void before() throws TransformerConfigurationException {
        // Force use of Xalan JAXP factory
        factory = 
TransformerFactory.newInstance("org.apache.xalan.processor.TransformerFactoryImpl",
                        Thread.currentThread().getContextClassLoader());
        try {
            // indent-number attribute, that works with Java SE 5/6 embedded 
JAXP implementation causes exception in Xalan 2.7.1
            factory.setAttribute(TRANSFORMER_FACTORY_INDENT_NUMBER, 
Integer.valueOf(INDENT_AMOUNT));
        } catch (IllegalArgumentException e) {
            System.out.printf("++ JAXP TransformerFactory does not support '%s' 
attribute: %s%n",
                    TRANSFORMER_FACTORY_INDENT_NUMBER, factory.getClass());
        }
        
        outputProperties = new Properties();
        outputProperties.setProperty(OutputKeys.INDENT, OUTPUT_PROPERTY_YES);
        outputProperties.setProperty(OutputKeys.OMIT_XML_DECLARATION, 
OUTPUT_PROPERTY_YES);
        outputProperties.setProperty(INDENT_AMOUNT_PROPERTY, 
String.valueOf(INDENT_AMOUNT));
    }
    
    /**
     * Test using "{http://xml.apache.org/xslt}indent-amount"; calling 
setOutputProperty(String name, String value)
     */
    @Test
    public void testSetOutputProperty() throws TransformerException {
        Transformer transformer = factory.newTransformer();
        for (Entry<Object, Object> entry : outputProperties.entrySet()) {
            transformer.setOutputProperty((String)entry.getKey(), 
(String)entry.getValue());
        }
        transformAndValidate(transformer);
    }
    
    /**
     * Test using "{http://xml.apache.org/xslt}indent-amount";.
     * This property is ignored by Xalan 2.7.1 when sent via 
setOutputProperties(Properties oformat)
     */
    @Test
    //@Ignore("Fails when run against Xalan 2.7.1")
    public void testSetOutputProperties() throws TransformerException {
        Transformer transformer = factory.newTransformer();
        transformer.setOutputProperties(outputProperties);
        transformAndValidate(transformer);
    }
    
    private void transformAndValidate(Transformer transformer) throws 
TransformerException {
        Source source = new StreamSource(new StringReader(SOURCE_XML));
        StringWriter sw = new StringWriter();
        Result result = new StreamResult(sw);
        transformer.transform(source, result);
        String resultXml = sw.toString();
        System.out.printf("Result XML (%s):%n%s%n", 
transformer.getClass().getName(), resultXml);
        // assert that child element has been indented using four spaces
        assertTrue("child element not indented", resultXml.contains("    
<child"));
    }
}



--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators: 
https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

---------------------------------------------------------------------
To unsubscribe, e-mail: xalan-dev-unsubscr...@xml.apache.org
For additional commands, e-mail: xalan-dev-h...@xml.apache.org

Reply via email to