From 0d781e306746cf460f1f41338eb437f32cf9db33 Mon Sep 17 00:00:00 2001 From: Niki Roo Date: Sat, 1 Jul 2017 18:42:43 +0200 Subject: [PATCH 1/1] Update nikiroo-utils, update Library --- ...es.jar => nikiroo-utils-1.6.0-sources.jar} | Bin 65341 -> 69968 bytes src/be/nikiroo/fanfix/Library.java | 71 ++++++++++++------ 2 files changed, 50 insertions(+), 21 deletions(-) rename libs/{nikiroo-utils-1.5.1-sources.jar => nikiroo-utils-1.6.0-sources.jar} (68%) diff --git a/libs/nikiroo-utils-1.5.1-sources.jar b/libs/nikiroo-utils-1.6.0-sources.jar similarity index 68% rename from libs/nikiroo-utils-1.5.1-sources.jar rename to libs/nikiroo-utils-1.6.0-sources.jar index 786794b6334d9d21272d0395f38ec40b52f18f58..1ec2951b17dc08ac7051355d62f75c9813b28aac 100644 GIT binary patch delta 11462 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 Ce&c8W diff --git a/src/be/nikiroo/fanfix/Library.java b/src/be/nikiroo/fanfix/Library.java index 80a9e8c..8a3895a 100644 --- a/src/be/nikiroo/fanfix/Library.java +++ b/src/be/nikiroo/fanfix/Library.java @@ -36,7 +36,9 @@ import be.nikiroo.utils.Progress; * @author niki */ public class Library { - private File baseDir; + protected File baseDir; + protected boolean localSpeed; + private Map stories; private int lastId; private OutputType text; @@ -53,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; @@ -62,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. * @@ -146,7 +159,7 @@ public class Library { public synchronized List getListByType(String type) { if (type != null) { // convert the type to dir name - type = getDir(type).getName(); + type = getExpectedDir(type).getName(); } List list = new ArrayList(); @@ -162,8 +175,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 @@ -213,8 +226,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) { @@ -239,23 +254,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)); } } } @@ -378,8 +394,8 @@ public class Library { key.setLuid(luid); } - getDir(key.getSource()).mkdirs(); - if (!getDir(key.getSource()).exists()) { + getExpectedDir(key.getSource()).mkdirs(); + if (!getExpectedDir(key.getSource()).exists()) { throw new IOException("Cannot create library dir"); } @@ -391,7 +407,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(); @@ -439,7 +455,7 @@ public class Library { MetaData meta = getInfo(luid); if (meta != null) { meta.setSource(newType); - File newDir = getDir(meta.getSource()); + File newDir = getExpectedDir(meta.getSource()); if (!newDir.exists()) { newDir.mkdir(); } @@ -469,6 +485,18 @@ public class Library { 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}. *

@@ -483,7 +511,7 @@ public class Library { List files = new ArrayList(); MetaData meta = getInfo(luid); - File file = getStories(null).get(meta); + File file = getFile(luid); // to help remote implementation if (file != null) { files.add(file); @@ -539,7 +567,7 @@ public class Library { * * @return the target directory */ - private File getDir(String type) { + private File getExpectedDir(String type) { String source = type.replaceAll("[^a-zA-Z0-9._+-]", "_"); return new File(baseDir, source); } @@ -553,13 +581,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.getSource()), key.getLuid() + "_" + title); + return new File(getExpectedDir(key.getSource()), key.getLuid() + "_" + + title); } /** @@ -570,7 +599,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 { -- 2.27.0