Merge branch 'subtree'
[fanfix.git] / src / be / nikiroo / utils / Cache.java
index dbe2020188ec44ae2dfd673529f49a8e6abdf462..6233082742606f72538fb5ccb2a3ffd4c64e9136 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>
@@ -263,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;
                        }
@@ -280,13 +281,15 @@ public class Cache {
         * @param uniqueID
         *            a unique ID used to locate the cached resource
         * 
+        * @return the number of bytes written
+        * 
         * @throws IOException
         *             in case of I/O error
         */
-       public void save(InputStream in, String uniqueID) throws IOException {
+       public long save(InputStream in, String uniqueID) throws IOException {
                File cached = getCached(uniqueID);
                cached.getParentFile().mkdirs();
-               save(in, cached);
+               return save(in, cached);
        }
 
        /**
@@ -297,12 +300,14 @@ public class Cache {
         * @param url
         *            the {@link URL} used to locate the cached resource
         * 
+        * @return the number of bytes written
+        * 
         * @throws IOException
         *             in case of I/O error
         */
-       public void save(InputStream in, URL url) throws IOException {
+       public long save(InputStream in, URL url) throws IOException {
                File cached = getCached(url);
-               save(in, cached);
+               return save(in, cached);
        }
 
        /**
@@ -315,12 +320,19 @@ public class Cache {
         * @param cached
         *            the cached {@link File} to save to
         * 
+        * @return the number of bytes written
+        * 
         * @throws IOException
         *             in case of I/O error
         */
-       private void save(InputStream in, File cached) throws IOException {
+       private long save(InputStream in, File cached) throws IOException {
+               // We want to force at least an immediate SAVE/LOAD to work for some
+               // workflows, even if we don't accept cached files (times set to "0"
+               // -- and not "-1" or a positive value)
                clean(true, dir, 10);
-               IOUtils.write(in, cached);
+               cached.getParentFile().mkdirs(); // in case we deleted our own parent
+               long bytes = IOUtils.write(in, cached);
+               return bytes;
        }
 
        /**