code cleanup, fix for ReplaceInputStream
[nikiroo-utils.git] / src / be / nikiroo / utils / Cache.java
index 13a50ea92219663a379eb58d7956237217a3f49a..ff2859eb44403062a5186abd78aa0233316a4926 100644 (file)
@@ -1,13 +1,14 @@
 package be.nikiroo.utils;
 
 import java.io.File;
-import java.io.FileInputStream;
 import java.io.FileNotFoundException;
 import java.io.IOException;
 import java.io.InputStream;
 import java.net.URL;
 import java.util.Date;
 
+import be.nikiroo.utils.streams.MarkableFileInputStream;
+
 /**
  * A generic cache system, with special support for {@link URL}s.
  * <p>
@@ -158,7 +159,16 @@ public class Cache {
         * @return the number of cleaned items
         */
        public int clean(boolean onlyOld) {
-               return clean(onlyOld, dir);
+               long ms = System.currentTimeMillis();
+
+               tracer.trace("Cleaning cache from old files...");
+
+               int num = clean(onlyOld, dir, -1);
+
+               tracer.trace(num + "cache items cleaned in "
+                               + (System.currentTimeMillis() - ms) + " ms");
+
+               return num;
        }
 
        /**
@@ -169,16 +179,23 @@ public class Cache {
         *            resources
         * @param cacheDir
         *            the cache directory to clean
+        * @param limit
+        *            stop after limit files deleted, or -1 for unlimited
         * 
         * @return the number of cleaned items
         */
-       private int clean(boolean onlyOld, File cacheDir) {
+       private int clean(boolean onlyOld, File cacheDir, int limit) {
                int num = 0;
                File[] files = cacheDir.listFiles();
                if (files != null) {
                        for (File file : files) {
+                               if (limit >= 0 && num >= limit) {
+                                       return num;
+                               }
+
                                if (file.isDirectory()) {
-                                       num += clean(onlyOld, file);
+                                       num += clean(onlyOld, file, limit);
+                                       file.delete(); // only if empty
                                } else {
                                        if (!onlyOld || isOld(file, true)) {
                                                if (file.delete()) {
@@ -220,8 +237,9 @@ public class Cache {
         * @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
+        *            a stable file (that doesn't change too often) -- parameter
+        *            used to check if the file is too old to keep or not in the
+        *            cache
         * 
         * @return the opened resource if found, NULL if not
         */
@@ -246,7 +264,7 @@ public class Cache {
                if (cached.exists() && cached.isFile()
                                && (allowTooOld || !isOld(cached, stable))) {
                        try {
-                               return new MarkableFileInputStream(new FileInputStream(cached));
+                               return new MarkableFileInputStream(cached);
                        } catch (FileNotFoundException e) {
                                return null;
                        }
@@ -290,6 +308,8 @@ public class Cache {
 
        /**
         * Save the given resource to the cache.
+        * <p>
+        * Will also clean the {@link Cache} from old files.
         * 
         * @param in
         *            the input data
@@ -300,7 +320,9 @@ public class Cache {
         *             in case of I/O error
         */
        private void save(InputStream in, File cached) throws IOException {
+               // We delete AFTER so not to remove the subdir we will use...
                IOUtils.write(in, cached);
+               clean(true, dir, 10);
        }
 
        /**