From ba6cf425009e67a65b3146b5b818db081cb0e845 Mon Sep 17 00:00:00 2001 From: Niki Roo Date: Thu, 14 May 2020 16:14:29 +0200 Subject: [PATCH] JsonIO: fix progress --- src/be/nikiroo/fanfix/data/JsonIO.java | 55 +++++++++++++++++-- .../fanfix/library/WebLibraryServer.java | 9 --- src/be/nikiroo/utils/Progress.java | 52 ++++++++++++++++-- 3 files changed, 95 insertions(+), 21 deletions(-) diff --git a/src/be/nikiroo/fanfix/data/JsonIO.java b/src/be/nikiroo/fanfix/data/JsonIO.java index 524f99a7..c31ddd00 100644 --- a/src/be/nikiroo/fanfix/data/JsonIO.java +++ b/src/be/nikiroo/fanfix/data/JsonIO.java @@ -201,8 +201,11 @@ public class JsonIO { return para; } - // no children included static public JSONObject toJson(Progress pg) { + return toJson(pg, null); + } + + static private JSONObject toJson(Progress pg, Double weight) { if (pg == null) { return null; } @@ -213,20 +216,40 @@ public class JsonIO { put(json, "name", pg.getName()); put(json, "min", pg.getMin()); put(json, "max", pg.getMax()); - put(json, "progress", pg.getProgress()); + put(json, "progress", pg.getRelativeProgress()); + put(json, "weight", weight); + + List children = new ArrayList(); + for (Progress child : pg.getChildren()) { + children.add(toJson(child, pg.getWeight(child))); + } + put(json, "children", new JSONArray(children)); return json; } - // no children included static public Progress toProgress(JSONObject json) { if (json == null) { return null; } - Progress pg = new Progress(getString(json, "name"), - getInt(json, "min", 0), getInt(json, "max", 100)); - pg.setProgress(getInt(json, "progress", 0)); + Progress pg = new Progress( // + getString(json, "name"), // + getInt(json, "min", 0), // + getInt(json, "max", 100) // + ); + + pg.setRelativeProgress(getDouble(json, "progress", 0)); + + JSONArray jchildren = getJsonArr(json, "children"); + for (int i = 0; i < jchildren.length(); i++) { + try { + JSONObject jchild = jchildren.getJSONObject(i); + Double weight = getDouble(jchild, "weight", 0); + pg.addProgress(toProgress(jchild), weight); + } catch (Exception e) { + } + } return pg; } @@ -300,6 +323,26 @@ public class JsonIO { return def; } + static double getDouble(JSONObject json, String key, double def) { + if (json.has(key)) { + Object o = json.get(key); + if (o instanceof Byte) + return (Byte) o; + if (o instanceof Short) + return (Short) o; + if (o instanceof Integer) + return (Integer) o; + if (o instanceof Long) + return (Long) o; + if (o instanceof Float) + return (Float) o; + if (o instanceof Double) + return (Double) o; + } + + return def; + } + static boolean getBoolean(JSONObject json, String key, boolean def) { if (json.has(key)) { Object o = json.get(key); diff --git a/src/be/nikiroo/fanfix/library/WebLibraryServer.java b/src/be/nikiroo/fanfix/library/WebLibraryServer.java index b3d897d0..9073b8ca 100644 --- a/src/be/nikiroo/fanfix/library/WebLibraryServer.java +++ b/src/be/nikiroo/fanfix/library/WebLibraryServer.java @@ -28,7 +28,6 @@ import be.nikiroo.utils.NanoHTTPD; import be.nikiroo.utils.NanoHTTPD.Response; import be.nikiroo.utils.NanoHTTPD.Response.Status; import be.nikiroo.utils.Progress; -import be.nikiroo.utils.Progress.ProgressListener; public class WebLibraryServer extends WebLibraryServerHtml { class WLoginResult extends LoginResult { @@ -415,14 +414,6 @@ public class WebLibraryServer extends WebLibraryServerHtml { final Progress pg = new Progress(); final String luid = lib.getNextId(); - // Keep the latest name - pg.addProgressListener(new ProgressListener() { - @Override - public void progress(Progress progress, String name) { - pg.setName(name); - } - }); - synchronized (imprts) { imprts.put(luid, pg); } diff --git a/src/be/nikiroo/utils/Progress.java b/src/be/nikiroo/utils/Progress.java index 748d4a66..bb143efa 100644 --- a/src/be/nikiroo/utils/Progress.java +++ b/src/be/nikiroo/utils/Progress.java @@ -108,7 +108,7 @@ public class Progress { /** * The name of this {@link Progress} step. * - * @return the name + * @return the name, can be NULL */ public String getName() { return name; @@ -241,8 +241,8 @@ public class Progress { relativeLocalProgress = ((double) progress) / (max - min); - setRelativeProgress(this, name, relativeLocalProgress - + childrenProgress); + setRelativeProgress(this, name, + relativeLocalProgress + childrenProgress); } } @@ -256,12 +256,26 @@ public class Progress { return relativeProgress; } + /** + * Set the total progress value (including the optional children + * {@link Progress}), on a 0 to 1 scale. + *

+ * Will generate a changed event from this very {@link Progress}. + * + * @param relativeProgress + * the progress to set + */ + public void setRelativeProgress(double relativeProgress) { + setRelativeProgress(this, name, relativeProgress); + } + /** * Set the total progress value (including the optional children * {@link Progress}), on a 0 to 1 scale. * * @param pg - * the {@link Progress} to report as the progression emitter + * the {@link Progress} to report as the progression emitter (can + * be NULL, will then be considered the same as this) * @param name * the current name (if it is NULL, the first non-null name in * the hierarchy will overwrite it) of the {@link Progress} who @@ -325,6 +339,8 @@ public class Progress { /** * Return the list of direct children of this {@link Progress}. + *

+ * Can return an empty list, but never NULL. * * @return the children (Who will think of the children??) */ @@ -334,6 +350,20 @@ public class Progress { } } + /** + * The weight of this children if it is actually a child of this. + * + * @param child + * the child to get the weight of + * + * @return NULL if this is not a child of this + */ + public Double getWeight(Progress child) { + synchronized (lock) { + return children.get(child); + } + } + /** * Notify the listeners that this {@link Progress} changed value. * @@ -416,8 +446,8 @@ public class Progress { if (progress.parent != null) { throw new RuntimeException(String.format( "Progress object %s cannot be added to %s, " - + "as it already has a parent (%s)", progress.name, - name, progress.parent.name)); + + "as it already has a parent (%s)", + progress.name, name, progress.parent.name)); } ProgressListener progressListener = new ProgressListener() { @@ -492,4 +522,14 @@ public class Progress { public Object get(Object key) { return map.get(key); } + + @Override + public String toString() { + return "[Progress]" // + + (name == null || name.isEmpty() ? "" : " " + name) // + + ": " + getProgress() + " / " + getMax() // + + (children.isEmpty() ? "" + : " (with " + children.size() + " children)") // + ; + } } -- 2.27.0