package net.sf.cotta;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
/**
* Directory listing that can return list of entries, files or directories.
* Each returned list is a newly created mutable list.
*/
public class TDirectoryListing implements Iterable<TEntry> {
private PathContent pathContent;
private TFileFactory factory;
private boolean ordered;
private TFileFilter fileFilter = TFileFilter.ALL;
private TDirectoryFilter directoryFilter = TDirectoryFilter.ALL;
public TDirectoryListing(TFileFactory factory, PathContent pathContent) {
this.pathContent = pathContent;
this.factory = factory;
}
public Iterator<TEntry> iterator() {
return entries().iterator();
}
public List<TEntry> entries() {
List<TPath> dirs = pathContent.dirs();
List<TPath> files = pathContent.files();
ArrayList<TEntry> entries = new ArrayList<TEntry>(dirs.size() + files.size());
addDirs(entries, dirs);
addFiles(entries, files);
return sortIfNeeded(entries);
}
private <T extends TEntry> ArrayList<T> sortIfNeeded(ArrayList<T> list) {
if (ordered) {
Collections.sort(list);
}
return list;
}
private void addFiles(ArrayList<? super TFile> entries, List<TPath> files) {
for (TPath path : files) {
TFile file = factory.file(path);
if (fileFilter.accept(file)) {
entries.add(file);
}
}
}
private void addDirs(ArrayList<? super TDirectory> entries, List<TPath> dirs) {
for (TPath path : dirs) {
TDirectory dir = factory.dir(path);
if (directoryFilter.accept(dir)) {
entries.add(dir);
}
}
}
/**
* Sets the ordered flag to true
*
* @return current instance
*/
public TDirectoryListing ordered() {
ordered = true;
return this;
}
public List<TDirectory> dirs() {
List<TPath> paths = pathContent.dirs();
ArrayList<TDirectory> dirs = new ArrayList<TDirectory>(paths.size());
addDirs(dirs, paths);
return sortIfNeeded(dirs);
}
public List<TFile> files() {
List<TPath> paths = pathContent.files();
ArrayList<TFile> files = new ArrayList<TFile>(paths.size());
addFiles(files, paths);
return sortIfNeeded(files);
}
/**
* Sets filter for file
*
* @param filter file filter
* @return current instance
*/
public TDirectoryListing filteredBy(TFileFilter filter) {
fileFilter = filter;
return this;
}
/**
* Sets filter for directory
*
* @param filter directory filter
* @return current instance
*/
public TDirectoryListing filteredBy(TDirectoryFilter filter) {
directoryFilter = filter;
return this;
}
/**
* Sets filter for file and directory
*
* @param directoryFilter directory filter
* @param fileFilter filter filter
* @return current instance
*/
public TDirectoryListing filteredBy(TDirectoryFilter directoryFilter, TFileFilter fileFilter) {
this.directoryFilter = directoryFilter;
this.fileFilter = fileFilter;
return this;
}
}