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.2 $
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 (this == null && that == null)
109 return true;
110 else if (this != null && that == null)
111 return false;
112 else if (this == null && that != null)
113 return false;
114
115 if (size() == that.size()) {
116 SpreadMap other = (SpreadMap) that;
117 Iterator iter = mapData.keySet().iterator();
118 for (; iter.hasNext(); ) {
119 Object key = iter.next();
120 if (! InvokerHelper.compareEqual(get(key), other.get(key)) ) {
121 return false;
122 }
123 }
124 return true;
125 }
126 return false;
127 }
128
129
130 public int hashCode() {
131 if (hashCode == 0) {
132 Iterator iter = mapData.keySet().iterator();
133 for (; iter.hasNext(); ) {
134 Object key = iter.next();
135 int hash = (key != null) ? key.hashCode() : 0xbabe;
136 hashCode ^= hash;
137 }
138 }
139 return hashCode;
140 }
141
142 /***
143 * Returns the string expression of <code>this</code>.
144 *
145 * @return the string expression of <code>this</code>
146 */
147 public String toString() {
148 if (mapData.isEmpty()) {
149 return "*:[:]";
150 }
151 StringBuffer buff = new StringBuffer("*:[");
152 Iterator iter = mapData.keySet().iterator();
153 for (; iter.hasNext(); ) {
154 Object key = iter.next();
155 buff.append(key + ":" + mapData.get(key));
156 if (iter.hasNext())
157 buff.append(", ");
158 }
159 buff.append("]");
160 return buff.toString();
161 }
162 }