You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@cocoon.apache.org by sy...@apache.org on 2003/08/07 10:42:20 UTC
cvs commit: cocoon-2.1/src/java/org/apache/cocoon/components/treeprocessor/sitemap ActNodeBuilder.java ActTypeNode.java ActionSetNode.java ActionSetNodeBuilder.java
sylvain 2003/08/07 01:42:20
Modified: src/blocks/databases/samples/tutorial sitemap.xmap
src/java/org/apache/cocoon/components/treeprocessor
DefaultTreeBuilder.java TreeBuilder.java
src/java/org/apache/cocoon/components/treeprocessor/sitemap
ActNodeBuilder.java ActTypeNode.java
ActionSetNode.java ActionSetNodeBuilder.java
Added: src/blocks/databases/samples/tutorial apache.xsl
Log:
Fix bug #9835 (hopefully) related to nested actions in action-sets
Revision Changes Path
1.3 +10 -3 cocoon-2.1/src/blocks/databases/samples/tutorial/sitemap.xmap
Index: sitemap.xmap
===================================================================
RCS file: /home/cvs/cocoon-2.1/src/blocks/databases/samples/tutorial/sitemap.xmap,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- sitemap.xmap 25 Mar 2003 17:10:36 -0000 1.2
+++ sitemap.xmap 7 Aug 2003 08:42:20 -0000 1.3
@@ -82,7 +82,8 @@
<map:serialize/>
</map:act>
<map:generate type="serverpages" src="docs/{1}-dept.xsp"/>
- <map:transform src="context://samples/common/style/xsl/html/simple-page2html.xsl"/>
+ <map:transform src="apache.xsl"/>
+ <!--map:transform src="context://samples/common/style/xsl/html/simple-page2html.xsl"/-->
<map:serialize/>
</map:match>
@@ -94,14 +95,20 @@
<map:serialize/>
</map:act>
<map:generate type="serverpages" src="docs/{1}-empl.xsp"/>
- <map:transform src="context://samples/common/style/xsl/html/simple-page2html.xsl"/>
+ <map:transform src="apache.xsl"/>
+ <!--map:transform src="context://samples/common/style/xsl/html/simple-page2html.xsl"/-->
<map:serialize/>
</map:match>
<map:match pattern="**.html">
<map:generate src="docs/{1}.xml"/>
- <map:transform src="context://samples/common/style/xsl/html/simple-page2html.xsl"/>
+ <map:transform src="apache.xsl"/>
+ <!--map:transform src="context://samples/common/style/xsl/html/simple-page2html.xsl"/-->
<map:serialize/>
+ </map:match>
+
+ <map:match pattern="images/**">
+ <map:read src="context://docs/{0}"/>
</map:match>
</map:pipeline>
1.1 cocoon-2.1/src/blocks/databases/samples/tutorial/apache.xsl
Index: apache.xsl
===================================================================
<?xml version="1.0"?>
<!-- Author: Berin Loritsch "bloritsch@infoplanning.com" -->
<!-- Version: 1.0 -->
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="document">
<html>
<head>
<title><xsl:value-of select="document/header/title"/></title>
<xsl:if test="@redirect">
<meta http-equiv="Refresh" content="{@time};URL={@redirect}"/>
</xsl:if>
</head>
<body text="#000000" link="#039acc" vlink="#0086b2" alink="#cc0000"
topmargin="4" leftmargin="4" marginwidth="4" marginheight="4"
bgcolor="#ffffff">
<!-- THE TOP BAR (HEADER) -->
<table width="100%" cellspacing="0" cellpadding="0" border="0">
<tr>
<td width="135" height="60" rowspan="3" valign="top" align="left">
<img width="135" height="60" src="images/logo.gif" hspace="0" vspace="0" border="0"/>
</td>
<td width="100%" height="5" valign="top" align="left" colspan="2" background="images/line.gif">
<img width="1" height="5" src="images/line.gif" hspace="0" vspace="0" border="0" align="left"/>
</td>
<td width="29" height="60" rowspan="3" valign="top" align="left">
<img width="29" height="60" src="images/right.gif" hspace="0" vspace="0" border="0"/>
</td>
</tr>
<tr>
<td width="100%" height="35" valign="top" align="left" colspan="2" bgcolor="#0086b2"><font size="5" face="arial,helvetica,sanserif" color="#ffffff"><div style="text-align: right;"><xsl:value-of select="header/title"/></div></font></td>
</tr>
<tr>
<td width="100%" height="20" valign="top" align="left" bgcolor="#0086b2" background="images/bottom.gif">
<img width="3" height="20" src="images/bottom.gif" hspace="0" vspace="0" border="0" align="left"/>
</td>
<td align="right" bgcolor="#0086b2" height="20" valign="top" width="288" background="images/bottom.gif">
<table border="0" cellpadding="0" cellspacing="0" width="288">
<tr>
<td width="96" height="20" valign="top" align="left">
<a href="http://xml.apache.org/" target="new">
<img alt="http://xml.apache.org/" width="96" height="20" src="images/button-xml-lo.gif"
name="xml" hspace="0" vspace="0" border="0"/>
</a>
</td>
<td width="96" height="20" valign="top" align="left">
<a href="http://www.apache.org/" target="new">
<img alt="http://www.apache.org/" width="96" height="20" src="images/button-asf-lo.gif"
name="asf" hspace="0" vspace="0" border="0"/>
</a>
</td>
<td width="96" height="20" valign="top" align="left">
<a href="http://www.w3.org/" target="new">
<img alt="http://www.w3.org/" width="96" height="20" src="images/button-w3c-lo.gif"
name="w3c" hspace="0" vspace="0" border="0"/>
</a>
</td>
</tr>
</table>
</td>
</tr>
</table>
<!-- THE MAIN PANEL (SIDEBAR AND CONTENT) -->
<table width="100%" cellspacing="0" cellpadding="0" border="0">
<tr>
<!-- THE SIDE BAR -->
<td width="120" valign="top" align="left">
<div width="120" style="background-color: #a0a0a0;">
<font face="arial,helvetica,sanserif" color="#ffffff" size="-1">
<img width="120" height="14" src="images/join.gif" hspace="0" vspace="0" border="0"/><br/>
<xsl:apply-templates select="document('../menu.xml')"/>
<img width="120" height="14" src="images/close.gif" hspace="0" vspace="0" border="0"/><br/>
</font>
</div>
</td>
<!-- THE CONTENT PANEL -->
<td width="*" valign="top" align="left">
<table border="0" cellspacing="0" cellpadding="3">
<tr><td><br/><xsl:apply-templates/></td></tr>
</table>
</td>
</tr>
</table>
<br/>
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr><td bgcolor="#0086b2"><img src="images/dot.gif" width="1" height="1"/></td></tr>
<tr>
<td align="center"><font face="arial,helvetica,sanserif" size="-1" color="#0086b2"><i>
Copyright © 1999-2001.
All Rights Reserved.
</i></font></td>
</tr>
</table>
</body>
</html>
</xsl:template>
<xsl:template match="body">
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="menu">
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="group">
<a class="menu" href="{@link}"><font size="+1" color="#ffff80"><xsl:value-of select="@title"/></font></a><br/>
<xsl:apply-templates select="item"/>
</xsl:template>
<xsl:template match="item">
<a class="menu" href="{@link}"><font color="#ffffff"><xsl:value-of select="@title"/></font></a><br/>
</xsl:template>
<xsl:template match="flash">
<div align="center">
<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://active.macromedia.com/flash2/cabs/swflash.cab#version=4,0,0,0" id="{@id}" height="{@height}" width="{@width}">
<param value="{@movie}" name="movie"/>
<param value="{@quality}" name="quality"/>
<param value="{@bg}" name="bgcolor"/>
<embed src="{@movie}" quality="{@quality}" bgcolor="{@bg}" height="{@height}" width="{@width}" type="application/x-shockwave-flash" pluginspace="http://www.macromedia.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash"/>
</object>
</div><p/>
</xsl:template>
<xsl:template match="header"/>
<xsl:template match="s1">
<div align="right">
<table border="0" width="98%" cellspacing="0" cellpadding="0">
<tr>
<td width="9" height="7" valign="bottom" align="right"><img src="images/bar-top-left.gif" width="9" height="7" vspace="0" hspace="0" border="0"/></td>
<td background="images/bar-border-top.gif"><img src="images/void.gif" width="1" height="5" vspace="0" hspace="0" border="0"/></td>
<td width="9" height="7" valign="bottom" align="left"><img src="images/bar-top-right.gif" width="9" height="7" vspace="0" hspace="0" border="0"/></td>
</tr>
<tr>
<td width="9" background="images/bar-border-left.gif"><img src="images/void.gif" width="9" height="1" vspace="0" hspace="0" border="0"/></td>
<td width="100%" bgcolor="#0086b2">
<font size="+1" face="arial,helvetica,sanserif" color="#ffffff">
<img src="images/void.gif" width="5" height="5" vspace="0" hspace="0" border="0"/><b><xsl:value-of select="@title"/></b></font>
</td>
<td width="9" background="images/bar-border-right.gif"><img src="images/void.gif" width="9" height="1" vspace="0" hspace="0" border="0"/></td>
</tr>
<tr>
<td width="9" height="12" valign="top" align="right"><img src="images/bar-bottom-left.gif" width="9" height="12" vspace="0" hspace="0" border="0"/></td>
<td background="images/bar-border-bottom.gif"><img src="images/void.gif" height="12" vspace="0" hspace="0" border="0"/></td>
<td width="9" height="12" valign="top" align="left"><img src="images/bar-bottom-right.gif" width="9" height="12" vspace="0" hspace="0" border="0"/></td>
</tr>
</table>
<table border="0" width="98%" cellspacing="0" cellpadding="0">
<tr>
<td>
<font face="arial,helvetica,sanserif" color="#000000"><xsl:apply-templates/></font>
</td>
</tr>
</table>
</div>
<br/>
</xsl:template>
<xsl:template match="s2">
<div align="right">
<table border="0" width="95%" cellspacing="0" cellpadding="0">
<tr>
<td width="9" height="7" valign="bottom" align="right"><img src="images/bar-top-left.gif" width="9" height="7" vspace="0" hspace="0" border="0"/></td>
<td background="images/bar-border-top.gif"><img src="images/void.gif" width="1" height="5" vspace="0" hspace="0" border="0"/></td>
<td width="9" height="7" valign="bottom" align="left"><img src="images/bar-top-right.gif" width="9" height="7" vspace="0" hspace="0" border="0"/></td>
</tr>
<tr>
<td width="9" background="images/bar-border-left.gif"><img src="images/void.gif" width="9" height="1" vspace="0" hspace="0" border="0"/></td>
<td width="100%" bgcolor="#0086b2">
<font face="arial,helvetica,sanserif" color="#ffffff">
<img src="images/void.gif" width="5" height="5" vspace="0" hspace="0" border="0"/><b><xsl:value-of select="@title"/></b></font>
</td>
<td width="9" background="images/bar-border-right.gif"><img src="images/void.gif" width="9" height="1" vspace="0" hspace="0" border="0"/></td>
</tr>
<tr>
<td width="9" height="12" valign="top" align="right"><img src="images/bar-bottom-left.gif" width="9" height="12" vspace="0" hspace="0" border="0"/></td>
<td background="images/bar-border-bottom.gif"><img src="images/void.gif" width="1" height="12" vspace="0" hspace="0" border="0"/></td>
<td width="9" height="12" valign="top" align="left"><img src="images/bar-bottom-right.gif" width="9" height="12" vspace="0" hspace="0" border="0"/></td>
</tr>
</table>
<table border="0" width="95%" cellspacing="0" cellpadding="0">
<tr>
<td>
<font face="arial,helvetica,sanserif" color="#000000"><xsl:apply-templates/></font>
</td>
</tr>
</table>
</div>
<br/>
</xsl:template>
<xsl:template match="s3">
<div align="right">
<table border="0" width="90%" cellspacing="0" cellpadding="0">
<tr>
<td width="9" height="7" valign="bottom" align="right"><img src="images/bar-top-left.gif" width="9" height="7" vspace="0" hspace="0" border="0"/></td>
<td background="images/bar-border-top.gif"><img src="images/void.gif" width="1" height="5" vspace="0" hspace="0" border="0"/></td>
<td width="9" height="7" valign="bottom" align="left"><img src="images/bar-top-right.gif" width="9" height="7" vspace="0" hspace="0" border="0"/></td>
</tr>
<tr>
<td width="9" background="images/bar-border-left.gif"><img src="iamges/void.gif" width="9" height="1" vspace="0" hspace="0" border="0"/></td>
<td width="100%" bgcolor="#0086b2">
<font size="-1" face="arial,helvetica,sanserif" color="#ffffff">
<img src="images/void.gif" width="5" height="5" vspace="0" hspace="0" border="0"/><b><xsl:value-of select="@title"/></b></font>
</td>
<td width="9" background="images/bar-border-right.gif"><img src="images/void.gif" width="9" height="1" vspace="0" hspace="0" border="0"/></td>
</tr>
<tr>
<td width="9" height="12" valign="top" align="right"><img src="images/bar-bottom-left.gif" width="9" height="12" vspace="0" hspace="0" border="0"/></td>
<td background="images/bar-border-bottom.gif"><img src="images/void.gif" width="1" height="12" vspace="0" hspace="0" border="0"/></td>
<td width="9" height="12" valign="top" align="left"><img src="images/bar-bottom-right.gif" width="9" height="12" vspace="0" hspace="0" border="0"/></td>
</tr>
</table>
<table border="0" width="90%" cellspacing="0" cellpadding="0">
<tr>
<td>
<font face="arial,helvetica,sanserif" color="#000000"><xsl:apply-templates/></font>
</td>
</tr>
</table>
</div>
<br/>
</xsl:template>
<xsl:template match="s4">
<div align="right">
<table border="0" width="85%" cellspacing="0" cellpadding="0">
<tr>
<td width="9" height="7" valign="bottom" align="right"><img src="images/bar-top-left.gif" width="9" height="7" vspace="0" hspace="0" border="0"/></td>
<td background="images/bar-border-top.gif"><img src="images/void.gif" width="1" height="5" vspace="0" hspace="0" border="0"/></td>
<td width="9" height="7" valign="bottom" align="left"><img src="images/bar-top-right.gif" width="9" height="7" vspace="0" hspace="0" border="0"/></td>
</tr>
<tr>
<td width="9" background="images/bar-border-left.gif"><img src="images/void.gif" width="9" height="1" vspace="0" hspace="0" border="0"/></td>
<td width="100%" bgcolor="#0086b2">
<font size="-2" face="arial,helvetica,sanserif" color="#ffffff">
<img src="images/void.gif" width="5" height="5" vspace="0" hspace="0" border="0"/><b><xsl:value-of select="@title"/></b></font>
</td>
<td width="9" background="images/bar-border-right.gif"><img src="images/void.gif" width="9" height="1" vspace="0" hspace="0" border="0"/></td>
</tr>
<tr>
<td width="9" height="12" valign="top" align="right"><img src="images/bar-bottom-left.gif" width="9" height="12" vspace="0" hspace="0" border="0"/></td>
<td background="images/bar-border-bottom.gif"><img src="images/void.gif" width="1" height="12" vspace="0" hspace="0" border="0"/></td>
<td width="9" height="12" valign="top" align="left"><img src="images/bar-bottom-right.gif" width="9" height="12" vspace="0" hspace="0" border="0"/></td>
</tr>
</table>
<table border="0" width="85%" cellspacing="0" cellpadding="0">
<tr>
<td>
<font face="arial,helvetica,sanserif" color="#000000"><xsl:apply-templates/></font>
</td>
</tr>
</table>
</div>
<br/>
</xsl:template>
<xsl:template match="form">
<form name="form_{@name}" action="{@handler}" method="POST">
<xsl:apply-templates/>
</form>
</xsl:template>
<xsl:template match="submit">
<input type="submit" name="cocoon-action-{@name}" value="{@name}"/>
</xsl:template>
<xsl:template match="reset">
<input type="reset" value="{@name}"/>
</xsl:template>
<xsl:template match="parameter">
<input type="hidden" name="{@name}" value="{@value}"/>
</xsl:template>
<xsl:template match="radio">
<xsl:for-each select="option">
<xsl:choose>
<xsl:when test="position()=1">
<input type="radio" name="{../@group}" value="{@value}" checked="true"/>
</xsl:when>
<xsl:otherwise>
<input type="radio" name="{../@group}" value="{@value}"/>
</xsl:otherwise>
</xsl:choose>
<xsl:value-of select="."/><br/>
</xsl:for-each>
</xsl:template>
<xsl:template match="text">
<xsl:choose>
<xsl:when test="@required='true'">
<span style="color: #ff0000;">*</span>
</xsl:when>
<xsl:otherwise> </xsl:otherwise>
</xsl:choose>
<input type="text" name="{@name}" size="{@size}" value="{@value}"/>
</xsl:template>
<xsl:template match="check">
<xsl:element name="input">
<xsl:attribute name="type">checkbox</xsl:attribute>
<xsl:attribute name="value">1</xsl:attribute>
<xsl:attribute name="name"><xsl:value-of select="@name"/></xsl:attribute>
<xsl:if test="@checked='true'">
<xsl:attribute name="checked"/>
</xsl:if>
</xsl:element>
</xsl:template>
<xsl:template match="p">
<p align="justify"><xsl:apply-templates/></p>
</xsl:template>
<xsl:template match="note">
<p>
<table width="100%" cellspacing="3" cellpadding="0" border="0">
<tr>
<td width="28" valign="top">
<img src="images/note.gif" width="28" height="29" vspace="0" hspace="0" border="0" alt="Note"/>
</td>
<td valign="top">
<font size="-1" face="arial,helvetica,sanserif" color="#000000">
<i>
<xsl:apply-templates/>
</i>
</font>
</td>
</tr>
</table>
</p>
</xsl:template>
<xsl:template match="source">
<div align="center">
<table cellspacing="4" cellpadding="0" border="0">
<tr>
<td bgcolor="#0086b2" width="1" height="1"><img src="images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td>
<td bgcolor="#0086b2" height="1"><img src="images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td>
<td bgcolor="#0086b2" width="1" height="1"><img src="images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td>
</tr>
<tr>
<td bgcolor="#0086b2" width="1"><img src="images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td>
<td bgcolor="#ffffff"><pre><xsl:apply-templates/></pre></td>
<td bgcolor="#0086b2" width="1"><img src="images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td>
</tr>
<tr>
<td bgcolor="#0086b2" width="1" height="1"><img src="images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td>
<td bgcolor="#0086b2" height="1"><img src="images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td>
<td bgcolor="#0086b2" width="1" height="1"><img src="images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td>
</tr>
</table>
</div>
</xsl:template>
<xsl:template match="figure">
<p align="center"><img src="{@src}" alt="{@alt}" border="0" vspace="4" hspace="4"/></p>
</xsl:template>
<xsl:template match="img">
<img src="{@src}" alt="{@alt}" border="0" vspace="4" hspace="4" align="right"/>
</xsl:template>
<xsl:template match="icon">
<img src="{@src}" alt="{@alt}" border="0" align="absmiddle"/>
</xsl:template>
<xsl:template match="footer"/>
<xsl:template match="fixme"/>
<xsl:template match="ul|ol|dl">
<blockquote>
<xsl:copy>
<xsl:apply-templates/>
</xsl:copy>
</blockquote>
</xsl:template>
<xsl:template match="li">
<xsl:copy>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
<xsl:template match="sl">
<ul>
<xsl:apply-templates/>
</ul>
</xsl:template>
<xsl:template match="dt">
<li>
<strong><xsl:value-of select="."/></strong>
<xsl:text> - </xsl:text>
<xsl:apply-templates select="dd"/>
</li>
</xsl:template>
<xsl:template match="table">
<table width="100%" border="0" cellspacing="2" cellpadding="2">
<caption><xsl:value-of select="caption"/></caption>
<xsl:apply-templates/>
</table>
</xsl:template>
<xsl:template match="tr">
<tr><xsl:apply-templates/></tr>
</xsl:template>
<xsl:template match="th">
<td bgcolor="#039acc" colspan="{@colspan}" rowspan="{@rowspan}" valign="center" align="center">
<font color="#ffffff" size="-1" face="arial,helvetica,sanserif">
<b><xsl:apply-templates/></b> 
</font>
</td>
</xsl:template>
<xsl:template match="td">
<td bgcolor="#a0ddf0" colspan="{@colspan}" rowspan="{@rowspan}" valign="top" align="left">
<font color="#000000" size="-1" face="arial,helvetica,sanserif">
<xsl:apply-templates/> 
</font>
</td>
</xsl:template>
<xsl:template match="tn">
<td bgcolor="#ffffff" colspan="{@colspan}" rowspan="{@rowspan}">
 
</td>
</xsl:template>
<xsl:template match="caption"/>
<xsl:template match="overview">
<div class="ovw"><xsl:apply-templates/></div>
</xsl:template>
<xsl:template match="quote">
<div class="ctr"><xsl:apply-templates/></div>
</xsl:template>
<xsl:template match="rule">
<br/><img src="images/hstrip.gif" width="364" height="18"/><br/>
</xsl:template>
<xsl:template match="link">
<a href="{@href}"><xsl:apply-templates/></a>
</xsl:template>
<xsl:template match="connect">
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="jump">
<a href="{@href}#{@anchor}"><xsl:apply-templates/></a>
</xsl:template>
<xsl:template match="fork">
<a href="{@href}" target="_blank"><xsl:apply-templates/></a>
</xsl:template>
<xsl:template match="anchor">
<a name="{@id}"><xsl:comment>anchor</xsl:comment></a>
</xsl:template>
<xsl:template match="strong">
<b><xsl:apply-templates/></b>
</xsl:template>
<xsl:template match="em">
<i><xsl:apply-templates/></i>
</xsl:template>
<xsl:template match="code">
<code><font face="courier, monospaced"><xsl:apply-templates/></font></code>
</xsl:template>
<xsl:template match="connect">
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="bottom">
<div class="bot"><xsl:apply-templates/></div>
</xsl:template>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
1.3 +11 -1 cocoon-2.1/src/java/org/apache/cocoon/components/treeprocessor/DefaultTreeBuilder.java
Index: DefaultTreeBuilder.java
===================================================================
RCS file: /home/cvs/cocoon-2.1/src/java/org/apache/cocoon/components/treeprocessor/DefaultTreeBuilder.java,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- DefaultTreeBuilder.java 28 Jul 2003 12:55:45 -0000 1.2
+++ DefaultTreeBuilder.java 7 Aug 2003 08:42:20 -0000 1.3
@@ -94,6 +94,8 @@
public class DefaultTreeBuilder extends AbstractLogEnabled implements TreeBuilder,
Recomposable, Configurable, Contextualizable, LogKitManageable, RoleManageable, Recyclable, Disposable {
+ protected Map attributes = new HashMap();
+
/**
* The tree processor that we're building.
*/
@@ -194,6 +196,14 @@
this.namespace = config.getChild("namespace").getAttribute("uri", "");
this.parameterElement = config.getChild("parameter").getAttribute("element", "parameter");
+ }
+
+ public void setAttribute(String name, Object value) {
+ this.attributes.put(name, value);
+ }
+
+ public Object getAttribute(String name) {
+ return this.attributes.get(name);
}
/**
1.3 +11 -1 cocoon-2.1/src/java/org/apache/cocoon/components/treeprocessor/TreeBuilder.java
Index: TreeBuilder.java
===================================================================
RCS file: /home/cvs/cocoon-2.1/src/java/org/apache/cocoon/components/treeprocessor/TreeBuilder.java,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- TreeBuilder.java 28 Jul 2003 12:55:45 -0000 1.2
+++ TreeBuilder.java 7 Aug 2003 08:42:20 -0000 1.3
@@ -139,4 +139,14 @@
* Return the sitemap component manager
*/
ComponentManager getSitemapComponentManager();
+
+ /**
+ * Add an attribute. Useful to transmit information between distant (in the tree) node builders
+ */
+ void setAttribute(String name, Object value);
+
+ /**
+ * Get the value of an attribute.
+ */
+ Object getAttribute(String name);
}
1.3 +21 -2 cocoon-2.1/src/java/org/apache/cocoon/components/treeprocessor/sitemap/ActNodeBuilder.java
Index: ActNodeBuilder.java
===================================================================
RCS file: /home/cvs/cocoon-2.1/src/java/org/apache/cocoon/components/treeprocessor/sitemap/ActNodeBuilder.java,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- ActNodeBuilder.java 29 Jul 2003 14:29:10 -0000 1.2
+++ ActNodeBuilder.java 7 Aug 2003 08:42:20 -0000 1.3
@@ -73,10 +73,24 @@
private String actSetName;
public ProcessingNode buildNode(Configuration config) throws Exception {
+
+ boolean inActionSet = this.treeBuilder.getAttribute(ActionSetNodeBuilder.IN_ACTION_SET) != null;
// Is it an action-set call ?
this.actSetName = config.getAttribute("set", null);
if (actSetName == null) {
+
+ if (inActionSet) {
+ // Check that children are only parameters or actions
+ Configuration children[] = config.getChildren();
+ for (int i = 0; i < children.length; i++) {
+ String name = children[i].getName();
+ if (!"act".equals(name) && !"parameter".equals(name)) {
+ throw new ConfigurationException("An action set can only contain actions and not '"
+ + name + "' at " + children[i].getLocation());
+ }
+ }
+ }
String name = config.getAttribute("name", null);
String source = config.getAttribute("src", null);
@@ -85,7 +99,8 @@
ActTypeNode actTypeNode = new ActTypeNode(
type,
VariableResolverFactory.getResolver(source, this.manager),
- name
+ name,
+ inActionSet
);
this.treeBuilder.setupNode(actTypeNode, config);
@@ -94,6 +109,10 @@
return actTypeNode;
} else {
+
+ if (inActionSet) {
+ throw new ConfigurationException("Cannot call an action set from an action set at " + config.getLocation());
+ }
// Action set call
if (config.getAttribute("src", null) != null) {
1.2 +22 -6 cocoon-2.1/src/java/org/apache/cocoon/components/treeprocessor/sitemap/ActTypeNode.java
Index: ActTypeNode.java
===================================================================
RCS file: /home/cvs/cocoon-2.1/src/java/org/apache/cocoon/components/treeprocessor/sitemap/ActTypeNode.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- ActTypeNode.java 9 Mar 2003 00:09:20 -0000 1.1
+++ ActTypeNode.java 7 Aug 2003 08:42:20 -0000 1.2
@@ -95,10 +95,13 @@
protected ComponentManager manager;
- public ActTypeNode(String type, VariableResolver source, String name) throws PatternException {
+ protected boolean inActionSet;
+
+ public ActTypeNode(String type, VariableResolver source, String name, boolean inActionSet) throws PatternException {
super(type);
this.source = source;
this.name = name;
+ this.inActionSet = inActionSet;
}
public void setParameters(Map parameterMap) {
@@ -131,13 +134,12 @@
// If action is ThreadSafe, avoid select() and try/catch block (faster !)
if (this.threadSafeAction != null) {
actionResult = this.threadSafeAction.act(
- redirector, resolver, objectModel, resolvedSource, resolvedParams );
-
+ redirector, resolver, objectModel, resolvedSource, resolvedParams);
} else {
Action action = (Action)this.selector.select(this.componentName);
try {
actionResult = action.act(
- redirector, resolver, objectModel, resolvedSource, resolvedParams );
+ redirector, resolver, objectModel, resolvedSource, resolvedParams);
} finally {
this.selector.release(action);
@@ -155,7 +157,21 @@
} else {
// Action succeeded : process children if there are some, with the action result
if (this.children != null) {
- return this.invokeNodes(this.children, env, context, name, actionResult);
+ boolean result = this.invokeNodes(this.children, env, context, name, actionResult);
+
+ if (inActionSet) {
+ // Merge child action results, if any
+ Map childMap = (Map)env.getAttribute(ActionSetNode.ACTION_RESULTS);
+ if (childMap != null) {
+ childMap.putAll(actionResult);
+ } else {
+ // No previous results
+ env.setAttribute(ActionSetNode.ACTION_RESULTS, actionResult);
+ }
+ }
+
+ return result;
+
} else {
// Return false to continue sitemap invocation
1.2 +29 -82 cocoon-2.1/src/java/org/apache/cocoon/components/treeprocessor/sitemap/ActionSetNode.java
Index: ActionSetNode.java
===================================================================
RCS file: /home/cvs/cocoon-2.1/src/java/org/apache/cocoon/components/treeprocessor/sitemap/ActionSetNode.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- ActionSetNode.java 9 Mar 2003 00:09:20 -0000 1.1
+++ ActionSetNode.java 7 Aug 2003 08:42:20 -0000 1.2
@@ -50,24 +50,18 @@
*/
package org.apache.cocoon.components.treeprocessor.sitemap;
-import org.apache.avalon.framework.activity.Disposable;
-import org.apache.avalon.framework.component.ComponentException;
-import org.apache.avalon.framework.component.ComponentManager;
-import org.apache.avalon.framework.component.ComponentSelector;
-import org.apache.avalon.framework.component.Composable;
+import java.util.HashMap;
+import java.util.Map;
+
import org.apache.avalon.framework.parameters.Parameters;
-import org.apache.cocoon.acting.Action;
import org.apache.cocoon.components.treeprocessor.InvokeContext;
import org.apache.cocoon.components.treeprocessor.NamedProcessingNode;
+import org.apache.cocoon.components.treeprocessor.ProcessingNode;
import org.apache.cocoon.components.treeprocessor.SimpleSelectorProcessingNode;
-import org.apache.cocoon.components.treeprocessor.variables.VariableResolver;
import org.apache.cocoon.environment.Environment;
import org.apache.cocoon.environment.Redirector;
import org.apache.cocoon.environment.SourceResolver;
-import java.util.HashMap;
-import java.util.Map;
-
/**
*
* @author <a href="mailto:sylvain@apache.org">Sylvain Wallez</a>
@@ -75,46 +69,22 @@
*/
public class ActionSetNode extends SimpleSelectorProcessingNode
- implements Disposable, NamedProcessingNode, Composable {
+ implements NamedProcessingNode {
+
+ public static final String CALLER_PARAMETERS = ActionSetNode.class.getName() + "/CallerParameters";
+ public static final String ACTION_RESULTS = ActionSetNode.class.getName() + "/ActionResults";
- /** The action types */
- private String[] types;
+ /** The action nodes */
+ private ProcessingNode[] nodes;
/** The 'action' attribute for each action */
private String[] actionNames;
- /** The actions that are ThreadSafe, to avoid lookups */
- private Action[] threadSafeActions;
-
- /** The src for each action */
- private VariableResolver[] sources;
-
- /** The parameters for each action */
- private Map[] parameters;
-
- /** The component manager */
- protected ComponentManager manager;
-
public ActionSetNode(
- String name, String[] types, String[] actionNames,
- VariableResolver[] sources, Map[] parameters) {
+ String name, ProcessingNode[] nodes, String[] actionNames) {
super(name);
- this.types = types;
+ this.nodes = nodes;
this.actionNames = actionNames;
- this.sources = sources;
- this.parameters = parameters;
- }
-
- public void compose(ComponentManager manager) throws ComponentException {
- this.manager = manager;
- setSelector((ComponentSelector)manager.lookup(Action.ROLE + "Selector"));
-
- // Get all actions that are thread safe
- this.threadSafeActions = new Action[types.length];
-
- for (int i = 0; i < this.types.length; i++) {
- this.threadSafeActions[i] = (Action)this.getThreadSafeComponent(this.types[i]);
- }
}
public final boolean invoke(Environment env, InvokeContext context)
@@ -139,44 +109,30 @@
String cocoonAction = env.getAction();
+ // Store the parameters from the caller into the environment so that they can be merged with
+ // each action's parameters.
+
+
Map result = null;
// Call each action that either has no cocoonAction, or whose cocoonAction equals
// the one from the environment.
+ env.setAttribute(CALLER_PARAMETERS, params);
- for (int i = 0; i < types.length; i++) {
+ for (int i = 0; i < nodes.length; i++) {
- Map actionResult;
- Action action;
String actionName = actionNames[i];
- String source = sources[i].resolve(context, objectModel);
if (actionName == null || actionName.equals(cocoonAction)) {
-
- Parameters actionParams = VariableResolver.buildParameters(parameters[i], context, objectModel);
- if (actionParams == Parameters.EMPTY_PARAMETERS) {
- actionParams = params;
- } else {
- actionParams.merge(params);
- }
-
- // If action is ThreadSafe, avoid select() and try/catch block (faster !)
- if ((action = this.threadSafeActions[i]) != null) {
-
- actionResult = action.act(
- redirector, resolver, objectModel, source, actionParams);
-
- } else {
-
- action = (Action)this.selector.select(this.types[i]);
- try {
- actionResult = action.act(
- redirector, resolver, objectModel, source, actionParams);
- } finally {
- this.selector.release(action);
- }
- }
-
+
+ this.nodes[i].invoke(env, context);
+
+ // Get action results. They're passed back through the environment since action-sets
+ // "violate" the tree hierarchy (the returned Map is visible outside of the node)
+ Map actionResult = (Map)env.getAttribute(ACTION_RESULTS);
+ // Don't forget to clear it
+ env.removeAttribute(ACTION_RESULTS);
+
if (actionResult != null) {
// Merge the result in the global result, creating it if necessary.
if (result == null) {
@@ -185,20 +141,11 @@
result.putAll(actionResult);
}
}
+
} // if (actionName...
} // for (int i...
return result;
- }
-
- public void dispose() {
-
- // Dispose ThreadSafe actions
- for (int i = 0; i < this.threadSafeActions.length; i++) {
- this.selector.release(this.threadSafeActions[i]);
- }
-
- this.manager.release(this.selector);
}
/**
1.2 +26 -33 cocoon-2.1/src/java/org/apache/cocoon/components/treeprocessor/sitemap/ActionSetNodeBuilder.java
Index: ActionSetNodeBuilder.java
===================================================================
RCS file: /home/cvs/cocoon-2.1/src/java/org/apache/cocoon/components/treeprocessor/sitemap/ActionSetNodeBuilder.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- ActionSetNodeBuilder.java 9 Mar 2003 00:09:20 -0000 1.1
+++ ActionSetNodeBuilder.java 7 Aug 2003 08:42:20 -0000 1.2
@@ -50,69 +50,62 @@
*/
package org.apache.cocoon.components.treeprocessor.sitemap;
+import java.util.ArrayList;
+import java.util.List;
+
import org.apache.avalon.framework.configuration.Configuration;
import org.apache.avalon.framework.configuration.ConfigurationException;
import org.apache.avalon.framework.thread.ThreadSafe;
-
-import org.apache.cocoon.acting.Action;
-
+import org.apache.cocoon.components.treeprocessor.AbstractParentProcessingNodeBuilder;
import org.apache.cocoon.components.treeprocessor.AbstractProcessingNodeBuilder;
-import org.apache.cocoon.components.treeprocessor.variables.VariableResolver;
-import org.apache.cocoon.components.treeprocessor.variables.VariableResolverFactory;
import org.apache.cocoon.components.treeprocessor.ProcessingNode;
-import java.util.*;
-
/**
*
* @author <a href="mailto:sylvain@apache.org">Sylvain Wallez</a>
* @version CVS $Id$
*/
-public class ActionSetNodeBuilder extends AbstractProcessingNodeBuilder implements ThreadSafe {
+public class ActionSetNodeBuilder extends AbstractParentProcessingNodeBuilder implements ThreadSafe {
+
+ /** The TreeBuilder attribute indicating that an ActionSet is being built */
+ public static final String IN_ACTION_SET = ActionSetNodeBuilder.class.getName() + "/inActionSet";
public ProcessingNode buildNode(Configuration config) throws Exception {
String actionSetName = config.getAttribute("name");
- // Lists of action types, names and sources for each map:act
- List actionTypes = new ArrayList();
+ // Lists of action types and nodes for each map:act
List actionNames = new ArrayList();
- List actionSources = new ArrayList();
- List actionParameters = new ArrayList();
-
+ List actionNodes = new ArrayList();
+
Configuration[] childrenConfig = config.getChildren();
+ // Inform other builders that we're in an action-set
+ this.treeBuilder.setAttribute(IN_ACTION_SET, Boolean.TRUE);
+
+ // Get the child actions
+ ProcessingNode[] nodes = this.buildChildNodes(config);
+
+ // And get their names
+ String[] actions = new String[nodes.length];
for (int i = 0; i < childrenConfig.length; i++) {
-
Configuration childConfig = childrenConfig[i];
String name = childConfig.getName();
if ("act".equals(name)) {
-
- checkNamespace(childConfig);
- String type = this.treeBuilder.getTypeForStatement(childConfig, Action.ROLE + "Selector");
-
- actionTypes.add(type);
- actionNames.add(childConfig.getAttribute("action", null));
- actionSources.add(VariableResolverFactory.getResolver(
- childConfig.getAttribute("src", null), this.manager));
- actionParameters.add(this.getParameters(childConfig));
-
+ actions[i] = childConfig.getAttribute("action", null);
} else {
// Unknown element
String msg = "Unknown element " + name + " in action-set at " + childConfig.getLocation();
throw new ConfigurationException(msg);
- }
+ }
}
- String[] types = (String[])actionTypes.toArray(new String[actionTypes.size()]);
- String[] actions = (String[])actionNames.toArray(new String[actionNames.size()]);
- Map[] parameters = (Map[])actionParameters.toArray(new Map[actionParameters.size()]);
- VariableResolver[] sources =
- (VariableResolver[])actionSources.toArray(new VariableResolver[actionSources.size()]);
-
- ActionSetNode node = new ActionSetNode(actionSetName, types, actions, sources, parameters);
+ ActionSetNode node = new ActionSetNode(actionSetName, nodes, actions);
this.treeBuilder.setupNode(node, config);
+
+ // Inform other builders that we're no more in an action-set
+ this.treeBuilder.setAttribute(IN_ACTION_SET, null);
return node;
}