View Javadoc

1   /*
2    * $Id: SizeTag.java 471754 2006-11-06 14:55:09Z husted $
3    *
4    * Licensed to the Apache Software Foundation (ASF) under one
5    * or more contributor license agreements.  See the NOTICE file
6    * distributed with this work for additional information
7    * regarding copyright ownership.  The ASF licenses this file
8    * to you under the Apache License, Version 2.0 (the
9    * "License"); you may not use this file except in compliance
10   * with the License.  You may obtain a copy of the License at
11   *
12   *  http://www.apache.org/licenses/LICENSE-2.0
13   *
14   * Unless required by applicable law or agreed to in writing,
15   * software distributed under the License is distributed on an
16   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
17   * KIND, either express or implied.  See the License for the
18   * specific language governing permissions and limitations
19   * under the License.
20   */
21  package org.apache.struts.taglib.bean;
22  
23  import org.apache.struts.taglib.TagUtils;
24  import org.apache.struts.util.MessageResources;
25  
26  import javax.servlet.jsp.JspException;
27  import javax.servlet.jsp.PageContext;
28  import javax.servlet.jsp.tagext.TagSupport;
29  
30  import java.lang.reflect.Array;
31  
32  import java.util.Collection;
33  import java.util.Map;
34  
35  /**
36   * Define a scripting variable that will contain the number of elements found
37   * in a specified array, Collection, or Map.
38   *
39   * @version $Rev: 471754 $ $Date: 2004-10-16 12:38:42 -0400 (Sat, 16 Oct 2004)
40   *          $
41   */
42  public class SizeTag extends TagSupport {
43      /**
44       * The message resources for this package.
45       */
46      protected static MessageResources messages =
47          MessageResources.getMessageResources(
48              "org.apache.struts.taglib.bean.LocalStrings");
49  
50      // ------------------------------------------------------------- Properties
51  
52      /**
53       * The actual collection to be counted.
54       */
55      protected Object collection = null;
56  
57      /**
58       * The name of the scripting variable that will be exposed as a page scope
59       * attribute.
60       */
61      protected String id = null;
62  
63      /**
64       * The name of the bean owning the property to be counted.
65       */
66      protected String name = null;
67  
68      /**
69       * The name of the property to be retrieved.
70       */
71      protected String property = null;
72  
73      /**
74       * The scope within which to search for the specified bean.
75       */
76      protected String scope = null;
77  
78      public Object getCollection() {
79          return (this.collection);
80      }
81  
82      public void setCollection(Object collection) {
83          this.collection = collection;
84      }
85  
86      public String getId() {
87          return (this.id);
88      }
89  
90      public void setId(String id) {
91          this.id = id;
92      }
93  
94      public String getName() {
95          return (this.name);
96      }
97  
98      public void setName(String name) {
99          this.name = name;
100     }
101 
102     public String getProperty() {
103         return (this.property);
104     }
105 
106     public void setProperty(String property) {
107         this.property = property;
108     }
109 
110     public String getScope() {
111         return (this.scope);
112     }
113 
114     public void setScope(String scope) {
115         this.scope = scope;
116     }
117 
118     // --------------------------------------------------------- Public Methods
119 
120     /**
121      * Retrieve the required property and expose it as a scripting variable.
122      *
123      * @throws JspException if a JSP exception has occurred
124      */
125     public int doStartTag() throws JspException {
126         // Retrieve the required property value
127         Object value = this.collection;
128 
129         if (value == null) {
130             if (name == null) {
131                 // Must specify either a collection attribute or a name
132                 // attribute.
133                 JspException e =
134                     new JspException(messages.getMessage(
135                             "size.noCollectionOrName"));
136 
137                 TagUtils.getInstance().saveException(pageContext, e);
138                 throw e;
139             }
140 
141             value =
142                 TagUtils.getInstance().lookup(pageContext, name, property, scope);
143         }
144 
145         // Identify the number of elements, based on the collection type
146         int size = 0;
147 
148         if (value == null) {
149             JspException e =
150                 new JspException(messages.getMessage("size.collection"));
151 
152             TagUtils.getInstance().saveException(pageContext, e);
153             throw e;
154         } else if (value.getClass().isArray()) {
155             size = Array.getLength(value);
156         } else if (value instanceof Collection) {
157             size = ((Collection) value).size();
158         } else if (value instanceof Map) {
159             size = ((Map) value).size();
160         } else {
161             JspException e =
162                 new JspException(messages.getMessage("size.collection"));
163 
164             TagUtils.getInstance().saveException(pageContext, e);
165             throw e;
166         }
167 
168         // Expose this size as a scripting variable
169         pageContext.setAttribute(this.id, new Integer(size),
170             PageContext.PAGE_SCOPE);
171 
172         return (SKIP_BODY);
173     }
174 
175     /**
176      * Release all allocated resources.
177      */
178     public void release() {
179         super.release();
180         collection = null;
181         id = null;
182         name = null;
183         property = null;
184         scope = null;
185     }
186 }