Cfg: Split db into app and usr and overhaul db objects

v3.3.4
gnosygnu 8 years ago
parent 9dfbd472ac
commit fd79415b53

@ -116,7 +116,9 @@ public abstract class Db_engine_sql_base implements Db_engine {
@Override public Object Stmt_by_sql(String sql) {
if (connection == null) Conn_assert();
try {return connection.prepareStatement(sql);}
catch (Exception e) {throw Err_.new_exc(e, "db", "New_stmt_prep failed", "sql", sql);}
catch (Exception e) {
throw Err_.new_exc(e, "db", "New_stmt_prep failed", "sql", sql);
}
}
private Statement New_stmt_exec(String sql) {
if (connection == null) Conn_assert();

@ -80,6 +80,6 @@ public class Gfs_nde {
rv[i] = args[i];
return rv;
}
public static final Gfs_nde[] Ary_empty = new Gfs_nde[0];
public static final Gfs_nde[] Ary_empty = new Gfs_nde[0];
public static final byte Op_tid_null = 0, Op_tid_assign = 1;
}

@ -262,8 +262,13 @@ public class Json_wtr {
switch (b) {
case Byte_ascii.Backslash: bfr.Add_byte_repeat(Byte_ascii.Backslash, backslash_count).Add_byte(b); break; // "\" -> "\\"; needed else js will usurp \ as escape; EX: "\&" -> "&"; DATE:2014-06-24
case Byte_ascii.Quote: bfr.Add_byte_repeat(Byte_ascii.Backslash, backslash_count).Add_byte(b); break;
case Byte_ascii.Apos: // // "'" -> "'''"; needed else xocfg fails; DATE:2016-12-07
if (opt_backslash_2x)
bfr.Add_byte_repeat(Byte_ascii.Backslash, 1).Add_byte(b);
else
bfr.Add_byte(b);
break;
case Byte_ascii.Nl: bfr.Add_byte_repeat(Byte_ascii.Backslash, 2).Add_byte(Byte_ascii.Ltr_n); break; // "\n" -> "\\n"
case Byte_ascii.Apos: bfr.Add_byte(b); break;
case Byte_ascii.Cr: break;// skip
default: bfr.Add_byte(b); break;
}

@ -147,7 +147,7 @@ public class Xoae_app implements Xoa_app, Gfo_invk {
public void Init_by_app() {
stage = Xoa_stage_.Tid_init;
user.Init_by_app(this);
cfg.Init_by_app(user.User_db_mgr().Conn());
cfg.Init_by_app(this);
prog_mgr.Init_by_app(url_cmd_eval);
xtn_mgr.Init_by_app(this);
gui_mgr.Init_by_app();

@ -19,8 +19,10 @@ package gplx.xowa.addons.apps.cfgs; import gplx.*; import gplx.xowa.*; import gp
import gplx.dbs.*; import gplx.xowa.addons.apps.cfgs.mgrs.*;
public class Xocfg_mgr {
private final Xocfg_cache_mgr cache_mgr = new Xocfg_cache_mgr();
public void Init_by_app(Db_conn conn) {
cache_mgr.Init_by_app(conn); // SECTION_EDIT
public void Init_by_app(Xoa_app app) {
cache_mgr.Init_by_app // SECTION_EDIT
( gplx.xowa.addons.apps.cfgs.dbs.Xocfg_db_app.New_conn(app)
, app.User().User_db_mgr().Conn());
}
public void Clear() {
cache_mgr.Clear();

@ -0,0 +1,42 @@
/*
XOWA: the XOWA Offline Wiki Application
Copyright (C) 2012 gnosygnu@gmail.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
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));
}
}

@ -1,53 +0,0 @@
/*
XOWA: the XOWA Offline Wiki Application
Copyright (C) 2012 gnosygnu@gmail.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
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.dbs.utls.*;
public class Xocfg_db_mgr {
public Xocfg_db_mgr(Db_conn conn) {
this.conn = conn;
this.tbl__grp_meta = new Xogrp_meta_tbl(conn);
this.tbl__grp_map = new Xogrp_map_tbl(conn);
this.tbl__itm_meta = new Xoitm_meta_tbl(conn);
this.tbl__itm_data = new Xoitm_data_tbl(conn);
this.tbl__nde_i18n = new Xonde_i18n_tbl(conn);
conn.Meta_tbl_assert(tbl__grp_meta, tbl__grp_map, tbl__itm_meta, tbl__itm_data, tbl__nde_i18n);
}
public Db_conn Conn() {return conn;} private final Db_conn conn;
public Xogrp_meta_tbl Tbl__grp_meta() {return tbl__grp_meta;} private final Xogrp_meta_tbl tbl__grp_meta;
public Xogrp_map_tbl Tbl__grp_map() {return tbl__grp_map ;} private final Xogrp_map_tbl tbl__grp_map;
public Xoitm_meta_tbl Tbl__itm_meta() {return tbl__itm_meta;} private final Xoitm_meta_tbl tbl__itm_meta;
public Xoitm_data_tbl Tbl__itm_data() {return tbl__itm_data;} private final Xoitm_data_tbl tbl__itm_data;
public Xonde_i18n_tbl Tbl__nde_i18n() {return tbl__nde_i18n;} private final Xonde_i18n_tbl tbl__nde_i18n;
public String Get_str(String ctx, String key) {
Xoitm_meta_itm meta_itm = tbl__itm_meta.Select_by_key_or_null(key);
if (meta_itm == null) throw Err_.new_wo_type("cfg not defined", "ctx", ctx, "key", key);
Xoitm_data_itm data_itm = tbl__itm_data.Select_one_by_id_or_null(meta_itm.Id(), ctx);
return data_itm == null ? meta_itm.Dflt() : data_itm.Val();
}
public void Set_str(String ctx, String key, String val) {
Xoitm_meta_itm meta_itm = tbl__itm_meta.Select_by_key_or_null(key);
if (meta_itm == null) throw Err_.new_wo_type("cfg not defined", "ctx", ctx, "key", key);
tbl__itm_data.Upsert(meta_itm.Id(), ctx, val, Datetime_now.Get().XtoUtc().XtoStr_fmt_iso_8561());
}
public void Del(String ctx, String key) {
Xoitm_meta_itm meta_itm = tbl__itm_meta.Select_by_key_or_null(key);
if (meta_itm == null) throw Err_.new_wo_type("cfg not defined", "ctx", ctx, "key", key);
tbl__itm_data.Delete(meta_itm.Id(), ctx);
}
}

@ -0,0 +1,43 @@
/*
XOWA: the XOWA Offline Wiki Application
Copyright (C) 2012 gnosygnu@gmail.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
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);
}
}

@ -1,53 +0,0 @@
/*
XOWA: the XOWA Offline Wiki Application
Copyright (C) 2012 gnosygnu@gmail.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
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.*;
public class Xocfg_itm_bldr {
private final Xocfg_db_mgr db_mgr;
private final String Lang__dflt = "en";
public Xocfg_itm_bldr(Xocfg_db_mgr db_mgr) {
this.db_mgr = db_mgr;
}
public void Create_grp(String owner_key, String grp_key, String grp_name, String grp_help) {
// insert grp_meta
int grp_id = db_mgr.Conn().Sys_mgr().Autonum_next("cfg_grp_meta.grp_id");
db_mgr.Tbl__grp_meta().Upsert(grp_id, grp_key);
// insert grp_map
int owner_id = String_.Len_eq_0(owner_key) ? Xogrp_meta_itm.Id__root : db_mgr.Tbl__grp_meta().Select_id_by_key_or_fail(owner_key);
int map_sort = db_mgr.Tbl__grp_map().Select_next_sort(owner_id);
db_mgr.Tbl__grp_map().Upsert(owner_id, grp_id, map_sort);
// insert nde_i18n
db_mgr.Tbl__nde_i18n().Upsert(grp_id, Lang__dflt, grp_name, grp_help);
}
public void Create_itm(String grp_key, String itm_key, String scope_id_str, int db_type_id, String gui_type, String gui_args, String itm_dflt, String itm_name, String help) {
// insert itm_meta
int grp_id = db_mgr.Tbl__grp_meta().Select_id_by_key_or_fail(grp_key);
int itm_id = db_mgr.Conn().Sys_mgr().Autonum_next("cfg_itm_meta.itm_id");
int scope_id = Xoitm_scope_tid.To_int(scope_id_str);
int gui_type_id = Xoitm_gui_tid.To_tid(gui_type);
db_mgr.Tbl__itm_meta().Upsert(itm_id, scope_id, db_type_id, gui_type_id, gui_args, itm_key, itm_dflt);
// insert grp_map
int itm_sort = db_mgr.Tbl__grp_map().Select_next_sort(grp_id);
db_mgr.Tbl__grp_map().Upsert(grp_id, itm_id, itm_sort);
// insert nde_i18n
db_mgr.Tbl__nde_i18n().Upsert(itm_id, Lang__dflt, itm_name, help);
}
}

@ -1,34 +0,0 @@
/*
XOWA: the XOWA Offline Wiki Application
Copyright (C) 2012 gnosygnu@gmail.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
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.*;
public class Xoitm_gui_tid { // SERIALIZED
public static final int Tid__checkbox = 1, Tid__numeric = 2, Tid__select = 3, Tid__textbox = 4, Tid__fs_file = 5, Tid__fs_dir = 6, Tid__memo = 7, Tid__button = 8, Tid__label = 9;
public static int To_tid(String str) {
if (String_.Eq(str, "checkbox")) return Tid__checkbox;
else if (String_.Eq(str, "numeric")) return Tid__numeric;
else if (String_.Eq(str, "select")) return Tid__select;
else if (String_.Eq(str, "textbox")) return Tid__textbox;
else if (String_.Eq(str, "fs_file")) return Tid__fs_file;
else if (String_.Eq(str, "fs_dir")) return Tid__fs_dir;
else if (String_.Eq(str, "memo")) return Tid__memo;
else if (String_.Eq(str, "button")) return Tid__button;
else if (String_.Eq(str, "label")) return Tid__label;
else throw Err_.new_unhandled_default(str);
}
}

@ -15,9 +15,9 @@ GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
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.*;
public class Xogrp_meta_itm {
public Xogrp_meta_itm(int id, String key) {
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;
}

@ -15,13 +15,13 @@ GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
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.*;
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 Xogrp_meta_tbl implements Db_tbl {
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 Xogrp_meta_tbl(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);
@ -37,21 +37,21 @@ public class Xogrp_meta_tbl implements Db_tbl {
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) {
Xogrp_meta_itm itm = this.Select_by_key_or_null(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 Xogrp_meta_itm Select_by_key_or_null(String key) {
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 Xogrp_meta_itm Load(Db_rdr rdr) {
return new Xogrp_meta_itm
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_meta";
public static final String TBL_NAME = "cfg_grp";
}

@ -15,9 +15,9 @@ GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
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.*;
public class Xoitm_meta_itm {
public Xoitm_meta_itm(int id, int scope_id, int db_type, int gui_type, String gui_args, String key, String dflt) {
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, int scope_id, int db_type, int gui_type, String gui_args, String key, String dflt) {
this.id = id;
this.scope_id = scope_id;
this.db_type = db_type;

@ -15,15 +15,15 @@ GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
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.*;
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 Xoitm_meta_tbl implements Db_tbl {
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_id, fld__itm_db_type, fld__itm_gui_type, fld__itm_gui_args, fld__itm_dflt;
private final Db_conn conn;
public Xoitm_meta_tbl(Db_conn conn) {
public Xocfg_itm_tbl(Db_conn conn) {
this.conn = conn;
this.tbl_name = "cfg_itm_meta";
this.tbl_name = "cfg_itm";
this.fld__itm_id = flds.Add_int_pkey("itm_id"); // EX: '2'
this.fld__itm_key = flds.Add_str("itm_key", 255); // EX: 'cfg_1'
this.fld__itm_scope_id = flds.Add_int("itm_scope_id"); // EX: '1'; ENUM: Xoitm_scope_tid
@ -41,13 +41,13 @@ public class Xoitm_meta_tbl implements Db_tbl {
public void Upsert(int itm_id, int scope_id, int db_type, int gui_type, String gui_args, String itm_key, String itm_dflt) {
Db_tbl__crud_.Upsert(conn, tbl_name, flds, String_.Ary(fld__itm_id), itm_id, itm_key, scope_id, db_type, gui_type, gui_args, itm_dflt);
}
public Xoitm_meta_itm Select_by_key_or_null(String key) {
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 Xoitm_meta_itm Load(Db_rdr rdr) {
return new Xoitm_meta_itm
private Xocfg_itm_row Load(Db_rdr rdr) {
return new Xocfg_itm_row
( rdr.Read_int(fld__itm_id)
, rdr.Read_int(fld__itm_scope_id)
, rdr.Read_int(fld__itm_db_type)

@ -15,15 +15,15 @@ GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
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.*;
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 Xogrp_map_tbl implements Db_tbl {
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 Xogrp_map_tbl(Db_conn conn) {
public Xocfg_map_tbl(Db_conn conn) {
this.conn = conn;
this.tbl_name = "cfg_grp_map";
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");

@ -15,9 +15,9 @@ GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
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.*;
public class Xonde_i18n_itm {
public Xonde_i18n_itm(int id, String lang, String name, String help) {
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;

@ -15,15 +15,15 @@ GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
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.*;
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 Xonde_i18n_tbl implements Db_tbl {
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 Xonde_i18n_tbl(Db_conn conn) {
public Xocfg_txt_tbl(Db_conn conn) {
this.conn = conn;
this.tbl_name = "cfg_nde_i18n";
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'
@ -35,13 +35,13 @@ public class Xonde_i18n_tbl implements Db_tbl {
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 Xonde_i18n_itm Select_by_id_or_null(int id) {
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 Xonde_i18n_itm Load(Db_rdr rdr) {
return new Xonde_i18n_itm
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)

@ -15,15 +15,15 @@ GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
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.*;
public class Xoitm_data_itm {
public Xoitm_data_itm(int id, String ctx, String val, String date) {
this.id = id;
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 int Id() {return id;} private final int id;
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;

@ -15,16 +15,16 @@ GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
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.*;
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 Xoitm_data_tbl implements Db_tbl {
public class Xocfg_val_tbl implements Db_tbl {
private final Dbmeta_fld_list flds = new Dbmeta_fld_list();
private final String fld__itm_id, fld__itm_ctx, fld__itm_val, fld__itm_date;
private final String fld__itm_key, fld__itm_ctx, fld__itm_val, fld__itm_date;
private final Db_conn conn;
public Xoitm_data_tbl(Db_conn conn) {
public Xocfg_val_tbl(Db_conn conn) {
this.conn = conn;
this.tbl_name = "cfg_itm_data";
this.fld__itm_id = flds.Add_int("itm_id"); // EX: '1'
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'
@ -33,34 +33,34 @@ public class Xoitm_data_tbl implements Db_tbl {
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_id, fld__itm_ctx)
, 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(int itm_id, String ctx, String itm_val, String itm_date) {
Db_tbl__crud_.Upsert(conn, tbl_name, flds, String_.Ary(fld__itm_id), itm_id, ctx, itm_val, itm_date);
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(int id, String ctx) {
conn.Stmt_delete(tbl_name, fld__itm_id, fld__itm_ctx).Crt_int(fld__itm_id, id).Crt_str(fld__itm_ctx, ctx).Exec_delete();
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 Xoitm_data_itm Select_one_by_id_or_null(int id, String ctx) {
Db_rdr rdr = conn.Stmt_select(tbl_name, flds, fld__itm_id, fld__itm_ctx).Crt_int(fld__itm_id, id).Crt_str(fld__itm_ctx, ctx).Exec_select__rls_auto();
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 Xoitm_data_itm[] Select_all_by_id(int id) {
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_id).Crt_int(fld__itm_id, id).Exec_select__rls_auto();
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 (Xoitm_data_itm[])list.To_ary_and_clear(Xoitm_data_itm.class);
return (Xocfg_val_row[])list.To_ary_and_clear(Xocfg_val_row.class);
}
private Xoitm_data_itm Load(Db_rdr rdr) {
return new Xoitm_data_itm
( rdr.Read_int(fld__itm_id)
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)

@ -0,0 +1,29 @@
/*
XOWA: the XOWA Offline Wiki Application
Copyright (C) 2012 gnosygnu@gmail.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
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_db_tid {
public static final int Tid__bool = 1, Tid__int = 2, Tid__str = 3, Tid__memo = 4;
public static int To_int(String s) {
if (String_.Eq(s, "bool")) return Tid__bool;
else if (String_.Eq(s, "int")) return Tid__int;
else if (String_.Eq(s, "string")) return Tid__str;
else if (String_.Eq(s, "memo")) return Tid__memo;
else return Tid__str;
// else throw Err_.new_wo_type("xo.cfg_maint:unknown db_type", "db_type", s);
}
}

@ -0,0 +1,53 @@
/*
XOWA: the XOWA Offline Wiki Application
Copyright (C) 2012 gnosygnu@gmail.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
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_gui_tid { // SERIALIZED
public static final int Tid__checkbox = 1, Tid__numeric = 2, Tid__select = 3, Tid__textbox = 4, Tid__fs_file = 5, Tid__fs_dir = 6, Tid__memo = 7, Tid__button = 8, Tid__label = 9;
public static final String
Str__checkbox = "checkbox"
, Str__numeric = "numeric"
, Str__select = "select"
, Str__textbox = "textbox"
, Str__fs_file = "fs_file"
, Str__fs_dir = "fs_dir"
, Str__memo = "memo"
, Str__button = "button"
, Str__label = "label"
;
public static int To_tid(String str) {
if (String_.Eq(str, Str__checkbox)) return Tid__checkbox;
else if (String_.Eq(str, Str__numeric)) return Tid__numeric;
else if (String_.Eq(str, Str__select)) return Tid__select;
else if (String_.Eq(str, Str__textbox)) return Tid__textbox;
else if (String_.Eq(str, Str__fs_file)) return Tid__fs_file;
else if (String_.Eq(str, Str__fs_dir)) return Tid__fs_dir;
else if (String_.Eq(str, Str__memo)) return Tid__memo;
else if (String_.Eq(str, Str__button)) return Tid__button;
else if (String_.Eq(str, Str__label)) return Tid__label;
else throw Err_.new_unhandled_default(str);
}
public static String Infer_gui_type(String db_type) {
if (String_.Eq(db_type, "bool"))
return Xoitm_gui_tid.Str__checkbox;
else if (String_.Eq(db_type, "memo"))
return Xoitm_gui_tid.Str__memo;
else
return Xoitm_gui_tid.Str__textbox;
}
}

@ -15,8 +15,7 @@ GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.xowa.addons.apps.cfgs.gui; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.apps.*; import gplx.xowa.addons.apps.cfgs.*;
public interface Xogui_nde {
int Id();
void Load_by_i18n(String lang, String name, String help);
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";
}

@ -15,7 +15,7 @@ GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
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.*;
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_tid { // SERIALIZED
public static final int Tid__app = 1, Tid__wiki = 2;
public static int To_int(String raw) {

@ -1,95 +0,0 @@
/*
XOWA: the XOWA Offline Wiki Application
Copyright (C) 2012 gnosygnu@gmail.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.xowa.addons.apps.cfgs.gui; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.apps.*; import gplx.xowa.addons.apps.cfgs.*;
class Xogui_nde_hash {
private final Ordered_hash hash = Ordered_hash_.New();
private final List_adp deleted = List_adp_.New();
public int Len() {
return hash.Len();
}
public void Add(Xogui_nde nde) {
hash.Add(nde.Id(), nde);
}
public Xogui_nde Get_at(int i) {
return (Xogui_nde)hash.Get_at(i);
}
public Xogui_nde Get_by_or_fail(int id) {
return (Xogui_nde)hash.Get_by_or_fail(id);
}
public Xogui_grp[] To_grp_ary_and_clear() {
return (Xogui_grp[])hash.To_ary_and_clear(Xogui_grp.class);
}
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++) {
Xogui_grp grp = (Xogui_grp)hash.Get_at(i);
if (grp.Itms().length == 0)
deleted.Add(grp);
}
len = deleted.Len();
for (int i = 0; i < len; i++) {
Xogui_grp grp = (Xogui_grp)deleted.Get_at(i);
hash.Del(grp.Id());
}
}
public Xogui_nde_hash Merge(Xogui_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(Xogui_nde nde) {
deleted.Add(nde);
}
public void Deleted__commit() {
int len = deleted.Len();
for (int i = 0; i < len; i++) {
Xogui_nde nde = (Xogui_nde)deleted.Get_at(i);
hash.Del(nde.Id());
}
}
}
class Xogui_nde_iter {
private final Xogui_nde_hash hash;
private int bgn, max;
public Xogui_nde_iter(Xogui_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++) {
Xogui_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 static Xogui_nde_iter New_sql(Xogui_nde_hash hash) {
return new Xogui_nde_iter(hash, 255);
}
}

@ -31,7 +31,7 @@ class Xocfg_cache_grp {
if (rv != null) return rv.Val();
// global match; EX: "app|key_1"
rv = (Xocfg_cache_itm)vals.Get_by(gplx.xowa.addons.apps.cfgs.gui.Xogui_itm.Ctx__app);
rv = (Xocfg_cache_itm)vals.Get_by(gplx.xowa.addons.apps.cfgs.specials.edits.objs.Xoedit_itm.Ctx__app);
if (rv != null) return rv.Val();
// dflt

@ -16,16 +16,20 @@ You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.xowa.addons.apps.cfgs.mgrs; 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.*;
import gplx.dbs.*;
import gplx.xowa.addons.apps.cfgs.dbs.*; import gplx.xowa.addons.apps.cfgs.dbs.tbls.*;
public class Xocfg_cache_mgr {
private final Hash_adp grps = Hash_adp_.New();
public Xocfg_cache_mgr() {
this.db_mgr = new Xocfg_db_mgr(Db_conn_.Noop);
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 conn) {
this.db_mgr = new Xocfg_db_mgr(conn);
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_mgr Db_mgr() {return db_mgr;} private Xocfg_db_mgr db_mgr;
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();}
public String Get(String ctx, String key) {
Xocfg_cache_grp grp = Grps__get_or_load(key);
@ -34,13 +38,13 @@ public class Xocfg_cache_mgr {
public void Set(String ctx, String key, String val) {
Xocfg_cache_grp grp = Grps__get_or_load(key);
grp.Set(ctx, val);
db_mgr.Set_str(ctx, key, val);
db_usr.Set_str(ctx, key, val);
grp.Pub(ctx, val);
}
public void Del(String ctx, String key) {
Xocfg_cache_grp grp = Grps__get_or_load(key);
grp.Del(ctx);
db_mgr.Del(ctx, key);
db_usr.Del(ctx, key);
grp.Pub(ctx, grp.Dflt());
}
public void Sub(Gfo_invk sub, String ctx, String key, String evt) {
@ -57,18 +61,18 @@ public class Xocfg_cache_mgr {
}
private Xocfg_cache_grp Load_grp(String key) {
// get data from db
Xoitm_meta_itm meta_itm = db_mgr.Tbl__itm_meta().Select_by_key_or_null(key);
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:grp not found; key=~{0}", key);
return new Xocfg_cache_grp(key, "");
}
Xoitm_data_itm[] itms = db_mgr.Tbl__itm_data().Select_all_by_id(meta_itm.Id());
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());
int len = itms.length;
for (int i = 0; i < len; i++) {
Xoitm_data_itm itm = itms[0];
Xocfg_val_row itm = itms[0];
String itm_ctx = itm.Ctx();
rv.Add(itm_ctx, new Xocfg_cache_itm(itm_ctx, key, itm.Val()));
}

@ -16,7 +16,8 @@ You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.xowa.addons.apps.cfgs.mgrs; 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.*; import gplx.dbs.*; import gplx.xowa.addons.apps.cfgs.dbs.*;
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();}
@ -26,14 +27,14 @@ public class Xocfg_cache_mgr__tst {
fxt.Test__get("en.d", "key_1", "dflt");
}
@Test public void Get__app() {
String ctx = gplx.xowa.addons.apps.cfgs.gui.Xogui_itm.Ctx__app;
String ctx = gplx.xowa.addons.apps.cfgs.specials.edits.objs.Xoedit_itm.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 = gplx.xowa.addons.apps.cfgs.gui.Xogui_itm.Ctx__app;
String ctx = gplx.xowa.addons.apps.cfgs.specials.edits.objs.Xoedit_itm.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");
@ -43,19 +44,16 @@ public class Xocfg_cache_mgr__tst {
}
class Xocfg_cache_mgr__fxt {
private Xocfg_cache_mgr mgr = new Xocfg_cache_mgr();
private Xocfg_itm_bldr cfg_bldr;
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);
cfg_bldr = new Xocfg_itm_bldr(mgr.Db_mgr());
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) {
cfg_bldr.Create_grp("", "test_grp", "", "");
int type_id = Type_adp_.To_tid_obj(val);
cfg_bldr.Create_itm("test_grp", key, "wiki", type_id, "textbox", "", "dflt", "", "");
mgr.Db_mgr().Set_str(ctx, key, Object_.Xto_str_strict_or_null(val));
Xocfg_maint_svc.Create_grp(mgr.Db_app(), "test_grp", "", "", "");
Xocfg_maint_svc.Create_itm(mgr.Db_app(), key, "test_grp", "", "", "wiki", "string", "dflt", "textbox", "");
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);

@ -15,11 +15,11 @@ GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.xowa.addons.apps.cfgs.gui; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.apps.*; import gplx.xowa.addons.apps.cfgs.*;
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 Xogui_grp implements Xogui_nde, Mustache_doc_itm {
public Xogui_grp(int id, int sort, String key) {
public class Xoedit_grp implements Xoedit_nde, Mustache_doc_itm {
public Xoedit_grp(int id, int sort, String key) {
this.id = id;
this.sort = sort;
this.key = key;
@ -33,16 +33,16 @@ public class Xogui_grp implements Xogui_nde, Mustache_doc_itm {
public String Name() {return name;} private String name;
public String Help() {return help;} private String help;
public Xogui_itm[] Itms() {return itms;} private Xogui_itm[] itms = new Xogui_itm[0];
public Xoedit_itm[] Itms() {return itms;} private Xoedit_itm[] itms = new Xoedit_itm[0];
public void Load_by_i18n(String lang, String name, String help) {
this.lang = lang;
this.name = name;
this.help = help;
}
public void Grps__add(Xogui_grp grp) {
public void Grps__add(Xoedit_grp grp) {
}
public void Itms_(Xogui_itm[] v) {
public void Itms_(Xoedit_itm[] v) {
this.itms = v;
}
public Gfobj_nde To_nde() {
@ -56,7 +56,7 @@ public class Xogui_grp implements Xogui_nde, Mustache_doc_itm {
List_adp list = List_adp_.New();
int len = itms.length;
for (int i = 0; i < len; i++) {
Xogui_itm itm = itms[i];
Xoedit_itm itm = itms[i];
list.Add(itm.To_nde());
}
rv.Add_ary("itms", new Gfobj_ary((Gfobj_nde[])list.To_ary_and_clear(Gfobj_nde.class)));

@ -15,13 +15,14 @@ GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.xowa.addons.apps.cfgs.gui; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.apps.*; import gplx.xowa.addons.apps.cfgs.*;
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.*;
public class Xogui_itm implements Xogui_nde, Mustache_doc_itm {
public Xogui_itm(int id, int sort) {
public class Xoedit_itm implements Xoedit_nde, Mustache_doc_itm {
public Xoedit_itm(int id, int sort, String key) {
this.id = id;
this.sort = sort;
this.key = key;
}
public int Id() {return id;} private final int id;
public int Sort() {return sort;} private final int sort;
@ -77,12 +78,11 @@ public class Xogui_itm implements Xogui_nde, Mustache_doc_itm {
rv.Add_str("date", date);
Bry_bfr bfr = Bry_bfr_.New();
To_html(bfr);
// rv.Add_str("html", String_.Replace(bfr.To_str_and_clear(), "'", "\\\""));
rv.Add_str("html", bfr.To_str_and_clear());
return rv;
}
private void To_html(Bry_bfr bfr) {
new Xogui_itm_html().Build_html(bfr, key, name, gui_type, gui_args, val);
new Xoedit_itm_html().Build_html(bfr, key, name, gui_type, gui_args, val);
}
public boolean Mustache__write(String k, Mustache_bfr bfr) {
if (String_.Eq(k, "id")) bfr.Add_int(id);

@ -15,9 +15,9 @@ GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.xowa.addons.apps.cfgs.gui; 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 Xogui_itm_html {
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.*;
public class Xoedit_itm_html {
public void Build_html(Bry_bfr bfr, String key, String name, int gui_type, String gui_args, String data) {
switch (gui_type) {
case Xoitm_gui_tid.Tid__checkbox:

@ -15,12 +15,12 @@ GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.xowa.addons.apps.cfgs.gui; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.apps.*; import gplx.xowa.addons.apps.cfgs.*;
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 Xogui_nav_itm implements Mustache_doc_itm {
public class Xoedit_nav_itm implements Mustache_doc_itm {
private final boolean selected;
private final String key, text;
public Xogui_nav_itm(boolean selected, String key, String text) {
public Xoedit_nav_itm(boolean selected, String key, String text) {
this.selected = selected;
this.key = key;
this.text = text;

@ -15,11 +15,11 @@ GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.xowa.addons.apps.cfgs.gui; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.apps.*; import gplx.xowa.addons.apps.cfgs.*;
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 Xogui_nav_mgr implements Mustache_doc_itm {
public Xogui_nav_itm[] Itms() {return itms;} private final Xogui_nav_itm[] itms;
public Xogui_nav_mgr(Xogui_nav_itm[] itms) {
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) {

@ -0,0 +1,23 @@
/*
XOWA: the XOWA Offline Wiki Application
Copyright (C) 2012 gnosygnu@gmail.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
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();
void Load_by_i18n(String lang, String name, String help);
}

@ -0,0 +1,78 @@
/*
XOWA: the XOWA Offline Wiki Application
Copyright (C) 2012 gnosygnu@gmail.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
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());
}
}
}

@ -15,14 +15,14 @@ GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.xowa.addons.apps.cfgs.gui; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.apps.*; import gplx.xowa.addons.apps.cfgs.*;
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 Xogui_root implements Mustache_doc_itm {
private final Xogui_nav_mgr[] nav_mgrs;
private final Xogui_grp[] grps;
public Xogui_root(Xogui_nav_mgr nav_mgr, Xogui_grp[] grps) {
this.nav_mgrs = nav_mgr.Itms().length == 0 ? new Xogui_nav_mgr[0] : new Xogui_nav_mgr[] {nav_mgr};
public class Xoedit_root implements Mustache_doc_itm {
private final Xoedit_nav_mgr[] nav_mgrs;
private final Xoedit_grp[] grps;
public Xoedit_root(Xoedit_nav_mgr nav_mgr, Xoedit_grp[] grps) {
this.nav_mgrs = nav_mgr.Itms().length == 0 ? new Xoedit_nav_mgr[0] : new Xoedit_nav_mgr[] {nav_mgr};
this.grps = grps;
}
public Gfobj_nde To_nde() {
@ -30,7 +30,7 @@ public class Xogui_root implements Mustache_doc_itm {
List_adp list = List_adp_.New();
int len = grps.length;
for (int i = 0; i < len; i++) {
Xogui_grp itm = grps[i];
Xoedit_grp itm = grps[i];
list.Add(itm.To_nde());
}
rv.Add_ary("grps", new Gfobj_ary((Gfobj_nde[])list.To_ary_and_clear(Gfobj_nde.class)));

@ -0,0 +1,58 @@
/*
XOWA: the XOWA Offline Wiki Application
Copyright (C) 2012 gnosygnu@gmail.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
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);
}
}

@ -17,7 +17,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
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.gui.*;
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 String grp, ctx, lang;
public Xocfg_edit_html(String grp, String ctx, String lang) {
@ -28,8 +28,8 @@ class Xocfg_edit_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", "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) {
Xogui_mgr mgr = Xogui_mgr.New(app);
return mgr.Get_root(grp, ctx, lang);
Xocfg_edit_loader mgr = Xocfg_edit_loader.New(app);
return mgr.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();

@ -19,9 +19,9 @@ package gplx.xowa.addons.apps.cfgs.specials.edits.services; import gplx.*; impor
import gplx.langs.jsons.*;
import gplx.xowa.htmls.bridges.*;
public class Xocfg_edit_bridge implements Bridge_cmd_itm {
private Xocfg_edit_service svc;
private Xocfg_edit_svc svc;
public void Init_by_app(Xoa_app app) {
this.svc = new Xocfg_edit_service(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);

@ -15,30 +15,33 @@ GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.xowa.addons.apps.cfgs.gui; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.apps.*; import gplx.xowa.addons.apps.cfgs.*;
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.*;
public class Xogui_mgr {
private final Xocfg_db_mgr db_mgr;
public Xogui_mgr(Xocfg_db_mgr db_mgr) {
this.db_mgr = db_mgr;
import gplx.xowa.addons.apps.cfgs.dbs.*; import gplx.xowa.addons.apps.cfgs.dbs.tbls.*;
import gplx.xowa.addons.apps.cfgs.specials.edits.objs.*;
public class Xocfg_edit_loader {
private final Xocfg_db_app db_app;
private final Xocfg_db_usr db_usr;
public Xocfg_edit_loader(Xocfg_db_app db_app, Xocfg_db_usr db_usr) {
this.db_app = db_app;
this.db_usr = db_usr;
}
public Xogui_root Get_root(String grp_key, String ctx, String lang) {
public Xoedit_root Load_root(String grp_key, String ctx, String lang) {
// create lists
Ordered_hash grp_temp = Ordered_hash_.New();
Xogui_nde_hash grp_list = new Xogui_nde_hash();
Xogui_nde_hash itm_list = new Xogui_nde_hash();
Xoedit_nde_hash grp_list = new Xoedit_nde_hash();
Xoedit_nde_hash itm_list = new Xoedit_nde_hash();
// get root_itm
Xogrp_meta_itm grp_meta = db_mgr.Tbl__grp_meta().Select_by_key_or_null(grp_key);
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);
Xogui_grp owner = new Xogui_grp(grp_meta.Id(), 0, grp_meta.Key());
Xoedit_grp owner = new Xoedit_grp(grp_meta.Id(), 0, grp_meta.Key());
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 = (Xogui_grp)grp_temp.Get_at(0);
owner = (Xoedit_grp)grp_temp.Get_at(0);
grp_temp.Del(owner.Id());
Load_subs(grp_list, itm_list, grp_temp, owner);
}
@ -49,30 +52,30 @@ public class Xogui_mgr {
Load_i18n(grp_list, itm_list, lang);
grp_list.Delete_container_grps();
return new Xogui_root(Load_nav_mgr(grp_key), (Xogui_grp[])grp_list.To_grp_ary_and_clear());
return new Xoedit_root(Load_nav_mgr(grp_key), (Xoedit_grp[])grp_list.To_grp_ary_and_clear());
}
private Xogui_nav_mgr Load_nav_mgr(String grp_key) {
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_meta"
, "FROM cfg_grp"
, "WHERE grp_key = '{0}'"
), grp_key
);
int grp_id = -1;
Db_rdr rdr = db_mgr.Conn().Stmt_sql(sql).Exec_select__rls_auto();
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_grp_map"
, "FROM cfg_map"
, "WHERE map_trg = {0}"
), grp_id
);
int owner_id = -1;
rdr = db_mgr.Conn().Stmt_sql(sql).Exec_select__rls_auto();
rdr = db_app.Conn().Stmt_sql(sql).Exec_select__rls_auto();
try {owner_id = rdr.Move_next() ? rdr.Read_int("map_src") : -1;}
finally {rdr.Rls();}
@ -80,57 +83,62 @@ public class Xogui_mgr {
sql = Db_sql_.Make_by_fmt(String_.Ary
( "SELECT m.map_trg"
, ", m.map_sort"
, ", n.nde_name"
, ", t.grp_key"
, "FROM cfg_grp_map m"
, " LEFT JOIN cfg_grp_meta t ON m.map_trg = t.grp_id"
, "FROM cfg_map m"
, " LEFT JOIN cfg_grp t ON m.map_trg = t.grp_id"
, " LEFT JOIN cfg_txt n ON m.map_trg = n.nde_id"
, "WHERE m.map_src = {0}"
, "ORDER BY m.map_sort"
), owner_id
);
List_adp list = List_adp_.New();
try {
rdr = db_mgr.Conn().Stmt_sql(sql).Exec_select__rls_auto();
rdr = db_app.Conn().Stmt_sql(sql).Exec_select__rls_auto();
while (rdr.Move_next()) {
String nav_key = rdr.Read_str("grp_key");
list.Add(new Xogui_nav_itm(String_.Eq(grp_key, nav_key), nav_key, nav_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 Xogui_nav_mgr((Xogui_nav_itm[])list.To_ary_and_clear(Xogui_nav_itm.class));
return new Xoedit_nav_mgr((Xoedit_nav_itm[])list.To_ary_and_clear(Xoedit_nav_itm.class));
}
private void Load_subs(Xogui_nde_hash grp_list, Xogui_nde_hash itm_list, Ordered_hash grp_temp, Xogui_grp owner) {
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"
, ", t.grp_key"
, "FROM cfg_grp_map m"
, " LEFT JOIN cfg_grp_meta t ON m.map_trg = t.grp_id"
, ", 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_mgr.Conn().Stmt_sql(sql).Exec_select__rls_auto();
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("grp_key");
// nde is itm
if (grp_key == null) {
Xogui_itm gui_itm = new Xogui_itm(rdr.Read_int("map_trg"), rdr.Read_int("map_sort"));
itms_list.Add(gui_itm);
itm_list.Add(gui_itm);
}
String grp_key = rdr.Read_str("key");
// nde is grp
else {
Xogui_grp gui_grp = new Xogui_grp(rdr.Read_int("map_trg"), rdr.Read_int("map_sort"), grp_key);
if (rdr.Read_str("itm_dflt") == null) {
Xoedit_grp gui_grp = new Xoedit_grp(rdr.Read_int("map_trg"), rdr.Read_int("map_sort"), grp_key);
owner.Grps__add(gui_grp);
grp_list.Add(gui_grp);
grp_temp.Add(gui_grp.Id(), gui_grp);
}
// nde is itm
else {
Xoedit_itm gui_itm = new Xoedit_itm(rdr.Read_int("map_trg"), rdr.Read_int("map_sort"), grp_key);
itms_list.Add(gui_itm);
itm_list.Add(gui_itm);
}
}
owner.Itms_((Xogui_itm[])itms_list.To_ary_and_clear(Xogui_itm.class));
owner.Itms_((Xoedit_itm[])itms_list.To_ary_and_clear(Xoedit_itm.class));
}
private void Load_itm_meta(Xogui_nde_hash itm_list) {
private void Load_itm_meta(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
@ -140,20 +148,20 @@ public class Xogui_mgr {
, ", t.itm_gui_type"
, ", t.itm_gui_args"
, ", t.itm_dflt"
, "FROM cfg_itm_meta t"
, "WHERE t.itm_id IN ({0})"
), iter.To_sql_in()
, "FROM cfg_itm t"
, "WHERE t.itm_key IN ({0})"
), iter.To_sql_in_key()
);
Db_rdr rdr = db_mgr.Conn().Stmt_sql(sql).Exec_select__rls_auto();
Db_rdr rdr = db_app.Conn().Stmt_sql(sql).Exec_select__rls_auto();
while (rdr.Move_next()) {
Xogui_itm gui_itm = (Xogui_itm)itm_list.Get_by_or_fail(rdr.Read_int("itm_id"));
Xoedit_itm gui_itm = (Xoedit_itm)itm_list.Get_by_or_fail(rdr.Read_str("itm_key"));
gui_itm.Load_by_meta(rdr.Read_str("itm_key"), rdr.Read_int("itm_scope_id"), rdr.Read_int("itm_gui_type"), rdr.Read_str("itm_gui_args"), rdr.Read_str("itm_dflt"));
}
}
}
private void Load_itm_data(Xogui_nde_hash itm_list, String... ctxs) {
Xogui_nde_hash cur_regy = new Xogui_nde_hash().Merge(itm_list);
private void Load_itm_data(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;
@ -163,20 +171,20 @@ public class Xogui_mgr {
while (cur_iter.Move_next()) {
// get all data by ids and ctx
String sql = Db_sql_.Make_by_fmt(String_.Ary
( "SELECT d.itm_id"
( "SELECT d.itm_key"
, ", d.itm_ctx"
, ", d.itm_val"
, ", d.itm_date"
, "FROM cfg_itm_data d"
, "WHERE d.itm_id IN ({0})"
, "FROM cfg_val d"
, "WHERE d.itm_key IN ({0})"
, "AND d.itm_ctx = '{1}'"
), cur_iter.To_sql_in(), ctxs[i]
), cur_iter.To_sql_in_key(), ctxs[i]
);
// read and set data
Db_rdr rdr = db_mgr.Conn().Stmt_sql(sql).Exec_select__rls_auto();
Db_rdr rdr = db_usr.Conn().Stmt_sql(sql).Exec_select__rls_auto();
while (rdr.Move_next()) {
Xogui_itm gui_itm = (Xogui_itm)cur_regy.Get_by_or_fail(rdr.Read_int("itm_id"));
Xoedit_itm gui_itm = (Xoedit_itm)cur_regy.Get_by_or_fail(rdr.Read_str("itm_key"));
gui_itm.Load_by_data(rdr.Read_str("itm_ctx"), rdr.Read_str("itm_val"), rdr.Read_str("itm_date"));
cur_regy.Deleted__add(gui_itm);
}
@ -187,12 +195,12 @@ public class Xogui_mgr {
// loop over remaining items and set to dflts
int cur_len = cur_regy.Len();
for (int i = 0; i < cur_len; i++) {
Xogui_itm itm = (Xogui_itm)cur_regy.Get_at(i);
Xoedit_itm itm = (Xoedit_itm)cur_regy.Get_at(i);
itm.Set_data_by_dflt();
}
}
private void Load_i18n(Xogui_nde_hash grp_list, Xogui_nde_hash itm_list, String... langs) {
Xogui_nde_hash cur_regy = new Xogui_nde_hash().Merge(grp_list).Merge(itm_list);
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;
@ -206,7 +214,7 @@ public class Xogui_mgr {
, ", h.nde_name"
, ", h.nde_help"
, ", h.nde_lang"
, "FROM cfg_nde_i18n h"
, "FROM cfg_txt h"
, "WHERE h.nde_id IN ({0})"
, "AND h.nde_lang = '{1}'"
), cur_iter.To_sql_in()
@ -214,9 +222,9 @@ public class Xogui_mgr {
);
// read and set i18n
Db_rdr rdr = db_mgr.Conn().Stmt_sql(sql).Exec_select__rls_auto();
Db_rdr rdr = db_app.Conn().Stmt_sql(sql).Exec_select__rls_auto();
while (rdr.Move_next()) {
Xogui_nde gui_itm = (Xogui_nde)cur_regy.Get_by_or_fail(rdr.Read_int("nde_id"));
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);
}
@ -224,8 +232,8 @@ public class Xogui_mgr {
cur_regy.Deleted__commit();
}
}
public static Xogui_mgr New(Xoa_app app) {
Xocfg_db_mgr db_mgr = new Xocfg_db_mgr(app.User().User_db_mgr().Conn());
return new Xogui_mgr(db_mgr);
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()));
}
}

@ -17,12 +17,13 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
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.guis.cbks.*; import gplx.xowa.addons.apps.cfgs.dbs.*; import gplx.xowa.addons.apps.cfgs.gui.*;
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.*;
public class Xocfg_edit_service {
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_service(Xoa_app app) {
public Xocfg_edit_svc(Xoa_app app) {
this.app = app;
}
public void Upsert(Json_nde args) {
@ -39,8 +40,8 @@ public class Xocfg_edit_service {
public void Load(Json_nde args) {
String ctx = args.Get_as_str("ctx");
String key = args.Get_as_str("key");
Xogui_mgr gui_mgr = new Xogui_mgr(new Xocfg_db_mgr(app.User().User_db_mgr().Conn()));
Xogui_root gui_root = gui_mgr.Get_root(key, ctx, "en");
app.Gui__cbk_mgr().Send_json(cbk_trg, "xo.cfg_edit.load__recv", gui_root.To_nde());
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.load__recv", root.To_nde());
}
}

@ -17,13 +17,13 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
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.gui.*;
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 Xogui_grp(0, 1, "test");
return new Xoedit_grp(0, 1, "test");
}
@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();

@ -19,9 +19,9 @@ package gplx.xowa.addons.apps.cfgs.specials.maints.services; import gplx.*; impo
import gplx.langs.jsons.*;
import gplx.xowa.htmls.bridges.*;
public class Xocfg_maint_bridge implements Bridge_cmd_itm {
private Xocfg_maint_service svc;
private Xocfg_maint_svc svc;
public void Init_by_app(Xoa_app app) {
this.svc = new Xocfg_maint_service(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);

@ -0,0 +1,58 @@
/*
XOWA: the XOWA Offline Wiki Application
Copyright (C) 2012 gnosygnu@gmail.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
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 key, String owner, String name, String help) {
this.key = key;
this.owner = owner;
this.name = name;
this.help = help;
}
public abstract boolean Type_is_grp();
public String Key() {return key;} private final String key;
public String Owner() {return owner;} private final String owner;
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}", this.Type_is_grp(), key, owner, 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 key, String owner, String name, String help) {super(key, owner, 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 key, String owner, String name, String help, String scope, String db_type, String dflt, String gui_type, String gui_args) {super(key, owner, name, help);
this.scope = scope;
this.db_type = db_type;
this.dflt = dflt;
this.gui_type = gui_type;
this.gui_args = gui_args;
}
@Override public boolean Type_is_grp() {return false;}
public String Scope() {return scope;} private final String scope;
public String Db_type() {return db_type;} private final String db_type;
public String Dflt() {return dflt;} private final String dflt;
public String Gui_type() {return gui_type;} private final String gui_type;
public String Gui_args() {return gui_args;} private final String gui_args;
@Override protected void To_bfr_hook(Bry_bfr bfr) {
bfr.Add_str_u8_fmt("|{0}|{1}|{2}|{3}|{4}", scope, db_type, dflt, gui_type, gui_args);
}
}

@ -0,0 +1,78 @@
/*
XOWA: the XOWA Offline Wiki Application
Copyright (C) 2012 gnosygnu@gmail.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
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);
root = root.Subs_getAt(0); // NOTE: ignore fake root
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
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(key, owner, name, help);
}
else if (String_.Eq(nde_type, "itm")) {
String scope = Get_atr_as_str_or_fail(hash, "scope_");
String db_type = Get_atr_as_str_or_fail(hash, "db_type_");
String dflt = Get_atr_as_str_or_fail(hash, "dflt_");
String gui_type = Get_atr_as_str_or(hash, "gui_type_", null);
String gui_args = Get_atr_as_str_or(hash, "gui_args_", "");
if (gui_type == null) {
gui_type = gplx.xowa.addons.apps.cfgs.enums.Xoitm_gui_tid.Infer_gui_type(db_type);
}
return new Xocfg_maint_itm(key, owner, name, help, scope, db_type, dflt, gui_type, gui_args);
}
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;
}
}

@ -0,0 +1,45 @@
/*
XOWA: the XOWA Offline Wiki Application
Copyright (C) 2012 gnosygnu@gmail.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
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("root {grp {key='key_1'; owner='owner_1'; name='name_1'; help='help_1'}}"
, fxt.Make__grp("key_1", "owner_1", "name_1", "help_1")
);
}
@Test public void Parse_itm() {
fxt.Exec__parse("root {itm {key='key_1'; owner='owner_1'; name='name_1'; help='help_1'; scope='scope_1'; db_type='db_type_1'; dflt='dflt_1'; gui_type='gui_type_1'; gui_args='gui_args_1'}}"
, fxt.Make__itm("key_1", "owner_1", "name_1", "help_1", "scope_1", "db_type_1", "dflt_1", "gui_type_1", "gui_args_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 key, String owner, String name, String help) {
return new Xocfg_maint_grp(key, owner, name, help);
}
public Xocfg_maint_itm Make__itm(String key, String owner, String name, String help, String scope, String db_type, String dflt, String gui_type, String gui_args) {
return new Xocfg_maint_itm(key, owner, name, help, scope, db_type, dflt, gui_type, gui_args);
}
}

@ -1,40 +0,0 @@
/*
XOWA: the XOWA Offline Wiki Application
Copyright (C) 2012 gnosygnu@gmail.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
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.*;
class Xocfg_maint_service {
private Xoa_app app;
public Xocfg_maint_service(Xoa_app app) {
this.app = app;
}
public void Upsert(String data) {
Xocfg_itm_bldr itm_bldr = new Xocfg_itm_bldr(new Xocfg_db_mgr(app.User().User_db_mgr().Conn()));
String[] lines = String_.Split(data, "\n");
for (String line : lines) {
String[] ary = String_.Split(line, "|");
if (ary.length < 4) continue; // ignore blank lines
String type = String_.Trim(ary[0]); // get 1st arg and ignore leading space
if (String_.Eq(type, "grp")) {
itm_bldr.Create_grp(ary[1], ary[2], ary[3], ary[4]);
}
else {
itm_bldr.Create_itm(ary[1], ary[2], ary[3], Type_adp_.To_tid(ary[4]), ary[5], ary[6], ary[7], ary[8], ary[9]);
}
}
}
}

@ -0,0 +1,77 @@
/*
XOWA: the XOWA Offline Wiki Application
Copyright (C) 2012 gnosygnu@gmail.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
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);
for (Xocfg_maint_nde nde : ndes) {
if (nde.Type_is_grp()) {
Xocfg_maint_svc.Create_grp(db_app, nde.Key(), nde.Owner(), nde.Name(), nde.Help());
}
else {
Xocfg_maint_itm itm = (Xocfg_maint_itm)nde;
byte[] help = parser_mgr.Main().Parse_text_to_html(parser_mgr.Ctx(), Bry_.new_u8(itm.Help()));
Xocfg_maint_svc.Create_itm(db_app, nde.Key(), nde.Owner(), nde.Name(), String_.new_u8(help), itm.Scope(), itm.Db_type(), itm.Dflt(), itm.Gui_type(), itm.Gui_args());
}
}
}
public static void Create_grp(Xocfg_db_app db_app, String key, String owner, String name, String help) {
// insert grp_meta
int grp_id = db_app.Conn().Sys_mgr().Autonum_next("cfg_grp_meta.grp_id");
db_app.Tbl__grp().Upsert(grp_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_next_sort(owner_id);
db_app.Tbl__map().Upsert(owner_id, grp_id, map_sort);
// insert nde_i18n
db_app.Tbl__txt().Upsert(grp_id, Xoitm_lang_tid.Lang__dflt, name, help);
}
public static void Create_itm(Xocfg_db_app db_app, String key, String owner, String name, String help, String scope, String db_type, String dflt, String gui_type, String gui_args) {
// insert itm_meta
int grp_id = db_app.Tbl__grp().Select_id_by_key_or_fail(owner);
int itm_id = db_app.Conn().Sys_mgr().Autonum_next("cfg_itm_meta.itm_id");
int scope_id = Xoitm_scope_tid.To_int(scope);
int db_type_id = Xoitm_db_tid.To_int(db_type);
int gui_type_id = Xoitm_gui_tid.To_tid(gui_type);
db_app.Tbl__itm().Upsert(itm_id, scope_id, db_type_id, gui_type_id, gui_args, key, dflt);
// insert grp_map
int itm_sort = db_app.Tbl__map().Select_next_sort(grp_id);
db_app.Tbl__map().Upsert(grp_id, itm_id, itm_sort);
// insert nde_i18n
db_app.Tbl__txt().Upsert(itm_id, Xoitm_lang_tid.Lang__dflt, name, help);
}
}

@ -97,7 +97,7 @@ public class Xoav_app implements Xoa_app, Gfo_invk {
public void Init_by_app(Io_url user_db_url) {
user.Init_db(this, wiki_mgr, user_db_url);
this.Addon_mgr().Add_dflts_by_app(this).Run_by_app(this);
cfg.Init_by_app(user.User_db_mgr().Conn());
cfg.Init_by_app(this);
}
public void Free_mem() { // NOTE:not yet called in drd; DATE:2016-12-04
cfg.Clear();

Loading…
Cancel
Save