<?xml version="1.0"?>
<?xm-well_formed path="E:\xml-xalan\java\bugs.dtd"?>
<Sprs><Spr><Name>SCUU4QWTVZ</Name><DateCreated>11/09/2000</DateCreated>
<State>Pending</State><TestID>org.apache.qetest.trax.transformerapitest
r1.2</TestID><TestDesc>Transformer.setParameter(String); getParameter returns
XString</TestDesc><Details><![CDATA[(0b09CVS-morning)
Getting parameters back from a Transformer, they're always XObjects or the 
like.  They should be the actual object type you set.

To reproduce: run org.apache.qetest.trax.TransformerAPITest r1.2; lines 335-363 
approx.
Setting a String returns an XString.
Setting an Integer returns an XObject.]]></Details></Spr>
<Spr><Name>SCUU4R3JGY</Name><DateCreated>11/14/2000</DateCreated>
<State>Pending</State><TestID>transformerapitest.java
r1.4</TestID><TestDesc>TRAX Transformer.setParameter() will not re-set an
existing param</TestDesc><Details><![CDATA[(See TransformerAPITest.java r1.4 lines 374-406)
Essentially:
transformer.setParameter("param3s", new Integer(1234));
Object tmp = transformer.getParameter("param3s");	// OK, is 
Integer(1234)
transformer.setParameter("param3s", new Integer(99));
tmp = transformer.getParameter("param3s");	// BUG: Fails, is still 
Integer(1234)
transformer.setParameter("param3s", "string value");
tmp = transformer.getParameter("param3s");	// BUG: Fails, is still 
Integer(1234)
With Xalan 0b14CVS-morning]]></Details></Spr><Spr><Name>SCUU4R3JPH</Name>
<DateCreated>11/14/2000</DateCreated><State>Pending</State>
<TestID>transformerapitest.java r1.4</TestID><TestDesc>TRAX
identityTransformer.getOutputProperty("method") throws
NullPointerException</TestDesc><Details><![CDATA[(See TransformerAPITest.java r1.4 lines 374-406)
Essentially:
            // See what the default 'identity' transform has by default
            Properties identityProps = 
identityTransformer.getOutputProperties();
            reporter.logHashtable(reporter.STATUSMSG, identityProps, 
                                  "default 
identityTransformer.getOutputProperties()");

            // Can you set properties on this transformer?
            identityTransformer.setOutputProperty(OutputKeys.METHOD, "text");
            reporter.logTraceMsg("Just identityTransformer 
setOutputProperty(method,text)");
            String tmp = 
identityTransformer.getOutputProperty(OutputKeys.METHOD); // BUG throws npe:
java.lang.NullPointerException
	at 
org.apache.xalan.transformer.TransformerImpl.getOutputProperty(TransformerImpl.j
ava:667)
	at org.apache.qetest.trax.TransformerAPITest.testCase2(Compiled Code)

With Xalan 0b14CVS-morning]]></Details></Spr><Spr><Name>SCUU4R3JRR</Name>
<DateCreated>11/14/2000</DateCreated><State>Pending</State>
<TestID>transformerapitest.java r1.4; transformerapioutputformat.xsl
r1.2</TestID><TestDesc>TRAX transformer.getOutputProperties does not return
some xsl:output props</TestDesc><Details><![CDATA[(See TransformerAPITest.java r1.4 lines 499, 538, 555-575)
Essentially:
            outputTemplates = factory.newTemplates(new 
StreamSource(outputFormatTest.inputName));
            outputTransformer = outputTemplates.newTransformer();
            // Validate known output properties from our testfile
            // @todo validate these are all correct, and can be detected here
            String knownOutputProps[][] =
            {
                { OutputKeys.METHOD, METHOD_VALUE },
                { OutputKeys.VERSION, VERSION_VALUE },
                { OutputKeys.ENCODING, ENCODING_VALUE },
                { OutputKeys.STANDALONE, STANDALONE_VALUE },
                { OutputKeys.DOCTYPE_PUBLIC, DOCTYPE_PUBLIC_VALUE }, // BUG SPR 
SCUU4R3JRR - not returned
                { OutputKeys.DOCTYPE_SYSTEM, DOCTYPE_SYSTEM_VALUE }, // BUG SPR 
SCUU4R3JRR - not returned
                { OutputKeys.CDATA_SECTION_ELEMENTS, 
CDATA_SECTION_ELEMENTS_VALUE }, // BUG SPR SCUU4R3JRR - not returned
                { OutputKeys.INDENT, INDENT_VALUE },
                { OutputKeys.MEDIA_TYPE, MEDIA_TYPE_VALUE },
                { OutputKeys.OMIT_XML_DECLARATION, OMIT_XML_DECLARATION_VALUE }
            };

            for (int i = 0; i < knownOutputProps.length; i++)
            {
                String item = outProps.getProperty(knownOutputProps[i][0]);
                reporter.check(item, knownOutputProps[i][1], 
                               "Known prop " + knownOutputProps[i][0] 
                               + " is: ?" + item + "?");
            }
Some of the xsl:output items declared in the stylesheet are not returned in the 
properties block, namely doctype-public, doctype-system, and 
cdata-section-elements.

Note: Should these be returned?  Are there any differences between the 
xsl:output block in the stylesheet and which properties can be accessed 
programmatically though either transformer.getOutputProperty() or 
transformer.getOutputProperties()?
With Xalan 0b14CVS-morning]]></Details><DeveloperComment>The above values should not be returned, as they are NULL by default, and thus will show up in the property lists only if they are set.</DeveloperComment></Spr><Spr><Name>SCUU4R3JZ7</Name>
<DateCreated>11/14/2000</DateCreated><State>Pending</State>
<TestID>transformerapitest.java r1.4</TestID><TestDesc>TRAX
transformer.getOutputProperty after a transform throws
NullPointerException</TestDesc><Details><![CDATA[(See TransformerAPITest.java r1.4 lines 578-592)
Essentially:
- Create templates, transformer
- transformer.transform(source, result)
- transformer.getOutputProperty("xml")	// BUG throws 
NullPointerException
Problem with set/get output properties(1)
java.lang.NullPointerException
java.lang.NullPointerException
	at 
org.apache.xalan.transformer.TransformerImpl.getOutputProperty(TransformerImpl.j
ava:677)
	at org.apache.qetest.trax.TransformerAPITest.testCase2(Compiled Code)

Note: May be related to / DUPL of SCUU4R3JPH 

With Xalan 0b14CVS-morning
]]></Details></Spr><Spr><Name>SCUU4R3K6G</Name>
<DateCreated>11/14/2000</DateCreated><State>Pending</State>
<TestID>transformerapitest.java r1.4</TestID><TestDesc>TRAX
transformer.getErrorListener() is null by default</TestDesc><Details><![CDATA[(See TransformerAPITest.java r1.4 line 686)
Essentially:
- Create templates, transformer
- transformer.getErrorListener()	// BUG is null

Javadoc notes this method should never return null.  Note that similar 
TransformerFactoryAPITest with a new transformerFactory.getErrorListener() 
properly returns org.apache.xalan.utils.DefaultErrorHandler
With Xalan 0b14CVS-morning
]]></Details></Spr></Sprs>
