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:
@@ -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";
|
||||
}
|
||||
|
||||
@@ -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";
|
||||
}
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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";
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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() {}
|
||||
}
|
||||
|
||||
@@ -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() {}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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() {}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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() {}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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";
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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";
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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: "<'" 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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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.\");'> </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}\");'> </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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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")));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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";
|
||||
}
|
||||
|
||||
@@ -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() {}
|
||||
}
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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")));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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"));
|
||||
}
|
||||
|
||||
@@ -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() {}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
}
|
||||
@@ -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";}
|
||||
}
|
||||
|
||||
@@ -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;}
|
||||
}
|
||||
|
||||
@@ -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")));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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";
|
||||
}
|
||||
|
||||
@@ -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() {}
|
||||
}
|
||||
|
||||
@@ -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", " "); // 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: "<" -> "<"
|
||||
}
|
||||
private static final String
|
||||
DOMAIN__APP = "[xowa.app]"
|
||||
, DOMAIN__HOME = "[xowa.home]"
|
||||
, DOMAIN__FILE = "[file]"
|
||||
, DB__CORE = "core"
|
||||
, DB__USER = "user"
|
||||
;
|
||||
}
|
||||
|
||||
@@ -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];
|
||||
}
|
||||
|
||||
@@ -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");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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"));
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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);}
|
||||
}
|
||||
|
||||
@@ -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");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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 = "";
|
||||
}
|
||||
|
||||
@@ -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);}
|
||||
}
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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";
|
||||
}
|
||||
|
||||
@@ -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";
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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";
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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";
|
||||
}
|
||||
|
||||
@@ -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";
|
||||
}
|
||||
|
||||
@@ -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()));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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")));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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];
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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"));
|
||||
}
|
||||
|
||||
@@ -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() {}
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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");
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user