package org.qrone.r7.resolver;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.HashMap;
import java.util.Map;
import org.qrone.util.UnicodeInputStream;
public class FileResolver extends AbstractURIResolver{
private File root;
private boolean noOutput = false;
private Map<String, Long> map = new HashMap<String, Long>();
public FileResolver(File basedir) {
root = basedir;
}
public FileResolver(File basedir, boolean noOutput) {
root = basedir;
this.noOutput = noOutput;
}
@Override
public boolean exist(String uri) {
File f = new File(root, uri.substring(1));
boolean r = f.isFile();
if(r){
long curr = f.lastModified();
Long last = map.get(uri);
if(last != null && curr > last.longValue()){
try {
fireUpdate(new URI(uri));
} catch (URISyntaxException e) {}
}
map.put(uri, f.lastModified());
}
return r;
}
@Override
public boolean existPath(String uri) {
File f = new File(root, uri.substring(1));
return f.isDirectory();
}
@Override
public InputStream getInputStream(URI uri) throws FileNotFoundException {
File f = new File(root, uri.getPath().substring(1));
if(f.exists())
return new UnicodeInputStream(new FileInputStream(f));
else
return null;
}
@Override
public OutputStream getOutputStream(URI uri) throws FileNotFoundException {
if(noOutput) return null;
File f = new File(root, uri.getPath().substring(1));
if(!f.exists()){
try {
f.createNewFile();
} catch (IOException e) {
return null;
}
}
fireUpdate(uri);
return new FileOutputStream(f);
}
@Override
public boolean remove(URI uri) {
if(noOutput) return false;
File f = new File(root, uri.getPath());
if(f.exists())
return f.delete();
else
return false;
}
}