View Javadoc

1   /*
2    * $Id: MessageTag.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.Globals;
24  import org.apache.struts.taglib.TagUtils;
25  import org.apache.struts.util.MessageResources;
26  
27  import javax.servlet.jsp.JspException;
28  import javax.servlet.jsp.tagext.TagSupport;
29  
30  import java.util.Locale;
31  
32  /**
33   * Custom tag that retrieves an internationalized messages string (with
34   * optional parametric replacement) from the <code>ActionResources</code>
35   * object stored as a context attribute by our associated
36   * <code>ActionServlet</code> implementation.
37   *
38   * @version $Rev: 471754 $ $Date: 2005-09-16 09:38:33 -0400 (Fri, 16 Sep 2005)
39   *          $
40   */
41  public class MessageTag extends TagSupport {
42      /**
43       * The message resources for this package.
44       */
45      protected static MessageResources messages =
46          MessageResources.getMessageResources(
47              "org.apache.struts.taglib.bean.LocalStrings");
48  
49      // ------------------------------------------------------------- Properties
50  
51      /**
52       * The first optional argument.
53       */
54      protected String arg0 = null;
55  
56      /**
57       * The second optional argument.
58       */
59      protected String arg1 = null;
60  
61      /**
62       * The third optional argument.
63       */
64      protected String arg2 = null;
65  
66      /**
67       * The fourth optional argument.
68       */
69      protected String arg3 = null;
70  
71      /**
72       * The fifth optional argument.
73       */
74      protected String arg4 = null;
75  
76      /**
77       * The servlet context attribute key for our resources.
78       */
79      protected String bundle = null;
80  
81      /**
82       * The message key of the message to be retrieved.
83       */
84      protected String key = null;
85  
86      /**
87       * Name of the bean that contains the message key.
88       */
89      protected String name = null;
90  
91      /**
92       * Name of the property to be accessed on the specified bean.
93       */
94      protected String property = null;
95  
96      /**
97       * The scope to be searched to retrieve the specified bean.
98       */
99      protected String scope = null;
100 
101     /**
102      * The session scope key under which our Locale is stored.
103      */
104     protected String localeKey = Globals.LOCALE_KEY;
105 
106     public String getArg0() {
107         return (this.arg0);
108     }
109 
110     public void setArg0(String arg0) {
111         this.arg0 = arg0;
112     }
113 
114     public String getArg1() {
115         return (this.arg1);
116     }
117 
118     public void setArg1(String arg1) {
119         this.arg1 = arg1;
120     }
121 
122     public String getArg2() {
123         return (this.arg2);
124     }
125 
126     public void setArg2(String arg2) {
127         this.arg2 = arg2;
128     }
129 
130     public String getArg3() {
131         return (this.arg3);
132     }
133 
134     public void setArg3(String arg3) {
135         this.arg3 = arg3;
136     }
137 
138     public String getArg4() {
139         return (this.arg4);
140     }
141 
142     public void setArg4(String arg4) {
143         this.arg4 = arg4;
144     }
145 
146     public String getBundle() {
147         return (this.bundle);
148     }
149 
150     public void setBundle(String bundle) {
151         this.bundle = bundle;
152     }
153 
154     public String getKey() {
155         return (this.key);
156     }
157 
158     public void setKey(String key) {
159         this.key = key;
160     }
161 
162     public String getName() {
163         return (this.name);
164     }
165 
166     public void setName(String name) {
167         this.name = name;
168     }
169 
170     public String getProperty() {
171         return (this.property);
172     }
173 
174     public void setProperty(String property) {
175         this.property = property;
176     }
177 
178     public String getScope() {
179         return (this.scope);
180     }
181 
182     public void setScope(String scope) {
183         this.scope = scope;
184     }
185 
186     public String getLocale() {
187         return (this.localeKey);
188     }
189 
190     public void setLocale(String localeKey) {
191         this.localeKey = localeKey;
192     }
193 
194     // --------------------------------------------------------- Public Methods
195 
196     /**
197      * Process the start tag.
198      *
199      * @throws JspException if a JSP exception has occurred
200      */
201     public int doStartTag() throws JspException {
202         String key = this.key;
203 
204         if (key == null) {
205             // Look up the requested property value
206             Object value =
207                 TagUtils.getInstance().lookup(pageContext, name, property, scope);
208 
209             if ((value != null) && !(value instanceof String)) {
210                 JspException e =
211                     new JspException(messages.getMessage("message.property", key));
212 
213                 TagUtils.getInstance().saveException(pageContext, e);
214                 throw e;
215             }
216 
217             key = (String) value;
218         }
219 
220         // Construct the optional arguments array we will be using
221         Object[] args = new Object[] { arg0, arg1, arg2, arg3, arg4 };
222 
223         // Retrieve the message string we are looking for
224         String message =
225             TagUtils.getInstance().message(pageContext, this.bundle,
226                 this.localeKey, key, args);
227 
228         if (message == null) {
229             Locale locale =
230                 TagUtils.getInstance().getUserLocale(pageContext, this.localeKey);
231             String localeVal =
232                 (locale == null) ? "default locale" : locale.toString();
233             JspException e =
234                 new JspException(messages.getMessage("message.message",
235                         "\"" + key + "\"",
236                         "\"" + ((bundle == null) ? "(default bundle)" : bundle)
237                         + "\"", localeVal));
238 
239             TagUtils.getInstance().saveException(pageContext, e);
240             throw e;
241         }
242 
243         TagUtils.getInstance().write(pageContext, message);
244 
245         return (SKIP_BODY);
246     }
247 
248     /**
249      * Release any acquired resources.
250      */
251     public void release() {
252         super.release();
253         arg0 = null;
254         arg1 = null;
255         arg2 = null;
256         arg3 = null;
257         arg4 = null;
258         bundle = Globals.MESSAGES_KEY;
259         key = null;
260         name = null;
261         property = null;
262         scope = null;
263         localeKey = Globals.LOCALE_KEY;
264     }
265 }