mirror of
https://github.com/gnosygnu/xowa.git
synced 2024-10-27 20:34:16 +00:00
Cfg: Refactor 'Gui - Url bar'; Add better support for buttons
This commit is contained in:
parent
74fefed754
commit
f12e3f5318
@ -31,26 +31,23 @@ public class Xocfg_mgr {
|
||||
, app.User().User_db_mgr().Conn());
|
||||
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 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(Gfo_invk sub, String ctx, String... 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_app (Gfo_invk sub, String... keys) {Bind_many(Bool_.Y, sub, Xocfg_mgr.Ctx__app, keys);}
|
||||
public void Bind_many_wiki (Gfo_invk sub, Xow_wiki wiki, String... keys) {Bind_many(Bool_.Y, sub, wiki.Domain_itm().Abrv_xo_str(), keys);}
|
||||
private void Bind_many(boolean pub, Gfo_invk sub, String ctx, String... keys) {
|
||||
try {
|
||||
for (String key : keys) {
|
||||
String val = Bind_str(ctx, key, sub);
|
||||
cache_mgr.Pub(ctx, key, val);
|
||||
cache_mgr.Sub(sub, ctx, key, key);
|
||||
if (pub) {
|
||||
String val = cache_mgr.Get(ctx, key);
|
||||
cache_mgr.Pub(ctx, key, val);
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (Exception e) {
|
||||
Gfo_usr_dlg_.Instance.Warn_many("", "", "bind failed: ctx=~{0} 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) {
|
||||
String rv = Get_str(Ctx__app, key);
|
||||
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.date = date;
|
||||
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;
|
||||
}
|
||||
public void Set_data_by_dflt() {
|
||||
|
@ -69,7 +69,7 @@ public class Xoedit_itm_html {
|
||||
, gui_type_key, gui_args, key, lines[1]);
|
||||
break;
|
||||
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;
|
||||
default:
|
||||
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 boolean auto_wildcard = true;
|
||||
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) {
|
||||
int[] ns_ids = Int_.Ary_empty;
|
||||
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
|
||||
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);
|
||||
Xoa_app_.Usr_dlg().Prog_one("", "", "searching (please wait): ~{0}", search_str);
|
||||
addon.Search(qry, cbk);
|
||||
@ -93,12 +93,12 @@ public class Srch_urlbar_mgr implements Gfo_invk { // NOTE: needs to be app-leve
|
||||
return this;
|
||||
}
|
||||
private static final String
|
||||
Cfg__enabled = "xowa.addon.search.url_bar.enabled"
|
||||
, Cfg__max_results = "xowa.addon.search.url_bar.max_results"
|
||||
, Cfg__auto_wildcard = "xowa.addon.search.url_bar.auto_wildcard"
|
||||
, Cfg__ns_ids = "xowa.addon.search.url_bar.ns_ids"
|
||||
, Cfg__symbols = "xowa.addon.search.url_bar.symbols"
|
||||
, Cfg__visible_rows = "xowa.addon.search.url_bar.visible_rows"
|
||||
, Cfg__jump_len = "xowa.addon.search.url_bar.jump_len"
|
||||
Cfg__enabled = "xowa.gui.urlbar.search.enabled"
|
||||
, Cfg__max_results = "xowa.gui.urlbar.search.max_results"
|
||||
, Cfg__auto_wildcard = "xowa.gui.urlbar.search.auto_wildcard"
|
||||
, Cfg__ns_ids = "xowa.gui.urlbar.search.ns_ids"
|
||||
, Cfg__symbols = "xowa.gui.urlbar.search.symbols"
|
||||
, Cfg__visible_rows = "xowa.gui.urlbar.search.visible_rows"
|
||||
, Cfg__jump_len = "xowa.gui.urlbar.search.jump_len"
|
||||
;
|
||||
}
|
||||
|
@ -31,7 +31,7 @@ public class Srch_search_mgr {
|
||||
private int search_count;
|
||||
public Srch_search_mgr(Srch_search_addon addon, Xow_wiki wiki, Srch_text_parser parser) {
|
||||
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
|
||||
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) {
|
||||
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
|
||||
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()));
|
||||
page_tbl_searcher.Search(ctx, rslt_cbk);
|
||||
if (cxl.Canceled()) return;
|
||||
@ -85,5 +85,4 @@ public class Srch_search_mgr {
|
||||
cache__word_counts.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.xowa.addons.wikis.searchs.searchers.crts.*;
|
||||
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.Compiled = compiled;
|
||||
this.Wildcard = wildcard;
|
||||
this.Syms = syms;
|
||||
}
|
||||
public final boolean Wildcard;
|
||||
public final byte[] Orig; // 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;
|
||||
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);
|
||||
wildcard = true;
|
||||
auto_wildcard = true;
|
||||
}
|
||||
byte[] lcase = case_mgr.Case_build_lower(orig);
|
||||
lcase = Auto_wildcard(lcase, Srch_crt_scanner_syms.Dflt);
|
||||
return new Srch_search_phrase(wildcard, orig, lcase);
|
||||
lcase = Auto_wildcard(lcase, auto_wildcard, syms);
|
||||
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();
|
||||
int raw_len = raw.length;
|
||||
int insert_pos = -1;
|
||||
@ -118,7 +120,8 @@ public class Srch_search_phrase {
|
||||
}
|
||||
|
||||
// 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 {
|
||||
byte[] rv = new byte[raw_len + 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__incomplete() {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 {
|
||||
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) {
|
||||
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));
|
||||
}
|
||||
}
|
||||
|
@ -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.*;
|
||||
import gplx.xowa.wikis.domains.*;
|
||||
import gplx.xowa.addons.wikis.searchs.gui.htmlbars.*;
|
||||
import gplx.xowa.addons.wikis.searchs.searchers.crts.*;
|
||||
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) {
|
||||
this.Tid = tid;
|
||||
@ -33,19 +34,19 @@ public class Srch_search_qry {
|
||||
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 Srch_search_qry New__url_bar(Xow_wiki wiki, Srch_ns_mgr ns_mgr, 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);
|
||||
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(), 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) {
|
||||
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) {
|
||||
int slab_bgn = slab_idx * slab_len;
|
||||
int slab_end = slab_bgn + slab_len;
|
||||
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) {
|
||||
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;
|
||||
rv.Add_bry_byte(b, tid);
|
||||
}
|
||||
public static final Srch_crt_scanner_syms Dflt =
|
||||
new Srch_crt_scanner_syms
|
||||
public static Srch_crt_scanner_syms New__dflt() {
|
||||
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.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) {
|
||||
if (line_len - val_bgn == 1) return line[val_bgn];
|
||||
if ( line_len - val_bgn == 2
|
||||
|
@ -23,7 +23,6 @@ public class Xoapi_usr implements Gfo_invk {
|
||||
history.Ctor_by_app(app);
|
||||
}
|
||||
public void Init_by_app(Xoa_app app) {
|
||||
cache.Init_by_app(app);
|
||||
}
|
||||
public void Init_by_kit(Xoae_app 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_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) {
|
||||
if (ctx.Match(k, Invk_bookmarks)) return bookmarks;
|
||||
else if (ctx.Match(k, Invk_history)) return history;
|
||||
else if (ctx.Match(k, Invk_cache)) return cache;
|
||||
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.wikis.*; import gplx.xowa.wikis.domains.*; import gplx.xowa.users.data.*;
|
||||
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 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;
|
||||
@ -29,29 +32,9 @@ public class Xou_cache_mgr implements Gfo_invk {
|
||||
this.cache_tbl = db_file.Tbl__cache();
|
||||
}
|
||||
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) {
|
||||
app.Cfg().Bind_many_app(this, Cfg__fsys_size_min, Cfg__fsys_size_max, Run__fsys_clear);
|
||||
// app.Cfg().Exec_mgr().Add(this, Run__fsys_clear);
|
||||
app.Cfg().Bind_many_app(this, Cfg__fsys_size_min, Cfg__fsys_size_max);
|
||||
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(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) {
|
||||
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, 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;
|
||||
return this;
|
||||
}
|
||||
private static final String
|
||||
Cfg__fsys_size_min = "xowa.wiki.files.cache.fsys_size_min"
|
||||
, 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"
|
||||
;
|
||||
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 {
|
||||
private final List_adp list = List_adp_.New();
|
||||
|
@ -59,6 +59,7 @@ public class Xou_cache_mgr_tst {
|
||||
}
|
||||
class Xou_cache_mgr_fxt {
|
||||
private Xou_cache_mgr mgr;
|
||||
private long cache_min;
|
||||
public void Clear() {
|
||||
Datetime_now.Manual_(DateAdp_.new_(1970, 1, 1, 0, 0, 0, 0));
|
||||
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());
|
||||
}
|
||||
public void Init_delete(long min, long max) {
|
||||
mgr.Fsys_size_min_(min);
|
||||
mgr.Fsys_size_max_(max);
|
||||
cache_min = min;
|
||||
mgr.Fsys_size_(min, max);
|
||||
}
|
||||
public Xof_fsdb_itm Make_itm(String wiki, String file, int size) {
|
||||
Xof_fsdb_itm rv = new Xof_fsdb_itm();
|
||||
@ -91,7 +92,7 @@ class Xou_cache_mgr_fxt {
|
||||
mgr.Clear();
|
||||
}
|
||||
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) {
|
||||
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) {
|
||||
this.app = wiki.Appe();
|
||||
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();
|
||||
}
|
||||
public byte[] Slice_section(Xoa_url url, Xoa_ttl ttl, byte[] src) {
|
||||
|
Loading…
Reference in New Issue
Block a user