mirror of https://github.com/micromata/borgbackup-butler.git

Kai Reinhard
16.02.2018 3a7bdbc2d07d525c7858727d75a02c1b8eeaea4c
FileSystemFilter handles now maxResultSize.
3 files modified
47 ■■■■ changed files
borgbutler-core/src/main/java/de/micromata/borgbutler/cache/ArchiveFilelistCache.java 7 ●●●●● patch | view | raw | blame | history
borgbutler-core/src/main/java/de/micromata/borgbutler/cache/ButlerCache.java 5 ●●●● patch | view | raw | blame | history
borgbutler-core/src/main/java/de/micromata/borgbutler/data/FileSystemFilter.java 35 ●●●●● patch | view | raw | blame | history
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;
        }
    }
}