View Javadoc

1   /*
2    * $Id: PutListTag.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  
22  package org.apache.struts.tiles.taglib;
23  
24  import java.util.ArrayList;
25  import java.util.List;
26  
27  import javax.servlet.jsp.JspException;
28  import javax.servlet.jsp.tagext.TagSupport;
29  
30  import org.apache.struts.tiles.AttributeDefinition;
31  import org.apache.struts.tiles.UntypedAttribute;
32  
33  /**
34   * PutList tag implementation.
35   */
36  public class PutListTag
37      extends TagSupport
38      implements ComponentConstants, AddTagParent, PutListTagParent {
39  
40      /**
41       * Name of this attribute.
42       */
43      private String attributeName = null;
44  
45      /**
46       * The list itself.
47       */
48      private List list = null;
49  
50      /**
51       * Role attribute.
52       */
53      private String role = null;
54  
55      /**
56       * Default constructor.
57       */
58      public PutListTag() {
59          super();
60      }
61  
62      /**
63       * Release all allocated resources.
64       */
65      public void release() {
66          super.release();
67          attributeName = null;
68          role = null;
69      }
70  
71      /**
72       * Release all internal resources.
73       */
74      protected void releaseInternal() {
75          list = null;
76      }
77  
78      /**
79       * Set property.
80       */
81      public void setName(String name) {
82          this.attributeName = name;
83      }
84  
85      /**
86       * Get property.
87       */
88      public String getName() {
89          return attributeName;
90      }
91  
92      /**
93       * Set role attribute.
94       * @param role The role the user must be in to store content.
95       */
96      public void setRole(String role) {
97          this.role = role;
98      }
99  
100     /**
101      * Get role attribute.
102      */
103     public String getRole() {
104         return role;
105     }
106 
107     /**
108      * Get list defined in tag.
109      */
110     public List getList() {
111         return list;
112     }
113 
114     /**
115      * Set property.
116      */
117     public void addElement(Object value) {
118         if (list == null) {
119             list = new ArrayList();
120         }
121 
122         list.add(value);
123     }
124 
125     /**
126      * Process nested ≶putList> tag.
127      * Method calls by nested ≶putList> tags.
128      * Nested list is added to current list.
129      * If role is defined, nested attribute is wrapped into an untypped definition
130      * containing attribute value and role.
131      */
132     public void processNestedTag(PutListTag nestedTag) throws JspException {
133         // Get real value and check role
134         // If role is set, add it in attribute definition if any.
135         // If no attribute definition, create untyped one, and set role.
136         Object attributeValue = nestedTag.getList();
137 
138         if (nestedTag.getRole() != null) {
139             AttributeDefinition def = new UntypedAttribute(attributeValue);
140             def.setRole(nestedTag.getRole());
141             attributeValue = def;
142         }
143 
144         // now add attribute to enclosing parent (i.e. : this object)
145         addElement(attributeValue);
146     }
147 
148     /**
149      * Process nested ≶add> tag.
150      * Method calls by nested ≶add> tags.
151      * Nested attribute is added to current list.
152      * If role is defined, nested attribute is wrapped into an untypped definition
153      * containing attribute value and role.
154      */
155     public void processNestedTag(AddTag nestedTag) throws JspException {
156         // Get real value and check role
157         // If role is set, add it in attribute definition if any.
158         // If no attribute definition, create untyped one, and set role.
159         Object attributeValue = nestedTag.getRealValue();
160         AttributeDefinition def;
161 
162         if (nestedTag.getRole() != null) {
163             try {
164                 def = ((AttributeDefinition) attributeValue);
165             } catch (ClassCastException ex) {
166                 def = new UntypedAttribute(attributeValue);
167             }
168             def.setRole(nestedTag.getRole());
169             attributeValue = def;
170         }
171 
172         // now add attribute to enclosing parent (i.e. : this object)
173         addElement(attributeValue);
174     }
175 
176     /**
177      * Do start tag.
178      */
179     public int doStartTag() throws JspException {
180         return EVAL_BODY_INCLUDE;
181     }
182 
183     /**
184      * Do end tag.
185      */
186     public int doEndTag() throws JspException {
187         PutListTagParent enclosingParent = findEnclosingParent();
188         enclosingParent.processNestedTag(this);
189         // Clear list to avoid reuse
190         releaseInternal();
191         return EVAL_PAGE;
192     }
193 
194     /**
195      * Find enclosing parent tag accepting this tag.
196      * @throws JspException If we can't find an appropriate enclosing tag.
197      */
198     protected PutListTagParent findEnclosingParent() throws JspException {
199         try {
200             PutListTagParent parent =
201                 (PutListTagParent) findAncestorWithClass(this,
202                     PutListTagParent.class);
203 
204             if (parent == null) {
205                 throw new JspException("Error - tag putList : enclosing tag doesn't accept 'putList' tag.");
206             }
207 
208             return parent;
209 
210         } catch (ClassCastException ex) {
211             throw new JspException("Error - tag putList : enclosing tag doesn't accept 'putList' tag.", ex);
212         }
213     }
214 
215 }