diff --git a/400_xowa/src/gplx/xowa/addons/apps/updates/dbs/Xoa_app_version_itm.java b/400_xowa/src/gplx/xowa/addons/apps/updates/dbs/Xoa_app_version_itm.java new file mode 100644 index 000000000..753ff6e70 --- /dev/null +++ b/400_xowa/src/gplx/xowa/addons/apps/updates/dbs/Xoa_app_version_itm.java @@ -0,0 +1,41 @@ +/* +XOWA: the XOWA Offline Wiki Application +Copyright (C) 2012 gnosygnu@gmail.com + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as +published by the Free Software Foundation, either version 3 of the +License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . +*/ +package gplx.xowa.addons.apps.updates.dbs; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.apps.*; import gplx.xowa.addons.apps.updates.*; +public class Xoa_app_version_itm { + public Xoa_app_version_itm(String id, String date, int priority, String summary, String details) { + this.id = id; + this.date = date; + this.priority = priority; + this.summary = summary; + this.details = details; + } + public String Id() {return id;} private final String id; + public String Date() {return date;} private final String date; + public int Priority() {return priority;} private final int priority; + public String Summary() {return summary;} private final String summary; + public String Details() {return details;} private final String details; + public String Priority_str() { + switch (priority) { + case 3: return "trivial"; + case 5: return "minor"; + case Priority__major: return "major"; + default: throw Err_.new_unhandled_default(priority); + } + } + public static final int Priority__major = 7; +} diff --git a/400_xowa/src/gplx/xowa/addons/apps/updates/dbs/Xoa_app_version_tbl.java b/400_xowa/src/gplx/xowa/addons/apps/updates/dbs/Xoa_app_version_tbl.java new file mode 100644 index 000000000..7a84f7679 --- /dev/null +++ b/400_xowa/src/gplx/xowa/addons/apps/updates/dbs/Xoa_app_version_tbl.java @@ -0,0 +1,63 @@ +/* +XOWA: the XOWA Offline Wiki Application +Copyright (C) 2012 gnosygnu@gmail.com + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as +published by the Free Software Foundation, either version 3 of the +License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . +*/ +package gplx.xowa.addons.apps.updates.dbs; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.apps.*; import gplx.xowa.addons.apps.updates.*; +import gplx.dbs.*; import gplx.dbs.utls.*; +public class Xoa_app_version_tbl implements Db_tbl { + private final Dbmeta_fld_list flds = new Dbmeta_fld_list(); + private final String fld__version_id, fld__version_date, fld__version_priority, fld__version_summary, fld__version_details; + private final Db_conn conn; + public Xoa_app_version_tbl(Db_conn conn) { + this.conn = conn; + this.fld__version_id = flds.Add_str("version_id", 32); + this.fld__version_date = flds.Add_str("version_date", 32); + this.fld__version_priority = flds.Add_int("version_priority"); // 3:trivial; 5:minor; 7:major; + this.fld__version_summary = flds.Add_str("version_summary", 255); + this.fld__version_details = flds.Add_text("version_details"); + conn.Rls_reg(this); + } + public String Tbl_name() {return tbl_name;} private final String tbl_name = TBL_NAME; + public void Create_tbl() {conn.Meta_tbl_create(Dbmeta_tbl_itm.New(tbl_name, flds, Dbmeta_idx_itm.new_normal_by_tbl(tbl_name, fld__version_date, fld__version_date)));} + public Xoa_app_version_itm[] Select_by_date(String date) { // NOTE: version_ids are not easy to sort; using version_date instead + String sql = Db_sql_.Make_by_fmt(String_.Ary + ( "SELECT *" + , "FROM app_version" + , "WHERE version_date > '{0}'" + , "ORDER BY version_date" + ), date); + + Db_rdr rdr = conn.Stmt_sql(sql).Crt_str(fld__version_date, date).Exec_select__rls_auto(); + try { + List_adp list = List_adp_.New(); + while (rdr.Move_next()) { + list.Add(Load(rdr)); + } + return (Xoa_app_version_itm[])list.To_ary_and_clear(Xoa_app_version_itm.class); + } finally {rdr.Rls();} + } + private Xoa_app_version_itm Load(Db_rdr rdr) { + return new Xoa_app_version_itm + ( rdr.Read_str(fld__version_id) + , rdr.Read_str(fld__version_date) + , rdr.Read_int(fld__version_priority) + , rdr.Read_str(fld__version_summary) + , rdr.Read_str(fld__version_details) + ); + } + public void Rls() {} + public static final String TBL_NAME = "app_version"; +} diff --git a/400_xowa/src/gplx/xowa/addons/apps/updates/dbs/Xoa_update_db_mgr.java b/400_xowa/src/gplx/xowa/addons/apps/updates/dbs/Xoa_update_db_mgr.java new file mode 100644 index 000000000..301a6b5d3 --- /dev/null +++ b/400_xowa/src/gplx/xowa/addons/apps/updates/dbs/Xoa_update_db_mgr.java @@ -0,0 +1,30 @@ +/* +XOWA: the XOWA Offline Wiki Application +Copyright (C) 2012 gnosygnu@gmail.com + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as +published by the Free Software Foundation, either version 3 of the +License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . +*/ +package gplx.xowa.addons.apps.updates.dbs; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.apps.*; import gplx.xowa.addons.apps.updates.*; +import gplx.dbs.*; import gplx.dbs.utls.*; +public class Xoa_update_db_mgr { + public Xoa_update_db_mgr(Io_url url) { + this.url = url; + this.conn = Db_conn_bldr.Instance.Get_or_fail(url); + this.tbl__app_version = new Xoa_app_version_tbl(conn); + conn.Meta_tbl_assert(tbl__app_version); + } + public Io_url Url() {return url;} private final Io_url url; + public Db_conn Conn() {return conn;} private final Db_conn conn; + public Xoa_app_version_tbl Tbl__app_version() {return tbl__app_version;} private final Xoa_app_version_tbl tbl__app_version; +} diff --git a/400_xowa/src/gplx/xowa/addons/apps/updates/specials/Xoa_update_html.java b/400_xowa/src/gplx/xowa/addons/apps/updates/specials/Xoa_update_html.java index e507bed32..a230ced5c 100644 --- a/400_xowa/src/gplx/xowa/addons/apps/updates/specials/Xoa_update_html.java +++ b/400_xowa/src/gplx/xowa/addons/apps/updates/specials/Xoa_update_html.java @@ -16,13 +16,55 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.addons.apps.updates.specials; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.apps.*; import gplx.xowa.addons.apps.updates.*; +import gplx.xowa.addons.apps.updates.dbs.*; import gplx.xowa.specials.*; import gplx.langs.mustaches.*; import gplx.xowa.wikis.pages.*; import gplx.xowa.wikis.pages.tags.*; class Xoa_update_html extends Xow_special_wtr__base { @Override protected Io_url Get_addon_dir(Xoa_app app) {return app.Fsys_mgr().Http_root().GenSubDir_nest("bin", "any", "xowa", "addon", "app", "update");} @Override protected Io_url Get_mustache_fil(Io_url addon_dir) {return addon_dir.GenSubFil_nest("bin", "xoa_update.mustache.html");} @Override protected Mustache_doc_itm Bld_mustache_root(Xoa_app app) { - return Xoa_update_itm.Load(app.Fsys_mgr().Bin_addon_dir()); + Io_url update_db_url = Get_addon_dir(app).GenSubFil("xowa_update_info.sqlite3"); + Xoa_update_db_mgr db_mgr = new Xoa_update_db_mgr(update_db_url); + return Load(db_mgr); } + private static Mustache_doc_itm Load(Xoa_update_db_mgr db_mgr) { + // get from internet + if (gplx.core.ios.IoEngine_system.Web_access_enabled) { + Io_url trg_url = db_mgr.Url(); + String src_url = "http://xowa.org/admin/app_update/xowa_update_info.sqlite3"; + Io_mgr.Instance.DownloadFil(src_url, trg_url); + } + + // load from db + Xoa_app_version_itm[] db_itms = db_mgr.Tbl__app_version().Select_by_date(Xoa_app_.Build_date); + if (db_itms.length == 0) return new Xoa_update_itm("up-to-date", "", "", "", "", ""); + + // convert to gui itm + Xoa_update_itm head = To_gui_itm(db_itms[0], Find_major(db_itms)); + head.Itms_(To_gui_itm(db_itms)); + return head; + } + private static String Find_major(Xoa_app_version_itm[] db_itms) { + int len = db_itms.length; + Xoa_app_version_itm major = null; + for (int i = 0; i < len; i++) { + Xoa_app_version_itm db_itm = db_itms[i]; + if (db_itm.Priority() >= Xoa_app_version_itm.Priority__major) + major = db_itm; + } + return major == null ? "" : String_.Format("({0}) {1}", major.Priority_str(), major.Id()); + } + private static Xoa_update_itm[] To_gui_itm(Xoa_app_version_itm[] db_itms) { + int len = db_itms.length; + Xoa_update_itm[] rv = new Xoa_update_itm[len]; + for (int i = 0; i < len; i++) { + rv[i] = To_gui_itm(db_itms[i], ""); + } + return rv; + } + private static Xoa_update_itm To_gui_itm(Xoa_app_version_itm db_itm, String major) { + return new Xoa_update_itm(db_itm.Id(), db_itm.Date(), db_itm.Priority_str(), db_itm.Summary(), db_itm.Details(), major); + } + @Override protected void Bld_tags(Xoa_app app, Io_url addon_dir, Xopage_html_data page_data) { Xopg_tag_mgr head_tags = page_data.Head_tags(); Xopg_tag_wtr_.Add__xocss (head_tags, app.Fsys_mgr().Http_root()); diff --git a/400_xowa/src/gplx/xowa/addons/apps/updates/specials/Xoa_update_itm.java b/400_xowa/src/gplx/xowa/addons/apps/updates/specials/Xoa_update_itm.java index 6341897db..2c8734daf 100644 --- a/400_xowa/src/gplx/xowa/addons/apps/updates/specials/Xoa_update_itm.java +++ b/400_xowa/src/gplx/xowa/addons/apps/updates/specials/Xoa_update_itm.java @@ -17,14 +17,20 @@ along with this program. If not, see . */ package gplx.xowa.addons.apps.updates.specials; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.apps.*; import gplx.xowa.addons.apps.updates.*; import gplx.langs.mustaches.*; +import gplx.xowa.addons.apps.updates.dbs.*; class Xoa_update_itm implements Mustache_doc_itm { - private final String version, date, priority, summary, details; - public Xoa_update_itm(String version, String date, String priority, String summary, String details) { + private final String version, date, priority, summary, details, major; + private Xoa_update_itm[] itms = Ary__empty; + public Xoa_update_itm(String version, String date, String priority, String summary, String details, String major) { this.version = version; this.date = date; this.priority = priority; this.summary = summary; this.details = details; + this.major = major; + } + public void Itms_(Xoa_update_itm[] v) { + this.itms = v; } public boolean Mustache__write(String k, Mustache_bfr bfr) { if (String_.Eq(k, "version")) bfr.Add_str_u8(version); @@ -32,17 +38,13 @@ class Xoa_update_itm implements Mustache_doc_itm { else if (String_.Eq(k, "priority")) bfr.Add_str_u8(priority); else if (String_.Eq(k, "summary")) bfr.Add_str_u8(summary); else if (String_.Eq(k, "details")) bfr.Add_str_u8(details); + else if (String_.Eq(k, "major")) bfr.Add_str_u8(major); return true; } public Mustache_doc_itm[] Mustache__subs(String key) { + if (String_.Eq(key, "itms")) return itms; return Mustache_doc_itm_.Ary__empty; } - public static Mustache_doc_itm Load(Io_url app_root) { - // get from internet -// Io_url trg_url = app_root.GenSubFil_nest("app", "update", "xowa_update_info.sqlite3"); -// String src_url = "http://xowa.org/admin/app_update/xowa_update_info.sqlite3"; -// Io_mgr.Instance.DownloadFil(src_url, trg_url); - - return new Xoa_update_itm("", "", "", "", ""); - } + + private static final Xoa_update_itm[] Ary__empty = new Xoa_update_itm[0]; } diff --git a/400_xowa/src/gplx/xowa/addons/apps/updates/specials/Xoa_update_special.java b/400_xowa/src/gplx/xowa/addons/apps/updates/specials/Xoa_update_special.java index 8533edb0e..b064faed1 100644 --- a/400_xowa/src/gplx/xowa/addons/apps/updates/specials/Xoa_update_special.java +++ b/400_xowa/src/gplx/xowa/addons/apps/updates/specials/Xoa_update_special.java @@ -19,6 +19,7 @@ package gplx.xowa.addons.apps.updates.specials; import gplx.*; import gplx.xowa. import gplx.xowa.specials.*; import gplx.core.net.qargs.*; public class Xoa_update_special implements Xow_special_page { public void Special__gen(Xow_wiki wiki, Xoa_page page, Xoa_url url, Xoa_ttl ttl) { + new Xoa_update_html().Bld_page_by_mustache(wiki.App(), page, this); } Xoa_update_special(Xow_special_meta special__meta) {this.special__meta = special__meta;} public Xow_special_meta Special__meta() {return special__meta;} private final Xow_special_meta special__meta; diff --git a/400_xowa/src/gplx/xowa/addons/wikis/pages/syncs/core/Xosync_read_mgr.java b/400_xowa/src/gplx/xowa/addons/wikis/pages/syncs/core/Xosync_read_mgr.java index fb49684c7..df9cf79a6 100644 --- a/400_xowa/src/gplx/xowa/addons/wikis/pages/syncs/core/Xosync_read_mgr.java +++ b/400_xowa/src/gplx/xowa/addons/wikis/pages/syncs/core/Xosync_read_mgr.java @@ -27,6 +27,7 @@ public class Xosync_read_mgr { private final Xosync_update_mgr update_mgr = new Xosync_update_mgr(); public void Auto_update(Xow_wiki wiki, Xoa_page page, Xoa_ttl page_ttl) { if (wiki.Domain_itm().Domain_type_id() == gplx.xowa.wikis.domains.Xow_domain_tid_.Tid__home) return; + if (wiki.Domain_itm().Domain_type_id() == gplx.xowa.wikis.domains.Xow_domain_tid_.Tid__other) return; if (page_ttl.Ns().Id_is_special()) return; Xoapi_sync_api sync_api = wiki.App().Api_root().Addon().Bldr().Sync();