From 7843cab138f4e8e5735f074c9eda2fd0d8f21c6b Mon Sep 17 00:00:00 2001 From: Reinhard Pointner Date: Thu, 24 Mar 2016 08:58:20 +0000 Subject: [PATCH] Avoid endless loops when loading paths from text files --- .../rename/FilesListTransferablePolicy.java | 66 +++++++++---------- 1 file changed, 33 insertions(+), 33 deletions(-) diff --git a/source/net/filebot/ui/rename/FilesListTransferablePolicy.java b/source/net/filebot/ui/rename/FilesListTransferablePolicy.java index 40b48aa3..317f5464 100644 --- a/source/net/filebot/ui/rename/FilesListTransferablePolicy.java +++ b/source/net/filebot/ui/rename/FilesListTransferablePolicy.java @@ -1,16 +1,17 @@ package net.filebot.ui.rename; +import static java.nio.charset.StandardCharsets.*; +import static java.util.stream.Collectors.*; import static net.filebot.Logging.*; import static net.filebot.MediaTypes.*; import static net.filebot.util.FileUtilities.*; import java.awt.datatransfer.Transferable; import java.io.File; -import java.util.ArrayList; +import java.nio.file.Files; +import java.util.Collection; import java.util.LinkedHashSet; -import java.util.LinkedList; import java.util.List; -import java.util.Scanner; import java.util.Set; import java.util.logging.Level; @@ -49,49 +50,48 @@ class FilesListTransferablePolicy extends BackgroundFileTransferablePolicy @Override protected void load(List files, TransferAction action) { - load(files, action != TransferAction.LINK); + Set fileset = new LinkedHashSet(); + + // load files recursively by default + load(files, action != TransferAction.LINK, fileset); + + publish(FastFile.create(fileset)); } - protected void load(List files, boolean recursive) { - Set entries = new LinkedHashSet(); - LinkedList queue = new LinkedList(files); - - while (queue.size() > 0) { - File f = queue.removeFirst(); - - if (f.isHidden()) + private void load(List files, boolean recursive, Collection sink) { + for (File f : files) { + // ignore hidden files + if (f.isHidden()) { continue; + } + // load file paths from text files if (recursive && LIST_FILES.accept(f)) { - // don't use new Scanner(File) because of BUG 6368019 (http://bugs.sun.com/view_bug.do?bug_id=6368019) - try (Scanner scanner = new Scanner(createTextReader(f))) { - List paths = new ArrayList(); - while (scanner.hasNextLine()) { - String line = scanner.nextLine().trim(); - if (line.length() > 0) { - File path = new File(line); - if (path.isAbsolute() && path.exists()) { - paths.add(path); - } - } - } + try { + List list = Files.lines(f.toPath(), UTF_8).map(File::new).filter(it -> { + return it.isAbsolute() && it.exists(); + }).collect(toList()); - if (paths.isEmpty()) { - entries.add(f); // treat as simple text file + if (list.isEmpty()) { + sink.add(f); // treat as simple text file } else { - queue.addAll(0, paths); // add paths from text file + load(list, false, sink); // add paths from text file } } catch (Exception e) { debug.log(Level.WARNING, e.getMessage(), e); } - } else if (!recursive || f.isFile() || MediaDetection.isDiskFolder(f)) { - entries.add(f); - } else if (f.isDirectory()) { - queue.addAll(0, sortByUniquePath(getChildren(f))); // FORCE NATURAL FILE ORDER + } + + // load normal files + else if (!recursive || f.isFile() || MediaDetection.isDiskFolder(f)) { + sink.add(f); + } + + // load folders recursively + else if (f.isDirectory()) { + load(sortByUniquePath(getChildren(f)), true, sink); // FORCE NATURAL FILE ORDER } } - - publish(FastFile.create(entries)); } @Override