1
0
mirror of https://github.com/gnosygnu/xowa.git synced 2026-03-02 03:49:30 +00:00

Embeddable: Create core dbs in proper subdirectory

This commit is contained in:
gnosygnu
2017-10-23 20:50:50 -04:00
parent 1336d44f34
commit 66877212bf
4537 changed files with 311750 additions and 0 deletions

View File

@@ -13,3 +13,23 @@ The terms of each license can be found in the source code repository:
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
*/
package gplx.xowa.addons.apps.cfgs; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.apps.*;
import gplx.xowa.specials.*; import gplx.xowa.htmls.bridges.*;
import gplx.xowa.addons.apps.cfgs.specials.edits.pages.*; import gplx.xowa.addons.apps.cfgs.specials.edits.services.*;
import gplx.xowa.addons.apps.cfgs.specials.maints.pages.*; import gplx.xowa.addons.apps.cfgs.specials.maints.services.*;
public class Xoa_cfg_addon implements Xoax_addon_itm, Xoax_addon_itm__special, Xoax_addon_itm__json {
public Xow_special_page[] Special_pages() {
return new Xow_special_page[]
{ Xocfg_maint_special.Prototype
, Xocfg_edit_special.Prototype
};
}
public Bridge_cmd_itm[] Json_cmds() {
return new Bridge_cmd_itm[]
{ Xocfg_maint_bridge.Prototype
, Xocfg_edit_bridge.Prototype
};
}
public String Addon__key() {return ADDON__KEY;} private static final String ADDON__KEY = "xowa.app.cfg";
}

View File

@@ -13,3 +13,137 @@ The terms of each license can be found in the source code repository:
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
*/
package gplx.xowa.addons.apps.cfgs; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.apps.*;
import gplx.dbs.*; import gplx.xowa.addons.apps.cfgs.mgrs.caches.*; import gplx.xowa.addons.apps.cfgs.mgrs.dflts.*; import gplx.xowa.addons.apps.cfgs.mgrs.types.*; import gplx.xowa.addons.apps.cfgs.mgrs.execs.*;
public class Xocfg_mgr implements Gfo_invk {
public Xocfg_mgr() {
this.dflt_mgr = new Xocfg_dflt_mgr(cache_mgr);
}
public Xocfg_cache_mgr Cache_mgr() {return cache_mgr;} private final Xocfg_cache_mgr cache_mgr = new Xocfg_cache_mgr();
public Xocfg_type_mgr Type_mgr() {return type_mgr;} private final Xocfg_type_mgr type_mgr = new Xocfg_type_mgr();
public Xocfg_dflt_mgr Dflt_mgr() {return dflt_mgr;} private final Xocfg_dflt_mgr dflt_mgr;
public Xocfg_exec_mgr Exec_mgr() {return exec_mgr;} private final Xocfg_exec_mgr exec_mgr = new Xocfg_exec_mgr();
public void Init_by_app(Xoa_app app) {
cache_mgr.Init_by_app
( gplx.xowa.addons.apps.cfgs.dbs.Xocfg_db_app.New_conn(app)
, app.User().User_db_mgr().Conn());
}
public void Sub_many_app (Gfo_invk sub, String... keys) {Bind_many(Bool_.N, sub, Xocfg_mgr.Ctx__app, keys);}
public void Bind_many_app (Gfo_invk sub, String... keys) {Bind_many(Bool_.Y, sub, Xocfg_mgr.Ctx__app, keys);}
public void Bind_many_wiki (Gfo_invk sub, Xow_wiki wiki, String... keys) {Bind_many(Bool_.Y, sub, wiki.Domain_itm().Abrv_xo_str(), keys);}
private void Bind_many(boolean pub, Gfo_invk sub, String ctx, String... keys) {
for (String key : keys) {
try {
cache_mgr.Sub(sub, ctx, key, key);
if (pub) {
String val = cache_mgr.Get(ctx, key);
cache_mgr.Pub(ctx, key, val);
}
}
catch (Exception e) {
Gfo_usr_dlg_.Instance.Warn_many("", "", "bind failed: ctx=~{0} key=~{1} err=~{2}", ctx, key, Err_.Message_gplx_log(e));
}
}
}
public boolean Get_bool_app_or(String key, boolean or) {
String rv = Get_str(Ctx__app, key);
return rv == null ? or : Yn.parse_or(rv, or);
}
public boolean Get_bool_wiki_or(Xow_wiki wiki, String key, boolean or) {
String rv = Get_str(wiki.Domain_itm().Abrv_xo_str(), key);
return rv == null ? or : Yn.parse_or(rv, or);
}
public int Get_int_app_or(String key, int or) {
String rv = cache_mgr.Get_or(Ctx__app, key, null);
return rv == null ? or : Int_.Parse_or(rv, or);
}
public long Get_long_app_or(String key, long or) {
String rv = cache_mgr.Get_or(Ctx__app, key, null);
return rv == null ? or : Long_.parse_or(rv, or);
}
public DateAdp Get_date_app_or(String key, DateAdp or) {
String rv = cache_mgr.Get_or(Ctx__app, key, null);
return rv == null ? or : DateAdp_.parse_fmt_or(rv, Fmt__time, or);
}
public String[] Get_strary_app_or(String key, String dlm, String... or) {
String rv = cache_mgr.Get_or(Ctx__app, key, null);
return rv == null ? or : String_.Ary_parse(String_.Trim(rv), dlm);
}
public String Get_str_wiki_or(Xow_wiki wiki, String key, String or) {return cache_mgr.Get_or(wiki.Domain_itm().Abrv_xo_str(), key, or);}
public String Get_str_app_or(String key, String or) {return cache_mgr.Get_or(Ctx__app, key, or);}
public String Get_str_app(String key) {return Get_str(Xocfg_mgr.Ctx__app, key);}
public boolean Get_bool_or(String ctx, String key, boolean or) {
String rv = cache_mgr.Get(ctx, key);
try {return Yn.parse(rv);}
catch (Exception exc) {
Err_.Noop(exc);
Gfo_usr_dlg_.Instance.Warn_many("", "", "cfg:failed to parse boolean; key=~{0} val=~{1}", key, rv);
return or;
}
}
public int Get_int_wiki_or(Xow_wiki wiki, String key, int or) {
String rv = Get_str(wiki.Domain_itm().Abrv_xo_str(), key);
try {return Int_.Parse(rv);}
catch (Exception exc) {
Err_.Noop(exc);
Gfo_usr_dlg_.Instance.Warn_many("", "", "cfg:failed to parse int; key=~{0} val=~{1}", key, rv);
return or;
}
}
public int Get_int_or(String ctx, String key, int or) {
String rv = cache_mgr.Get(ctx, key);
try {return Int_.Parse(rv);}
catch (Exception exc) {
Err_.Noop(exc);
Gfo_usr_dlg_.Instance.Warn_many("", "", "cfg:failed to parse int; key=~{0} val=~{1}", key, rv);
return or;
}
}
public Io_url Get_url_or(String ctx, String key, Io_url or) {
String rv = cache_mgr.Get(ctx, key);
try {return Io_url_.new_any_(rv);}
catch (Exception exc) {
Err_.Noop(exc);
Gfo_usr_dlg_.Instance.Warn_many("", "", "cfg:failed to parse int; key=~{0} val=~{1}", key, rv);
return or;
}
}
public String To_ctx(Xow_wiki wiki) {return wiki.Domain_itm().Abrv_xo_str();}
public String Get_str(String ctx, String key) {return cache_mgr.Get(ctx, key);}
public void Set_bool_app(String key, boolean val) {Set_str(Xocfg_mgr.Ctx__app, key, Yn.To_str(val));}
public void Set_float_app(String key, float val) {Set_str(Xocfg_mgr.Ctx__app, key, Float_.To_str(val));}
public void Set_str_app(String key, String val) {Set_str(Xocfg_mgr.Ctx__app, key, val);}
public void Set_bry_app(String key, byte[] val) {Set_str(Xocfg_mgr.Ctx__app, key, String_.new_u8(val));}
public void Set_date_app(String key, DateAdp val) {Set_str(Xocfg_mgr.Ctx__app, key, val.XtoUtc().XtoStr_fmt(Fmt__time));}
public void Set_int_app(String key, int val) {Set_str(Xocfg_mgr.Ctx__app, key, Int_.To_str(val));}
public void Set_bry_wiki(Xowe_wiki wiki, String key, byte[] val) {Set_str(wiki.Domain_itm().Abrv_xo_str(), key, String_.new_u8(val));}
public void Set_str(String ctx, String key, String val) {
cache_mgr.Set(ctx, key, val);
}
public void Del(String ctx, String key) {
cache_mgr.Del(ctx, key);
}
public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) {
if (ctx.Match(k, "set")) cache_mgr.Set ((String)m.ReadValAt(0), (String)m.ReadValAt(1), (String)m.ReadValAt(2));
else if (ctx.Match(k, "set_temp")) cache_mgr.Set_wo_save ((String)m.ReadValAt(0), (String)m.ReadValAt(1), (String)m.ReadValAt(2));
else if (ctx.Match(k, "set_dflt")) dflt_mgr.Add ((String)m.ReadValAt(0), (String)m.ReadValAt(1));
else if (ctx.Match(k, "run")) cache_mgr.Pub ((String)m.ReadValAt(0), (String)m.ReadValAt(1), (String)m.ReadValAt(2));
else if (ctx.Match(k, "get")) return cache_mgr.Get ((String)m.ReadValAt(0), (String)m.ReadValAt(1));
else return Gfo_invk_.Rv_unhandled;
return this;
}
public static String Ctx__app = "app";
public static String[] Parse_io_cmd(String raw) {
String[] rv = new String[2];
rv[0] = "";
rv[1] = "";
int pos = String_.FindFwd(raw, "|");
if (pos != Bry_find_.Not_found) {
rv[0] = String_.Mid(raw, 0, pos);
rv[1] = String_.Mid(raw, pos + 1);
}
return rv;
}
public static final String Fmt__time = "yyyy-MM-dd HH:mm:ss";
}

View File

@@ -13,3 +13,28 @@ The terms of each license can be found in the source code repository:
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
*/
package gplx.xowa.addons.apps.cfgs.dbs; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.apps.*; import gplx.xowa.addons.apps.cfgs.*;
import gplx.dbs.*; import gplx.xowa.addons.apps.cfgs.dbs.tbls.*;
public class Xocfg_db_app {
public Xocfg_db_app(Db_conn conn) {
this.conn = conn;
this.tbl__grp = new Xocfg_grp_tbl(conn);
this.tbl__map = new Xocfg_map_tbl(conn);
this.tbl__itm = new Xocfg_itm_tbl(conn);
this.tbl__txt = new Xocfg_txt_tbl(conn);
conn.Meta_tbl_assert(tbl__grp, tbl__map, tbl__itm, tbl__txt);
}
public Db_conn Conn() {return conn;} private final Db_conn conn;
public Xocfg_grp_tbl Tbl__grp() {return tbl__grp;} private final Xocfg_grp_tbl tbl__grp;
public Xocfg_map_tbl Tbl__map() {return tbl__map;} private final Xocfg_map_tbl tbl__map;
public Xocfg_itm_tbl Tbl__itm() {return tbl__itm;} private final Xocfg_itm_tbl tbl__itm;
public Xocfg_txt_tbl Tbl__txt() {return tbl__txt;} private final Xocfg_txt_tbl tbl__txt;
public static Db_conn New_conn(Xoa_app app) {
Io_url url = app.Fsys_mgr().Bin_addon_dir().GenSubFil_nest("app", "cfg", "xo.cfg.sqlite3");
return Db_conn_bldr.Instance.Get_or_autocreate(true, url);
}
public static Xocfg_db_app New(Xoa_app app) {
return new Xocfg_db_app(New_conn(app));
}
}

View File

@@ -13,3 +13,29 @@ The terms of each license can be found in the source code repository:
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
*/
package gplx.xowa.addons.apps.cfgs.dbs; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.apps.*; import gplx.xowa.addons.apps.cfgs.*;
import gplx.dbs.*;
import gplx.xowa.addons.apps.cfgs.dbs.tbls.*;
public class Xocfg_db_usr {
private final Xocfg_itm_tbl tbl__itm;
public Xocfg_db_usr(Xocfg_db_app db_app, Db_conn conn) {
this.conn = conn;
this.tbl__val = new Xocfg_val_tbl(conn);
conn.Meta_tbl_assert(tbl__val);
this.tbl__itm = db_app.Tbl__itm();
}
public Db_conn Conn() {return conn;} private final Db_conn conn;
public Xocfg_val_tbl Tbl__val() {return tbl__val;} private final Xocfg_val_tbl tbl__val;
public String Get_str(String ctx, String key) {
Xocfg_itm_row itm_row = tbl__itm.Select_by_key_or_null(key);
if (itm_row == null) throw Err_.new_wo_type("cfg not defined", "ctx", ctx, "key", key);
Xocfg_val_row val_row = tbl__val.Select_one_or_null(ctx, key);
return val_row == null ? itm_row.Dflt() : val_row.Val();
}
public void Set_str(String ctx, String key, String val) {
tbl__val.Upsert(ctx, key, val, Datetime_now.Get().XtoUtc().XtoStr_fmt_iso_8561());
}
public void Del(String ctx, String key) {
tbl__val.Delete(ctx, key);
}
}

View File

@@ -13,3 +13,14 @@ The terms of each license can be found in the source code repository:
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
*/
package gplx.xowa.addons.apps.cfgs.dbs.tbls; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.apps.*; import gplx.xowa.addons.apps.cfgs.*; import gplx.xowa.addons.apps.cfgs.dbs.*;
public class Xocfg_grp_row {
public Xocfg_grp_row(int id, String key) {
this.id = id;
this.key = key;
}
public int Id() {return id;} private final int id;
public String Key() {return key;} private final String key;
public static final int Id__root = -1;
}

View File

@@ -13,3 +13,43 @@ The terms of each license can be found in the source code repository:
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
*/
package gplx.xowa.addons.apps.cfgs.dbs.tbls; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.apps.*; import gplx.xowa.addons.apps.cfgs.*; import gplx.xowa.addons.apps.cfgs.dbs.*;
import gplx.dbs.*; import gplx.dbs.utls.*;
public class Xocfg_grp_tbl implements Db_tbl {
private final Dbmeta_fld_list flds = new Dbmeta_fld_list();
private final String fld__grp_id, fld__grp_key;
private final Db_conn conn;
public Xocfg_grp_tbl(Db_conn conn) {
this.conn = conn;
this.fld__grp_id = flds.Add_int_pkey("grp_id");
this.fld__grp_key = flds.Add_str("grp_key", 255);
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_unique_by_tbl(tbl_name, fld__grp_key, fld__grp_key)
));
}
public void Upsert(int grp_id, String grp_key) {
Db_tbl__crud_.Upsert(conn, tbl_name, flds, String_.Ary(fld__grp_id), grp_id, grp_key);
}
public int Select_id_by_key_or_fail(String key) {
Xocfg_grp_row itm = this.Select_by_key_or_null(key);
if (itm == null) throw Err_.new_wo_type("cfg.grp:invalid key", "key", key);
return itm.Id();
}
public Xocfg_grp_row Select_by_key_or_null(String key) {
Db_rdr rdr = conn.Stmt_select(tbl_name, flds, fld__grp_key).Crt_str(fld__grp_key, key).Exec_select__rls_auto();
try {return rdr.Move_next() ? Load(rdr): null;}
finally {rdr.Rls();}
}
private Xocfg_grp_row Load(Db_rdr rdr) {
return new Xocfg_grp_row
( rdr.Read_int(fld__grp_id)
, rdr.Read_str(fld__grp_key)
);
}
public void Rls() {}
public static final String TBL_NAME = "cfg_grp";
}

View File

@@ -13,3 +13,22 @@ The terms of each license can be found in the source code repository:
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
*/
package gplx.xowa.addons.apps.cfgs.dbs.tbls; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.apps.*; import gplx.xowa.addons.apps.cfgs.*; import gplx.xowa.addons.apps.cfgs.dbs.*;
public class Xocfg_itm_row {
public Xocfg_itm_row(int id, String key, int scope, String type, String dflt, String html_atrs, String html_cls) {
this.id = id;
this.key = key;
this.scope = scope;
this.type = type;
this.dflt = dflt;
this.html_atrs = html_atrs;
this.html_cls = html_cls;
}
public int Id() {return id;} private final int id;
public String Key() {return key;} private final String key;
public int Scope() {return scope;} private final int scope;
public String Type() {return type;} private final String type;
public String Dflt() {return dflt;} private final String dflt;
public String Html_atrs() {return html_atrs;} private final String html_atrs;
public String Html_cls() {return html_cls;} private final String html_cls;
}

View File

@@ -13,3 +13,52 @@ The terms of each license can be found in the source code repository:
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
*/
package gplx.xowa.addons.apps.cfgs.dbs.tbls; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.apps.*; import gplx.xowa.addons.apps.cfgs.*; import gplx.xowa.addons.apps.cfgs.dbs.*;
import gplx.dbs.*; import gplx.dbs.utls.*;
public class Xocfg_itm_tbl implements Db_tbl {
private final Dbmeta_fld_list flds = new Dbmeta_fld_list();
private final String fld__itm_id, fld__itm_key, fld__itm_scope, fld__itm_type, fld__itm_dflt, fld__itm_html_atrs, fld__itm_html_cls;
private final Db_conn conn;
public Xocfg_itm_tbl(Db_conn conn) {
this.conn = conn;
this.tbl_name = "cfg_itm";
this.fld__itm_id = flds.Add_int_pkey("itm_id"); // EX: '1'
this.fld__itm_key = flds.Add_str("itm_key", 255); // EX: 'cfg_1'
this.fld__itm_scope = flds.Add_int("itm_scope"); // EX: '1'; ENUM: Xoitm_scope_enum
this.fld__itm_type = flds.Add_str("itm_type", 255); // EX: '1'; ENUM: Xoitm_type_enum
this.fld__itm_dflt = flds.Add_str("itm_dflt", 4096); // EX: 'abc'
this.fld__itm_html_atrs = flds.Add_str("itm_html_atrs", 255); // EX: 'size="5"'
this.fld__itm_html_cls = flds.Add_str("itm_html_cls", 255); // EX: 'xocfg__bool__readonly'
conn.Rls_reg(this);
}
public String Tbl_name() {return tbl_name;} private final String tbl_name;
public void Create_tbl() {
conn.Meta_tbl_create(Dbmeta_tbl_itm.New(tbl_name, flds
, Dbmeta_idx_itm.new_unique_by_tbl(tbl_name, fld__itm_key, fld__itm_key)));
}
public void Upsert(int id, String key, int scope, String type, String dflt, String html_atrs, String html_cls) {
Db_tbl__crud_.Upsert(conn, tbl_name, flds, String_.Ary(fld__itm_id), id, key, scope, type, dflt, html_atrs, html_cls);
}
public int Select_id_or(String key, int or) {
Db_rdr rdr = conn.Stmt_select(tbl_name, flds, fld__itm_key).Crt_str(fld__itm_key, key).Exec_select__rls_auto();
try {return rdr.Move_next() ? rdr.Read_int(fld__itm_id) : or;}
finally {rdr.Rls();}
}
public Xocfg_itm_row Select_by_key_or_null(String key) {
Db_rdr rdr = conn.Stmt_select(tbl_name, flds, fld__itm_key).Crt_str(fld__itm_key, key).Exec_select__rls_auto();
try {return rdr.Move_next() ? Load(rdr) : null;}
finally {rdr.Rls();}
}
private Xocfg_itm_row Load(Db_rdr rdr) {
return new Xocfg_itm_row
( rdr.Read_int(fld__itm_id)
, rdr.Read_str(fld__itm_key)
, rdr.Read_int(fld__itm_scope)
, rdr.Read_str(fld__itm_type)
, rdr.Read_str(fld__itm_dflt)
, rdr.Read_str(fld__itm_html_atrs)
, rdr.Read_str(fld__itm_html_cls)
);
}
public void Rls() {}
}

View File

@@ -13,3 +13,50 @@ The terms of each license can be found in the source code repository:
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
*/
package gplx.xowa.addons.apps.cfgs.dbs.tbls; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.apps.*; import gplx.xowa.addons.apps.cfgs.*; import gplx.xowa.addons.apps.cfgs.dbs.*;
import gplx.dbs.*; import gplx.dbs.utls.*;
public class Xocfg_map_tbl implements Db_tbl {
private final Dbmeta_fld_list flds = new Dbmeta_fld_list();
private final String fld__map_src, fld__map_trg, fld__map_sort;
private final Db_conn conn;
public Xocfg_map_tbl(Db_conn conn) {
this.conn = conn;
this.tbl_name = "cfg_map";
this.fld__map_src = flds.Add_int("map_src");
this.fld__map_trg = flds.Add_int("map_trg");
this.fld__map_sort = flds.Add_int("map_sort");
conn.Rls_reg(this);
}
public String Tbl_name() {return tbl_name;} private final String tbl_name;
public void Create_tbl() {
conn.Meta_tbl_create(Dbmeta_tbl_itm.New(tbl_name, flds
, Dbmeta_idx_itm.new_unique_by_tbl(tbl_name, "core", fld__map_src, fld__map_trg)
));
}
public void Upsert(int map_src, int map_trg, int map_sort) {
Db_tbl__crud_.Upsert(conn, tbl_name, flds, String_.Ary(fld__map_src, fld__map_trg), map_src, map_trg, map_sort);
}
public int Select_sort_or_next(int src_id, int trg_id) {
// select map_sort by map_src,map_trg
Db_rdr rdr = conn.Stmt_select(tbl_name, flds, fld__map_src, fld__map_trg).Crt_int(fld__map_src, src_id).Crt_int(fld__map_trg, trg_id).Exec_select__rls_auto();
try {
if (rdr.Move_next()) {
return rdr.Read_int(fld__map_sort);
}
}
finally {rdr.Rls();}
// pairing doesn't exist; select max
rdr = conn.Stmt_select_max(tbl_name, fld__map_sort, fld__map_src).Crt_int(fld__map_src, src_id).Exec_select__rls_auto();
try {
if (!rdr.Move_next()) return 0;
Object max = rdr.Read_obj(fld__map_sort);
return max == null ? 0 : Int_.Cast(max) + 10;
}
finally {rdr.Rls();}
}
public void Delete(int src_id, int trg_id) {
conn.Stmt_delete(tbl_name, fld__map_src, fld__map_trg).Crt_int(fld__map_src, src_id).Crt_int(fld__map_trg, trg_id).Exec_delete();
}
public void Rls() {}
}

View File

@@ -13,3 +13,18 @@ The terms of each license can be found in the source code repository:
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
*/
package gplx.xowa.addons.apps.cfgs.dbs.tbls; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.apps.*; import gplx.xowa.addons.apps.cfgs.*; import gplx.xowa.addons.apps.cfgs.dbs.*;
public class Xocfg_txt_itm {
public Xocfg_txt_itm(int id, String lang, String name, String help) {
this.id = id;
this.lang = lang;
this.name = name;
this.help = help;
}
public int Id() {return id;} private final int id;
public String Lang() {return lang;} private final String lang;
public String Name() {return name;} private final String name;
public String Help() {return help;} private final String help;
public static final int Tid__grp = 1, Tid__itm = 2;
}

View File

@@ -13,3 +13,38 @@ The terms of each license can be found in the source code repository:
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
*/
package gplx.xowa.addons.apps.cfgs.dbs.tbls; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.apps.*; import gplx.xowa.addons.apps.cfgs.*; import gplx.xowa.addons.apps.cfgs.dbs.*;
import gplx.dbs.*; import gplx.dbs.utls.*;
public class Xocfg_txt_tbl implements Db_tbl {
private final Dbmeta_fld_list flds = new Dbmeta_fld_list();
private final String fld__nde_id, fld__nde_lang, fld__nde_name, fld__nde_help;
private final Db_conn conn;
public Xocfg_txt_tbl(Db_conn conn) {
this.conn = conn;
this.tbl_name = "cfg_txt";
this.fld__nde_id = flds.Add_int_pkey("nde_id"); // EX: '2'
this.fld__nde_lang = flds.Add_str("nde_lang", 16); // EX: 'en'
this.fld__nde_name = flds.Add_str("nde_name", 255); // EX: 'Cfg Name'
this.fld__nde_help = flds.Add_str("nde_help", 4096); // EX: 'Help text'
conn.Rls_reg(this);
}
public String Tbl_name() {return tbl_name;} private final String tbl_name;
public void Create_tbl() {conn.Meta_tbl_create(Dbmeta_tbl_itm.New(tbl_name, flds));}
public void Upsert(int nde_id, String nde_lang, String nde_name, String nde_help) {
Db_tbl__crud_.Upsert(conn, tbl_name, flds, String_.Ary(fld__nde_id, fld__nde_lang), nde_id, nde_lang, nde_name, nde_help);
}
public Xocfg_txt_itm Select_by_id_or_null(int id) {
Db_rdr rdr = conn.Stmt_select(tbl_name, flds, fld__nde_id).Crt_int(fld__nde_id, id).Exec_select__rls_auto();
try {return rdr.Move_next() ? Load(rdr) : null;}
finally {rdr.Rls();}
}
private Xocfg_txt_itm Load(Db_rdr rdr) {
return new Xocfg_txt_itm
( rdr.Read_int(fld__nde_id)
, rdr.Read_str(fld__nde_lang)
, rdr.Read_str(fld__nde_name)
, rdr.Read_str(fld__nde_help)
);
}
public void Rls() {}
}

View File

@@ -13,3 +13,16 @@ The terms of each license can be found in the source code repository:
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
*/
package gplx.xowa.addons.apps.cfgs.dbs.tbls; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.apps.*; import gplx.xowa.addons.apps.cfgs.*; import gplx.xowa.addons.apps.cfgs.dbs.*;
public class Xocfg_val_row {
public Xocfg_val_row(String key, String ctx, String val, String date) {
this.key = key;
this.ctx = ctx;
this.val = val;
this.date = date;
}
public String Key() {return key;} private final String key;
public String Ctx() {return ctx;} private final String ctx;
public String Val() {return val;} private final String val;
public String Date() {return date;} private final String date;
}

View File

@@ -13,3 +13,56 @@ The terms of each license can be found in the source code repository:
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
*/
package gplx.xowa.addons.apps.cfgs.dbs.tbls; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.apps.*; import gplx.xowa.addons.apps.cfgs.*; import gplx.xowa.addons.apps.cfgs.dbs.*;
import gplx.dbs.*; import gplx.dbs.utls.*;
public class Xocfg_val_tbl implements Db_tbl {
private final Dbmeta_fld_list flds = new Dbmeta_fld_list();
private final String fld__itm_key, fld__itm_ctx, fld__itm_val, fld__itm_date;
private final Db_conn conn;
public Xocfg_val_tbl(Db_conn conn) {
this.conn = conn;
this.tbl_name = "cfg_val";
this.fld__itm_key = flds.Add_str("itm_key", 255); // EX: 'xowa.app.cfg_1'
this.fld__itm_ctx = flds.Add_str("itm_ctx", 255); // EX: 'app'; 'en.w'; 'ns-10'
this.fld__itm_val = flds.Add_str("itm_val", 4096); // EX: 'abc'
this.fld__itm_date = flds.Add_str("itm_date", 16); // EX: '20160901_010203'
conn.Rls_reg(this);
}
public String Tbl_name() {return tbl_name;} private final String 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, "core", fld__itm_key, fld__itm_ctx) // NOTE: key,ctx b/c key has greater specificity
));
}
public void Upsert(String ctx, String key, String val, String date) {
Db_tbl__crud_.Upsert(conn, tbl_name, flds, String_.Ary(fld__itm_key, fld__itm_ctx), key, ctx, val, date);
}
public void Delete(String ctx, String key) {
conn.Stmt_delete(tbl_name, fld__itm_key, fld__itm_ctx).Crt_str(fld__itm_key, key).Crt_str(fld__itm_ctx, ctx).Exec_delete();
}
public Xocfg_val_row Select_one_or_null(String ctx, String key) {
Db_rdr rdr = conn.Stmt_select(tbl_name, flds, fld__itm_key, fld__itm_ctx).Crt_str(fld__itm_key, key).Crt_str(fld__itm_ctx, ctx).Exec_select__rls_auto();
try {return rdr.Move_next() ? Load(rdr) : null;}
finally {rdr.Rls();}
}
public Xocfg_val_row[] Select_all(String key) {
List_adp list = List_adp_.New();
Db_rdr rdr = conn.Stmt_select(tbl_name, flds, fld__itm_key).Crt_str(fld__itm_key, key).Exec_select__rls_auto();
try {
while (rdr.Move_next()) {
list.Add(Load(rdr));
}
}
finally {rdr.Rls();}
return (Xocfg_val_row[])list.To_ary_and_clear(Xocfg_val_row.class);
}
private Xocfg_val_row Load(Db_rdr rdr) {
return new Xocfg_val_row
( rdr.Read_str(fld__itm_key)
, rdr.Read_str(fld__itm_ctx)
, rdr.Read_str(fld__itm_val)
, rdr.Read_str(fld__itm_date)
);
}
public void Rls() {}
}

View File

@@ -13,3 +13,32 @@ The terms of each license can be found in the source code repository:
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
*/
package gplx.xowa.addons.apps.cfgs.enums; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.apps.*; import gplx.xowa.addons.apps.cfgs.*;
import gplx.gfui.*; import gplx.xowa.guis.bnds.*;
public class Xoitm_gui_binding {
public static String[] To_gui(String val) {
Gfui_bnd_parser parser = Gfui_bnd_parser.new_en_();
String[] rv = new String[2];
int pipe_pos = String_.FindFwd(val, "|");
if (pipe_pos == -1) throw Err_.new_wo_type("cfg.binding:unknown gui binding; val=" + val);
rv[0] = Xog_bnd_box_.To_gui_str(String_.Mid(val, 0, pipe_pos));
rv[1] = parser.Xto_norm(String_.Mid(val, pipe_pos + 1, String_.Len(val)));
return rv;
}
public static String To_db_str(String val) {
Gfui_bnd_parser parser = Gfui_bnd_parser.new_en_();
String[] rv = new String[2];
int pipe_pos = String_.FindFwd(val, "|");
if (pipe_pos == -1) throw Err_.new_wo_type("cfg.binding:unknown gui binding; val=" + val);
rv[0] = Xog_bnd_box_.To_key_str(String_.Mid(val, 0, pipe_pos));
rv[1] = parser.Xto_gfui(String_.Mid(val, pipe_pos + 1, String_.Len(val)));
return rv[0] + "|" + rv[1];
}
public static String[] To_ary(String val) {
String[] rv = new String[2];
int pipe_pos = String_.FindFwd(val, "|");
rv[0] = String_.Mid(val, 0, pipe_pos);
rv[1] = String_.Mid(val, pipe_pos + 1, String_.Len(val));
return rv;
}
}

View File

@@ -13,3 +13,7 @@ The terms of each license can be found in the source code repository:
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
*/
package gplx.xowa.addons.apps.cfgs.enums; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.apps.*; import gplx.xowa.addons.apps.cfgs.*;
public class Xoitm_lang_tid {
public static final String Lang__dflt = "en";
}

View File

@@ -13,3 +13,12 @@ The terms of each license can be found in the source code repository:
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
*/
package gplx.xowa.addons.apps.cfgs.enums; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.apps.*; import gplx.xowa.addons.apps.cfgs.*;
public class Xoitm_scope_enum { // SERIALIZED
public static final int Tid__app = 1, Tid__wiki = 2;
public static int To_int(String raw) {
if (String_.Eq(raw, "app")) return Tid__app;
else if (String_.Eq(raw, "wiki")) return Tid__wiki;
else throw Err_.new_unhandled_default(raw);
}
}

View File

@@ -13,3 +13,28 @@ The terms of each license can be found in the source code repository:
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
*/
package gplx.xowa.addons.apps.cfgs.enums; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.apps.*; import gplx.xowa.addons.apps.cfgs.*;
public class Xoitm_type_enum {
public static final int
Tid__bool = 0
, Tid__int = 1
, Tid__str = 2
, Tid__memo = 3
, Tid__list = 4
, Tid__btn = 5
, Tid__io_cmd = 6
, Tid__gui_binding = 7
;
public static int To_uid(String v) {
if (String_.Eq(v, Bool_.Cls_val_name)) return Tid__bool;
else if (String_.Eq(v, Int_.Cls_val_name)) return Tid__int;
else if (String_.Eq(v, String_.Cls_val_name)) return Tid__str;
else if (String_.Eq(v, "memo")) return Tid__memo;
else if (String_.Eq(v, "btn")) return Tid__btn;
else if (String_.Eq(v, "io.cmd")) return Tid__io_cmd;
else if (String_.Eq(v, "gui.binding")) return Tid__gui_binding;
else if (String_.Has_at_bgn(v, "list:")) return Tid__list;
else throw Err_.new_wo_type("unknown cfg type enum; v=" + v);
}
}

View File

@@ -13,3 +13,73 @@ The terms of each license can be found in the source code repository:
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
*/
package gplx.xowa.addons.apps.cfgs.mgrs.caches; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.apps.*; import gplx.xowa.addons.apps.cfgs.*; import gplx.xowa.addons.apps.cfgs.mgrs.*;
public class Xocfg_cache_grp {
private final Hash_adp vals = Hash_adp_.New();
private final Ordered_hash subs = Ordered_hash_.New();
public Xocfg_cache_grp(String key, String dflt, String data_type) {
this.key = key;
this.dflt = dflt;
this.data_type = data_type;
}
public String Key() {return key;} private final String key;
public String Data_type() {return data_type;} private final String data_type;
public String Dflt() {return dflt;} private String dflt;
public void Dflt_(String v) {this.dflt = v;}
public String Get(String ctx) {
// exact match; EX: "en.w|key_1"
Xocfg_cache_itm rv = (Xocfg_cache_itm)vals.Get_by(ctx);
if (rv != null) return rv.Val();
// global match; EX: "app|key_1"
rv = (Xocfg_cache_itm)vals.Get_by(Xocfg_mgr.Ctx__app);
if (rv != null) return rv.Val();
// dflt
return dflt;
}
public void Set(String ctx, String val) {
Xocfg_cache_itm rv = (Xocfg_cache_itm)vals.Get_by(ctx);
if (rv == null) {
rv = new Xocfg_cache_itm(ctx, key, val);
vals.Add(ctx, rv);
}
else {
rv.Val_(val);
}
}
public void Del(String ctx) {
vals.Del(ctx);
}
public void Add(String ctx, Xocfg_cache_itm itm) {
vals.Add(ctx, itm);
}
public void Sub(Gfo_invk sub, String ctx, String evt) {
List_adp list = (List_adp)subs.Get_by(ctx);
if (list == null) {
list = List_adp_.New();
subs.Add(ctx, list);
}
list.Add(new Xocfg_cache_sub(sub, ctx, evt, key));
}
public void Pub(String ctx, String val) {
// exact match; EX: "en.w|key_1"
List_adp list = (List_adp)subs.Get_by(ctx);
if (list == null) {// global match; EX: "app|key_1"
int len = subs.Len();
for (int i = 0; i < len; i++) {
list = (List_adp)subs.Get_at(i);
Pub(list, val);
}
}
if (list != null) // NOTE: check for null as it's possible for no subscribers
Pub(list, val);
}
private void Pub(List_adp list, String val) {
int len = list.Len();
for (int i = 0; i < len; i++) {
Xocfg_cache_sub sub = (Xocfg_cache_sub)list.Get_at(i);
Gfo_invk_.Invk_by_msg(sub.Sub(), sub.Evt(), GfoMsg_.new_parse_(sub.Evt()).Add("v", val));
}
}
}

View File

@@ -13,3 +13,15 @@ The terms of each license can be found in the source code repository:
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
*/
package gplx.xowa.addons.apps.cfgs.mgrs.caches; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.apps.*; import gplx.xowa.addons.apps.cfgs.*; import gplx.xowa.addons.apps.cfgs.mgrs.*;
public class Xocfg_cache_itm {
public Xocfg_cache_itm(String ctx, String key, String val) {
this.ctx = ctx;
this.key = key;
this.val = val;
}
public String Ctx() {return ctx;} private final String ctx;
public String Key() {return key;} private final String key;
public String Val() {return val;} private String val;
public void Val_(String val) {this.val = val;}
}

View File

@@ -13,3 +13,91 @@ The terms of each license can be found in the source code repository:
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
*/
package gplx.xowa.addons.apps.cfgs.mgrs.caches; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.apps.*; import gplx.xowa.addons.apps.cfgs.*; import gplx.xowa.addons.apps.cfgs.mgrs.*;
import gplx.dbs.*;
import gplx.xowa.addons.apps.cfgs.dbs.*; import gplx.xowa.addons.apps.cfgs.dbs.tbls.*; import gplx.xowa.addons.apps.cfgs.enums.*;
public class Xocfg_cache_mgr {
private final Hash_adp grps = Hash_adp_.New();
public Xocfg_cache_mgr() {
this.db_app = new Xocfg_db_app(Db_conn_.Noop);
this.db_usr = new Xocfg_db_usr(db_app, Db_conn_.Noop);
}
public void Init_by_app(Db_conn app_conn, Db_conn usr_conn) {
this.db_app = new Xocfg_db_app(app_conn);
this.db_usr = new Xocfg_db_usr(db_app, usr_conn);
}
public Xocfg_db_app Db_app() {return db_app;} private Xocfg_db_app db_app;
public Xocfg_db_usr Db_usr() {return db_usr;} private Xocfg_db_usr db_usr;
// public void Clear() {grps.Clear();} // TOMBSTONE: do not call .Clear b/c subscribers are kept in grps and are only loaded once at app startup
public String Get(String ctx, String key) {
Xocfg_cache_grp grp = Grps__get_or_load(key);
return grp.Get(ctx);
}
public String Get_or(String ctx, String key, String or) {
Xocfg_cache_grp grp = (Xocfg_cache_grp)grps.Get_by(key);
if (grp == null) {
grp = Load_grp(key, or);
grps.Add(key, grp);
}
return grp.Get(ctx);
}
public void Set(String ctx, String key, String val) {Set(Bool_.Y, ctx, key, val);}
public void Set_wo_save(String ctx, String key, String val) {Set(Bool_.N, ctx, key, val);}
public void Set(boolean save, String ctx, String key, String val) {
Xocfg_cache_grp grp = Grps__get_or_load(key);
grp.Pub(ctx, val); // publish first; if fail will throw error
grp.Set(ctx, val);
if (save) {
if (String_.Eq(grp.Dflt(), val))
db_usr.Del(ctx, key);
else
db_usr.Set_str(ctx, key, val);
}
}
public void Del(String ctx, String key) {
Xocfg_cache_grp grp = Grps__get_or_load(key);
grp.Del(ctx);
db_usr.Del(ctx, key);
grp.Pub(ctx, grp.Dflt());
}
public void Sub(Gfo_invk sub, String ctx, String key, String evt) {
Xocfg_cache_grp grp = Grps__get_or_load(key);
grp.Sub(sub, ctx, evt);
}
public void Pub(String ctx, String key, String val) {
Xocfg_cache_grp grp = Grps__get_or_load(key);
grp.Pub(ctx, val);
}
public void Dflt(String key, String val) {
Xocfg_cache_grp grp = Grps__get_or_load(key);
grp.Dflt_(val);
grp.Pub(Xocfg_mgr.Ctx__app, val); // need to pub after dflt is changed; for now, just pub at app-level
}
public Xocfg_cache_grp Grps__get_or_load(String key) {
Xocfg_cache_grp grp = (Xocfg_cache_grp)grps.Get_by(key);
if (grp == null) {
grp = Load_grp(key, "");
grps.Add(key, grp);
}
return grp;
}
private Xocfg_cache_grp Load_grp(String key, String or) {
// get data from db
Xocfg_itm_row meta_itm = db_app.Tbl__itm().Select_by_key_or_null(key);
if (meta_itm == null) {
Gfo_usr_dlg_.Instance.Warn_many("", "", "cfg:itm not found; key=~{0}", key);
return new Xocfg_cache_grp(key, or, String_.Cls_val_name);
}
Xocfg_val_row[] itms = db_usr.Tbl__val().Select_all(meta_itm.Key());
// make
Xocfg_cache_grp rv = new Xocfg_cache_grp(key, meta_itm.Dflt(), meta_itm.Type());
int len = itms.length;
for (int i = 0; i < len; i++) {
Xocfg_val_row itm = itms[0];
String itm_ctx = itm.Ctx();
rv.Add(itm_ctx, new Xocfg_cache_itm(itm_ctx, key, itm.Val()));
}
return rv;
}
}

View File

@@ -13,3 +13,66 @@ The terms of each license can be found in the source code repository:
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
*/
package gplx.xowa.addons.apps.cfgs.mgrs.caches; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.apps.*; import gplx.xowa.addons.apps.cfgs.*; import gplx.xowa.addons.apps.cfgs.mgrs.*;
import org.junit.*; import gplx.core.tests.*; import gplx.dbs.*;
import gplx.xowa.addons.apps.cfgs.dbs.*; import gplx.xowa.addons.apps.cfgs.specials.maints.services.*;
public class Xocfg_cache_mgr__tst {
private final Xocfg_cache_mgr__fxt fxt = new Xocfg_cache_mgr__fxt();
@Before public void init() {fxt.Clear();}
@Test public void Get__wiki() {
fxt.Init__db_add("en.w", "key_1", "val_1");
fxt.Test__get("en.w", "key_1", "val_1");
fxt.Test__get("en.d", "key_1", "dflt");
}
@Test public void Get__app() {
String ctx = Xocfg_mgr.Ctx__app;
fxt.Init__db_add(ctx, "key_1", "val_1");
fxt.Test__get(ctx, "key_1", "val_1");
fxt.Test__get("en.w", "key_1", "val_1");
fxt.Test__get("en.d", "key_1", "val_1");
}
@Test public void Set__app() {
String ctx = Xocfg_mgr.Ctx__app;
fxt.Init__db_add(ctx, "key_1", "123");
fxt.Init__sub(ctx, "key_1", "key_1");
fxt.Exec__set(ctx, "key_1", "234");
fxt.Test__get(ctx, "key_1", "234");
fxt.Sub().Test__key_1(234);
}
}
class Xocfg_cache_mgr__fxt {
private Xocfg_cache_mgr mgr = new Xocfg_cache_mgr();
private int id;
public void Clear() {
gplx.dbs.Db_conn_bldr.Instance.Reg_default_mem();
Db_conn conn = Db_conn_bldr.Instance.Get_or_autocreate(true, Io_url_.new_any_("mem/xowa/wiki/en.wikipedia.org/"));
mgr.Init_by_app(conn, conn);
}
public Xocfg_cache_sub_mock Sub() {return sub;} private Xocfg_cache_sub_mock sub = new Xocfg_cache_sub_mock();
public void Init__db_add(String ctx, String key, Object val) {
Xocfg_maint_svc.Create_grp(mgr.Db_app(), "", id++, "test_grp", "", "");
Xocfg_maint_svc.Create_itm(mgr.Db_app(), "test_grp", id++, key, "", "", "wiki", String_.Cls_val_name, "dflt", "", "");
mgr.Db_usr().Set_str(ctx, key, Object_.Xto_str_strict_or_null(val));
}
public void Init__sub(String ctx, String key, String evt) {
mgr.Sub(sub, ctx, key, evt);
}
public void Test__get(String ctx, String key, String expd) {
Gftest.Eq__str(expd, mgr.Get(ctx, key), "ctx={0} key={1}", ctx, key);
}
public void Exec__set(String ctx, String key, String val) {
mgr.Set(ctx, key, val);
}
}
class Xocfg_cache_sub_mock implements Gfo_invk {
private int key_1;
public void Test__key_1(int expd) {
Gftest.Eq__int(expd, key_1);
}
public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) {
if (ctx.Match(k, Evt__key_1)) {key_1 = m.ReadInt("v");}
else return Gfo_invk_.Rv_unhandled;
return this;
}
public static final String Evt__key_1 = "key_1";
}

View File

@@ -13,3 +13,16 @@ The terms of each license can be found in the source code repository:
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
*/
package gplx.xowa.addons.apps.cfgs.mgrs.caches; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.apps.*; import gplx.xowa.addons.apps.cfgs.*; import gplx.xowa.addons.apps.cfgs.mgrs.*;
class Xocfg_cache_sub {
public Xocfg_cache_sub(Gfo_invk sub, String ctx, String evt, String key) {
this.ctx = ctx;
this.key = key;
this.evt = evt;
this.sub = sub;
}
public String Ctx() {return ctx;} private final String ctx;
public String Key() {return key;} private final String key;
public String Evt() {return evt;} private final String evt;
public Gfo_invk Sub() {return sub;} private final Gfo_invk sub;
}

View File

@@ -13,3 +13,43 @@ The terms of each license can be found in the source code repository:
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
*/
package gplx.xowa.addons.apps.cfgs.mgrs.dflts; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.apps.*; import gplx.xowa.addons.apps.cfgs.*; import gplx.xowa.addons.apps.cfgs.mgrs.*;
import gplx.xowa.addons.apps.cfgs.mgrs.caches.*;
public class Xocfg_dflt_mgr {
private final Xocfg_cache_mgr cache_mgr;
private final Ordered_hash hash = Ordered_hash_.New();
public Xocfg_dflt_mgr(Xocfg_cache_mgr cache_mgr) {
this.cache_mgr = cache_mgr;
}
public String Get_or(String key, String or) {
Gfo_invk itm = (Gfo_invk)hash.Get_by(key);
return (itm == null) ? or : (String)Gfo_invk_.Invk_by_key(itm, key);
}
public void Add(String key, String val) {
hash.Add(key, new Xocfg_dflt_itm__static(val));
cache_mgr.Dflt(key, val);
}
public void Add(Gfo_invk invk, String... keys) {
for (String key : keys) {
hash.Add_if_dupe_use_nth(key, invk);
}
}
public static void Run_os_gfs(String user_name, gplx.xowa.apps.gfs.Xoa_gfs_mgr gfs_mgr, gplx.xowa.apps.fsys.Xoa_fsys_mgr fsys_mgr) {
Io_url url = fsys_mgr.Root_dir().GenSubFil_nest("user", user_name, "app", "cfg", "os." + Xoa_app_.Op_sys_str + ".gfs");
if (!Io_mgr.Instance.ExistsFil(url)) {
Io_url dflt_url = fsys_mgr.Bin_plat_dir().GenSubFil_nest("xowa", "cfg", "os.default.gfs");
if (Io_mgr.Instance.ExistsFil(dflt_url)) // TEST: also, DRD
Io_mgr.Instance.CopyFil_args(dflt_url, url, true).MissingFails_off().Exec();
}
gfs_mgr.Run_url(url);
}
}
class Xocfg_dflt_itm__static implements Gfo_invk {
private final String val;
public Xocfg_dflt_itm__static(String val) {
this.val = val;
}
public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) {
return val;
}
}

View File

@@ -13,3 +13,25 @@ The terms of each license can be found in the source code repository:
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
*/
package gplx.xowa.addons.apps.cfgs.mgrs.execs; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.apps.*; import gplx.xowa.addons.apps.cfgs.*; import gplx.xowa.addons.apps.cfgs.mgrs.*;
public class Xocfg_exec_mgr {
private final Ordered_hash hash = Ordered_hash_.New();
public void Add(Gfo_invk invk, String... cmds) {
for (String cmd : cmds) {
hash.Add(cmd, invk);
}
}
public void Exec(String cmd, Object... args) {
Gfo_invk invk = (Gfo_invk)hash.Get_by(cmd);
// create msg and add args
GfoMsg msg = GfoMsg_.new_parse_(cmd);
int args_len = args.length;
if (args_len > 0) {
for (int i = 0; i < args_len; i += 2) {
msg.Add((String)args[i], args[i + 1]);
}
}
Gfo_invk_.Invk_by_msg(invk, cmd, msg);
}
}

View File

@@ -13,3 +13,34 @@ The terms of each license can be found in the source code repository:
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
*/
package gplx.xowa.addons.apps.cfgs.mgrs.types; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.apps.*; import gplx.xowa.addons.apps.cfgs.*; import gplx.xowa.addons.apps.cfgs.mgrs.*;
public class Xocfg_type_mgr {
private final Ordered_hash list_hash = Ordered_hash_.New();
public Xocfg_type_mgr() {
this.Lists__add("list:xowa.app.startup.window.mode", "previous", "maximized", "absolute", "relative", "default");
this.Lists__add("list:xowa.app.startup.pages.type", "blank", "xowa", "previous", "custom");
this.Lists__add("list:xowa.gui.html_box.page_load_mode", "mem", "url");
this.Lists__add("list:xowa.html.portal.missing_class", Keyval_.new_("", "Show as blue link"), Keyval_.new_("new", "Show as red link"), Keyval_.new_("xowa_display_none", "Hide"));
this.Lists__add("list:xowa.html.tidy.engine", "tidy", "jtidy");
this.Lists__add("list:xowa.bldr.db.zip_mode", Keyval_.new_("raw", "text"), Keyval_.new_("gzip"), Keyval_.new_("bzip2"), Keyval_.new_("xz"));
this.Lists__add("list:xowa.addon.category.catpage.missing_class", "normal", "hide", "red_link");
this.Lists__add("list:xowa.addon.http_server.file_retrieve_mode", Keyval_.new_("wait"), Keyval_.new_("skip"), Keyval_.new_("async_server", "async server"));
this.Lists__add("list:xowa.addon.scribunto.engine", "luaj", "lua");
this.Lists__add("list:xowa.addon.math.renderer", Keyval_.new_("mathjax","MathJax"), Keyval_.new_("latex", "LaTeX"));
}
public void Lists__add(String key, String... vals) {
int len = vals.length;
Keyval[] itms = new Keyval[len];
for (int i = 0; i < len; i++) {
itms[i] = Keyval_.new_(vals[i]);
}
Lists__add(key, itms);
}
public void Lists__add(String key, Keyval... itms) {
if (!list_hash.Has(key)) // ignore multiple calls from Init_by_wiki; EX: Xow_hdump_mode
list_hash.Add(key, itms);
}
public Keyval[] Lists__get(String key) {
return (Keyval[])list_hash.Get_by_or_fail(key);
}
}

View File

@@ -13,3 +13,55 @@ The terms of each license can be found in the source code repository:
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
*/
package gplx.xowa.addons.apps.cfgs.specials.edits.objs; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.apps.*; import gplx.xowa.addons.apps.cfgs.*; import gplx.xowa.addons.apps.cfgs.specials.*; import gplx.xowa.addons.apps.cfgs.specials.edits.*;
import gplx.langs.mustaches.*;
import gplx.core.gfobjs.*;
public class Xoedit_grp implements Xoedit_nde, Mustache_doc_itm {
private String lang, name;
public Xoedit_grp(int id, String key, int sort) {
this.id = id;
this.key = key;
this.sort = sort;
}
public int Id() {return id;} private final int id;
public String Key() {return key;} private final String key;
public int Sort() {return sort;} private final int sort;
public String Help() {return help;} private String help;
public Xoedit_itm[] Itms() {return itms;} private Xoedit_itm[] itms = new Xoedit_itm[0];
public void Itms_(Xoedit_itm[] v) {this.itms = v;}
public void Load_by_i18n(String lang, String name, String help) {
this.lang = lang;
this.name = name;
this.help = help;
}
public Gfobj_nde To_nde(Bry_bfr tmp_bfr) {
Gfobj_nde rv = Gfobj_nde.New();
rv.Add_int("id", id);
rv.Add_str("key", key);
rv.Add_str("lang", lang);
rv.Add_str("name", name);
rv.Add_str("help", help);
List_adp list = List_adp_.New();
int len = itms.length;
for (int i = 0; i < len; i++) {
Xoedit_itm itm = itms[i];
list.Add(itm.To_nde(tmp_bfr));
}
rv.Add_ary("itms", new Gfobj_ary((Gfobj_nde[])list.To_ary_and_clear(Gfobj_nde.class)));
return rv;
}
public boolean Mustache__write(String k, Mustache_bfr bfr) {
if (String_.Eq(k, "id")) bfr.Add_int(id);
else if (String_.Eq(k, "key")) bfr.Add_str_u8(key);
else if (String_.Eq(k, "lang")) bfr.Add_str_u8(name);
else if (String_.Eq(k, "name")) bfr.Add_str_u8(name);
else if (String_.Eq(k, "help")) bfr.Add_str_u8(help);
return true;
}
public Mustache_doc_itm[] Mustache__subs(String key) {
if (String_.Eq(key, "itms")) return itms;
return Mustache_doc_itm_.Ary__empty;
}
}

View File

@@ -13,3 +13,89 @@ The terms of each license can be found in the source code repository:
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
*/
package gplx.xowa.addons.apps.cfgs.specials.edits.objs; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.apps.*; import gplx.xowa.addons.apps.cfgs.*; import gplx.xowa.addons.apps.cfgs.specials.*; import gplx.xowa.addons.apps.cfgs.specials.edits.*;
import gplx.langs.mustaches.*;
import gplx.core.gfobjs.*; import gplx.langs.jsons.*;
import gplx.xowa.addons.apps.cfgs.mgrs.types.*; import gplx.xowa.addons.apps.cfgs.enums.*;
import gplx.langs.htmls.*;
public class Xoedit_itm implements Xoedit_nde, Mustache_doc_itm {
private boolean edited;
private String type, html_atrs, html_cls, lang, name, ctx, date;
private byte[] val, dflt; // NOTE: data is always escaped b/c it is only consumed by mustache; EX: "&lt;&apos;" not "<'"
private Xocfg_type_mgr type_mgr;
public Xoedit_itm(Xocfg_type_mgr type_mgr, int id, String key, int sort) {
this.type_mgr = type_mgr;
this.id = id;
this.key = key;
this.sort = sort;
}
public int Id() {return id;} private final int id;
public String Key() {return key;} private final String key;
public String Help() {return help;} private String help;
public int Sort() {return sort;} private final int sort;
public void Load_by_meta(Bry_bfr tmp_bfr, String type, String dflt_str, String html_atrs, String html_cls) {
this.type = type;
this.dflt = Gfh_utl.Escape_html_as_bry(tmp_bfr, Bry_.new_u8(dflt_str), Bool_.N, Bool_.N, Bool_.N, Bool_.Y, Bool_.N);
this.html_atrs = html_atrs;
this.html_cls = html_cls;
}
public void Load_by_i18n(String lang, String name, String help) {
this.lang = lang;
this.name = name;
this.help = help;
}
public void Load_by_data(Bry_bfr tmp_bfr, String ctx, String val_str, String date) {
this.ctx = ctx;
this.val = Gfh_utl.Escape_html_as_bry(tmp_bfr, Bry_.new_u8(val_str), Bool_.N, Bool_.N, Bool_.N, Bool_.Y, Bool_.N);
this.date = date;
this.edited = true;
if ( String_.Has(html_cls, "read"+"only")
|| Xoitm_type_enum.To_uid(type) == Xoitm_type_enum.Tid__btn)
edited = false;
}
public void Set_data_by_dflt() {
this.ctx = Xocfg_mgr.Ctx__app;
this.val = dflt;
this.date = String_.Empty;
this.edited = false;
}
public Gfobj_nde To_nde(Bry_bfr tmp_bfr) {
Gfobj_nde rv = Gfobj_nde.New();
rv.Add_int("id", id);
rv.Add_str("key", key);
rv.Add_bry("dflt", dflt);
rv.Add_str("lang", lang);
rv.Add_str("name", name);
rv.Add_str("help", help);
rv.Add_str("ctx", ctx);
rv.Add_bry("val", val);
rv.Add_str("date", date);
rv.Add_str("type", type);
To_html(tmp_bfr, type_mgr);
rv.Add_str("html", tmp_bfr.To_str_and_clear());
rv.Add_bool("edited", edited);
return rv;
}
private void To_html(Bry_bfr bfr, Xocfg_type_mgr type_mgr) {
Xoedit_itm_html.Build_html(bfr, type_mgr, key, name, type, html_atrs, html_cls, val);
}
public boolean Mustache__write(String k, Mustache_bfr bfr) {
if (String_.Eq(k, "id")) bfr.Add_int(id);
else if (String_.Eq(k, "key")) bfr.Add_str_u8(key);
else if (String_.Eq(k, "dflt")) bfr.Add_bry(dflt);
else if (String_.Eq(k, "lang")) bfr.Add_str_u8(lang);
else if (String_.Eq(k, "name")) bfr.Add_str_u8(name);
else if (String_.Eq(k, "help")) bfr.Add_str_u8(help);
else if (String_.Eq(k, "ctx")) bfr.Add_str_u8(ctx);
else if (String_.Eq(k, "val")) bfr.Add_bry(val);
else if (String_.Eq(k, "date")) bfr.Add_str_u8(date);
else if (String_.Eq(k, "type")) bfr.Add_str_u8(type);
else if (String_.Eq(k, "html")) To_html(bfr.Bfr(), type_mgr);
return true;
}
public Mustache_doc_itm[] Mustache__subs(String k) {
if (String_.Eq(k, "edited")) return Mustache_doc_itm_.Ary__bool(edited);
return Mustache_doc_itm_.Ary__empty;
}
}

View File

@@ -13,3 +13,107 @@ The terms of each license can be found in the source code repository:
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
*/
package gplx.xowa.addons.apps.cfgs.specials.edits.objs; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.apps.*; import gplx.xowa.addons.apps.cfgs.*; import gplx.xowa.addons.apps.cfgs.specials.*; import gplx.xowa.addons.apps.cfgs.specials.edits.*;
import gplx.xowa.addons.apps.cfgs.enums.*;
import gplx.xowa.addons.apps.cfgs.mgrs.types.*;
import gplx.xowa.guis.bnds.*;
public class Xoedit_itm_html {
public static void Build_html(Bry_bfr bfr, Xocfg_type_mgr type_mgr, String key, String name, String type, String html_atrs, String html_cls, byte[] val) {
// prepend space for html insertion; EX: "type='checkbox'{1}>" with "a=b" -> "type='checkbox' a='b'" x> "type='checkbox'a='b'"
if (String_.Len_gt_0(html_atrs)) html_atrs = " " + html_atrs;
if (String_.Len_gt_0(html_cls)) html_cls = " " + html_cls;
// build html
bfr.Add_byte_nl();
switch (Xoitm_type_enum.To_uid(type)) {
case Xoitm_type_enum.Tid__bool:
bfr.Add_str_u8_fmt
( "<input id=\"{3}\" data-xocfg-key=\"{3}\" data-xocfg-type=\"{0}\" accesskey=\"d\" class=\"xocfg_data__bool{2}\" type=\"checkbox\"{1}{4}></input>"
, type, html_atrs, html_cls, key, Bry_.Eq(val, Bool_.Y_bry) ? " checked=\"checked\"" : "");
break;
case Xoitm_type_enum.Tid__int:
bfr.Add_str_u8_fmt
( "<input id=\"{3}\" data-xocfg-key=\"{3}\" data-xocfg-type=\"{0}\" accesskey=\"d\" class=\"xocfg_data__int{2}\" type=\"text\"{1} value=\"{4}\"></input>"
, type, html_atrs, html_cls, key, val);
break;
case Xoitm_type_enum.Tid__str:
bfr.Add_str_u8_fmt
( "<input id=\"{3}\" data-xocfg-key=\"{3}\" data-xocfg-type=\"{0}\" accesskey=\"d\" class=\"xocfg_data__str{2}\" type=\"text\"{1} value=\"{4}\"></input>"
, type, html_atrs, html_cls, key, val);
break;
case Xoitm_type_enum.Tid__memo:
if (String_.Len_eq_0(html_atrs)) html_atrs = " rows=\"4\"";
bfr.Add_str_u8_fmt
( "<textarea id=\"{3}\" data-xocfg-key=\"{3}\" data-xocfg-type=\"{0}\" accesskey=\"d\" class=\"xocfg_data__memo{2}\"{1}>{4}</textarea>"
, type, html_atrs, html_cls, key, val);
break;
case Xoitm_type_enum.Tid__list:
// get list of kvs by type
Keyval[] kvs_ary = type_mgr.Lists__get(type);
int len = kvs_ary.length;
if (String_.Len_eq_0(html_atrs)) html_atrs = "size=\"" + Int_.To_str(len) + "\"";
// build html
bfr.Add_str_u8_fmt
( "<select id=\"{3}\" data-xocfg-key=\"{3}\" data-xocfg-type=\"{0}\" accesskey=\"d\" class=\"xocfg_data__list{2}\" {1}>\n"
, type, html_atrs, html_cls, key);
String val_str = String_.new_u8(val);
for (int i = 0; i < len; i++) {
Keyval kv = kvs_ary[i];
String kv_key = kv.Key();
String kv_val = kv.Val_to_str_or_null();
bfr.Add_str_u8_fmt
( "<option value=\"{0}\"{2}>{1}</option>\n"
, kv_key, kv_val, String_.Eq(val_str, kv_key) ? " selected=\"selected\"" : "");
}
bfr.Add_str_u8_fmt("</select>\n");
break;
case Xoitm_type_enum.Tid__io_cmd:
String[] lines = Xocfg_mgr.Parse_io_cmd(String_.new_u8(val));
bfr.Add_str_u8_fmt
( "<input class=\"xocfg_data__io_cmd__exe__txt{2}\" id=\"{3}-exe\" data-xocfg-key=\"{3}\" data-xocfg-type=\"{0}-exe\" accesskey=\"d\" type=\"text\"{1} value=\"{4}\"></input>\n"
+ "<span class=\"xoimg_btn_x16 xoimg_app_configure\" onclick='xo.cfg_edit.io_cmd__select(\"file\", \"{3}-exe\", \"Please select a file.\");'>&nbsp;</span><br/>\n"
, type, html_atrs, html_cls, key, lines[0]);
bfr.Add_str_u8_fmt
( "<input class=\"xocfg_data__io_cmd__arg__txt{2}\" id=\"{3}-arg\" data-xocfg-key=\"{3}\" data-xocfg-type=\"{0}-arg\" accesskey=\"d\" type=\"text\"{1} value=\"{4}\">\n"
, type, html_atrs, html_cls, key, lines[1]);
break;
case Xoitm_type_enum.Tid__gui_binding: {
String[] flds = Xoitm_gui_binding.To_gui(String_.new_u8(val));
// write box
bfr.Add_str_u8_fmt
( "<select class=\"xocfg_data__gui_binding__box\" id=\"{3}-box\" data-xocfg-key=\"{3}\" data-xocfg-type=\"{0}-box\" size=\"1\" accesskey=\"d\"{1}>\n"
, type, html_atrs, html_cls, key, flds[0]);
Xog_bnd_box[] box_ary = Xog_bnd_box_.Ary();
int box_len = box_ary.length;
String selected_box = flds[0];
for (int i = 0; i < box_len; i++) {
Xog_bnd_box kv = box_ary[i];
String kv_key = kv.Key();
String kv_val = Xog_bnd_box_.To_gui_str(kv_key);
bfr.Add_str_u8_fmt
( "<option value=\"{0}\"{2}>{1}</option>\n"
, kv_key, kv_val, String_.Eq(selected_box, kv_val) ? " selected=\"selected\"" : "");
}
bfr.Add_str_u8_fmt("</select>\n");
// write ipt
bfr.Add_str_u8_fmt
( "<input class=\"xocfg_data__gui_binding__ipt\" id=\"{3}-ipt\" data-xocfg-key=\"{3}\" data-xocfg-type=\"{0}-ipt\" accesskey=\"d\" type=\"text\"{1} value=\"{4}\"></input>\n"
, type, html_atrs, html_cls, key, flds[1]);
bfr.Add_str_u8_fmt
( "<span class=\"xoimg_btn_x16 xoimg_app_configure\" onclick='xo.cfg_edit.gui_binding__remap_send(\"{3}\", \"{4}\");'>&nbsp;</span>\n"
, type, html_atrs, html_cls, key, name);
break;
}
case Xoitm_type_enum.Tid__btn:
bfr.Add_str_u8_fmt
( "<button id=\"{3}\" data-xocfg-key=\"{3}\" data-xocfg-type=\"{0}\" class=\"xocfg_data__btn{2}\" {1}>{4}</button>"
, type, html_atrs, html_cls, key, name);
break;
default:
break;
}
}
}

View File

@@ -13,3 +13,23 @@ The terms of each license can be found in the source code repository:
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
*/
package gplx.xowa.addons.apps.cfgs.specials.edits.objs; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.apps.*; import gplx.xowa.addons.apps.cfgs.*; import gplx.xowa.addons.apps.cfgs.specials.*; import gplx.xowa.addons.apps.cfgs.specials.edits.*;
import gplx.langs.mustaches.*;
public class Xoedit_nav_itm implements Mustache_doc_itm {
private final boolean selected;
private final String key, text;
public Xoedit_nav_itm(boolean selected, String key, String text) {
this.selected = selected;
this.key = key;
this.text = text;
}
public boolean Mustache__write(String k, Mustache_bfr bfr) {
if (String_.Eq(k, "key")) bfr.Add_str_u8(key);
else if (String_.Eq(k, "text")) bfr.Add_str_u8(text);
return true;
}
public Mustache_doc_itm[] Mustache__subs(String k) {
if (String_.Eq(k, "selected")) return Mustache_doc_itm_.Ary__bool(selected);
return Mustache_doc_itm_.Ary__empty;
}
}

View File

@@ -13,3 +13,18 @@ The terms of each license can be found in the source code repository:
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
*/
package gplx.xowa.addons.apps.cfgs.specials.edits.objs; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.apps.*; import gplx.xowa.addons.apps.cfgs.*; import gplx.xowa.addons.apps.cfgs.specials.*; import gplx.xowa.addons.apps.cfgs.specials.edits.*;
import gplx.langs.mustaches.*;
public class Xoedit_nav_mgr implements Mustache_doc_itm {
public Xoedit_nav_itm[] Itms() {return itms;} private final Xoedit_nav_itm[] itms;
public Xoedit_nav_mgr(Xoedit_nav_itm[] itms) {
this.itms = itms;
}
public boolean Mustache__write(String k, Mustache_bfr bfr) {
return true;
}
public Mustache_doc_itm[] Mustache__subs(String k) {
if (String_.Eq(k, "itms")) return itms;
return Mustache_doc_itm_.Ary__empty;
}
}

View File

@@ -13,3 +13,10 @@ The terms of each license can be found in the source code repository:
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
*/
package gplx.xowa.addons.apps.cfgs.specials.edits.objs; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.apps.*; import gplx.xowa.addons.apps.cfgs.*; import gplx.xowa.addons.apps.cfgs.specials.*; import gplx.xowa.addons.apps.cfgs.specials.edits.*;
public interface Xoedit_nde {
int Id();
String Key();
String Help();
void Load_by_i18n(String lang, String name, String help);
}

View File

@@ -13,3 +13,64 @@ The terms of each license can be found in the source code repository:
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
*/
package gplx.xowa.addons.apps.cfgs.specials.edits.objs; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.apps.*; import gplx.xowa.addons.apps.cfgs.*; import gplx.xowa.addons.apps.cfgs.specials.*; import gplx.xowa.addons.apps.cfgs.specials.edits.*;
public class Xoedit_nde_hash {
private final Ordered_hash hash = Ordered_hash_.New();
private final Ordered_hash id_hash = Ordered_hash_.New();
private final List_adp deleted = List_adp_.New();
public int Len() {
return hash.Len();
}
public void Add(Xoedit_nde nde) {
hash.Add(nde.Key(), nde);
id_hash.Add(nde.Id(), nde);
}
public Xoedit_nde Get_at(int i) {
return (Xoedit_nde)hash.Get_at(i);
}
public Xoedit_nde Get_by_or_fail(String key) {
return (Xoedit_nde)hash.Get_by_or_fail(key);
}
public Xoedit_nde Get_by_or_fail(int id) {
return (Xoedit_nde)id_hash.Get_by_or_fail(id);
}
public Xoedit_grp[] To_grp_ary_and_clear() {
Xoedit_grp[] rv = (Xoedit_grp[])hash.To_ary_and_clear(Xoedit_grp.class);
id_hash.Clear();
return rv;
}
public void Delete_container_grps() {// remove container grps else headers with no items will show up
int len = hash.Len();
for (int i = 0; i < len; i++) {
Xoedit_grp grp = (Xoedit_grp)hash.Get_at(i);
if (grp.Itms().length == 0)
deleted.Add(grp);
}
len = deleted.Len();
for (int i = 0; i < len; i++) {
Xoedit_grp grp = (Xoedit_grp)deleted.Get_at(i);
hash.Del(grp.Key());
id_hash.Del(grp.Id());
}
}
public Xoedit_nde_hash Merge(Xoedit_nde_hash src) {
int len = src.Len();
for (int i = 0; i < len; i++) {
this.Add(src.Get_at(i));
}
return this;
}
public void Deleted__add(Xoedit_nde nde) {
deleted.Add(nde);
}
public void Deleted__commit() {
int len = deleted.Len();
for (int i = 0; i < len; i++) {
Xoedit_nde nde = (Xoedit_nde)deleted.Get_at(i);
hash.Del(nde.Key());
id_hash.Del(nde.Id());
}
}
}

View File

@@ -13,3 +13,41 @@ The terms of each license can be found in the source code repository:
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
*/
package gplx.xowa.addons.apps.cfgs.specials.edits.objs; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.apps.*; import gplx.xowa.addons.apps.cfgs.*; import gplx.xowa.addons.apps.cfgs.specials.*; import gplx.xowa.addons.apps.cfgs.specials.edits.*;
import gplx.langs.mustaches.*;
import gplx.core.gfobjs.*;
public class Xoedit_root implements Mustache_doc_itm {
private final Xoedit_nav_mgr nav_mgr;
private final Xoedit_grp[] grps;
private final String page_help;
private final boolean app_is_drd;
public Xoedit_root(Xoedit_nav_mgr nav_mgr, String page_help, Xoedit_grp[] grps) {
this.nav_mgr = nav_mgr;
this.page_help = page_help;
this.grps = grps;
this.app_is_drd = gplx.core.envs.Op_sys.Cur().Tid_is_drd();
}
public Gfobj_nde To_nde(Bry_bfr tmp_bfr) {
Gfobj_nde rv = Gfobj_nde.New();
List_adp list = List_adp_.New();
int len = grps.length;
for (int i = 0; i < len; i++) {
Xoedit_grp itm = grps[i];
list.Add(itm.To_nde(tmp_bfr));
}
rv.Add_str("page_help", page_help);
rv.Add_ary("grps", new Gfobj_ary((Gfobj_nde[])list.To_ary_and_clear(Gfobj_nde.class)));
return rv;
}
public boolean Mustache__write(String k, Mustache_bfr bfr) {
if (String_.Eq(k, "page_help")) bfr.Add_str_u8(page_help);
return true;
}
public Mustache_doc_itm[] Mustache__subs(String k) {
if (String_.Eq(k, "grps")) return grps;
else if (String_.Eq(k, "nav_exists")) return Mustache_doc_itm_.Ary__bool(nav_mgr.Itms().length > 1); // NOTE: do not show combo if 0 or 1 item
else if (String_.Eq(k, "app_is_drd")) return Mustache_doc_itm_.Ary__bool(app_is_drd);
else if (String_.Eq(k, "itms")) return nav_mgr.Itms();
return Mustache_doc_itm_.Ary__empty;
}
}

View File

@@ -13,3 +13,44 @@ The terms of each license can be found in the source code repository:
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
*/
package gplx.xowa.addons.apps.cfgs.specials.edits.objs; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.apps.*; import gplx.xowa.addons.apps.cfgs.*; import gplx.xowa.addons.apps.cfgs.specials.*; import gplx.xowa.addons.apps.cfgs.specials.edits.*;
public class Xogui_nde_iter {
private final Xoedit_nde_hash hash;
private int bgn, max;
public Xogui_nde_iter(Xoedit_nde_hash hash, int max) {
this.hash = hash;
this.max = max;
}
public boolean Move_next() {
return bgn < hash.Len();
}
public String To_sql_in() {
Bry_bfr bfr = Bry_bfr_.New();
int end = bgn + max;
if (end > hash.Len()) end = hash.Len();
for (int i = bgn; i < end; i++) {
Xoedit_nde nde = hash.Get_at(i);
if (i != bgn) bfr.Add_byte_comma();
bfr.Add_int_variable(nde.Id());
}
bgn = end;
return bfr.To_str_and_clear();
}
public String To_sql_in_key() {
Bry_bfr bfr = Bry_bfr_.New();
int end = bgn + max;
if (end > hash.Len()) end = hash.Len();
for (int i = bgn; i < end; i++) {
Xoedit_nde nde = (Xoedit_nde)hash.Get_at(i);
if (i != bgn) bfr.Add_byte_comma();
bfr.Add_byte_apos();
bfr.Add_str_u8(nde.Key());
bfr.Add_byte_apos();
}
bgn = end;
return bfr.To_str_and_clear();
}
public static Xogui_nde_iter New_sql(Xoedit_nde_hash hash) {
return new Xogui_nde_iter(hash, 255);
}
}

View File

@@ -13,3 +13,35 @@ The terms of each license can be found in the source code repository:
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
*/
package gplx.xowa.addons.apps.cfgs.specials.edits.pages; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.apps.*; import gplx.xowa.addons.apps.cfgs.*; import gplx.xowa.addons.apps.cfgs.specials.*; import gplx.xowa.addons.apps.cfgs.specials.edits.*;
import gplx.xowa.specials.*; import gplx.langs.mustaches.*; import gplx.xowa.wikis.pages.*; import gplx.xowa.wikis.pages.tags.*;
import gplx.xowa.addons.apps.cfgs.specials.edits.services.*; import gplx.xowa.addons.apps.cfgs.specials.edits.objs.*;
class Xocfg_edit_html extends Xow_special_wtr__base {
private final Xocfg_edit_loader loader;
private final String grp, ctx, lang;
public Xocfg_edit_html(Xocfg_edit_loader loader, String grp, String ctx, String lang) {
this.loader = loader;
this.grp = grp;
this.ctx = ctx;
this.lang = lang;
}
@Override protected Io_url Get_addon_dir(Xoa_app app) {return app.Fsys_mgr().Http_root().GenSubDir_nest("bin", "any", "xowa", "addon", "app", "cfg", "edit");}
@Override protected Io_url Get_mustache_fil(Io_url addon_dir) {return addon_dir.GenSubFil_nest("bin", "xo.cfg_edit.page.mustache.html");}
@Override protected Mustache_doc_itm Bld_mustache_root(Xoa_app app) {
return loader.Load_root(grp, ctx, lang);
}
@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());
Xopg_tag_wtr_.Add__xohelp (head_tags, app.Fsys_mgr().Http_root());
Xopg_tag_wtr_.Add__xolog (head_tags, app.Fsys_mgr().Http_root());
Xopg_tag_wtr_.Add__xoelem (head_tags, app.Fsys_mgr().Http_root());
Xopg_tag_wtr_.Add__mustache (head_tags, app.Fsys_mgr().Http_root());
Xopg_tag_wtr_.Add__xotmpl (head_tags, app.Fsys_mgr().Http_root());
Xopg_tag_wtr_.Add__xoajax (head_tags, app.Fsys_mgr().Http_root(), app);
head_tags.Add(Xopg_tag_itm.New_htm_frag(addon_dir.GenSubFil_nest("bin", "xo.cfg_edit.grps.mustache.html"), "xocfg.grps"));
head_tags.Add(Xopg_tag_itm.New_css_file(addon_dir.GenSubFil_nest("bin", "xo.cfg_edit.css")));
head_tags.Add(Xopg_tag_itm.New_js_file(addon_dir.GenSubFil_nest("bin", "xo.cfg_edit.js")));
}
}

View File

@@ -13,3 +13,31 @@ The terms of each license can be found in the source code repository:
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
*/
package gplx.xowa.addons.apps.cfgs.specials.edits.pages; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.apps.*; import gplx.xowa.addons.apps.cfgs.*; import gplx.xowa.addons.apps.cfgs.specials.*; import gplx.xowa.addons.apps.cfgs.specials.edits.*;
import gplx.xowa.specials.*; import gplx.core.net.qargs.*;
import gplx.xowa.addons.apps.cfgs.specials.edits.services.*;
public class Xocfg_edit_special implements Xow_special_page {
public void Special__gen(Xow_wiki wiki, Xoa_page page, Xoa_url url, Xoa_ttl ttl) {
Gfo_qarg_mgr url_args = new Gfo_qarg_mgr().Init(url.Qargs_ary());
String grp = url_args.Read_str_or("grp", "");
String ctx = url_args.Read_str_or("ctx", "app");
String lang = url_args.Read_str_or("lang", wiki.App().User().Wikii().Lang().Key_str());
Xocfg_edit_loader loader = Xocfg_edit_loader.New(wiki.App());
if (String_.Eq(grp, "")) {
grp = wiki.App().Cfg().Get_str_app(Cfg__previous_grp);
if (!loader.Grp_key_exists(grp)) {
grp = "xowa.app.security";
Gfo_usr_dlg_.Instance.Warn_many("", "", "cfg:grp_key not found; defaulting to xowa.app.security; key=~{0}", grp);
}
}
new Xocfg_edit_html(loader, grp, ctx, lang).Bld_page_by_mustache(wiki.App(), page, this);
}
Xocfg_edit_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;
public Xow_special_page Special__clone() {return this;}
public static final Xow_special_page Prototype = new Xocfg_edit_special(Xow_special_meta.New_xo("XowaCfg", "Options"));
public static final String Cfg__previous_grp = "xowa.app.cfg.previous_grp";
}

View File

@@ -13,3 +13,32 @@ The terms of each license can be found in the source code repository:
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
*/
package gplx.xowa.addons.apps.cfgs.specials.edits.services; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.apps.*; import gplx.xowa.addons.apps.cfgs.*; import gplx.xowa.addons.apps.cfgs.specials.*; import gplx.xowa.addons.apps.cfgs.specials.edits.*;
import gplx.langs.jsons.*; import gplx.xowa.htmls.bridges.*;
public class Xocfg_edit_bridge implements Bridge_cmd_itm {
private Xocfg_edit_svc svc;
public void Init_by_app(Xoa_app app) {
this.svc = new Xocfg_edit_svc(app);
}
public String Exec(Json_nde data) {
byte proc_id = proc_hash.Get_as_byte_or(data.Get_as_bry_or(Bridge_cmd_mgr.Msg__proc, null), Byte_ascii.Max_7_bit);
Json_nde args = data.Get_kv(Bridge_cmd_mgr.Msg__args).Val_as_nde();
switch (proc_id) {
case Proc__update: svc.Update(args); break;
case Proc__delete: svc.Delete(args); break;
case Proc__select: svc.Select(args); break;
default: throw Err_.new_unhandled_default(proc_id);
}
return Bridge_cmd_mgr.Msg__ok;
}
private static final byte Proc__update = 0, Proc__delete = 1, Proc__select = 2;
private static final Hash_adp_bry proc_hash = Hash_adp_bry.cs()
.Add_str_byte("update" , Proc__update)
.Add_str_byte("delete" , Proc__delete)
.Add_str_byte("select" , Proc__select)
;
public byte[] Key() {return BRIDGE_KEY;} public static final byte[] BRIDGE_KEY = Bry_.new_a7("xo.cfg_edit");
public static final Xocfg_edit_bridge Prototype = new Xocfg_edit_bridge(); Xocfg_edit_bridge() {}
}

View File

@@ -13,3 +13,244 @@ The terms of each license can be found in the source code repository:
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
*/
package gplx.xowa.addons.apps.cfgs.specials.edits.services; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.apps.*; import gplx.xowa.addons.apps.cfgs.*; import gplx.xowa.addons.apps.cfgs.specials.*; import gplx.xowa.addons.apps.cfgs.specials.edits.*;
import gplx.dbs.*;
import gplx.xowa.addons.apps.cfgs.dbs.*; import gplx.xowa.addons.apps.cfgs.dbs.tbls.*;
import gplx.xowa.addons.apps.cfgs.specials.edits.objs.*;
import gplx.xowa.addons.apps.cfgs.mgrs.*; import gplx.xowa.addons.apps.cfgs.mgrs.dflts.*; import gplx.xowa.addons.apps.cfgs.mgrs.types.*;
public class Xocfg_edit_loader {
private final Xocfg_db_app db_app;
private final Xocfg_db_usr db_usr;
private final Xocfg_type_mgr type_mgr;
private final Xocfg_dflt_mgr dflt_mgr;
public Xocfg_edit_loader(Xocfg_db_app db_app, Xocfg_db_usr db_usr, Xocfg_type_mgr type_mgr, Xocfg_dflt_mgr dflt_mgr) {
this.db_app = db_app;
this.db_usr = db_usr;
this.type_mgr = type_mgr;
this.dflt_mgr = dflt_mgr;
}
public boolean Grp_key_exists(String grp_key) {return db_app.Tbl__grp().Select_by_key_or_null(grp_key) != null;
}
public Xoedit_root Load_root(String grp_key, String ctx, String lang) {
// create lists
Ordered_hash grp_temp = Ordered_hash_.New();
Xoedit_nde_hash grp_list = new Xoedit_nde_hash();
Xoedit_nde_hash itm_list = new Xoedit_nde_hash();
// get root_itm
Xocfg_grp_row grp_meta = db_app.Tbl__grp().Select_by_key_or_null(grp_key);
if (grp_meta == null) throw Err_.new_wo_type("cfg:grp not found", "grp", grp_key);
Xoedit_grp owner = new Xoedit_grp(grp_meta.Id(), grp_meta.Key(), 0);
grp_temp.Add(grp_meta.Id(), owner);
grp_list.Add(owner);
// load tree by selecting subs until no more grps
while (grp_temp.Count() > 0) {
owner = (Xoedit_grp)grp_temp.Get_at(0);
grp_temp.Del(owner.Id());
Load_subs(grp_list, itm_list, grp_temp, owner);
}
// load itms and i18n
Bry_bfr tmp_bfr = Bry_bfr_.New();
Load_itm_meta(tmp_bfr, itm_list);
Load_itm_data(tmp_bfr, itm_list, ctx);
Load_i18n(grp_list, itm_list, lang);
Xoedit_nde page_nde = grp_list.Get_by_or_fail(grp_key);
grp_list.Delete_container_grps();
return new Xoedit_root(Load_nav_mgr(grp_key), page_nde.Help(), (Xoedit_grp[])grp_list.To_grp_ary_and_clear());
}
private Xoedit_nav_mgr Load_nav_mgr(String grp_key) {
// get grp_id
String sql = Db_sql_.Make_by_fmt(String_.Ary
( "SELECT grp_id"
, "FROM cfg_grp"
, "WHERE grp_key = '{0}'"
), grp_key
);
int grp_id = -1;
Db_rdr rdr = db_app.Conn().Stmt_sql(sql).Exec_select__rls_auto();
try {grp_id = rdr.Move_next() ? rdr.Read_int("grp_id") : -1;}
finally {rdr.Rls();}
// get owner_id
sql = Db_sql_.Make_by_fmt(String_.Ary
( "SELECT map_src"
, "FROM cfg_map"
, "WHERE map_trg = {0}"
), grp_id
);
int owner_id = -1;
rdr = db_app.Conn().Stmt_sql(sql).Exec_select__rls_auto();
try {
while (rdr.Move_next()) {
int map_src = rdr.Read_int("map_src");
// WORKAROUND:if drd, then ignore desktop root node; needed for links like "?grp=xowa.addon.fulltext_search" which has two owners:desktop and mobile; DATE:2017-03-28
// ideally, (a) cfg_grp should have a plat_id column; (b) the above SQL should join to cfg_grp and (c) filter on plat_id = drd / desktop
if (gplx.core.envs.Op_sys.Cur().Tid_is_drd()
&& map_src == 10000) {
continue;
} else {
owner_id = map_src;
break;
}
}
}
finally {rdr.Rls();}
// get peers
sql = Db_sql_.Make_by_fmt(String_.Ary
( "SELECT m.map_trg"
, ", m.map_sort"
, ", t.nde_name"
, ", g.grp_key"
, "FROM cfg_map m"
, " LEFT JOIN cfg_grp g ON m.map_trg = g.grp_id"
, " LEFT JOIN cfg_txt t ON m.map_trg = t.nde_id"
, "WHERE m.map_src = {0}"
, "ORDER BY m.map_sort"
), owner_id
);
List_adp list = List_adp_.New();
try {
rdr = db_app.Conn().Stmt_sql(sql).Exec_select__rls_auto();
while (rdr.Move_next()) {
String nav_key = rdr.Read_str("grp_key");
String nav_text = rdr.Read_str("nde_name");
list.Add(new Xoedit_nav_itm(String_.Eq(grp_key, nav_key), nav_key, nav_text));
}
}
finally {
rdr.Rls();
}
return new Xoedit_nav_mgr((Xoedit_nav_itm[])list.To_ary_and_clear(Xoedit_nav_itm.class));
}
private void Load_subs(Xoedit_nde_hash grp_list, Xoedit_nde_hash itm_list, Ordered_hash grp_temp, Xoedit_grp owner) {
String sql = Db_sql_.Make_by_fmt(String_.Ary
( "SELECT m.map_trg"
, ", m.map_sort"
, ", Coalesce(g.grp_key, i.itm_key) AS key"
, ", i.itm_dflt"
, "FROM cfg_map m"
, " LEFT JOIN cfg_grp g ON m.map_trg = g.grp_id"
, " LEFT JOIN cfg_itm i ON m.map_trg = i.itm_id"
, "WHERE m.map_src = {0}"
), owner.Id()
);
Db_rdr rdr = db_app.Conn().Stmt_sql(sql).Exec_select__rls_auto();
List_adp itms_list = List_adp_.New();
while (rdr.Move_next()) {
String grp_key = rdr.Read_str("key");
// nde is grp
if (rdr.Read_str("itm_dflt") == null) {
Xoedit_grp gui_grp = new Xoedit_grp(rdr.Read_int("map_trg"), grp_key, rdr.Read_int("map_sort"));
grp_list.Add(gui_grp);
grp_temp.Add(gui_grp.Id(), gui_grp);
}
// nde is itm
else {
Xoedit_itm gui_itm = new Xoedit_itm(type_mgr, rdr.Read_int("map_trg"), grp_key, rdr.Read_int("map_sort"));
itms_list.Add(gui_itm);
itm_list.Add(gui_itm);
}
}
owner.Itms_((Xoedit_itm[])itms_list.To_ary_and_clear(Xoedit_itm.class));
}
private void Load_itm_meta(Bry_bfr tmp_bfr, Xoedit_nde_hash itm_list) {
Xogui_nde_iter iter = Xogui_nde_iter.New_sql(itm_list);
while (iter.Move_next()) {
String sql = Db_sql_.Make_by_fmt(String_.Ary
( "SELECT *"
, "FROM cfg_itm i"
, "WHERE i.itm_key IN ({0})"
), iter.To_sql_in_key()
);
Db_rdr rdr = db_app.Conn().Stmt_sql(sql).Exec_select__rls_auto();
while (rdr.Move_next()) {
String key = rdr.Read_str("itm_key");
Xoedit_itm edit_itm = (Xoedit_itm)itm_list.Get_by_or_fail(key);
String dflt = dflt_mgr.Get_or(key, rdr.Read_str("itm_dflt"));
edit_itm.Load_by_meta(tmp_bfr, rdr.Read_str("itm_type"), dflt, rdr.Read_str("itm_html_atrs"), rdr.Read_str("itm_html_cls"));
}
}
}
private void Load_itm_data(Bry_bfr tmp_bfr, Xoedit_nde_hash itm_list, String... ctxs) {
Xoedit_nde_hash cur_regy = new Xoedit_nde_hash().Merge(itm_list);
// loop ctxs where later ctxs are more general defaults; EX: ["en.w", "en.*", "*.w", "app"]
int ctxs_len = ctxs.length;
for (int i = 0; i < ctxs_len; i++) {
// create iter for cur_regy; note that iter will be reduced as items are found below
Xogui_nde_iter cur_iter = Xogui_nde_iter.New_sql(cur_regy);
while (cur_iter.Move_next()) {
// get all data by ids and ctx
String sql = Db_sql_.Make_by_fmt(String_.Ary
( "SELECT v.itm_key"
, ", v.itm_ctx"
, ", v.itm_val"
, ", v.itm_date"
, "FROM cfg_val v"
, "WHERE v.itm_key IN ({0})"
, "AND v.itm_ctx = '{1}'"
), cur_iter.To_sql_in_key(), ctxs[i]
);
// read and set data
Db_rdr rdr = db_usr.Conn().Stmt_sql(sql).Exec_select__rls_auto();
while (rdr.Move_next()) {
Xoedit_itm gui_itm = (Xoedit_itm)cur_regy.Get_by_or_fail(rdr.Read_str("itm_key"));
gui_itm.Load_by_data(tmp_bfr, rdr.Read_str("itm_ctx"), rdr.Read_str("itm_val"), rdr.Read_str("itm_date"));
cur_regy.Deleted__add(gui_itm);
}
}
cur_regy.Deleted__commit();
}
// loop over remaining items and set to dflts
int cur_len = cur_regy.Len();
for (int i = 0; i < cur_len; i++) {
Xoedit_itm itm = (Xoedit_itm)cur_regy.Get_at(i);
itm.Set_data_by_dflt();
}
}
private void Load_i18n(Xoedit_nde_hash grp_list, Xoedit_nde_hash itm_list, String... langs) {
Xoedit_nde_hash cur_regy = new Xoedit_nde_hash().Merge(grp_list).Merge(itm_list);
// loop langs where later langs are fallbacks; EX: ["de", "en"]
int langs_len = langs.length;
for (int i = 0; i < langs_len; i++) {
// create iter for cur_regy; note that iter will be reduced as items are found below
Xogui_nde_iter cur_iter = Xogui_nde_iter.New_sql(cur_regy);
while (cur_iter.Move_next()) {
// get all i18n for itms and lang
String sql = Db_sql_.Make_by_fmt(String_.Ary
( "SELECT t.nde_id"
, ", t.nde_name"
, ", t.nde_help"
, ", t.nde_lang"
, "FROM cfg_txt t"
, "WHERE t.nde_id IN ({0})"
, "AND t.nde_lang = '{1}'"
), cur_iter.To_sql_in()
, langs[i]
);
// read and set i18n
Db_rdr rdr = db_app.Conn().Stmt_sql(sql).Exec_select__rls_auto();
while (rdr.Move_next()) {
Xoedit_nde gui_itm = (Xoedit_nde)cur_regy.Get_by_or_fail(rdr.Read_int("nde_id"));
gui_itm.Load_by_i18n(rdr.Read_str("nde_lang"), rdr.Read_str("nde_name"), rdr.Read_str("nde_help"));
cur_regy.Deleted__add(gui_itm);
}
}
cur_regy.Deleted__commit();
}
}
public static Xocfg_edit_loader New(Xoa_app app) {
Xocfg_db_app db_app = Xocfg_db_app.New(app);
return new Xocfg_edit_loader(db_app, new Xocfg_db_usr(db_app, app.User().User_db_mgr().Conn()), app.Cfg().Type_mgr(), app.Cfg().Dflt_mgr());
}
}

View File

@@ -13,3 +13,61 @@ The terms of each license can be found in the source code repository:
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
*/
package gplx.xowa.addons.apps.cfgs.specials.edits.services; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.apps.*; import gplx.xowa.addons.apps.cfgs.*; import gplx.xowa.addons.apps.cfgs.specials.*; import gplx.xowa.addons.apps.cfgs.specials.edits.*;
import gplx.langs.jsons.*;
import gplx.core.gfobjs.*;
import gplx.xowa.guis.cbks.*; import gplx.xowa.addons.apps.cfgs.dbs.*; import gplx.xowa.addons.apps.cfgs.specials.edits.objs.*;
import gplx.xowa.addons.apps.cfgs.specials.edits.pages.*; import gplx.xowa.addons.apps.cfgs.mgrs.caches.*; import gplx.xowa.addons.apps.cfgs.enums.*;
public class Xocfg_edit_svc {
private final Xoa_app app;
private Xocfg_edit_loader edit_loader;
private final Xog_cbk_trg cbk_trg = Xog_cbk_trg.New(Xocfg_edit_special.Prototype.Special__meta().Ttl_bry());
public Xocfg_edit_svc(Xoa_app app) {
this.app = app;
}
public void Update(Json_nde args) {
String ctx = args.Get_as_str("ctx");
String key = args.Get_as_str("key");
String val = args.Get_as_str("val");
String type = args.Get_as_str("type");
if (String_.Has_at_bgn(type, "gui.binding")) {
val = Xoitm_gui_binding.To_db_str(val);
}
Xocfg_cache_grp grp = app.Cfg().Cache_mgr().Grps__get_or_load(key);
try {
app.Cfg().Set_str(ctx, key, val);
} catch (Exception exc) {
app.Gui__cbk_mgr().Send_json(cbk_trg, "xo.cfg_edit.update__fail", Gfobj_nde.New().Add_str("key", key).Add_str("new_val", args.Get_as_str("val")).Add_str("old_val", grp.Get(ctx)).Add_str("err", Err_.Message_lang(exc)));
return;
}
if (!String_.Eq(type, "btn") && String_.Eq(grp.Dflt(), val)) {
if (String_.Has_at_bgn(type, "gui.binding")) {
val = String_.Concat_with_str("|", gplx.xowa.addons.apps.cfgs.enums.Xoitm_gui_binding.To_gui(val));
}
app.Gui__cbk_mgr().Send_json(cbk_trg, "xo.cfg_edit.delete__recv", Gfobj_nde.New().Add_str("key", key).Add_str("type", type).Add_str("val", val));
}
else
app.Gui__cbk_mgr().Send_json(cbk_trg, "xo.cfg_edit.update__pass", Gfobj_nde.New().Add_str("key", key).Add_str("type", type));
}
public void Delete(Json_nde args) {
String ctx = args.Get_as_str("ctx");
String key = args.Get_as_str("key");
String type = args.Get_as_str("type");
app.Cfg().Del(ctx, key);
String val = app.Cfg().Get_str(ctx, key);
if (String_.Has_at_bgn(type, "gui.binding")) {
val = String_.Concat_with_str("|", gplx.xowa.addons.apps.cfgs.enums.Xoitm_gui_binding.To_gui(val));
}
app.Gui__cbk_mgr().Send_json(cbk_trg, "xo.cfg_edit.delete__recv", Gfobj_nde.New().Add_str("key", key).Add_str("val", val));
}
public void Select(Json_nde args) {
String ctx = args.Get_as_str("ctx");
String key = args.Get_as_str("key");
if (edit_loader == null) edit_loader = Xocfg_edit_loader.New(app);
Xoedit_root root = edit_loader.Load_root(key, ctx, "en");
app.Gui__cbk_mgr().Send_json(cbk_trg, "xo.cfg_edit.select__recv", root.To_nde(Bry_bfr_.New()));
app.Cfg().Set_str_app(Xocfg_edit_special.Cfg__previous_grp, key);
}
}

View File

@@ -13,3 +13,24 @@ The terms of each license can be found in the source code repository:
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
*/
package gplx.xowa.addons.apps.cfgs.specials.maints.pages; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.apps.*; import gplx.xowa.addons.apps.cfgs.*; import gplx.xowa.addons.apps.cfgs.specials.*; import gplx.xowa.addons.apps.cfgs.specials.maints.*;
import gplx.xowa.specials.*; import gplx.langs.mustaches.*; import gplx.xowa.wikis.pages.*; import gplx.xowa.wikis.pages.tags.*;
import gplx.xowa.addons.apps.cfgs.specials.edits.objs.*;
class Xocfg_maint_html extends Xow_special_wtr__base {
public Xocfg_maint_html() {}
@Override protected Io_url Get_addon_dir(Xoa_app app) {return app.Fsys_mgr().Http_root().GenSubDir_nest("bin", "any", "xowa", "addon", "app", "cfg", "maint");}
@Override protected Io_url Get_mustache_fil(Io_url addon_dir) {return addon_dir.GenSubFil_nest("bin", "xo.cfg_maint.mustache.html");}
@Override protected Mustache_doc_itm Bld_mustache_root(Xoa_app app) {
return new Xoedit_grp(0, "test", 1);
}
@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());
Xopg_tag_wtr_.Add__xohelp (head_tags, app.Fsys_mgr().Http_root());
Xopg_tag_wtr_.Add__xolog (head_tags, app.Fsys_mgr().Http_root());
Xopg_tag_wtr_.Add__xoajax (head_tags, app.Fsys_mgr().Http_root(), app);
head_tags.Add(Xopg_tag_itm.New_css_file(addon_dir.GenSubFil_nest("bin", "xo.cfg_maint.css")));
head_tags.Add(Xopg_tag_itm.New_js_file(addon_dir.GenSubFil_nest("bin", "xo.cfg_maint.js")));
}
}

View File

@@ -13,3 +13,15 @@ The terms of each license can be found in the source code repository:
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
*/
package gplx.xowa.addons.apps.cfgs.specials.maints.pages; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.apps.*; import gplx.xowa.addons.apps.cfgs.*; import gplx.xowa.addons.apps.cfgs.specials.*; import gplx.xowa.addons.apps.cfgs.specials.maints.*;
import gplx.xowa.specials.*; import gplx.core.net.qargs.*;
public class Xocfg_maint_special implements Xow_special_page {
public void Special__gen(Xow_wiki wiki, Xoa_page page, Xoa_url url, Xoa_ttl ttl) {
new Xocfg_maint_html().Bld_page_by_mustache(wiki.App(), page, this);
}
Xocfg_maint_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;
public Xow_special_page Special__clone() {return this;}
public static final Xow_special_page Prototype = new Xocfg_maint_special(Xow_special_meta.New_xo("XowaCfgMaint", "Option Maintenance"));
}

View File

@@ -13,3 +13,29 @@ The terms of each license can be found in the source code repository:
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
*/
package gplx.xowa.addons.apps.cfgs.specials.maints.services; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.apps.*; import gplx.xowa.addons.apps.cfgs.*; import gplx.xowa.addons.apps.cfgs.specials.*; import gplx.xowa.addons.apps.cfgs.specials.maints.*;
import gplx.langs.jsons.*;
import gplx.xowa.htmls.bridges.*;
public class Xocfg_maint_bridge implements Bridge_cmd_itm {
private Xocfg_maint_svc svc;
public void Init_by_app(Xoa_app app) {
this.svc = new Xocfg_maint_svc(app);
}
public String Exec(Json_nde data) {
byte proc_id = proc_hash.Get_as_byte_or(data.Get_as_bry_or(Bridge_cmd_mgr.Msg__proc, null), Byte_ascii.Max_7_bit);
Json_nde args = data.Get_kv(Bridge_cmd_mgr.Msg__args).Val_as_nde();
switch (proc_id) {
case Proc__upsert: svc.Upsert(args.Get_as_str("data")); break;
default: throw Err_.new_unhandled_default(proc_id);
}
return "";
}
private static final byte Proc__upsert = 0;
private static final Hash_adp_bry proc_hash = Hash_adp_bry.cs()
.Add_str_byte("upsert" , Proc__upsert)
;
public byte[] Key() {return BRIDGE_KEY;} public static final byte[] BRIDGE_KEY = Bry_.new_a7("xo.cfg_maint");
public static final Xocfg_maint_bridge Prototype = new Xocfg_maint_bridge(); Xocfg_maint_bridge() {}
}

View File

@@ -13,3 +13,46 @@ The terms of each license can be found in the source code repository:
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
*/
package gplx.xowa.addons.apps.cfgs.specials.maints.services; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.apps.*; import gplx.xowa.addons.apps.cfgs.*; import gplx.xowa.addons.apps.cfgs.specials.*; import gplx.xowa.addons.apps.cfgs.specials.maints.*;
abstract class Xocfg_maint_nde implements gplx.core.brys.Bry_bfr_able {
public Xocfg_maint_nde(String owner, int id, String key, String name, String help) {
this.owner = owner;
this.id = id;
this.key = key;
this.name = name;
this.help = help;
}
public abstract boolean Type_is_grp();
public String Owner() {return owner;} private final String owner;
public int Id() {return id;} private final int id;
public String Key() {return key;} private final String key;
public String Name() {return name;} private final String name;
public String Help() {return help;} private final String help;
public void To_bfr(Bry_bfr bfr) {
bfr.Add_str_u8_fmt("{0}|{1}|{2}|{3}|{4}", owner, this.Type_is_grp(), key, name, help);
To_bfr_hook(bfr);
}
protected abstract void To_bfr_hook(Bry_bfr bfr);
}
class Xocfg_maint_grp extends Xocfg_maint_nde { public Xocfg_maint_grp(String owner, int id, String key, String name, String help) {super(owner, id, key, name, help);
}
@Override public boolean Type_is_grp() {return true;}
@Override protected void To_bfr_hook(Bry_bfr bfr) {}
}
class Xocfg_maint_itm extends Xocfg_maint_nde { public Xocfg_maint_itm(String owner, int id, String key, String name, String help, String scope, String type, String dflt, String html_atrs, String html_cls) {super(owner, id, key, name, help);
this.scope = scope;
this.type = type;
this.dflt = dflt;
this.html_atrs = html_atrs;
this.html_cls = html_cls;
}
@Override public boolean Type_is_grp() {return false;}
public String Scope() {return scope;} private final String scope;
public String Type() {return type;} private final String type;
public String Dflt() {return dflt;} private final String dflt;
public String Html_atrs() {return html_atrs;} private final String html_atrs;
public String Html_cls() {return html_cls;} private final String html_cls;
@Override protected void To_bfr_hook(Bry_bfr bfr) {
bfr.Add_str_u8_fmt("|{0}|{1}|{2}|{3}|{4}", scope, type, dflt, html_atrs, html_cls);
}
}

View File

@@ -13,3 +13,60 @@ The terms of each license can be found in the source code repository:
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
*/
package gplx.xowa.addons.apps.cfgs.specials.maints.services; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.apps.*; import gplx.xowa.addons.apps.cfgs.*; import gplx.xowa.addons.apps.cfgs.specials.*; import gplx.xowa.addons.apps.cfgs.specials.maints.*;
import gplx.langs.gfs.*;
class Xocfg_maint_parser {
public Xocfg_maint_nde[] Parse(String raw) {
GfoMsg root = Gfs_msg_bldr.Instance.ParseToMsg(raw);
int len = root.Subs_count();
Xocfg_maint_nde[] rv = new Xocfg_maint_nde[len];
for (int i = 0; i < len; i++) {
GfoMsg msg = root.Subs_getAt(i);
rv[i] = Parse_nde(msg);
}
return rv;
}
private Xocfg_maint_nde Parse_nde(GfoMsg msg) {
Ordered_hash hash = To_atr_hash(msg);
// get common atrs
int id = Int_.Parse(Get_atr_as_str_or_fail(hash, "id_"));
String owner = Get_atr_as_str_or_fail(hash, "owner_");
String key = Get_atr_as_str_or_fail(hash, "key_");
String name = Get_atr_as_str_or_fail(hash, "name_");
String help = Get_atr_as_str_or_fail(hash, "help_");
// create
String nde_type = msg.Key();
if (String_.Eq(nde_type, "grp")) {
return new Xocfg_maint_grp(owner, id, key, name, help);
}
else if (String_.Eq(nde_type, "itm")) {
String scope = Get_atr_as_str_or(hash, "scope_", ""); if (String_.Eq(scope, "")) scope = "wiki";
String type = Get_atr_as_str_or_fail(hash, "type_");
String dflt = Get_atr_as_str_or_fail(hash, "dflt_");
String html_atrs = Get_atr_as_str_or(hash, "html_atrs_", "");
String html_cls = Get_atr_as_str_or(hash, "html_cls_", "");
return new Xocfg_maint_itm(owner, id, key, name, help, scope, type, dflt, html_atrs, html_cls);
}
else throw Err_.new_wo_type("xo.cfg_maint:unknown type", "type", nde_type);
}
private static Ordered_hash To_atr_hash(GfoMsg msg) {
Ordered_hash rv = Ordered_hash_.New();
int len = msg.Subs_count();
for (int i = 0; i < len; i++) {
GfoMsg sub = msg.Subs_getAt(i);
rv.Add(sub.Key(), sub.Args_getAt(0).Val());
}
return rv;
}
private static String Get_atr_as_str_or_fail(Ordered_hash hash, String key) {
String rv = Get_atr_as_str_or(hash, key, null);
if (rv == null) throw Err_.new_wo_type("xo.cfg_maint:missing key", "key", key);
return rv;
}
private static String Get_atr_as_str_or(Ordered_hash hash, String key, String or) {
String val = (String)hash.Get_by(key);
return val == null ? or : val;
}
}

View File

@@ -13,3 +13,31 @@ The terms of each license can be found in the source code repository:
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
*/
package gplx.xowa.addons.apps.cfgs.specials.maints.services; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.apps.*; import gplx.xowa.addons.apps.cfgs.*; import gplx.xowa.addons.apps.cfgs.specials.*; import gplx.xowa.addons.apps.cfgs.specials.maints.*;
import org.junit.*; import gplx.core.tests.*;
public class Xocfg_maint_parser__tst {
private final Xocfg_maint_parser__fxt fxt = new Xocfg_maint_parser__fxt();
@Test public void Parse_grp() {
fxt.Exec__parse("grp {id='123'; key='key_1'; owner='owner_1'; name='name_1'; help='help_1'}"
, fxt.Make__grp("owner_1", 123, "key_1", "name_1", "help_1")
);
}
@Test public void Parse_itm() {
fxt.Exec__parse("itm {id='123'; key='key_1'; owner='owner_1'; name='name_1'; help='help_1'; scope='scope_1'; type='type_1'; dflt='dflt_1'; html_atrs='html_atrs_1'; html_cls='html_cls_1'}"
, fxt.Make__itm("owner_1", 123, "key_1", "name_1", "help_1", "scope_1", "type_1", "dflt_1", "html_atrs_1", "html_cls_1")
);
}
}
class Xocfg_maint_parser__fxt {
private Xocfg_maint_parser parser = new Xocfg_maint_parser();
public void Exec__parse(String raw, Xocfg_maint_nde... expd) {
Xocfg_maint_nde[] actl = parser.Parse(raw);
Gftest.Eq__ary(expd, actl);
}
public Xocfg_maint_grp Make__grp(String owner, int id, String key, String name, String help) {
return new Xocfg_maint_grp(owner, id, key, name, help);
}
public Xocfg_maint_itm Make__itm(String owner, int id, String key, String name, String help, String scope, String type, String dflt, String html_atrs, String html_cls) {
return new Xocfg_maint_itm(owner, id, key, name, help, scope, type, dflt, html_atrs, html_cls);
}
}

View File

@@ -13,3 +13,67 @@ The terms of each license can be found in the source code repository:
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
*/
package gplx.xowa.addons.apps.cfgs.specials.maints.services; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.apps.*; import gplx.xowa.addons.apps.cfgs.*; import gplx.xowa.addons.apps.cfgs.specials.*; import gplx.xowa.addons.apps.cfgs.specials.maints.*;
import gplx.xowa.addons.apps.cfgs.dbs.*; import gplx.xowa.addons.apps.cfgs.dbs.tbls.*;
import gplx.xowa.addons.apps.cfgs.enums.*;
public class Xocfg_maint_svc {
private Xoa_app app;
public Xocfg_maint_svc(Xoa_app app) {
this.app = app;
}
public void Upsert(String raw) {
// get wikitext parser
Xowe_wiki wiki = (Xowe_wiki)app.User().Wikii();
gplx.xowa.parsers.Xow_parser_mgr parser_mgr = wiki.Parser_mgr();
// parse raw
Xocfg_maint_parser maint_parser = new Xocfg_maint_parser();
Xocfg_maint_nde[] ndes = maint_parser.Parse(raw);
// exec
Xocfg_db_app db_app = Xocfg_db_app.New(app);
db_app.Conn().Txn_bgn("xo__cfg_maint__upsert");
byte[] anch_find_bry = Bry_.new_a7("<a "), anch_repl_bry = Bry_.new_a7("<a tabindex=\"-1\" ");
Bry_bfr tmp_bfr = Bry_bfr_.New();
for (Xocfg_maint_nde nde : ndes) {
// parse help to html
parser_mgr.Main().Parse_text_to_html(tmp_bfr, parser_mgr.Ctx(), parser_mgr.Ctx().Page(), true, Bry_.new_u8(nde.Help()));
byte[] help = tmp_bfr.To_bry_and_clear();
help = Bry_.Replace(help, anch_find_bry, anch_repl_bry); // replace "<a " with "<a tabindex=-1 " else tabbing will go to hidden anchors in help text
// do insert
if (nde.Type_is_grp()) {
Xocfg_maint_svc.Create_grp(db_app, nde.Owner(), nde.Id(), nde.Key(), nde.Name(), String_.new_u8(help));
}
else {
Xocfg_maint_itm itm = (Xocfg_maint_itm)nde;
Xocfg_maint_svc.Create_itm(db_app, nde.Owner(), nde.Id(), nde.Key(), nde.Name(), String_.new_u8(help), itm.Scope(), itm.Type(), itm.Dflt(), itm.Html_atrs(), itm.Html_cls());
}
}
db_app.Conn().Txn_end();
}
public static void Create_grp(Xocfg_db_app db_app, String owner, int id, String key, String name, String help) {
// insert grp_meta
db_app.Tbl__grp().Upsert(id, key);
// insert grp_map
int owner_id = String_.Len_eq_0(owner) ? Xocfg_grp_row.Id__root : db_app.Tbl__grp().Select_id_by_key_or_fail(owner);
int map_sort = db_app.Tbl__map().Select_sort_or_next(owner_id, id);
db_app.Tbl__map().Upsert(owner_id, id, map_sort);
// insert nde_i18n
db_app.Tbl__txt().Upsert(id, Xoitm_lang_tid.Lang__dflt, name, help);
}
public static void Create_itm(Xocfg_db_app db_app, String owner, int id, String key, String name, String help, String scope, String type, String dflt, String html_atrs, String html_cls) {
// insert itm_meta
db_app.Tbl__itm().Upsert(id, key, Xoitm_scope_enum.To_int(scope), type, dflt, html_atrs, html_cls);
// insert grp_map
int grp_id = db_app.Tbl__grp().Select_id_by_key_or_fail(owner);
int itm_sort = db_app.Tbl__map().Select_sort_or_next(grp_id, id);
db_app.Tbl__map().Upsert(grp_id, id, itm_sort);
// insert nde_i18n
db_app.Tbl__txt().Upsert(id, Xoitm_lang_tid.Lang__dflt, name, help);
}
}

View File

@@ -13,3 +13,115 @@ The terms of each license can be found in the source code repository:
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
*/
package gplx.xowa.addons.apps.cfgs.upgrades; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.apps.*; import gplx.xowa.addons.apps.cfgs.*;
import gplx.dbs.*;
import gplx.langs.gfs.*;
public class Xocfg_upgrade_mgr {
public static void Upgrade_cfg_0(Xoae_app app) {
try {
// get cfg_fil; if empty, exit
Io_url cfg_fil = app.Fsys_mgr().Root_dir().GenSubFil_nest("user", "anonymous", "app", "data", "cfg", "xowa_user_cfg.gfs");
byte[] cfg_raw = Io_mgr.Instance.LoadFilBryOrNull(cfg_fil);
if (cfg_raw == null) return;
// log and rename file
Gfo_usr_dlg_.Instance.Log_many("", "", "cfg.convert:old cfg found; converting");
Io_mgr.Instance.MoveFil_args(cfg_fil, cfg_fil.GenNewExt(".bak"), true).Exec();
// parse, remap, and update
Keyval[] kvs = Parse(cfg_raw);
// get mappings
Ordered_hash mappings = Ordered_hash_.New();
Db_conn conn = app.Cfg().Cache_mgr().Db_app().Conn();
Db_rdr rdr = conn.Stmt_sql("SELECT * FROM cfg_upgrade").Exec_select__rls_auto();
try {
while (rdr.Move_next()) {
String cfg_old = rdr.Read_str("cfg_old");
String cfg_new = rdr.Read_str("cfg_new");
mappings.Add(cfg_old, Keyval_.new_(cfg_old, cfg_new));
}
}
finally {rdr.Rls();}
// remap
for (Keyval kv : kvs) {
Keyval mapping = (Keyval)mappings.Get_by(kv.Key());
if (mapping == null) {
Gfo_usr_dlg_.Instance.Log_many("", "", "cfg.convert:could not find mapping; key=~{0} val=~{1}", kv.Key(), kv.Val());
kv.Key_("");
continue;
}
kv.Key_(mapping.Val());
}
// apply
app.Cfg().Cache_mgr().Db_usr().Conn().Txn_bgn("convert");
for (Keyval kv : kvs) {
if (String_.Eq(kv.Key(), "")) continue;
Gfo_usr_dlg_.Instance.Log_many("", "", "cfg.convert:converting; key=~{0} val=~{1}", kv.Key(), kv.Val());
app.Cfg().Set_str_app(kv.Key(), kv.Val_to_str_or_empty());
}
app.Cfg().Cache_mgr().Db_usr().Conn().Txn_end();
} catch (Exception exc) {
Gfo_usr_dlg_.Instance.Warn_many("", "", "failed to convert old cfg; err=~{0}", Err_.Message_gplx_log(exc));
}
}
public static Keyval[] Parse(byte[] src) {
// main parse
Gfs_parser parser = new Gfs_parser();
Ordered_hash hash = Ordered_hash_.New();
Gfs_nde root = parser.Parse(src);
int root_len = root.Subs_len();
for (int i = 0; i < root_len; i++) {
Gfs_nde app_nde = root.Subs_get_at(i);
Gfs_nde cfgs_nde = app_nde.Subs_get_at(0);
Gfs_nde get_nde = cfgs_nde.Subs_get_at(0);
Gfs_nde key_atr = get_nde.Atrs_get_at(0);
Gfs_nde val_nde = get_nde.Subs_get_at(0);
Gfs_nde val_atr = val_nde.Atrs_get_at(0);
String key = String_.new_u8(key_atr.Name_bry(src));
hash.Add(key, Keyval_.new_(key, String_.new_u8(val_atr.Name_bry(src))));
}
// consolidate io.cmd
List_adp deleted = List_adp_.New();
int len = hash.Len();
for (int i = 0; i < len; i++) {
Keyval args_kv = (Keyval)hash.Get_at(i);
String args_kv_key = args_kv.Key();
String args_kv_val = args_kv.Val_to_str_or_empty();
if (String_.Has_at_end(args_kv_key, ".args")) {
Keyval cmd_kv = (Keyval)hash.Get_by(String_.Replace(args_kv_key, ".args", ".cmd"));
if (cmd_kv == null) {
Gfo_usr_dlg_.Instance.Log_many("", "", "cfg.convert:could not find cmd; key=~{0} val=~{1}", args_kv_key, args_kv.Val());
continue;
}
String cmd_kv_val = cmd_kv.Val_to_str_or_empty();
if (!String_.Has_at_end(cmd_kv_val, "|")) cmd_kv_val += "|";
cmd_kv.Val_(cmd_kv_val + args_kv_val);
deleted.Add(args_kv_key);
}
else if (String_.Has_at_bgn(args_kv_key, "app.cfg.get.gui.bnds.init('")) {
args_kv_key = String_.Replace(args_kv_key, "app.cfg.get.gui.bnds.init('", "");
args_kv_key = String_.Replace(args_kv_key, "').src", "");
args_kv_key = "xowa.gui.shortcuts." + args_kv_key;
args_kv.Key_(args_kv_key);
args_kv_val = String_.Replace(args_kv_val, "box='", "");
args_kv_val = String_.Replace(args_kv_val, "';ipt='", "|");
args_kv_val = String_.Replace(args_kv_val, "';", "");
args_kv.Val_(args_kv_val);
}
}
// delete args
len = deleted.Len();
for (int i = 0; i < len; i++) {
String deleted_key = (String)deleted.Get_at(i);
hash.Del(deleted_key);
}
return (Keyval[])hash.To_ary_and_clear(Keyval.class);
}
}

View File

@@ -13,3 +13,44 @@ The terms of each license can be found in the source code repository:
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
*/
package gplx.xowa.addons.apps.cfgs.upgrades; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.apps.*; import gplx.xowa.addons.apps.cfgs.*;
import org.junit.*; import gplx.core.tests.*;
public class Xocfg_upgrade_mgr__tst {
private final Xocfg_upgrade_mgr__fxt fxt = new Xocfg_upgrade_mgr__fxt();
@Test public void Parse__one() {
fxt.Test__parse("app.cfgs.get('k_1', 'app').val = 'v_1';\n", Keyval_.new_("k_1", "v_1"));
}
@Test public void Parse__apos() {
fxt.Test__parse("app.cfgs.get('k_1(''k_1a'')', 'app').val = 'v_1';\n", Keyval_.new_("k_1('k_1a')", "v_1"));
}
@Test public void Parse__many() {
fxt.Test__parse
( "app.cfgs.get('k_1', 'app').val = 'v_1';\n"
+ "app.cfgs.get('k_2', 'app').val = 'v_2';\n"
, Keyval_.new_("k_1", "v_1"), Keyval_.new_("k_2", "v_2"));
}
@Test public void Parse__multi_line() {
fxt.Test__parse
( "app.cfgs.get('k_1', 'app').val = '''v_1'';\n"
+ "v_2\n"
+ "v_3';\n"
, Keyval_.new_("k_1", "'v_1';\nv_2\nv_3"));
}
@Test public void Parse__io_cmd() {
fxt.Test__parse
( "app.cfgs.get('a.cmd', 'app').val = 'cmd_1';\n"
+ "app.cfgs.get('a.args', 'app').val = 'args_1';\n"
, Keyval_.new_("a.cmd", "cmd_1|args_1"));
}
@Test public void Parse__gui_binding() {
fxt.Test__parse
( "app.cfgs.get('app.cfg.get.gui.bnds.init(''xowa.app.exit-1'').src', 'app').val = 'box=''browser'';ipt=''key.none'';';\n"
, Keyval_.new_("xowa.gui.shortcuts.xowa.app.exit-1", "browser|key.none"));
}
}
class Xocfg_upgrade_mgr__fxt {
public void Test__parse(String raw, Keyval... expd) {
Keyval[] actl = Xocfg_upgrade_mgr.Parse(Bry_.new_u8(raw));
Gftest.Eq__str(Keyval_.Ary_to_str(expd), Keyval_.Ary_to_str(actl));
}
}

View File

@@ -13,3 +13,14 @@ The terms of each license can be found in the source code repository:
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
*/
package gplx.xowa.addons.apps.helps.logs; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.apps.*; import gplx.xowa.addons.apps.helps.*;
import gplx.xowa.specials.*; import gplx.xowa.htmls.bridges.*;
public class Xolog_addon implements Xoax_addon_itm, Xoax_addon_itm__special {
public Xow_special_page[] Special_pages() {
return new Xow_special_page[]
{ Xolog_special.Prototype
};
}
public String Addon__key() {return "xowa.apps.helps.logs";}
}

View File

@@ -13,3 +13,73 @@ The terms of each license can be found in the source code repository:
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
*/
package gplx.xowa.addons.apps.helps.logs; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.apps.*; import gplx.xowa.addons.apps.helps.*;
import gplx.langs.mustaches.*;
class Xolog_doc implements Mustache_doc_itm {
public Xolog_doc(String log_file, String log_name, byte[] log_data, Xolog_doc_file[] log_files) {
this.log_file = log_file; this.log_name = log_name;
this.log_data = log_data; this.log_files = log_files;
}
public String Log_file() {return log_file;} private final String log_file; // EX: 20160613_165025
public String Log_name() {return log_name;} private final String log_name; // EX: 2016-06-13 16:50:25
public byte[] Log_data() {return log_data;} private final byte[] log_data;
public Xolog_doc_file[] Log_files() {return log_files;} private final Xolog_doc_file[] log_files;
public boolean Mustache__write(String key, Mustache_bfr bfr) {
if (String_.Eq(key, "log_name")) bfr.Add_str_u8(log_name);
else if (String_.Eq(key, "log_file")) bfr.Add_str_u8(log_file);
else if (String_.Eq(key, "log_data")) bfr.Add_bry(log_data);
return false;
}
public Mustache_doc_itm[] Mustache__subs(String key) {
if (String_.Eq(key, "log_files")) return log_files;
return Mustache_doc_itm_.Ary__empty;
}
}
class Xolog_doc_ {
public static Xolog_doc New(Io_url log_dir, String log_file) {
// read fsys
Io_url[] fils = Io_mgr.Instance.QueryDir_fils(log_dir);
int len = fils.length;
// get log_files
Ordered_hash hash = Ordered_hash_.New();
for (int i = 0; i < len; ++i) {
Io_url fil = fils[i];
String file = fil.NameOnly();
String name = Xolog_file_utl.To_name(file);
hash.Add(file, new Xolog_doc_file(file, name));
}
// determine cur_file
String cur_file = log_file;
if ( cur_file == null // cur_file is null; happens for plain "Special:XowaLog"
|| !hash.Has(cur_file) // cur_file deleted (accessed from history)
) {
cur_file = hash.Len() == 0
? null
: ((Xolog_doc_file)hash.Get_at(len - 1)).File();
}
if (cur_file != null)
hash.Del(cur_file); // don't bother showing current item in list
Xolog_doc_file[] log_files = (Xolog_doc_file[])hash.To_ary_and_clear(Xolog_doc_file.class);
// get body
byte[] cur_body = Io_mgr.Instance.LoadFilBry(Xolog_file_utl.To_url_by_file(log_dir, cur_file));
String cur_name = cur_file == null ? null : Xolog_file_utl.To_name(cur_file);
return new Xolog_doc(cur_file, cur_name, cur_body, log_files);
}
}
class Xolog_doc_file implements Mustache_doc_itm {
public Xolog_doc_file(String file, String name) {
this.file = file; this.name = name;
}
public String File() {return file;} private final String file;
public String Name() {return name;} private final String name;
public boolean Mustache__write(String key, Mustache_bfr bfr) {
if (String_.Eq(key, "file")) bfr.Add_str_u8(file);
else if (String_.Eq(key, "name")) bfr.Add_str_u8(name);
else return false;
return true;
}
public Mustache_doc_itm[] Mustache__subs(String key) {return Mustache_doc_itm_.Ary__empty;}
}

View File

@@ -13,3 +13,24 @@ The terms of each license can be found in the source code repository:
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
*/
package gplx.xowa.addons.apps.helps.logs; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.apps.*; import gplx.xowa.addons.apps.helps.*;
import gplx.xowa.specials.*; import gplx.langs.mustaches.*; import gplx.xowa.wikis.pages.*; import gplx.xowa.wikis.pages.tags.*;
class Xolog_html extends Xow_special_wtr__base {
private final Xolog_doc log_doc;
public Xolog_html(Xolog_doc log_doc) {
this.log_doc = log_doc;
}
@Override protected Io_url Get_addon_dir(Xoa_app app) {return app.Fsys_mgr().Http_root().GenSubDir_nest("bin", "any", "xowa", "addon", "app", "help", "log");}
@Override protected Io_url Get_mustache_fil(Io_url addon_dir) {return addon_dir.GenSubFil_nest("bin", "xolog.mustache.html");}
@Override protected Mustache_doc_itm Bld_mustache_root(Xoa_app app) {
return log_doc;
}
@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());
Xopg_tag_wtr_.Add__xohelp (head_tags, app.Fsys_mgr().Http_root());
Xopg_alertify_.Add_tags (head_tags, app.Fsys_mgr().Http_root());
page_data.Head_tags().Add(Xopg_tag_itm.New_css_file(addon_dir.GenSubFil_nest("bin", "xolog.css")));
page_data.Head_tags().Add(Xopg_tag_itm.New_js_file(addon_dir.GenSubFil_nest("bin", "xolog.js")));
}
}

View File

@@ -13,3 +13,73 @@ The terms of each license can be found in the source code repository:
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
*/
package gplx.xowa.addons.apps.helps.logs; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.apps.*; import gplx.xowa.addons.apps.helps.*;
import gplx.xowa.specials.*; import gplx.core.net.*; import gplx.core.net.qargs.*; import gplx.xowa.wikis.pages.*;
import gplx.core.net.emails.*;
public class Xolog_special implements Xow_special_page {
public void Special__gen(Xow_wiki wiki, Xoa_page page, Xoa_url url, Xoa_ttl ttl) {
// init
Gfo_qarg_mgr url_args = new Gfo_qarg_mgr().Init(url.Qargs_ary());
Xoa_app app = wiki.App();
Gfo_log_.Instance.Flush(); // flush log to write all memory itms to disk
// get file
String file = url_args.Read_str_or_null("file");
Io_url log_dir = app.Fsys_mgr().Root_dir().GenSubDir_nest("user", "anonymous", "app", "tmp", "xolog");
Xolog_doc log_doc = Xolog_doc_.New(log_dir, file);
if (log_doc.Log_file() == null) return; // occurs when all logs are deleted
// get cmd
int cmd_tid = url_args.Read_enm_as_int_or(Enm_cmd.Itm, Enm_cmd.Tid__view);
boolean redirect = true, redirect_to_same_file = false;;
switch (cmd_tid) {
case Enm_cmd.Tid__view: redirect = false; break;
case Enm_cmd.Tid__email: redirect_to_same_file = true; Gfo_email_mgr_.Instance.Send("gnosygnu+xowa_xologs@gmail.com", "XOWA Log", String_.new_u8(log_doc.Log_data())); break;
case Enm_cmd.Tid__delete_one: Io_mgr.Instance.DeleteFil(Xolog_file_utl.To_url_by_file(log_dir, log_doc.Log_file())); break;
case Enm_cmd.Tid__delete_all: Io_mgr.Instance.DeleteDirDeep(log_dir); break;
}
if (redirect) {
Xoa_url_args_bldr args_bldr = new Xoa_url_args_bldr();
args_bldr.Add("cmd", "view");
if (redirect_to_same_file && file != null)
args_bldr.Add("file", file);
page.Redirect_trail().Itms__add__special(wiki, Prototype.Special__meta(), args_bldr.To_ary());
return;
}
else
new Xolog_html(log_doc).Bld_page_by_mustache(app, page, this);
}
static class Enm_cmd {//#*nested
public static final int Tid__view = 0, Tid__email = 1, Tid__delete_one = 2, Tid__delete_all = 3;
public static final Gfo_qarg_enum_itm Itm = new Gfo_qarg_enum_itm("cmd")
.Add("view" , Tid__view)
.Add("email" , Tid__email)
.Add("delete_one" , Tid__delete_one)
.Add("delete_all" , Tid__delete_all)
;
}
Xolog_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;
public Xow_special_page Special__clone() {return this;}
public static final Xow_special_page Prototype = new Xolog_special(Xow_special_meta.New_xo("XowaLog", "Logs"));
}
class Xoa_url_args_bldr {
private final List_adp list = List_adp_.New();
public Xoa_url_args_bldr Add(String key, Object val) {
list.Add(Keyval_.new_(key, val));
return this;
}
public Keyval[] To_ary() {return (Keyval[])list.To_ary_and_clear(Keyval.class);}
}
class Xolog_file_utl {// yyyyMMdd_HHmmss.log
private static final String Gui__date_fmt = "yyyy-MM-dd HH:mm:ss";
public static String To_name(Io_url url) {return To_name(url.NameOnly());}
public static String To_name(String file) {
DateAdp date = DateAdp_.parse_fmt(file, Gfo_log_.File__fmt);
return date.XtoStr_fmt(Gui__date_fmt);
}
public static Io_url To_url_by_file(Io_url dir, String file) {
return dir.GenSubFil(file + Gfo_log_.File__ext);
}
}

View File

@@ -13,3 +13,19 @@ The terms of each license can be found in the source code repository:
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
*/
package gplx.xowa.addons.apps.maints.sql_execs; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.apps.*; import gplx.xowa.addons.apps.maints.*;
import gplx.xowa.specials.*; import gplx.xowa.htmls.bridges.*;
public class Xosql_exec_addon implements Xoax_addon_itm, Xoax_addon_itm__special, Xoax_addon_itm__json {
public Xow_special_page[] Special_pages() {
return new Xow_special_page[]
{ gplx.xowa.addons.apps.maints.sql_execs.specials.Xosql_exec_special.Prototype
};
}
public Bridge_cmd_itm[] Json_cmds() {
return new Bridge_cmd_itm[]
{ gplx.xowa.addons.apps.maints.sql_execs.cbks.Xosql_exec_bridge.Prototype
};
}
public String Addon__key() {return ADDON__KEY;} private static final String ADDON__KEY = "xowa.app.maint.sql_exec";
}

View File

@@ -13,3 +13,29 @@ The terms of each license can be found in the source code repository:
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
*/
package gplx.xowa.addons.apps.maints.sql_execs.cbks; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.apps.*; import gplx.xowa.addons.apps.maints.*; import gplx.xowa.addons.apps.maints.sql_execs.*;
import gplx.langs.jsons.*;
import gplx.xowa.htmls.bridges.*;
public class Xosql_exec_bridge implements Bridge_cmd_itm {
private Xosql_exec_svc svc;
public void Init_by_app(Xoa_app app) {
this.svc = new Xosql_exec_svc(app);
}
public String Exec(Json_nde data) {
byte proc_id = proc_hash.Get_as_byte_or(data.Get_as_bry_or(Bridge_cmd_mgr.Msg__proc, null), Byte_ascii.Max_7_bit);
Json_nde args = data.Get_kv(Bridge_cmd_mgr.Msg__args).Val_as_nde();
switch (proc_id) {
case Proc__exec: svc.Exec(args); break;
default: throw Err_.new_unhandled_default(proc_id);
}
return "";
}
private static final byte Proc__exec = 0;
private static final Hash_adp_bry proc_hash = Hash_adp_bry.cs()
.Add_str_byte("exec" , Proc__exec)
;
public byte[] Key() {return BRIDGE_KEY;} public static final byte[] BRIDGE_KEY = Bry_.new_a7("xowa.app.maint.sql_exec");
public static final Xosql_exec_bridge Prototype = new Xosql_exec_bridge(); Xosql_exec_bridge() {}
}

View File

@@ -13,3 +13,78 @@ The terms of each license can be found in the source code repository:
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
*/
package gplx.xowa.addons.apps.maints.sql_execs.cbks; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.apps.*; import gplx.xowa.addons.apps.maints.*; import gplx.xowa.addons.apps.maints.sql_execs.*;
import gplx.langs.jsons.*;
import gplx.dbs.*; import gplx.xowa.specials.xowa.diags.*;
/* TODO.XO
* add backup function to backup db
* option to output to file
* run multiple SQL statements (need to change jdbc)
* print column headers if SELECT
* print row counts
* run stored procs? EXEC debug_image 'A.png'
*/
class Xosql_exec_svc {
private gplx.xowa.guis.cbks.Xog_cbk_trg cbk_trg = gplx.xowa.guis.cbks.Xog_cbk_trg.New(gplx.xowa.addons.apps.maints.sql_execs.specials.Xosql_exec_special.Prototype.Special__meta().Ttl_bry());
private final Xoa_app app;
public Xosql_exec_svc(Xoa_app app) {
this.app = app;
}
public void Exec(Json_nde args) {
String domain = args.Get_as_str("domain");
String db = args.Get_as_str("db");
String sql = args.Get_as_str("sql");
// get conn
Db_conn conn = null;
if (String_.Eq(domain, DOMAIN__APP)) {
if (String_.Eq(db, DB__USER)) {
conn = app.User().User_db_mgr().Conn();
}
}
else if (String_.Eq(domain, DOMAIN__FILE)) {
conn = Db_conn_bldr.Instance.Get_or_fail(Io_url_.new_any_(db));
}
else {
Xow_wiki wiki = String_.Eq(domain, DOMAIN__HOME)
? wiki = app.User().Wikii()
: app.Wiki_mgri().Get_by_or_make_init_y(Bry_.new_u8(domain));
// for now, only support core
if (String_.Eq(db, DB__CORE)) {
conn = wiki.Data__core_mgr().Db__core().Conn();
}
}
String results = null;
try {
// run sql
// HACK: assume SQL starting with SELECT is a reader
if (String_.Has_at_bgn(sql, "SELECT ")) {
// run select
Bry_bfr bfr = Bry_bfr_.New();
Object[][] rows = Db_rdr_utl.Load(conn, sql);
Db_rdr_utl.Write_to_bfr(bfr, rows);
results = bfr.To_str_and_clear();
}
else {
conn.Exec_sql(sql);
results = "executed";
}
} catch (Exception exc) {
results = Err_.Message_gplx_full(exc);
results = String_.Replace(results, "\t", "&nbsp;&nbsp;&nbsp;&nbsp;"); // tabs must be escaped, else "bad character in String literal"
}
// send results
app.Gui__cbk_mgr().Send_json(cbk_trg, "xo.sql_exec.results__recv", gplx.core.gfobjs.Gfobj_nde.New()
.Add_bry("msg_text", Bry_.Escape_html(Bry_.new_u8(results)))); // escape html; EX: "<" -> "&lt;"
}
private static final String
DOMAIN__APP = "[xowa.app]"
, DOMAIN__HOME = "[xowa.home]"
, DOMAIN__FILE = "[file]"
, DB__CORE = "core"
, DB__USER = "user"
;
}

View File

@@ -13,3 +13,25 @@ The terms of each license can be found in the source code repository:
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
*/
package gplx.xowa.addons.apps.maints.sql_execs.specials; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.apps.*; import gplx.xowa.addons.apps.maints.*; import gplx.xowa.addons.apps.maints.sql_execs.*;
import gplx.langs.mustaches.*;
public class Xosql_exec_doc implements Mustache_doc_itm {
private final String domain, db, sql;
public Xosql_exec_doc(String domain, String db, String sql) {
this.domain = domain;
this.db = db;
this.sql = sql;
}
public boolean Mustache__write(String key, Mustache_bfr bfr) {
if (String_.Eq(key, "domain")) bfr.Add_str_u8(domain);
else if (String_.Eq(key, "db")) bfr.Add_str_u8(db);
else if (String_.Eq(key, "sql")) bfr.Add_str_u8(sql);
else return false;
return true;
}
public Mustache_doc_itm[] Mustache__subs(String key) {
return Mustache_doc_itm_.Ary__empty;
}
public static final Xosql_exec_doc[] Ary_empty = new Xosql_exec_doc[0];
}

View File

@@ -13,3 +13,37 @@ The terms of each license can be found in the source code repository:
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
*/
package gplx.xowa.addons.apps.maints.sql_execs.specials; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.apps.*; import gplx.xowa.addons.apps.maints.*; import gplx.xowa.addons.apps.maints.sql_execs.*;
import gplx.xowa.specials.*; import gplx.langs.mustaches.*; import gplx.xowa.wikis.pages.*; import gplx.xowa.wikis.pages.tags.*;
import gplx.dbs.*;
class Xosql_exec_html extends Xow_special_wtr__base {
private final String domain, db, sql;
public Xosql_exec_html(String domain, String db, String sql) {
this.domain = domain;
this.db = db;
this.sql = sql;
}
@Override protected Io_url Get_addon_dir(Xoa_app app) {return Addon_dir(app);}
@Override protected Io_url Get_mustache_fil(Io_url addon_dir) {return addon_dir.GenSubFil_nest("bin", "xosql_exec.template.html");}
@Override protected Mustache_doc_itm Bld_mustache_root(Xoa_app app) {
return new Xosql_exec_doc(domain, db, sql);
}
@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__xoelem (head_tags, app.Fsys_mgr().Http_root());
Xopg_tag_wtr_.Add__xocss (head_tags, app.Fsys_mgr().Http_root());
Xopg_tag_wtr_.Add__xohelp (head_tags, app.Fsys_mgr().Http_root());
Xopg_tag_wtr_.Add__xolog (head_tags, app.Fsys_mgr().Http_root());
Xopg_tag_wtr_.Add__xoajax (head_tags, app.Fsys_mgr().Http_root(), app);
Xopg_tag_wtr_.Add__jquery (head_tags, app.Fsys_mgr().Http_root());
Xopg_tag_wtr_.Add__xonotify (head_tags, app.Fsys_mgr().Http_root());
Xopg_alertify_.Add_tags (head_tags, app.Fsys_mgr().Http_root());
head_tags.Add(Xopg_tag_itm.New_css_file(addon_dir.GenSubFil_nest("bin", "xosql_exec.css")));
head_tags.Add(Xopg_tag_itm.New_js_file(addon_dir.GenSubFil_nest("bin", "xosql_exec.js")));
}
public static Io_url Addon_dir(Xoa_app app) {
return app.Fsys_mgr().Http_root().GenSubDir_nest("bin", "any", "xowa", "addon", "app", "maint", "sql_exec");
}
}

View File

@@ -13,3 +13,20 @@ The terms of each license can be found in the source code repository:
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
*/
package gplx.xowa.addons.apps.maints.sql_execs.specials; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.apps.*; import gplx.xowa.addons.apps.maints.*; import gplx.xowa.addons.apps.maints.sql_execs.*;
import gplx.xowa.specials.*; import gplx.core.net.qargs.*;
public class Xosql_exec_special implements Xow_special_page {
public void Special__gen(Xow_wiki wiki, Xoa_page page, Xoa_url url, Xoa_ttl ttl) {
Gfo_qarg_mgr url_args = new Gfo_qarg_mgr().Init(url.Qargs_ary());
String domain = url_args.Read_str_or("domain", "[xowa.home]");
String db = url_args.Read_str_or("db", "core");
String sql = url_args.Read_str_or("sql", "SELECT * FROM xowa_cfg;");
new Xosql_exec_html(domain, db, sql).Bld_page_by_mustache(wiki.App(), page, this);
}
Xosql_exec_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;
public Xow_special_page Special__clone() {return this;}
public static final Xow_special_page Prototype = new Xosql_exec_special(Xow_special_meta.New_xo("XowaSql", "SQL Exec"));
}

View File

@@ -13,3 +13,36 @@ The terms of each license can be found in the source code repository:
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
*/
package gplx.xowa.addons.apps.scripts; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.apps.*;
import gplx.core.envs.*;
import gplx.core.scripts.*;
public class Xoscript_env {
private final Gfo_script_engine engine;
public Xoscript_env(Gfo_script_engine engine, Io_url root_dir) {
this.root_dir = root_dir;
this.engine = engine;
}
public Io_url Root_dir() {return root_dir;} private final Io_url root_dir;
public void load_script(String file) {
engine.Load_script(Io_url_.new_fil_(Xoscript_env.Resolve_file(Bool_.N, root_dir, file)));
}
public static String Resolve_file(boolean use_file_protocol, Io_url root_dir, String file) {
String rv = file;
// resolve relative urls; EX: "./a.js" -> "/xowa/wiki/simple.wikipedia.org/bin/script/a.js"
if (String_.Has_at_bgn(rv, "./")) {
// remove "./"
rv = String_.Mid(rv, 2);
if (use_file_protocol)
rv = root_dir.To_http_file_str() + rv;
else {
// if fsys_url && wnt, replace "\" with "/"
if (Op_sys.Cur().Tid_is_wnt())
rv = String_.Replace(rv, Op_sys.Lnx.Fsys_dir_spr_str(), Op_sys.Wnt.Fsys_dir_spr_str());
rv = root_dir.Xto_api() + Op_sys.Cur().Fsys_dir_spr_str() + rv;
}
}
return rv;
}
}

View File

@@ -13,3 +13,26 @@ The terms of each license can be found in the source code repository:
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
*/
package gplx.xowa.addons.apps.scripts; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.apps.*;
import gplx.core.scripts.*;
import gplx.xowa.wikis.pages.tags.*;
import gplx.xowa.addons.apps.scripts.apis.*; import gplx.xowa.addons.apps.scripts.xtns.*;
public class Xoscript_mgr {
private Io_url root_dir;
private Xoscript_xtn_mgr xtn_mgr;
public void Init(Xow_wiki wiki) {
// check script_dir
this.root_dir = wiki.Fsys_mgr().Root_dir().GenSubDir_nest("bin", "any", "script");
if (!Io_mgr.Instance.ExistsDir(root_dir)) return;
this.xtn_mgr = new Xoscript_xtn_mgr(root_dir);
}
public void Write(Bry_bfr rv, Xow_wiki wiki, Xoa_page page) {
// init
if (!wiki.Html__wtr_mgr().Scripting_enabled()) return;
this.Init(wiki);
if (xtn_mgr == null) return;
xtn_mgr.Load_root();
xtn_mgr.Run(rv, wiki, page);
}
}

View File

@@ -13,3 +13,47 @@ The terms of each license can be found in the source code repository:
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
*/
package gplx.xowa.addons.apps.scripts.apis; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.apps.*; import gplx.xowa.addons.apps.scripts.*;
public class Xoscript_doc {
private final Bry_bfr bfr;
private final Bry_bfr tmp_bfr = Bry_bfr_.New();
public Xoscript_doc(Bry_bfr bfr, Xoscript_page page_var) {
this.bfr = bfr;
this.page_var = page_var;
this.head_var = new Xoscript_doc_head(this);
this.tail_var = new Xoscript_doc_tail(this);
head_var.reg_marker("<!--XOWA.SCRIPT.HEAD.TOP-->", "top");
head_var.reg_marker("<!--XOWA.SCRIPT.HEAD.BOT-->", "bot", Xoscript_doc_sect_base.Pos__default);
tail_var.reg_marker("<!--XOWA.SCRIPT.TAIL.TOP-->", "top", Xoscript_doc_sect_base.Pos__default);
}
public Xoscript_page page() {return page_var;} private final Xoscript_page page_var;
public Xoscript_doc_head head() {return head_var;} private final Xoscript_doc_head head_var;
public Xoscript_doc_tail tail() {return tail_var;} private final Xoscript_doc_tail tail_var;
public String html() {
if (html_var == null) {
html_var = bfr.To_str();
}
return html_var;
} private String html_var;
public void html(String s) {
html_var = s;
html_dirty = true;
}
public void html_by_marker(byte[] marker, byte[] marker_html) {
byte[] html_bry = Bry_.new_u8(this.html());
// find marker, and splice it in
int marker_pos = Bry_find_.Find_fwd(html_bry, marker);
if (marker_pos != Bry_find_.Not_found) {
tmp_bfr.Add_mid(html_bry, 0, marker_pos);
tmp_bfr.Add(marker_html);
tmp_bfr.Add_mid(html_bry, marker_pos, html_bry.length);
html_bry = tmp_bfr.To_bry_and_clear();
}
this.html(String_.new_u8(html_bry));
}
public boolean dirty() {
return html_dirty;
} private boolean html_dirty;
}

View File

@@ -13,3 +13,7 @@ The terms of each license can be found in the source code repository:
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
*/
package gplx.xowa.addons.apps.scripts.apis; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.apps.*; import gplx.xowa.addons.apps.scripts.*;
public class Xoscript_doc_head extends Xoscript_doc_sect_base {
public Xoscript_doc_head(Xoscript_doc doc) {super(doc);}
}

View File

@@ -13,3 +13,60 @@ The terms of each license can be found in the source code repository:
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
*/
package gplx.xowa.addons.apps.scripts.apis; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.apps.*; import gplx.xowa.addons.apps.scripts.*;
import org.junit.*; import gplx.core.tests.*;
public class Xoscript_doc_head__tst {
private final Xoscript_doc_head__fxt fxt = new Xoscript_doc_head__fxt();
@Before public void init() {
fxt.Init__sect("head");
fxt.Exec__reg_marker("<!--top-->", "top", Xoscript_doc_head.Pos__default);
fxt.Exec__reg_marker("<!--bot-->", "bot");
fxt.Exec__doc__html("a<!--top-->b<!--bot-->c");
}
@Test public void Add_html() {
fxt.Exec__add_html("top", "<b>add_1</b>");
fxt.Exec__add_html("top", "<b>add_2</b>");
fxt.Test__html("a<b>add_1</b><b>add_2</b><!--top-->b<!--bot-->c");
}
@Test public void Add_html__default() {
fxt.Exec__add_html("<b>add_1</b>");
fxt.Test__html("a<b>add_1</b><!--top-->b<!--bot-->c");
}
@Test public void Add_tag() {
fxt.Exec__add_tag("top", "div", "div_body", "k0", "v0", "k1", "v1");
fxt.Test__html
( "a<div k0=\"v0\" k1=\"v1\">div_body</div>"
, "<!--top-->b<!--bot-->c");
}
@Test public void Add_js_file() {
fxt.Exec__add_js_file("top", "./a.js");
fxt.Test__html
( "a<script src=\"file:///mem/wiki/test_wiki/bin/script/a.js\" type=\"text/javascript\"></script>"
, "<!--top-->b<!--bot-->c");
}
}
class Xoscript_doc_head__fxt {
private final Xoscript_page spg;
private Xoscript_doc_sect_base sect;
public Xoscript_doc_head__fxt() {
Bry_bfr rv = Bry_bfr_.New();
Xoscript_env env = new Xoscript_env(new gplx.core.scripts.Gfo_script_engine__noop(), Io_url_.new_any_("mem/wiki/test_wiki/bin/script/"));
Xoscript_url url = new Xoscript_url("test_wiki", "test_page");
spg = new Xoscript_page(rv, env, url);
}
public void Init__sect(String sect_name) {
if (String_.Eq(sect_name, "head"))
sect = spg.doc().head();
else if (String_.Eq(sect_name, "tail"))
sect = spg.doc().tail();
}
public void Exec__doc__html(String html) {spg.doc().html(html);}
public void Exec__reg_marker(String marker, String... pos_ary) {sect.reg_marker(marker, pos_ary);}
public void Exec__add_js_file(String pos, String file) {sect.add_js_file(pos, file);}
public void Exec__add_html(String html) {sect.add_html(html);}
public void Exec__add_html(String pos, String html) {sect.add_html(pos, html);}
public void Exec__add_tag(String pos, String tag, String body, Object... head_atrs) {sect.add_tag(pos, tag, body, head_atrs);}
public void Test__html(String... expd) {
Gftest.Eq__ary__lines(String_.Concat_lines_nl_skip_last(expd), spg.doc().html(), "html");
}
}

View File

@@ -13,3 +13,68 @@ The terms of each license can be found in the source code repository:
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
*/
package gplx.xowa.addons.apps.scripts.apis; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.apps.*; import gplx.xowa.addons.apps.scripts.*;
public abstract class Xoscript_doc_sect_base {
protected final Xoscript_doc doc;
private final Hash_adp_bry marker_hash = Hash_adp_bry.cs();
private final Bry_bfr tmp_bfr = Bry_bfr_.New();
public Xoscript_doc_sect_base(Xoscript_doc doc) {this.doc = doc;}
private byte[] get_marker_by_pos(byte[] pos_bry) {
return (byte[])marker_hash.Get_by_or_fail(pos_bry);
}
public void reg_marker(String marker_str, String... pos_ary) {
int len = pos_ary.length;
byte[] marker_bry = Bry_.new_u8(marker_str);
for (int i = 0; i < len; ++i) {
marker_hash.Add_if_dupe_use_nth(Bry_.new_u8(pos_ary[i]), marker_bry);
}
}
public void add_html(String html) {add_html(Pos__default, html);}
public void add_html(String pos_str, String html) {add_html(Pos__default, Bry_.new_u8(html));}
public void add_html(String pos_str, byte[] html) {
doc.html_by_marker(get_marker_by_pos(Bry_.new_u8(pos_str)), html);
}
public void add_tag(String pos_str, String tag_str, String body, Object... head_atrs) {
// build tag.bgn; EX: '<tag k1="v1">'
tmp_bfr.Add_byte(Byte_ascii.Angle_bgn);
tmp_bfr.Add_str_u8(tag_str);
int head_atrs_len = head_atrs.length;
for (int i = 0; i < head_atrs_len; i += 2) {
tmp_bfr.Add_byte_space();
tmp_bfr.Add_obj_strict(head_atrs[i]);
tmp_bfr.Add_byte_eq();
tmp_bfr.Add_byte_quote();
tmp_bfr.Add_obj_strict(head_atrs[i + 1]);
tmp_bfr.Add_byte_quote();
}
tmp_bfr.Add_byte(Byte_ascii.Angle_end);
// build tag.body; EX: 'some body'
tmp_bfr.Add_str_u8(body);
// build tag.end; EX: '</tag>\n'
tmp_bfr.Add_byte(Byte_ascii.Angle_bgn).Add_byte(Byte_ascii.Slash);
tmp_bfr.Add_str_u8(tag_str);
tmp_bfr.Add_byte(Byte_ascii.Angle_end);
tmp_bfr.Add_byte_nl();
add_html(pos_str, tmp_bfr.To_bry_and_clear());
}
public void add_js_file(String file_str) {add_js_file(Pos__default, file_str);}
public void add_js_file(String pos_str, String file_str) {
add_tag(pos_str, "script", Body__empty, "src", Xoscript_env.Resolve_file(Bool_.Y, doc.page().env().Root_dir(), file_str), "type", "text/javascript");
}
public void add_js_code(String code_str) {add_js_file(Pos__default, code_str);}
public void add_js_code(String pos_str, String code_str) {
add_tag(pos_str, "script", code_str, "type", "text/javascript");
}
public void add_css_file(String file_str) {add_js_file(Pos__default, file_str);}
public void add_css_file(String pos_str, String file_str) {
add_tag(pos_str, "link", Body__empty, "rel", "stylesheet", "href", Xoscript_env.Resolve_file(Bool_.Y, doc.page().env().Root_dir(), file_str), "type", "text/css");
}
public void add_css_code(String code_str) {add_css_code(Pos__default, code_str);}
public void add_css_code(String pos_str, String code_str) {
add_tag(pos_str, "style", code_str, "type", "text/css");
}
public static final String Pos__default = "", Body__empty = "";
}

View File

@@ -13,3 +13,7 @@ The terms of each license can be found in the source code repository:
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
*/
package gplx.xowa.addons.apps.scripts.apis; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.apps.*; import gplx.xowa.addons.apps.scripts.*;
public class Xoscript_doc_tail extends Xoscript_doc_sect_base {
public Xoscript_doc_tail(Xoscript_doc doc) {super(doc);}
}

View File

@@ -13,3 +13,9 @@ The terms of each license can be found in the source code repository:
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
*/
package gplx.xowa.addons.apps.scripts.apis; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.apps.*; import gplx.xowa.addons.apps.scripts.*;
public class Xoscript_log {
public void log(String... v) {
Gfo_usr_dlg_.Instance.Log_many("", "", String_.Concat_with_str(" ", v));
}
}

View File

@@ -13,3 +13,14 @@ The terms of each license can be found in the source code repository:
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
*/
package gplx.xowa.addons.apps.scripts.apis; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.apps.*; import gplx.xowa.addons.apps.scripts.*;
public class Xoscript_page {
public Xoscript_page(Bry_bfr rv, Xoscript_env env_var, Xoscript_url url_var) {
this.env_var = env_var;
this.url_var = url_var;
this.doc_var = new Xoscript_doc(rv, this);
}
public Xoscript_env env() {return env_var;} private final Xoscript_env env_var;
public Xoscript_url url() {return url_var;} private final Xoscript_url url_var;
public Xoscript_doc doc() {return doc_var;} private final Xoscript_doc doc_var;
}

View File

@@ -13,3 +13,9 @@ The terms of each license can be found in the source code repository:
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
*/
package gplx.xowa.addons.apps.scripts.apis; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.apps.*; import gplx.xowa.addons.apps.scripts.*;
public class Xoscript_url {
public Xoscript_url(String wiki_name_var, String page_name_var) {this.wiki_name_var = wiki_name_var; this.page_name_var = page_name_var;}
public String wiki_name() {return wiki_name_var;} private final String wiki_name_var;
public String page_name() {return page_name_var;} private final String page_name_var;
}

View File

@@ -13,3 +13,15 @@ The terms of each license can be found in the source code repository:
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
*/
package gplx.xowa.addons.apps.scripts.xtns; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.apps.*; import gplx.xowa.addons.apps.scripts.*;
import gplx.core.scripts.*;
public class Xoscript_xtn_itm {
public Xoscript_xtn_itm(String key, Io_url url, Gfo_script_engine engine) {
this.key = key;
this.url = url;
this.engine = engine;
}
public String Key() {return key;} private final String key;
public Io_url Url() {return url;} private final Io_url url;
public Gfo_script_engine Engine() {return engine;} private final Gfo_script_engine engine;
}

View File

@@ -13,3 +13,55 @@ The terms of each license can be found in the source code repository:
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
*/
package gplx.xowa.addons.apps.scripts.xtns; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.apps.*; import gplx.xowa.addons.apps.scripts.*;
import gplx.core.scripts.*;
import gplx.xowa.addons.apps.scripts.apis.*;
public class Xoscript_xtn_mgr {
private Xoscript_xtn_itm root_itm;
private final Io_url root_dir;
private final Ordered_hash hash = Ordered_hash_.New();
public Xoscript_xtn_mgr(Io_url root_dir) {
this.root_dir = root_dir;
}
public void reg_xtn(String key, String file) {
Io_url url = Io_url_.new_fil_(Xoscript_env.Resolve_file(Bool_.N, root_dir, file));
Xoscript_xtn_itm itm = new Xoscript_xtn_itm(key, url, Gfo_script_engine_.New_by_ext(url.Ext()));
hash.Add(key, itm);
}
public void Load_root() {
Io_url[] root_urls = Io_mgr.Instance.QueryDir_args(root_dir).ExecAsUrlAry();
int root_urls_len = root_urls.length;
for (int i = 0; i < root_urls_len; ++i) {
Io_url root_url = root_urls[0];
String root_name_and_ext = root_url.NameAndExt();
if (String_.EqAny(root_name_and_ext, "xowa.script.main.js", "xowa.script.main.lua")) {
this.root_itm = new Xoscript_xtn_itm("xowa.root", root_url, Gfo_script_engine_.New_by_ext(root_url.Ext()));
break;
}
}
root_itm.Engine().Load_script(root_itm.Url());
root_itm.Engine().Invoke_function("xoscript__main", this);
}
public void Run(Bry_bfr rv, Xow_wiki wiki, Xoa_page page) {
int len = hash.Len();
Xoscript_log log = new Xoscript_log();
for (int i = 0; i < len; ++i) {
Xoscript_xtn_itm itm = (Xoscript_xtn_itm)hash.Get_at(i);
Gfo_script_engine engine = (Gfo_script_engine)itm.Engine();
Xoscript_env env = new Xoscript_env(engine, itm.Url().OwnerDir());
Xoscript_page spg = new Xoscript_page(rv, env, new Xoscript_url(page.Wiki().Domain_str(), String_.new_u8(page.Url().Page_bry())));
engine.Put_object("xolog", log);
engine.Load_script(itm.Url());
try {engine.Invoke_function("xoscript__init", env);}
catch (Exception e) {Gfo_usr_dlg_.Instance.Note_many("", "", "xoscript__init failed; url=~{0} err=~{1}", itm.Url(), Err_.Message_lang(e));}
try {engine.Invoke_function("xoscript__page_write_end", spg);}
catch (Exception e) {Gfo_usr_dlg_.Instance.Note_many("", "", "xoscript__page_write_end failed; url=~{0} err=~{1}", itm.Url(), Err_.Message_lang(e));}
// overwrite html
if (spg.doc().dirty()) {
rv.Clear();
rv.Add_str_u8(spg.doc().html());
}
}
}
}

View File

@@ -13,3 +13,19 @@ The terms of each license can be found in the source code repository:
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
*/
package gplx.xowa.addons.apps.updates; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.apps.*;
import gplx.xowa.specials.*; import gplx.xowa.htmls.bridges.*;
public class Xoa_update_addon implements Xoax_addon_itm, Xoax_addon_itm__special, Xoax_addon_itm__json {
public Xow_special_page[] Special_pages() {
return new Xow_special_page[]
{ gplx.xowa.addons.apps.updates.specials.Xoa_update_special.Prototype
};
}
public Bridge_cmd_itm[] Json_cmds() {
return new Bridge_cmd_itm[]
{ gplx.xowa.addons.apps.updates.specials.svcs.Xoa_update_bridge.Prototype
};
}
public String Addon__key() {return ADDON__KEY;} private static final String ADDON__KEY = "xowa.app.update";
}

View File

@@ -13,3 +13,35 @@ The terms of each license can be found in the source code repository:
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
*/
package gplx.xowa.addons.apps.updates; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.apps.*;
import gplx.xowa.addons.apps.cfgs.*;
import gplx.xowa.addons.apps.updates.dbs.*;
public class Xoa_update_startup {
public static boolean Show_at_startup(Xoa_app app) {
try {
// set default to this version
Xocfg_mgr cfg = app.Cfg();
cfg.Dflt_mgr().Add(Cfg__version_cutoff, Int_.To_str(Xoa_app_.Version_id));
// exit if disabled
if (!cfg.Get_bool_app_or(Cfg__enabled, true)) return false;
// check online for updates
Io_url db_url = Xoa_update_db_mgr_.Url(app);
Xoa_update_db_mgr_.Download_from_inet(app, Bool_.Y, db_url);
// check offline for updates
int version_cutoff = cfg.Get_int_app_or(Cfg__version_cutoff, Xoa_app_.Version_id);
return Xoa_update_db_mgr_.Select(db_url, version_cutoff).length > 0;
} catch (Exception exc) {
Gfo_usr_dlg_.Instance.Warn_many("", "", "starup:fatal error while looking up app-update-reminder; err=~{0}", Err_.Message_gplx_log(exc));
return false;
}
}
public static int Version_cutoff(Xoa_app app) {return app.Cfg().Get_int_app_or(Cfg__version_cutoff, Xoa_app_.Version_id);}
public static void Version_cutoff_(Xoa_app app, int id) {app.Cfg().Set_int_app(Cfg__version_cutoff, id);}
private static final String
Cfg__enabled = "xowa.app.update.startup.enabled"
, Cfg__version_cutoff = "xowa.app.update.startup.version_cutoff";
}

View File

@@ -13,3 +13,12 @@ The terms of each license can be found in the source code repository:
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
*/
package gplx.xowa.addons.apps.updates.apps; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.apps.*; import gplx.xowa.addons.apps.updates.*;
public class Xoa_manifest_item {
public Xoa_manifest_item(Io_url src, Io_url trg) {
this.src = src;
this.trg = trg;
}
public Io_url Src() {return src;} private final Io_url src;
public Io_url Trg() {return trg;} private final Io_url trg;
}

View File

@@ -13,3 +13,47 @@ The terms of each license can be found in the source code repository:
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
*/
package gplx.xowa.addons.apps.updates.apps; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.apps.*; import gplx.xowa.addons.apps.updates.*;
public class Xoa_manifest_list {
private final Ordered_hash hash = Ordered_hash_.New();
public int Len() {return hash.Len();}
public Xoa_manifest_item Get_at(int i) {return (Xoa_manifest_item)hash.Get_at(i);}
public void Del_at(int i) {
Xoa_manifest_item item = (Xoa_manifest_item)hash.Get_at(i);
hash.Del(item.Src().Raw());
}
public void Add(Io_url src, Io_url trg) {
Xoa_manifest_item item = new Xoa_manifest_item(src, trg);
hash.Add(src.Raw(), item);
}
public void Save(Bry_bfr bfr) {
// save as "src\ttrg\n"
int len = hash.Len();
for (int i = 0; i < len; i++) {
Xoa_manifest_item item = (Xoa_manifest_item)hash.Get_at(i);
bfr.Add_str_u8(item.Src().Raw());
bfr.Add_byte(Byte_ascii.Tab);
bfr.Add_str_u8(item.Trg().Raw());
bfr.Add_byte(Byte_ascii.Nl);
}
}
public void Load(byte[] src, int src_bgn, int src_end) {
int pos = src_bgn;
// load by "src\ttrg\n"
while (pos < src_end) {
// get pos
int tab_pos = Bry_find_.Find_fwd(src, Byte_ascii.Tab, pos, src_end);
if (tab_pos == Bry_find_.Not_found) throw Err_.new_wo_type("failed to find tab", "excerpt", Bry_.Mid(src, pos, src_end));
int nl_pos = Bry_find_.Find_fwd(src, Byte_ascii.Nl, tab_pos + 1, src_end);
if (nl_pos == Bry_find_.Not_found) throw Err_.new_wo_type("failed to find nl", "excerpt", Bry_.Mid(src, pos, src_end));
// create
Io_url src_url = Io_url_.new_fil_(String_.new_u8(src, pos, tab_pos));
Io_url trg_url = Io_url_.new_fil_(String_.new_u8(src, tab_pos + 1, nl_pos));
Xoa_manifest_item item = new Xoa_manifest_item(src_url, trg_url);
hash.Add(src_url.Raw(), item);
pos = nl_pos + 1;
}
}
}

View File

@@ -13,3 +13,100 @@ The terms of each license can be found in the source code repository:
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
*/
package gplx.xowa.addons.apps.updates.apps; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.apps.*; import gplx.xowa.addons.apps.updates.*;
import gplx.core.envs.*;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.IOException;
import java.net.*;
import javax.swing.*;
import javax.swing.border.Border;
public class Xoa_manifest_view extends JFrame implements Gfo_invk {
private final Xoa_manifest_wkr wkr;
private String run_xowa_cmd;
public Xoa_manifest_view(Io_url manifest_url) {
super("XOWA Application Update");
// init window
this.setTitle("XOWA Application Update");
try {
UIManager.setLookAndFeel(
UIManager.getSystemLookAndFeelClassName());
}
catch (Exception e) {System.out.println(e.getMessage());}
this.setSize(700, 580);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setLocationRelativeTo(null);
this.setBackground(Color.WHITE);
// init panel
JPanel main_panel = new JPanel();
main_panel.setSize(700, 580);
this.setContentPane(main_panel);
New_text_area(main_panel);
run_xowa_lbl = New_link_lbl(this, main_panel, Invk__run_xowa, "<html><a href=\"\" style='color:#b9b9b9;'>Run XOWA</a></html>");
this.setVisible(true);
this.wkr = new Xoa_manifest_wkr(this);
wkr.Init(manifest_url);
}
private JTextArea text_area;
private JLabel run_xowa_lbl;
private JScrollPane New_text_area(JPanel owner) {
// init textarea
text_area = new JTextArea();
text_area.setForeground(Color.BLACK);
text_area.setBackground(Color.WHITE);
text_area.setMargin(new Insets(0, 0, 0,0));
text_area.setLineWrap(true);
text_area.setWrapStyleWord(true); // else text will wrap in middle of words
text_area.setCaretColor(Color.BLACK);
text_area.getCaret().setBlinkRate(0);
// init scrollpane
JScrollPane text_scroll_pane = new JScrollPane(text_area);
text_scroll_pane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED);
owner.add(text_scroll_pane, BorderLayout.CENTER);
text_scroll_pane.setPreferredSize(new Dimension(675, 500));
return text_scroll_pane;
}
private static JLabel New_link_lbl(Gfo_invk invk, JPanel owner, String invk_cmd, String text) {
JLabel rv = new JLabel();
rv.setText(text);
rv.setPreferredSize(new Dimension(80, 20));
owner.add(rv, BorderLayout.PAGE_END);
return rv;
}
public void Append(String s) {
text_area.setText(text_area.getText() + "> " + s + "\n");
}
public void Mark_done(String s) {
this.run_xowa_cmd = s;
run_xowa_lbl.setText("<html><a href=\"\"'>Run XOWA</a></html>");
run_xowa_lbl.setCursor(new Cursor(Cursor.HAND_CURSOR));
run_xowa_lbl.addMouseListener(new Swing_mouse_adapter(Gfo_invk_cmd.New_by_key(this, Invk__run_xowa)));
}
public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) {
if (ctx.Match(k, Invk__run_xowa)) {
Runtime_.Exec(run_xowa_cmd);
System_.Exit();
}
else return Gfo_invk_.Rv_unhandled;
return this;
} private static final String Invk__run_xowa = "run_xowa";
public static void Run() {
Io_url manifest_url = Env_.AppUrl().GenNewExt(".txt");
if (!Op_sys.Cur().Tid_is_osx())
new Xoa_manifest_view(manifest_url);
}
}
class Swing_mouse_adapter extends MouseAdapter {
private final Gfo_invk_cmd cmd;
public Swing_mouse_adapter(Gfo_invk_cmd cmd) {this.cmd = cmd;}
@Override public void mouseClicked(MouseEvent ev) {
try {cmd.Exec();}
catch (Exception e) {
System.out.println(Err_.Message_gplx_full(e));
}
}
}

View File

@@ -13,3 +13,72 @@ The terms of each license can be found in the source code repository:
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
*/
package gplx.xowa.addons.apps.updates.apps; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.apps.*; import gplx.xowa.addons.apps.updates.*;
import gplx.core.envs.*;
class Xoa_manifest_wkr {
private final Xoa_manifest_view view;
private final Xoa_manifest_list list = new Xoa_manifest_list();
private Io_url manifest_url;
private String run_xowa_cmd;
public Xoa_manifest_wkr(Xoa_manifest_view view) {
this.view = view;
}
public void Init(Io_url manifest_url) {
// load manifest
this.manifest_url = manifest_url;
view.Append("loading manifest from: " + manifest_url.Raw());
byte[] src = Io_mgr.Instance.LoadFilBry(manifest_url);
// parse manifest
int nl_pos = Bry_find_.Find_fwd(src, Byte_ascii.Nl);
if (nl_pos == Bry_find_.Not_found) throw Err_.new_wo_type("could not find nl in manifest", "manifest_url", manifest_url.Raw());
this.run_xowa_cmd = String_.new_u8(src, 0, nl_pos);
list.Load(src, nl_pos + 1, src.length);
this.Wait();
}
private void Wait() {
int tries = 0;
while (tries++ < 100) {
gplx.core.threads.Thread_adp_.Sleep(1000);
if (Copy_files())
break;
else {
String topmost = "#error";
if (list.Len() > 0) {
Xoa_manifest_item item = (Xoa_manifest_item)list.Get_at(0);
topmost = item.Src().Raw();
}
view.Append("waiting for XOWA to release file: " + topmost);
}
}
this.On_exit();
}
public void On_exit() {
Io_mgr.Instance.DeleteFil(manifest_url);
view.Mark_done(run_xowa_cmd);
}
private boolean Copy_files() {
// loop list and copy items
int len = list.Len();
int idx = 0;
for (idx = 0; idx < len; idx++) {
Xoa_manifest_item item = (Xoa_manifest_item)list.Get_at(idx);
try {
Io_mgr.Instance.DeleteFil_args(item.Trg()).MissingFails_off().Exec();
Io_mgr.Instance.CopyFil(item.Src(), item.Trg(), true);
view.Append(String_.Format("copied file: src={0} trg={1}", item.Src().Raw(), item.Trg().Raw()));
}
catch (Exception exc) {
view.Append(String_.Format("failed to copy file: src={0} trg={1} err={2}", item.Src().Raw(), item.Trg().Raw(), Err_.Message_lang(exc)));
return false;
}
}
// remove completed items
for (int i = 0; i < idx; i++) {
list.Del_at(0);
}
return true;
}
}

View File

@@ -13,3 +13,38 @@ The terms of each license can be found in the source code repository:
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
*/
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(int id, String name, String date, int priority, String url, String summary, String details) {
this.id = id;
this.name = name;
this.date = date;
this.priority = priority;
this.url = url;
this.summary = summary;
this.details = details;
}
public int Id() {return id;} private final int id;
public String Name() {return name;} private final String name;
public String Date() {return date;} private final String date;
public int Priority() {return priority;} private final int priority;
public String Url() {return url;} private final String url;
public String Summary() {return summary;} private final String summary;
public String Details() {return details;} private final String details;
public String Package_url() {
String folder = url;
if (String_.Len_eq_0(folder))
folder = "https://github.com/gnosygnu/xowa/releases/releases/tag";
return String_.Format("{0}/v{1}/xowa_app_{2}_v{1}.zip", folder, name, Xoa_app_.Op_sys_str);
}
public static final int Priority__major = 7, Priority__minor = 5, Priority__trivial = 3;
public static String Priority__to_name(int v) {
switch (v) {
case Priority__trivial: return "trivial";
case Priority__minor: return "minor";
case Priority__major: return "major";
default: throw Err_.new_unhandled_default(v);
}
}
}

View File

@@ -13,3 +13,61 @@ The terms of each license can be found in the source code repository:
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
*/
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_name, fld__version_date, fld__version_priority, fld__version_url, 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_int_pkey("version_id");
this.fld__version_name = flds.Add_str("version_name", 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_url = flds.Add_str("version_url", 255);
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));
}
public Xoa_app_version_itm[] Select_by_id(int id) {
String sql = Db_sql_.Make_by_fmt(String_.Ary
( "SELECT *"
, "FROM app_version"
, "WHERE version_id > {0}"
, "ORDER BY version_id"
), id);
Db_rdr rdr = conn.Stmt_sql(sql).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();}
}
public Xoa_app_version_itm Select_by_name_or_null(String name) {
Db_rdr rdr = conn.Stmt_select(tbl_name, flds, fld__version_name).Crt_str(fld__version_name, name).Exec_select__rls_auto();
try {
return rdr.Move_next() ? Load(rdr) : null;
} finally {rdr.Rls();}
}
private Xoa_app_version_itm Load(Db_rdr rdr) {
return new Xoa_app_version_itm
( rdr.Read_int(fld__version_id)
, rdr.Read_str(fld__version_name)
, rdr.Read_str(fld__version_date)
, rdr.Read_int(fld__version_priority)
, rdr.Read_str(fld__version_url)
, rdr.Read_str(fld__version_summary)
, rdr.Read_str(fld__version_details)
);
}
public void Rls() {}
public static final String TBL_NAME = "app_version";
}

View File

@@ -13,3 +13,16 @@ The terms of each license can be found in the source code repository:
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
*/
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_autocreate(true, 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;
}

View File

@@ -13,3 +13,47 @@ The terms of each license can be found in the source code repository:
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
*/
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.langs.jsons.*;
import gplx.xowa.addons.apps.cfgs.*;
public class Xoa_update_db_mgr_ {
public static Io_url Url(Xoa_app app) {return app.Fsys_mgr().Root_dir().GenSubFil_nest("user", "install", "update", "xoa_update.sqlite3");}
public static Xoa_app_version_itm[] Select(Io_url db_url, int id) {
Xoa_update_db_mgr db_mgr = new Xoa_update_db_mgr(db_url);
return db_mgr.Tbl__app_version().Select_by_id(id);
}
public static boolean Download_from_inet(Xoa_app app, boolean exit_if_too_soon, Io_url db_url) {
try {
// exit if web_access disabled
if (!gplx.core.ios.IoEngine_system.Web_access_enabled) return false;
// exit if inet checked too soon
if (exit_if_too_soon) {
Xocfg_mgr cfg = app.Cfg();
int inet_interval = cfg.Get_int_app_or(Cfg__inet_interval, 7);
DateAdp inet_date = cfg.Get_date_app_or(Cfg__inet_date, DateAdp_.MinValue);
if (Datetime_now.Get().Diff_days(inet_date) < inet_interval) return false;
cfg.Set_date_app(Cfg__inet_date, Datetime_now.Get());
}
// get online version
String latest_version_url = app.Cfg().Get_str_app_or("xowa.app.update.inet.server_url", "http://xowa.org"); // CFG:Cfg__
byte[] latest_version_bry = Io_mgr.Instance.DownloadFil_args("", Io_url_.Empty).Exec_as_bry(latest_version_url + "/admin/app_update/xoa_update.json");
Json_doc jdoc = new Json_parser().Parse(latest_version_bry);
int latest_version_id = jdoc.Root_nde().Get_as_int_or("version_id", -1);
// compare and download if necessary
if (latest_version_id > Xoa_app_.Version_id) {
String update_db_url = latest_version_url + "/admin/app_update/xoa_update.sqlite3";
Io_mgr.Instance.DownloadFil(update_db_url, db_url);
}
return true;
} catch (Exception exc) {
Gfo_usr_dlg_.Instance.Warn_many("", "", "app_update:db download failed;err=~{0}", Err_.Message_gplx_log(exc));
return false;
}
}
private static final String
Cfg__inet_interval = "xowa.app.update.inet.check_interval"
, Cfg__inet_date = "xowa.app.update.inet.check_date";
}

View File

@@ -13,3 +13,86 @@ The terms of each license can be found in the source code repository:
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
*/
package gplx.xowa.addons.apps.updates.js; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.apps.*; import gplx.xowa.addons.apps.updates.*;
import gplx.core.gfobjs.*; import gplx.core.progs.*; import gplx.core.progs.rates.*;
import gplx.xowa.guis.cbks.*;
public class Xojs_wkr__base implements Gfo_prog_ui, Gfo_invk {
private final Gfo_invk_cmd done_cbk;
private final Gfo_invk_cmd fail_cbk;
private final Gfo_rate_list rate_list = new Gfo_rate_list(32);
private final long notify_delay = 1000;
private final double delta_threshold = .25d; // allow variance of up to 25% before updating rate
private final String js_cbk, task_type;
private long time_prv;
private double rate_cur;
public Xojs_wkr__base(Xog_cbk_mgr cbk_mgr, Xog_cbk_trg cbk_trg, String js_cbk, Gfo_invk_cmd done_cbk, Gfo_invk_cmd fail_cbk, String task_type) {
this.cbk_mgr = cbk_mgr;
this.cbk_trg = cbk_trg;
this.js_cbk = js_cbk;
this.done_cbk = done_cbk;
this.fail_cbk = fail_cbk;
this.task_type = task_type;
rate_list.Add(1024 * 1024, 1); // add default rate of 1 MB per second;
}
public void Exec() {
try {
this.time_prv = gplx.core.envs.System_.Ticks();
this.Exec_run();
done_cbk.Exec_by_ctx(GfsCtx.Instance, GfoMsg_.new_cast_("m").Add("v", this));
} catch (Exception e) {
Gfo_usr_dlg_.Instance.Warn_many("", "", "failed to run task; task=~{0} err=~{1}", task_type, Err_.Message_gplx_log(e));
cbk_mgr.Send_notify(cbk_trg, String_.Format("failed to run task: task={0} err={1}", task_type, Err_.Message_lang(e)));
if (fail_cbk != null)
fail_cbk.Exec();
}
}
@gplx.Virtual protected void Exec_run() {}
public void Exec_async(String thread_name) {
gplx.core.threads.Thread_adp_.Start_by_key(thread_name + ".download", this, Invk__exec);
}
public Xog_cbk_mgr Cbk_mgr() {return cbk_mgr;} private final Xog_cbk_mgr cbk_mgr;
public Xog_cbk_trg Cbk_trg() {return cbk_trg;} private final Xog_cbk_trg cbk_trg;
public boolean Canceled() {return canceled;} private boolean canceled;
public void Cancel() {this.canceled = true;}
public byte Prog_status() {return status;}
public void Prog_status_(byte v) {status = v;} private byte status;
public long Prog_data_cur() {return data_cur;} private long data_cur;
public long Prog_data_end() {return data_end;} private long data_end;
protected void Prog_data_end_(long v) {this.data_end = v;}
public void Prog_notify_by_msg(String msg) {}
public boolean Prog_notify_and_chk_if_suspended(long new_data_cur, long new_data_end) {
if (status == Gfo_prog_ui_.Status__suspended) return true; // task paused by ui; exit now;
long time_cur = gplx.core.envs.System_.Ticks();
if (time_cur < time_prv + notify_delay) return false; // message came too soon. ignore it
// update rate
double rate_now = (rate_list.Add(new_data_cur - data_cur, (time_cur - time_prv))) * 1000;
double delta = Math_.Abs_double((rate_now - rate_cur) / rate_cur);
if ( rate_cur == 0 // rate not set
|| delta > delta_threshold) { // rate_now is at least 25% different than rate_prv
if (delta > delta_threshold * 2) // rate_now is > 50% different
rate_cur = rate_now; // update it now
else {
double rate_new = ((rate_now - rate_cur) * .05) + rate_cur; // calc new rate as 5% of difference
// Tfds.Dbg(delta, rate_now, rate_cur, rate_new);
rate_cur = rate_new;
}
}
// update prog vals
this.time_prv = time_cur;
this.data_cur = new_data_cur;
this.data_end = new_data_end;
cbk_mgr.Send_json(cbk_trg, js_cbk
, Gfobj_nde.New().Add_str("task_type", task_type).Add_long("prog_data_cur", data_cur).Add_long("prog_data_end", data_end).Add_int("prog_rate", (int)rate_cur));
return false;
}
public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) {
if (ctx.Match(k, Invk__exec)) this.Exec();
else return Gfo_invk_.Rv_unhandled;
return this;
} private static final String Invk__exec = "exec";
}

View File

@@ -13,3 +13,22 @@ The terms of each license can be found in the source code repository:
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
*/
package gplx.xowa.addons.apps.updates.js; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.apps.*; import gplx.xowa.addons.apps.updates.*;
import gplx.xowa.guis.cbks.*;
import gplx.core.net.downloads.*;
public class Xojs_wkr__download extends Xojs_wkr__base {
public Xojs_wkr__download(Xog_cbk_mgr cbk_mgr, Xog_cbk_trg cbk_trg, String js_cbk, Gfo_invk_cmd done_cbk, Gfo_invk_cmd fail_cbk, String src, Io_url trg, long src_len) {super(cbk_mgr, cbk_trg, js_cbk, done_cbk, fail_cbk, "downloading");
this.src = src;
this.src_len = src_len;
this.trg = trg;
this.Prog_data_end_(src_len);
}
public String Src() {return src;} private final String src;
public Io_url Trg() {return trg;} private final Io_url trg;
public long Src_len() {return src_len;} private final long src_len;
@Override protected void Exec_run() {
Http_download_wkr wkr = Http_download_wkr_.Proto.Make_new();
if (wkr.Exec(this, src, trg, src_len) != gplx.core.progs.Gfo_prog_ui_.Status__done)
this.Cbk_mgr().Send_json(this.Cbk_trg(), "xo.app_updater.write_status", gplx.core.gfobjs.Gfobj_nde.New().Add_str("msg", "failed to download update: " + wkr.Fail_msg()));
}
}

View File

@@ -13,3 +13,39 @@ The terms of each license can be found in the source code repository:
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
*/
package gplx.xowa.addons.apps.updates.js; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.apps.*; import gplx.xowa.addons.apps.updates.*;
import gplx.xowa.guis.cbks.*;
public class Xojs_wkr__replace extends Xojs_wkr__base {
private final Io_url src_dir, trg_dir;
private final Io_url[] src_fils;
public Xojs_wkr__replace(Xog_cbk_mgr cbk_mgr, Xog_cbk_trg cbk_trg, String js_cbk, Gfo_invk_cmd done_cbk, Io_url src_dir, Io_url trg_dir) {super(cbk_mgr, cbk_trg, js_cbk, done_cbk, null, "replacing");
this.src_dir = src_dir;
this.trg_dir = trg_dir;
this.src_fils = Io_mgr.Instance.QueryDir_args(src_dir).Recur_().ExecAsUrlAry();
this.Prog_data_end_(src_fils.length);
}
public Keyval[] Failed() {return failed;} private Keyval[] failed = Keyval_.Ary_empty;
@Override protected void Exec_run() {
List_adp failed_list = List_adp_.New();
int len = src_fils.length;
for (int i = 0; i < len; i++) {
if (this.Prog_notify_and_chk_if_suspended(i, len)) return; // stop if canceled
Io_url src_fil = src_fils[i];
Io_url trg_fil = trg_dir.GenSubFil(src_fil.GenRelUrl_orEmpty(src_dir));
try {
Io_mgr.Instance.DeleteFil(trg_fil); // delete first; will fail if file is in use
Io_mgr.Instance.MoveFil_args(src_fil, trg_fil, true).Exec(); // replace with src file
} catch (Exception exc) {
Gfo_usr_dlg_.Instance.Log_many("failed to delete and move file; file=~{0} msg=~{1}", trg_fil.Raw(), Err_.Message_gplx_log(exc));
failed_list.Add(Keyval_.new_(src_fil.Raw(), trg_fil.Raw()));
// try {Io_mgr.Instance.CopyFil(src_fil, trg_fil, true);} // try to copy file anyway
// catch (Exception exc2) {Gfo_usr_dlg_.Instance.Log_many("failed to fopy file; file=~{0} msg=~{1}", trg_fil.Raw(), Err_.Message_gplx_log(exc2));}
}
}
this.failed = (Keyval[])failed_list.To_ary_and_clear(Keyval.class);
}
}

View File

@@ -13,3 +13,19 @@ The terms of each license can be found in the source code repository:
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
*/
package gplx.xowa.addons.apps.updates.js; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.apps.*; import gplx.xowa.addons.apps.updates.*;
import gplx.xowa.guis.cbks.*;
import gplx.core.ios.zips.*;
public class Xojs_wkr__unzip extends Xojs_wkr__base {
public Xojs_wkr__unzip(Xog_cbk_mgr cbk_mgr, Xog_cbk_trg cbk_trg, String js_cbk, Gfo_invk_cmd done_cbk, Io_url src, Io_url trg, long prog_data_end) {super(cbk_mgr, cbk_trg, js_cbk, done_cbk, null, "unzipping");
this.src = src; this.trg = trg;
this.Prog_data_end_(prog_data_end);
}
public Io_url Src() {return src;} private final Io_url src;
public Io_url Trg() {return trg;} private final Io_url trg;
@Override protected void Exec_run() {
Io_zip_decompress_cmd decompress = Io_zip_decompress_cmd_.Proto.Make_new();
List_adp unzip_urls = List_adp_.New();
decompress.Exec(this, src, trg, unzip_urls);
}
}

View File

@@ -13,3 +13,62 @@ The terms of each license can be found in the source code repository:
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
*/
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.*;
public 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 Load(app);
}
private static Mustache_doc_itm Load(Xoa_app app) {
Io_url db_url = Xoa_update_db_mgr_.Url(app);
// get from internet
boolean web_access_enabled = gplx.core.ios.IoEngine_system.Web_access_enabled;
Xoa_update_db_mgr_.Download_from_inet(app, Bool_.N, db_url);
// load from db
Xoa_app_version_itm[] db_itms = Xoa_update_db_mgr_.Select(db_url, Xoa_update_startup.Version_cutoff(app));
// build root
String check_date = app.Cfg().Get_str_app_or("xowa.app.update.startup.inet_date", null); // CFG:Cfg__
if (check_date == null) check_date = Datetime_now.Get().XtoStr_fmt_yyyy_MM_dd_HH_mm_ss();
String build_date = String_.Mid(Xoa_app_.Build_date, 0, String_.FindFwd(Xoa_app_.Build_date, " ")); // remove time to show date only
if (db_itms.length == 0) return new Xoa_update_itm__root(Xoa_app_.Version, build_date, check_date, web_access_enabled, "", "", Xoa_app_version_itm.Priority__trivial, "", "", "");
// convert to gui itm
Xoa_app_version_itm db_itm = db_itms[0];
Xoa_update_itm__root root = new Xoa_update_itm__root(Xoa_app_.Version, build_date, check_date, web_access_enabled, db_itm.Name(), db_itm.Date(), db_itm.Priority(), db_itm.Summary(), db_itm.Details(), db_itm.Package_url());
root.Itms_(To_gui_itm(db_itms));
return root;
}
private static Xoa_update_itm__leaf[] To_gui_itm(Xoa_app_version_itm[] db_itms) {
int len = db_itms.length;
Xoa_update_itm__leaf[] rv = new Xoa_update_itm__leaf[len];
for (int i = 0; i < len; i++) {
rv[i] = To_gui_itm(db_itms[i]);
}
return rv;
}
private static Xoa_update_itm__leaf To_gui_itm(Xoa_app_version_itm db_itm) {
return new Xoa_update_itm__leaf(db_itm.Name(), db_itm.Date(), db_itm.Priority(), db_itm.Summary(), db_itm.Details(), db_itm.Package_url());
}
@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__baselib (head_tags, app.Fsys_mgr().Http_root());
Xopg_tag_wtr_.Add__xocss (head_tags, app.Fsys_mgr().Http_root());
Xopg_tag_wtr_.Add__xohelp (head_tags, app.Fsys_mgr().Http_root());
Xopg_tag_wtr_.Add__xolog (head_tags, app.Fsys_mgr().Http_root());
Xopg_tag_wtr_.Add__gui__progbars (head_tags, app.Fsys_mgr().Http_root());
Xopg_tag_wtr_.Add__xoajax (head_tags, app.Fsys_mgr().Http_root(), app);
Xopg_tag_wtr_.Add__jquery (head_tags, app.Fsys_mgr().Http_root());
Xopg_tag_wtr_.Add__xonotify (head_tags, app.Fsys_mgr().Http_root());
Xopg_alertify_.Add_tags (head_tags, app.Fsys_mgr().Http_root());
head_tags.Add(Xopg_tag_itm.New_css_file(addon_dir.GenSubFil_nest("bin", "xoa_update.css")));
head_tags.Add(Xopg_tag_itm.New_js_file(addon_dir.GenSubFil_nest("bin", "xoa_update.js")));
head_tags.Add(Xopg_tag_itm.New_js_file(addon_dir.GenSubFil_nest("bin", "xobc.util.js")));
}
}

View File

@@ -13,3 +13,33 @@ The terms of each license can be found in the source code repository:
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
*/
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__leaf implements Mustache_doc_itm {
private final String version, date, summary, details, package_url;
private final int priority;
public Xoa_update_itm__leaf(String version, String date, int priority, String summary, String details, String package_url) {
this.version = version;
this.date = date;
this.priority = priority;
this.summary = summary;
this.details = details;
this.package_url = package_url;
}
@gplx.Virtual public boolean Mustache__write(String k, Mustache_bfr bfr) {
if (String_.Eq(k, "version")) bfr.Add_str_u8(version);
else if (String_.Eq(k, "date")) bfr.Add_str_u8(date);
else if (String_.Eq(k, "priority")) bfr.Add_str_u8(Xoa_app_version_itm.Priority__to_name(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, "package_url")) bfr.Add_str_u8(package_url);
return true;
}
@gplx.Virtual public Mustache_doc_itm[] Mustache__subs(String key) {
if (String_.Eq(key, "priority_is_major")) return Mustache_doc_itm_.Ary__bool(priority >= Xoa_app_version_itm.Priority__major);
return Mustache_doc_itm_.Ary__empty;
}
protected static final Xoa_update_itm__leaf[] Ary__empty = new Xoa_update_itm__leaf[0];
}

View File

@@ -13,3 +13,33 @@ The terms of each license can be found in the source code repository:
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
*/
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.*;
class Xoa_update_itm__root extends Xoa_update_itm__leaf { private final String current_version, current_date, check_date;
private final boolean web_access_enabled;
private Xoa_update_itm__leaf[] itms = Xoa_update_itm__leaf.Ary__empty;
public Xoa_update_itm__root
( String current_version, String current_date, String check_date, boolean web_access_enabled
, String version, String date, int priority, String summary, String details, String package_url
) {super(version, date, priority, summary, details, package_url);
this.current_version = current_version;
this.current_date = current_date;
this.check_date = check_date;
this.web_access_enabled = web_access_enabled;
}
public void Itms_(Xoa_update_itm__leaf[] v) {
this.itms = v;
}
@Override public boolean Mustache__write(String k, Mustache_bfr bfr) {
if (String_.Eq(k, "current_version")) bfr.Add_str_u8(current_version);
else if (String_.Eq(k, "current_date")) bfr.Add_str_u8(current_date);
else if (String_.Eq(k, "check_date")) bfr.Add_str_u8(check_date);
return super.Mustache__write (k, bfr);
}
@Override public Mustache_doc_itm[] Mustache__subs(String k) {
if (String_.Eq(k, "itms")) return itms;
else if (String_.Eq(k, "itms_exist")) return Mustache_doc_itm_.Ary__bool(itms.length > 0);
else if (String_.Eq(k, "web_access_enabled")) return Mustache_doc_itm_.Ary__bool(web_access_enabled);
return super.Mustache__subs(k);
}
}

View File

@@ -13,3 +13,14 @@ The terms of each license can be found in the source code repository:
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
*/
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.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;
public Xow_special_page Special__clone() {return this;}
public static final Xow_special_page Prototype = new Xoa_update_special(Xow_special_meta.New_xo("XowaAppUpdate", "App Update"));
}

View File

@@ -13,3 +13,32 @@ The terms of each license can be found in the source code repository:
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
*/
package gplx.xowa.addons.apps.updates.specials.svcs; 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.specials.*;
import gplx.langs.jsons.*; import gplx.xowa.htmls.bridges.*;
public class Xoa_update_bridge implements Bridge_cmd_itm {
private Xoa_app app;
public void Init_by_app(Xoa_app app) {
this.app = app;
}
public String Exec(Json_nde data) {
byte proc_id = proc_hash.Get_as_byte_or(data.Get_as_bry_or(Bridge_cmd_mgr.Msg__proc, null), Byte_ascii.Max_7_bit);
Json_nde args = data.Get_kv(Bridge_cmd_mgr.Msg__args).Val_as_nde();
Xoa_update_svc svc = new Xoa_update_svc(app);
switch (proc_id) {
case Proc__install: svc.Install(args.Get_as_str("version"));break;
case Proc__skip: svc.Skip(args.Get_as_str("version")); break;
default: throw Err_.new_unhandled_default(proc_id);
}
return "";
}
private static final byte Proc__install = 0, Proc__skip = 1;
private static final Hash_adp_bry proc_hash = Hash_adp_bry.cs()
.Add_str_byte("install" , Proc__install)
.Add_str_byte("skip" , Proc__skip)
;
public byte[] Key() {return BRIDGE_KEY;} public static final byte[] BRIDGE_KEY = Bry_.new_a7("app.updater");
public static final Xoa_update_bridge Prototype = new Xoa_update_bridge(); Xoa_update_bridge() {}
}

View File

@@ -13,3 +13,134 @@ The terms of each license can be found in the source code repository:
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
*/
package gplx.xowa.addons.apps.updates.specials.svcs; 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.specials.*;
import gplx.xowa.guis.cbks.*;
import gplx.core.gfobjs.*;
import gplx.xowa.addons.apps.updates.dbs.*; import gplx.xowa.addons.apps.updates.js.*;
import gplx.xowa.addons.apps.updates.apps.*;
import gplx.core.envs.*;
class Xoa_update_svc implements Gfo_invk {
private Xoa_app app;
private Io_url app_root_dir, update_dir, update_jar_fil, version_root;
private Xoa_app_version_itm version_itm;
private Xoa_update_db_mgr db_mgr;
public Xoa_update_svc(Xoa_app app) {this.app = app;}
private Xoa_update_db_mgr Init_db() {
this.app_root_dir = app.Fsys_mgr().Root_dir();
this.update_dir = app_root_dir.GenSubDir_nest("user", "install", "update");
Io_url update_db_fil = update_dir.GenSubFil_nest("xoa_update.sqlite3");
return new Xoa_update_db_mgr(update_db_fil);
}
public void Install(String version_name) {
// get app_version from db
this.db_mgr = Init_db();
this.version_itm = db_mgr.Tbl__app_version().Select_by_name_or_null(version_name);
// get src, trg, etc..
String src = version_itm.Package_url();
Io_url trg = update_dir.GenSubFil_nest("temp", version_itm.Name(), version_itm.Name() + ".zip"); // EX: "/xowa/user/app/install/update/temp/4.1.0/4.1.0.zip"
this.version_root = trg.OwnerDir();
Io_mgr.Instance.DeleteDirDeep(version_root);
long src_len = -1;
// start download
Xojs_wkr__download download_wkr = new Xojs_wkr__download
( app.Gui__cbk_mgr(), Xog_cbk_trg.New(Xoa_update_special.Prototype.Special__meta().Ttl_bry())
, "xo.app_updater.download__prog", Gfo_invk_cmd.New_by_key(this, Invk__download_done), Gfo_invk_cmd.New_by_key(this, Invk__download_fail), src, trg, src_len);
download_wkr.Exec_async("app_updater");
}
public void Skip(String version_name) {
Xoa_update_db_mgr db_mgr = Init_db();
Xoa_update_startup.Version_cutoff_(app, db_mgr.Tbl__app_version().Select_by_name_or_null(version_name).Id());
}
private void On_download_done(GfoMsg m) {
Xojs_wkr__download download_wkr = (Xojs_wkr__download)m.ReadObj("v");
Io_url src = download_wkr.Trg();
Io_url trg = src.OwnerDir().GenSubDir(src.NameOnly() + "_unzip");
Xojs_wkr__unzip unzip_wkr = new Xojs_wkr__unzip(download_wkr.Cbk_mgr(), download_wkr.Cbk_trg(), "xo.app_updater.download__prog", Gfo_invk_cmd.New_by_key(this, Invk__unzip_done), src, trg, -1);
unzip_wkr.Exec_async("app_updater");
}
private void On_download_fail(GfoMsg m) {
// in case of bad urls or withdrawn patches, delete update_db and force redownload
db_mgr.Conn().Rls_conn();
Io_mgr.Instance.DeleteFil(db_mgr.Url());
Xoa_update_db_mgr_.Download_from_inet(app, Bool_.N, db_mgr.Url());
}
private void On_unzip_done(GfoMsg m) {
Xojs_wkr__unzip unzip_wkr = (Xojs_wkr__unzip)m.ReadObj("v");
Io_url src = unzip_wkr.Trg();
Io_url trg = app_root_dir;
// delete zip
Io_mgr.Instance.DeleteFil(unzip_wkr.Src());
// copy update_jar
Io_url src_jar_fil = src.GenSubFil_nest("bin", "any", "xowa", "addon", "app", "update", "xoa_update.jar");
this.update_jar_fil = app_root_dir.GenSubFil_nest("user", "install", "update", "xoa_update.jar");
Io_mgr.Instance.MoveFil_args(src_jar_fil, update_jar_fil, true).Exec();
// run replace_wkr
Xojs_wkr__replace replace_wkr = new Xojs_wkr__replace(unzip_wkr.Cbk_mgr(), unzip_wkr.Cbk_trg(), "xo.app_updater.download__prog", Gfo_invk_cmd.New_by_key(this, Invk__replace_done), src, trg);
replace_wkr.Exec_async("app_updater");
}
private void On_replace_done(GfoMsg m) {
Xojs_wkr__replace replace_wkr = (Xojs_wkr__replace)m.ReadObj("v");
// get failed
Xoa_manifest_list list = new Xoa_manifest_list();
Keyval[] failed_ary = replace_wkr.Failed();
int len = failed_ary.length;
for (int i = 0; i < len; i++) {
Keyval failed = failed_ary[i];
list.Add(Io_url_.new_fil_(failed.Key()), Io_url_.new_fil_(failed.Val_to_str_or_empty()));
}
// write failed
Bry_bfr bfr = Bry_bfr_.New();
String app_update_cfg = app.Cfg().Get_str_app_or("xowa.app.update.restart_cmd", ""); // CFG:Cfg__
bfr.Add_str_u8(App__update__restart_cmd(app_update_cfg, Env_.AppUrl(), Op_sys.Cur().Tid(), Op_sys.Cur().Bitness()) + "\n");
list.Save(bfr);
Io_url manifest_url = update_dir.GenSubFil("xoa_update_manifest.txt");
Io_mgr.Instance.SaveFilBfr(manifest_url, bfr);
// update prog as finished
replace_wkr.Cbk_mgr().Send_json(replace_wkr.Cbk_trg(), "xo.app_updater.download__prog", Gfobj_nde.New().Add_bool("done", true));
Xoa_update_startup.Version_cutoff_(app, version_itm.Id());
// run standalone app
Runtime_.Exec("java -jar " + update_jar_fil.Raw()+ " " + manifest_url.Raw() + " " + version_root.Raw());
System_.Exit();
}
public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) {
if (ctx.Match(k, Invk__download_done)) On_download_done(m);
else if (ctx.Match(k, Invk__download_fail)) On_download_fail(m);
else if (ctx.Match(k, Invk__unzip_done)) On_unzip_done(m);
else if (ctx.Match(k, Invk__replace_done)) On_replace_done(m);
else return Gfo_invk_.Rv_unhandled;
return this;
}
private static final String Invk__download_done = "download_done", Invk__download_fail = "download_fail", Invk__unzip_done = "unzip_done", Invk__replace_done = "replace_done";
public static String App__update__restart_cmd(String current, Io_url app_url, byte op_sys_tid, byte bitness) {
String rv = current;
if (!String_.Eq(rv, String_.Empty)) return rv; // something specified; return it
String bitness_str = bitness == Op_sys.Bitness_32 ? "" : "_64";
Io_url root_dir = app_url.OwnerDir();
String prepend_sh = op_sys_tid == Op_sys.Tid_wnt ? "" : "sh ";
String file_fmt = "";
switch (op_sys_tid) {
case Op_sys.Tid_lnx:
file_fmt = "xowa_linux{0}.sh";
break;
case Op_sys.Tid_osx:
file_fmt = "xowa_macosx{0}";
break;
case Op_sys.Tid_wnt:
file_fmt = "xowa{0}.exe";
break;
default:
throw Err_.new_unhandled_default(op_sys_tid);
}
return prepend_sh + root_dir.GenSubFil(String_.Format(file_fmt, bitness_str)).Raw();
}
}

View File

@@ -13,3 +13,23 @@ The terms of each license can be found in the source code repository:
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
*/
package gplx.xowa.addons.apps.updates.specials.svcs; 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.specials.*;
import org.junit.*; import gplx.core.tests.*; import gplx.core.envs.*;
public class Xoa_update_svc__tst {
private final Xoa_update_svc__fxt fxt = new Xoa_update_svc__fxt();
@Test public void Restart_cmd() {
Io_url jar_fil = Io_url_.new_dir_("/home/gnosygnu/xowa/xowa.jar");
fxt.Test__restart_cmd("manual" , jar_fil, Op_sys.Tid_lnx, Op_sys.Bitness_64, "manual");
fxt.Test__restart_cmd("" , jar_fil, Op_sys.Tid_lnx, Op_sys.Bitness_64, "sh /home/gnosygnu/xowa/xowa_linux_64.sh");
fxt.Test__restart_cmd("" , jar_fil, Op_sys.Tid_lnx, Op_sys.Bitness_32, "sh /home/gnosygnu/xowa/xowa_linux.sh");
fxt.Test__restart_cmd("" , jar_fil, Op_sys.Tid_osx, Op_sys.Bitness_64, "sh /home/gnosygnu/xowa/xowa_macosx_64");
fxt.Test__restart_cmd("" , jar_fil, Op_sys.Tid_osx, Op_sys.Bitness_32, "sh /home/gnosygnu/xowa/xowa_macosx");
fxt.Test__restart_cmd("" , jar_fil, Op_sys.Tid_wnt, Op_sys.Bitness_64, "/home/gnosygnu/xowa/xowa_64.exe");
fxt.Test__restart_cmd("" , jar_fil, Op_sys.Tid_wnt, Op_sys.Bitness_32, "/home/gnosygnu/xowa/xowa.exe");
}
}
class Xoa_update_svc__fxt {
public void Test__restart_cmd(String current, Io_url app_url, byte op_sys_tid, byte bitness, String expd) {
Gftest.Eq__str(expd, Xoa_update_svc.App__update__restart_cmd(current, app_url, op_sys_tid, bitness), "restart_cmd");
}
}