1 /*
2 * $Id: MessagesMap.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.faces.util;
23
24
25 import java.util.Collection;
26 import java.util.Locale;
27 import java.util.Map;
28 import java.util.Set;
29
30 import org.apache.struts.util.MessageResources;
31
32
33 /**
34 * <p>A limited immutable <code>Map</code> implementation that wraps the
35 * <code>MessageResources</code> instance for the specified
36 * <code>Locale</code>. Exposing the messages as a <code>Map</code>
37 * makes them easily accessible via value binding expressions, as
38 * well as JSP 2.0 expression language expressions.
39 */
40
41 public class MessagesMap implements Map {
42
43
44 // ------------------------------------------------------------ Constructors
45
46
47 /**
48 * <p>Construct a new {@link MessagesMap} instance that wraps the
49 * specified <code>MessageResources</code> instance, and returns messages
50 * for the specified <code>Locale</code>.</p>
51 *
52 * @param messages <code>MessageResources</code> instance to wrap
53 * @param locale <code>Locale</code> for which to retrieve messages,
54 * or <code>null</code> for the system default <code>Locale</code>
55 *
56 * @exception NullPointerException if <code>messages</code>
57 * is <code>null</code>
58 */
59 public MessagesMap(MessageResources messages, Locale locale) {
60
61 super();
62 if (messages == null) {
63 throw new NullPointerException();
64 }
65 this.messages = messages;
66 this.locale = locale;
67
68 }
69
70
71 // ------------------------------------------------------ Instance Variables
72
73
74 /**
75 * <p>The <code>Locale</code> for which to return messages, or
76 * <code>null</code> for the system default <code>Locale</code>.</p>
77 */
78 private Locale locale = null;
79
80
81 /**
82 * <p>The <code>MessageResources</code> being wrapped by this
83 * {@link MessagesMap}.</p>
84 */
85 private MessageResources messages = null;
86
87
88 // ---------------------------------------------------------- Public Methods
89
90
91 /**
92 * <p>The <code>clear()</code> method is not supported.</p>
93 */
94 public void clear() {
95
96 throw new UnsupportedOperationException();
97
98 }
99
100
101 /**
102 * <p>Return <code>true</code> if there is a message for the
103 * specified key.</p>
104 *
105 * @param key Message key to evaluate
106 */
107 public boolean containsKey(Object key) {
108
109 if (key == null) {
110 return (false);
111 } else {
112 return (messages.isPresent(locale, key.toString()));
113 }
114
115 }
116
117
118 /**
119 * <p>The <code>containsValue()</code> method is not supported.</p>
120 *
121 * @param value Value to evaluate
122 */
123 public boolean containsValue(Object value) {
124
125 throw new UnsupportedOperationException();
126
127 }
128
129
130 /**
131 * <p>The <code>entrySet()</code> method is not supported.</p>
132 */
133 public Set entrySet() {
134
135 throw new UnsupportedOperationException();
136
137 }
138
139
140 /**
141 * <p>The <code>equals</code> method checks whether equal
142 * <code>MessageResources</code> and <code>Locale</code> are
143 * being wrapped.</p>
144 *
145 * @param o The object to be compared
146 */
147 public boolean equals(Object o) {
148
149 if (!(o instanceof MessagesMap)) {
150 return (false);
151 }
152 MessagesMap other = (MessagesMap) o;
153 if (!messages.equals(other.getMessages())) {
154 return (false);
155 }
156 if (locale == null) {
157 return (other.getLocale() == null);
158 } else {
159 return (locale.equals(other.getLocale()));
160 }
161
162 }
163
164
165 /**
166 * <p>Return the message string for the specified key.</p>
167 *
168 * @param key Key for message to return
169 */
170 public Object get(Object key) {
171
172 if (key == null) {
173 return ("??????");
174 } else {
175 return (messages.getMessage(locale, key.toString()));
176 }
177
178 }
179
180
181 /**
182 * <p>The <code>hashCode()</code> method returns values that will
183 * be identical if the <code>equals</code> method returns <code>true</code>.
184 * </p>
185 */
186 public int hashCode() {
187
188 int value = messages.hashCode();
189 if (locale != null) {
190 value = value ^ locale.hashCode();
191 }
192 return (value);
193
194 }
195
196
197 /**
198 * <p>The <code>isEmpty()</code> method returns <code>false</code>, on the
199 * assumption that there is always at least one message available.</p>
200 */
201 public boolean isEmpty() {
202
203 return (false);
204
205 }
206
207
208 /**
209 * <p>The <code>keySet()</code> method is not supported.</p>
210 */
211 public Set keySet() {
212
213 throw new UnsupportedOperationException();
214
215 }
216
217
218 /**
219 * <p>The <code>put()</code> method is not supported.</p>
220 *
221 * @param key Key to store
222 * @param value Value to store
223 */
224 public Object put(Object key, Object value) {
225
226 throw new UnsupportedOperationException();
227
228 }
229
230
231 /**
232 * <p>The <code>putAll()</code> method is not supported.</p>
233 *
234 * @param map Keys and values to store
235 */
236 public void putAll(Map map) {
237
238 throw new UnsupportedOperationException();
239
240 }
241
242
243 /**
244 * <p>The <code>remove()</code> method is not supported.</p>
245 *
246 * @param key Key to remove
247 */
248 public Object remove(Object key) {
249
250 throw new UnsupportedOperationException();
251
252 }
253
254
255 /**
256 * <p>The <code>size()</code> method is not supported.</p>
257 */
258 public int size() {
259
260 throw new UnsupportedOperationException();
261
262 }
263
264
265 /**
266 * <p>The <code>values()</code> method is not supported.</p>
267 */
268 public Collection values() {
269
270 throw new UnsupportedOperationException();
271
272 }
273
274
275 // --------------------------------------------------------- Package Methods
276
277
278 /**
279 * <p>Return the <code>Locale</code> we object we are wrapping.</p>
280 */
281 Locale getLocale() {
282
283 return (this.locale);
284
285 }
286
287
288 /**
289 * <p>Return the <code>MessageResources</code> object we are wrapping.</p>
290 */
291 MessageResources getMessages() {
292
293 return (this.messages);
294
295 }
296
297
298
299 }