01: /*
02: * Copyright (c) 2002-2006 by OpenSymphony
03: * All rights reserved.
04: */
05: package com.opensymphony.xwork.util;
06:
07: import com.opensymphony.xwork.ActionContext;
08: import com.opensymphony.xwork.ObjectFactory;
09: import com.opensymphony.xwork.XworkException;
10:
11: import java.util.HashMap;
12: import java.util.Iterator;
13: import java.util.Map;
14:
15: /**
16: * A simple map that guarantees that retrieving objects will never return null and insertions will
17: * perform type conversion if necessary. Empty beans will be created for any key that would
18: * normally returned null using ObjectFactory's
19: * {@link ObjectFactory#buildBean(Class,java.util.Map) buildBean} method.
20: *
21: * @author Patrick Lightbody
22: * @author Mark Woon
23: * @deprecated Native support for expanding lists and maps is provided in XWork 1.1, so this is no longer needed.
24: */
25: public class XWorkMap extends HashMap {
26: private Class clazz;
27:
28: public XWorkMap(Class clazz) {
29: this .clazz = clazz;
30: }
31:
32: /**
33: * Returns the value to which the specified key is mapped in this identity hash map. If there
34: * is no mapping for this key, create an appropriate object for this key, put it in the map, and
35: * return the new object. Use {@link #containsKey(Object)} to check if there really is a
36: * mapping for a key or not.
37: *
38: * @param key the key whose associated value is to be returned.
39: * @return the value to which this map maps the specified key
40: */
41: public Object get(Object key) {
42: Object o = super .get(key);
43:
44: if (o == null) {
45: try {
46: //todo - can this use the ThreadLocal?
47: o = ObjectFactory.getObjectFactory().buildBean(clazz,
48: null); // ActionContext.getContext().getContextMap());
49: this .put(key, o);
50: } catch (Exception e) {
51: throw new XworkException(e.getMessage());
52: }
53: }
54:
55: return o;
56: }
57:
58: /**
59: * Associates the specified value with the specified key in this map. If the map previously
60: * contained a mapping for this key, the old value is replaced.
61: *
62: * @param key key with which the specified value is to be associated.
63: * @param value value to be associated with the specified key.
64: * @return previous value associated with specified key, or <tt>null</tt> if there was no
65: * mapping for key. A <tt>null</tt> return can also indicate that the HashMap
66: * previously associated <tt>null</tt> with the specified key.
67: */
68: public Object put(Object key, Object value) {
69: if ((value != null)
70: && !clazz.isAssignableFrom(value.getClass())) {
71: // convert to correct type
72: Map context = ActionContext.getContext().getContextMap();
73: value = XWorkConverter.getInstance().convertValue(context,
74: null, null, null, value, clazz);
75: }
76:
77: return super .put(key, value);
78: }
79:
80: /**
81: * Copies all of the mappings from the specified map to this map These mappings will replace any
82: * mappings that this map had for any of the keys currently in the specified map.
83: *
84: * @param m mappings to be stored in this map.
85: * @throws NullPointerException if the specified map is null.
86: */
87: public void putAll(Map m) {
88: for (Iterator i = m.entrySet().iterator(); i.hasNext();) {
89: Map.Entry e = (Map.Entry) i.next();
90: put(e.getKey(), e.getValue());
91: }
92: }
93: }
|