From f97a3bcbb5f5159856ad051da579144522b54906 Mon Sep 17 00:00:00 2001 From: Robert Stephan Date: Fri, 12 Apr 2024 19:58:02 +0200 Subject: [PATCH] code to generate the file if missing #77 --- .../diskcache/MCRDiskcacheConfig.java | 47 ++++++++++++++----- .../jspdocportal-diskcache/mycore.properties | 6 +-- 2 files changed, 37 insertions(+), 16 deletions(-) diff --git a/jspdocportal-diskcache/src/main/java/org/mycore/jspdocportal/diskcache/MCRDiskcacheConfig.java b/jspdocportal-diskcache/src/main/java/org/mycore/jspdocportal/diskcache/MCRDiskcacheConfig.java index 0b3c58bc..0f50d5fe 100644 --- a/jspdocportal-diskcache/src/main/java/org/mycore/jspdocportal/diskcache/MCRDiskcacheConfig.java +++ b/jspdocportal-diskcache/src/main/java/org/mycore/jspdocportal/diskcache/MCRDiskcacheConfig.java @@ -13,6 +13,7 @@ import org.mycore.common.config.annotation.MCRProperty; import org.mycore.common.events.MCRShutdownHandler; import org.mycore.jspdocportal.diskcache.disklru.DiskLruCache; +import org.mycore.jspdocportal.diskcache.disklru.DiskLruCache.Editor; import org.mycore.jspdocportal.diskcache.disklru.DiskLruCache.Value; public class MCRDiskcacheConfig { @@ -24,9 +25,9 @@ public class MCRDiskcacheConfig { private String id; private Path baseDir; - + //TODO "defaultName" in MCRInstance - @MCRInstance(name="Generator", valueClass=BiConsumer.class) + @MCRInstance(name = "Generator", valueClass = BiConsumer.class) public BiConsumer generator; @MCRProperty(name = "FileName", defaultName = "MCR.Diskcache.Default.FileName") @@ -71,9 +72,12 @@ public void setVersion(String sVersion) { @MCRPostConstruction public void init(String property) { - id = property.substring(property.lastIndexOf(".") + 1); + String p = property.endsWith(".Class") ? property.substring(0, property.length() - 6) : property; + id = p.substring(p.lastIndexOf(".") + 1); try { - cache = DiskLruCache.open(baseDir, version, DISK_LRUCACHE_VALUE_COUNT, maxSizeInBytes); + Path cacheDir = baseDir.resolve(id); + Files.createDirectories(cacheDir); + cache = DiskLruCache.open(cacheDir, version, DISK_LRUCACHE_VALUE_COUNT, maxSizeInBytes); MCRShutdownHandler.getInstance().addCloseable(new MCRDiskLruCacheClosable(cache)); } catch (IOException e) { LOGGER.error(e); @@ -112,11 +116,11 @@ public DiskLruCache getCache() { return cache; } - private Value getFromCache(DiskLruCache cache, String key) { + private Value getFromCache(String key) { try { Value v = cache.get(key); if (v != null) { - Path p = v.getFile(1); + Path p = v.getFile(0); if (Files.getLastModifiedTime(p).toMillis() < System.currentTimeMillis() - livespanInMillis) { cache.remove(key); return null; @@ -124,21 +128,38 @@ private Value getFromCache(DiskLruCache cache, String key) { } return v; } catch (IOException e) { - LOGGER.error(e); + LOGGER.error(e); } return null; } - public Path retrieveCachedFile(String objectId) { - Value v = getFromCache(cache, objectId); - Path p = v.getFile(0); - if (p == null) { - //TODO recreate FileObject and add it to Cache + public synchronized Path retrieveCachedFile(String objectId) { + Value v = getFromCache(objectId); + if (v != null && v.getFile(0) != null) { + return v.getFile(0); + } else { + //TODO Null-Check / Errorhandling + return generateCachedFile(objectId); + } + } + + public Path generateCachedFile(String key) { + Editor editor = null; + Path p = null; + try { + editor = cache.edit(key); + p = editor.getFile(0); + generator.accept(key, p); + editor.commit(); + } catch (IOException e) { + if (editor != null) { + editor.abortUnlessCommitted(); + } } return p; } - public void removeCachedFile(String objectId) { + public synchronized void removeCachedFile(String objectId) { try { cache.remove(objectId); } catch (IOException e) { diff --git a/jspdocportal-diskcache/src/main/resources/config/jspdocportal-diskcache/mycore.properties b/jspdocportal-diskcache/src/main/resources/config/jspdocportal-diskcache/mycore.properties index 9c9a9be0..1b4f65fd 100644 --- a/jspdocportal-diskcache/src/main/resources/config/jspdocportal-diskcache/mycore.properties +++ b/jspdocportal-diskcache/src/main/resources/config/jspdocportal-diskcache/mycore.properties @@ -13,15 +13,15 @@ MCR.Diskcache.Default.Version=1 MCR.Diskcache.Cache.iiif-manifest.Class=org.mycore.jspdocportal.diskcache.MCRDiskcacheConfig MCR.Diskcache.Cache.iiif-manifest.FileName=/manifest MCR.Diskcache.Cache.iiif-manifest.MimeType=application/json -MCR.Diskcache.Cache.iiif-manifest.Generator=org.mycore.jspdocportal.diskcache.generator.SimpleGenerator +MCR.Diskcache.Cache.iiif-manifest.Generator.Class=org.mycore.jspdocportal.diskcache.generator.SimpleGenerator MCR.Diskcache.Cache.dv-mets.Class=org.mycore.jspdocportal.diskcache.MCRDiskcacheConfig MCR.Diskcache.Cache.dv-mets.FileName=_dv.mets.xml MCR.Diskcache.Cache.dv-mets.MimeType=application/xml -MCR.Diskcache.Cache.dv-mets.Generator=org.mycore.jspdocportal.diskcache.generator.SimpleGenerator +MCR.Diskcache.Cache.dv-mets.Generator.Class=org.mycore.jspdocportal.diskcache.generator.SimpleGenerator MCR.Diskcache.Cache.hello.Class=org.mycore.jspdocportal.diskcache.MCRDiskcacheConfig MCR.Diskcache.Cache.hello.FileName=/hello MCR.Diskcache.Cache.hello.MimeType=application/text -MCR.Diskcache.Cache.hello.Generator=org.mycore.jspdocportal.diskcache.generator.SimpleGenerator +MCR.Diskcache.Cache.hello.Generator.Class=org.mycore.jspdocportal.diskcache.generator.SimpleGenerator \ No newline at end of file