package com.googlecode.totallylazy.io;
import com.googlecode.totallylazy.Files;
import com.googlecode.totallylazy.Pair;
import com.googlecode.totallylazy.Sequence;
import com.googlecode.totallylazy.collections.CloseableList;
import com.googlecode.totallylazy.functions.Function1;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.Date;
import static com.googlecode.totallylazy.Sequences.sequence;
import static com.googlecode.totallylazy.Streams.emptyInputStream;
import static com.googlecode.totallylazy.collections.CloseableList.constructors.closeableList;
public class FileSource implements Sources {
private final CloseableList<InputStream> closeables;
private final Sequence<Source> sources;
private FileSource(final Sequence<Pair<String, File>> sources) {
closeables = closeableList(InputStream.class);
this.sources = sources.map(pair ->
Source.source(pair.first(), () -> new Date(pair.second().lastModified()), () -> inputStream(pair.second()), pair.second().isDirectory()));
}
private InputStream inputStream(File file) throws FileNotFoundException {
if (file.isDirectory()) return emptyInputStream();
return closeables.manage(new FileInputStream(file));
}
public static FileSource fileSource(File folder) {
return fileSource(folder, Files.recursiveFilesDirectoriesFirst(folder));
}
public static FileSource fileSource(File folder, Sequence<File> files) {
return fileSource(files.map(relativeTo(folder)));
}
public static FileSource fileSource(final Iterable<? extends Pair<String, File>> sources) {
return new FileSource(sequence(sources));
}
@Override
public Sequence<Source> sources() {
return sources;
}
@Override
public void close() throws IOException {
closeables.close();
}
public static Function1<File, Pair<String, File>> relativeTo(final File folder) {
return file -> Pair.pair(Files.relativePath(folder, file), file);
}
}