Author: pbenedict
Date: Mon Sep  4 17:00:46 2006
New Revision: 440206

URL: http://svn.apache.org/viewvc?view=rev&rev=440206
Log:
STR-746: New html:param tag; nestable in frame,link,rewrite tags.

Added:
    
struts/struts1/trunk/taglib/src/main/java/org/apache/struts/taglib/html/ParamTag.java
Modified:
    
struts/struts1/trunk/taglib/src/main/java/org/apache/struts/taglib/html/FrameTag.java
    
struts/struts1/trunk/taglib/src/main/java/org/apache/struts/taglib/html/LinkTag.java
    
struts/struts1/trunk/taglib/src/main/java/org/apache/struts/taglib/html/LocalStrings.properties
    
struts/struts1/trunk/taglib/src/main/java/org/apache/struts/taglib/html/RewriteTag.java
    struts/struts1/trunk/taglib/src/main/resources/META-INF/tld/struts-html.tld

Modified: 
struts/struts1/trunk/taglib/src/main/java/org/apache/struts/taglib/html/FrameTag.java
URL: 
http://svn.apache.org/viewvc/struts/struts1/trunk/taglib/src/main/java/org/apache/struts/taglib/html/FrameTag.java?view=diff&rev=440206&r1=440205&r2=440206
==============================================================================
--- 
struts/struts1/trunk/taglib/src/main/java/org/apache/struts/taglib/html/FrameTag.java
 (original)
+++ 
struts/struts1/trunk/taglib/src/main/java/org/apache/struts/taglib/html/FrameTag.java
 Mon Sep  4 17:00:46 2006
@@ -1,7 +1,7 @@
 /*
  * $Id$
  *
- * Copyright 1999-2004 The Apache Software Foundation.
+ * Copyright 1999-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.
@@ -138,11 +138,20 @@
     // --------------------------------------------------------- Public Methods
 
     /**
-     * Render the appropriately encoded URI.
+     * Evaluate the body for any parameters.
      *
      * @throws JspException if a JSP exception has occurred
      */
     public int doStartTag() throws JspException {
+        return (EVAL_BODY_TAG);
+    }
+
+    /**
+     * Render the appropriately encoded URI.
+     *
+     * @throws JspException if a JSP exception has occurred
+     */
+    public int doEndTag() throws JspException {
         // Print this element to our output writer
         StringBuffer results = new StringBuffer("<frame");
 
@@ -163,15 +172,6 @@
         results.append(getElementClose());
         TagUtils.getInstance().write(pageContext, results.toString());
 
-        return (SKIP_BODY);
-    }
-
-    /**
-     * Ignore the end of this tag.
-     *
-     * @throws JspException if a JSP exception has occurred
-     */
-    public int doEndTag() throws JspException {
         return (EVAL_PAGE);
     }
 

Modified: 
struts/struts1/trunk/taglib/src/main/java/org/apache/struts/taglib/html/LinkTag.java
URL: 
http://svn.apache.org/viewvc/struts/struts1/trunk/taglib/src/main/java/org/apache/struts/taglib/html/LinkTag.java?view=diff&rev=440206&r1=440205&r2=440206
==============================================================================
--- 
struts/struts1/trunk/taglib/src/main/java/org/apache/struts/taglib/html/LinkTag.java
 (original)
+++ 
struts/struts1/trunk/taglib/src/main/java/org/apache/struts/taglib/html/LinkTag.java
 Mon Sep  4 17:00:46 2006
@@ -1,7 +1,7 @@
 /*
  * $Id$
  *
- * Copyright 1999-2004 The Apache Software Foundation.
+ * Copyright 1999-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.
@@ -136,6 +136,11 @@
      * Include transaction token (if any) in the hyperlink?
      */
     protected boolean transaction = false;
+    
+    /**
+     * Additional parameters included programatically.
+     */
+    protected Map parameters = null;
 
     /**
      * Name of parameter to generate to hold index number
@@ -302,29 +307,6 @@
      * @throws JspException if a JSP exception has occurred
      */
     public int doStartTag() throws JspException {
-        // Generate the opening anchor element
-        StringBuffer results = new StringBuffer("<a");
-
-        // Special case for name anchors
-        prepareAttribute(results, "name", getLinkName());
-
-        // * @since Struts 1.1
-        if ((getLinkName() == null) || (getForward() != null)
-            || (getHref() != null) || (getPage() != null)
-            || (getAction() != null)) {
-            prepareAttribute(results, "href", calculateURL());
-        }
-
-        prepareAttribute(results, "target", getTarget());
-        prepareAttribute(results, "accesskey", getAccesskey());
-        prepareAttribute(results, "tabindex", getTabindex());
-        results.append(prepareStyles());
-        results.append(prepareEventHandlers());
-        prepareOtherAttributes(results);
-        results.append(">");
-
-        TagUtils.getInstance().write(pageContext, results.toString());
-
         // Evaluate the body of this tag
         this.text = null;
 
@@ -354,15 +336,34 @@
      * @throws JspException if a JSP exception has occurred
      */
     public int doEndTag() throws JspException {
-        // Prepare the textual content and ending element of this hyperlink
-        StringBuffer results = new StringBuffer();
+        // Generate the opening anchor element
+        StringBuffer results = new StringBuffer("<a");
 
+        // Special case for name anchors
+        prepareAttribute(results, "name", getLinkName());
+
+        // * @since Struts 1.1
+        if ((getLinkName() == null) || (getForward() != null)
+            || (getHref() != null) || (getPage() != null)
+            || (getAction() != null)) {
+            prepareAttribute(results, "href", calculateURL());
+        }
+
+        prepareAttribute(results, "target", getTarget());
+        prepareAttribute(results, "accesskey", getAccesskey());
+        prepareAttribute(results, "tabindex", getTabindex());
+        results.append(prepareStyles());
+        results.append(prepareEventHandlers());
+        prepareOtherAttributes(results);
+        results.append(">");
+
+        TagUtils.getInstance().write(pageContext, results.toString());
+
+        // Prepare the textual content and ending element of this hyperlink
         if (text != null) {
             results.append(text);
         }
-
         results.append("</a>");
-
         TagUtils.getInstance().write(pageContext, results.toString());
 
         return (EVAL_PAGE);
@@ -385,6 +386,7 @@
         paramName = null;
         paramProperty = null;
         paramScope = null;
+        parameters = null;
         property = null;
         scope = null;
         target = null;
@@ -409,6 +411,14 @@
             TagUtils.getInstance().computeParameters(pageContext, paramId,
                 paramName, paramProperty, paramScope, name, property, scope,
                 transaction);
+        
+        // Add parameters collected from the tag's inner body
+        if (this.parameters != null) {
+            if (params == null) {
+                params = new HashMap();
+            }
+            params.putAll(this.parameters);
+        }
 
         // if "indexed=true", add "index=x" parameter to query string
         // * @since Struts 1.1
@@ -440,5 +450,19 @@
         }
 
         return (url);
+    }
+    
+    /**
+     * <p>Adds a parameter to this link.</p>
+     * 
+     * @param paramName the parameter name
+     * @param paramValue the parameter value
+     * @since Struts 1.3.6
+     */
+    public void addParameter(String paramName, Object paramValue) {
+        if (this.parameters == null) {
+            this.parameters = new HashMap();
+        }
+        this.parameters.put(paramName, paramValue);
     }
 }

Modified: 
struts/struts1/trunk/taglib/src/main/java/org/apache/struts/taglib/html/LocalStrings.properties
URL: 
http://svn.apache.org/viewvc/struts/struts1/trunk/taglib/src/main/java/org/apache/struts/taglib/html/LocalStrings.properties?view=diff&rev=440206&r1=440205&r2=440206
==============================================================================
--- 
struts/struts1/trunk/taglib/src/main/java/org/apache/struts/taglib/html/LocalStrings.properties
 (original)
+++ 
struts/struts1/trunk/taglib/src/main/java/org/apache/struts/taglib/html/LocalStrings.properties
 Mon Sep  4 17:00:46 2006
@@ -27,6 +27,7 @@
 includeTag.lookup=Cannot find global forward named {0}
 indexed.noEnclosingIterate=indexed=\"true\" is only valid within an enclosing 
iterate tag
 iterateTag.iterator=Cannot create iterator for {0}
+linkParamTag.linkParam=LinkParam tag must be nested in a Link, Rewrite, or 
Frame tag
 linkTag.destination=You must specify exactly one of 'forward', 'href', or 
'page'
 linkTag.forward=Cannot locate global forwarding for {0}
 linkTag.forwards=Cannot locate forwards mapping table

Added: 
struts/struts1/trunk/taglib/src/main/java/org/apache/struts/taglib/html/ParamTag.java
URL: 
http://svn.apache.org/viewvc/struts/struts1/trunk/taglib/src/main/java/org/apache/struts/taglib/html/ParamTag.java?view=auto&rev=440206
==============================================================================
--- 
struts/struts1/trunk/taglib/src/main/java/org/apache/struts/taglib/html/ParamTag.java
 (added)
+++ 
struts/struts1/trunk/taglib/src/main/java/org/apache/struts/taglib/html/ParamTag.java
 Mon Sep  4 17:00:46 2006
@@ -0,0 +1,121 @@
+/*
+ * $Id: ParamTag.java 376841 2006-02-10 21:01:28Z pbenedict $
+ *
+ * Copyright 2006-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.apache.struts.taglib.html;
+
+import org.apache.struts.util.MessageResources;
+
+import javax.servlet.jsp.JspException;
+import javax.servlet.jsp.tagext.BodyTagSupport;
+import javax.servlet.jsp.tagext.Tag;
+
+/**
+ * Adds a new request parameter to its parent [EMAIL PROTECTED] LinkTag}.
+ *
+ * @version $Rev: 376841 $ $Date: 2005-04-06 02:37:00 -0400 (Wed, 06 Apr 2005)
+ *          $
+ * @since Struts 1.3.6
+ */
+public class ParamTag extends BodyTagSupport {
+
+    /**
+     * The message resources for this package.
+     */
+    protected static MessageResources messages =
+        MessageResources.getMessageResources(Constants.Package
+            + ".LocalStrings");
+
+    /**
+     * The name of the query parameter.
+     */
+    protected String name = null;
+
+    /**
+     * The value of the query parameter or body content of this tag (if any).
+     */
+    protected String value = null;
+
+    // ----------------------------------------------------- Constructor
+
+    public ParamTag() {
+        super();
+    }
+
+    public String getName() {
+        return (this.name);
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getValue() {
+        return (this.value);
+    }
+
+    public void setValue(String value) {
+        this.value = value;
+    }
+
+    // --------------------------------------------------------- Public Methods
+
+    /**
+     * @throws JspException if a JSP exception has occurred
+     */
+    public int doStartTag() throws JspException {
+        return (EVAL_BODY_TAG);
+    }
+
+    /**
+     * Save the associated from the body content.
+     *
+     * @throws JspException if a JSP exception has occurred
+     */
+    public int doAfterBody() throws JspException {
+        if (this.bodyContent != null) {
+            String value = this.bodyContent.getString().trim();
+            if (value.length() > 0) {
+                this.value = value;
+            }
+        }
+        return (SKIP_BODY);
+    }
+
+    /**
+     * Render the end of the hyperlink.
+     *
+     * @throws JspException if a JSP exception has occurred
+     */
+    public int doEndTag() throws JspException {
+        Tag tag = findAncestorWithClass(this, LinkTag.class); 
+        if (tag != null) {
+            ((LinkTag)tag).addParameter(this.name, this.value);
+        } else {
+            throw new 
JspException(messages.getMessage("linkParamTag.linkParam"));
+        }
+        return (EVAL_PAGE);
+    }
+
+    /**
+     * Release any acquired resources.
+     */
+    public void release() {
+        super.release();
+        this.name = null; 
+        this.value = null;
+    }
+}

Modified: 
struts/struts1/trunk/taglib/src/main/java/org/apache/struts/taglib/html/RewriteTag.java
URL: 
http://svn.apache.org/viewvc/struts/struts1/trunk/taglib/src/main/java/org/apache/struts/taglib/html/RewriteTag.java?view=diff&rev=440206&r1=440205&r2=440206
==============================================================================
--- 
struts/struts1/trunk/taglib/src/main/java/org/apache/struts/taglib/html/RewriteTag.java
 (original)
+++ 
struts/struts1/trunk/taglib/src/main/java/org/apache/struts/taglib/html/RewriteTag.java
 Mon Sep  4 17:00:46 2006
@@ -23,6 +23,7 @@
 
 import java.net.MalformedURLException;
 
+import java.util.HashMap;
 import java.util.Map;
 
 /**
@@ -35,17 +36,25 @@
     // --------------------------------------------------------- Public Methods
 
     /**
-     * Render the appropriately encoded URI.
+     * Render the URI.
      *
      * @throws JspException if a JSP exception has occurred
      */
-    public int doStartTag() throws JspException {
+    public int doEndTag() throws JspException {
         // Generate the hyperlink URL
         Map params =
             TagUtils.getInstance().computeParameters(pageContext, paramId,
                 paramName, paramProperty, paramScope, name, property, scope,
                 transaction);
 
+        // Add parameters collected from the tag's inner body
+        if (this.parameters != null) {
+            if (params == null) {
+                params = new HashMap();
+            }
+            params.putAll(this.parameters);
+        }
+
         String url = null;
 
         try {
@@ -61,16 +70,6 @@
         }
 
         TagUtils.getInstance().write(pageContext, url);
-
-        return (SKIP_BODY);
-    }
-
-    /**
-     * Ignore the end of this tag.
-     *
-     * @throws JspException if a JSP exception has occurred
-     */
-    public int doEndTag() throws JspException {
         return (EVAL_PAGE);
     }
 }

Modified: 
struts/struts1/trunk/taglib/src/main/resources/META-INF/tld/struts-html.tld
URL: 
http://svn.apache.org/viewvc/struts/struts1/trunk/taglib/src/main/resources/META-INF/tld/struts-html.tld?view=diff&rev=440206&r1=440205&r2=440206
==============================================================================
--- struts/struts1/trunk/taglib/src/main/resources/META-INF/tld/struts-html.tld 
(original)
+++ struts/struts1/trunk/taglib/src/main/resources/META-INF/tld/struts-html.tld 
Mon Sep  4 17:00:46 2006
@@ -1990,6 +1990,7 @@
     <tag>
         <name>frame</name>
         <tag-class>org.apache.struts.taglib.html.FrameTag</tag-class>
+        <body-content>JSP</body-content>
         <description>
             <![CDATA[
             <p><strong>Render an HTML frame element</strong></p>
@@ -4054,6 +4055,7 @@
     <tag>
         <name>link</name>
         <tag-class>org.apache.struts.taglib.html.LinkTag</tag-class>
+        <body-content>JSP</body-content>
         <description>
             <![CDATA[
             <p><strong>Render an HTML anchor or hyperlink</strong></p>
@@ -4090,13 +4092,14 @@
                 <p>Normally, the hyperlink you specify with one of the
                 attributes described in the previous paragraph will be left
                 unchanged (other than URL rewriting if necessary).  However,
-                there are two ways you can append one or more dynamically
+                there are three ways you can append one or more dynamically
                 defined query parameters to the hyperlink -- specify a single
                 parameter with the <code>paramId</code> attribute (and its
                 associated attributes to select the value), or specify the
                 <code>name</code> (and optional <code>property</code>)
                 attributes to select a <code>java.util.Map</code> bean that
-                contains one or more parameter ids and corresponding values.
+                contains one or more parameter ids and corresponding values,
+                or nest one or more lt&;html:param&gt; tags in the tag body.
                 </p>
 
                 <p>To specify a single parameter, use the <code>paramId</code>
@@ -4139,6 +4142,14 @@
                 or an object whose toString() method will be called.
                 If a String array is specified, more than one value for the
                 same query parameter name will be created.</p>
+                
+                <p>Supplmenting these two methods, you can nest one or more 
+                lt&;html:param&gt; tags to dynamically add parameters in a
+                logic-friendly way (such as executing a for loop that 
+                assigns the name/value pairs at runtime). This method does
+                not compete with the aforementioned; it will adds its 
+                parameters <em>in addition</em> to whatever parameters are 
+                already specified.</p>
 
                 <p>Additionally, you can request that the current transaction
                 control token, if any, be included in the generated hyperlink
@@ -4653,6 +4664,47 @@
         </attribute>
     </tag>
     <tag>
+        <name>param</name>
+        <tag-class>org.apache.struts.taglib.html.ParamTag</tag-class>
+                               <description>
+            <![CDATA[
+                <p>Adds a parameter to the following tags:
+                       <ol>
+                               <li><a href="#frame">&lt;html:frame&gt;</li>
+                               <li><a href="#link">&lt;html:link&gt;</li>
+                               <li><a href="#rewrite">&lt;html:rewrite&gt;</li>
+                       </ol>
+                </p>
+            
+                           <dl><dt><b>Since:</b></dt>
+                           <dd>Struts 1.3.6</dd></dl>
+                       ]]>
+                               </description>
+        <attribute>
+            <name>name</name>
+            <required>true</required>
+            <rtexprvalue>true</rtexprvalue>
+            <description>
+                <![CDATA[
+                  <p>The String containing the name of the request 
parameter.</p>
+                ]]>
+            </description>
+        </attribute>
+        <attribute>
+            <name>value</name>
+            <required>false</required>
+            <rtexprvalue>true</rtexprvalue>
+            <description>
+                <![CDATA[
+                  <p>The value of the request parameter specified by the
+                  <code>name</code> attribute, whose return value must
+                  be a String or String[] that will be dynamically added to
+                  this hyperlink.</p>
+                ]]>
+            </description>
+        </attribute>
+    </tag>
+    <tag>
         <name>messages</name>
         <tag-class>org.apache.struts.taglib.html.MessagesTag</tag-class>
         <tei-class>org.apache.struts.taglib.html.MessagesTei</tei-class>
@@ -6833,7 +6885,7 @@
     <tag>
         <name>rewrite</name>
         <tag-class>org.apache.struts.taglib.html.RewriteTag</tag-class>
-        <body-content>empty</body-content>
+        <body-content>JSP</body-content>
         <description>
             <![CDATA[
             <p><strong>Render an URI</strong></p>


Reply via email to