From 3a7bdbc2d07d525c7858727d75a02c1b8eeaea4c Mon Sep 17 00:00:00 2001
From: Kai Reinhard <K.Reinhard@micromata.de>
Date: Sun, 16 Dec 2018 22:02:02 +0000
Subject: [PATCH] FileSystemFilter handles now maxResultSize.

---
 borgbutler-core/src/main/java/de/micromata/borgbutler/cache/ArchiveFilelistCache.java |    7 +++----
 borgbutler-core/src/main/java/de/micromata/borgbutler/cache/ButlerCache.java          |    5 +----
 borgbutler-core/src/main/java/de/micromata/borgbutler/data/FileSystemFilter.java      |   35 ++++++++++++++++++++++++++++++++++-
 3 files changed, 38 insertions(+), 9 deletions(-)

diff --git a/borgbutler-core/src/main/java/de/micromata/borgbutler/cache/ArchiveFilelistCache.java b/borgbutler-core/src/main/java/de/micromata/borgbutler/cache/ArchiveFilelistCache.java
index beb3c2b..c3e930c 100644
--- a/borgbutler-core/src/main/java/de/micromata/borgbutler/cache/ArchiveFilelistCache.java
+++ b/borgbutler-core/src/main/java/de/micromata/borgbutler/cache/ArchiveFilelistCache.java
@@ -94,9 +94,7 @@
                 return null;
             }
             int size = (Integer) obj;
-            int maxSize = filter != null ? filter.getMaxResultSize() : -1;
             list = new ArrayList<>();
-            int counter = 0;
             int fileNumber = -1;
             for (int i = 0; i < size; i++) {
                 ++fileNumber;
@@ -105,7 +103,7 @@
                     BorgFilesystemItem item = (BorgFilesystemItem) obj;
                     if (filter == null || filter.matches(item)) {
                         list.add(item.setFileNumber(fileNumber));
-                        if (maxSize > 0 && counter++ >= maxSize) break;
+                        if (filter != null && filter.isFinished()) break;
                     }
                 } else {
                     log.error("Can't load archive content. FilesystemItem expected, but received: "
@@ -123,7 +121,8 @@
 
     /**
      * Deletes archive contents older than 7 days and deletes the oldest archive contents if the max cache size is
-     * exceeded. The last modified time of a file is equals to the last usage by {@link #load(BorgRepoConfig, Archive)}.
+     * exceeded. The last modified time of a file is equals to the last usage by
+     * {@link #load(BorgRepoConfig, Archive, FileSystemFilter)}.
      */
     public void cleanUp() {
         File[] files = cacheDir.listFiles();
diff --git a/borgbutler-core/src/main/java/de/micromata/borgbutler/cache/ButlerCache.java b/borgbutler-core/src/main/java/de/micromata/borgbutler/cache/ButlerCache.java
index 09891b4..c29dbfe 100644
--- a/borgbutler-core/src/main/java/de/micromata/borgbutler/cache/ButlerCache.java
+++ b/borgbutler-core/src/main/java/de/micromata/borgbutler/cache/ButlerCache.java
@@ -237,15 +237,12 @@
             if (CollectionUtils.isNotEmpty(list)) {
                 archiveFilelistCache.save(repoConfig, archive, list);
                 items = new ArrayList<>();
-                int counter = 0;
                 int fileNumber = -1;
-                boolean search = filter != null && StringUtils.isNotBlank(filter.getSearchString());
-                int maxSize = filter != null ? filter.getMaxResultSize() : -1;
                 for (BorgFilesystemItem item : list) {
                     ++fileNumber;
                     if (filter == null || filter.matches(item)) {
                         items.add(item.setFileNumber(fileNumber));
-                        if (maxSize > 0 && counter++ >= maxSize) break;
+                        if (filter != null && filter.isFinished()) break;
                     }
                 }
             }
diff --git a/borgbutler-core/src/main/java/de/micromata/borgbutler/data/FileSystemFilter.java b/borgbutler-core/src/main/java/de/micromata/borgbutler/data/FileSystemFilter.java
index a83ae75..512b3d1 100644
--- a/borgbutler-core/src/main/java/de/micromata/borgbutler/data/FileSystemFilter.java
+++ b/borgbutler-core/src/main/java/de/micromata/borgbutler/data/FileSystemFilter.java
@@ -13,12 +13,38 @@
     private String searchString;
     @Getter
     @Setter
-    private int maxResultSize;
+    private int maxResultSize = -1;
+    /**
+     * If given, only the file assigned to this number is searched and returned.
+     */
+    @Getter
+    @Setter
+    private Integer fileNumber;
     private String[] searchKeyWords;
     private String[] blackListSearchKeyWords;
+    private int counter = 0;
+    @Getter
+    private boolean finished;
 
+    /**
+     * Please ensure that you call matches exactly ones for every file item. If matches returns true, the internal
+     * item counter is incremented (for maxResultSize functionality).
+     * <br>
+     * If the number of positive matches is greater than {@link #maxResultSize}, the finished flag is set to true.
+     *
+     * @param item
+     * @return true if the given item matches this filter.
+     */
     public boolean matches(BorgFilesystemItem item) {
+        if (fileNumber != null) {
+            if (item.getFileNumber() == fileNumber) {
+                finished = true; // Force finishing.
+                return true;
+            }
+            return false;
+        }
         if (searchKeyWords == null && blackListSearchKeyWords == null) {
+            processFinishedFlag();
             return true;
         }
         if (item.getPath() == null) {
@@ -37,6 +63,7 @@
                     return false;
             }
         }
+        processFinishedFlag();
         return true;
     }
 
@@ -74,4 +101,10 @@
         }
         return this;
     }
+
+    private void processFinishedFlag() {
+        if (maxResultSize > 0 && ++counter >= maxResultSize) {
+            this.finished = true;
+        }
+    }
 }

--
Gitblit v1.10.0