1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46 package groovy.lang;
47
48 import java.util.HashMap;
49 import java.util.Map;
50 import java.util.Iterator;
51
52 import org.codehaus.groovy.runtime.InvokerHelper;
53
54 /***
55 * Represents a spreadable map which extends java.util.HashMap.
56 *
57 * @author Pilho Kim
58 * @version $Revision: 1.3 $
59 */
60 public class SpreadMap extends HashMap {
61
62 private Map mapData;
63 private int hashCode;
64
65 public SpreadMap(Object[] values) {
66 mapData = new HashMap(values.length / 2);
67 int i = 0;
68 while (i < values.length) {
69 mapData.put(values[i++], values[i++]);
70 }
71 }
72
73 public SpreadMap(Map map) {
74 this.mapData = map;
75 }
76
77 public Object get(Object obj) {
78 return mapData.get(obj);
79 }
80
81 public Object put(Object key, Object value) {
82 throw new RuntimeException("SpreadMap: " + this + " is an immutable map, and so ("
83 + key + ": " + value + ") cannot be added.");
84 }
85
86 public Object remove(Object key) {
87 throw new RuntimeException("SpreadMap: " + this + " is an immutable map, and so the key ("
88 + key + ") cannot be deleteded.");
89 }
90
91 public void putAll(Map t) {
92 throw new RuntimeException("SpreadMap: " + this + " is an immutable map, and so the map ("
93 + t + ") cannot be put in this spreadMap.");
94 }
95
96 public int size() {
97 return mapData.keySet().size();
98 }
99
100 public boolean equals(Object that) {
101 if (that instanceof SpreadMap) {
102 return equals((SpreadMap) that);
103 }
104 return false;
105 }
106
107 public boolean equals(SpreadMap that) {
108 if (that == null) return false;
109
110 if (size() == that.size()) {
111 SpreadMap other = (SpreadMap) that;
112 Iterator iter = mapData.keySet().iterator();
113 for (; iter.hasNext(); ) {
114 Object key = iter.next();
115 if (! InvokerHelper.compareEqual(get(key), other.get(key)) ) {
116 return false;
117 }
118 }
119 return true;
120 }
121 return false;
122 }
123
124
125 public int hashCode() {
126 if (hashCode == 0) {
127 Iterator iter = mapData.keySet().iterator();
128 for (; iter.hasNext(); ) {
129 Object key = iter.next();
130 int hash = (key != null) ? key.hashCode() : 0xbabe;
131 hashCode ^= hash;
132 }
133 }
134 return hashCode;
135 }
136
137 /***
138 * Returns the string expression of <code>this</code>.
139 *
140 * @return the string expression of <code>this</code>
141 */
142 public String toString() {
143 if (mapData.isEmpty()) {
144 return "*:[:]";
145 }
146 StringBuffer buff = new StringBuffer("*:[");
147 Iterator iter = mapData.keySet().iterator();
148 for (; iter.hasNext(); ) {
149 Object key = iter.next();
150 buff.append(key + ":" + mapData.get(key));
151 if (iter.hasNext())
152 buff.append(", ");
153 }
154 buff.append("]");
155 return buff.toString();
156 }
157 }