jstrachan 01/08/09 08:00:09
Modified: xtags/src/org/apache/taglibs/xtags/xslt StyleTag.java
Added: xtags/examples/web/testStyle first.xsl second.xsl
test_style.jsp
Log:
Added patch to allow <xtags:style> tag to be used inside another custom tag (or
pipelined together). Also added a test case kindly supplied by Martin Brown - many
thanks Martin!
Revision Changes Path
1.1 jakarta-taglibs/xtags/examples/web/testStyle/first.xsl
Index: first.xsl
===================================================================
<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" indent="no"/>
<xsl:strip-space elements="*"/>
<xsl:template match="//level1">
<xsl:copy-of select="."/>
</xsl:template>
</xsl:stylesheet>
1.1 jakarta-taglibs/xtags/examples/web/testStyle/second.xsl
Index: second.xsl
===================================================================
<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" indent="no"/>
<xsl:strip-space elements="*"/>
<xsl:template match="//level2">
<xsl:copy-of select="."/>
</xsl:template>
</xsl:stylesheet>
1.1 jakarta-taglibs/xtags/examples/web/testStyle/test_style.jsp
Index: test_style.jsp
===================================================================
<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
<html>
<%@ taglib uri="http://jakarta.apache.org/taglibs/xtags-1.0" prefix="xtags" %>
<%--
This test case was supplied by Martin Brown - many thanks!
--%>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Test Stylesheet pilelining</title>
<link rel="stylesheet" href="../examples.css" type="text/css">
</head>
<body>
<h1>Test Stylesheet pilelining</h1>
<BR>
Output from attempt 1
<BR>
<xtags:style xsl="second.xsl">
<xtags:style xsl="first.xsl">
<root><level1><level2><level3>data</level3></level2></level1></root>
</xtags:style>
</xtags:style>
<hr/>
</body>
</html>
1.3 +21 -2
jakarta-taglibs/xtags/src/org/apache/taglibs/xtags/xslt/StyleTag.java
Index: StyleTag.java
===================================================================
RCS file:
/home/cvs/jakarta-taglibs/xtags/src/org/apache/taglibs/xtags/xslt/StyleTag.java,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- StyleTag.java 2001/08/08 15:39:04 1.2
+++ StyleTag.java 2001/08/09 15:00:09 1.3
@@ -66,6 +66,7 @@
import java.io.OutputStream;
import java.io.Reader;
import java.io.StringReader;
+import java.io.StringWriter;
import java.io.Writer;
import java.net.MalformedURLException;
import java.net.URL;
@@ -121,7 +122,10 @@
/** XSLT parameters */
private Map parameters;
-
+
+ /** Indirection buffer, used to avoid flush problems with BodyContent */
+ private StringWriter stringWriter;
+
// ParameterAcceptingTag interface
//-------------------------------------------------------------------------
@@ -191,10 +195,19 @@
Transformer transformer = factory.newTransformer(style);
configure(transformer);
transformer.transform( data, result );
+ if ( stringWriter != null ) {
+ pageContext.getOut().write( stringWriter.toString() );
+ }
}
catch (TransformerException e) {
handleException(e);
}
+ catch (IOException e) {
+ handleException(e);
+ }
+ finally {
+ stringWriter = null;
+ }
return EVAL_PAGE;
}
@@ -344,7 +357,12 @@
*/
protected Result getResult() throws JspException {
if ( result == null ) {
- return new StreamResult( pageContext.getOut() );
+ // use StringWriter to avoid flushing problems with BodyContent
+ stringWriter = new StringWriter();
+ return new StreamResult( stringWriter );
+ }
+ else {
+ stringWriter = null;
}
return result;
}
@@ -357,6 +375,7 @@
}
else {
pageContext.getServletContext().log( e.getMessage(), e );
+ e.printStackTrace();
throw new JspException( e.getMessage() );
}
}