package com.constellio.data.utils;
import static java.util.Arrays.asList;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import com.constellio.data.io.services.facades.IOServices;
public class BigFileFolderIterator extends LazyIterator<BigFileEntry> {
private String resourceName;
private Iterator<File> filesIterator;
private BigFileIterator currentIterator;
private InputStream currentIteratorInputStream;
private IOServices ioServices;
public BigFileFolderIterator(List<File> files, IOServices ioServices, String resourceName) {
this.filesIterator = files.iterator();
this.resourceName = resourceName;
this.ioServices = ioServices;
}
public BigFileFolderIterator(File folder, IOServices ioServices, String resourceName) {
this(getBigFilesIn(folder), ioServices, resourceName);
}
private static List<File> getBigFilesIn(File folder) {
List<File> files = new ArrayList<>();
List<String> filenames = asList(folder.list());
Collections.sort(filenames);
for (String filename : filenames) {
if (filename.endsWith(".bigf")) {
files.add(new File(folder, filename));
}
}
return files;
}
@Override
protected synchronized BigFileEntry getNextOrNull() {
if (currentIterator == null || !currentIterator.hasNext()) {
if (!filesIterator.hasNext()) {
return null;
} else {
if (currentIteratorInputStream != null) {
ioServices.closeQuietly(currentIteratorInputStream);
}
File nextFile = filesIterator.next();
System.out.println("Reading bigfile '" + nextFile.getName() + "'");
try {
currentIteratorInputStream = ioServices.newBufferedFileInputStream(nextFile, resourceName);
currentIterator = new BigFileIterator(currentIteratorInputStream);
} catch (FileNotFoundException e) {
throw new RuntimeException(e);
}
return getNextOrNull();
}
} else {
return currentIterator.next();
}
}
public void close() {
if (currentIteratorInputStream != null) {
ioServices.closeQuietly(currentIteratorInputStream);
}
}
}