X-Git-Url: http://git.nikiroo.be/?a=blobdiff_plain;f=src%2Fbe%2Fnikiroo%2Ffanfix%2Flibrary%2FBasicLibrary.java;h=c558384d380526819f36a8dac9553b89d33517ca;hb=d66deb8d8b30cff6b54db352eef34a3508939f84;hp=b8b8185cd50f75b915d732901ce8a79814bb9727;hpb=60f723111f3f7f5bd60760afa7d0b645406b48d7;p=nikiroo-utils.git diff --git a/src/be/nikiroo/fanfix/library/BasicLibrary.java b/src/be/nikiroo/fanfix/library/BasicLibrary.java index b8b8185..c558384 100644 --- a/src/be/nikiroo/fanfix/library/BasicLibrary.java +++ b/src/be/nikiroo/fanfix/library/BasicLibrary.java @@ -39,14 +39,36 @@ abstract public class BasicLibrary { * @author niki */ public enum Status { - /** The library is ready. */ - READY, + /** The library is ready and r/w. */ + READ_WRITE, + /** The library is ready, but read-only. */ + READ_ONLY, /** The library is invalid (not correctly set up). */ INVALID, /** You are not allowed to access this library. */ - UNAUTORIZED, + UNAUTHORIZED, /** The library is currently out of commission. */ - UNAVAILABLE, + UNAVAILABLE; + + /** + * The library is available (you can query it). + *

+ * It does not specify if it is read-only or not. + * + * @return TRUE if it is + */ + public boolean isReady() { + return (this == READ_WRITE || this == READ_ONLY); + } + + /** + * This library can be modified (= you are allowed to modify it). + * + * @return TRUE if it is + */ + public boolean isWritable() { + return (this == READ_WRITE); + } } /** @@ -66,7 +88,7 @@ abstract public class BasicLibrary { * @return the current status */ public Status getStatus() { - return Status.READY; + return Status.READ_WRITE; } /** @@ -81,8 +103,11 @@ abstract public class BasicLibrary { * the optional {@link Progress} * * @return the corresponding {@link Story} + * + * @throws IOException + * in case of IOException */ - public abstract File getFile(String luid, Progress pg); + public abstract File getFile(String luid, Progress pg) throws IOException; /** * Return the cover image associated to this story. @@ -91,8 +116,11 @@ abstract public class BasicLibrary { * the Library UID of the story * * @return the cover image + * + * @throws IOException + * in case of IOException */ - public abstract Image getCover(String luid); + public abstract Image getCover(String luid) throws IOException; /** * Return the cover image associated to this source. @@ -104,8 +132,11 @@ abstract public class BasicLibrary { * the source * * @return the cover image or NULL + * + * @throws IOException + * in case of IOException */ - public Image getSourceCover(String source) { + public Image getSourceCover(String source) throws IOException { Image custom = getCustomSourceCover(source); if (custom != null) { return custom; @@ -129,8 +160,11 @@ abstract public class BasicLibrary { * the author * * @return the cover image or NULL + * + * @throws IOException + * in case of IOException */ - public Image getAuthorCover(String author) { + public Image getAuthorCover(String author) throws IOException { Image custom = getCustomAuthorCover(author); if (custom != null) { return custom; @@ -153,8 +187,12 @@ abstract public class BasicLibrary { * the source to look for * * @return the custom cover or NULL if none + * + * @throws IOException + * in case of IOException */ - public Image getCustomSourceCover(@SuppressWarnings("unused") String source) { + @SuppressWarnings("unused") + public Image getCustomSourceCover(String source) throws IOException { return null; } @@ -167,8 +205,12 @@ abstract public class BasicLibrary { * the author to look for * * @return the custom cover or NULL if none + * + * @throws IOException + * in case of IOException */ - public Image getCustomAuthorCover(@SuppressWarnings("unused") String author) { + @SuppressWarnings("unused") + public Image getCustomAuthorCover(String author) throws IOException { return null; } @@ -179,18 +221,26 @@ abstract public class BasicLibrary { * the source to change * @param luid * the story LUID + * + * @throws IOException + * in case of IOException */ - public abstract void setSourceCover(String source, String luid); + public abstract void setSourceCover(String source, String luid) + throws IOException; /** * Set the author cover to the given story cover. * - * @param source + * @param author * the author to change * @param luid * the story LUID + * + * @throws IOException + * in case of IOException */ - public abstract void setAuthorCover(String author, String luid); + public abstract void setAuthorCover(String author, String luid) + throws IOException; /** * Return the list of stories (represented by their {@link MetaData}, which @@ -200,8 +250,11 @@ abstract public class BasicLibrary { * the optional {@link Progress} * * @return the list (can be empty but not NULL) + * + * @throws IOException + * in case of IOException */ - protected abstract List getMetas(Progress pg); + protected abstract List getMetas(Progress pg) throws IOException; /** * Invalidate the {@link Story} cache (when the content should be re-read @@ -228,8 +281,11 @@ abstract public class BasicLibrary { * * @param meta * the {@link Story} to clear from the cache + * + * @throws IOException + * in case of IOException */ - protected abstract void updateInfo(MetaData meta); + protected abstract void updateInfo(MetaData meta) throws IOException; /** * Return the next LUID that can be used. @@ -274,15 +330,22 @@ abstract public class BasicLibrary { * the optional progress reporter */ public void refresh(Progress pg) { - getMetas(pg); + try { + getMetas(pg); + } catch (IOException e) { + // We will let it fail later + } } /** * List all the known types (sources) of stories. * * @return the sources + * + * @throws IOException + * in case of IOException */ - public synchronized List getSources() { + public synchronized List getSources() throws IOException { List list = new ArrayList(); for (MetaData meta : getMetas(null)) { String storySource = meta.getSource(); @@ -308,8 +371,12 @@ abstract public class BasicLibrary { * * * @return the grouped list + * + * @throws IOException + * in case of IOException */ - public synchronized Map> getSourcesGrouped() { + public synchronized Map> getSourcesGrouped() + throws IOException { Map> map = new TreeMap>(); for (String source : getSources()) { String name; @@ -340,8 +407,11 @@ abstract public class BasicLibrary { * List all the known authors of stories. * * @return the authors + * + * @throws IOException + * in case of IOException */ - public synchronized List getAuthors() { + public synchronized List getAuthors() throws IOException { List list = new ArrayList(); for (MetaData meta : getMetas(null)) { String storyAuthor = meta.getAuthor(); @@ -372,8 +442,11 @@ abstract public class BasicLibrary { * 0-9, which may only be present or not). * * @return the authors' names, grouped by letter(s) + * + * @throws IOException + * in case of IOException */ - public Map> getAuthorsGrouped() { + public Map> getAuthorsGrouped() throws IOException { int MAX = 20; Map> groups = new TreeMap>(); @@ -448,7 +521,8 @@ abstract public class BasicLibrary { * @param car * the starting character, *, 0 or a capital * letter - * @return the authors that fulfill the starting letter + * + * @return the authors that fulfil the starting letter */ private List getAuthorsGroup(List authors, char car) { List accepted = new ArrayList(); @@ -480,8 +554,11 @@ abstract public class BasicLibrary { * Cover images MAYBE not included. * * @return the stories + * + * @throws IOException + * in case of IOException */ - public synchronized List getList() { + public synchronized List getList() throws IOException { return getMetas(null); } @@ -495,8 +572,12 @@ abstract public class BasicLibrary { * the type of story to retrieve, or NULL for all * * @return the stories + * + * @throws IOException + * in case of IOException */ - public synchronized List getListBySource(String type) { + public synchronized List getListBySource(String type) + throws IOException { List list = new ArrayList(); for (MetaData meta : getMetas(null)) { String storyType = meta.getSource(); @@ -519,8 +600,12 @@ abstract public class BasicLibrary { * the author of the stories to retrieve, or NULL for all * * @return the stories + * + * @throws IOException + * in case of IOException */ - public synchronized List getListByAuthor(String author) { + public synchronized List getListByAuthor(String author) + throws IOException { List list = new ArrayList(); for (MetaData meta : getMetas(null)) { String storyAuthor = meta.getAuthor(); @@ -541,8 +626,11 @@ abstract public class BasicLibrary { * the Library UID of the story * * @return the corresponding {@link Story} + * + * @throws IOException + * in case of IOException */ - public synchronized MetaData getInfo(String luid) { + public synchronized MetaData getInfo(String luid) throws IOException { if (luid != null) { for (MetaData meta : getMetas(null)) { if (luid.equals(meta.getLuid())) { @@ -563,8 +651,12 @@ abstract public class BasicLibrary { * the optional progress reporter * * @return the corresponding {@link Story} or NULL if not found + * + * @throws IOException + * in case of IOException */ - public synchronized Story getStory(String luid, Progress pg) { + public synchronized Story getStory(String luid, Progress pg) + throws IOException { Progress pgMetas = new Progress(); Progress pgStory = new Progress(); if (pg != null) { @@ -598,8 +690,13 @@ abstract public class BasicLibrary { * the optional progress reporter * * @return the corresponding {@link Story} or NULL if not found + * + * @throws IOException + * in case of IOException */ - public synchronized Story getStory(String luid, MetaData meta, Progress pg) { + public synchronized Story getStory(String luid, + @SuppressWarnings("javadoc") MetaData meta, Progress pg) + throws IOException { if (pg == null) { pg = new Progress(); @@ -633,9 +730,8 @@ abstract public class BasicLibrary { } catch (IOException e) { // We should not have not-supported files in the // library - Instance.getTraceHandler() - .error(new IOException("Cannot load file from library: " - + 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(); @@ -653,14 +749,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(); @@ -678,7 +774,7 @@ abstract public class BasicLibrary { Story story = save(support.process(pgProcess), pgSave); pg.done(); - return story; + return story.getMeta(); } /** @@ -794,8 +890,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(); @@ -815,9 +910,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; } @@ -832,14 +926,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 + ")"); } @@ -941,6 +1034,8 @@ abstract public class BasicLibrary { meta.setTitle(newTitle); meta.setAuthor(newAuthor); saveMeta(meta, pg); + + invalidateInfo(luid); } /**