Skip to content

Commit ec5064a

Browse files
Proof-of-concept of write-reporting collection wrappers
1 parent e706193 commit ec5064a

File tree

8 files changed

+2469
-0
lines changed

8 files changed

+2469
-0
lines changed
Lines changed: 330 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,330 @@
1+
/*
2+
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
3+
* or more contributor license agreements. Licensed under the "Elastic License
4+
* 2.0", the "GNU Affero General Public License v3.0 only", and the "Server Side
5+
* Public License v 1"; you may not use this file except in compliance with, at
6+
* your election, the "Elastic License 2.0", the "GNU Affero General Public
7+
* License v3.0 only", or the "Server Side Public License, v 1".
8+
*/
9+
10+
package org.elasticsearch.ingest;
11+
12+
import java.util.Collection;
13+
import java.util.Comparator;
14+
import java.util.Iterator;
15+
import java.util.List;
16+
import java.util.ListIterator;
17+
import java.util.Spliterator;
18+
import java.util.function.Consumer;
19+
import java.util.function.IntFunction;
20+
import java.util.function.Predicate;
21+
import java.util.function.UnaryOperator;
22+
import java.util.stream.Stream;
23+
24+
import static java.util.Objects.requireNonNull;
25+
26+
// Needs javadoc. Note the assumption that contents are either immutable or write-reporting collections.
27+
public class WriteReportingList<E> implements List<E> {
28+
29+
private final List<E> delegate;
30+
private final Consumer<String> reporter;
31+
private final String label;
32+
33+
public WriteReportingList(List<E> delegate, Consumer<String> reporter, String label) {
34+
this.delegate = requireNonNull(delegate);
35+
this.reporter = requireNonNull(reporter);
36+
this.label = label;
37+
}
38+
39+
@Override
40+
public int size() {
41+
return delegate.size();
42+
}
43+
44+
@Override
45+
public boolean isEmpty() {
46+
return delegate.isEmpty();
47+
}
48+
49+
@Override
50+
public boolean contains(Object o) {
51+
return delegate.contains(o);
52+
}
53+
54+
@Override
55+
public Iterator<E> iterator() {
56+
return new WriteReportingIterator(delegate.iterator());
57+
}
58+
59+
@Override
60+
public void forEach(Consumer<? super E> action) {
61+
delegate.forEach(action);
62+
}
63+
64+
@Override
65+
public Object[] toArray() {
66+
return delegate.toArray();
67+
}
68+
69+
@Override
70+
public <E1> E1[] toArray(E1[] a) {
71+
return delegate.toArray(a);
72+
}
73+
74+
@Override
75+
public <E1> E1[] toArray(IntFunction<E1[]> generator) {
76+
return delegate.toArray(generator);
77+
}
78+
79+
@Override
80+
public boolean add(E t) {
81+
reporter.accept(label + ".add(E)");
82+
return delegate.add(t);
83+
}
84+
85+
@Override
86+
public boolean remove(Object o) {
87+
reporter.accept(label + ".remove(Object)");
88+
return delegate.remove(o);
89+
}
90+
91+
@Override
92+
public boolean containsAll(Collection<?> c) {
93+
return delegate.containsAll(c);
94+
}
95+
96+
@Override
97+
public boolean addAll(Collection<? extends E> c) {
98+
reporter.accept(label + ".addAll(Collection<? extends E>)");
99+
return delegate.addAll(c);
100+
}
101+
102+
@Override
103+
public boolean addAll(int index, Collection<? extends E> c) {
104+
reporter.accept(label + ".addAll(int, Collection<? extends E>)");
105+
return delegate.addAll(index, c);
106+
}
107+
108+
@Override
109+
public boolean removeAll(Collection<?> c) {
110+
reporter.accept(label + ".removeAll(Collection<?>)");
111+
return delegate.removeAll(c);
112+
}
113+
114+
@Override
115+
public boolean removeIf(Predicate<? super E> filter) {
116+
reporter.accept(label + ".removeIf(Predicate<? super E>)");
117+
return delegate.removeIf(filter);
118+
}
119+
120+
@Override
121+
public boolean retainAll(Collection<?> c) {
122+
reporter.accept(label + ".retainAll(Collection<?>)");
123+
return delegate.retainAll(c);
124+
}
125+
126+
@Override
127+
public void replaceAll(UnaryOperator<E> operator) {
128+
reporter.accept(label + ".replaceAll(UnaryOperator<E>)");
129+
delegate.replaceAll(operator);
130+
}
131+
132+
@Override
133+
public void sort(Comparator<? super E> c) {
134+
reporter.accept(label + ".sort(Comparator<? super E>)");
135+
delegate.sort(c);
136+
}
137+
138+
@Override
139+
public void clear() {
140+
reporter.accept(label + ".clear()");
141+
delegate.clear();
142+
}
143+
144+
@Override
145+
public E get(int index) {
146+
return delegate.get(index);
147+
}
148+
149+
@Override
150+
public E set(int index, E element) {
151+
reporter.accept(label + ".set(int, E)");
152+
return delegate.set(index, element);
153+
}
154+
155+
@Override
156+
public void add(int index, E element) {
157+
reporter.accept(label + ".add(int, E)");
158+
delegate.add(index, element);
159+
}
160+
161+
@Override
162+
public E remove(int index) {
163+
reporter.accept(label + ".remove(index)");
164+
return delegate.remove(index);
165+
}
166+
167+
@Override
168+
public int indexOf(Object o) {
169+
return delegate.indexOf(o);
170+
}
171+
172+
@Override
173+
public int lastIndexOf(Object o) {
174+
return delegate.lastIndexOf(o);
175+
}
176+
177+
@Override
178+
public ListIterator<E> listIterator() {
179+
return new WriteReportingListIterator(delegate.listIterator());
180+
}
181+
182+
@Override
183+
public ListIterator<E> listIterator(int index) {
184+
return new WriteReportingListIterator(delegate.listIterator(index));
185+
}
186+
187+
@Override
188+
public List<E> subList(int fromIndex, int toIndex) {
189+
return new WriteReportingList<>(delegate.subList(fromIndex, toIndex), reporter, label + ".subList(int, int)");
190+
}
191+
192+
@Override
193+
public Spliterator<E> spliterator() {
194+
return delegate.spliterator();
195+
}
196+
197+
@Override
198+
public Stream<E> stream() {
199+
return delegate.stream();
200+
}
201+
202+
@Override
203+
public Stream<E> parallelStream() {
204+
return delegate.parallelStream();
205+
}
206+
207+
@Override
208+
public void addFirst(E t) {
209+
reporter.accept(label + ".addFirst(E)");
210+
delegate.addFirst(t);
211+
}
212+
213+
@Override
214+
public void addLast(E t) {
215+
reporter.accept(label + ".addLast(E)");
216+
delegate.addLast(t);
217+
}
218+
219+
@Override
220+
public E getFirst() {
221+
return delegate.getFirst();
222+
}
223+
224+
@Override
225+
public E getLast() {
226+
return delegate.getLast();
227+
}
228+
229+
@Override
230+
public E removeFirst() {
231+
reporter.accept(label + ".removeFirst()");
232+
return delegate.removeFirst();
233+
}
234+
235+
@Override
236+
public E removeLast() {
237+
reporter.accept(label + ".removeLast()");
238+
return delegate.removeLast();
239+
}
240+
241+
@Override
242+
public List<E> reversed() {
243+
return new WriteReportingList<>(delegate.reversed(), reporter, label + ".reversed()");
244+
}
245+
246+
@Override
247+
public boolean equals(Object o) {
248+
return delegate.equals(o);
249+
}
250+
251+
@Override
252+
public int hashCode() {
253+
return delegate.hashCode();
254+
}
255+
256+
@Override
257+
public String toString() {
258+
return delegate.toString();
259+
}
260+
261+
private class WriteReportingIterator implements Iterator<E> {
262+
263+
protected final Iterator<E> iteratorDelegate;
264+
265+
WriteReportingIterator(Iterator<E> iteratorDelegate) {
266+
this.iteratorDelegate = iteratorDelegate;
267+
}
268+
269+
@Override
270+
public boolean hasNext() {
271+
return iteratorDelegate.hasNext();
272+
}
273+
274+
@Override
275+
public E next() {
276+
return iteratorDelegate.next();
277+
}
278+
279+
@Override
280+
public void remove() {
281+
reporter.accept(label + ".iterator()...remove()");
282+
iteratorDelegate.remove();
283+
}
284+
285+
@Override
286+
public void forEachRemaining(Consumer<? super E> action) {
287+
iteratorDelegate.forEachRemaining(action);
288+
}
289+
}
290+
291+
private class WriteReportingListIterator extends WriteReportingIterator implements ListIterator<E> {
292+
293+
// N.B. This constructor means we can safely downcast iteratorDelegate to ListIterator<E>:
294+
WriteReportingListIterator(ListIterator<E> iteratorDelegate) {
295+
super(iteratorDelegate);
296+
}
297+
298+
@Override
299+
public boolean hasPrevious() {
300+
return ((ListIterator<E>) iteratorDelegate).hasPrevious();
301+
}
302+
303+
@Override
304+
public E previous() {
305+
return ((ListIterator<E>) iteratorDelegate).previous();
306+
}
307+
308+
@Override
309+
public int nextIndex() {
310+
return ((ListIterator<E>) iteratorDelegate).nextIndex();
311+
}
312+
313+
@Override
314+
public int previousIndex() {
315+
return ((ListIterator<E>) iteratorDelegate).previousIndex();
316+
}
317+
318+
@Override
319+
public void set(E t) {
320+
reporter.accept(label + ".listIterator()...set(E)");
321+
((ListIterator<E>) iteratorDelegate).set(t);
322+
}
323+
324+
@Override
325+
public void add(E t) {
326+
reporter.accept(label + ".listIterator()...add(E)");
327+
((ListIterator<E>) iteratorDelegate).add(t);
328+
}
329+
}
330+
}

0 commit comments

Comments
 (0)