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.HashSet;
23 import java.util.Iterator;
24 import java.util.Set;
25
26 import net.jcip.annotations.NotThreadSafe;
27
28
29
30
31
32
33 @NotThreadSafe
34 public class LazySet<ElementType> implements Set<ElementType>, Serializable {
35
36
37 private static final long serialVersionUID = -1596445680460115174L;
38
39
40 private Set<ElementType> delegate = Collections.emptySet();
41
42
43 public boolean add(ElementType element) {
44 if (delegate.isEmpty()) {
45 delegate = Collections.singleton(element);
46 return true;
47 } else {
48 delegate = createImplementation();
49 return delegate.add(element);
50 }
51 }
52
53
54 public boolean addAll(Collection<? extends ElementType> collection) {
55 delegate = createImplementation();
56 return delegate.addAll(collection);
57 }
58
59
60 public void clear() {
61 delegate = Collections.emptySet();
62 }
63
64
65 public boolean contains(Object element) {
66 return delegate.contains(element);
67 }
68
69
70 public boolean containsAll(Collection<?> collection) {
71 return delegate.containsAll(collection);
72 }
73
74
75 public boolean isEmpty() {
76 return delegate.isEmpty();
77 }
78
79
80 public Iterator<ElementType> iterator() {
81 delegate = createImplementation();
82 return delegate.iterator();
83 }
84
85
86 public boolean remove(Object element) {
87 delegate = createImplementation();
88 return delegate.remove(element);
89 }
90
91
92 public boolean removeAll(Collection<?> collection) {
93 delegate = createImplementation();
94 return delegate.removeAll(collection);
95 }
96
97
98 public boolean retainAll(Collection<?> collection) {
99 delegate = createImplementation();
100 return delegate.retainAll(collection);
101 }
102
103
104 public int size() {
105 return delegate.size();
106 }
107
108
109 public Object[] toArray() {
110 return delegate.toArray();
111 }
112
113
114 public <T> T[] toArray(T[] type) {
115 return delegate.toArray(type);
116 }
117
118
119
120
121
122
123 private Set<ElementType> createImplementation() {
124 if (delegate instanceof HashSet) {
125 return delegate;
126 }
127
128 return new HashSet<ElementType>(delegate);
129 }
130
131
132 public String toString() {
133 return delegate.toString();
134 }
135
136
137 public int hashCode() {
138 return delegate.hashCode();
139 }
140
141
142 public boolean equals(Object obj) {
143 if (this == obj) {
144 return true;
145 }
146
147 if (obj == null || this.getClass() != obj.getClass()) {
148 return false;
149 }
150
151 return delegate.equals(((LazySet<?>) obj).delegate);
152 }
153 }