View Javadoc

1   /*
2    * $Id: DefineTag.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.commons.logging.Log;
24  import org.apache.commons.logging.LogFactory;
25  import org.apache.struts.taglib.TagUtils;
26  import org.apache.struts.util.MessageResources;
27  
28  import javax.servlet.jsp.JspException;
29  import javax.servlet.jsp.PageContext;
30  import javax.servlet.jsp.tagext.BodyTagSupport;
31  
32  /**
33   * Define a scripting variable based on the value(s) of the specified bean
34   * property.
35   *
36   * @version $Rev: 471754 $ $Date: 2005-06-15 12:16:32 -0400 (Wed, 15 Jun 2005)
37   *          $
38   */
39  public class DefineTag extends BodyTagSupport {
40      /**
41       * Commons logging instance.
42       */
43      private static final Log log = LogFactory.getLog(DefineTag.class);
44  
45      // ---------------------------------------------------- Protected variables
46  
47      /**
48       * The message resources for this package.
49       */
50      protected static MessageResources messages =
51          MessageResources.getMessageResources(
52              "org.apache.struts.taglib.bean.LocalStrings");
53  
54      /**
55       * The body content of this tag (if any).
56       */
57      protected String body = null;
58  
59      // ------------------------------------------------------------- Properties
60  
61      /**
62       * The name of the scripting variable that will be exposed as a page scope
63       * attribute.
64       */
65      protected String id = null;
66  
67      /**
68       * The name of the bean owning the property to be exposed.
69       */
70      protected String name = null;
71  
72      /**
73       * The name of the property to be retrieved.
74       */
75      protected String property = null;
76  
77      /**
78       * The scope within which to search for the specified bean.
79       */
80      protected String scope = null;
81  
82      /**
83       * The scope within which the newly defined bean will be creatd.
84       */
85      protected String toScope = null;
86  
87      /**
88       * The fully qualified Java class name of the value to be exposed.
89       */
90      protected String type = null;
91  
92      /**
93       * The (String) value to which the defined bean will be set.
94       */
95      protected String value = null;
96  
97      public String getId() {
98          return (this.id);
99      }
100 
101     public void setId(String id) {
102         this.id = id;
103     }
104 
105     public String getName() {
106         return (this.name);
107     }
108 
109     public void setName(String name) {
110         this.name = name;
111     }
112 
113     public String getProperty() {
114         return (this.property);
115     }
116 
117     public void setProperty(String property) {
118         this.property = property;
119     }
120 
121     public String getScope() {
122         return (this.scope);
123     }
124 
125     public void setScope(String scope) {
126         this.scope = scope;
127     }
128 
129     public String getToScope() {
130         return (this.toScope);
131     }
132 
133     public void setToScope(String toScope) {
134         this.toScope = toScope;
135     }
136 
137     public String getType() {
138         return (this.type);
139     }
140 
141     public void setType(String type) {
142         this.type = type;
143     }
144 
145     public String getValue() {
146         return (this.value);
147     }
148 
149     public void setValue(String value) {
150         this.value = value;
151     }
152 
153     // --------------------------------------------------------- Public Methods
154 
155     /**
156      * Check if we need to evaluate the body of the tag
157      *
158      * @throws JspException if a JSP exception has occurred
159      */
160     public int doStartTag() throws JspException {
161         return (EVAL_BODY_TAG);
162     }
163 
164     /**
165      * Save the body content of this tag (if any), or throw a JspException if
166      * the value was already defined.
167      *
168      * @throws JspException if value was defined by an attribute
169      */
170     public int doAfterBody() throws JspException {
171         if (bodyContent != null) {
172             body = bodyContent.getString();
173 
174             if (body != null) {
175                 body = body.trim();
176             }
177 
178             if (body.length() < 1) {
179                 body = null;
180             }
181         }
182 
183         return (SKIP_BODY);
184     }
185 
186     /**
187      * Retrieve the required property and expose it as a scripting variable.
188      *
189      * @throws JspException if a JSP exception has occurred
190      */
191     public int doEndTag() throws JspException {
192         // Enforce restriction on ways to declare the new value
193         int n = 0;
194 
195         if (this.body != null) {
196             n++;
197         }
198 
199         if (this.name != null) {
200             n++;
201         }
202 
203         if (this.value != null) {
204             n++;
205         }
206 
207         if (n > 1) {
208             JspException e =
209                 new JspException(messages.getMessage("define.value", id));
210 
211             TagUtils.getInstance().saveException(pageContext, e);
212             throw e;
213         }
214 
215         // Retrieve the required property value
216         Object value = this.value;
217 
218         if ((value == null) && (name != null)) {
219             value =
220                 TagUtils.getInstance().lookup(pageContext, name, property, scope);
221         }
222 
223         if ((value == null) && (body != null)) {
224             value = body;
225         }
226 
227         if (value == null) {
228             JspException e =
229                 new JspException(messages.getMessage("define.null", id));
230 
231             TagUtils.getInstance().saveException(pageContext, e);
232             throw e;
233         }
234 
235         // Expose this value as a scripting variable
236         int inScope = PageContext.PAGE_SCOPE;
237 
238         try {
239             if (toScope != null) {
240                 inScope = TagUtils.getInstance().getScope(toScope);
241             }
242         } catch (JspException e) {
243             log.warn("toScope was invalid name so we default to PAGE_SCOPE", e);
244         }
245 
246         pageContext.setAttribute(id, value, inScope);
247 
248         // Continue processing this page
249         return (EVAL_PAGE);
250     }
251 
252     /**
253      * Release all allocated resources.
254      */
255     public void release() {
256         super.release();
257         body = null;
258         id = null;
259         name = null;
260         property = null;
261         scope = null;
262         toScope = "page";
263         type = null;
264         value = null;
265     }
266 }