move isCache/cleanCache to BasicLibrary, improve filter()
[fanfix.git] / src / be / nikiroo / fanfix / library / BasicLibrary.java
index 3e3756fe90d1677ac2b9820bf300b10cc3b484ea..c6ce22dd24c1c4fa85f60edfdcea7bd5f8de1b05 100644 (file)
@@ -122,6 +122,13 @@ abstract public class BasicLibrary {
         */
        public abstract Image getCover(String luid) throws IOException;
 
+       // TODO: ensure it is the main used interface
+       public synchronized MetaResultList getList(Progress pg) throws IOException {
+               return new MetaResultList(getMetas(pg));
+       }
+       
+       //TODO: make something for (normal and custom) not-story covers
+       
        /**
         * Return the cover image associated to this source.
         * <p>
@@ -191,8 +198,8 @@ abstract public class BasicLibrary {
         * @throws IOException
         *             in case of IOException
         */
-       public Image getCustomSourceCover(@SuppressWarnings("unused") String source)
-                       throws IOException {
+       @SuppressWarnings("unused")
+       public Image getCustomSourceCover(String source) throws IOException {
                return null;
        }
 
@@ -209,8 +216,8 @@ abstract public class BasicLibrary {
         * @throws IOException
         *             in case of IOException
         */
-       public Image getCustomAuthorCover(@SuppressWarnings("unused") String author)
-                       throws IOException {
+       @SuppressWarnings("unused")
+       public Image getCustomAuthorCover(String author) throws IOException {
                return null;
        }
 
@@ -245,6 +252,8 @@ abstract public class BasicLibrary {
        /**
         * Return the list of stories (represented by their {@link MetaData}, which
         * <b>MAY</b> not have the cover included).
+        * <p>
+        * The returned list <b>MUST</b> be a copy, not the original one.
         * 
         * @param pg
         *            the optional {@link Progress}
@@ -328,9 +337,6 @@ abstract public class BasicLibrary {
         * 
         * @param pg
         *            the optional progress reporter
-        * 
-        * @throws IOException
-        *             in case of IOException
         */
        public void refresh(Progress pg) {
                try {
@@ -339,6 +345,36 @@ abstract public class BasicLibrary {
                        // We will let it fail later
                }
        }
+       
+       /**
+        * Check if the {@link Story} denoted by this Library UID is present in the
+        * cache (if we have no cache, we default to </t>true</tt>).
+        * 
+        * @param luid
+        *            the Library UID
+        * 
+        * @return TRUE if it is
+        */
+       public boolean isCached(String luid) {
+               // By default, everything is cached
+               return true;
+       }
+       
+       /**
+        * Clear the {@link Story} from the cache, if needed.
+        * <p>
+        * The next time we try to retrieve the {@link Story}, it may be required to
+        * cache it again.
+        * 
+        * @param luid
+        *            the story to clear
+        * 
+        * @throws IOException
+        *             in case of I/O error
+        */
+       public void clearFromCache(String luid) throws IOException {
+               // By default, this is a noop.
+       }
 
        /**
         * List all the known types (sources) of stories.
@@ -525,13 +561,9 @@ abstract public class BasicLibrary {
         *            the starting character, <tt>*</tt>, <tt>0</tt> or a capital
         *            letter
         * 
-        * @return the authors that fulfill the starting letter
-        * 
-        * @throws IOException
-        *             in case of IOException
+        * @return the authors that fulfil the starting letter
         */
-       private List<String> getAuthorsGroup(List<String> authors, char car)
-                       throws IOException {
+       private List<String> getAuthorsGroup(List<String> authors, char car) {
                List<String> accepted = new ArrayList<String>();
                for (String author : authors) {
                        char first = '*';
@@ -570,31 +602,23 @@ abstract public class BasicLibrary {
        }
 
        /**
-        * List all the stories of the given source type in the {@link BasicLibrary}
-        * or all the stories if NULL is passed as a type.
+        * List all the stories of the given source type in the {@link BasicLibrary} ,
+        * or all the stories if NULL is passed as a type.
         * <p>
         * Cover images not included.
         * 
-        * @param type
-        *            the type of story to retrieve, or NULL for all
+        * @param source the type of story to retrieve, or NULL for all
         * 
         * @return the stories
         * 
-        * @throws IOException
-        *             in case of IOException
+        * @throws IOException in case of IOException
+        * 
+        * @deprecated use {@link BasicLibrary#getList(Progress)} and
+        *             {@link MetaResultList#filter(String, String, String)}
         */
-       public synchronized List<MetaData> getListBySource(String type)
-                       throws IOException {
-               List<MetaData> list = new ArrayList<MetaData>();
-               for (MetaData meta : getMetas(null)) {
-                       String storyType = meta.getSource();
-                       if (type == null || type.equalsIgnoreCase(storyType)) {
-                               list.add(meta);
-                       }
-               }
-
-               Collections.sort(list);
-               return list;
+       @Deprecated
+       public synchronized List<MetaData> getListBySource(String source) throws IOException {
+               return getList(null).filter(source, null, null);
        }
 
        /**
@@ -610,19 +634,12 @@ abstract public class BasicLibrary {
         * 
         * @throws IOException
         *             in case of IOException
+        *             
+        *             @deprecated use {@link BasicLibrary#getList(Progress)} and
+        *             {@link MetaResultList#filter(String, String, String)}
         */
-       public synchronized List<MetaData> getListByAuthor(String author)
-                       throws IOException {
-               List<MetaData> list = new ArrayList<MetaData>();
-               for (MetaData meta : getMetas(null)) {
-                       String storyAuthor = meta.getAuthor();
-                       if (author == null || author.equalsIgnoreCase(storyAuthor)) {
-                               list.add(meta);
-                       }
-               }
-
-               Collections.sort(list);
-               return list;
+       public synchronized List<MetaData> getListByAuthor(String author) throws IOException {
+               return getList(null).filter(null, author, null);
        }
 
        /**
@@ -737,10 +754,8 @@ abstract public class BasicLibrary {
                } catch (IOException e) {
                        // We should not have not-supported files in the
                        // library
-                       Instance.getTraceHandler().error(
-                                       new IOException(String.format(
-                                                       "Cannot load file of type '%s' from library: %s",
-                                                       meta.getType(), file), e));
+                       Instance.getInstance().getTraceHandler().error(new IOException(
+                                       String.format("Cannot load file of type '%s' from library: %s", meta.getType(), file), e));
                } finally {
                        pgProcess.done();
                        pg.done();
@@ -758,14 +773,14 @@ abstract public class BasicLibrary {
         * @param pg
         *            the optional progress reporter
         * 
-        * @return the imported {@link Story}
+        * @return the imported Story {@link MetaData}
         * 
         * @throws UnknownHostException
         *             if the host is not supported
         * @throws IOException
         *             in case of I/O error
         */
-       public Story imprt(URL url, Progress pg) throws IOException {
+       public MetaData imprt(URL url, Progress pg) throws IOException {
                if (pg == null)
                        pg = new Progress();
 
@@ -783,7 +798,7 @@ abstract public class BasicLibrary {
                Story story = save(support.process(pgProcess), pgSave);
                pg.done();
 
-               return story;
+               return story.getMeta();
        }
 
        /**
@@ -899,8 +914,7 @@ abstract public class BasicLibrary {
        public synchronized Story save(Story story, String luid, Progress pg)
                        throws IOException {
 
-               Instance.getTraceHandler().trace(
-                               this.getClass().getSimpleName() + ": saving story " + luid);
+               Instance.getInstance().getTraceHandler().trace(this.getClass().getSimpleName() + ": saving story " + luid);
 
                // Do not change the original metadata, but change the original story
                MetaData meta = story.getMeta().clone();
@@ -920,9 +934,8 @@ abstract public class BasicLibrary {
 
                updateInfo(story.getMeta());
 
-               Instance.getTraceHandler().trace(
-                               this.getClass().getSimpleName() + ": story saved (" + luid
-                                               + ")");
+               Instance.getInstance().getTraceHandler()
+                               .trace(this.getClass().getSimpleName() + ": story saved (" + luid + ")");
 
                return story;
        }
@@ -937,14 +950,13 @@ abstract public class BasicLibrary {
         *             in case of I/O error
         */
        public synchronized void delete(String luid) throws IOException {
-               Instance.getTraceHandler().trace(
-                               this.getClass().getSimpleName() + ": deleting story " + luid);
+               Instance.getInstance().getTraceHandler().trace(this.getClass().getSimpleName() + ": deleting story " + luid);
 
                doDelete(luid);
                invalidateInfo(luid);
 
-               Instance.getTraceHandler().trace(
-                               this.getClass().getSimpleName() + ": story deleted (" + luid
+               Instance.getInstance().getTraceHandler()
+                               .trace(this.getClass().getSimpleName() + ": story deleted (" + luid
                                                + ")");
        }