X-Git-Url: http://git.nikiroo.be/?a=blobdiff_plain;ds=sidebyside;f=src%2Fbe%2Fnikiroo%2Ffanfix%2Flibrary%2FWebLibrary.java;h=9d1c773aae698457d920b5094668eebb74605202;hb=9742a9a5f5f054207b213af5c678866fa276f93c;hp=7f775830edf8c7641eeb3303abdddf3fcdb48fbd;hpb=c5e988207e92ec4ec39212012e4c31f0e02f06ec;p=fanfix.git
diff --git a/src/be/nikiroo/fanfix/library/WebLibrary.java b/src/be/nikiroo/fanfix/library/WebLibrary.java
index 7f77583..9d1c773 100644
--- a/src/be/nikiroo/fanfix/library/WebLibrary.java
+++ b/src/be/nikiroo/fanfix/library/WebLibrary.java
@@ -22,6 +22,7 @@ import be.nikiroo.fanfix.data.Story;
import be.nikiroo.utils.IOUtils;
import be.nikiroo.utils.Image;
import be.nikiroo.utils.Progress;
+import be.nikiroo.utils.Version;
/**
* This {@link BasicLibrary} will access a remote server to list the available
@@ -102,21 +103,39 @@ public class WebLibrary extends BasicLibrary {
this.host = host;
this.port = port;
+ }
+
+ /**
+ * Return the version of the program running server-side.
+ *
+ * Never returns NULL.
+ *
+ * @return the version or an empty {@link Version} if not known
+ */
+ public Version getVersion() {
+ try {
+ InputStream in = post(WebLibraryUrls.VERSION_URL);
+ try {
+ return new Version(IOUtils.readSmallStream(in));
+ } finally {
+ in.close();
+ }
+ } catch (IOException e) {
+ }
- // TODO: not supported yet
- this.rw = false;
+ return new Version();
}
@Override
public Status getStatus() {
try {
- download("/");
+ post(WebLibraryUrls.INDEX_URL).close();
} catch (IOException e) {
try {
- download("/style.css");
+ post("/style.css").close();
return Status.UNAUTHORIZED;
} catch (IOException ioe) {
- return Status.INVALID;
+ return Status.UNAVAILABLE;
}
}
@@ -125,51 +144,63 @@ public class WebLibrary extends BasicLibrary {
@Override
public String getLibraryName() {
- return (rw ? "[READ-ONLY] " : "") + host + ":" + port;
+ return (rw ? "[READ-ONLY] " : "") + host + ":" + port + " ("
+ + getVersion() + ")";
}
@Override
public Image getCover(String luid) throws IOException {
- InputStream in = download("/story/" + luid + "/cover");
- if (in != null) {
+ InputStream in = post(WebLibraryUrls.getStoryUrlCover(luid));
+ try {
return new Image(in);
+ } finally {
+ in.close();
}
-
- return null;
}
@Override
- public Image getCustomSourceCover(final String source) throws IOException {
- // TODO maybe global system in BasicLib ?
- return null;
+ public Image getCustomSourceCover(String source) throws IOException {
+ InputStream in = post(WebLibraryUrls.getCoverUrlSource(source));
+ try {
+ return new Image(in);
+ } finally {
+ in.close();
+ }
}
@Override
- public Image getCustomAuthorCover(final String author) throws IOException {
- // TODO maybe global system in BasicLib ?
- return null;
+ public Image getCustomAuthorCover(String author) throws IOException {
+ InputStream in = post(WebLibraryUrls.getCoverUrlAuthor(author));
+ try {
+ return new Image(in);
+ } finally {
+ in.close();
+ }
}
@Override
public void setSourceCover(String source, String luid) throws IOException {
- // TODO Auto-generated method stub
- throw new IOException("Not implemented yet");
+ Map post = new HashMap();
+ post.put("luid", luid);
+ post(WebLibraryUrls.getCoverUrlSource(source), post).close();
}
@Override
public void setAuthorCover(String author, String luid) throws IOException {
- // TODO Auto-generated method stub
- throw new IOException("Not implemented yet");
+ Map post = new HashMap();
+ post.put("luid", luid);
+ post(WebLibraryUrls.getCoverUrlAuthor(author), post).close();
}
@Override
public synchronized Story getStory(final String luid, Progress pg)
throws IOException {
-
- // TODO: pg
+ if (pg == null) {
+ pg = new Progress();
+ }
Story story;
- InputStream in = download("/story/" + luid + "/json");
+ InputStream in = post(WebLibraryUrls.getStoryUrlJson(luid));
try {
JSONObject json = new JSONObject(IOUtils.readSmallStream(in));
story = JsonIO.toStory(json);
@@ -177,14 +208,20 @@ public class WebLibrary extends BasicLibrary {
in.close();
}
+ int max = 0;
+ for (Chapter chap : story) {
+ max += chap.getParagraphs().size();
+ }
+ pg.setMinMax(0, max);
+
story.getMeta().setCover(getCover(luid));
int chapNum = 1;
for (Chapter chap : story) {
int number = 1;
for (Paragraph para : chap) {
if (para.getType() == ParagraphType.IMAGE) {
- InputStream subin = download(
- "/story/" + luid + "/" + chapNum + "/" + number);
+ InputStream subin = post(
+ WebLibraryUrls.getStoryUrl(luid, chapNum, number));
try {
para.setContentImage(new Image(subin));
} finally {
@@ -192,19 +229,21 @@ public class WebLibrary extends BasicLibrary {
}
}
+ pg.add(1);
number++;
}
chapNum++;
}
+ pg.done();
return story;
}
@Override
protected List getMetas(Progress pg) throws IOException {
List metas = new ArrayList();
- InputStream in = download("/list/luids");
+ InputStream in = post(WebLibraryUrls.LIST_URL_METADATA);
JSONArray jsonArr = new JSONArray(IOUtils.readSmallStream(in));
for (int i = 0; i < jsonArr.length(); i++) {
JSONObject json = jsonArr.getJSONObject(i);
@@ -217,8 +256,9 @@ public class WebLibrary extends BasicLibrary {
@Override
// Could work (more slowly) without it
public MetaData imprt(final URL url, Progress pg) throws IOException {
- if (true)
- throw new IOException("Not implemented yet");
+ if (pg == null) {
+ pg = new Progress();
+ }
// Import the file locally if it is actually a file
@@ -228,8 +268,44 @@ public class WebLibrary extends BasicLibrary {
// Import it remotely if it is an URL
- // TODO
- return super.imprt(url, pg);
+ try {
+ String luid = null;
+
+ Map post = new HashMap();
+ post.put("url", url.toString());
+ InputStream in = post(WebLibraryUrls.IMPRT_URL_IMPORT, post);
+ try {
+ luid = IOUtils.readSmallStream(in);
+ } finally {
+ in.close();
+ }
+
+ Progress subPg = null;
+ do {
+ try {
+ Thread.sleep(2000);
+ } catch (InterruptedException e) {
+ }
+
+ in = post(WebLibraryUrls.getImprtProgressUrl(luid));
+ try {
+ subPg = JsonIO.toProgress(
+ new JSONObject(IOUtils.readSmallStream(in)));
+ } finally {
+ in.close();
+ }
+ } while (subPg != null);
+
+ in = post(WebLibraryUrls.getStoryUrlMetadata(luid));
+ try {
+ return JsonIO.toMetaData(
+ new JSONObject(IOUtils.readSmallStream(in)));
+ } finally {
+ in.close();
+ }
+ } finally {
+ pg.done();
+ }
}
@Override
@@ -237,8 +313,24 @@ public class WebLibrary extends BasicLibrary {
protected synchronized void changeSTA(final String luid,
final String newSource, final String newTitle,
final String newAuthor, Progress pg) throws IOException {
- // TODO
- super.changeSTA(luid, newSource, newTitle, newAuthor, pg);
+ MetaData meta = getInfo(luid);
+ if (meta != null) {
+ if (!meta.getSource().equals(newSource)) {
+ Map post = new HashMap();
+ post.put("value", newSource);
+ post(WebLibraryUrls.getStoryUrlSource(luid), post).close();
+ }
+ if (!meta.getTitle().equals(newTitle)) {
+ Map post = new HashMap();
+ post.put("value", newTitle);
+ post(WebLibraryUrls.getStoryUrlTitle(luid), post).close();
+ }
+ if (!meta.getAuthor().equals(newAuthor)) {
+ Map post = new HashMap();
+ post.put("value", newAuthor);
+ post(WebLibraryUrls.getStoryUrlAuthor(luid), post).close();
+ }
+ }
}
@Override
@@ -254,7 +346,7 @@ public class WebLibrary extends BasicLibrary {
// The following methods are only used by Save and Delete in BasicLibrary:
@Override
- protected int getNextId() {
+ protected String getNextId() {
throw new java.lang.InternalError("Should not have been called");
}
@@ -276,11 +368,19 @@ public class WebLibrary extends BasicLibrary {
"Operation not supportorted on remote Libraries");
}
- // starts with "/"
- private InputStream download(String path) throws IOException {
+ // starts with "/", never NULL
+ private InputStream post(String path) throws IOException {
+ return post(path, null);
+ }
+
+ // starts with "/", never NULL
+ private InputStream post(String path, Map post)
+ throws IOException {
URL url = new URL(host + ":" + port + path);
- Map post = new HashMap();
+ if (post == null) {
+ post = new HashMap();
+ }
post.put("login", subkey);
post.put("password", key);