package dk.statsbiblioteket.medieplatform.autonomous.iterator.filesystem; import dk.statsbiblioteket.medieplatform.autonomous.iterator.AbstractIterator; import dk.statsbiblioteket.medieplatform.autonomous.iterator.common.AttributeParsingEvent; import dk.statsbiblioteket.medieplatform.autonomous.iterator.common.DelegatingTreeIterator; import org.apache.commons.io.FileUtils; import org.apache.commons.io.filefilter.DirectoryFileFilter; import org.apache.commons.io.filefilter.FileFileFilter; import java.io.File; import java.io.FileFilter; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.Iterator; import java.util.List; /** * Iterator for parsing a tree structure backed by a file system. Each iterator represents a node. A node corresponds * to a directory. */ public class SimpleIteratorForFilesystems extends AbstractIterator<File> { /** * Construct an iterator rooted at a given directory * * @param dir the directory at which to root the iterator. */ public SimpleIteratorForFilesystems(File dir) { super(dir, ""); } @Override protected Iterator<DelegatingTreeIterator> initializeChildrenIterator() { //The id attribute is the id of this node, ie. the File corresponding to the directory File[] children = id.listFiles((FileFilter) DirectoryFileFilter.DIRECTORY); Arrays.sort(children); ArrayList<DelegatingTreeIterator> result = new ArrayList<>(children.length); for (File child : children) { result.add(new SimpleIteratorForFilesystems(child)); } return result.iterator(); } @Override protected Iterator<File> initilizeAttributeIterator() { List<File> attributes = new ArrayList<>(FileUtils.listFiles(id, FileFileFilter.FILE, null)); Collections.sort(attributes); return attributes.iterator(); } @Override protected AttributeParsingEvent makeAttributeEvent(File nodeID, File attributeID) { return new FileAttributeParsingEvent(attributeID.getPath(), attributeID); } /** * The name of the directory is used as the Id of the node. * * @return the name of the directory. */ @Override protected String getIdOfNode() { return id.getPath(); } }