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;
}