package net.sf.cotta;
import net.sf.cotta.memory.InMemoryFileSystem;
import java.net.URI;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
/**
* @noinspection JavaDoc
*/
public class CatastrophicFileSystem extends ControlledFileSystem {
public CatastrophicFileSystem() {
super(new InMemoryFileSystem(), new CatastrophicController());
}
public void diskFull() {
((CatastrophicController) controller).diskFull();
}
public void lockFile(TPath path) {
lockFile(path, 0);
}
public void lockFile(TPath path, int counter) {
((CatastrophicController) controller).lockFile(path, counter);
}
public void unLockFile(TPath path) {
((CatastrophicController) controller).unLockFile(path);
}
public void diskErrorFor(TPath path) {
((CatastrophicController) controller).diskError(path);
}
private static class CatastrophicController implements Controller {
private boolean diskFull;
private Map<TPath, Integer> fileLock = new HashMap<TPath, Integer>();
private Set<TPath> readError = new HashSet<TPath>();
public void writeOperationControl(TPath path) throws TIoException {
checkError(path);
checkLock(path);
}
private void checkLock(TPath path) throws TIoException {
Integer counter = fileLock.get(path);
if (counter != null) {
counter = counter - 1;
if (counter == 0) {
fileLock.remove(path);
} else {
fileLock.put(path, counter);
}
throw new TIoException(path, "File locked");
}
}
private void checkError(TPath path) throws TIoException {
if (diskFull) {
throw new TIoException(path, "Disk is full");
}
}
public void readOperationControl(TPath path) throws TIoException {
if (readError.contains(path)) {
throw new TIoException(path, "Disk Error");
}
}
public void diskFull() {
diskFull = true;
}
public void lockFile(TPath path, int i) {
fileLock.put(path, i);
}
public void unLockFile(TPath path) {
fileLock.remove(path);
}
public void diskError(TPath path) {
readError.add(path);
}
}
}