| /* |
| * 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 { |
| } |
| } |