X-Git-Url: http://git.nikiroo.be/?a=blobdiff_plain;f=src%2Fbe%2Fnikiroo%2Futils%2FCache.java;h=13a50ea92219663a379eb58d7956237217a3f49a;hb=771c4ba4a1c17a95acbfdcbdb489094b04947713;hp=1e590547f3842070e01d8758023a8a933102b6f1;hpb=2ee6c205bfacff9e9a3103e7738afcd5e3267d3f;p=nikiroo-utils.git diff --git a/src/be/nikiroo/utils/Cache.java b/src/be/nikiroo/utils/Cache.java index 1e59054..13a50ea 100644 --- a/src/be/nikiroo/utils/Cache.java +++ b/src/be/nikiroo/utils/Cache.java @@ -19,6 +19,13 @@ public class Cache { private File dir; private long tooOldChanging; private long tooOldStable; + private TraceHandler tracer = new TraceHandler(); + + /** + * Only for inheritance. + */ + protected Cache() { + } /** * Create a new {@link Cache} object. @@ -40,8 +47,8 @@ public class Cache { public Cache(File dir, int hoursChanging, int hoursStable) throws IOException { this.dir = dir; - this.tooOldChanging = 1000 * 60 * 60 * hoursChanging; - this.tooOldStable = 1000 * 60 * 60 * hoursStable; + this.tooOldChanging = 1000L * 60 * 60 * hoursChanging; + this.tooOldStable = 1000L * 60 * 60 * hoursStable; if (dir != null && !dir.exists()) { dir.mkdirs(); @@ -53,6 +60,47 @@ public class Cache { } } + /** + * The traces handler for this {@link Cache}. + * + * @return the traces handler + */ + public TraceHandler getTraceHandler() { + return tracer; + } + + /** + * The traces handler for this {@link Cache}. + * + * @param tracer + * the new traces handler + */ + public void setTraceHandler(TraceHandler tracer) { + if (tracer == null) { + tracer = new TraceHandler(false, false, false); + } + + this.tracer = tracer; + } + + /** + * Check the resource to see if it is in the cache. + * + * @param uniqueID + * the resource to check + * @param allowTooOld + * allow files even if they are considered too old + * @param stable + * a stable file (that dones't change too often) -- parameter + * used to check if the file is too old to keep or not + * + * @return TRUE if it is + * + */ + public boolean check(String uniqueID, boolean allowTooOld, boolean stable) { + return check(getCached(uniqueID), allowTooOld, stable); + } + /** * Check the resource to see if it is in the cache. * @@ -68,9 +116,31 @@ public class Cache { * */ public boolean check(URL url, boolean allowTooOld, boolean stable) { - File file = getCached(url); - if (file.exists()) { - if (allowTooOld || !isOld(file, stable)) { + return check(getCached(url), allowTooOld, stable); + } + + /** + * Check the resource to see if it is in the cache. + * + * @param cached + * the resource to check + * @param allowTooOld + * allow files even if they are considered too old + * @param stable + * a stable file (that dones't change too often) -- parameter + * used to check if the file is too old to keep or not + * + * @return TRUE if it is + * + */ + private boolean check(File cached, boolean allowTooOld, boolean stable) { + if (cached.exists() && cached.isFile()) { + if (!allowTooOld && isOld(cached, stable)) { + if (!cached.delete()) { + tracer.error("Cannot delete temporary file: " + + cached.getAbsolutePath()); + } + } else { return true; } } @@ -91,24 +161,6 @@ public class Cache { return clean(onlyOld, dir); } - /** - * Trace information (info/error) generated by this class. - *
- * You can override it if you don't want the default sysout/syserr. - * - * @param message - * the message - * @param error - * TRUE for error messages, FALSE for information messages - */ - protected void trace(String message, boolean error) { - if (error) { - System.err.println(message); - } else { - System.out.println(message); - } - } - /** * Clean the cache (delete the cached items) in the given cache directory. * @@ -122,16 +174,19 @@ public class Cache { */ private int clean(boolean onlyOld, File cacheDir) { int num = 0; - for (File file : cacheDir.listFiles()) { - if (file.isDirectory()) { - num += clean(onlyOld, file); - } else { - if (!onlyOld || isOld(file, true)) { - if (file.delete()) { - num++; - } else { - trace("Cannot delete temporary file: " - + file.getAbsolutePath(), true); + File[] files = cacheDir.listFiles(); + if (files != null) { + for (File file : files) { + if (file.isDirectory()) { + num += clean(onlyOld, file); + } else { + if (!onlyOld || isOld(file, true)) { + if (file.delete()) { + num++; + } else { + tracer.error("Cannot delete temporary file: " + + file.getAbsolutePath()); + } } } } @@ -188,7 +243,8 @@ public class Cache { * @return the opened resource if found, NULL if not */ private InputStream load(File cached, boolean allowTooOld, boolean stable) { - if (cached.exists() && (allowTooOld || !isOld(cached, stable))) { + if (cached.exists() && cached.isFile() + && (allowTooOld || !isOld(cached, stable))) { try { return new MarkableFileInputStream(new FileInputStream(cached)); } catch (FileNotFoundException e) { @@ -207,15 +263,13 @@ public class Cache { * @param uniqueID * a unique ID used to locate the cached resource * - * @return the resulting {@link File} - * * @throws IOException * in case of I/O error */ - public File save(InputStream in, String uniqueID) throws IOException { + public void save(InputStream in, String uniqueID) throws IOException { File cached = getCached(uniqueID); cached.getParentFile().mkdirs(); - return save(in, cached); + save(in, cached); } /** @@ -226,14 +280,12 @@ public class Cache { * @param url * the {@link URL} used to locate the cached resource * - * @return the actual cache file - * * @throws IOException * in case of I/O error */ - public File save(InputStream in, URL url) throws IOException { + public void save(InputStream in, URL url) throws IOException { File cached = getCached(url); - return save(in, cached); + save(in, cached); } /** @@ -244,14 +296,11 @@ public class Cache { * @param cached * the cached {@link File} to save to * - * @return the actual cache file - * * @throws IOException * in case of I/O error */ - private File save(InputStream in, File cached) throws IOException { + private void save(InputStream in, File cached) throws IOException { IOUtils.write(in, cached); - return cached; } /** @@ -304,8 +353,8 @@ public class Cache { long time = new Date().getTime() - file.lastModified(); if (time < 0) { - trace("Timestamp in the future for file: " + file.getAbsolutePath(), - true); + tracer.error("Timestamp in the future for file: " + + file.getAbsolutePath()); } return time < 0 || time > max; @@ -326,7 +375,11 @@ public class Cache { if (name == null || name.isEmpty()) { // File File file = new File(url.getFile()); - subdir = new File(file.getParent().replace("..", "__")); + if (file.getParent() == null) { + subdir = new File("+"); + } else { + subdir = new File(file.getParent().replace("..", "__")); + } subdir = new File(dir, allowedChars(subdir.getPath())); name = allowedChars(url.getFile()); } else {