1 16 package org.springframework.binding.collection; 17 18 import java.util.Collection ; 19 import java.util.Map ; 20 21 import org.springframework.util.Assert; 22 23 29 public class MapAccessor implements MapAdaptable { 30 31 34 private Map map; 35 36 40 public MapAccessor(Map map) { 41 Assert.notNull(map, "The map to decorate is required"); 42 this.map = map; 43 } 44 45 47 public Map asMap() { 48 return map; 49 } 50 51 58 public Object get(Object key, Object defaultValue) { 59 if (!map.containsKey(key)) { 60 return defaultValue; 61 } 62 return map.get(key); 63 } 64 65 74 public Object get(Object key, Class requiredType) throws IllegalArgumentException { 75 return get(key, requiredType, null); 76 } 77 78 88 public Object get(Object key, Class requiredType, Object defaultValue) { 89 if (!map.containsKey(key)) { 90 return defaultValue; 91 } 92 return assertKeyValueOfType(key, requiredType); 93 } 94 95 101 public Object getRequired(Object key) throws IllegalArgumentException { 102 assertContainsKey(key); 103 return map.get(key); 104 } 105 106 113 public Object getRequired(Object key, Class requiredType) throws IllegalArgumentException { 114 assertContainsKey(key); 115 return assertKeyValueOfType(key, requiredType); 116 } 117 118 126 public String getString(Object key) throws IllegalArgumentException { 127 return getString(key, null); 128 } 129 130 139 public String getString(Object key, String defaultValue) throws IllegalArgumentException { 140 if (!map.containsKey(key)) { 141 return defaultValue; 142 } 143 return (String )assertKeyValueOfType(key, String .class); 144 } 145 146 154 public String getRequiredString(Object key) throws IllegalArgumentException { 155 assertContainsKey(key); 156 return (String )assertKeyValueOfType(key, String .class); 157 } 158 159 167 public Collection getCollection(Object key) throws IllegalArgumentException { 168 if (!map.containsKey(key)) { 169 return null; 170 } 171 return (Collection )assertKeyValueOfType(key, Collection .class); 172 } 173 174 182 public Collection getCollection(Object key, Class requiredType) throws IllegalArgumentException { 183 if (!map.containsKey(key)) { 184 return null; 185 } 186 assertAssignableTo(Collection .class, requiredType); 187 return (Collection )assertKeyValueOfType(key, requiredType); 188 } 189 190 198 public Collection getRequiredCollection(Object key) throws IllegalArgumentException { 199 assertContainsKey(key); 200 return (Collection )assertKeyValueOfType(key, Collection .class); 201 } 202 203 211 public Collection getRequiredCollection(Object key, Class requiredType) throws IllegalArgumentException { 212 assertContainsKey(key); 213 assertAssignableTo(Collection .class, requiredType); 214 return (Collection )assertKeyValueOfType(key, requiredType); 215 } 216 217 225 public Object [] getArray(Object key, Class requiredType) throws IllegalArgumentException { 226 assertAssignableTo(Object [].class, requiredType); 227 if (!map.containsKey(key)) { 228 return null; 229 } 230 return (Object [])assertKeyValueOfType(key, requiredType); 231 } 232 233 241 public Object [] getRequiredArray(Object key, Class requiredType) throws IllegalArgumentException { 242 assertContainsKey(key); 243 assertAssignableTo(Object [].class, requiredType); 244 return (Object [])assertKeyValueOfType(key, requiredType); 245 } 246 247 256 public Number getNumber(Object key, Class requiredType) throws IllegalArgumentException { 257 return getNumber(key, requiredType, null); 258 } 259 260 269 public Number getNumber(Object key, Class requiredType, Number defaultValue) throws IllegalArgumentException { 270 if (!map.containsKey(key)) { 271 return defaultValue; 272 } 273 assertAssignableTo(Number .class, requiredType); 274 return (Number )assertKeyValueOfType(key, requiredType); 275 } 276 277 285 public Number getRequiredNumber(Object key, Class requiredType) throws IllegalArgumentException { 286 assertContainsKey(key); 287 return (Number )assertKeyValueOfType(key, requiredType); 288 } 289 290 298 public Integer getInteger(Object key) throws IllegalArgumentException { 299 return getInteger(key, null); 300 } 301 302 311 public Integer getInteger(Object key, Integer defaultValue) throws IllegalArgumentException { 312 return (Integer )getNumber(key, Integer .class, defaultValue); 313 } 314 315 323 public Integer getRequiredInteger(Object key) throws IllegalArgumentException { 324 return (Integer )getRequiredNumber(key, Integer .class); 325 } 326 327 334 public Long getLong(Object key) throws IllegalArgumentException { 335 return getLong(key, null); 336 } 337 338 347 public Long getLong(Object key, Long defaultValue) throws IllegalArgumentException { 348 return (Long )getNumber(key, Long .class, defaultValue); 349 } 350 351 359 public Long getRequiredLong(Object key) throws IllegalArgumentException { 360 return (Long )getRequiredNumber(key, Long .class); 361 } 362 363 371 public Boolean getBoolean(Object key) throws IllegalArgumentException { 372 return getBoolean(key, null); 373 } 374 375 384 public Boolean getBoolean(Object key, Boolean defaultValue) throws IllegalArgumentException { 385 if (!map.containsKey(key)) { 386 return defaultValue; 387 } 388 return (Boolean )assertKeyValueOfType(key, Boolean .class); 389 } 390 391 399 public Boolean getRequiredBoolean(Object key) throws IllegalArgumentException { 400 assertContainsKey(key); 401 return (Boolean )assertKeyValueOfType(key, Boolean .class); 402 } 403 404 409 public void assertContainsKey(Object key) throws IllegalArgumentException { 410 if (!map.containsKey(key)) { 411 throw new IllegalArgumentException ("Required attribute '" + key 412 + "' is not present in map; attributes present are [" + asMap() + "]"); 413 } 414 } 415 416 422 public boolean containsKey(Object key, Class requiredType) throws IllegalArgumentException { 423 if (map.containsKey(key)) { 424 assertKeyValueOfType(key, requiredType); 425 return true; 426 } 427 else { 428 return false; 429 } 430 } 431 432 438 public Object assertKeyValueOfType(Object key, Class requiredType) { 439 return assertKeyValueInstanceOf(key, map.get(key), requiredType); 440 } 441 442 449 public Object assertKeyValueInstanceOf(Object key, Object value, Class requiredType) { 450 Assert.notNull(requiredType, "The required type to assert is required"); 451 if (!requiredType.isInstance(value)) { 452 throw new IllegalArgumentException ("Map key '" + key + "' has value [" + value 453 + "] that is not of expected type [" + requiredType + "], instead it is of type [" 454 + (value != null ? value.getClass().getName() : "null") + "]"); 455 } 456 return value; 457 } 458 459 private void assertAssignableTo(Class clazz, Class requiredType) { 460 Assert.isTrue(clazz.isAssignableFrom(requiredType), "The provided required type must be assignable to [" 461 + clazz + "]"); 462 } 463 } | Popular Tags |