package forklift.file;
import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
public class FileScanner {
private long lastScan = Long.MIN_VALUE;
private Map<String, Object> files = new HashMap<>();
private Object placeHolder = new Object();
private File dir;
public FileScanner(File dir) {
this.dir = dir;
}
public List<FileScanResult> scan() {
final List<FileScanResult> results = new ArrayList<>();
// Scan for added files.
for (String filename : dir.list()) {
final File file = new File(dir, filename);
if (file.isDirectory())
continue;
boolean changed = file.lastModified() > lastScan;
if (files.containsKey(filename)) {
if (changed)
results.add(new FileScanResult(FileStatus.Modified, filename));
else
results.add(new FileScanResult(FileStatus.Unchanged, filename));
} else {
results.add(new FileScanResult(FileStatus.Added, filename));
files.put(filename, placeHolder);
}
}
// Scan for removed files.
final Iterator<String> it = files.keySet().iterator();
while (it.hasNext()) {
final String filename = it.next();
if (!results.contains(new FileScanResult(FileStatus.Unchanged, filename)) &&
!results.contains(new FileScanResult(FileStatus.Added, filename)) &&
!results.contains(new FileScanResult(FileStatus.Modified, filename))) {
it.remove();
results.add(new FileScanResult(FileStatus.Removed, filename));
}
}
lastScan = System.currentTimeMillis();
return results;
}
public File getDir() {
return dir;
}
public long getLastScanTime() {
return lastScan;
}
}