KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > springframework > webflow > core > collection > LocalParameterMap


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

16 package org.springframework.webflow.core.collection;
17
18 import java.io.IOException JavaDoc;
19 import java.io.ObjectInputStream JavaDoc;
20 import java.io.ObjectOutputStream JavaDoc;
21 import java.io.Serializable JavaDoc;
22 import java.lang.reflect.Array JavaDoc;
23 import java.util.ArrayList JavaDoc;
24 import java.util.Collections JavaDoc;
25 import java.util.List JavaDoc;
26 import java.util.Map JavaDoc;
27
28 import org.springframework.binding.collection.MapAccessor;
29 import org.springframework.binding.convert.ConversionException;
30 import org.springframework.binding.convert.ConversionExecutor;
31 import org.springframework.binding.convert.ConversionService;
32 import org.springframework.binding.convert.support.DefaultConversionService;
33 import org.springframework.core.style.StylerUtils;
34 import org.springframework.util.Assert;
35 import org.springframework.web.multipart.MultipartFile;
36
37 /**
38  * An immutable parameter map storing String-keyed, String-valued parameters
39  * in a backing {@link Map} implementation. This base provides convenient
40  * operations for accessing parameters in a typed-manner.
41  *
42  * @author Keith Donald
43  */

44 public class LocalParameterMap implements ParameterMap, Serializable JavaDoc {
45
46     /**
47      * The backing map storing the parameters.
48      */

49     private Map JavaDoc parameters;
50
51     /**
52      * A helper for accessing parameters. Marked transient and restored on
53      * deserialization.
54      */

55     private transient MapAccessor parameterAccessor;
56
57     /**
58      * A helper for converting string parameter values. Marked transient and
59      * restored on deserialization.
60      */

61     private transient ConversionService conversionService;
62
63     /**
64      * Creates a new parameter map from the provided map.
65      * <p>
66      * It is expected that the contents of the backing map adhere to the
67      * parameter map contract; that is, map entries have string keys, string
68      * values, and remain unmodifiable.
69      * @param parameters the contents of this parameter map
70      */

71     public LocalParameterMap(Map JavaDoc parameters) {
72         this(parameters, new DefaultConversionService());
73     }
74
75     /**
76      * Creates a new parameter map from the provided map.
77      * <p>
78      * It is expected that the contents of the backing map adhere to the
79      * parameter map contract; that is, map entries have string keys, string
80      * values, and remain unmodifiable.
81      * @param parameters the contents of this parameter map
82      * @param conversionService a helper for performing type conversion of map
83      * entry values
84      */

85     public LocalParameterMap(Map JavaDoc parameters, ConversionService conversionService) {
86         initParameters(parameters);
87         this.conversionService = conversionService;
88     }
89
90     public boolean equals(Object JavaDoc o) {
91         if (!(o instanceof LocalParameterMap)) {
92             return false;
93         }
94         LocalParameterMap other = (LocalParameterMap)o;
95         return parameters.equals(other.parameters);
96     }
97
98     public int hashCode() {
99         return parameters.hashCode();
100     }
101
102     public Map JavaDoc asMap() {
103         return Collections.unmodifiableMap(parameterAccessor.asMap());
104     }
105
106     public boolean isEmpty() {
107         return parameters.isEmpty();
108     }
109
110     public int size() {
111         return parameters.size();
112     }
113
114     public boolean contains(String JavaDoc parameterName) {
115         return parameters.containsKey(parameterName);
116     }
117
118     public String JavaDoc get(String JavaDoc parameterName) {
119         return get(parameterName, (String JavaDoc)null);
120     }
121
122     public String JavaDoc get(String JavaDoc parameterName, String JavaDoc defaultValue) {
123         if (!parameters.containsKey(parameterName)) {
124             return defaultValue;
125         }
126         Object JavaDoc value = parameters.get(parameterName);
127         if (value.getClass().isArray()) {
128             parameterAccessor.assertKeyValueInstanceOf(parameterName, value, String JavaDoc[].class);
129             String JavaDoc[] array = (String JavaDoc[])value;
130             if (array.length == 0) {
131                 return null;
132             }
133             else {
134                 Object JavaDoc first = ((String JavaDoc[])value)[0];
135                 parameterAccessor.assertKeyValueInstanceOf(parameterName, first, String JavaDoc.class);
136                 return (String JavaDoc)first;
137             }
138
139         }
140         else {
141             parameterAccessor.assertKeyValueInstanceOf(parameterName, value, String JavaDoc.class);
142             return (String JavaDoc)value;
143         }
144     }
145
146     public String JavaDoc[] getArray(String JavaDoc parameterName) {
147         if (!parameters.containsKey(parameterName)) {
148             return null;
149         }
150         Object JavaDoc value = parameters.get(parameterName);
151         if (value.getClass().isArray()) {
152             parameterAccessor.assertKeyValueInstanceOf(parameterName, value, String JavaDoc[].class);
153             return (String JavaDoc[])value;
154         }
155         else {
156             parameterAccessor.assertKeyValueInstanceOf(parameterName, value, String JavaDoc.class);
157             return new String JavaDoc[] { (String JavaDoc)value };
158         }
159     }
160
161     public Object JavaDoc[] getArray(String JavaDoc parameterName, Class JavaDoc targetElementType) throws ConversionException {
162         String JavaDoc[] parameters = getArray(parameterName);
163         return parameters != null ? convert(parameters, targetElementType) : null;
164     }
165
166     public Object JavaDoc get(String JavaDoc parameterName, Class JavaDoc targetType) throws ConversionException {
167         return get(parameterName, targetType, null);
168     }
169
170     public Object JavaDoc get(String JavaDoc parameterName, Class JavaDoc targetType, Object JavaDoc defaultValue) throws ConversionException {
171         if (defaultValue != null) {
172             assertAssignableTo(targetType, defaultValue.getClass());
173         }
174         String JavaDoc parameter = get(parameterName);
175         return parameter != null ? convert(parameter, targetType) : defaultValue;
176     }
177
178     public String JavaDoc getRequired(String JavaDoc parameterName) throws IllegalArgumentException JavaDoc {
179         parameterAccessor.assertContainsKey(parameterName);
180         return get(parameterName);
181     }
182
183     public String JavaDoc[] getRequiredArray(String JavaDoc parameterName) throws IllegalArgumentException JavaDoc {
184         parameterAccessor.assertContainsKey(parameterName);
185         return getArray(parameterName);
186     }
187
188     public Object JavaDoc[] getRequiredArray(String JavaDoc parameterName, Class JavaDoc targetElementType) throws IllegalArgumentException JavaDoc,
189             ConversionException {
190         String JavaDoc[] parameters = getRequiredArray(parameterName);
191         return convert(parameters, targetElementType);
192     }
193
194     public Object JavaDoc getRequired(String JavaDoc parameterName, Class JavaDoc targetType) throws IllegalArgumentException JavaDoc,
195             ConversionException {
196         return convert(getRequired(parameterName), targetType);
197     }
198
199     public Number JavaDoc getNumber(String JavaDoc parameterName, Class JavaDoc targetType) throws ConversionException {
200         assertAssignableTo(Number JavaDoc.class, targetType);
201         return (Number JavaDoc)get(parameterName, targetType);
202     }
203
204     public Number JavaDoc getNumber(String JavaDoc parameterName, Class JavaDoc targetType, Number JavaDoc defaultValue) throws ConversionException {
205         assertAssignableTo(Number JavaDoc.class, targetType);
206         return (Number JavaDoc)get(parameterName, targetType, defaultValue);
207     }
208
209     public Number JavaDoc getRequiredNumber(String JavaDoc parameterName, Class JavaDoc targetType) throws IllegalArgumentException JavaDoc,
210             ConversionException {
211         assertAssignableTo(Number JavaDoc.class, targetType);
212         return (Number JavaDoc)getRequired(parameterName, targetType);
213     }
214
215     public Integer JavaDoc getInteger(String JavaDoc parameterName) throws ConversionException {
216         return (Integer JavaDoc)get(parameterName, Integer JavaDoc.class);
217     }
218
219     public Integer JavaDoc getInteger(String JavaDoc parameterName, Integer JavaDoc defaultValue) throws ConversionException {
220         return (Integer JavaDoc)get(parameterName, Integer JavaDoc.class, defaultValue);
221     }
222
223     public Integer JavaDoc getRequiredInteger(String JavaDoc parameterName) throws IllegalArgumentException JavaDoc, ConversionException {
224         return (Integer JavaDoc)getRequired(parameterName, Integer JavaDoc.class);
225     }
226
227     public Long JavaDoc getLong(String JavaDoc parameterName) throws ConversionException {
228         return (Long JavaDoc)get(parameterName, Long JavaDoc.class);
229     }
230
231     public Long JavaDoc getLong(String JavaDoc parameterName, Long JavaDoc defaultValue) throws ConversionException {
232         return (Long JavaDoc)get(parameterName, Long JavaDoc.class, defaultValue);
233     }
234
235     public Long JavaDoc getRequiredLong(String JavaDoc parameterName) throws IllegalArgumentException JavaDoc, ConversionException {
236         return (Long JavaDoc)getRequired(parameterName, Long JavaDoc.class);
237     }
238
239     public Boolean JavaDoc getBoolean(String JavaDoc parameterName) throws ConversionException {
240         return (Boolean JavaDoc)get(parameterName, Boolean JavaDoc.class);
241     }
242
243     public Boolean JavaDoc getBoolean(String JavaDoc parameterName, Boolean JavaDoc defaultValue) throws ConversionException {
244         return (Boolean JavaDoc)get(parameterName, Boolean JavaDoc.class, defaultValue);
245     }
246
247     public Boolean JavaDoc getRequiredBoolean(String JavaDoc parameterName) throws IllegalArgumentException JavaDoc, ConversionException {
248         return (Boolean JavaDoc)getRequired(parameterName, Boolean JavaDoc.class);
249     }
250
251     public MultipartFile getMultipartFile(String JavaDoc parameterName) {
252         return (MultipartFile)parameterAccessor.get(parameterName, MultipartFile.class);
253     }
254
255     public MultipartFile getRequiredMultipartFile(String JavaDoc parameterName) throws IllegalArgumentException JavaDoc {
256         return (MultipartFile)parameterAccessor.getRequired(parameterName, MultipartFile.class);
257     }
258
259     public AttributeMap asAttributeMap() {
260         return new LocalAttributeMap(getMapInternal());
261     }
262
263     /**
264      * Initializes this parameter map.
265      * @param parameters the parameters
266      */

267     protected void initParameters(Map JavaDoc parameters) {
268         this.parameters = parameters;
269         parameterAccessor = new MapAccessor(this.parameters);
270     }
271
272     /**
273      * Returns the wrapped, modifiable map implementation.
274      */

275     protected Map JavaDoc getMapInternal() {
276         return parameters;
277     }
278
279     // internal helpers
280

281     /**
282      * Convert given String parameter to specified target type.
283      */

284     private Object JavaDoc convert(String JavaDoc parameter, Class JavaDoc targetType) throws ConversionException {
285         return conversionService.getConversionExecutor(String JavaDoc.class, targetType).execute(parameter);
286     }
287
288     /**
289      * Convert given array of String parameters to specified target type and
290      * return the resulting array.
291      */

292     private Object JavaDoc[] convert(String JavaDoc[] parameters, Class JavaDoc targetElementType) throws ConversionException {
293         List JavaDoc list = new ArrayList JavaDoc(parameters.length);
294         ConversionExecutor converter = conversionService.getConversionExecutor(String JavaDoc.class, targetElementType);
295         for (int i = 0; i < parameters.length; i++) {
296             list.add(converter.execute(parameters[i]));
297         }
298         return list.toArray((Object JavaDoc[])Array.newInstance(targetElementType, parameters.length));
299     }
300
301     /**
302      * Make sure clazz is assignable from requiredType.
303      */

304     private void assertAssignableTo(Class JavaDoc clazz, Class JavaDoc requiredType) {
305         Assert.isTrue(clazz.isAssignableFrom(requiredType), "The provided required type must be assignable to ["
306                 + clazz + "]");
307     }
308
309     // custom serialization
310

311     private void writeObject(ObjectOutputStream JavaDoc out) throws IOException JavaDoc {
312         out.defaultWriteObject();
313     }
314
315     private void readObject(ObjectInputStream JavaDoc in) throws IOException JavaDoc, ClassNotFoundException JavaDoc {
316         in.defaultReadObject();
317         parameterAccessor = new MapAccessor(parameters);
318         conversionService = new DefaultConversionService();
319     }
320
321     public String JavaDoc toString() {
322         return StylerUtils.style(parameters);
323     }
324 }
Popular Tags