blob: 8aa99759623b3ae68285a039e0700538de8b7db5 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package opennlp.tools.formats;
import java.io.File;
import java.io.FileFilter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Stack;
import opennlp.tools.util.ObjectStream;
/**
* The directory sample stream allows for creating a stream
* from a directory listing of files.
*/
public class DirectorySampleStream implements ObjectStream<File> {
private final List<File> inputDirectories;
private final boolean recursive;
private final FileFilter fileFilter;
private Stack<File> directories = new Stack<>();
private Stack<File> textFiles = new Stack<>();
/**
* Creates a new directory sample stream.
* @param dirs The directories to read.
* @param fileFilter The {@link FileFilter filter} to apply while enumerating files.
* @param recursive Enables or disables recursive file listing.
*/
public DirectorySampleStream(File[] dirs, FileFilter fileFilter, boolean recursive) {
this.fileFilter = fileFilter;
this.recursive = recursive;
List<File> inputDirectoryList = new ArrayList<>(dirs.length);
for (File dir : dirs) {
if (!dir.isDirectory()) {
throw new IllegalArgumentException(
"All passed in directories must be directories, but \""
+ dir + "\" is not!");
}
inputDirectoryList.add(dir);
}
inputDirectories = Collections.unmodifiableList(inputDirectoryList);
directories.addAll(inputDirectories);
}
/**
* Creates a new directory sample stream.
* @param dir The {@link File directory}.
* @param fileFilter The {@link FileFilter filter} to apply while enumerating files.
* @param recursive Enables or disables recursive file listing.
*/
public DirectorySampleStream(File dir, FileFilter fileFilter, boolean recursive) {
this(new File[]{dir}, fileFilter, recursive);
}
@Override
public File read() throws IOException {
while (textFiles.isEmpty() && !directories.isEmpty()) {
File dir = directories.pop();
File[] files;
if (fileFilter != null) {
files = dir.listFiles(fileFilter);
}
else {
files = dir.listFiles();
}
Arrays.sort(files);
for (File file : files) {
if (file.isFile()) {
textFiles.push(file);
}
else if (recursive && file.isDirectory()) {
directories.push(file);
}
}
}
if (!textFiles.isEmpty()) {
return textFiles.pop();
}
else {
return null;
}
}
@Override
public void reset() {
directories.clear();
textFiles.clear();
directories.addAll(inputDirectories);
}
/**
* {@inheritDoc}
* Calling this function has no effect on
* the stream.
*/
@Override
public void close() throws IOException {
}
}