KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > apache > struts > taglib > bean > WriteTag


1 /*
2  * $Id: WriteTag.java 54929 2004-10-16 16:38:42Z germuska $
3  *
4  * Copyright 1999-2004 The Apache Software Foundation.
5  *
6  * Licensed under the Apache License, Version 2.0 (the "License");
7  * you may not use this file except in compliance with the License.
8  * You may obtain a copy of the License at
9  *
10  * http://www.apache.org/licenses/LICENSE-2.0
11  *
12  * Unless required by applicable law or agreed to in writing, software
13  * distributed under the License is distributed on an "AS IS" BASIS,
14  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15  * See the License for the specific language governing permissions and
16  * limitations under the License.
17  */

18
19 package org.apache.struts.taglib.bean;
20
21 import java.math.BigDecimal JavaDoc;
22 import java.math.BigInteger JavaDoc;
23 import java.text.DecimalFormat JavaDoc;
24 import java.text.Format JavaDoc;
25 import java.text.NumberFormat JavaDoc;
26 import java.text.SimpleDateFormat JavaDoc;
27 import java.util.Locale JavaDoc;
28
29 import javax.servlet.jsp.JspException JavaDoc;
30 import javax.servlet.jsp.tagext.TagSupport JavaDoc;
31
32 import org.apache.struts.taglib.TagUtils;
33 import org.apache.struts.util.MessageResources;
34
35 /**
36  * Tag that retrieves the specified property of the specified bean, converts
37  * it to a String representation (if necessary), and writes it to the current
38  * output stream, optionally filtering characters that are sensitive in HTML.
39  *
40  * @version $Rev: 54929 $ $Date: 2004-10-16 17:38:42 +0100 (Sat, 16 Oct 2004) $
41  */

42 public class WriteTag extends TagSupport JavaDoc {
43
44     /**
45      * The key to search default format string for java.sql.Timestamp in resources.
46      */

47     public static final String JavaDoc SQL_TIMESTAMP_FORMAT_KEY =
48         "org.apache.struts.taglib.bean.format.sql.timestamp";
49
50     /**
51      * The key to search default format string for java.sql.Date in resources.
52      */

53     public static final String JavaDoc SQL_DATE_FORMAT_KEY =
54         "org.apache.struts.taglib.bean.format.sql.date";
55
56     /**
57      * The key to search default format string for java.sql.Time in resources.
58      */

59     public static final String JavaDoc SQL_TIME_FORMAT_KEY =
60         "org.apache.struts.taglib.bean.format.sql.time";
61
62     /**
63      * The key to search default format string for java.util.Date in resources.
64      */

65     public static final String JavaDoc DATE_FORMAT_KEY =
66         "org.apache.struts.taglib.bean.format.date";
67
68     /**
69      * The key to search default format string for int (byte, short, etc.) in resources.
70      */

71     public static final String JavaDoc INT_FORMAT_KEY =
72         "org.apache.struts.taglib.bean.format.int";
73
74     /**
75      * The key to search default format string for float (double, BigDecimal) in
76      * resources.
77      */

78     public static final String JavaDoc FLOAT_FORMAT_KEY =
79         "org.apache.struts.taglib.bean.format.float";
80
81     /**
82      * The message resources for this package.
83      */

84     protected static MessageResources messages =
85         MessageResources.getMessageResources(
86             "org.apache.struts.taglib.bean.LocalStrings");
87
88     // ------------------------------------------------------------- Properties
89

90     /**
91      * Filter the rendered output for characters that are sensitive in HTML?
92      */

93     protected boolean filter = true;
94
95     public boolean getFilter() {
96         return (this.filter);
97     }
98
99     public void setFilter(boolean filter) {
100         this.filter = filter;
101     }
102
103     /**
104      * Should we ignore missing beans and simply output nothing?
105      */

106     protected boolean ignore = false;
107
108     public boolean getIgnore() {
109         return (this.ignore);
110     }
111
112     public void setIgnore(boolean ignore) {
113         this.ignore = ignore;
114     }
115
116     /**
117      * Name of the bean that contains the data we will be rendering.
118      */

119     protected String JavaDoc name = null;
120
121     public String JavaDoc getName() {
122         return (this.name);
123     }
124
125     public void setName(String JavaDoc name) {
126         this.name = name;
127     }
128
129     /**
130      * Name of the property to be accessed on the specified bean.
131      */

132     protected String JavaDoc property = null;
133
134     public String JavaDoc getProperty() {
135         return (this.property);
136     }
137
138     public void setProperty(String JavaDoc property) {
139         this.property = property;
140     }
141
142     /**
143      * The scope to be searched to retrieve the specified bean.
144      */

145     protected String JavaDoc scope = null;
146
147     public String JavaDoc getScope() {
148         return (this.scope);
149     }
150
151     public void setScope(String JavaDoc scope) {
152         this.scope = scope;
153     }
154
155     /**
156      * The format string to be used as format to convert
157      * value to String.
158      */

159     protected String JavaDoc formatStr = null;
160
161     public String JavaDoc getFormat() {
162         return (this.formatStr);
163     }
164
165     public void setFormat(String JavaDoc formatStr) {
166         this.formatStr = formatStr;
167     }
168
169     /**
170      * The key to search format string in applciation resources
171      */

172     protected String JavaDoc formatKey = null;
173
174     public String JavaDoc getFormatKey() {
175         return (this.formatKey);
176     }
177
178     public void setFormatKey(String JavaDoc formatKey) {
179         this.formatKey = formatKey;
180     }
181
182     /**
183      * The session scope key under which our Locale is stored.
184      */

185     protected String JavaDoc localeKey = null;
186
187     public String JavaDoc getLocale() {
188         return (this.localeKey);
189     }
190
191     public void setLocale(String JavaDoc localeKey) {
192         this.localeKey = localeKey;
193     }
194
195     /**
196      * The servlet context attribute key for our resources.
197      */

198     protected String JavaDoc bundle = null;
199
200     public String JavaDoc getBundle() {
201         return (this.bundle);
202     }
203
204     public void setBundle(String JavaDoc bundle) {
205         this.bundle = bundle;
206     }
207
208     // --------------------------------------------------------- Public Methods
209

210     /**
211      * Process the start tag.
212      *
213      * @exception JspException if a JSP exception has occurred
214      */

215     public int doStartTag() throws JspException JavaDoc {
216
217         // Look up the requested bean (if necessary)
218
if (ignore) {
219             if (TagUtils.getInstance().lookup(pageContext, name, scope) == null) {
220                 return (SKIP_BODY); // Nothing to output
221
}
222         }
223
224         // Look up the requested property value
225
Object JavaDoc value = TagUtils.getInstance().lookup(pageContext, name, property, scope);
226
227         if (value == null) {
228             return (SKIP_BODY); // Nothing to output
229
}
230
231         // Convert value to the String with some formatting
232
String JavaDoc output = formatValue(value);
233
234         // Print this property value to our output writer, suitably filtered
235
if (filter) {
236             TagUtils.getInstance().write(pageContext, TagUtils.getInstance().filter(output));
237         } else {
238             TagUtils.getInstance().write(pageContext, output);
239         }
240
241         // Continue processing this page
242
return (SKIP_BODY);
243
244     }
245
246     /**
247      * Retrieve format string from message bundle and return null if
248      * message not found or message string.
249      *
250      * @param formatKey value to use as key to search message in bundle
251      * @exception JspException if a JSP exception has occurred
252      */

253     protected String JavaDoc retrieveFormatString(String JavaDoc formatKey) throws JspException JavaDoc {
254         String JavaDoc result =
255             TagUtils.getInstance().message(
256                 pageContext,
257                 this.bundle,
258                 this.localeKey,
259                 formatKey);
260
261         if ((result != null)
262             && !(result.startsWith("???") && result.endsWith("???"))) {
263
264             return result;
265
266         } else {
267             return null;
268         }
269
270     }
271
272     /**
273      * Format value according to specified format string (as tag attribute or
274      * as string from message resources) or to current user locale.
275      *
276      * When a format string is retrieved from the message resources,
277      * <code>applyLocalizedPattern</code> is used. For more about localized
278      * patterns, see
279      * <http://www.dei.unipd.it/corsi/fi2ae-docs/source/jdk1.1.7/src/java/text/resources/>.
280      * (To obtain the correct value for some characters, you may need to view
281      * the file in a hex editor and then use the Unicode escape form in the
282      * property resources file.)
283      *
284      * @param valueToFormat value to process and convert to String
285      * @exception JspException if a JSP exception has occurred
286      */

287     protected String JavaDoc formatValue(Object JavaDoc valueToFormat) throws JspException JavaDoc {
288         Format JavaDoc format = null;
289         Object JavaDoc value = valueToFormat;
290         Locale JavaDoc locale = TagUtils.getInstance().getUserLocale(pageContext, this.localeKey);
291         boolean formatStrFromResources = false;
292         String JavaDoc formatString = formatStr;
293
294         // Return String object as is.
295
if (value instanceof java.lang.String JavaDoc) {
296             return (String JavaDoc) value;
297         } else {
298
299             // Try to retrieve format string from resources by the key from formatKey.
300
if ((formatString == null) && (formatKey != null)) {
301                 formatString = retrieveFormatString(this.formatKey);
302                 if (formatString != null) {
303                     formatStrFromResources = true;
304                 }
305             }
306
307             // Prepare format object for numeric values.
308
if (value instanceof Number JavaDoc) {
309
310                 if (formatString == null) {
311                     if ((value instanceof Byte JavaDoc)
312                         || (value instanceof Short JavaDoc)
313                         || (value instanceof Integer JavaDoc)
314                         || (value instanceof Long JavaDoc)
315                         || (value instanceof BigInteger JavaDoc)) {
316
317                         formatString = retrieveFormatString(INT_FORMAT_KEY);
318
319                     } else if (
320                         (value instanceof Float JavaDoc)
321                             || (value instanceof Double JavaDoc)
322                             || (value instanceof BigDecimal JavaDoc)) {
323
324                         formatString = retrieveFormatString(FLOAT_FORMAT_KEY);
325                     }
326
327                     if (formatString != null) {
328                         formatStrFromResources = true;
329                     }
330                 }
331
332                 if (formatString != null) {
333                     try {
334                         format = NumberFormat.getNumberInstance(locale);
335                         if (formatStrFromResources) {
336                             ((DecimalFormat JavaDoc) format).applyLocalizedPattern(
337                                 formatString);
338                         } else {
339                             ((DecimalFormat JavaDoc) format).applyPattern(formatString);
340                         }
341
342                     } catch (IllegalArgumentException JavaDoc e) {
343                         JspException JavaDoc ex =
344                             new JspException JavaDoc(
345                                 messages.getMessage("write.format", formatString));
346                         TagUtils.getInstance().saveException(pageContext, ex);
347                         throw ex;
348                     }
349                 }
350
351             } else if (value instanceof java.util.Date JavaDoc) {
352
353                 if (formatString == null) {
354
355                     if (value instanceof java.sql.Timestamp JavaDoc) {
356                         formatString =
357                             retrieveFormatString(SQL_TIMESTAMP_FORMAT_KEY);
358
359                     } else if (value instanceof java.sql.Date JavaDoc) {
360                         formatString = retrieveFormatString(SQL_DATE_FORMAT_KEY);
361
362                     } else if (value instanceof java.sql.Time JavaDoc) {
363                         formatString = retrieveFormatString(SQL_TIME_FORMAT_KEY);
364
365                     } else if (value instanceof java.util.Date JavaDoc) {
366                         formatString = retrieveFormatString(DATE_FORMAT_KEY);
367                     }
368
369                 }
370
371                 if (formatString != null) {
372                         format = new SimpleDateFormat JavaDoc(formatString, locale);
373                 }
374             }
375         }
376
377         if (format != null) {
378             return format.format(value);
379         } else {
380             return value.toString();
381         }
382
383     }
384
385     /**
386      * Release all allocated resources.
387      */

388     public void release() {
389
390         super.release();
391         filter = true;
392         ignore = false;
393         name = null;
394         property = null;
395         scope = null;
396         formatStr = null;
397         formatKey = null;
398         localeKey = null;
399         bundle = null;
400
401     }
402
403 }
404
Popular Tags