Cfg: Refactor 'Gui - Url bar'; Add better support for buttons

pull/620/head
gnosygnu 8 years ago
parent 74fefed754
commit f12e3f5318

@ -31,26 +31,23 @@ public class Xocfg_mgr {
, app.User().User_db_mgr().Conn()); , app.User().User_db_mgr().Conn());
dflt_mgr.Init_by_app(app); dflt_mgr.Init_by_app(app);
} }
public void Bind_many_app (Gfo_invk sub, String... keys) {Bind_many(sub, Xocfg_mgr.Ctx__app, keys);} public void Sub_many_app (Gfo_invk sub, String... keys) {Bind_many(Bool_.N, sub, Xocfg_mgr.Ctx__app, keys);}
public void Bind_many_wiki (Gfo_invk sub, Xow_wiki wiki, String... keys) {Bind_many(sub, wiki.Domain_itm().Abrv_xo_str(), keys);} public void Bind_many_app (Gfo_invk sub, String... keys) {Bind_many(Bool_.Y, sub, Xocfg_mgr.Ctx__app, keys);}
public void Bind_many(Gfo_invk sub, String ctx, String... keys) { public void Bind_many_wiki (Gfo_invk sub, Xow_wiki wiki, String... keys) {Bind_many(Bool_.Y, sub, wiki.Domain_itm().Abrv_xo_str(), keys);}
private void Bind_many(boolean pub, Gfo_invk sub, String ctx, String... keys) {
try { try {
for (String key : keys) { for (String key : keys) {
String val = Bind_str(ctx, key, sub); cache_mgr.Sub(sub, ctx, key, key);
cache_mgr.Pub(ctx, key, val); if (pub) {
String val = cache_mgr.Get(ctx, key);
cache_mgr.Pub(ctx, key, val);
}
} }
} }
catch (Exception e) { catch (Exception e) {
Gfo_usr_dlg_.Instance.Warn_many("", "", "bind failed: ctx=~{0} keys=~{1} err=~{2}", ctx, String_.AryXtoStr(keys), Err_.Message_gplx_log(e)); Gfo_usr_dlg_.Instance.Warn_many("", "", "bind failed: ctx=~{0} keys=~{1} err=~{2}", ctx, String_.AryXtoStr(keys), Err_.Message_gplx_log(e));
} }
} }
public boolean Bind_bool_app(String key, Gfo_invk sub) {return Yn.parse_or(Bind_str(Xocfg_mgr.Ctx__app, key, sub), false);}
public boolean Bind_bool(Xow_wiki wiki, String key, Gfo_invk sub) {return Yn.parse_or(Bind_str(wiki, key, sub), false);}
public String Bind_str(Xow_wiki wiki, String key, Gfo_invk sub) {return Bind_str(wiki.Domain_itm().Abrv_xo_str(), key, sub);}
public String Bind_str(String ctx, String key, Gfo_invk sub) {
cache_mgr.Sub(sub, ctx, key, key);
return cache_mgr.Get(ctx, key);
}
public boolean Get_bool_app_or(String key, boolean or) { public boolean Get_bool_app_or(String key, boolean or) {
String rv = Get_str(Ctx__app, key); String rv = Get_str(Ctx__app, key);
return rv == null ? or : Yn.parse_or(rv, or); return rv == null ? or : Yn.parse_or(rv, or);

@ -51,7 +51,8 @@ public class Xoedit_itm implements Xoedit_nde, Mustache_doc_itm {
this.val = val; this.val = val;
this.date = date; this.date = date;
this.edited = true; this.edited = true;
if (String_.Has(gui_args, "read"+"only=") || String_.Has(gui_args, "disabled=")) if ( String_.Has(gui_args, "read"+"only=") || String_.Has(gui_args, "disabled=")
|| String_.Eq(gui_type, gplx.xowa.addons.apps.cfgs.enums.Xoitm_gui_tid.Itm__btn.Key()))
edited = false; edited = false;
} }
public void Set_data_by_dflt() { public void Set_data_by_dflt() {

@ -69,7 +69,7 @@ public class Xoedit_itm_html {
, gui_type_key, gui_args, key, lines[1]); , gui_type_key, gui_args, key, lines[1]);
break; break;
case Xoitm_gui_tid.Tid__btn: case Xoitm_gui_tid.Tid__btn:
bfr.Add_str_u8_fmt("<input id=\"{2}\" data-xocfg-key=\"{2}\" data-xocfg-gui=\"{0}\" class=\"xocfg__btn\" type=\"button\"{1}{3}></input>", gui_type_key, gui_args, key, key); bfr.Add_str_u8_fmt("<button id=\"{2}\" data-xocfg-key=\"{2}\" data-xocfg-gui=\"{0}\" class=\"xocfg__btn\" {1}>{3}</button>", gui_type_key, gui_args, key, name);
break; break;
default: default:
break; break;

@ -28,7 +28,7 @@ public class Srch_urlbar_mgr implements Gfo_invk { // NOTE: needs to be app-leve
private int max_results = 10; private int max_results = 10;
private boolean auto_wildcard = true; private boolean auto_wildcard = true;
private final Srch_ns_mgr ns_mgr = new Srch_ns_mgr().Add_main_if_empty(); private final Srch_ns_mgr ns_mgr = new Srch_ns_mgr().Add_main_if_empty();
private Srch_crt_scanner_syms syms = Srch_search_mgr.Scanner_syms; private Srch_crt_scanner_syms syms = Srch_crt_scanner_syms.New__dflt();
private void Ns_ids_(String s) { private void Ns_ids_(String s) {
int[] ns_ids = Int_.Ary_empty; int[] ns_ids = Int_.Ary_empty;
if (String_.Eq(s, "*")) {} // leave as int[0]; ns_mgr will interpret as wildcard if (String_.Eq(s, "*")) {} // leave as int[0]; ns_mgr will interpret as wildcard
@ -76,7 +76,7 @@ public class Srch_urlbar_mgr implements Gfo_invk { // NOTE: needs to be app-leve
url_bar.List_sel_idx_(0); // clear selected list item; EX: search "a" -> page down; sel is row #5 -> search "b" -> sel should not be #5; DATE:2016-03-24 url_bar.List_sel_idx_(0); // clear selected list item; EX: search "a" -> page down; sel is row #5 -> search "b" -> sel should not be #5; DATE:2016-03-24
if (!url_bar.List_visible()) url_bar.Items__size_to_fit(max_results); // resize offscreen; handles 1st search when dropdown flashes briefly in middle of screen before being moved under bar; DATE:2016-03-24 if (!url_bar.List_visible()) url_bar.Items__size_to_fit(max_results); // resize offscreen; handles 1st search when dropdown flashes briefly in middle of screen before being moved under bar; DATE:2016-03-24
Srch_search_qry qry = Srch_search_qry.New__url_bar(wiki, ns_mgr, auto_wildcard, max_results, Bry_.new_u8(search_str)); Srch_search_qry qry = Srch_search_qry.New__url_bar(wiki, ns_mgr, syms, auto_wildcard, max_results, Bry_.new_u8(search_str));
Srch_rslt_cbk__url_bar cbk = new Srch_rslt_cbk__url_bar(app, url_bar, max_results); Srch_rslt_cbk__url_bar cbk = new Srch_rslt_cbk__url_bar(app, url_bar, max_results);
Xoa_app_.Usr_dlg().Prog_one("", "", "searching (please wait): ~{0}", search_str); Xoa_app_.Usr_dlg().Prog_one("", "", "searching (please wait): ~{0}", search_str);
addon.Search(qry, cbk); addon.Search(qry, cbk);
@ -93,12 +93,12 @@ public class Srch_urlbar_mgr implements Gfo_invk { // NOTE: needs to be app-leve
return this; return this;
} }
private static final String private static final String
Cfg__enabled = "xowa.addon.search.url_bar.enabled" Cfg__enabled = "xowa.gui.urlbar.search.enabled"
, Cfg__max_results = "xowa.addon.search.url_bar.max_results" , Cfg__max_results = "xowa.gui.urlbar.search.max_results"
, Cfg__auto_wildcard = "xowa.addon.search.url_bar.auto_wildcard" , Cfg__auto_wildcard = "xowa.gui.urlbar.search.auto_wildcard"
, Cfg__ns_ids = "xowa.addon.search.url_bar.ns_ids" , Cfg__ns_ids = "xowa.gui.urlbar.search.ns_ids"
, Cfg__symbols = "xowa.addon.search.url_bar.symbols" , Cfg__symbols = "xowa.gui.urlbar.search.symbols"
, Cfg__visible_rows = "xowa.addon.search.url_bar.visible_rows" , Cfg__visible_rows = "xowa.gui.urlbar.search.visible_rows"
, Cfg__jump_len = "xowa.addon.search.url_bar.jump_len" , Cfg__jump_len = "xowa.gui.urlbar.search.jump_len"
; ;
} }

@ -31,7 +31,7 @@ public class Srch_search_mgr {
private int search_count; private int search_count;
public Srch_search_mgr(Srch_search_addon addon, Xow_wiki wiki, Srch_text_parser parser) { public Srch_search_mgr(Srch_search_addon addon, Xow_wiki wiki, Srch_text_parser parser) {
this.addon = addon; this.wiki = wiki; this.addon = addon; this.wiki = wiki;
crt_parser = new Srch_crt_parser(Scanner_syms); crt_parser = new Srch_crt_parser(Srch_crt_scanner_syms.Dflt); // NOTE: hard-coded to dflt; should change to use qry.Phrase.Syms, but requires more work
// init cur_cmds with Noop cmd to make cancel logic below easier // init cur_cmds with Noop cmd to make cancel logic below easier
int len = Srch_search_qry.Tid_len; int len = Srch_search_qry.Tid_len;
@ -70,7 +70,7 @@ public class Srch_search_mgr {
public void Search_async(Cancelable cxl, Srch_search_qry qry, Srch_crt_mgr crt_mgr, Srch_rslt_cbk rslt_cbk, Srch_rslt_list rslts_list) { public void Search_async(Cancelable cxl, Srch_search_qry qry, Srch_crt_mgr crt_mgr, Srch_rslt_cbk rslt_cbk, Srch_rslt_list rslts_list) {
synchronized (mutex) { // force only one search at a time; do not (a) place around Thread_sleep; (b) reuse for any other locks synchronized (mutex) { // force only one search at a time; do not (a) place around Thread_sleep; (b) reuse for any other locks
if (++search_count > 64) this.Clear(); // lazy way of clearing memory if (++search_count > 64) this.Clear(); // lazy way of clearing memory
Srch_search_ctx ctx = new Srch_search_ctx(cxl, wiki, addon, cache__page, cache__word_counts, qry, Scanner_syms, crt_mgr, rslts_list); Srch_search_ctx ctx = new Srch_search_ctx(cxl, wiki, addon, cache__page, cache__word_counts, qry, qry.Phrase.Syms, crt_mgr, rslts_list);
ctx.Score_rng.Select_init(ctx.Rslts_needed, rslts_list.Score_bgn, rslts_list.Score_len, Srch_link_wkr.Percentile_rng__calc_adj(crt_mgr.Words_nth__len())); ctx.Score_rng.Select_init(ctx.Rslts_needed, rslts_list.Score_bgn, rslts_list.Score_len, Srch_link_wkr.Percentile_rng__calc_adj(crt_mgr.Words_nth__len()));
page_tbl_searcher.Search(ctx, rslt_cbk); page_tbl_searcher.Search(ctx, rslt_cbk);
if (cxl.Canceled()) return; if (cxl.Canceled()) return;
@ -85,5 +85,4 @@ public class Srch_search_mgr {
cache__word_counts.Clear(); cache__word_counts.Clear();
cache__rslts.Clear(); cache__rslts.Clear();
} }
public static final Srch_crt_scanner_syms Scanner_syms = Srch_crt_scanner_syms.Dflt;
} }

@ -19,27 +19,29 @@ package gplx.xowa.addons.wikis.searchs.searchers; import gplx.*; import gplx.xow
import gplx.core.btries.*; import gplx.core.btries.*;
import gplx.xowa.addons.wikis.searchs.searchers.crts.*; import gplx.xowa.addons.wikis.searchs.searchers.crts.*;
public class Srch_search_phrase { public class Srch_search_phrase {
public Srch_search_phrase(boolean wildcard, byte[] orig, byte[] compiled) { public Srch_search_phrase(boolean wildcard, byte[] orig, byte[] compiled, Srch_crt_scanner_syms syms) {
this.Orig = orig; this.Orig = orig;
this.Compiled = compiled; this.Compiled = compiled;
this.Wildcard = wildcard; this.Wildcard = wildcard;
this.Syms = syms;
} }
public final boolean Wildcard; public final boolean Wildcard;
public final byte[] Orig; // EX: "Earth" public final byte[] Orig; // EX: "Earth"
public final byte[] Compiled; // EX: "earth*" public final byte[] Compiled; // EX: "earth*"
public final Srch_crt_scanner_syms Syms;
public static Srch_search_phrase New(gplx.xowa.langs.cases.Xol_case_mgr case_mgr, byte[] orig, boolean wildcard) { public static Srch_search_phrase New(gplx.xowa.langs.cases.Xol_case_mgr case_mgr, Srch_crt_scanner_syms syms, boolean auto_wildcard, byte[] orig) {
int orig_len = orig.length; int orig_len = orig.length;
if ( orig_len > 0 // if "*" at end, remove and change to wildcard; needed for Special:Search which will send in "earth*" but "earth" needed for highlighting if ( orig_len > 0 // if "*" at end, remove and change to wildcard; needed for Special:Search which will send in "earth*" but "earth" needed for highlighting
&& orig[orig_len - 1] == Srch_crt_scanner_syms.Dflt.Wild()) { && orig[orig_len - 1] == syms.Wild()) {
orig = Bry_.Mid(orig, 0, orig_len - 1); orig = Bry_.Mid(orig, 0, orig_len - 1);
wildcard = true; auto_wildcard = true;
} }
byte[] lcase = case_mgr.Case_build_lower(orig); byte[] lcase = case_mgr.Case_build_lower(orig);
lcase = Auto_wildcard(lcase, Srch_crt_scanner_syms.Dflt); lcase = Auto_wildcard(lcase, auto_wildcard, syms);
return new Srch_search_phrase(wildcard, orig, lcase); return new Srch_search_phrase(auto_wildcard, orig, lcase, syms);
} }
public static byte[] Auto_wildcard(byte[] raw, Srch_crt_scanner_syms syms) { public static byte[] Auto_wildcard(byte[] raw, boolean auto_wildcard, Srch_crt_scanner_syms syms) {
Btrie_slim_mgr trie = syms.Trie(); Btrie_slim_mgr trie = syms.Trie();
int raw_len = raw.length; int raw_len = raw.length;
int insert_pos = -1; int insert_pos = -1;
@ -118,7 +120,8 @@ public class Srch_search_phrase {
} }
// add wildcard // add wildcard
if (insert_pos == raw_len - 1) return Bry_.Add(raw, syms.Wild()); if (insert_pos == raw_len - 1)
return auto_wildcard ? Bry_.Add(raw, syms.Wild()) : raw;
else { else {
byte[] rv = new byte[raw_len + 1]; byte[] rv = new byte[raw_len + 1];
int wildcard_pos = insert_pos + 1; int wildcard_pos = insert_pos + 1;

@ -34,13 +34,15 @@ public class Srch_search_phrase_tst {
@Test public void Escape() {fxt.Test__auto_wildcard("\\*" , "\\**");} @Test public void Escape() {fxt.Test__auto_wildcard("\\*" , "\\**");}
@Test public void Escape__incomplete() {fxt.Test__auto_wildcard("a\\" , "a\\");} @Test public void Escape__incomplete() {fxt.Test__auto_wildcard("a\\" , "a\\");}
@Test public void Escape__escaped() {fxt.Test__auto_wildcard("a\\\\" , "a\\\\*");} @Test public void Escape__escaped() {fxt.Test__auto_wildcard("a\\\\" , "a\\\\*");}
@Test public void Auto_wildcard_n() {fxt.Init__auto_wildcard_n_().Test__auto_wildcard("a", "a");}
} }
class Srch_search_phrase_fxt { class Srch_search_phrase_fxt {
private final Srch_crt_scanner_syms syms = Srch_crt_scanner_syms.Dflt; private final Srch_crt_scanner_syms syms = Srch_crt_scanner_syms.Dflt;
public Srch_search_phrase_fxt() {} private boolean auto_wildcard = true;
public Srch_search_phrase_fxt Init__auto_wildcard_n_() {this.auto_wildcard = false; return this;}
public void Test__auto_wildcard(String src_str, String expd) { public void Test__auto_wildcard(String src_str, String expd) {
byte[] src_raw = Bry_.new_u8(src_str); byte[] src_raw = Bry_.new_u8(src_str);
byte[] actl = Srch_search_phrase.Auto_wildcard(src_raw, syms); byte[] actl = Srch_search_phrase.Auto_wildcard(src_raw, auto_wildcard, syms);
Tfds.Eq(expd, String_.new_u8(actl)); Tfds.Eq(expd, String_.new_u8(actl));
} }
} }

@ -18,6 +18,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
package gplx.xowa.addons.wikis.searchs.searchers; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.wikis.*; import gplx.xowa.addons.wikis.searchs.*; package gplx.xowa.addons.wikis.searchs.searchers; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.wikis.*; import gplx.xowa.addons.wikis.searchs.*;
import gplx.xowa.wikis.domains.*; import gplx.xowa.wikis.domains.*;
import gplx.xowa.addons.wikis.searchs.gui.htmlbars.*; import gplx.xowa.addons.wikis.searchs.gui.htmlbars.*;
import gplx.xowa.addons.wikis.searchs.searchers.crts.*;
public class Srch_search_qry { public class Srch_search_qry {
public Srch_search_qry(byte tid, Srch_ns_mgr ns_mgr, Srch_search_phrase phrase, int slab_bgn, int slab_end) { public Srch_search_qry(byte tid, Srch_ns_mgr ns_mgr, Srch_search_phrase phrase, int slab_bgn, int slab_end) {
this.Tid = tid; this.Tid = tid;
@ -33,19 +34,19 @@ public class Srch_search_qry {
public final int Slab_end; // EX: 20 public final int Slab_end; // EX: 20
public static final byte Tid_len = 4, Tid__url_bar = 0, Tid__suggest_box = 1, Tid__search_page = 2, Tid__android = 3; public static final byte Tid_len = 4, Tid__url_bar = 0, Tid__suggest_box = 1, Tid__search_page = 2, Tid__android = 3;
public static Srch_search_qry New__url_bar(Xow_wiki wiki, Srch_ns_mgr ns_mgr, boolean auto_wildcard, int max_results, byte[] search_orig) { public static Srch_search_qry New__url_bar(Xow_wiki wiki, Srch_ns_mgr ns_mgr, Srch_crt_scanner_syms syms, boolean auto_wildcard, int max_results, byte[] search_orig) {
return new Srch_search_qry(Tid__url_bar, ns_mgr, Srch_search_phrase.New(wiki.Case_mgr(), search_orig, auto_wildcard), 0, max_results); return new Srch_search_qry(Tid__url_bar, ns_mgr, Srch_search_phrase.New(wiki.Case_mgr(), syms, auto_wildcard, search_orig), 0, max_results);
} }
public static Srch_search_qry New__suggest_box(Xow_wiki wiki, Srch_ns_mgr ns_mgr, int results_max, byte[] search_orig) { public static Srch_search_qry New__suggest_box(Xow_wiki wiki, Srch_ns_mgr ns_mgr, int results_max, byte[] search_orig) {
return new Srch_search_qry(Tid__suggest_box, ns_mgr, Srch_search_phrase.New(wiki.Case_mgr(), search_orig, Bool_.Y), 0, results_max); return new Srch_search_qry(Tid__suggest_box, ns_mgr, Srch_search_phrase.New(wiki.Case_mgr(), Srch_crt_scanner_syms.Dflt, Bool_.Y, search_orig), 0, results_max);
} }
public static Srch_search_qry New__search_page(Xow_domain_itm[] domains, Xow_wiki wiki, Srch_ns_mgr ns_mgr, boolean simple_search, byte[] search_orig, int slab_idx, int slab_len) { public static Srch_search_qry New__search_page(Xow_domain_itm[] domains, Xow_wiki wiki, Srch_ns_mgr ns_mgr, boolean simple_search, byte[] search_orig, int slab_idx, int slab_len) {
int slab_bgn = slab_idx * slab_len; int slab_bgn = slab_idx * slab_len;
int slab_end = slab_bgn + slab_len; int slab_end = slab_bgn + slab_len;
boolean wildcard = simple_search; boolean wildcard = simple_search;
return new Srch_search_qry(Tid__search_page, ns_mgr, Srch_search_phrase.New(wiki.Case_mgr(), search_orig, wildcard), slab_bgn, slab_end); return new Srch_search_qry(Tid__search_page, ns_mgr, Srch_search_phrase.New(wiki.Case_mgr(), Srch_crt_scanner_syms.Dflt, wildcard, search_orig), slab_bgn, slab_end);
} }
public static Srch_search_qry New__drd(Xow_wiki wiki, Srch_ns_mgr ns_mgr, byte[] search_orig, int slab_bgn, int slab_end) { public static Srch_search_qry New__drd(Xow_wiki wiki, Srch_ns_mgr ns_mgr, byte[] search_orig, int slab_bgn, int slab_end) {
return new Srch_search_qry(Tid__android, ns_mgr, Srch_search_phrase.New(wiki.Case_mgr(), search_orig, Bool_.Y), slab_bgn, slab_end); return new Srch_search_qry(Tid__android, ns_mgr, Srch_search_phrase.New(wiki.Case_mgr(), Srch_crt_scanner_syms.Dflt, Bool_.Y, search_orig), slab_bgn, slab_end);
} }
} }

@ -92,11 +92,13 @@ public class Srch_crt_scanner_syms {
if (b == Byte_ascii.Null) return; if (b == Byte_ascii.Null) return;
rv.Add_bry_byte(b, tid); rv.Add_bry_byte(b, tid);
} }
public static final Srch_crt_scanner_syms Dflt = public static Srch_crt_scanner_syms New__dflt() {
new Srch_crt_scanner_syms return new Srch_crt_scanner_syms
( Byte_ascii.Backslash, Byte_ascii.Space, Byte_ascii.Quote, Byte_ascii.Dash, Byte_ascii.Plus, Byte_ascii.Comma ( Byte_ascii.Backslash, Byte_ascii.Space, Byte_ascii.Quote, Byte_ascii.Dash, Byte_ascii.Plus, Byte_ascii.Comma
, Byte_ascii.Paren_bgn, Byte_ascii.Paren_end, Byte_ascii.Star , Byte_ascii.Paren_bgn, Byte_ascii.Paren_end, Byte_ascii.Star
); );
}
public static final Srch_crt_scanner_syms Dflt = New__dflt();
private static byte Parse__val(byte[] line, int val_bgn, int line_len) { private static byte Parse__val(byte[] line, int val_bgn, int line_len) {
if (line_len - val_bgn == 1) return line[val_bgn]; if (line_len - val_bgn == 1) return line[val_bgn];
if ( line_len - val_bgn == 2 if ( line_len - val_bgn == 2

@ -23,7 +23,6 @@ public class Xoapi_usr implements Gfo_invk {
history.Ctor_by_app(app); history.Ctor_by_app(app);
} }
public void Init_by_app(Xoa_app app) { public void Init_by_app(Xoa_app app) {
cache.Init_by_app(app);
} }
public void Init_by_kit(Xoae_app app) { public void Init_by_kit(Xoae_app app) {
bookmarks.Init_by_kit(app); bookmarks.Init_by_kit(app);
@ -31,12 +30,10 @@ public class Xoapi_usr implements Gfo_invk {
} }
public Xoapi_bookmarks Bookmarks() {return bookmarks;} private final Xoapi_bookmarks bookmarks = new Xoapi_bookmarks(); public Xoapi_bookmarks Bookmarks() {return bookmarks;} private final Xoapi_bookmarks bookmarks = new Xoapi_bookmarks();
public Xoapi_history History() {return history;} private final Xoapi_history history = new Xoapi_history(); public Xoapi_history History() {return history;} private final Xoapi_history history = new Xoapi_history();
public Xoapi_cache Cache() {return cache;} private final Xoapi_cache cache = new Xoapi_cache();
public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) {
if (ctx.Match(k, Invk_bookmarks)) return bookmarks; if (ctx.Match(k, Invk_bookmarks)) return bookmarks;
else if (ctx.Match(k, Invk_history)) return history; else if (ctx.Match(k, Invk_history)) return history;
else if (ctx.Match(k, Invk_cache)) return cache;
else return Gfo_invk_.Rv_unhandled; else return Gfo_invk_.Rv_unhandled;
} }
private static final String Invk_bookmarks = "bookmarks", Invk_history = "history", Invk_cache = "cache"; private static final String Invk_bookmarks = "bookmarks", Invk_history = "history";
} }

@ -1,45 +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.apps.apis.xowa.usrs; import gplx.*; import gplx.xowa.*; import gplx.xowa.apps.*; import gplx.xowa.apps.apis.*; import gplx.xowa.apps.apis.xowa.*;
import gplx.core.ios.*; import gplx.xowa.files.caches.*;
public class Xoapi_cache implements Gfo_invk {
private Xou_cache_mgr cache_mgr;
public void Init_by_app(Xoa_app app) {this.cache_mgr = app.User().User_db_mgr().Cache_mgr();}
private String Info() {
cache_mgr.Page_bgn();
Bry_bfr bfr = Bry_bfr_.New_w_size(255);
Keyval[] ary = cache_mgr.Info();
int len = ary.length;
for (int i = 0; i < len; ++i) {
Keyval kv = ary[i];
bfr.Add_str_a7(kv.Key()).Add_str_a7(": ").Add_str_u8(kv.Val_to_str_or_empty()).Add_byte_nl();
}
return bfr.To_str_and_clear();
}
public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) {
if (ctx.Match(k, Invk_info)) return Info();
else if (ctx.Match(k, Invk_reduce_to_min)) cache_mgr.Reduce(cache_mgr.Fsys_size_min());
else if (ctx.Match(k, Invk_reduce_to_zero)) cache_mgr.Reduce(0);
else return Gfo_invk_.Rv_unhandled;
return this;
}
private static final String
Invk_info = "info"
, Invk_reduce_to_min = "reduce_to_min" , Invk_reduce_to_zero = "reduce_to_zero"
;
}

@ -20,6 +20,9 @@ import gplx.core.primitives.*; import gplx.dbs.*; import gplx.dbs.cfgs.*;
import gplx.xowa.files.fsdb.*; import gplx.xowa.files.repos.*; import gplx.xowa.files.imgs.*; import gplx.xowa.files.fsdb.*; import gplx.xowa.files.repos.*; import gplx.xowa.files.imgs.*;
import gplx.xowa.wikis.*; import gplx.xowa.wikis.domains.*; import gplx.xowa.users.data.*; import gplx.xowa.wikis.*; import gplx.xowa.wikis.domains.*; import gplx.xowa.users.data.*;
public class Xou_cache_mgr implements Gfo_invk { public class Xou_cache_mgr implements Gfo_invk {
private long fsys_size_cur = 0;
private long fsys_size_min = Io_mgr.Len_mb * 75;
private long fsys_size_max = Io_mgr.Len_mb * 100;
private final Xoa_wiki_mgr wiki_mgr; private final Xou_cache_tbl cache_tbl; private final Db_cfg_tbl cfg_tbl; private final Bry_bfr tmp_bfr = Bry_bfr_.Reset(512); private final Xoa_wiki_mgr wiki_mgr; private final Xou_cache_tbl cache_tbl; private final Db_cfg_tbl cfg_tbl; private final Bry_bfr tmp_bfr = Bry_bfr_.Reset(512);
private final Ordered_hash hash = Ordered_hash_.New_bry(); private final Xof_url_bldr url_bldr = Xof_url_bldr.new_v2(); private final Object thread_lock = new Object(); private final Ordered_hash hash = Ordered_hash_.New_bry(); private final Xof_url_bldr url_bldr = Xof_url_bldr.new_v2(); private final Object thread_lock = new Object();
private final Io_url cache_dir; private boolean db_load_needed = true; private final Io_url cache_dir; private boolean db_load_needed = true;
@ -29,29 +32,9 @@ public class Xou_cache_mgr implements Gfo_invk {
this.cache_tbl = db_file.Tbl__cache(); this.cache_tbl = db_file.Tbl__cache();
} }
public boolean Enabled() {return enabled;} private boolean enabled = true; public void Enabled_n_() {enabled = false;} public boolean Enabled() {return enabled;} private boolean enabled = true; public void Enabled_n_() {enabled = false;}
public int Fsys_count_cur() {return hash.Count();}
public long Fsys_size_cur() {return fsys_size_cur;} private long fsys_size_cur = 0;
public long Fsys_size_min() {return fsys_size_min;} public void Fsys_size_min_(long v) {fsys_size_min = v;} private long fsys_size_min = Io_mgr.Len_mb * 75;
public long Fsys_size_max() {return fsys_size_max;} public void Fsys_size_max_(long v) {fsys_size_max = v;} private long fsys_size_max = Io_mgr.Len_mb * 100;
public Keyval[] Info() {
long view_date = Long_.Max_value;
long fsys_size = 0;
int len = hash.Count();
for (int i = 0; i < len; ++i) {
Xou_cache_itm itm = (Xou_cache_itm)hash.Get_at(i);
fsys_size += itm.File_size();
if (itm.View_date() < view_date) view_date = itm.View_date();
}
return Keyval_.Ary
( Keyval_.new_("cache folder", cache_dir.Xto_api())
, Keyval_.new_("space used", gplx.core.ios.Io_size_.To_str(fsys_size))
, Keyval_.new_("file count", len)
, Keyval_.new_("oldest file", view_date == Long_.Max_value ? "" : DateAdp_.unixtime_utc_seconds_(view_date).XtoStr_fmt_iso_8561())
);
}
public void Init_by_app(Xoa_app app) { public void Init_by_app(Xoa_app app) {
app.Cfg().Bind_many_app(this, Cfg__fsys_size_min, Cfg__fsys_size_max, Run__fsys_clear); app.Cfg().Bind_many_app(this, Cfg__fsys_size_min, Cfg__fsys_size_max);
// app.Cfg().Exec_mgr().Add(this, Run__fsys_clear); app.Cfg().Sub_many_app(this, Run__fsys_reduce_to_min, Run__fsys_clear);
} }
public Xou_cache_itm Get_or_null(Xof_fsdb_itm fsdb) {return Get_or_null(fsdb.Lnki_wiki_abrv(), fsdb.Lnki_ttl(), fsdb.Lnki_type(), fsdb.Lnki_upright(), fsdb.Lnki_w(), fsdb.Lnki_h(), fsdb.Lnki_time(), fsdb.Lnki_page(), fsdb.User_thumb_w());} public Xou_cache_itm Get_or_null(Xof_fsdb_itm fsdb) {return Get_or_null(fsdb.Lnki_wiki_abrv(), fsdb.Lnki_ttl(), fsdb.Lnki_type(), fsdb.Lnki_upright(), fsdb.Lnki_w(), fsdb.Lnki_h(), fsdb.Lnki_time(), fsdb.Lnki_page(), fsdb.User_thumb_w());}
public Xou_cache_itm Get_or_null(byte[] wiki, byte[] ttl, int type, double upright, int w, int h, double time, int page, int user_thumb_w) { public Xou_cache_itm Get_or_null(byte[] wiki, byte[] ttl, int type, double upright, int w, int h, double time, int page, int user_thumb_w) {
@ -183,15 +166,47 @@ public class Xou_cache_mgr implements Gfo_invk {
public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) {
if (ctx.Match(k, Cfg__fsys_size_min)) this.fsys_size_min = m.ReadLong("v"); if (ctx.Match(k, Cfg__fsys_size_min)) this.fsys_size_min = m.ReadLong("v");
else if (ctx.Match(k, Cfg__fsys_size_max)) this.fsys_size_max = m.ReadLong("v"); else if (ctx.Match(k, Cfg__fsys_size_max)) this.fsys_size_max = m.ReadLong("v");
// else if (ctx.Match(k, Run__fsys_clear)) this.Reduce(0); else if (ctx.Match(k, Run__fsys_reduce_to_min)) {this.Reduce(fsys_size_min);}
else if (ctx.Match(k, Run__fsys_clear)) {this.Reduce(0);}
else return Gfo_invk_.Rv_unhandled; else return Gfo_invk_.Rv_unhandled;
return this; return this;
} }
private static final String private static final String
Cfg__fsys_size_min = "xowa.wiki.files.cache.fsys_size_min" Cfg__fsys_size_min = "xowa.wiki.files.cache.fsys_size_min"
, Cfg__fsys_size_max = "xowa.wiki.files.cache.fsys_size_max" , Cfg__fsys_size_max = "xowa.wiki.files.cache.fsys_size_max"
, Run__fsys_reduce_to_min = "xowa.wiki.files.cache.reduce_to_min"
, Run__fsys_clear = "xowa.wiki.files.cache.clear" , Run__fsys_clear = "xowa.wiki.files.cache.clear"
; ;
public void Fsys_size_(long min, long max) {fsys_size_min = min; fsys_size_max = max;} // TEST:
/*
private Keyval[] Info() {
long view_date = Long_.Max_value;
long fsys_size = 0;
int len = hash.Count();
for (int i = 0; i < len; ++i) {
Xou_cache_itm itm = (Xou_cache_itm)hash.Get_at(i);
fsys_size += itm.File_size();
if (itm.View_date() < view_date) view_date = itm.View_date();
}
return Keyval_.Ary
( Keyval_.new_("cache folder", cache_dir.Xto_api())
, Keyval_.new_("space used", gplx.core.ios.Io_size_.To_str(fsys_size))
, Keyval_.new_("file count", len)
, Keyval_.new_("oldest file", view_date == Long_.Max_value ? "" : DateAdp_.unixtime_utc_seconds_(view_date).XtoStr_fmt_iso_8561())
);
}
private String Info() {
cache_mgr.Page_bgn();
Bry_bfr bfr = Bry_bfr_.New_w_size(255);
Keyval[] ary = cache_mgr.Info();
int len = ary.length;
for (int i = 0; i < len; ++i) {
Keyval kv = ary[i];
bfr.Add_str_a7(kv.Key()).Add_str_a7(": ").Add_str_u8(kv.Val_to_str_or_empty()).Add_byte_nl();
}
return bfr.To_str_and_clear();
}
*/
} }
class Xou_cache_grp { class Xou_cache_grp {
private final List_adp list = List_adp_.New(); private final List_adp list = List_adp_.New();

@ -59,6 +59,7 @@ public class Xou_cache_mgr_tst {
} }
class Xou_cache_mgr_fxt { class Xou_cache_mgr_fxt {
private Xou_cache_mgr mgr; private Xou_cache_mgr mgr;
private long cache_min;
public void Clear() { public void Clear() {
Datetime_now.Manual_(DateAdp_.new_(1970, 1, 1, 0, 0, 0, 0)); Datetime_now.Manual_(DateAdp_.new_(1970, 1, 1, 0, 0, 0, 0));
Io_mgr.Instance.InitEngine_mem(); Io_mgr.Instance.InitEngine_mem();
@ -70,8 +71,8 @@ class Xou_cache_mgr_fxt {
this.mgr = new Xou_cache_mgr(app.Wiki_mgr(), app.Fsys_mgr().File_dir(), app.User().User_db_mgr().Db_file()); this.mgr = new Xou_cache_mgr(app.Wiki_mgr(), app.Fsys_mgr().File_dir(), app.User().User_db_mgr().Db_file());
} }
public void Init_delete(long min, long max) { public void Init_delete(long min, long max) {
mgr.Fsys_size_min_(min); cache_min = min;
mgr.Fsys_size_max_(max); mgr.Fsys_size_(min, max);
} }
public Xof_fsdb_itm Make_itm(String wiki, String file, int size) { public Xof_fsdb_itm Make_itm(String wiki, String file, int size) {
Xof_fsdb_itm rv = new Xof_fsdb_itm(); Xof_fsdb_itm rv = new Xof_fsdb_itm();
@ -91,7 +92,7 @@ class Xou_cache_mgr_fxt {
mgr.Clear(); mgr.Clear();
} }
public void Exec_reduce() { public void Exec_reduce() {
mgr.Reduce(mgr.Fsys_size_min()); mgr.Reduce(cache_min);
} }
public void Test_get(Xof_fsdb_itm fsdb, int expd_view_count, long expd_view_date) { public void Test_get(Xof_fsdb_itm fsdb, int expd_view_count, long expd_view_date) {
Xou_cache_itm cache = mgr.Get_or_null(fsdb); Xou_cache_itm cache = mgr.Get_or_null(fsdb);

@ -32,7 +32,7 @@ public class Xop_section_mgr implements Gfo_invk {
public void Init_by_wiki(Xowe_wiki wiki) { public void Init_by_wiki(Xowe_wiki wiki) {
this.app = wiki.Appe(); this.app = wiki.Appe();
this.wiki = wiki; this.wiki = wiki;
this.enabled = wiki.App().Cfg().Bind_bool(wiki, Cfg__section_editing__enabled, this); wiki.App().Cfg().Bind_many_wiki(this, wiki, Cfg__section_editing__enabled);
this.tidy_mgr = wiki.Html_mgr().Tidy_mgr(); this.tidy_mgr = wiki.Html_mgr().Tidy_mgr();
} }
public byte[] Slice_section(Xoa_url url, Xoa_ttl ttl, byte[] src) { public byte[] Slice_section(Xoa_url url, Xoa_ttl ttl, byte[] src) {

Loading…
Cancel
Save