X-Git-Url: http://git.nikiroo.be/?p=fanfix.git;a=blobdiff_plain;f=src%2Fbe%2Fnikiroo%2Ffanfix%2FLibrary.java;h=3868bd3fee03d946214db55f8594f14bf34a5887;hp=7819eff65d15e665a97b124ac412260e79821927;hb=6cac0e45756735a3567822f45a7cc3e6bef61fd5;hpb=57f02339393c9997391b76ffcb22ae72fd0a45cb diff --git a/src/be/nikiroo/fanfix/Library.java b/src/be/nikiroo/fanfix/Library.java index 7819eff..3868bd3 100644 --- a/src/be/nikiroo/fanfix/Library.java +++ b/src/be/nikiroo/fanfix/Library.java @@ -17,6 +17,7 @@ import be.nikiroo.fanfix.data.MetaData; import be.nikiroo.fanfix.data.Story; import be.nikiroo.fanfix.output.BasicOutput; import be.nikiroo.fanfix.output.BasicOutput.OutputType; +import be.nikiroo.fanfix.output.InfoCover; import be.nikiroo.fanfix.supported.BasicSupport; import be.nikiroo.fanfix.supported.BasicSupport.SupportType; import be.nikiroo.fanfix.supported.InfoReader; @@ -35,8 +36,10 @@ import be.nikiroo.utils.Progress; * @author niki */ public class Library { - private File baseDir; - private Map stories; + protected File baseDir; + protected boolean localSpeed; + protected Map stories; + private int lastId; private OutputType text; private OutputType image; @@ -52,8 +55,10 @@ public class Library { * the {@link OutputType} to save the images-focused stories into */ public Library(File dir, OutputType text, OutputType image) { + this(); + this.baseDir = dir; - this.stories = new HashMap(); + this.lastId = 0; this.text = text; this.image = image; @@ -61,6 +66,15 @@ public class Library { dir.mkdirs(); } + /** + * Create a new {@link Library} with no link to the local machine. + *

+ * Reserved for extensions. + */ + protected Library() { + this.stories = new HashMap(); + } + /** * Refresh the {@link Library}, that is, make sure all stories are loaded. * @@ -72,7 +86,7 @@ public class Library { } /** - * List all the known types of stories. + * List all the known types (sources) of stories. * * @return the types */ @@ -142,12 +156,12 @@ public class Library { * * @return the stories */ - public synchronized List getListByType(String type) { + public synchronized List getListBySource(String type) { List list = new ArrayList(); - for (Entry entry : getStories(null).entrySet()) { - String storyType = entry.getValue().getParentFile().getName(); + for (MetaData meta : getStories(null).keySet()) { + String storyType = meta.getSource(); if (type == null || type.equalsIgnoreCase(storyType)) { - list.add(entry.getKey()); + list.add(meta); } } @@ -156,8 +170,8 @@ public class Library { } /** - * Retrieve a {@link File} corresponding to the given {@link Story}, cover - * image not included. + * Retrieve a {@link MetaData} corresponding to the given {@link Story}, + * cover image MAY not be included. * * @param luid * the Library UID of the story @@ -207,8 +221,10 @@ public class Library { public synchronized BufferedImage getCover(String luid) { MetaData meta = getInfo(luid); if (meta != null) { + getFile(luid); // to help remote implementation try { - File infoFile = new File(getFile(meta).getPath() + ".info"); + File infoFile = new File(getExpectedFile(meta).getPath() + + ".info"); meta = readMeta(infoFile, true).getKey(); return meta.getCover(); } catch (IOException e) { @@ -233,23 +249,24 @@ public class Library { if (luid != null) { for (Entry entry : getStories(null).entrySet()) { if (luid.equals(entry.getKey().getLuid())) { + MetaData meta = entry.getKey(); + File file = getFile(luid); // to help remote implementation try { - SupportType type = SupportType.valueOfAllOkUC(entry - .getKey().getType()); - URL url = entry.getValue().toURI().toURL(); + SupportType type = SupportType.valueOfAllOkUC(meta + .getType()); + URL url = file.toURI().toURL(); if (type != null) { return BasicSupport.getSupport(type).process(url, pg); } else { throw new IOException("Unknown type: " - + entry.getKey().getType()); + + meta.getType()); } } catch (IOException e) { // We should not have not-supported files in the // library Instance.syserr(new IOException( - "Cannot load file from library: " - + entry.getValue().getPath(), e)); + "Cannot load file from library: " + file, e)); } } } @@ -372,8 +389,8 @@ public class Library { key.setLuid(luid); } - getDir(key).mkdirs(); - if (!getDir(key).exists()) { + getExpectedDir(key.getSource()).mkdirs(); + if (!getExpectedDir(key.getSource()).exists()) { throw new IOException("Cannot create library dir"); } @@ -385,7 +402,7 @@ public class Library { } BasicOutput it = BasicOutput.getOutput(out, true); - it.process(story, getFile(key).getPath(), pg); + it.process(story, getExpectedFile(key).getPath(), pg); // empty cache stories.clear(); @@ -404,63 +421,149 @@ public class Library { public synchronized boolean delete(String luid) { boolean ok = false; + List files = getFiles(luid); + if (!files.isEmpty()) { + for (File file : files) { + IOUtils.deltree(file); + } + + ok = true; + + // clear cache + stories.clear(); + } + + return ok; + } + + /** + * Change the type (source) of the given {@link Story}. + * + * @param luid + * the {@link Story} LUID + * @param newType + * the new type + * + * @return TRUE if the {@link Story} was found + */ + public synchronized boolean changeType(String luid, String newType) { MetaData meta = getInfo(luid); - File file = getStories(null).get(meta); + if (meta != null) { + meta.setSource(newType); + File newDir = getExpectedDir(meta.getSource()); + if (!newDir.exists()) { + newDir.mkdir(); + } - if (file != null) { - if (file.delete()) { - String readerExt = getOutputType(meta) - .getDefaultExtension(true); - String fileExt = getOutputType(meta).getDefaultExtension(false); - - String path = file.getAbsolutePath(); - if (readerExt != null && !readerExt.equals(fileExt)) { - path = path - .substring(0, path.length() - readerExt.length()) - + fileExt; - file = new File(path); - IOUtils.deltree(file); + List files = getFiles(luid); + for (File file : files) { + if (file.getName().endsWith(".info")) { + try { + String name = file.getName().replaceFirst("\\.info$", + ""); + InfoCover.writeInfo(newDir, name, meta); + file.delete(); + } catch (IOException e) { + Instance.syserr(e); + } + } else { + file.renameTo(new File(newDir, file.getName())); } + } - File infoFile = new File(path + ".info"); - if (!infoFile.exists()) { - infoFile = new File(path.substring(0, path.length() - - fileExt.length()) - + ".info"); - } - infoFile.delete(); - - String coverExt = "." - + Instance.getConfig().getString( - Config.IMAGE_FORMAT_COVER); - File coverFile = new File(path + coverExt); - if (!coverFile.exists()) { - coverFile = new File(path.substring(0, path.length() - - fileExt.length())); + // clear cache + stories.clear(); + + return true; + } + + return false; + } + + /** + * The library is accessed locally or at local speed (for operations like + * {@link Library#getFile(String)}). + *

+ * It could be cached, too, it is only about the access speed. + * + * @return TRUE if it is accessed locally + */ + public boolean isLocalSpeed() { + return localSpeed; + } + + /** + * Return the list of files/dirs on disk for this {@link Story}. + *

+ * If the {@link Story} is not found, and empty list is returned. + * + * @param luid + * the {@link Story} LUID + * + * @return the list of {@link File}s + */ + private List getFiles(String luid) { + List files = new ArrayList(); + + MetaData meta = getInfo(luid); + File file = getFile(luid); // to help remote implementation + + if (file != null) { + files.add(file); + + String readerExt = getOutputType(meta).getDefaultExtension(true); + String fileExt = getOutputType(meta).getDefaultExtension(false); + + String path = file.getAbsolutePath(); + if (readerExt != null && !readerExt.equals(fileExt)) { + path = path.substring(0, path.length() - readerExt.length()) + + fileExt; + file = new File(path); + + if (file.exists()) { + files.add(file); } - coverFile.delete(); + } - ok = true; + File infoFile = new File(path + ".info"); + if (!infoFile.exists()) { + infoFile = new File(path.substring(0, + path.length() - fileExt.length()) + + ".info"); } - // clear cache - stories.clear(); + if (infoFile.exists()) { + files.add(infoFile); + } + + String coverExt = "." + + Instance.getConfig().getString(Config.IMAGE_FORMAT_COVER); + File coverFile = new File(path + coverExt); + if (!coverFile.exists()) { + coverFile = new File(path.substring(0, + path.length() - fileExt.length()) + + coverExt); + } + + if (coverFile.exists()) { + files.add(coverFile); + } } - return ok; + return files; } /** * The directory (full path) where the {@link Story} related to this * {@link MetaData} should be located on disk. * - * @param key - * the {@link Story} {@link MetaData} + * @param type + * the type (source) * * @return the target directory */ - private File getDir(MetaData key) { - String source = key.getSource().replaceAll("[^a-zA-Z0-9._+-]", "_"); + private File getExpectedDir(String type) { + String source = type.replaceAll("[^a-zA-Z0-9._+-]", "_"); return new File(baseDir, source); } @@ -473,13 +576,14 @@ public class Library { * * @return the target */ - private File getFile(MetaData key) { + private File getExpectedFile(MetaData key) { String title = key.getTitle(); if (title == null) { title = ""; } title = title.replaceAll("[^a-zA-Z0-9._+-]", "_"); - return new File(getDir(key), key.getLuid() + "_" + title); + return new File(getExpectedDir(key.getSource()), key.getLuid() + "_" + + title); } /** @@ -490,7 +594,7 @@ public class Library { * * @return the stories */ - private synchronized Map getStories(Progress pg) { + protected synchronized Map getStories(Progress pg) { if (pg == null) { pg = new Progress(); } else {