X-Git-Url: http://git.nikiroo.be/?a=blobdiff_plain;f=src%2Fbe%2Fnikiroo%2Ffanfix%2Flibrary%2FBasicLibrary.java;h=29a3cf97efc162fb86f7035585e853fbbc25ce0a;hb=ed2fd793b8768d7865afb2176375a6459e2408d2;hp=cf17a2bef49fce8591150c6e93eb50eb9b41a30b;hpb=b89dfb6ece936486563734818ed62488a59e5897;p=fanfix.git diff --git a/src/be/nikiroo/fanfix/library/BasicLibrary.java b/src/be/nikiroo/fanfix/library/BasicLibrary.java index cf17a2b..29a3cf9 100644 --- a/src/be/nikiroo/fanfix/library/BasicLibrary.java +++ b/src/be/nikiroo/fanfix/library/BasicLibrary.java @@ -1,9 +1,9 @@ package be.nikiroo.fanfix.library; -import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import java.net.URL; +import java.net.UnknownHostException; import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -14,7 +14,8 @@ 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.supported.BasicSupport.SupportType; +import be.nikiroo.fanfix.supported.SupportType; +import be.nikiroo.utils.Image; import be.nikiroo.utils.Progress; /** @@ -29,6 +30,42 @@ import be.nikiroo.utils.Progress; * @author niki */ abstract public class BasicLibrary { + /** + * A {@link BasicLibrary} status. + * + * @author niki + */ + public enum Status { + /** The library is ready. */ + READY, + /** The library is invalid (not correctly set up). */ + INVALID, + /** You are not allowed to access this library. */ + UNAUTORIZED, + /** The library is currently out of commission. */ + UNAVAILABLE, + } + + /** + * Return a name for this library (the UI may display this). + *

+ * Must not be NULL. + * + * @return the name, or an empty {@link String} if none + */ + public String getLibraryName() { + return ""; + } + + /** + * The library status. + * + * @return the current status + */ + public Status getStatus() { + return Status.READY; + } + /** * Retrieve the main {@link File} corresponding to the given {@link Story}, * which can be passed to an external reader or instance. @@ -37,10 +74,12 @@ abstract public class BasicLibrary { * * @param luid * the Library UID of the story + * @param pg + * the optional {@link Progress} * * @return the corresponding {@link Story} */ - public abstract File getFile(String luid); + public abstract File getFile(String luid, Progress pg); /** * Return the cover image associated to this story. @@ -50,19 +89,25 @@ abstract public class BasicLibrary { * * @return the cover image */ - public abstract BufferedImage getCover(String luid); + public abstract Image getCover(String luid); /** * Return the cover image associated to this source. *

- * By default, return the cover of the first story with this source. + * By default, return the custom cover if any, and if not, return the cover + * of the first story with this source. * * @param source * the source * * @return the cover image or NULL */ - public BufferedImage getSourceCover(String source) { + public Image getSourceCover(String source) { + Image custom = getCustomSourceCover(source); + if (custom != null) { + return custom; + } + List metas = getListBySource(source); if (metas.size() > 0) { return getCover(metas.get(0).getLuid()); @@ -71,6 +116,20 @@ abstract public class BasicLibrary { return null; } + /** + * Return the custom cover image associated to this source. + *

+ * By default, return NULL. + * + * @param source + * the source to look for + * + * @return the custom cover or NULL if none + */ + public Image getCustomSourceCover(@SuppressWarnings("unused") String source) { + return null; + } + /** * Fix the source cover to the given story cover. * @@ -96,7 +155,29 @@ abstract public class BasicLibrary { * Invalidate the {@link Story} cache (when the content should be re-read * because it was changed). */ - protected abstract void clearCache(); + protected void deleteInfo() { + deleteInfo(null); + } + + /** + * Invalidate the {@link Story} cache (when the content is removed). + *

+ * All the cache can be deleted if NULL is passed as meta. + * + * @param luid + * the LUID of the {@link Story} to clear from the cache, or NULL + * for all stories + */ + protected abstract void deleteInfo(String luid); + + /** + * Invalidate the {@link Story} cache (when the content has changed, but we + * already have it) with the new given meta. + * + * @param meta + * the {@link Story} to clear from the cache + */ + protected abstract void updateInfo(MetaData meta); /** * Return the next LUID that can be used. @@ -134,26 +215,14 @@ abstract public class BasicLibrary { throws IOException; /** - * Refresh the {@link BasicLibrary}, that is, make sure all stories are + * Refresh the {@link BasicLibrary}, that is, make sure all metas are * loaded. * - * @param full - * force the full content of the stories to be loaded, not just - * the {@link MetaData} - * * @param pg * the optional progress reporter */ - public void refresh(boolean full, Progress pg) { - if (full) { - // TODO: progress - List metas = getMetas(pg); - for (MetaData meta : metas) { - getStory(meta.getLuid(), null); - } - } else { - getMetas(pg); - } + public void refresh(Progress pg) { + getMetas(pg); } /** @@ -283,30 +352,46 @@ abstract public class BasicLibrary { * @return the corresponding {@link Story} or NULL if not found */ public synchronized Story getStory(String luid, Progress pg) { - // TODO: pg if (pg == null) { pg = new Progress(); } + Progress pgGet = new Progress(); + Progress pgProcess = new Progress(); + + pg.setMinMax(0, 2); + pg.addProgress(pgGet, 1); + pg.addProgress(pgProcess, 1); + Story story = null; for (MetaData meta : getMetas(null)) { if (meta.getLuid().equals(luid)) { - File file = getFile(luid); + File file = getFile(luid, pgGet); + pgGet.done(); try { SupportType type = SupportType.valueOfAllOkUC(meta .getType()); URL url = file.toURI().toURL(); if (type != null) { - story = BasicSupport.getSupport(type).process(url, pg); + story = BasicSupport.getSupport(type, url) // + .process(pgProcess); + + // Because we do not want to clear the meta cache: + meta.setCover(story.getMeta().getCover()); + meta.setResume(story.getMeta().getResume()); + story.setMeta(meta); + // } else { throw new IOException("Unknown type: " + meta.getType()); } } catch (IOException e) { // We should not have not-supported files in the // library - Instance.syserr(new IOException( - "Cannot load file from library: " + file, e)); + Instance.getTraceHandler().error( + new IOException("Cannot load file from library: " + + file, e)); } finally { + pgProcess.done(); pg.done(); } @@ -328,16 +413,30 @@ abstract public class BasicLibrary { * * @return the imported {@link Story} * + * @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 { + if (pg == null) + pg = new Progress(); + + pg.setMinMax(0, 1000); + Progress pgProcess = new Progress(); + Progress pgSave = new Progress(); + pg.addProgress(pgProcess, 800); + pg.addProgress(pgSave, 200); + BasicSupport support = BasicSupport.getSupport(url); if (support == null) { - throw new IOException("URL not supported: " + url.toString()); + throw new UnknownHostException("" + url); } - return save(support.process(url, pg), null); + Story story = save(support.process(pgProcess), pgSave); + pg.done(); + + return story; } /** @@ -402,7 +501,7 @@ abstract public class BasicLibrary { pg.addProgress(pgOut, 1); } - BasicOutput out = BasicOutput.getOutput(type, false); + BasicOutput out = BasicOutput.getOutput(type, false, false); if (out == null) { throw new IOException("Output type not supported: " + type); } @@ -452,6 +551,10 @@ 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); + // Do not change the original metadata, but change the original story MetaData meta = story.getMeta().clone(); story.setMeta(meta); @@ -462,13 +565,17 @@ abstract public class BasicLibrary { meta.setLuid(luid); } - if (getInfo(luid) != null) { + if (luid != null && getInfo(luid) != null) { delete(luid); } - doSave(story, pg); + story = doSave(story, pg); - clearCache(); + updateInfo(story.getMeta()); + + Instance.getTraceHandler().trace( + this.getClass().getSimpleName() + ": story saved (" + luid + + ")"); return story; } @@ -483,8 +590,15 @@ 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); + doDelete(luid); - clearCache(); + deleteInfo(luid); + + Instance.getTraceHandler().trace( + this.getClass().getSimpleName() + ": story deleted (" + luid + + ")"); } /**