package ioio.lib.impl;
import ioio.lib.api.Closeable;
import ioio.lib.api.exception.ConnectionLostException;
import ioio.lib.impl.IncomingState.DisconnectListener;
public class ResourceLifeCycle implements Closeable, DisconnectListener {
protected enum State {
OPEN, CLOSED, DISCONNECTED
}
private State state_ = State.OPEN;
public ResourceLifeCycle() {
super();
}
@Override
public synchronized void disconnected() {
if (state_ != State.CLOSED) {
state_ = State.DISCONNECTED;
notifyAll();
}
}
@Override
public synchronized void close() {
checkClose();
state_ = State.CLOSED;
notifyAll();
}
protected synchronized void checkClose() {
if (state_ == State.CLOSED) {
throw new IllegalStateException("Trying to close a closed resouce");
}
}
protected synchronized void checkState() throws ConnectionLostException {
if (state_ == State.CLOSED) {
throw new IllegalStateException("Trying to use a closed resouce");
} else if (state_ == State.DISCONNECTED) {
throw new ConnectionLostException();
}
}
protected synchronized void safeWait() throws ConnectionLostException, InterruptedException {
if (state_ == State.CLOSED) {
throw new InterruptedException("Resource closed");
} else if (state_ == State.DISCONNECTED) {
throw new ConnectionLostException();
}
wait();
}
}