Version 1.1.0
[fanfix.git] / src / be / nikiroo / fanfix / Library.java
index 304f19f462e1a05a899e4b01de430e6c283abfef..03b584cf760849ec9fcaccc84529db806318ce87 100644 (file)
@@ -14,6 +14,7 @@ import be.nikiroo.fanfix.data.Story;
 import be.nikiroo.fanfix.output.BasicOutput;
 import be.nikiroo.fanfix.output.BasicOutput.OutputType;
 import be.nikiroo.fanfix.supported.BasicSupport;
 import be.nikiroo.fanfix.output.BasicOutput;
 import be.nikiroo.fanfix.output.BasicOutput.OutputType;
 import be.nikiroo.fanfix.supported.BasicSupport;
+import be.nikiroo.utils.ui.Progress;
 import be.nikiroo.fanfix.supported.BasicSupport.SupportType;
 import be.nikiroo.fanfix.supported.InfoReader;
 
 import be.nikiroo.fanfix.supported.BasicSupport.SupportType;
 import be.nikiroo.fanfix.supported.InfoReader;
 
@@ -52,6 +53,23 @@ public class Library {
                dir.mkdirs();
        }
 
                dir.mkdirs();
        }
 
+       /**
+        * List all the known types of stories.
+        * 
+        * @return the types
+        */
+       public List<String> getTypes() {
+               List<String> list = new ArrayList<String>();
+               for (Entry<MetaData, File> entry : getStories().entrySet()) {
+                       String storyType = entry.getValue().getParentFile().getName();
+                       if (!list.contains(storyType)) {
+                               list.add(storyType);
+                       }
+               }
+
+               return list;
+       }
+
        /**
         * List all the stories of the given source type in the {@link Library}, or
         * all the stories if NULL is passed as a type.
        /**
         * List all the stories of the given source type in the {@link Library}, or
         * all the stories if NULL is passed as a type.
@@ -61,13 +79,11 @@ public class Library {
         * 
         * @return the stories
         */
         * 
         * @return the stories
         */
-       public List<MetaData> getList(SupportType type) {
-               String typeString = type == null ? null : type.getSourceName();
-
+       public List<MetaData> getList(String type) {
                List<MetaData> list = new ArrayList<MetaData>();
                for (Entry<MetaData, File> entry : getStories().entrySet()) {
                        String storyType = entry.getValue().getParentFile().getName();
                List<MetaData> list = new ArrayList<MetaData>();
                for (Entry<MetaData, File> entry : getStories().entrySet()) {
                        String storyType = entry.getValue().getParentFile().getName();
-                       if (typeString == null || typeString.equalsIgnoreCase(storyType)) {
+                       if (type == null || type.equalsIgnoreCase(storyType)) {
                                list.add(entry.getKey());
                        }
                }
                                list.add(entry.getKey());
                        }
                }
@@ -75,6 +91,26 @@ public class Library {
                return list;
        }
 
                return list;
        }
 
+       /**
+        * Retrieve a {@link File} corresponding to the given {@link Story}.
+        * 
+        * @param luid
+        *            the Library UID of the story
+        * 
+        * @return the corresponding {@link Story}
+        */
+       public MetaData getInfo(String luid) {
+               if (luid != null) {
+                       for (Entry<MetaData, File> entry : getStories().entrySet()) {
+                               if (luid.equals(entry.getKey().getLuid())) {
+                                       return entry.getKey();
+                               }
+                       }
+               }
+
+               return null;
+       }
+
        /**
         * Retrieve a {@link File} corresponding to the given {@link Story}.
         * 
        /**
         * Retrieve a {@link File} corresponding to the given {@link Story}.
         * 
@@ -100,10 +136,12 @@ public class Library {
         * 
         * @param luid
         *            the Library UID of the story
         * 
         * @param luid
         *            the Library UID of the story
+        * @param pg
+        *            the optional progress reporter
         * 
         * 
-        * @return the corresponding {@link Story}
+        * @return the corresponding {@link Story} or NULL if not found
         */
         */
-       public Story getStory(String luid) {
+       public Story getStory(String luid, Progress pg) {
                if (luid != null) {
                        for (Entry<MetaData, File> entry : getStories().entrySet()) {
                                if (luid.equals(entry.getKey().getLuid())) {
                if (luid != null) {
                        for (Entry<MetaData, File> entry : getStories().entrySet()) {
                                if (luid.equals(entry.getKey().getLuid())) {
@@ -112,7 +150,8 @@ public class Library {
                                                                .getKey().getType());
                                                URL url = entry.getValue().toURI().toURL();
                                                if (type != null) {
                                                                .getKey().getType());
                                                URL url = entry.getValue().toURI().toURL();
                                                if (type != null) {
-                                                       return BasicSupport.getSupport(type).process(url);
+                                                       return BasicSupport.getSupport(type).process(url,
+                                                                       pg);
                                                } else {
                                                        throw new IOException("Unknown type: "
                                                                        + entry.getKey().getType());
                                                } else {
                                                        throw new IOException("Unknown type: "
                                                                        + entry.getKey().getType());
@@ -128,6 +167,11 @@ public class Library {
                        }
                }
 
                        }
                }
 
+               if (pg != null) {
+                       pg.setMinMax(0, 1);
+                       pg.setProgress(1);
+               }
+
                return null;
        }
 
                return null;
        }
 
@@ -137,19 +181,21 @@ public class Library {
         * 
         * @param url
         *            the {@link URL} to import
         * 
         * @param url
         *            the {@link URL} to import
+        * @param pg
+        *            the optional progress reporter
         * 
         * @return the imported {@link Story}
         * 
         * @throws IOException
         *             in case of I/O error
         */
         * 
         * @return the imported {@link Story}
         * 
         * @throws IOException
         *             in case of I/O error
         */
-       public Story imprt(URL url) throws IOException {
+       public Story imprt(URL url, Progress pg) throws IOException {
                BasicSupport support = BasicSupport.getSupport(url);
                if (support == null) {
                        throw new IOException("URL not supported: " + url.toString());
                }
 
                BasicSupport support = BasicSupport.getSupport(url);
                if (support == null) {
                        throw new IOException("URL not supported: " + url.toString());
                }
 
-               return save(support.process(url), null);
+               return save(support.process(url, pg), null);
        }
 
        /**
        }
 
        /**
@@ -161,20 +207,27 @@ public class Library {
         *            the {@link OutputType} to transform it to
         * @param target
         *            the target to save to
         *            the {@link OutputType} to transform it to
         * @param target
         *            the target to save to
+        * @param pg
+        *            the optional progress reporter
         * 
         * @return the saved resource (the main saved {@link File})
         * 
         * @throws IOException
         *             in case of I/O error
         */
         * 
         * @return the saved resource (the main saved {@link File})
         * 
         * @throws IOException
         *             in case of I/O error
         */
-       public File export(String luid, OutputType type, String target)
+       public File export(String luid, OutputType type, String target, Progress pg)
                        throws IOException {
                BasicOutput out = BasicOutput.getOutput(type, true);
                if (out == null) {
                        throw new IOException("Output type not supported: " + type);
                }
 
                        throws IOException {
                BasicOutput out = BasicOutput.getOutput(type, true);
                if (out == null) {
                        throw new IOException("Output type not supported: " + type);
                }
 
-               return out.process(getStory(luid), target);
+               Story story = getStory(luid, pg);
+               if (story == null) {
+                       throw new IOException("Cannot find story to export: " + luid);
+               }
+
+               return out.process(story, target);
        }
 
        /**
        }
 
        /**
@@ -206,8 +259,10 @@ public class Library {
         * @throws IOException
         *             in case of I/O error
         */
         * @throws IOException
         *             in case of I/O error
         */
-       private Story save(Story story, String luid) throws IOException {
-               MetaData key = story.getMeta();
+       public Story save(Story story, String luid) throws IOException {
+               // Do not change the original metadata, but change the original story
+               MetaData key = story.getMeta().clone();
+               story.setMeta(key);
 
                if (luid == null || luid.isEmpty()) {
                        getStories(); // refresh lastId if needed
 
                if (luid == null || luid.isEmpty()) {
                        getStories(); // refresh lastId if needed