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