1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.opensaml.xml.util;
18
19 import java.io.Serializable;
20 import java.util.Collection;
21 import java.util.Collections;
22 import java.util.HashMap;
23 import java.util.Map;
24 import java.util.Set;
25
26 import net.jcip.annotations.NotThreadSafe;
27
28
29
30
31
32
33
34 @NotThreadSafe
35 public class LazyMap<KeyType, ValueType> implements Map<KeyType, ValueType>, Serializable {
36
37
38 private static final long serialVersionUID = 121425595164176639L;
39
40
41 private Map<KeyType, ValueType> delegate = Collections.emptyMap();
42
43
44 public void clear() {
45 delegate = Collections.emptyMap();
46 }
47
48
49 public boolean containsKey(Object key) {
50 return delegate.containsKey(key);
51 }
52
53
54 public boolean containsValue(Object value) {
55 return delegate.containsValue(value);
56 }
57
58
59 public Set<Entry<KeyType, ValueType>> entrySet() {
60 delegate = buildMap();
61 return delegate.entrySet();
62 }
63
64
65 public ValueType get(Object key) {
66 return delegate.get(key);
67 }
68
69
70 public boolean isEmpty() {
71 return delegate.isEmpty();
72 }
73
74
75 public Set<KeyType> keySet() {
76 delegate = buildMap();
77 return delegate.keySet();
78 }
79
80
81 public ValueType put(KeyType key, ValueType value) {
82 if (delegate.isEmpty()) {
83 delegate = Collections.singletonMap(key, value);
84 return null;
85 } else {
86 delegate = buildMap();
87 return delegate.put(key, value);
88 }
89 }
90
91
92 public void putAll(Map<? extends KeyType, ? extends ValueType> t) {
93 delegate = buildMap();
94 delegate.putAll(t);
95 }
96
97
98 public ValueType remove(Object key) {
99 delegate = buildMap();
100 return delegate.remove(key);
101 }
102
103
104 public int size() {
105 return delegate.size();
106 }
107
108
109 public Collection<ValueType> values() {
110 delegate = buildMap();
111 return delegate.values();
112 }
113
114
115
116
117
118
119 protected Map<KeyType, ValueType> buildMap() {
120 if (delegate instanceof HashMap) {
121 return delegate;
122 }
123
124 return new HashMap<KeyType, ValueType>(delegate);
125 }
126
127
128 public String toString() {
129 return delegate.toString();
130 }
131
132
133 public int hashCode() {
134 return delegate.hashCode();
135 }
136
137
138 public boolean equals(Object obj) {
139 if (this == obj) {
140 return true;
141 }
142
143 if (obj == null || this.getClass() != obj.getClass()) {
144 return false;
145 }
146
147 return delegate.equals(((LazyMap<?, ?>) obj).delegate);
148 }
149 }