craigmcc 01/02/12 17:56:08 Modified: src/doc struts-bean.xml src/share/org/apache/struts/taglib/bean LocalStrings.properties web/test index.jsp Added: src/share/org/apache/struts/taglib/bean SizeTag.java SizeTei.java web/test bean-size.jsp Log: Add a new <bean:size> tag that will store the size of an array, Collection, or Map into a page-scope bean with type java.lang.Integer. Submitted by: Hal Deadman <[EMAIL PROTECTED]> Revision Changes Path 1.19 +82 -0 jakarta-struts/src/doc/struts-bean.xml Index: struts-bean.xml =================================================================== RCS file: /home/cvs/jakarta-struts/src/doc/struts-bean.xml,v retrieving revision 1.18 retrieving revision 1.19 diff -u -r1.18 -r1.19 --- struts-bean.xml 2001/02/03 03:23:24 1.18 +++ struts-bean.xml 2001/02/13 01:56:05 1.19 @@ -662,6 +662,88 @@ <tag> + <name>size</name> + <summary> + Define a bean containing the number of elements in a Collection or Map. + </summary> + <tagclass>org.apache.struts.taglib.bean.SizeTag</tagclass> + <teiclass>org.apache.struts.taglib.bean.SizeTei</teiclass> + <bodycontent>empty</bodycontent> + <info> + <p>Given a reference to an array, Collection or Map, creates a new bean, of + type <code>java.lang.Integer</code>, whose value is the number of elements + in that collection. You can specify the collection to be counted in any + one of the following ways:</p> + <ul> + <li>As a runtime expression specified as the value of the + <code>collection</code> attribute.</li> + <li>As a JSP bean specified by the <code>name</code> attribute.</li> + <li>As the property, specified by the <code>property</code> attribute, + of the JSP bean specified by the <code>bean</code> attribute.</li> + </ul> + </info> + + <attribute> + <name>collection</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + <info> + <p>A runtime expression that evaluates to an array, a Collection, or + a Map.</p> + </info> + </attribute> + + <attribute> + <name>id</name> + <required>true</required> + <rtexprvalue>true</rtexprvalue> + <info> + <p>The name of a page scope JSP bean, of type + <code>java.lang.Integer</code>, that will be created to contain the + size of the underlying collection being counted.</p> + </info> + </attribute> + + <attribute> + <name>name</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + <info> + <p>The name of the JSP bean (optionally constrained to the scope + specified by the <code>scope</code> attribute) that contains the + collection to be counted (if <code>property</code> is not specified), + or whose property getter is called to return the collection to be + counted (if <code>property</code> is specified.</p> + </info> + </attribute> + + <attribute> + <name>property</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + <info> + <p>The name of the property, of the bean specified by the + <code>name</code> attribute, whose getter method will return the + collection to be counted.</p> + </info> + </attribute> + + <attribute> + <name>scope</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + <info> + <p>The bean scope within which to search for the JSP bean specified + by the <code>name</code> attribute. If not specified, the available + scopes are searched in ascending sequence.</p> + </info> + </attribute> + + </tag> + + + <tag> + <name>struts</name> <summary> Expose a named Struts internal configuration object as a bean. 1.10 +1 -0 jakarta-struts/src/share/org/apache/struts/taglib/bean/LocalStrings.properties Index: LocalStrings.properties =================================================================== RCS file: /home/cvs/jakarta-struts/src/share/org/apache/struts/taglib/bean/LocalStrings.properties,v retrieving revision 1.9 retrieving revision 1.10 diff -u -r1.9 -r1.10 --- LocalStrings.properties 2001/02/12 01:26:57 1.9 +++ LocalStrings.properties 2001/02/13 01:56:06 1.10 @@ -11,5 +11,6 @@ page.selector=Invalid page context selector {0} parameter.get=No parameter {0} was included in this request resource.get=No resource {0} available in this application +size.collection=No valid collection specified for size tag struts.missing=No Struts internal object named {0} is available struts.selector=You must specify exactly one of formBean, forward, or mapping 1.1 jakarta-struts/src/share/org/apache/struts/taglib/bean/SizeTag.java Index: SizeTag.java =================================================================== /* * $Header: /home/cvs/jakarta-struts/src/share/org/apache/struts/taglib/bean/SizeTag.java,v 1.1 2001/02/13 01:56:07 craigmcc Exp $ * $Revision: 1.1 $ * $Date: 2001/02/13 01:56:07 $ * * ==================================================================== * * The Apache Software License, Version 1.1 * * Copyright (c) 1999-2001 The Apache Software Foundation. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * 3. The end-user documentation included with the redistribution, if * any, must include the following acknowlegement: * "This product includes software developed by the * Apache Software Foundation (http://www.apache.org/)." * Alternately, this acknowlegement may appear in the software itself, * if and wherever such third-party acknowlegements normally appear. * * 4. The names "The Jakarta Project", "Struts", and "Apache Software * Foundation" must not be used to endorse or promote products derived * from this software without prior written permission. For written * permission, please contact [EMAIL PROTECTED] * * 5. Products derived from this software may not be called "Apache" * nor may "Apache" appear in their names without prior written * permission of the Apache Group. * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * ==================================================================== * * This software consists of voluntary contributions made by many * individuals on behalf of the Apache Software Foundation. For more * information on the Apache Software Foundation, please see * <http://www.apache.org/>. * */ package org.apache.struts.taglib.bean; import java.io.IOException; import java.lang.reflect.Array; import java.util.Collection; import java.util.List; import java.util.Map; import javax.servlet.jsp.JspException; import javax.servlet.jsp.PageContext; import javax.servlet.jsp.tagext.TagSupport; import org.apache.struts.util.MessageResources; import org.apache.struts.util.PropertyUtils; import org.apache.struts.util.RequestUtils; /** * Define a scripting variable that will contain the number of elements * found in a specified array, Collection, or Map. * * @author Craig R. McClanahan * @version $Revision: 1.1 $ $Date: 2001/02/13 01:56:07 $ */ public class SizeTag extends TagSupport { // ------------------------------------------------------------- Properties /** * The actual collection to be counted. */ protected Object collection = null; public Object getCollection() { return (this.collection); } public void setCollection(Object collection) { this.collection = collection; } /** * The name of the scripting variable that will be exposed as a page * scope attribute. */ protected String id = null; public String getId() { return (this.id); } public void setId(String id) { this.id = id; } /** * The message resources for this package. */ protected static MessageResources messages = MessageResources.getMessageResources ("org.apache.struts.taglib.logic.LocalStrings"); /** * The name of the bean owning the property to be counted. */ protected String name = null; public String getName() { return (this.name); } public void setName(String name) { this.name = name; } /** * The name of the property to be retrieved. */ protected String property = null; public String getProperty() { return (this.property); } public void setProperty(String property) { this.property = property; } /** * The scope within which to search for the specified bean. */ protected String scope = null; public String getScope() { return (this.scope); } public void setScope(String scope) { this.scope = scope; } // --------------------------------------------------------- Public Methods /** * Retrieve the required property and expose it as a scripting variable. * * @exception JspException if a JSP exception has occurred */ public int doStartTag() throws JspException { // Retrieve the required property value Object value = this.collection; if (value == null) value = RequestUtils.lookup(pageContext, name, property, scope); // Identify the number of elements, based on the collection type int size = 0; if (value == null) { JspException e = new JspException (messages.getMessage("size.collection")); RequestUtils.saveException(pageContext, e); throw e; } else if (value.getClass().isArray()) { size = Array.getLength(value); } else if (value instanceof Collection) { size = ((Collection) value).size(); } else if (value instanceof Map) { size = ((Map) value).size(); } else { JspException e = new JspException (messages.getMessage("size.collection")); RequestUtils.saveException(pageContext, e); throw e; } // Expose this size as a scripting variable pageContext.setAttribute(this.id, new Integer(size), PageContext.PAGE_SCOPE); return (SKIP_BODY); } /** * Release all allocated resources. */ public void release() { super.release(); collection = null; id = null; name = null; property = null; scope = null; } } 1.1 jakarta-struts/src/share/org/apache/struts/taglib/bean/SizeTei.java Index: SizeTei.java =================================================================== /* * $Header: /home/cvs/jakarta-struts/src/share/org/apache/struts/taglib/bean/SizeTei.java,v 1.1 2001/02/13 01:56:07 craigmcc Exp $ * $Revision: 1.1 $ * $Date: 2001/02/13 01:56:07 $ * * ==================================================================== * * The Apache Software License, Version 1.1 * * Copyright (c) 1999-2001 The Apache Software Foundation. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * 3. The end-user documentation included with the redistribution, if * any, must include the following acknowlegement: * "This product includes software developed by the * Apache Software Foundation (http://www.apache.org/)." * Alternately, this acknowlegement may appear in the software itself, * if and wherever such third-party acknowlegements normally appear. * * 4. The names "The Jakarta Project", "Struts", and "Apache Software * Foundation" must not be used to endorse or promote products derived * from this software without prior written permission. For written * permission, please contact [EMAIL PROTECTED] * * 5. Products derived from this software may not be called "Apache" * nor may "Apache" appear in their names without prior written * permission of the Apache Group. * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * ==================================================================== * * This software consists of voluntary contributions made by many * individuals on behalf of the Apache Software Foundation. For more * information on the Apache Software Foundation, please see * <http://www.apache.org/>. * */ package org.apache.struts.taglib.bean; import javax.servlet.jsp.tagext.TagData; import javax.servlet.jsp.tagext.TagExtraInfo; import javax.servlet.jsp.tagext.VariableInfo; /** * Implementation of <code>TagExtraInfo</code> for the <b>size</b> * tag, identifying the scripting object(s) to be made visible. * * @author Craig R. McClanahan * @version $Revision: 1.1 $ $Date: 2001/02/13 01:56:07 $ */ public class SizeTei extends TagExtraInfo { /** * Return information about the scripting variables to be created. */ public VariableInfo[] getVariableInfo(TagData data) { return new VariableInfo[] { new VariableInfo(data.getAttributeString("id"), "java.lang.Integer", true, VariableInfo.AT_BEGIN) }; } } 1.5 +1 -0 jakarta-struts/web/test/index.jsp Index: index.jsp =================================================================== RCS file: /home/cvs/jakarta-struts/web/test/index.jsp,v retrieving revision 1.4 retrieving revision 1.5 diff -u -r1.4 -r1.5 --- index.jsp 2001/01/08 22:20:52 1.4 +++ index.jsp 2001/02/13 01:56:08 1.5 @@ -16,6 +16,7 @@ <li><a href="bean-include.jsp"><bean:include></a></li> <li><a href="bean-parameter.jsp?param1=value1¶m2=value2"><bean:parameter></a></li> <li><a href="bean-resource.jsp"><bean:resource></a></li> +<li><a href="bean-size.jsp"><bean:size></a></li> <li><a href="bean-write.jsp"><bean:write></a></li> </ul> 1.1 jakarta-struts/web/test/bean-size.jsp Index: bean-size.jsp =================================================================== <%@ page language="java" %> <%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %> <html> <head> <title>Test struts-bean Size Tag</title> </head> <body bgcolor="white"> <% java.util.ArrayList data = new java.util.ArrayList(); data.add("First"); data.add("Second"); data.add("Third"); data.add("Fourth"); data.add("Fifth"); pageContext.setAttribute("list", data, PageContext.PAGE_SCOPE); java.util.HashMap temp = new java.util.HashMap(); temp.put("First", "0"); temp.put("Second", "1"); temp.put("Third", "2"); temp.put("Fourth", "3"); temp.put("Fifth", "4"); pageContext.setAttribute("map", temp, PageContext.PAGE_SCOPE); %> <bean:size id="dataSize" collection="<%= data %>"/> <bean:size id="tempSize" collection="<%= temp %>"/> <div align="center"> <h1>Test struts-bean Size Tag</h1> </div> <jsp:useBean id="bean" scope="page" class="org.apache.struts.test.TestBean"/> <bean:size id="stringSize" name="bean" property="stringArray"/> <bean:size id="intSize" name="bean" property="intArray"/> <jsp:useBean id="list" scope="page" class="java.util.ArrayList"/> <bean:size id="listSize" name="list"/> <jsp:useBean id="map" scope="page" class="java.util.HashMap"/> <bean:size id="mapSize" name="map"/> <table border="1"> <tr> <th>Collection Type</th> <th>Correct Value</th> <th>Test Result</th> </tr> <tr> <td>Bean (List)</td> <td align="center"><%= list.size() %></td> <td align="center"><bean:write name="listSize"/></td> </tr> <tr> <td>Bean (Map)</td> <td align="center"><%= map.size() %></td> <td align="center"><bean:write name="mapSize"/></td> </tr> <tr> <td>Collection (List)</td> <td align="center"><%= data.size() %></td> <td align="center"><bean:write name="dataSize"/></td> </tr> <tr> <td>Collection (Map)</td> <td align="center"><%= temp.size() %></td> <td align="center"><bean:write name="tempSize"/></td> </tr> <tr> <td>Property (int[])</td> <td align="center"><% int intValues[] = bean.getIntArray(); out.print(intValues.length); %></td> <td align="center"><bean:write name="intSize"/></td> </tr> <tr> <td>Property (String[])</td> <td align="center"><% String stringValues[] = bean.getStringArray(); out.print(stringValues.length); %></td> <td align="center"><bean:write name="stringSize"/></td> </tr> </table> </html> </body>