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(); 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; } } } 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; } } }