1
0
mirror of https://gitlab.com/annimon/imagetagger.git synced 2024-09-19 14:34:21 +03:00

Add caching and config for it

This commit is contained in:
Victor 2021-01-04 20:16:12 +02:00
parent 27ab04293a
commit 6411d24b5a
6 changed files with 97 additions and 2 deletions

View File

@ -18,5 +18,6 @@ dependencies {
implementation "com.fasterxml.jackson.core:jackson-core:$jacksonVersion"
implementation "com.fasterxml.jackson.core:jackson-annotations:$jacksonVersion"
implementation "com.fasterxml.jackson.core:jackson-databind:$jacksonVersion"
implementation 'com.github.ben-manes.caffeine:caffeine:2.8.8'
testImplementation 'junit:junit:4.13.1'
}

View File

@ -1,7 +1,7 @@
package com.annimon.imagetagger;
import com.annimon.imagetagger.beans.Config;
import com.annimon.imagetagger.logic.FilesProvider;
import com.annimon.imagetagger.logic.CacheableFilesProvider;
import com.annimon.imagetagger.logic.ImageProcessor;
import com.annimon.imagetagger.logic.KeyProcessor;
import com.annimon.imagetagger.views.ImagePanel;
@ -34,7 +34,7 @@ public class Main extends JFrame {
final var tagButtons = config.getButtons(config.getProfile());
final var tagPanel = new TagPanel(tagButtons);
final var files = new FilesProvider(config.getDir());
final var files = new CacheableFilesProvider(config.getDir(), config.getCache());
final var imageProcessor = new ImageProcessor(files, config.getFilter(), config.getSort());
final var imagePanel = new ImagePanel(imageProcessor);
final var keyProcessor = new KeyProcessor(tagButtons);

View File

@ -0,0 +1,35 @@
package com.annimon.imagetagger.beans;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import java.util.Objects;
@JsonIgnoreProperties(ignoreUnknown = true)
public class CacheConfig {
public static final CacheConfig DEFAULT = new CacheConfig(20, 1920, 1080);
private Integer size;
private Integer width;
private Integer height;
public CacheConfig() {
}
public CacheConfig(Integer size, Integer width, Integer height) {
this.size = size;
this.width = width;
this.height = height;
}
public int getSize() {
return Objects.requireNonNullElse(size, DEFAULT.size);
}
public int getWidth() {
return Objects.requireNonNullElse(width, DEFAULT.width);
}
public int getHeight() {
return Objects.requireNonNullElse(height, DEFAULT.height);
}
}

View File

@ -11,6 +11,7 @@ import java.util.Objects;
public class Config {
private String dir;
private CacheConfig cache;
private String filter;
private String sort;
private String profile;
@ -23,6 +24,10 @@ public class Config {
return dir;
}
public CacheConfig getCache() {
return Objects.requireNonNullElse(cache, CacheConfig.DEFAULT);
}
public String getFilter() {
return Objects.requireNonNullElse(filter, "");
}

View File

@ -0,0 +1,52 @@
package com.annimon.imagetagger.logic;
import com.annimon.imagetagger.beans.CacheConfig;
import com.annimon.imagetagger.views.ResizableImage;
import com.github.benmanes.caffeine.cache.Caffeine;
import com.github.benmanes.caffeine.cache.LoadingCache;
import java.io.File;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
public class CacheableFilesProvider extends FilesProvider {
private final Executor exe;
private final LoadingCache<File, ResizableImage> cache;
private final int maxWidth, maxHeight;
public CacheableFilesProvider(String dir, CacheConfig cacheConfig) {
super(dir);
maxWidth = Math.max(cacheConfig.getWidth(), 100);
maxHeight = Math.max(cacheConfig.getHeight(), 100);
exe = Executors.newSingleThreadExecutor();
cache = Caffeine.newBuilder()
.executor(exe)
.maximumSize(Math.max(cacheConfig.getSize(), 1))
.expireAfterWrite(10, TimeUnit.MINUTES)
.softValues()
.build(this::loadAndResize);
}
@Override
public ResizableImage loadImage(File file) {
final var image = cache.get(file);
if (image != null) {
return image;
} else {
final var result = loadAndResize(file);
cache.put(file, result);
return result;
}
}
@Override
public void preloadImage(File file) {
exe.execute(() -> cache.get(file));
}
private ResizableImage loadAndResize(File file) {
final var image = super.loadImage(file);
return new ResizableImage(image.getResized(maxWidth, maxHeight));
}
}

View File

@ -103,6 +103,8 @@ public class ImageProcessor {
if (imagesCount > 0) {
index = 0;
loadImage();
preloadImage(1);
preloadImage(-1);
}
}