diff --git a/400_xowa/src/gplx/xowa/addons/apps/cfgs/Xoa_cfg_addon.java b/400_xowa/src/gplx/xowa/addons/apps/cfgs/Xoa_cfg_addon.java
index 3457a4d8c..dbd8601d8 100644
--- a/400_xowa/src/gplx/xowa/addons/apps/cfgs/Xoa_cfg_addon.java
+++ b/400_xowa/src/gplx/xowa/addons/apps/cfgs/Xoa_cfg_addon.java
@@ -33,6 +33,4 @@ public class Xoa_cfg_addon implements Xoax_addon_itm, Xoax_addon_itm__special, X
}
public String Addon__key() {return ADDON__KEY;} private static final String ADDON__KEY = "xowa.app.cfg";
-// public static void Init(Xoae_app app) {
-// }
}
diff --git a/400_xowa/src/gplx/xowa/addons/apps/cfgs/Xocfg_mgr.java b/400_xowa/src/gplx/xowa/addons/apps/cfgs/Xocfg_mgr.java
new file mode 100644
index 000000000..cf98d0b40
--- /dev/null
+++ b/400_xowa/src/gplx/xowa/addons/apps/cfgs/Xocfg_mgr.java
@@ -0,0 +1,37 @@
+/*
+XOWA: the XOWA Offline Wiki Application
+Copyright (C) 2012 gnosygnu@gmail.com
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU Affero General Public License as
+published by the Free Software Foundation, either version 3 of the
+License, or (at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU Affero General Public License for more details.
+
+You should have received a copy of the GNU Affero General Public License
+along with this program. If not, see .
+*/
+package gplx.xowa.addons.apps.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.*;
+public class Xocfg_mgr {
+ private final Xocfg_cache_mgr cache_mgr;
+ public Xocfg_mgr(Db_conn conn) {
+ this.cache_mgr = new Xocfg_cache_mgr(conn);
+ }
+ public void Clear() {
+ cache_mgr.Clear();
+ }
+ public void Sub_many(Gfo_evt_itm sub, String ctx, String... keys) {
+ cache_mgr.Sub_many(sub, ctx, keys);
+ }
+ public String Get_str(String ctx, String key) {return cache_mgr.Get(ctx, key);}
+ public void Set_str(String ctx, String key, String val) {cache_mgr.Set(ctx, key, val);}
+
+ public static Xocfg_mgr New(Db_conn conn) {
+ return new Xocfg_mgr(conn);
+ }
+}
diff --git a/400_xowa/src/gplx/xowa/addons/apps/cfgs/dbs/Xocfg_db_mgr.java b/400_xowa/src/gplx/xowa/addons/apps/cfgs/dbs/Xocfg_db_mgr.java
index 6ac48c39e..669f43422 100644
--- a/400_xowa/src/gplx/xowa/addons/apps/cfgs/dbs/Xocfg_db_mgr.java
+++ b/400_xowa/src/gplx/xowa/addons/apps/cfgs/dbs/Xocfg_db_mgr.java
@@ -34,10 +34,10 @@ public class Xocfg_db_mgr {
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_str1(String ctx, String key) {
+ 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_by_id_or_null(meta_itm.Id());
+ 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) {
diff --git a/400_xowa/src/gplx/xowa/addons/apps/cfgs/dbs/Xoitm_data_tbl.java b/400_xowa/src/gplx/xowa/addons/apps/cfgs/dbs/Xoitm_data_tbl.java
index de052bff9..85dce1b1f 100644
--- a/400_xowa/src/gplx/xowa/addons/apps/cfgs/dbs/Xoitm_data_tbl.java
+++ b/400_xowa/src/gplx/xowa/addons/apps/cfgs/dbs/Xoitm_data_tbl.java
@@ -31,18 +31,33 @@ public class Xoitm_data_tbl implements Db_tbl {
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 Create_tbl() {
+ conn.Meta_tbl_create(Dbmeta_tbl_itm.New(tbl_name, flds
+ , Dbmeta_idx_itm.new_normal_by_tbl(tbl_name, "", fld__itm_id, fld__itm_ctx)
+ ));
+ }
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 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 Xoitm_data_itm Select_by_id_or_null(int id) {
- Db_rdr rdr = conn.Stmt_select(tbl_name, flds, fld__itm_id).Exec_select__rls_auto();
+ 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();
try {return rdr.Move_next() ? Load(rdr) : null;}
finally {rdr.Rls();}
}
+ public Xoitm_data_itm[] Select_all_by_id(int id) {
+ 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();
+ 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);
+ }
private Xoitm_data_itm Load(Db_rdr rdr) {
return new Xoitm_data_itm
( rdr.Read_int(fld__itm_id)
diff --git a/400_xowa/src/gplx/xowa/addons/apps/cfgs/mgrs/Xocfg_cache_grp.java b/400_xowa/src/gplx/xowa/addons/apps/cfgs/mgrs/Xocfg_cache_grp.java
new file mode 100644
index 000000000..12da1a9be
--- /dev/null
+++ b/400_xowa/src/gplx/xowa/addons/apps/cfgs/mgrs/Xocfg_cache_grp.java
@@ -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 .
+*/
+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.*;
+class Xocfg_cache_grp {
+ private final Hash_adp vals = Hash_adp_.New();
+ private final Hash_adp subs = Hash_adp_.New();
+ private final String dflt;
+ public Xocfg_cache_grp(String key, String dflt) {
+ this.key = key;
+ this.dflt = dflt;
+ }
+ public String Key() {return key;} private final String key;
+ 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(gplx.xowa.addons.apps.cfgs.gui.Xogui_itm.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 Add(String ctx, Xocfg_cache_itm itm) {
+ vals.Add(ctx, itm);
+ }
+ public void Sub(Gfo_evt_itm 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"
+ list = (List_adp)subs.Get_by(ctx);
+ if (list == null) return;
+ }
+ 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_evt_mgr_.Pub_val(sub.Sub(), sub.Evt(), val);
+ }
+ }
+}
diff --git a/400_xowa/src/gplx/xowa/addons/apps/cfgs/mgrs/Xocfg_cache_itm.java b/400_xowa/src/gplx/xowa/addons/apps/cfgs/mgrs/Xocfg_cache_itm.java
new file mode 100644
index 000000000..09332dce6
--- /dev/null
+++ b/400_xowa/src/gplx/xowa/addons/apps/cfgs/mgrs/Xocfg_cache_itm.java
@@ -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 .
+*/
+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.*;
+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;}
+}
diff --git a/400_xowa/src/gplx/xowa/addons/apps/cfgs/mgrs/Xocfg_cache_mgr.java b/400_xowa/src/gplx/xowa/addons/apps/cfgs/mgrs/Xocfg_cache_mgr.java
new file mode 100644
index 000000000..e433b3bea
--- /dev/null
+++ b/400_xowa/src/gplx/xowa/addons/apps/cfgs/mgrs/Xocfg_cache_mgr.java
@@ -0,0 +1,68 @@
+/*
+XOWA: the XOWA Offline Wiki Application
+Copyright (C) 2012 gnosygnu@gmail.com
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU Affero General Public License as
+published by the Free Software Foundation, either version 3 of the
+License, or (at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU Affero General Public License for more details.
+
+You should have received a copy of the GNU Affero General Public License
+along with this program. If not, see .
+*/
+package gplx.xowa.addons.apps.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.*;
+public class Xocfg_cache_mgr {
+ private final Hash_adp grps = Hash_adp_.New();
+ public Xocfg_cache_mgr(Db_conn conn) {
+ this.db_mgr = new Xocfg_db_mgr(conn);
+ }
+ public Xocfg_db_mgr Db_mgr() {return db_mgr;} private final Xocfg_db_mgr db_mgr;
+ public void Clear() {grps.Clear();}
+ public String Get(String ctx, String key) {
+ Xocfg_cache_grp grp = Grps__get_or_load(key);
+ return grp.Get(ctx);
+ }
+ public void Set(String ctx, String key, String val) {
+ Xocfg_cache_grp grp = Grps__get_or_load(key);
+ grp.Set(ctx, val);
+ grp.Pub(ctx, val);
+ }
+ public void Sub_many(Gfo_evt_itm sub, String ctx, String... evts) {
+ int len = evts.length;
+ for (int i = 0; i < len; i++) {
+ String evt = evts[i];
+ if (!String_.Has_at_bgn(evt, "Evt__")) throw Err_.new_wo_type("cfg:event must start with Evt__", "evt", evt);
+ Sub(sub, ctx, String_.Mid(evt, 5), evt);
+ }
+ }
+ public void Sub(Gfo_evt_itm sub, String ctx, String key, String evt) {
+ Xocfg_cache_grp grp = Grps__get_or_load(key);
+ grp.Sub(sub, ctx, evt);
+ }
+ private Xocfg_cache_grp Grps__get_or_load(String key) {
+ Xocfg_cache_grp grp = (Xocfg_cache_grp)grps.Get_by(key);
+ return grp == null ? Load_grp(key) : grp;
+ }
+ 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);
+ if (meta_itm == null) throw Err_.new_wo_type("cfg:grp not found;", "key", key);
+ Xoitm_data_itm[] itms = db_mgr.Tbl__itm_data().Select_all_by_id(meta_itm.Id());
+
+ // 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];
+ String itm_ctx = itm.Ctx();
+ rv.Add(itm_ctx, new Xocfg_cache_itm(itm_ctx, key, itm.Val()));
+ }
+ return rv;
+ }
+}
diff --git a/400_xowa/src/gplx/xowa/addons/apps/cfgs/mgrs/Xocfg_cache_mgr__tst.java b/400_xowa/src/gplx/xowa/addons/apps/cfgs/mgrs/Xocfg_cache_mgr__tst.java
new file mode 100644
index 000000000..8c87461cb
--- /dev/null
+++ b/400_xowa/src/gplx/xowa/addons/apps/cfgs/mgrs/Xocfg_cache_mgr__tst.java
@@ -0,0 +1,44 @@
+/*
+XOWA: the XOWA Offline Wiki Application
+Copyright (C) 2012 gnosygnu@gmail.com
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU Affero General Public License as
+published by the Free Software Foundation, either version 3 of the
+License, or (at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU Affero General Public License for more details.
+
+You should have received a copy of the GNU Affero General Public License
+along with this program. If not, see .
+*/
+package gplx.xowa.addons.apps.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.*;
+public class Xocfg_cache_mgr__tst {
+ private final Xocfg_cache_mgr__fxt fxt = new Xocfg_cache_mgr__fxt();
+ @Test public void Basic() {
+// fxt.Init__db_add("en.w", "key_1", "val_1");
+// fxt.Test__get("en.w", "key_1", "val_1");
+ }
+}
+class Xocfg_cache_mgr__fxt {
+ private final Xocfg_cache_mgr mgr;
+ private final Xocfg_itm_bldr cfg_bldr;
+ public Xocfg_cache_mgr__fxt() {
+ 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/"));
+ this.mgr = new Xocfg_cache_mgr(conn);
+ cfg_bldr = new Xocfg_itm_bldr(mgr.Db_mgr());
+ }
+ public void Init__db_add(String ctx, String key, String val) {
+ cfg_bldr.Create_grp("", "test_grp", "", "");
+ cfg_bldr.Create_itm("test_grp", key, "wiki", "textbox", "", "dflt", "", "");
+ mgr.Db_mgr().Set_str(ctx, key, val);
+ }
+ public void Test__get(String ctx, String key, String expd) {
+ Gftest.Eq__str(expd, mgr.Get(ctx, key));
+ }
+}
diff --git a/400_xowa/src/gplx/xowa/addons/apps/cfgs/mgrs/Xocfg_cache_sub.java b/400_xowa/src/gplx/xowa/addons/apps/cfgs/mgrs/Xocfg_cache_sub.java
new file mode 100644
index 000000000..ffae6ab63
--- /dev/null
+++ b/400_xowa/src/gplx/xowa/addons/apps/cfgs/mgrs/Xocfg_cache_sub.java
@@ -0,0 +1,30 @@
+/*
+XOWA: the XOWA Offline Wiki Application
+Copyright (C) 2012 gnosygnu@gmail.com
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU Affero General Public License as
+published by the Free Software Foundation, either version 3 of the
+License, or (at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU Affero General Public License for more details.
+
+You should have received a copy of the GNU Affero General Public License
+along with this program. If not, see .
+*/
+package gplx.xowa.addons.apps.cfgs.mgrs; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.apps.*; import gplx.xowa.addons.apps.cfgs.*;
+class Xocfg_cache_sub {
+ public Xocfg_cache_sub(Gfo_evt_itm 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_evt_itm Sub() {return sub;} private final Gfo_evt_itm sub;
+}