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.1 $
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
70 mapData.put(values[i++], values[i++]);
71 }
72
73 }
74
75 public SpreadMap(Map map) {
76 this.mapData = map;
77 }
78
79 public Object get(Object obj) {
80 return mapData.get(obj);
81 }
82
83 public Object put(Object key, Object value) {
84 throw new RuntimeException("SpreadMap: " + this + " is an immutable map, and so ("
85 + key + ": " + value + ") cannot be added.");
86 }
87
88 public Object remove(Object key) {
89 throw new RuntimeException("SpreadMap: " + this + " is an immutable map, and so the key ("
90 + key + ") cannot be deleteded.");
91 }
92
93 public void putAll(Map t) {
94 throw new RuntimeException("SpreadMap: " + this + " is an immutable map, and so the map ("
95 + t + ") cannot be put in this spreadMap.");
96 }
97
98 public int size() {
99 return mapData.keySet().size();
100 }
101
102 public boolean equals(Object that) {
103 if (that instanceof SpreadMap) {
104 return equals((SpreadMap) that);
105 }
106 return false;
107 }
108
109 public boolean equals(SpreadMap that) {
110 if (this == null && that == null)
111 return true;
112 else if (this != null && that == null)
113 return false;
114 else if (this == null && that != null)
115 return false;
116
117 if (size() == that.size()) {
118 SpreadMap other = (SpreadMap) that;
119 Iterator iter = mapData.keySet().iterator();
120 for (; iter.hasNext(); ) {
121 Object key = iter.next();
122 if (! InvokerHelper.compareEqual(get(key), other.get(key)) ) {
123 return false;
124 }
125 }
126 return true;
127 }
128 return false;
129 }
130
131
132 public int hashCode() {
133 if (hashCode == 0) {
134 Iterator iter = mapData.keySet().iterator();
135 for (; iter.hasNext(); ) {
136 Object key = iter.next();
137 int hash = (key != null) ? key.hashCode() : 0xbabe;
138 hashCode ^= hash;
139 }
140 }
141 return hashCode;
142 }
143 }