From 2476be819d79ccd632b5e541e9ceea1130c83102 Mon Sep 17 00:00:00 2001 From: Markus Fleischhacker Date: Sat, 11 Nov 2023 10:44:35 +0100 Subject: [PATCH 1/2] Ignore files with known annotation extension when loading images. --- .../io/services/ImageMetaDataLoadingService.java | 6 +++++- .../ui/BoundingBoxDrawingTests.java | 2 +- .../testimages/2/{no_image_file.txt => dummy.data} | 0 src/test/resources/testimages/2/dummy.json | 0 src/test/resources/testimages/2/dummy.txt | 0 src/test/resources/testimages/2/dummy.xml | 0 src/test/resources/testimages/2/no_image_file.pdf | Bin 7 files changed, 6 insertions(+), 2 deletions(-) rename src/test/resources/testimages/2/{no_image_file.txt => dummy.data} (100%) create mode 100644 src/test/resources/testimages/2/dummy.json create mode 100644 src/test/resources/testimages/2/dummy.txt create mode 100644 src/test/resources/testimages/2/dummy.xml create mode 100644 src/test/resources/testimages/2/no_image_file.pdf diff --git a/src/main/java/com/github/mfl28/boundingboxeditor/model/io/services/ImageMetaDataLoadingService.java b/src/main/java/com/github/mfl28/boundingboxeditor/model/io/services/ImageMetaDataLoadingService.java index 5c37b322..1b924e3d 100644 --- a/src/main/java/com/github/mfl28/boundingboxeditor/model/io/services/ImageMetaDataLoadingService.java +++ b/src/main/java/com/github/mfl28/boundingboxeditor/model/io/services/ImageMetaDataLoadingService.java @@ -27,12 +27,14 @@ import javafx.beans.property.SimpleBooleanProperty; import javafx.beans.property.SimpleObjectProperty; import javafx.concurrent.Task; +import org.apache.commons.lang3.StringUtils; import java.io.File; import java.util.*; import java.util.concurrent.atomic.AtomicInteger; public class ImageMetaDataLoadingService extends IoService { + private static final String[] ignoredExtensions = {".txt", ".json", ".xml", ".data"}; private final ObjectProperty source = new SimpleObjectProperty<>(this, "source"); private final ObjectProperty> imageFiles = new SimpleObjectProperty<>(this, "imageFiles"); private final BooleanProperty reload = new SimpleBooleanProperty(this, "reload"); @@ -72,7 +74,9 @@ protected ImageMetaDataLoadingResult call() throws Exception { final AtomicInteger nrProcessedFiles = new AtomicInteger(0); fileNameToMetaDataMap - .putAll(imageFiles.get().parallelStream().collect(HashMap::new, (map, item) -> { + .putAll(imageFiles.get().parallelStream() + .filter(file -> !StringUtils.endsWithAny(file.getName().toLowerCase(Locale.ENGLISH), ignoredExtensions)) + .collect(HashMap::new, (map, item) -> { updateProgress(1.0 * nrProcessedFiles.incrementAndGet() / totalNrOfFiles, 1.0); try { map.put(item.getName(), ImageMetaData.fromFile(item)); diff --git a/src/test/java/com/github/mfl28/boundingboxeditor/ui/BoundingBoxDrawingTests.java b/src/test/java/com/github/mfl28/boundingboxeditor/ui/BoundingBoxDrawingTests.java index 9ca0dccc..17452bf2 100644 --- a/src/test/java/com/github/mfl28/boundingboxeditor/ui/BoundingBoxDrawingTests.java +++ b/src/test/java/com/github/mfl28/boundingboxeditor/ui/BoundingBoxDrawingTests.java @@ -206,7 +206,7 @@ void onOpeningNewImageFolder_WhenBoundingBoxesExist_ShouldResetCorrectly(FxRobot final IOErrorInfoEntry referenceErrorInfoEntry1 = new IOErrorInfoEntry("cameraman.tif", "Unsupported image file format."); - final IOErrorInfoEntry referenceErrorInfoEntry2 = new IOErrorInfoEntry("no_image_file.txt", + final IOErrorInfoEntry referenceErrorInfoEntry2 = new IOErrorInfoEntry("no_image_file.pdf", "Invalid image file."); verifyThat(errorInfoEntries, Matchers.contains(referenceErrorInfoEntry1, referenceErrorInfoEntry2), diff --git a/src/test/resources/testimages/2/no_image_file.txt b/src/test/resources/testimages/2/dummy.data similarity index 100% rename from src/test/resources/testimages/2/no_image_file.txt rename to src/test/resources/testimages/2/dummy.data diff --git a/src/test/resources/testimages/2/dummy.json b/src/test/resources/testimages/2/dummy.json new file mode 100644 index 00000000..e69de29b diff --git a/src/test/resources/testimages/2/dummy.txt b/src/test/resources/testimages/2/dummy.txt new file mode 100644 index 00000000..e69de29b diff --git a/src/test/resources/testimages/2/dummy.xml b/src/test/resources/testimages/2/dummy.xml new file mode 100644 index 00000000..e69de29b diff --git a/src/test/resources/testimages/2/no_image_file.pdf b/src/test/resources/testimages/2/no_image_file.pdf new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 From 6a9f3f313d56d001d7e57e5b8dd89a1b3e08d63f Mon Sep 17 00:00:00 2001 From: Markus Fleischhacker Date: Sat, 11 Nov 2023 11:03:28 +0100 Subject: [PATCH 2/2] Pre-filter image files to load. --- .../io/services/ImageMetaDataLoadingService.java | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/github/mfl28/boundingboxeditor/model/io/services/ImageMetaDataLoadingService.java b/src/main/java/com/github/mfl28/boundingboxeditor/model/io/services/ImageMetaDataLoadingService.java index 1b924e3d..b35ff129 100644 --- a/src/main/java/com/github/mfl28/boundingboxeditor/model/io/services/ImageMetaDataLoadingService.java +++ b/src/main/java/com/github/mfl28/boundingboxeditor/model/io/services/ImageMetaDataLoadingService.java @@ -70,12 +70,15 @@ protected ImageMetaDataLoadingResult call() throws Exception { final List errorInfoEntries = Collections.synchronizedList(new ArrayList<>()); - int totalNrOfFiles = imageFiles.get().size(); + final List filteredFiles = imageFiles.get().stream() + .filter(file -> !StringUtils.endsWithAny(file.getName().toLowerCase(Locale.ENGLISH), ignoredExtensions)) + .toList(); + + int totalNrOfFiles = filteredFiles.size(); final AtomicInteger nrProcessedFiles = new AtomicInteger(0); fileNameToMetaDataMap - .putAll(imageFiles.get().parallelStream() - .filter(file -> !StringUtils.endsWithAny(file.getName().toLowerCase(Locale.ENGLISH), ignoredExtensions)) + .putAll(filteredFiles.parallelStream() .collect(HashMap::new, (map, item) -> { updateProgress(1.0 * nrProcessedFiles.incrementAndGet() / totalNrOfFiles, 1.0); try { @@ -86,7 +89,7 @@ protected ImageMetaDataLoadingResult call() throws Exception { }, Map::putAll)); final List validImageFiles = - imageFiles.get().stream().filter(item -> fileNameToMetaDataMap.containsKey(item.getName())) + filteredFiles.stream().filter(item -> fileNameToMetaDataMap.containsKey(item.getName())) .toList(); return new ImageMetaDataLoadingResult(fileNameToMetaDataMap.size(), errorInfoEntries,