Version 1.2.2: fixes, export in UI
[fanfix.git] / src / be / nikiroo / fanfix / reader / BasicReader.java
index 34133e40c232008075e16f3fb653317eea03c424..ae1c8d4c6eb32162c65421e0959da5bb6fc00e31 100644 (file)
@@ -1,6 +1,8 @@
 package be.nikiroo.fanfix.reader;
 
+import java.io.File;
 import java.io.IOException;
+import java.net.MalformedURLException;
 import java.net.URL;
 
 import be.nikiroo.fanfix.Instance;
@@ -8,12 +10,12 @@ import be.nikiroo.fanfix.Library;
 import be.nikiroo.fanfix.bundles.Config;
 import be.nikiroo.fanfix.data.Story;
 import be.nikiroo.fanfix.supported.BasicSupport;
-import be.nikiroo.fanfix.supported.BasicSupport.SupportType;
+import be.nikiroo.utils.Progress;
 
 /**
- * Command line {@link Story} reader.
+ * The class that handles the different {@link Story} readers you can use.
  * <p>
- * Will output stories to the console.
+ * All the readers should be accessed via {@link BasicReader#getReader()}.
  * 
  * @author niki
  */
@@ -79,23 +81,16 @@ public abstract class BasicReader {
         * 
         * @param luid
         *            the {@link Story} ID
+        * @param pg
+        *            the optional progress reporter
+        * 
         * @throws IOException
         *             in case of I/O error
         */
-       public void setStory(String luid) throws IOException {
-               story = Instance.getLibrary().getStory(luid);
+       public void setStory(String luid, Progress pg) throws IOException {
+               story = Instance.getLibrary().getStory(luid, pg);
                if (story == null) {
-                       // if the LUID is wrong and < 3, pad it to 3 chars with "0" then
-                       // retry (since LUIDs are %03d)
-                       if (luid != null && luid.length() < 3) {
-                               while (luid.length() < 3) {
-                                       luid = "0" + luid;
-                               }
-                               setStory(luid);
-                       } else {
-                               throw new IOException("Cannot retrieve story from library: "
-                                               + luid);
-                       }
+                       throw new IOException("Cannot retrieve story from library: " + luid);
                }
        }
 
@@ -104,16 +99,19 @@ public abstract class BasicReader {
         * 
         * @param source
         *            the {@link Story} {@link URL}
+        * @param pg
+        *            the optional progress reporter
+        * 
         * @throws IOException
         *             in case of I/O error
         */
-       public void setStory(URL source) throws IOException {
+       public void setStory(URL source, Progress pg) throws IOException {
                BasicSupport support = BasicSupport.getSupport(source);
                if (support == null) {
                        throw new IOException("URL not supported: " + source.toString());
                }
 
-               story = support.process(source);
+               story = support.process(source, pg);
                if (story == null) {
                        throw new IOException(
                                        "Cannot retrieve story from external source: "
@@ -136,8 +134,12 @@ public abstract class BasicReader {
         * 
         * @param chapter
         *            the chapter
+        * 
+        * @throws IOException
+        *             in case of I/O error or if the {@link Story} was not
+        *             previously set
         */
-       public abstract void read(int chapter);
+       public abstract void read(int chapter) throws IOException;
 
        /**
         * Start the reader in browse mode for the given type (or pass NULL for all
@@ -147,7 +149,7 @@ public abstract class BasicReader {
         *            the type of {@link Story} to take into account, or NULL for
         *            all
         */
-       public abstract void start(SupportType type);
+       public abstract void start(String type);
 
        /**
         * Return a new {@link BasicReader} ready for use if one is configured.
@@ -157,13 +159,18 @@ public abstract class BasicReader {
         * @return a {@link BasicReader}, or NULL if none configured
         */
        public static BasicReader getReader() {
-               if (defaultType != null) {
-                       switch (defaultType) {
-                       // case LOCAL:
-                       // return new LocalReader().setType(ReaderType.LOCAL);
-                       case CLI:
-                               return new CliReader().setType(ReaderType.CLI);
+               try {
+                       if (defaultType != null) {
+                               switch (defaultType) {
+                               case LOCAL:
+                                       return new LocalReader().setType(ReaderType.LOCAL);
+                               case CLI:
+                                       return new CliReader().setType(ReaderType.CLI);
+                               }
                        }
+               } catch (IOException e) {
+                       Instance.syserr(new Exception("Cannot create a reader of type: "
+                                       + defaultType, e));
                }
 
                return null;
@@ -189,4 +196,32 @@ public abstract class BasicReader {
        public static void setDefaultReaderType(ReaderType defaultType) {
                BasicReader.defaultType = defaultType;
        }
+
+       /**
+        * Return an {@link URL} from this {@link String}, be it a file path or an
+        * actual {@link URL}.
+        * 
+        * @param sourceString
+        *            the source
+        * 
+        * @return the corresponding {@link URL}
+        * 
+        * @throws MalformedURLException
+        *             if this is neither a file nor a conventional {@link URL}
+        */
+       public static URL getUrl(String sourceString) throws MalformedURLException {
+               if (sourceString == null || sourceString.isEmpty()) {
+                       throw new MalformedURLException("Empty url");
+               }
+
+               URL source = null;
+               try {
+                       source = new URL(sourceString);
+               } catch (MalformedURLException e) {
+                       File sourceFile = new File(sourceString);
+                       source = sourceFile.toURI().toURL();
+               }
+
+               return source;
+       }
 }