forked from voldemort/voldemort
/
BaseCloser.java
83 lines (54 loc) · 1.54 KB
/
BaseCloser.java
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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
package voldemort.store.readonly.io;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
public abstract class BaseCloser<T> {
protected List<T> delegates = new ArrayList();
private Throwable cause = null;
private boolean executed = false;
public BaseCloser() {}
public BaseCloser(List<T> delegates) {
this.delegates = delegates;
}
public BaseCloser(T... delegates) {
add(delegates);
}
public void add(T delegate) {
delegates.add(delegate);
}
public void add(T... delegates) {
for(T current: delegates) {
this.delegates.add(current);
}
}
public void setCause(Throwable cause) {
this.cause = cause;
}
protected boolean executed() {
return executed;
}
protected void exec() throws GroupIOException {
if(executed)
return;
GroupIOException exc = null;
if(cause != null)
exc = new GroupIOException(cause);
for(T current: delegates) {
if(current == null)
continue;
try {
onDelegate(current);
} catch(Throwable t) {
if(exc == null) {
exc = new GroupIOException(t);
} else {
exc.addSuppressedException(t);
}
}
}
executed = true;
if(exc != null)
throw exc;
}
protected abstract void onDelegate(T delegate) throws IOException;
}