Merge branch 'subtree'
[fanfix.git] / src / be / nikiroo / utils / Downloader.java
index 68e4dd73e285a941e3193ac6155d846fea2e8316..4191d0aea0da85511e2741c50c2a6c83806f612f 100644 (file)
@@ -1,6 +1,5 @@
 package be.nikiroo.utils;
 
-import java.io.FileNotFoundException;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStreamWriter;
@@ -31,6 +30,7 @@ public class Downloader {
        private CookieManager cookies;
        private TraceHandler tracer = new TraceHandler();
        private Cache cache;
+       private boolean offline;
 
        /**
         * Create a new {@link Downloader}.
@@ -39,7 +39,7 @@ public class Downloader {
         *            the User-Agent to use to download the resources -- note that
         *            some websites require one, some actively blacklist real UAs
         *            like the one from wget, some whitelist a couple of browsers
-        *            only (!)
+        *            only (!) -- can be NULL
         */
        public Downloader(String UA) {
                this(UA, null);
@@ -52,7 +52,7 @@ public class Downloader {
         *            the User-Agent to use to download the resources -- note that
         *            some websites require one, some actively blacklist real UAs
         *            like the one from wget, some whitelist a couple of browsers
-        *            only (!)
+        *            only (!) -- can be NULL
         * @param cache
         *            the {@link Cache} to use for all access (can be NULL)
         */
@@ -64,6 +64,32 @@ public class Downloader {
 
                setCache(cache);
        }
+       
+       /**
+        * This {@link Downloader} is forbidden to try and connect to the network.
+        * <p>
+        * If TRUE, it will only check the cache if any.
+        * <p>
+        * Default is FALSE.
+        * 
+        * @return TRUE if offline
+        */
+       public boolean isOffline() {
+               return offline;
+       }
+       
+       /**
+        * This {@link Downloader} is forbidden to try and connect to the network.
+        * <p>
+        * If TRUE, it will only check the cache if any.
+        * <p>
+        * Default is FALSE.
+        * 
+        * @param offline TRUE for offline, FALSE for online
+        */
+       public void setOffline(boolean offline) {
+               this.offline = offline;
+       }
 
        /**
         * The traces handler for this {@link Cache}.
@@ -168,7 +194,7 @@ public class Downloader {
         * @return the {@link InputStream} of the opened page
         * 
         * @throws IOException
-        *             in case of I/O error
+        *             in case of I/O error (including offline mode + not in cache)
         */
        public InputStream open(URL url, URL currentReferer,
                        Map<String, String> cookiesValues, Map<String, String> postParams,
@@ -200,7 +226,7 @@ public class Downloader {
         * @return the {@link InputStream} of the opened page
         * 
         * @throws IOException
-        *             in case of I/O error
+        *             in case of I/O error (including offline mode + not in cache)
         */
        public InputStream open(URL url, URL currentReferer,
                        Map<String, String> cookiesValues, Map<String, String> postParams,
@@ -237,7 +263,7 @@ public class Downloader {
         * @return the {@link InputStream} of the opened page
         * 
         * @throws IOException
-        *             in case of I/O error
+        *             in case of I/O error (including offline mode + not in cache)
         */
        public InputStream open(URL url, final URL originalUrl, URL currentReferer,
                        Map<String, String> cookiesValues, Map<String, String> postParams,
@@ -255,6 +281,13 @@ public class Downloader {
                        }
                }
 
+               String protocol = originalUrl == null ? null : originalUrl
+                               .getProtocol();
+               if (isOffline() && !"file".equalsIgnoreCase(protocol)) {
+                       tracer.error("Downloader OFFLINE, cannot proceed to URL: " + url);
+                       throw new IOException("Downloader is currently OFFLINE, cannot download: " + url);
+               }
+               
                tracer.trace("Download: " + url);
 
                URLConnection conn = openConnectionWithCookies(url, currentReferer,
@@ -346,8 +379,8 @@ public class Downloader {
                        }
 
                        if (cache != null) {
-                               String size = conn.getContentLengthLong() < 0 ? "unknown size"
-                                               : StringUtils.formatNumber(conn.getContentLengthLong())
+                               String size = conn.getContentLength() < 0 ? "unknown size"
+                                               : StringUtils.formatNumber(conn.getContentLength())
                                                                + "bytes";
                                tracer.trace("Save to cache (" + size + "): " + originalUrl);
                                try {
@@ -366,6 +399,11 @@ public class Downloader {
                                }
                        }
 
+                       if (in == null) {
+                               throw new IOException(
+                                               "Cannot retrieve the file after storing it in the cache (??)");
+                       }
+                       
                        return in;
                } catch (IOException e) {
                        throw new IOException(String.format(
@@ -395,7 +433,9 @@ public class Downloader {
                        conn.setRequestProperty("Cookie", cookies);
                }
 
-               conn.setRequestProperty("User-Agent", UA);
+               if (UA != null) {
+                       conn.setRequestProperty("User-Agent", UA);
+               }
                conn.setRequestProperty("Accept-Encoding", "gzip");
                conn.setRequestProperty("Accept", "*/*");
                conn.setRequestProperty("Charset", "utf-8");