From a0dacdcf38e00480af5f16f39eaceeb3a8135348 Mon Sep 17 00:00:00 2001 From: gnosygnu Date: Thu, 16 Feb 2017 18:22:56 -0500 Subject: [PATCH] Personal_wikis: Refactor wiki_json update --- .../wikis/directorys/dbs/Xowdir_db_utl.java | 75 +-------- .../directorys/dbs/Xowdir_wiki_json_.java | 148 ++++++++++++++++++ .../directorys/dbs/Xowdir_wiki_json_mgr.java | 108 +++++++++++++ .../directorys/dbs/Xowdir_wiki_json_mgr_.java | 21 +++ .../dbs/Xowdir_wiki_json_mgr__tst.java | 72 +++++++++ .../dbs/Xowdir_wiki_json_mgr__xowa.java | 59 +++++++ .../specials/items/Xowdir_item_mgr.java | 2 +- .../items/bldrs/Xow_wiki_factory.java | 2 +- .../specials/lists/Xowdir_list_svc.java | 7 +- 9 files changed, 415 insertions(+), 79 deletions(-) create mode 100644 400_xowa/src/gplx/xowa/addons/wikis/directorys/dbs/Xowdir_wiki_json_.java create mode 100644 400_xowa/src/gplx/xowa/addons/wikis/directorys/dbs/Xowdir_wiki_json_mgr.java create mode 100644 400_xowa/src/gplx/xowa/addons/wikis/directorys/dbs/Xowdir_wiki_json_mgr_.java create mode 100644 400_xowa/src/gplx/xowa/addons/wikis/directorys/dbs/Xowdir_wiki_json_mgr__tst.java create mode 100644 400_xowa/src/gplx/xowa/addons/wikis/directorys/dbs/Xowdir_wiki_json_mgr__xowa.java diff --git a/400_xowa/src/gplx/xowa/addons/wikis/directorys/dbs/Xowdir_db_utl.java b/400_xowa/src/gplx/xowa/addons/wikis/directorys/dbs/Xowdir_db_utl.java index a212d3161..6b1c1ac48 100644 --- a/400_xowa/src/gplx/xowa/addons/wikis/directorys/dbs/Xowdir_db_utl.java +++ b/400_xowa/src/gplx/xowa/addons/wikis/directorys/dbs/Xowdir_db_utl.java @@ -16,81 +16,8 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.addons.wikis.directorys.dbs; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.wikis.*; import gplx.xowa.addons.wikis.directorys.*; -import gplx.dbs.*; import gplx.dbs.cfgs.*; import gplx.dbs.sys.*; -import gplx.xowa.wikis.*; import gplx.xowa.wikis.data.*; -import gplx.langs.jsons.*; +import gplx.dbs.sys.*; public class Xowdir_db_utl { - private static final String Grp__personal = "xowa.personal_wikis", Key__personal__wiki_json = "xowa.personal_wikis.wiki_json"; - public static void Wiki_json__upsert(Xowe_wiki wiki, String wiki_json) { - wiki.Data__core_mgr().Db__core().Tbl__cfg().Upsert_str(Grp__personal, Key__personal__wiki_json, wiki_json); - } - public static void Wiki_json__verify(Xoae_app app, byte[] domain_bry, Io_url core_db_url, Db_conn core_db_conn) { - String domain_str = String_.new_u8(domain_bry); - boolean dirty = false; - - // get wiki_json from core_db.xowa_cfg - Db_cfg_tbl core_cfg_tbl = new Db_cfg_tbl(core_db_conn, Xowd_cfg_tbl_.Tbl_name); - String wiki_cfg_str = core_cfg_tbl.Select_str_or(Grp__personal, Key__personal__wiki_json, null); - - // not in core_db; check user_db.user_wiki - Xowdir_wiki_json wiki_json_itm = null; - if (wiki_cfg_str == null) { - Gfo_usr_dlg_.Instance.Warn_many("", "", "wiki_json not found in core_db; url=~{0}", core_db_url); - dirty = true; - Xowdir_db_mgr user_db_mgr = new Xowdir_db_mgr(app.User().User_db_mgr().Conn()); - Xowdir_wiki_itm user_wiki_row = user_db_mgr.Tbl__wiki().Select_by_key_or_null(domain_str); - if (user_wiki_row != null) { - wiki_json_itm = user_wiki_row.Json(); - } - } - else { - wiki_json_itm = Xowdir_wiki_json.New_by_json(new Json_parser(), wiki_cfg_str); - } - - // not in core_db or user_db; infer - if (wiki_json_itm == null) { - Gfo_usr_dlg_.Instance.Warn_many("", "", "wiki_json not found in core_db or user_db; url=~{0}", core_db_url); - dirty = true; - wiki_json_itm = Wiki_json__infer(core_db_url, core_cfg_tbl); - } - - // check domain exists - if (String_.Eq(wiki_json_itm.Domain(), String_.Empty)) { - Gfo_usr_dlg_.Instance.Warn_many("", "", "wiki_json does not have domain; url=~{0}", core_db_url); - dirty = true; - wiki_json_itm.Domain_(core_cfg_tbl.Select_str_or(Xow_cfg_consts.Grp__wiki_init, Xow_cfg_consts.Key__init__domain, core_db_url.NameOnly())); - } - - // something changed; save it - if (dirty) { - Xowdir_db_mgr user_db_mgr = new Xowdir_db_mgr(app.User().User_db_mgr().Conn()); - Xowdir_wiki_itm user_wiki_row = user_db_mgr.Tbl__wiki().Select_by_key_or_null(domain_str); - - String wiki_json_str = wiki_json_itm.To_str(new gplx.langs.jsons.Json_wtr()); - core_cfg_tbl.Update_str(Grp__personal, Key__personal__wiki_json, wiki_json_str); - user_db_mgr.Tbl__wiki().Upsert(user_wiki_row.Id(), user_wiki_row.Domain(), user_wiki_row.Url(), wiki_json_str); - } - } - public static Xowdir_wiki_json Wiki_json__get_or_create(Io_url core_db_url, Db_conn core_db_conn) { - Xowdir_wiki_json rv = null; - - Db_cfg_tbl core_cfg_tbl = new Db_cfg_tbl(core_db_conn, Xowd_cfg_tbl_.Tbl_name); - String wiki_cfg_str = core_cfg_tbl.Select_str_or(Grp__personal, Key__personal__wiki_json, null); - - if (wiki_cfg_str == null) { - rv = Wiki_json__infer(core_db_url, core_cfg_tbl); - core_cfg_tbl.Insert_str(Grp__personal, Key__personal__wiki_json, rv.To_str(new gplx.langs.jsons.Json_wtr())); - } - else { - rv = Xowdir_wiki_json.New_by_json(new gplx.langs.jsons.Json_parser(), wiki_cfg_str); - } - return rv; - } - private static Xowdir_wiki_json Wiki_json__infer(Io_url core_db_url, Db_cfg_tbl core_cfg_tbl) { - String domain = core_cfg_tbl.Select_str_or(Xow_cfg_consts.Grp__wiki_init, Xow_cfg_consts.Key__init__domain, core_db_url.NameOnly()); - String main_page = core_cfg_tbl.Select_str_or(Xow_cfg_consts.Grp__wiki_init, Xow_cfg_consts.Key__init__main_page, Xoa_page_.Main_page_str); - return new Xowdir_wiki_json(domain, domain, main_page); - } public static int Wiki_id__next(Xoa_app app) { Db_sys_mgr sys_mgr = new Db_sys_mgr(app.User().User_db_mgr().Conn()); return sys_mgr.Autonum_next("user.wikis.id"); diff --git a/400_xowa/src/gplx/xowa/addons/wikis/directorys/dbs/Xowdir_wiki_json_.java b/400_xowa/src/gplx/xowa/addons/wikis/directorys/dbs/Xowdir_wiki_json_.java new file mode 100644 index 000000000..555556b31 --- /dev/null +++ b/400_xowa/src/gplx/xowa/addons/wikis/directorys/dbs/Xowdir_wiki_json_.java @@ -0,0 +1,148 @@ +/* +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.wikis.directorys.dbs; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.wikis.*; import gplx.xowa.addons.wikis.directorys.*; +import gplx.dbs.*; import gplx.dbs.cfgs.*; import gplx.dbs.sys.*; +import gplx.xowa.wikis.*; import gplx.xowa.wikis.data.*; +import gplx.langs.jsons.*; +public class Xowdir_wiki_json_ { + private static final String Grp__personal = "xowa.personal_wikis", Key__personal__wiki_json = "xowa.personal_wikis.wiki_json"; + public static void Upsert(Xowe_wiki wiki, String wiki_json) { + wiki.Data__core_mgr().Db__core().Tbl__cfg().Upsert_str(Grp__personal, Key__personal__wiki_json, wiki_json); + } + public static Xowdir_wiki_json Select_or_insert(Io_url core_db_url, Db_conn core_db_conn) { + Xowdir_wiki_json rv = null; + + // read from core_db.xowa_cfg + Db_cfg_tbl core_cfg_tbl = new Db_cfg_tbl(core_db_conn, Xowd_cfg_tbl_.Tbl_name); + String wiki_json_str = core_cfg_tbl.Select_str_or(Grp__personal, Key__personal__wiki_json, null); + + // if not in core_db.xowa_cfg + if (wiki_json_str == null) { + // infer new based on url and other cfg_itms + rv = Infer_new(core_db_url, core_cfg_tbl); + core_cfg_tbl.Insert_str(Grp__personal, Key__personal__wiki_json, rv.To_str(new Json_wtr())); + } + else { + rv = Xowdir_wiki_json.New_by_json(new Json_parser(), wiki_json_str); + } + return rv; + } +// public static Xowdir_wiki_json Verify2(Xoae_app app, boolean mode_is_import, String domain_str, Io_url core_db_url, Db_conn core_db_conn) { +// Xowdir_wiki_json rv = null; +// boolean dirty = false; +// +// // read from core_db.xowa_cfg +// Db_cfg_tbl core_cfg_tbl = new Db_cfg_tbl(core_db_conn, Xowd_cfg_tbl_.Tbl_name); +// String wiki_cfg_str = core_cfg_tbl.Select_str_or(Grp__personal, Key__personal__wiki_json, null); +// +// // not in core_db; check user_db.user_wiki +// if (wiki_cfg_str == null) { +// Gfo_usr_dlg_.Instance.Warn_many("", "", "wiki_json not found in core_db; url=~{0}", core_db_url); +// dirty = true; +// if (!mode_is_import) { +// Xowdir_db_mgr user_db_mgr = new Xowdir_db_mgr(app.User().User_db_mgr().Conn()); +// Xowdir_wiki_itm user_wiki_row = user_db_mgr.Tbl__wiki().Select_by_key_or_null(domain_str); +// if (user_wiki_row != null) { +// rv = user_wiki_row.Json(); +// } +// } +// } +// else { +// rv = Xowdir_wiki_json.New_by_json(new Json_parser(), wiki_cfg_str); +// } +// +// // not in core_db or user_db; infer +// if (rv == null) { +// Gfo_usr_dlg_.Instance.Warn_many("", "", "wiki_json not found in core_db or user_db; url=~{0}", core_db_url); +// dirty = true; +// rv = Infer_new(core_db_url, core_cfg_tbl); +// } +// +// // check domain exists +// if (String_.Eq(rv.Domain(), String_.Empty)) { +// Gfo_usr_dlg_.Instance.Warn_many("", "", "wiki_json does not have domain; url=~{0}", core_db_url); +// dirty = true; +// rv.Domain_(core_cfg_tbl.Select_str_or(Xow_cfg_consts.Grp__wiki_init, Xow_cfg_consts.Key__init__domain, core_db_url.NameOnly())); +// } +// +// // something changed; save it +// if (dirty) { +// String wiki_json_str = rv.To_str(new gplx.langs.jsons.Json_wtr()); +// core_cfg_tbl.Update_str(Grp__personal, Key__personal__wiki_json, wiki_json_str); +// Xowdir_db_mgr user_db_mgr = new Xowdir_db_mgr(app.User().User_db_mgr().Conn()); +// +// if (!mode_is_import) { +// Xowdir_wiki_itm user_wiki_row = user_db_mgr.Tbl__wiki().Select_by_key_or_null(domain_str); +// user_db_mgr.Tbl__wiki().Upsert(user_wiki_row.Id(), user_wiki_row.Domain(), user_wiki_row.Url(), wiki_json_str); +// } +// } +// return rv; +// } + public static void Verify(Xoae_app app, byte[] domain_bry, Io_url core_db_url, Db_conn core_db_conn) { + String domain_str = String_.new_u8(domain_bry); + boolean dirty = false; + + // read from core_db.xowa_cfg + Db_cfg_tbl core_cfg_tbl = new Db_cfg_tbl(core_db_conn, Xowd_cfg_tbl_.Tbl_name); + String wiki_cfg_str = core_cfg_tbl.Select_str_or(Grp__personal, Key__personal__wiki_json, null); + + // not in core_db; check user_db.user_wiki + Xowdir_wiki_json wiki_json_itm = null; + if (wiki_cfg_str == null) { + Gfo_usr_dlg_.Instance.Warn_many("", "", "wiki_json not found in core_db; url=~{0}", core_db_url); + dirty = true; + Xowdir_db_mgr user_db_mgr = new Xowdir_db_mgr(app.User().User_db_mgr().Conn()); + Xowdir_wiki_itm user_wiki_row = user_db_mgr.Tbl__wiki().Select_by_key_or_null(domain_str); + if (user_wiki_row != null) { + wiki_json_itm = user_wiki_row.Json(); + } + } + else { + wiki_json_itm = Xowdir_wiki_json.New_by_json(new Json_parser(), wiki_cfg_str); + } + + // not in core_db or user_db; infer + if (wiki_json_itm == null) { + Gfo_usr_dlg_.Instance.Warn_many("", "", "wiki_json not found in core_db or user_db; url=~{0}", core_db_url); + dirty = true; + wiki_json_itm = Infer_new(core_db_url, core_cfg_tbl); + } + + // check domain exists + if (String_.Eq(wiki_json_itm.Domain(), String_.Empty)) { + Gfo_usr_dlg_.Instance.Warn_many("", "", "wiki_json does not have domain; url=~{0}", core_db_url); + dirty = true; + wiki_json_itm.Domain_(core_cfg_tbl.Select_str_or(Xow_cfg_consts.Grp__wiki_init, Xow_cfg_consts.Key__init__domain, core_db_url.NameOnly())); + } + + // something changed; save it + if (dirty) { + Xowdir_db_mgr user_db_mgr = new Xowdir_db_mgr(app.User().User_db_mgr().Conn()); + Xowdir_wiki_itm user_wiki_row = user_db_mgr.Tbl__wiki().Select_by_key_or_null(domain_str); + + String wiki_json_str = wiki_json_itm.To_str(new gplx.langs.jsons.Json_wtr()); + core_cfg_tbl.Update_str(Grp__personal, Key__personal__wiki_json, wiki_json_str); + user_db_mgr.Tbl__wiki().Upsert(user_wiki_row.Id(), user_wiki_row.Domain(), user_wiki_row.Url(), wiki_json_str); + } + } + private static Xowdir_wiki_json Infer_new(Io_url core_db_url, Db_cfg_tbl core_cfg_tbl) { + String domain = core_cfg_tbl.Select_str_or(Xow_cfg_consts.Grp__wiki_init, Xow_cfg_consts.Key__init__domain, core_db_url.NameOnly()); + String main_page = core_cfg_tbl.Select_str_or(Xow_cfg_consts.Grp__wiki_init, Xow_cfg_consts.Key__init__main_page, Xoa_page_.Main_page_str); + return new Xowdir_wiki_json(domain, domain, main_page); + } +} diff --git a/400_xowa/src/gplx/xowa/addons/wikis/directorys/dbs/Xowdir_wiki_json_mgr.java b/400_xowa/src/gplx/xowa/addons/wikis/directorys/dbs/Xowdir_wiki_json_mgr.java new file mode 100644 index 000000000..37182e3bd --- /dev/null +++ b/400_xowa/src/gplx/xowa/addons/wikis/directorys/dbs/Xowdir_wiki_json_mgr.java @@ -0,0 +1,108 @@ +/* +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.wikis.directorys.dbs; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.wikis.*; import gplx.xowa.addons.wikis.directorys.*; +import gplx.langs.jsons.*; +public interface Xowdir_wiki_json_mgr { + void Wiki_cfg__upsert(String key, String val); + String Wiki_cfg__select_or(String key, String or); + void User_reg__upsert(String domain, String val); + String User_reg__select(String domain); + boolean Dirty(); + Xowdir_wiki_json Verify(boolean mode_is_import, String domain_str, Io_url core_db_url); +} +class Xowdir_wiki_cfg_ { + public static final String + Key__wiki_json = "wiki_json" + , Key__domain = "props.domain" + , Key__main_page = "props.main_page" + ; +} +abstract class Xowdir_wiki_json_mgr__base implements Xowdir_wiki_json_mgr { + private final Gfo_usr_dlg usr_dlg; + public Xowdir_wiki_json_mgr__base(Gfo_usr_dlg usr_dlg) { + this.usr_dlg = usr_dlg; + } + public abstract void Wiki_cfg__upsert(String key, String val); + public abstract String Wiki_cfg__select_or(String key, String or); + public abstract void User_reg__upsert(String domain, String val); + public abstract String User_reg__select(String domain); + public boolean Dirty() {return dirty;} private boolean dirty; + public Xowdir_wiki_json Verify(boolean mode_is_import, String domain_str, Io_url core_db_url) { + Xowdir_wiki_json rv = null; + dirty = false; + + // read from core_db.xowa_cfg + String wiki_json_str = Wiki_cfg__select_or(Xowdir_wiki_cfg_.Key__wiki_json, null); + + // not in core_db; check user_db.user_wiki + if (wiki_json_str == null) { + usr_dlg.Warn_many("", "", "wiki_json not found in core_db; url=~{0}", core_db_url); + dirty = true; + if (!mode_is_import) { + wiki_json_str = User_reg__select(domain_str); + } + } + + if (wiki_json_str != null) { + rv = Xowdir_wiki_json.New_by_json(new Json_parser(), wiki_json_str); + } + + // not in core_db or user_db; infer + if (rv == null) { + usr_dlg.Warn_many("", "", "wiki_json not found in core_db or user_db; url=~{0}", core_db_url); + dirty = true; + rv = Infer_new(core_db_url); + } + + // check domain exists + if (String_.Eq(rv.Domain(), String_.Empty)) { + usr_dlg.Warn_many("", "", "wiki_json does not have domain; url=~{0}", core_db_url); + dirty = true; + String domain = Wiki_cfg__select_or(Xowdir_wiki_cfg_.Key__domain, core_db_url.NameOnly()); + rv.Domain_(domain); + } + + // something changed; save it + if (dirty) { + wiki_json_str = rv.To_str(new gplx.langs.jsons.Json_wtr()); + Wiki_cfg__upsert(Xowdir_wiki_cfg_.Key__wiki_json, wiki_json_str); + + if (!mode_is_import) { + User_reg__upsert(domain_str, wiki_json_str); + } + } + return rv; + } + private Xowdir_wiki_json Infer_new(Io_url core_db_url) { + String domain = this.Wiki_cfg__select_or(Xowdir_wiki_cfg_.Key__domain, core_db_url.NameOnly()); + String main_page = this.Wiki_cfg__select_or(Xowdir_wiki_cfg_.Key__main_page, Xoa_page_.Main_page_str); + return new Xowdir_wiki_json(domain, domain, main_page); + } +} +class Xowdir_wiki_json_mgr__mock extends Xowdir_wiki_json_mgr__base { + private final Hash_adp wiki_cfg_hash = Hash_adp_.New(); + private final Hash_adp user_reg_hash = Hash_adp_.New(); + public Xowdir_wiki_json_mgr__mock() {super(Gfo_usr_dlg_.Noop);} + @Override public void Wiki_cfg__upsert(String key, String val) {wiki_cfg_hash.Add_if_dupe_use_nth(key, val);} + @Override public void User_reg__upsert(String domain, String val) {user_reg_hash.Add_if_dupe_use_nth(domain, val);} + @Override public String User_reg__select(String domain) {return (String)user_reg_hash.Get_by(domain);} + @Override public String Wiki_cfg__select_or(String key, String or) { + String rv = (String)wiki_cfg_hash.Get_by(key); + return rv == null ? or : rv; + } +} diff --git a/400_xowa/src/gplx/xowa/addons/wikis/directorys/dbs/Xowdir_wiki_json_mgr_.java b/400_xowa/src/gplx/xowa/addons/wikis/directorys/dbs/Xowdir_wiki_json_mgr_.java new file mode 100644 index 000000000..f77d40e32 --- /dev/null +++ b/400_xowa/src/gplx/xowa/addons/wikis/directorys/dbs/Xowdir_wiki_json_mgr_.java @@ -0,0 +1,21 @@ +/* +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.wikis.directorys.dbs; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.wikis.*; import gplx.xowa.addons.wikis.directorys.*; +public class Xowdir_wiki_json_mgr_ { + public static Xowdir_wiki_json_mgr New_xowa(Xoa_app app, Io_url core_db_url) {return new Xowdir_wiki_json_mgr__xowa(app, core_db_url);} +} diff --git a/400_xowa/src/gplx/xowa/addons/wikis/directorys/dbs/Xowdir_wiki_json_mgr__tst.java b/400_xowa/src/gplx/xowa/addons/wikis/directorys/dbs/Xowdir_wiki_json_mgr__tst.java new file mode 100644 index 000000000..e48608942 --- /dev/null +++ b/400_xowa/src/gplx/xowa/addons/wikis/directorys/dbs/Xowdir_wiki_json_mgr__tst.java @@ -0,0 +1,72 @@ +/* +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.wikis.directorys.dbs; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.wikis.*; import gplx.xowa.addons.wikis.directorys.*; +import org.junit.*; import gplx.core.tests.*; +import gplx.langs.jsons.*; +public class Xowdir_wiki_json_mgr__tst { + private final Xowdir_wiki_json_mgr__fxt fxt = new Xowdir_wiki_json_mgr__fxt(); + + @Test public void Import__wiki__missing_all() { + // handle all imported .xowa wikis pre v4.3 + fxt.Init__wiki_cfg__json(null); + + Xowdir_wiki_json expd = fxt.Make__json("test", "test", "Main_Page"); + fxt.Test__verify(Bool_.Y, "/dir/test.xowa", Bool_.Y, expd); + fxt.Test__wiki_cfg(expd); + } + @Test public void Import__wiki__missing_domain() { + // handle personal wikis from v4.2 + fxt.Init__wiki_cfg__json(fxt.Make__json(null, "test", "Main_Page")); + + Xowdir_wiki_json expd = fxt.Make__json("test", "test", "Main_Page"); + fxt.Test__verify(Bool_.Y, "/dir/test.xowa", Bool_.Y, expd); + fxt.Test__wiki_cfg(expd); + } + @Test public void Import__wiki__clean() { + // handle clean wiki + fxt.Init__wiki_cfg__json(fxt.Make__json("test", "test", "Main_Page")); + + Xowdir_wiki_json expd = fxt.Make__json("test", "test", "Main_Page"); + fxt.Test__verify(Bool_.Y, "/dir/test.xowa", Bool_.N, expd); + fxt.Test__wiki_cfg(expd); + } +} +class Xowdir_wiki_json_mgr__fxt { + private final Xowdir_wiki_json_mgr mgr = new Xowdir_wiki_json_mgr__mock(); + private final Json_wtr json_wtr = new Json_wtr(); + public Xowdir_wiki_json Make__json(String domain, String name, String main_page) { + return new Xowdir_wiki_json(domain, name, main_page); + } + public void Init__wiki_cfg__json(Xowdir_wiki_json itm) { + if (itm != null) + mgr.Wiki_cfg__upsert(Xowdir_wiki_cfg_.Key__wiki_json, itm.To_str(json_wtr)); + } + public void Test__verify(boolean mode_is_import, String url, boolean expd_dirty, Xowdir_wiki_json expd) { + Xowdir_wiki_json actl = mgr.Verify(mode_is_import, "", Io_url_.new_any_(url)); + + String expd_str = expd.To_str(json_wtr); + String actl_str = actl.To_str(json_wtr); + Gftest.Eq__ary__lines(expd_str, actl_str, "expd"); + Gftest.Eq__bool(expd_dirty, mgr.Dirty(), "dirty"); + } + public void Test__wiki_cfg(Xowdir_wiki_json expd) { + String expd_str = expd.To_str(json_wtr); + Gftest.Eq__ary__lines(expd_str, mgr.Wiki_cfg__select_or(Xowdir_wiki_cfg_.Key__wiki_json, null), "wiki_cfg"); + } +// Gftest.Eq__ary__lines(expd_str, mgr.User_reg__select(actl.Domain()), "user_reg"); +} diff --git a/400_xowa/src/gplx/xowa/addons/wikis/directorys/dbs/Xowdir_wiki_json_mgr__xowa.java b/400_xowa/src/gplx/xowa/addons/wikis/directorys/dbs/Xowdir_wiki_json_mgr__xowa.java new file mode 100644 index 000000000..6f8366b40 --- /dev/null +++ b/400_xowa/src/gplx/xowa/addons/wikis/directorys/dbs/Xowdir_wiki_json_mgr__xowa.java @@ -0,0 +1,59 @@ +/* +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.wikis.directorys.dbs; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.wikis.*; import gplx.xowa.addons.wikis.directorys.*; +import gplx.dbs.*; import gplx.dbs.cfgs.*; +import gplx.langs.jsons.*; +class Xowdir_wiki_json_mgr__xowa extends Xowdir_wiki_json_mgr__base { + private final Xoa_app app; + private final Io_url core_db_url; + private Db_cfg_tbl wiki_cfg_tbl; + private Xowdir_wiki_tbl user_reg_tbl; + public Xowdir_wiki_json_mgr__xowa(Xoa_app app, Io_url core_db_url) {super(Gfo_usr_dlg_.Instance); + this.app = app; + this.core_db_url = core_db_url; + } + private void Wiki_cfg__assert_tbl() { + if (wiki_cfg_tbl == null) { + Db_conn core_db_conn = Db_conn_bldr.Instance.Get_or_noop(core_db_url); + wiki_cfg_tbl = new Db_cfg_tbl(core_db_conn, gplx.xowa.wikis.data.Xowd_cfg_tbl_.Tbl_name); + } + } + @Override public void Wiki_cfg__upsert(String key, String val) { + Wiki_cfg__assert_tbl(); + wiki_cfg_tbl.Upsert_str("init", key, val); + } + @Override public String Wiki_cfg__select_or(String key, String or) { + Wiki_cfg__assert_tbl(); + return wiki_cfg_tbl.Select_str_or("init", key, or); + } + private void User_reg__assert_tbl() { + if (user_reg_tbl == null) { + Xowdir_db_mgr user_db_mgr = new Xowdir_db_mgr(app.User().User_db_mgr().Conn()); + user_reg_tbl = user_db_mgr.Tbl__wiki(); + } + } + @Override public void User_reg__upsert(String domain, String val) { + User_reg__assert_tbl(); +// user_db_mgr.Tbl__wiki().Update_by_key_or_null(domain, val); + } + @Override public String User_reg__select(String domain) { + User_reg__assert_tbl(); + Xowdir_wiki_itm user_wiki_row = user_reg_tbl.Select_by_key_or_null(domain); + return user_wiki_row.Json().To_str(new Json_wtr()); + } +} diff --git a/400_xowa/src/gplx/xowa/addons/wikis/directorys/specials/items/Xowdir_item_mgr.java b/400_xowa/src/gplx/xowa/addons/wikis/directorys/specials/items/Xowdir_item_mgr.java index 8c08e1364..e83b768e7 100644 --- a/400_xowa/src/gplx/xowa/addons/wikis/directorys/specials/items/Xowdir_item_mgr.java +++ b/400_xowa/src/gplx/xowa/addons/wikis/directorys/specials/items/Xowdir_item_mgr.java @@ -66,7 +66,7 @@ class Xowdir_item_mgr { Xowe_wiki wiki = Xow_wiki_factory.Load_personal((Xoae_app)app, Bry_.new_u8(domain), dir_url); // upsert json into cfg for import - Xowdir_db_utl.Wiki_json__upsert(wiki, wiki_json); + Xowdir_wiki_json_.Upsert(wiki, wiki_json); // navigate to it app.Gui__cbk_mgr().Send_redirect(cbk_trg, "/site/" + domain + "/wiki/" + mainpage_name); diff --git a/400_xowa/src/gplx/xowa/addons/wikis/directorys/specials/items/bldrs/Xow_wiki_factory.java b/400_xowa/src/gplx/xowa/addons/wikis/directorys/specials/items/bldrs/Xow_wiki_factory.java index c2cd503e1..b3abc3663 100644 --- a/400_xowa/src/gplx/xowa/addons/wikis/directorys/specials/items/bldrs/Xow_wiki_factory.java +++ b/400_xowa/src/gplx/xowa/addons/wikis/directorys/specials/items/bldrs/Xow_wiki_factory.java @@ -80,6 +80,6 @@ public class Xow_wiki_factory { } // verify json - Xowdir_db_utl.Wiki_json__verify(app, domain, core_db_url, core_db_conn); + Xowdir_wiki_json_.Verify(app, domain, core_db_url, core_db_conn); } } diff --git a/400_xowa/src/gplx/xowa/addons/wikis/directorys/specials/lists/Xowdir_list_svc.java b/400_xowa/src/gplx/xowa/addons/wikis/directorys/specials/lists/Xowdir_list_svc.java index a48493416..d2d737f41 100644 --- a/400_xowa/src/gplx/xowa/addons/wikis/directorys/specials/lists/Xowdir_list_svc.java +++ b/400_xowa/src/gplx/xowa/addons/wikis/directorys/specials/lists/Xowdir_list_svc.java @@ -27,7 +27,7 @@ class Xowdir_list_svc { } public void Import_wiki(Json_nde args) {Import_wiki(args.Get_as_str("url"));} public void Import_wiki(String url) { - // verify it is sqlite + // verify file is sqlite Io_url core_db_url = Io_url_.new_fil_(url); Db_conn core_db_conn = Db_conn_bldr.Instance.Get_or_noop(core_db_url); if (core_db_conn == Db_conn_.Noop) { @@ -35,14 +35,15 @@ class Xowdir_list_svc { return; } - // verify it is a core_db + // verify file is a core_db if (!core_db_conn.Meta_tbl_exists(gplx.xowa.wikis.data.tbls.Xowd_xowa_db_tbl.TBL_NAME)) { app.Gui__cbk_mgr().Send_notify(cbk_trg, "file is not a .xowa file or missing xowa_db table: file=" + url); return; } // get wiki_json from core_db.cfg - Xowdir_wiki_json wiki_json = Xowdir_db_utl.Wiki_json__get_or_create(core_db_url, core_db_conn); + Xowdir_wiki_json_mgr wiki_json_mgr = Xowdir_wiki_json_mgr_.New_xowa(app, core_db_url); + Xowdir_wiki_json wiki_json = wiki_json_mgr.Verify(Bool_.Y, core_db_url.NameOnly(), core_db_url); String domain = wiki_json.Domain(); String mainpage = wiki_json.Mainpage();