diff --git a/.directory b/.directory new file mode 100644 index 000000000..bf0b7f12e --- /dev/null +++ b/.directory @@ -0,0 +1,7 @@ +[Dolphin] +Timestamp=2014,9,14,23,29,45 +Version=3 +ViewMode=1 + +[Settings] +HiddenFilesShown=true diff --git a/100_core/.classpath b/100_core/.classpath index 0240594b5..b1b8fc464 100644 --- a/100_core/.classpath +++ b/100_core/.classpath @@ -26,6 +26,6 @@ - + diff --git a/100_core/src_110_primitive/gplx/Bry_.java b/100_core/src_110_primitive/gplx/Bry_.java index f39235d11..b5613c161 100644 --- a/100_core/src_110_primitive/gplx/Bry_.java +++ b/100_core/src_110_primitive/gplx/Bry_.java @@ -32,15 +32,77 @@ public class Bry_ { rv[i] = (byte)ary[i]; return rv; } + public static byte[] new_ascii_(String s) { + try { + if (s == null) return null; + int s_len = s.length(); + if (s_len == 0) return Bry_.Empty; + byte[] rv = new byte[s_len]; + for (int i = 0; i < s_len; ++i) { + char c = s.charAt(i); + if (c > 128) c = '?'; + rv[i] = (byte)c; + } + return rv; + } + catch (Exception e) {throw Err_.err_(e, "invalid ASCII sequence; s={0}", s);} + } + public static byte[] new_ascii_safe_null_(String s) {return s == null ? null : new_ascii_(s);} + public static byte[] new_ascii_lang(String s) { + try {return s.getBytes("ASCII");} + catch (Exception e) {throw Err_.err_(e, "unsupported encoding");} + } public static byte[] new_utf8_(String s) { + try { + int s_len = s.length(); + int b_pos = 0; + for (int i = 0; i < s_len; ++i) { + char c = s.charAt(i); + int c_len = 0; + if ( c < 128) c_len = 1; // 1 << 7 + else if ( c < 2048) c_len = 2; // 1 << 11 + else if ( (c > 55295) // 0xD800 + && (c < 56320)) c_len = 4; // 0xDFFF + else c_len = 3; // 1 << 16 + if (c_len == 4) ++i; // surrogate is 2 wide, not 1 + b_pos += c_len; + } + byte[] rv = new byte[b_pos]; + b_pos = -1; + for (int i = 0; i < s_len; ++i) { + char c = s.charAt(i); + if ( c < 128) { + rv[++b_pos] = (byte)c; + } + else if ( c < 2048) { + rv[++b_pos] = (byte)(0xC0 | (c >> 6)); + rv[++b_pos] = (byte)(0x80 | (c & 0x3F)); + } + else if ( (c > 55295) // 0xD800 + && (c < 56320)) { // 0xDFFF + if (i >= s_len) throw Err_.new_fmt_("incomplete surrogate pair at end of String; char={0}", c); + char nxt_char = s.charAt(i + 1); + int v = 0x10000 + (c - 0xD800) * 0x400 + (nxt_char - 0xDC00); + rv[++b_pos] = (byte)(0xF0 | (v >> 18)); + rv[++b_pos] = (byte)(0x80 | (v >> 12) & 0x3F); + rv[++b_pos] = (byte)(0x80 | (v >> 6) & 0x3F); + rv[++b_pos] = (byte)(0x80 | (v & 0x3F)); + ++i; + } + else { + rv[++b_pos] = (byte)(0xE0 | (c >> 12)); + rv[++b_pos] = (byte)(0x80 | (c >> 6) & 0x3F); + rv[++b_pos] = (byte)(0x80 | (c & 0x3F)); + } + } + return rv; + } + catch (Exception e) {throw Err_.err_(e, "invalid UTF-8 sequence; s={0}", s);} + } + public static byte[] new_utf8_lang(String s) { try {return s.getBytes("UTF-8");} catch (Exception e) {throw Err_.err_(e, "unsupported encoding");} } - public static byte[] new_ascii_(String s) { - try {return s == null ? null : s.getBytes("ASCII");} - catch (Exception e) {throw Err_.err_(e, "unsupported encoding");} - } - public static byte[] new_ascii_safe_null_(String s) {return s == null ? null : new_ascii_(s);} public static byte[] Coalesce(byte[] orig, byte[] val_if_not_blank) {return Bry_.Len_eq_0(val_if_not_blank) ? orig : val_if_not_blank;} public static int While_fwd(byte[] src, byte while_byte, int bgn, int end) { for (int i = bgn; i < end; i++) diff --git a/100_core/src_110_primitive/gplx/Bry__tst.java b/100_core/src_110_primitive/gplx/Bry__tst.java index 6df074ae8..a899c7a83 100644 --- a/100_core/src_110_primitive/gplx/Bry__tst.java +++ b/100_core/src_110_primitive/gplx/Bry__tst.java @@ -248,25 +248,32 @@ public class Bry__tst { void Tst_match_bwd_any(String src, int src_end, int src_bgn, String find, boolean expd) { Tfds.Eq(expd, Bry_.Match_bwd_any(Bry_.new_ascii_(src), src_end, src_bgn, Bry_.new_ascii_(find))); } - private ByteAry_fxt fxt = new ByteAry_fxt(); + private Bry__fxt fxt = new Bry__fxt(); @Test public void Trim_end() { fxt.Test_trim_end("a " , Byte_ascii.Space, "a"); // trim.one fxt.Test_trim_end("a " , Byte_ascii.Space, "a"); // trim.many fxt.Test_trim_end("a" , Byte_ascii.Space, "a"); // trim.none fxt.Test_trim_end("" , Byte_ascii.Space, ""); // empty } - @Test public void XtoByteAry() { - fxt.Test_new_utf8_("a" , Bry_.ints_(97)); - fxt.Test_new_utf8_("a b" , Bry_.ints_(97, 32, 98)); - fxt.Test_new_utf8_("©" , Bry_.ints_(194, 169)); + @Test public void new_ascii_() { + fxt.Test_new_ascii_("a" , Bry_.ints_(97)); // one + fxt.Test_new_ascii_("abc" , Bry_.ints_(97, 98, 99)); // many + fxt.Test_new_ascii_("" , Bry_.Empty); // none + fxt.Test_new_ascii_("¢€𤭢" , Bry_.ints_(63, 63, 63, 63)); // non-ascii -> ? + } + @Test public void new_utf8_() { + fxt.Test_new_utf8_("a" , Bry_.ints_(97)); // one + fxt.Test_new_utf8_("abc" , Bry_.ints_(97, 98, 99)); // many + fxt.Test_new_utf8_("¢" , Bry_.ints_(194, 162)); // bry_len=2; cent + fxt.Test_new_utf8_("€" , Bry_.ints_(226, 130, 172)); // bry_len=3; euro + fxt.Test_new_utf8_("𤭢" , Bry_.ints_(240, 164, 173, 162)); // bry_len=3; example from en.w:UTF-8 } } -class ByteAry_fxt { +class Bry__fxt { public void Test_trim_end(String raw, byte trim, String expd) { byte[] raw_bry = Bry_.new_ascii_(raw); Tfds.Eq(expd, String_.new_utf8_(Bry_.Trim_end(raw_bry, trim, raw_bry.length))); } - public void Test_new_utf8_(String raw, byte[] expd_bry) { - Tfds.Eq_ary(expd_bry, Bry_.new_utf8_(raw)); - } + public void Test_new_utf8_(String raw, byte[] expd) {Tfds.Eq_ary(expd, Bry_.new_utf8_(raw));} + public void Test_new_ascii_(String raw, byte[] expd) {Tfds.Eq_ary(expd, Bry_.new_ascii_(raw));} } diff --git a/100_core/src_110_primitive/gplx/Bry_bfr.java b/100_core/src_110_primitive/gplx/Bry_bfr.java index e594a051f..f09bbedc6 100644 --- a/100_core/src_110_primitive/gplx/Bry_bfr.java +++ b/100_core/src_110_primitive/gplx/Bry_bfr.java @@ -123,6 +123,7 @@ public class Bry_bfr { public Bry_bfr Add_byte_eq() {return Add_byte(Byte_ascii.Eq);} public Bry_bfr Add_byte_pipe() {return Add_byte(Byte_ascii.Pipe);} public Bry_bfr Add_byte_comma() {return Add_byte(Byte_ascii.Comma);} + public Bry_bfr Add_byte_semic() {return Add_byte(Byte_ascii.Semic);} public Bry_bfr Add_byte_apos() {return Add_byte(Byte_ascii.Apos);} public Bry_bfr Add_byte_slash() {return Add_byte(Byte_ascii.Slash);} public Bry_bfr Add_byte_backslash() {return Add_byte(Byte_ascii.Backslash);} diff --git a/100_core/src_110_primitive/gplx/Long_.java b/100_core/src_110_primitive/gplx/Long_.java index 491e81bc7..0f99505ed 100644 --- a/100_core/src_110_primitive/gplx/Long_.java +++ b/100_core/src_110_primitive/gplx/Long_.java @@ -31,7 +31,7 @@ public class Long_ { }; public static String Xto_str(long v) {return Long.toString(v);} public static String Xto_str_PadBgn(long v, int reqdPlaces) {return String_.Pad(Xto_str(v), reqdPlaces, "0", true);} // ex: 1, 3 returns 001 - public static long parse_or_(String raw, int or) { + public static long parse_or_(String raw, long or) { if (raw == null) return or; try { int rawLen = String_.Len(raw); diff --git a/100_core/src_150_text/gplx/intl/Utf16__tst.java b/100_core/src_150_text/gplx/intl/Utf16__tst.java index 1d7709a20..5dc05f18c 100644 --- a/100_core/src_150_text/gplx/intl/Utf16__tst.java +++ b/100_core/src_150_text/gplx/intl/Utf16__tst.java @@ -20,8 +20,8 @@ import org.junit.*; public class Utf16__tst { private Utf16__fxt fxt = new Utf16__fxt(); @Test public void Encode_decode() { - fxt.Test_encode_decode(162, 194, 162); // cent - fxt.Test_encode_decode(8364, 226, 130, 172); // euro +// fxt.Test_encode_decode(162, 194, 162); // cent +// fxt.Test_encode_decode(8364, 226, 130, 172); // euro fxt.Test_encode_decode(150370, 240, 164, 173, 162); // example from [[UTF-8]]; should be encoded as two bytes } @Test public void Encode_as_bry_by_hex() { diff --git a/100_core/src_311_gfoObj/gplx/GfoInvkAbleCmd.java b/100_core/src_311_gfoObj/gplx/GfoInvkAbleCmd.java index fb85e50a2..939da6597 100644 --- a/100_core/src_311_gfoObj/gplx/GfoInvkAbleCmd.java +++ b/100_core/src_311_gfoObj/gplx/GfoInvkAbleCmd.java @@ -17,15 +17,13 @@ along with this program. If not, see . */ package gplx; public class GfoInvkAbleCmd { - public GfoInvkAble InvkAble() {return invkAble;} GfoInvkAble invkAble; + private GfoMsg m; + public GfoInvkAble InvkAble() {return invkAble;} private GfoInvkAble invkAble; public String Cmd() {return cmd;} private String cmd; - public Object Arg() {return arg;} Object arg; + public Object Arg() {return arg;} private Object arg; public Object Invk() { - if (this == null) return GfoInvkAble_.Rv_unhandled; return invkAble.Invk(GfsCtx._, 0, cmd, m); } - GfoMsg m; - public static final GfoInvkAbleCmd Null = new GfoInvkAbleCmd(); public static GfoInvkAbleCmd new_(GfoInvkAble invkAble, String cmd) {return arg_(invkAble, cmd, null);} public static GfoInvkAbleCmd arg_(GfoInvkAble invkAble, String cmd, Object arg) { diff --git a/140_dbs/src_110_dbQry/gplx/dbs/Db_stmt_.java b/140_dbs/src_110_dbQry/gplx/dbs/Db_stmt_.java index 95f2a4956..03d893904 100644 --- a/140_dbs/src_110_dbQry/gplx/dbs/Db_stmt_.java +++ b/140_dbs/src_110_dbQry/gplx/dbs/Db_stmt_.java @@ -50,4 +50,7 @@ public class Db_stmt_ { public static Db_stmt new_select_as_rdr(Db_provider provider, Db_qry__select_in_tbl qry) { return provider.Prepare(qry); } + public static Db_stmt new_select_as_rdr(Db_provider provider, String sql) { + return provider.Prepare(Db_qry_sql.rdr_(sql)); + } } diff --git a/150_gfui/src_700_env/gplx/gfui/Swt_kit.java b/150_gfui/src_700_env/gplx/gfui/Swt_kit.java index 9914ebbec..1adacf6f0 100644 --- a/150_gfui/src_700_env/gplx/gfui/Swt_kit.java +++ b/150_gfui/src_700_env/gplx/gfui/Swt_kit.java @@ -41,15 +41,18 @@ import org.eclipse.swt.graphics.Image; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.graphics.Rectangle; import org.eclipse.swt.widgets.Button; +import org.omg.PortableServer.THREAD_POLICY_ID; public class Swt_kit implements Gfui_kit { + private Shell shell; private String xulRunnerPath = null; - private KeyValHash ctor_args = KeyValHash.new_(); private HashAdp kit_args = HashAdp_.new_(); + private KeyValHash ctor_args = KeyValHash.new_(); private HashAdp kit_args = HashAdp_.new_(); private Swt_msg_wkr_stop msg_wkr_stop; private KeyValHash nullArgs = KeyValHash.new_(); public byte Tid() {return Gfui_kit_.Swt_tid;} public String Key() {return "swt";} + Display Swt_display() {return display;} private Display display; public Gfui_clipboard Clipboard() {return clipboard;} private Swt_clipboard clipboard; - public Display Swt_display() {return display;} private Display display; - public boolean Mode_is_shutdown() {return mode_is_shutdown;} private boolean mode_is_shutdown = false; + public boolean Mode_is_shutdown() {return mode_is_shutdown;} public void Mode_is_shutdown_y_() {mode_is_shutdown = true;} private boolean mode_is_shutdown = false; + public GfoInvkAbleCmd Kit_term_cbk() {return term_cbk;} public void Kit_term_cbk_(GfoInvkAbleCmd v) {this.term_cbk = v;} private GfoInvkAbleCmd term_cbk = GfoInvkAbleCmd.Null; public Gfui_html_cfg Html_cfg() {return html_cfg;} private Gfui_html_cfg html_cfg = new Gfui_html_cfg(); public void Cfg_set(String type, String key, Object val) { if (String_.Eq(type, Gfui_kit_.Cfg_HtmlBox)) { @@ -68,35 +71,32 @@ public class Swt_kit implements Gfui_kit { public boolean Kit_init_done() {return kit_init_done;} private boolean kit_init_done; public void Kit_init(Gfo_usr_dlg gui_wtr) { this.gui_wtr = gui_wtr; - usrMsgWkr_Stop = new Swt_UsrMsgWkr_Stop(this, gui_wtr); + msg_wkr_stop = new Swt_msg_wkr_stop(this, gui_wtr); display = new Display(); - UsrDlg_._.Reg(UsrMsgWkr_.Type_Warn, GfoConsoleWin._); - UsrDlg_._.Reg(UsrMsgWkr_.Type_Stop, usrMsgWkr_Stop); clipboard = new Swt_clipboard(display); + UsrDlg_._.Reg(UsrMsgWkr_.Type_Warn, GfoConsoleWin._); + UsrDlg_._.Reg(UsrMsgWkr_.Type_Stop, msg_wkr_stop); if (xulRunnerPath != null) System.setProperty("org.eclipse.swt.browser.XULRunnerPath", xulRunnerPath); kit_init_done = true; gui_wtr.Log_many("", "", "swt.kit.init.done"); } private Gfo_usr_dlg gui_wtr; - public void Kit_term_cbk_(GfoInvkAbleCmd v) {this.term_cbk = v;} GfoInvkAbleCmd term_cbk = GfoInvkAbleCmd.Null; public void Kit_run() { - shell.addListener(SWT.Close, new Swt_lnr_shell_close(this)); + shell.addListener(SWT.Close, new Swt_shell_close_lnr(this)); shell.open(); Cursor cursor = new Cursor(display, SWT.CURSOR_ARROW); shell.setCursor(cursor); // set cursor to hand else cursor defaults to Hourglass until mouse is moved; DATE: 2014-01-31 while (!shell.isDisposed()) { if (!display.readAndDispatch()) display.sleep(); - } + } gui_wtr.Log_many("", "", "swt.kit.term:bgn"); cursor.dispose(); gui_wtr.Log_many("", "", "swt.kit.term:cursor"); - Kit_term(); } public void Kit_term() { - mode_is_shutdown = true; // NOTE: must mark kit as shutting down, else writing to status.bar will create stack overflow exception; DATE:2014-05-05 - usrMsgWkr_Stop.Rls(); gui_wtr.Log_many("", "", "swt.kit.term:usrMsgWkr"); clipboard.Rls(); gui_wtr.Log_many("", "", "swt.kit.term:clipboard"); - display.dispose(); gui_wtr.Log_many("", "", "swt.kit.term:display"); - } private Swt_UsrMsgWkr_Stop usrMsgWkr_Stop; + msg_wkr_stop.Rls(); gui_wtr.Log_many("", "", "swt.kit.term:usrMsgWkr"); + shell.close(); + } public boolean Ask_yes_no(String grp_key, String msg_key, String fmt, Object... args) { Swt_dlg_msg dlg = (Swt_dlg_msg)New_dlg_msg(ask_fmtr.Bld_str_many(ask_bfr, fmt, args)).Init_btns_(Gfui_dlg_msg_.Btn_yes, Gfui_dlg_msg_.Btn_no).Init_ico_(Gfui_dlg_msg_.Ico_question); display.syncExec(dlg); @@ -124,9 +124,8 @@ public class Swt_kit implements Gfui_kit { this.shell = win.UnderShell(); shell.setLayout(null); GfuiWin rv = GfuiWin_.kit_(this, key, win, nullArgs); - main_win = rv; return rv; - } Shell shell; GfuiWin main_win; + } public GfuiBtn New_btn(String key, GfuiElem owner, KeyVal... args) { GfuiBtn rv = GfuiBtn_.kit_(this, key, new Swt_btn_no_border(Swt_control_.cast_or_fail(owner), ctor_args), ctor_args); owner.SubElems().Add(rv); @@ -241,17 +240,18 @@ public class Swt_kit implements Gfui_kit { control.setFont(rv); } } -class Swt_lnr_shell_close implements Listener { - public Swt_lnr_shell_close(Swt_kit kit) {this.kit = kit;} private Swt_kit kit; +class Swt_shell_close_lnr implements Listener { + public Swt_shell_close_lnr(Swt_kit kit) {this.kit = kit;} private Swt_kit kit; @Override public void handleEvent(Event event) { - if (kit.term_cbk.Cmd() == null) return; // close_cmd not defined - boolean rslt = Bool_.cast_(kit.term_cbk.Invk()); - if (!rslt) - event.doit = false; + kit.Mode_is_shutdown_y_(); // NOTE: must mark kit as shutting down, else writing to status_bar will create stack overflow; DATE:2014-05-05 + GfoInvkAbleCmd term_cbk = kit.Kit_term_cbk(); + if (term_cbk.Cmd() == null) return; // term_cbk not defined; exit + boolean rslt = Bool_.cast_(term_cbk.Invk()); // term_cbk defined; call it + if (!rslt) event.doit = false; // term_cbk canceled term; stop close } } -class Swt_UsrMsgWkr_Stop implements UsrMsgWkr, RlsAble { - public Swt_UsrMsgWkr_Stop(Swt_kit kit, Gfo_usr_dlg gui_wtr) {this.kit = kit; this.gui_wtr = gui_wtr;} Swt_kit kit; Gfo_usr_dlg gui_wtr; +class Swt_msg_wkr_stop implements UsrMsgWkr, RlsAble { + public Swt_msg_wkr_stop(Swt_kit kit, Gfo_usr_dlg gui_wtr) {this.kit = kit; this.gui_wtr = gui_wtr;} private Swt_kit kit; private Gfo_usr_dlg gui_wtr; @Override public void Rls() {this.kit = null;} public void ExecUsrMsg(int type, UsrMsg umsg) { String msg = umsg.XtoStr(); diff --git a/150_gfui/xtn/gplx/gfui/Swt_html.java b/150_gfui/xtn/gplx/gfui/Swt_html.java index db40ef4dc..05d5524a3 100644 --- a/150_gfui/xtn/gplx/gfui/Swt_html.java +++ b/150_gfui/xtn/gplx/gfui/Swt_html.java @@ -19,6 +19,7 @@ package gplx.gfui; import java.security.acl.Owner; import gplx.*; +import gplx.threads.ThreadAdp_; import org.eclipse.swt.SWT; import org.eclipse.swt.browser.*; import org.eclipse.swt.events.*; @@ -83,7 +84,14 @@ class Swt_html implements Gxw_html, Swt_control, FocusListener { public String Html_js_eval_script(String script) {return Eval_script_as_str(script);} public boolean Html_elem_img_update(String elem_id, String elem_src, int elem_width, int elem_height) { elem_src = Escape_quotes(elem_src); - return Eval_script_as_bool(kit.Html_cfg().Elem_img_update(elem_id, elem_src, elem_width, elem_height)); + int count = 0; + while (count < 5) { + boolean rv = Eval_script_as_bool(kit.Html_cfg().Elem_img_update(elem_id, elem_src, elem_width, elem_height)); + if (rv) return rv; + ThreadAdp_.Sleep(100); + count++; + } + return false; } public String Html_active_atr_get_str(String atr_key, String or) { Object rv_obj = Eval_script(kit.Html_cfg().Active_atr_get_str(atr_key)); diff --git a/150_gfui/xtn/gplx/gfui/Swt_tab_mgr.java b/150_gfui/xtn/gplx/gfui/Swt_tab_mgr.java index 957446add..c8d305acd 100644 --- a/150_gfui/xtn/gplx/gfui/Swt_tab_mgr.java +++ b/150_gfui/xtn/gplx/gfui/Swt_tab_mgr.java @@ -17,6 +17,7 @@ along with this program. If not, see . */ package gplx.gfui; import gplx.*; +import gplx.threads.ThreadAdp_; import org.eclipse.swt.*; import org.eclipse.swt.custom.*; @@ -25,7 +26,8 @@ import org.eclipse.swt.graphics.*; import org.eclipse.swt.layout.*; import org.eclipse.swt.widgets.*; public class Swt_tab_mgr implements Gxw_tab_mgr, Swt_control, FocusListener, GfoEvMgrOwner { - private GfuiInvkCmd cmd_async; // NOTE: async needed for some actions like responding to key_down and calling .setSelection; else app hangs; DATE:2014-04-30 + private GfuiInvkCmd cmd_sync; +// private GfuiInvkCmd cmd_async; // NOTE: async needed for some actions like responding to key_down and calling .setSelection; else app hangs; DATE:2014-04-30 public Swt_tab_mgr(Swt_kit kit, Swt_control owner_control, KeyValHash ctorArgs) { this.kit = kit; tab_folder = new CTabFolder(owner_control.Under_composite(), SWT.BORDER); @@ -38,7 +40,8 @@ public class Swt_tab_mgr implements Gxw_tab_mgr, Swt_control, FocusListener, Gfo new Swt_tab_mgr_lnr_drag_drop(this, tab_folder); tab_folder.addCTabFolder2Listener(new Swt_tab_mgr_lnr_close(this)); core = new Swt_core_cmds(tab_folder); - cmd_async = kit.New_cmd_async(this); +// cmd_async = kit.New_cmd_async(this); + cmd_sync = kit.New_cmd_sync(this); } public Swt_kit Kit() {return kit;} private Swt_kit kit; public CTabFolder Under_ctabFolder() {return tab_folder;} @@ -82,15 +85,15 @@ public class Swt_tab_mgr implements Gxw_tab_mgr, Swt_control, FocusListener, Gfo CTabItem itm = tab_folder.getItems()[i]; Gfui_tab_itm_data tab_data = Get_tab_data(itm); CTabItem next_tab = Tabs_select_after_closing_itm(tab_data); // NOTE: must calc next_tab before calling Pub_tab_closed; latter will recalc idx - Pub_tab_closed(tab_data.Key()); // NOTE: dispose does not call event for .close; must manually raise event; - this.Tabs_select_by_itm(next_tab); + this.Tabs_select_by_itm(next_tab); // NOTE: select tab before closing; DATE:2014-09-10 + Pub_tab_closed(tab_data.Key()); // NOTE: dispose does not call event for .close; must manually raise event; itm.dispose(); } @Override public void Tabs_select_by_idx(int i) { if (i == Gfui_tab_itm_data.Idx_null) return; // 0 tabs; return; msg_tabs_select_by_idx_swt.Clear(); msg_tabs_select_by_idx_swt.Add("v", i); - cmd_async.Invk(GfsCtx._, 0, Invk_tabs_select_by_idx_swt, msg_tabs_select_by_idx_swt); + cmd_sync.Invk(GfsCtx._, 0, Invk_tabs_select_by_idx_swt, msg_tabs_select_by_idx_swt); } private GfoMsg msg_tabs_select_by_idx_swt = GfoMsg_.new_cast_(Invk_tabs_select_by_idx_swt); @Override public void Tabs_switch(int src, int trg) {Tabs_switch(tab_folder.getItem(src), tab_folder.getItem(trg));} public boolean Tabs_switch(CTabItem src_tab_itm, CTabItem trg_tab_itm) { @@ -117,7 +120,7 @@ public class Swt_tab_mgr implements Gxw_tab_mgr, Swt_control, FocusListener, Gfo if (itm == null) return; // 0 tabs; return; msg_tabs_select_by_itm_swt.Clear(); msg_tabs_select_by_itm_swt.Add("v", itm); - cmd_async.Invk(GfsCtx._, 0, Invk_tabs_select_by_itm_swt, msg_tabs_select_by_itm_swt); + cmd_sync.Invk(GfsCtx._, 0, Invk_tabs_select_by_itm_swt, msg_tabs_select_by_itm_swt); } private GfoMsg msg_tabs_select_by_itm_swt = GfoMsg_.new_cast_(Invk_tabs_select_by_itm_swt); private void Tabs_select_by_idx_swt(int idx) { tab_folder.setSelection(idx); diff --git a/400_xowa/.classpath b/400_xowa/.classpath index 00cf0b6ab..e468907d8 100644 --- a/400_xowa/.classpath +++ b/400_xowa/.classpath @@ -28,8 +28,8 @@ - + diff --git a/400_xowa/src/gplx/core/brys/Bry_rdr.java b/400_xowa/src/gplx/core/brys/Bry_rdr.java index e92505135..f3c4582c7 100644 --- a/400_xowa/src/gplx/core/brys/Bry_rdr.java +++ b/400_xowa/src/gplx/core/brys/Bry_rdr.java @@ -32,8 +32,10 @@ public class Bry_rdr { if (find_pos != Bry_finder.Not_found) pos = find_pos; return find_pos; } - public int Read_int_to_pipe() {return Read_int_to(Byte_ascii.Pipe);} - public int Read_int_to_nl() {return Read_int_to(Byte_ascii.NewLine);} + public int Read_int_to_semic() {return Read_int_to(Byte_ascii.Semic);} + public int Read_int_to_comma() {return Read_int_to(Byte_ascii.Comma);} + public int Read_int_to_pipe() {return Read_int_to(Byte_ascii.Pipe);} + public int Read_int_to_nl() {return Read_int_to(Byte_ascii.NewLine);} public int Read_int_to(byte to_char) { int bgn = pos; int rv = 0; @@ -70,4 +72,14 @@ public class Bry_rdr { } return bgn == pos ? or_bry : Bry_.Mid(src, bgn, src_len); } + public boolean Read_yn_to_pipe() { + boolean rv = src[pos] == Byte_ascii.Ltr_y; + pos += 2; // 1 for y/n; 1 for pipe + return rv; + } + public double Read_double_to_pipe() {return Read_double_to(Byte_ascii.Pipe);} + public double Read_double_to(byte to_char) { + byte[] double_bry = Read_bry_to(to_char); + return Double_.parse_(String_.new_ascii_(double_bry)); // double will never have utf8 + } } \ No newline at end of file diff --git a/400_xowa/src/gplx/xowa/Xoa_app.java b/400_xowa/src/gplx/xowa/Xoa_app.java index 7bb980509..1642b8257 100644 --- a/400_xowa/src/gplx/xowa/Xoa_app.java +++ b/400_xowa/src/gplx/xowa/Xoa_app.java @@ -30,10 +30,11 @@ public class Xoa_app implements GfoInvkAble { cfg_mgr = new Xoa_cfg_mgr(this); api_root = new Xoapi_root(this); url_cmd_eval = new Xoa_fsys_eval(this); - fsys_mgr = new Xoa_fsys_mgr(this, root_dir, bin_dir_name); + fsys_mgr = new Xoa_fsys_mgr(root_dir, bin_dir_name); + launcher = new Launcher_app_mgr(this); + fsys_mgr.Init_by_app(launcher); user = new Xou_user(this, user_dir); log_wtr.Log_dir_(user.Fsys_mgr().App_temp_dir().GenSubDir("log")); - fsys_mgr.Temp_dir_(user.Fsys_mgr().App_temp_dir()); lang_mgr = new Xoa_lang_mgr(this); wiki_mgr = new Xoa_wiki_mgr(this); gui_mgr = new Xoa_gui_mgr(this); @@ -61,10 +62,10 @@ public class Xoa_app implements GfoInvkAble { public NumberParser Utl_num_parser() {return utl_num_parser;} private NumberParser utl_num_parser = new NumberParser(); public void Init() { stage = Xoa_stage_.Tid_init; + launcher.Init(); xtn_mgr.Init_by_app(this); log_wtr.Init(); gui_mgr.Init_by_app(); - fsys_mgr.Init(); user.Init_by_app(); file_mgr.Init_by_app(); wiki_mgr.Init_by_app(); @@ -115,7 +116,6 @@ public class Xoa_app implements GfoInvkAble { public Xop_amp_mgr Parser_amp_mgr() {return parser_amp_mgr;} private Xop_amp_mgr parser_amp_mgr = new Xop_amp_mgr(); public Xoa_thread_mgr Thread_mgr() {return thread_mgr;} private Xoa_thread_mgr thread_mgr = new Xoa_thread_mgr(); public Url_encoder_mgr Encoder_mgr() {return encoder_mgr;} private Url_encoder_mgr encoder_mgr = new Url_encoder_mgr(); - public Xoa_fsys_mgr Fsys_mgr() {return fsys_mgr;} private Xoa_fsys_mgr fsys_mgr; public Xoa_hive_mgr Hive_mgr() {return hive_mgr;} private Xoa_hive_mgr hive_mgr; public Xoa_url_parser Url_parser() {return url_parser;} private Xoa_url_parser url_parser = new Xoa_url_parser(); @@ -125,6 +125,7 @@ public class Xoa_app implements GfoInvkAble { public Xop_xnde_tag_regy Xnde_tag_regy() {return xnde_tag_regy;} private Xop_xnde_tag_regy xnde_tag_regy = new Xop_xnde_tag_regy(); public Xof_math_subst_regy Math_subst_regy() {return math_subst_regy;} private Xof_math_subst_regy math_subst_regy = new Xof_math_subst_regy(); public Gfo_usr_dlg Gui_wtr() {return gui_mgr.Browser_win().Usr_dlg();} + public Launcher_app_mgr Launcher() {return launcher;} private Launcher_app_mgr launcher; public Xoi_setup_mgr Setup_mgr() {return setup_mgr;} private Xoi_setup_mgr setup_mgr; public Gfo_msg_log Msg_log() {return msg_log;} private Gfo_msg_log msg_log = new Gfo_msg_log(Xoa_app_.Name); diff --git a/400_xowa/src/gplx/xowa/Xoa_app_.java b/400_xowa/src/gplx/xowa/Xoa_app_.java index 3222a95cc..7381058b2 100644 --- a/400_xowa/src/gplx/xowa/Xoa_app_.java +++ b/400_xowa/src/gplx/xowa/Xoa_app_.java @@ -23,7 +23,7 @@ public class Xoa_app_ { boot_mgr.Run(args); } public static final String Name = "xowa"; - public static final String Version = "1.9.2.1"; + public static final String Version = "1.9.3.1"; public static String Build_date = "2012-12-30 00:00:00"; public static String Op_sys; public static String User_agent = ""; diff --git a/400_xowa/src/gplx/xowa/apis/xowa/gui/browsers/Xoapi_info.java b/400_xowa/src/gplx/xowa/apis/xowa/gui/browsers/Xoapi_info.java index cbbaf91ad..94e4985cc 100644 --- a/400_xowa/src/gplx/xowa/apis/xowa/gui/browsers/Xoapi_info.java +++ b/400_xowa/src/gplx/xowa/apis/xowa/gui/browsers/Xoapi_info.java @@ -24,7 +24,7 @@ public class Xoapi_info implements Gfo_usr_dlg_ui_opt, GfoInvkAble { public void Clear() {app.Usr_dlg().Ui_wkr().Clear();} public void Launch() { Io_url session_fil = app.Log_wtr().Session_fil(); - app.Fsys_mgr().App_mgr().App_view_text().Run(session_fil); + app.Launcher().App_view_text().Run(session_fil); } public boolean Warn_enabled() {return warn_enabled;} private boolean warn_enabled; public boolean Note_enabled() {return note_enabled;} private boolean note_enabled; diff --git a/400_xowa/src/gplx/xowa/apps/fsys/Xoa_fsys_mgr.java b/400_xowa/src/gplx/xowa/apps/fsys/Xoa_fsys_mgr.java index 453dab33c..cf64ede77 100644 --- a/400_xowa/src/gplx/xowa/apps/fsys/Xoa_fsys_mgr.java +++ b/400_xowa/src/gplx/xowa/apps/fsys/Xoa_fsys_mgr.java @@ -17,37 +17,31 @@ along with this program. If not, see . */ package gplx.xowa.apps.fsys; import gplx.*; import gplx.xowa.*; import gplx.xowa.apps.*; public class Xoa_fsys_mgr implements GfoInvkAble { - public Xoa_fsys_mgr(Xoa_app app, Io_url root_dir, String bin_dir_name) { - this.root_dir = root_dir; - bin_any_dir = root_dir.GenSubDir("bin").GenSubDir("any"); - bin_plat_dir = root_dir.GenSubDir("bin").GenSubDir(bin_dir_name); - bin_extensions_dir = bin_any_dir.GenSubDir_nest("xowa", "xtns"); + public Xoa_fsys_mgr(Io_url root_dir, String plat_name) { + this.root_dir = root_dir; file_dir = root_dir.GenSubDir("file"); - file_dir_bry_len = file_dir.To_http_file_bry().length; wiki_dir = root_dir.GenSubDir("wiki"); + bin_plat_dir = root_dir.GenSubDir("bin").GenSubDir(plat_name); + bin_any_dir = root_dir.GenSubDir("bin").GenSubDir("any"); + bin_xtns_dir = bin_any_dir.GenSubDir_nest("xowa", "xtns"); cfg_lang_core_dir = bin_any_dir.GenSubDir_nest("xowa", "cfg", "lang", "core"); cfg_wiki_core_dir = bin_any_dir.GenSubDir_nest("xowa", "cfg", "wiki", "core"); - temp_dir = root_dir.GenSubDir("tmp"); - app_mgr = new Launcher_app_mgr(app); } public Io_url Root_dir() {return root_dir;} private final Io_url root_dir; public Io_url File_dir() {return file_dir;} private final Io_url file_dir; - public int File_dir_bry_len() {return file_dir_bry_len;} private final int file_dir_bry_len; public Io_url Wiki_dir() {return wiki_dir;} public Xoa_fsys_mgr Wiki_dir_(Io_url v) {wiki_dir = v; return this;} private Io_url wiki_dir; + public Io_url Bin_plat_dir() {return bin_plat_dir;} private final Io_url bin_plat_dir; + public Io_url Bin_any_dir() {return bin_any_dir;} private final Io_url bin_any_dir; + public Io_url Bin_xowa_dir() {return bin_any_dir.GenSubDir("xowa");} + public Io_url Bin_xtns_dir() {return bin_xtns_dir;} private final Io_url bin_xtns_dir; public Io_url Cfg_lang_core_dir() {return cfg_lang_core_dir;} private final Io_url cfg_lang_core_dir; public Io_url Cfg_wiki_core_dir() {return cfg_wiki_core_dir;} private final Io_url cfg_wiki_core_dir; - public Io_url Temp_dir() {return temp_dir;} public Xoa_fsys_mgr Temp_dir_(Io_url v) {temp_dir = v; return this;} private Io_url temp_dir; // set to /xowa/user//temp - public Io_url Bin_any_dir() {return bin_any_dir;} private final Io_url bin_any_dir; - public Io_url Bin_extensions_dir() {return bin_extensions_dir;} private final Io_url bin_extensions_dir; - public Io_url Bin_plat_dir() {return bin_plat_dir;} private final Io_url bin_plat_dir; - public Io_url Bin_db_dir() {return bin_any_dir.GenSubDir_nest("sql", "xowa");} public Io_url Bin_data_os_cfg_fil() {return bin_plat_dir.GenSubFil_nest("xowa", "cfg", Xoa_gfs_mgr.Cfg_os);} - public Launcher_app_mgr App_mgr() {return app_mgr;} Launcher_app_mgr app_mgr; - public void Init() { - app_mgr.Init(); - } + public void Init_by_app(GfoInvkAble app_mgr_invk) { + this.app_mgr_invk = app_mgr_invk; + } private GfoInvkAble app_mgr_invk; public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { - if (ctx.Match(k, Invk_apps)) return app_mgr; + if (ctx.Match(k, Invk_apps)) return app_mgr_invk; else if (ctx.Match(k, Invk_root_dir)) return root_dir; else return GfoInvkAble_.Rv_unhandled; } diff --git a/400_xowa/src/gplx/xowa/bldrs/cfgs/Xob_wiki_cfg_bldr_tst.java b/400_xowa/src/gplx/xowa/bldrs/cfgs/Xob_wiki_cfg_bldr_tst.java index c285eb782..b21e624d1 100644 --- a/400_xowa/src/gplx/xowa/bldrs/cfgs/Xob_wiki_cfg_bldr_tst.java +++ b/400_xowa/src/gplx/xowa/bldrs/cfgs/Xob_wiki_cfg_bldr_tst.java @@ -111,7 +111,7 @@ public class Xob_wiki_cfg_bldr_tst { )); String[] wikis = new String[] {"en.wikipedia.org"}; String protocol = "mem/"; Tfds.Eq_str_lines(Query_ns(protocol, gplx.ios.IoEngine_.MemKey, wikis), String_.Concat_lines_nl - ( "app.wiki_cfg_bldr.get('en.wikipedia.org').new_cmd_('wiki.ns_mgr.aliases', 'ns_mgr.add_alias_bulk(\"" + ( "app.bldr.wiki_cfg_bldr.get('en.wikipedia.org').new_cmd_('wiki.ns_mgr.aliases', 'ns_mgr.add_alias_bulk(\"" , "4|WP" , "5|WT" , "6|Image" @@ -131,7 +131,7 @@ public class Xob_wiki_cfg_bldr_tst { if (xml == null) continue; // not found gplx.xmls.XmlDoc xdoc = gplx.xmls.XmlDoc_.parse_(xml); gplx.xmls.XmlNde xnde = gplx.xmls.Xpath_.SelectFirst(xdoc.Root(), "query/namespacealiases"); - sb.Add("app.wiki_cfg_bldr.get('").Add(wiki).Add("').new_cmd_('wiki.ns_mgr.aliases', 'ns_mgr.add_alias_bulk(\"\n"); + sb.Add("app.bldr.wiki_cfg_bldr.get('").Add(wiki).Add("').new_cmd_('wiki.ns_mgr.aliases', 'ns_mgr.add_alias_bulk(\"\n"); int xndes_len = xnde.SubNdes().Count(); for (int j = 0; j < xndes_len; j++) { gplx.xmls.XmlNde ns_nde = xnde.SubNdes().FetchAt(j); diff --git a/400_xowa/src/gplx/xowa/bldrs/files/Xob_lnki_temp_wkr.java b/400_xowa/src/gplx/xowa/bldrs/files/Xob_lnki_temp_wkr.java index d1cf225ac..eb6831b8a 100644 --- a/400_xowa/src/gplx/xowa/bldrs/files/Xob_lnki_temp_wkr.java +++ b/400_xowa/src/gplx/xowa/bldrs/files/Xob_lnki_temp_wkr.java @@ -19,14 +19,15 @@ package gplx.xowa.bldrs.files; import gplx.*; import gplx.xowa.*; import gplx.xo import gplx.dbs.*; import gplx.xowa.dbs.*; import gplx.xowa.dbs.tbls.*; import gplx.xowa.pages.*; import gplx.xowa.wikis.*; import gplx.xowa.bldrs.oimgs.*; import gplx.fsdb.*; import gplx.xowa.files.*; import gplx.xowa.files.fsdb.*; import gplx.xowa.gui.*; -import gplx.xowa.parsers.lnkis.redlinks.*; import gplx.xowa.parsers.logs.*; +import gplx.xowa.parsers.lnkis.redlinks.*; import gplx.xowa.parsers.logs.*; import gplx.xowa.hdumps.*; import gplx.xowa.xtns.scribunto.*; import gplx.xowa.xtns.wdatas.*; public class Xob_lnki_temp_wkr extends Xob_dump_mgr_base implements Xop_lnki_logger { private Db_provider provider; private Db_stmt stmt; - private boolean wdata_enabled = true, xtn_ref_enabled = true, gen_html = false; + private boolean wdata_enabled = true, xtn_ref_enabled = true, gen_html, gen_hdump; private Xop_log_invoke_wkr invoke_wkr; private Xop_log_property_wkr property_wkr; private int[] ns_ids = Int_.Ary(Xow_ns_.Id_main);// , Xow_ns_.Id_category, Xow_ns_.Id_template private boolean wiki_ns_file_is_case_match_all = true; private Xow_wiki commons_wiki; + private Xob_hdump_bldr hdump_bldr; private long hdump_max = Io_mgr.Len_gb; public Xob_lnki_temp_wkr(Xob_bldr bldr, Xow_wiki wiki) {this.Cmd_ctor(bldr, wiki);} @Override public String Cmd_key() {return KEY_oimg;} public static final String KEY_oimg = "file.lnki_temp"; @Override public byte Init_redirect() {return Bool_.N_byte;} // lnki will never be found in a redirect @@ -67,6 +68,7 @@ public class Xob_lnki_temp_wkr extends Xob_dump_mgr_base implements Xop_lnki_log Fsdb_mnt_mgr trg_mnt_mgr = trg_fsdb_mgr.Mnt_mgr(); trg_mnt_mgr.Insert_to_mnt_(Fsdb_mnt_mgr.Mnt_idx_main); Fsdb_mnt_mgr.Patch(trg_mnt_mgr); // NOTE: see fsdb_make; DATE:2014-04-26 + if (gen_hdump) hdump_bldr = new Xob_hdump_bldr(wiki, provider, hdump_max); provider.Txn_mgr().Txn_bgn_if_none(); log_mgr.Txn_bgn(); } @@ -88,14 +90,19 @@ public class Xob_lnki_temp_wkr extends Xob_dump_mgr_base implements Xop_lnki_log page.Root_(root); wiki.Html_mgr().Page_wtr_mgr().Gen(ctx.Cur_page(), Xopg_view_mode.Tid_read); } + if (gen_hdump) { + page.Root_(root); + hdump_bldr.Insert_page(page); + } root.Clear(); } } - // private void Gen_html(Xop_root_tkn root, Xop_ctx ctx) {} @Override public void Exec_commit_hook() { provider.Txn_mgr().Txn_end_all_bgn_if_none(); // save lnki_temp + if (gen_hdump) hdump_bldr.Commit(); } @Override public void Exec_end_hook() { + if (gen_hdump) hdump_bldr.Bld_term(); wiki.App().Log_mgr().Txn_end(); provider.Txn_mgr().Txn_end(); } @@ -117,6 +124,7 @@ public class Xob_lnki_temp_wkr extends Xob_dump_mgr_base implements Xop_lnki_log if (ctx.Match(k, Invk_wdata_enabled_)) wdata_enabled = m.ReadYn("v"); else if (ctx.Match(k, Invk_xtn_ref_enabled_)) xtn_ref_enabled = m.ReadYn("v"); else if (ctx.Match(k, Invk_gen_html_)) gen_html = m.ReadYn("v"); + else if (ctx.Match(k, Invk_gen_hdump_)) gen_hdump = m.ReadYn("v"); else if (ctx.Match(k, Invk_ns_ids_)) ns_ids = Int_.Ary_parse(m.ReadStr("v"), "|"); else if (ctx.Match(k, Invk_ns_ids_by_aliases)) ns_ids = Xob_lnki_temp_wkr_.Ns_ids_by_aliases(wiki, m.ReadStrAry("v", "|")); else if (ctx.Match(k, Invk_property_wkr)) return this.Property_wkr(); @@ -127,7 +135,7 @@ public class Xob_lnki_temp_wkr extends Xob_dump_mgr_base implements Xop_lnki_log private static final String Invk_wdata_enabled_ = "wdata_enabled_", Invk_xtn_ref_enabled_ = "xtn_ref_enabled_" , Invk_ns_ids_ = "ns_ids_", Invk_ns_ids_by_aliases = "ns_ids_by_aliases" , Invk_invoke_wkr = "invoke_wkr", Invk_property_wkr = "property_wkr" - , Invk_gen_html_ = "gen_html_" + , Invk_gen_html_ = "gen_html_", Invk_gen_hdump_ = "gen_hdump_" ; private Xop_log_invoke_wkr Invoke_wkr() { if (invoke_wkr == null) invoke_wkr = ((Scrib_xtn_mgr)bldr.App().Xtn_mgr().Get_or_fail(Scrib_xtn_mgr.XTN_KEY)).Invoke_wkr_or_new(); diff --git a/400_xowa/src/gplx/xowa/bldrs/files/Xob_unzip_wkr.java b/400_xowa/src/gplx/xowa/bldrs/files/Xob_unzip_wkr.java index cfff30722..ff6bd59ef 100644 --- a/400_xowa/src/gplx/xowa/bldrs/files/Xob_unzip_wkr.java +++ b/400_xowa/src/gplx/xowa/bldrs/files/Xob_unzip_wkr.java @@ -20,7 +20,7 @@ public class Xob_unzip_wkr { private ProcessAdp decompress_bz2, decompress_zip, decompress_gz, process; public int Process_exit_code() {return process.Exit_code();} public byte Process_run_mode() {return process_run_mode;} public Xob_unzip_wkr Process_run_mode_(byte v) {process_run_mode = v; return this;} private byte process_run_mode = ProcessAdp.Run_mode_async; - public Xob_unzip_wkr Init(Xoa_app app) {return Init(app.Fsys_mgr().App_mgr().App_decompress_bz2(), app.Fsys_mgr().App_mgr().App_decompress_zip(), app.Fsys_mgr().App_mgr().App_decompress_gz());} + public Xob_unzip_wkr Init(Xoa_app app) {return Init(app.Launcher().App_decompress_bz2(), app.Launcher().App_decompress_zip(), app.Launcher().App_decompress_gz());} public Xob_unzip_wkr Init(ProcessAdp decompress_bz2, ProcessAdp decompress_zip, ProcessAdp decompress_gz) { this.decompress_bz2 = decompress_bz2; this.decompress_zip = decompress_zip; diff --git a/400_xowa/src/gplx/xowa/bldrs/imports/Xob_import_cfg.java b/400_xowa/src/gplx/xowa/bldrs/imports/Xob_import_cfg.java index 0ba1b515f..f553a77d8 100644 --- a/400_xowa/src/gplx/xowa/bldrs/imports/Xob_import_cfg.java +++ b/400_xowa/src/gplx/xowa/bldrs/imports/Xob_import_cfg.java @@ -40,7 +40,7 @@ public class Xob_import_cfg { Chk_file_ext(wiki.App(), src_fil_bz2, ".bz2", "xml"); Xoa_app app = wiki.App(); if (app.Setup_mgr().Dump_mgr().Import_bz2_by_stdout()) { - ProcessAdp process = app.Fsys_mgr().App_mgr().App_decompress_bz2_by_stdout(); + ProcessAdp process = app.Launcher().App_decompress_bz2_by_stdout(); return Io_stream_rdr_process.new_(process.Exe_url(), src_fil_bz2, process.Xto_process_bldr_args(src_fil_bz2.Raw())); } else diff --git a/400_xowa/src/gplx/xowa/bldrs/imports/Xobc_core_decompress_bz.java b/400_xowa/src/gplx/xowa/bldrs/imports/Xobc_core_decompress_bz.java index 3f25ae0aa..bd8c57e9c 100644 --- a/400_xowa/src/gplx/xowa/bldrs/imports/Xobc_core_decompress_bz.java +++ b/400_xowa/src/gplx/xowa/bldrs/imports/Xobc_core_decompress_bz.java @@ -41,7 +41,7 @@ public class Xobc_core_decompress_bz extends Xob_itm_basic_base implements Xob_c static final String GRP_KEY = "xowa.bldr.cmd.decompress_bz2"; public static boolean Decompress(Xoa_app app, String src_fil, Io_url trg_fil) { Io_mgr._.CreateDirIfAbsent(trg_fil.OwnerDir()); // 7zip will fail if dir does not exist - ProcessAdp decompress = app.Fsys_mgr().App_mgr().App_decompress_bz2(); + ProcessAdp decompress = app.Launcher().App_decompress_bz2(); decompress.Prog_dlg_(app.Usr_dlg()).Run_mode_(ProcessAdp.Run_mode_async); decompress.Run(src_fil, trg_fil, trg_fil.OwnerDir().Xto_api()); while (decompress.Exit_code() == ProcessAdp.Exit_init) { diff --git a/400_xowa/src/gplx/xowa/bldrs/wiki_cfgs/Xoi_wiki_props_api.java b/400_xowa/src/gplx/xowa/bldrs/wiki_cfgs/Xoi_wiki_props_api.java index bd210ae10..4b0fb8123 100644 --- a/400_xowa/src/gplx/xowa/bldrs/wiki_cfgs/Xoi_wiki_props_api.java +++ b/400_xowa/src/gplx/xowa/bldrs/wiki_cfgs/Xoi_wiki_props_api.java @@ -26,7 +26,7 @@ public class Xoi_wiki_props_api { return download_args.Exec_as_bry(src); } public void Build_cfg(Bry_bfr bfr, Xoi_wiki_props_wiki wiki) { - bfr.Add_str("app.wiki_cfg_bldr.get('").Add(wiki.Wiki_domain()).Add_str("').new_cmd_('wiki.ns_mgr.aliases', 'ns_mgr.add_alias_bulk(\"\n"); + bfr.Add_str("app.bldr.wiki_cfg_bldr.get('").Add(wiki.Wiki_domain()).Add_str("').new_cmd_('wiki.ns_mgr.aliases', 'ns_mgr.add_alias_bulk(\"\n"); int len = 0; len = wiki.Alias_ary().length; for (int i = 0; i < len; i++) { @@ -34,7 +34,7 @@ public class Xoi_wiki_props_api { bfr.Add_int_variable(alias.Id()).Add_byte_pipe().Add_str(alias.Alias()).Add_byte_nl(); } bfr.Add_str("\");');\n"); - bfr.Add_str("app.wiki_cfg_bldr.get('").Add(wiki.Wiki_domain()).Add_str("').new_cmd_('wiki.ns_mgr.subpages', \""); + bfr.Add_str("app.bldr.wiki_cfg_bldr.get('").Add(wiki.Wiki_domain()).Add_str("').new_cmd_('wiki.ns_mgr.subpages', \""); len = wiki.Ns_ary().length; boolean first = true; for (int i = 0; i < len; i++) { diff --git a/400_xowa/src/gplx/xowa/bldrs/wiki_cfgs/Xoi_wiki_props_api_tst.java b/400_xowa/src/gplx/xowa/bldrs/wiki_cfgs/Xoi_wiki_props_api_tst.java index 0fe593acb..be2c1606c 100644 --- a/400_xowa/src/gplx/xowa/bldrs/wiki_cfgs/Xoi_wiki_props_api_tst.java +++ b/400_xowa/src/gplx/xowa/bldrs/wiki_cfgs/Xoi_wiki_props_api_tst.java @@ -41,14 +41,14 @@ public class Xoi_wiki_props_api_tst { .Ns_ary_(fxt.ns_(0, false), fxt.ns_(1, true)) ); } - @Test public void Build() { +// @Test public void Build() { // fxt.Test_build(fxt.wiki_("enwiki") // .Alias_ary_(fxt.alias_(4, "WP"), fxt.alias_(5, "WT")) // .Ns_ary_(fxt.ns_(0, false), fxt.ns_(1, true)) // , ""); - } +// } // Tfds.Eq_str_lines(Query_ns(protocol, gplx.ios.IoEngine_.MemKey, wikis), String_.Concat_lines_nl -// ( "app.wiki_cfg_bldr.get('en.wikipedia.org').new_cmd_('wiki.ns_mgr.aliases', 'ns_mgr.add_alias_bulk(\"" +// ( "app.bldr.wiki_cfg_bldr.get('en.wikipedia.org').new_cmd_('wiki.ns_mgr.aliases', 'ns_mgr.add_alias_bulk(\"" // , "4|WP" // , "5|WT" // , "6|Image" diff --git a/400_xowa/src/gplx/xowa/dbs/Xodb_mgr_sql.java b/400_xowa/src/gplx/xowa/dbs/Xodb_mgr_sql.java index dbde349c4..2ee5da795 100644 --- a/400_xowa/src/gplx/xowa/dbs/Xodb_mgr_sql.java +++ b/400_xowa/src/gplx/xowa/dbs/Xodb_mgr_sql.java @@ -22,7 +22,8 @@ public class Xodb_mgr_sql implements Xodb_mgr, GfoInvkAble { private boolean html_db_enabled; public Xodb_mgr_sql(Xow_wiki wiki) { this.wiki = wiki; - fsys_mgr = new Xodb_fsys_mgr(wiki.App().Fsys_mgr().Bin_db_dir(), wiki.Fsys_mgr().Root_dir(), wiki.Domain_str()); + Io_url bin_db_dir = wiki.App().Fsys_mgr().Bin_any_dir().GenSubDir_nest("sql", "xowa"); + fsys_mgr = new Xodb_fsys_mgr(bin_db_dir, wiki.Fsys_mgr().Root_dir(), wiki.Domain_str()); load_mgr = new Xodb_load_mgr_sql(this, fsys_mgr); save_mgr = new Xodb_save_mgr_sql(this); tbl_text = new Xodb_text_tbl(this); diff --git a/400_xowa/src/gplx/xowa/dbs/tbls/Xodb_xowa_cfg_tbl.java b/400_xowa/src/gplx/xowa/dbs/tbls/Xodb_xowa_cfg_tbl.java index 2caeb3ed3..e2fc97d97 100644 --- a/400_xowa/src/gplx/xowa/dbs/tbls/Xodb_xowa_cfg_tbl.java +++ b/400_xowa/src/gplx/xowa/dbs/tbls/Xodb_xowa_cfg_tbl.java @@ -23,6 +23,7 @@ public class Xodb_xowa_cfg_tbl { Db_qry qry = Db_qry_.select_cols_(Tbl_name, Db_crt_.eq_(Fld_cfg_grp, grp), Fld_cfg_key, Fld_cfg_val); return provider.Exec_qry_as_rdr(qry); } + public long Select_val_as_long_or(String grp, String key, long or) {return Long_.parse_or_(Select_val(grp, key), or);} public int Select_val_as_int(String grp, String key) {return Int_.parse_(Select_val(grp, key));} public String Select_val(String grp, String key) {return Select_val_or(grp, key, null);} public String Select_val_or(String grp, String key, String or) { diff --git a/400_xowa/src/gplx/xowa/files/Xof_lnki_file_mgr.java b/400_xowa/src/gplx/xowa/files/Xof_lnki_file_mgr.java index a580a9b54..c2049ac75 100644 --- a/400_xowa/src/gplx/xowa/files/Xof_lnki_file_mgr.java +++ b/400_xowa/src/gplx/xowa/files/Xof_lnki_file_mgr.java @@ -22,7 +22,7 @@ public class Xof_lnki_file_mgr { private boolean page_init_needed = true; private ListAdp fsdb_list = ListAdp_.new_(); private OrderedHash xfer_list = OrderedHash_.new_bry_(); - private Xof_url_bldr url_bldr = new Xof_url_bldr().Thumbtime_dlm_dash_(); + private Xof_url_bldr url_bldr = Xof_url_bldr.new_v2_(); private Xof_img_size tmp_img_size = new Xof_img_size(); public void Clear() { page_init_needed = true; diff --git a/400_xowa/src_160_file/gplx/xowa/Xof_url_bldr.java b/400_xowa/src/gplx/xowa/files/Xof_url_bldr.java similarity index 57% rename from 400_xowa/src_160_file/gplx/xowa/Xof_url_bldr.java rename to 400_xowa/src/gplx/xowa/files/Xof_url_bldr.java index 5bea0241a..2940dbe90 100644 --- a/400_xowa/src_160_file/gplx/xowa/Xof_url_bldr.java +++ b/400_xowa/src/gplx/xowa/files/Xof_url_bldr.java @@ -15,58 +15,44 @@ 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; import gplx.*; -import gplx.gfui.*; -import gplx.xowa.files.*; +package gplx.xowa.files; import gplx.*; import gplx.xowa.*; public class Xof_url_bldr { - private Bry_bfr bfr = Bry_bfr.reset_(400); - private byte[] area; private boolean wmf_protocol_is_file; - public byte Dir_spr() {return dir_spr;} public Xof_url_bldr Dir_spr_(byte v) {dir_spr = v; return this;} private byte dir_spr; - public byte[] Root() {return root;} public Xof_url_bldr Root_(byte[] v) {root = v; return this;} private byte[] root; - public byte[] Ttl() {return ttl;} public Xof_url_bldr Ttl_(byte[] v) {ttl = v; return this;} private byte[] ttl; - public byte[] Md5() {return md5;} public Xof_url_bldr Md5_(byte[] v) {md5 = v; return this;} private byte[] md5; - public Xof_ext Ext() {return ext;} public Xof_url_bldr Ext_(Xof_ext v) {ext = v; return this;} private Xof_ext ext; - public int Width() {return width;} public Xof_url_bldr Width_(int v) {width = v; return this;} private int width; - public Xof_url_bldr Thumbtime_(double v) {thumbtime = v; return this;} private double thumbtime = Xof_doc_thumb.Null; - public Xof_url_bldr Page_(int v) {page = v; return this;} private int page = Xof_doc_page.Null; - public Xof_url_bldr Wmf_dir_hive_(boolean v) {wmf_dir_hive = v; return this;} private boolean wmf_dir_hive; - public boolean Thumb() {return thumb;} public Xof_url_bldr Thumb_(boolean v) {thumb = v; return this;} private boolean thumb; - public byte Thumbtime_dlm() {return thumbtime_dlm;} private byte thumbtime_dlm = Byte_ascii.At; - public Xof_url_bldr Thumbtime_dlm_dash_() {thumbtime_dlm = Byte_ascii.Dash; return this;} - public Xof_url_bldr Set_trg_html_(byte mode, Xof_repo_itm repo, byte[] ttl, byte[] md5, Xof_ext ext, int width, double thumbtime, int page) { - this.wmf_dir_hive = false; this.thumb = mode == Xof_repo_itm.Mode_thumb; - this.dir_spr = Byte_ascii.Slash; this.root = repo.Root_http(); this.ttl = repo.Gen_name_trg(ttl, md5, ext); this.area = repo.Mode_names()[mode]; - this.md5 = md5; this.ext = ext; this.width = width; this.thumbtime = thumbtime; this.page = page; - this.repo_dir_depth = repo.Dir_depth(); + private final Bry_bfr bfr = Bry_bfr.reset_(400); + private byte[] ttl; private byte[] md5; private Xof_ext ext; private boolean file_is_thumb; private int file_w; + private double time = Xof_doc_thumb.Null; private int page = Xof_doc_page.Null; private byte time_dlm = Byte_ascii.At; + private byte[] root; private byte dir_spr; private boolean fsys_tid_is_wnt; private boolean wmf_dir_hive; private boolean wmf_protocol_is_file; private int md5_dir_depth; private byte[] area; + public Xof_url_bldr Root_(byte[] v) {root = v; return this;} + public Xof_url_bldr Init_by_root(byte[] root, byte dir_spr, boolean wmf_dir_hive, boolean wmf_protocol_is_file, int md5_dir_depth) { + this.root = root; this.dir_spr = dir_spr; this.wmf_dir_hive = wmf_dir_hive; this.wmf_protocol_is_file = wmf_protocol_is_file; this.md5_dir_depth = md5_dir_depth; + this.fsys_tid_is_wnt = Op_sys.Cur().Tid_is_wnt(); return this; - } private int repo_dir_depth; - public Xof_url_bldr Set_src_file_(byte mode, Xof_repo_itm repo, byte[] ttl, byte[] md5, Xof_ext ext, int width, double thumbtime, int page) { - this.wmf_dir_hive = true; this.thumb = mode == Xof_repo_itm.Mode_thumb; + } + public Xof_url_bldr Init_by_itm(byte mode, byte[] ttl, byte[] md5, Xof_ext ext, int file_w, double time, int page) { + this.ttl = ttl; this.md5 = md5; this.ext = ext; this.file_w = file_w; this.time = time; this.page = page; + if (wmf_protocol_is_file && fsys_tid_is_wnt) this.ttl = Xof_repo_itm.Ttl_invalid_fsys_chars(ttl); // NOTE: changed ttl does not change md5 + this.file_is_thumb = mode == Xof_repo_itm.Mode_thumb; + this.area = Xof_repo_itm.Mode_names_key[mode]; + return this; + } + public Xof_url_bldr Init_for_src_file(byte mode, Xof_repo_itm repo, byte[] ttl, byte[] md5, Xof_ext ext, int file_w, double time, int page) { + this.wmf_dir_hive = Bool_.Y; this.file_is_thumb = mode == Xof_repo_itm.Mode_thumb; this.dir_spr = repo.Dir_spr(); this.root = repo.Root(); this.ttl = repo.Gen_name_src(ttl); this.area = repo.Mode_names()[mode]; - this.md5 = md5; this.ext = ext; this.width = width; this.thumbtime = thumbtime; this.page = page; + this.md5 = md5; this.ext = ext; this.file_w = file_w; this.time = time; this.page = page; this.wmf_protocol_is_file = repo.Tarball(); return this; } - public Xof_url_bldr Set_trg_file_(byte mode, Xof_repo_itm repo, byte[] ttl, byte[] md5, Xof_ext ext, int width, double thumbtime, int page) { - this.wmf_dir_hive = false; this.thumb = mode == Xof_repo_itm.Mode_thumb; + public Xof_url_bldr Init_for_trg_file(byte mode, Xof_repo_itm repo, byte[] ttl, byte[] md5, Xof_ext ext, int file_w, double time, int page) { + this.wmf_dir_hive = Bool_.N; this.file_is_thumb = mode == Xof_repo_itm.Mode_thumb; this.dir_spr = repo.Dir_spr(); this.root = repo.Root(); this.ttl = repo.Gen_name_trg(ttl, md5, ext); this.area = repo.Mode_names()[mode]; - this.md5 = md5; this.ext = ext; this.width = width; this.thumbtime = thumbtime; this.page = page; - this.repo_dir_depth = repo.Dir_depth(); + this.md5 = md5; this.ext = ext; this.file_w = file_w; this.time = time; this.page = page; + this.md5_dir_depth = repo.Dir_depth(); return this; } - public Xof_url_bldr Init_by_root(byte[] root, byte dir_spr, boolean wmf_dir_hive, boolean wmf_protocol_is_file, int repo_dir_depth) { - this.root = root; this.dir_spr = dir_spr; this.wmf_dir_hive = wmf_dir_hive; this.wmf_protocol_is_file = wmf_protocol_is_file; this.repo_dir_depth = repo_dir_depth; - this.fsys_tid_is_wnt = Op_sys.Cur().Tid_is_wnt(); - return this; - } private boolean fsys_tid_is_wnt; - public Xof_url_bldr Init_by_itm(byte mode, byte[] ttl, byte[] md5, Xof_ext ext, int width, double thumbtime) { - this.thumb = mode == Xof_repo_itm.Mode_thumb; - this.area = Xof_repo_itm.Mode_names_key[mode]; - this.ttl = ttl; - if (wmf_protocol_is_file && fsys_tid_is_wnt) - this.ttl = Xof_repo_itm.Ttl_invalid_fsys_chars(ttl); - this.md5 = md5; // NOTE: the md5 is the orig ttl, even if ttl gets changed b/c of invalid_chars or exceeds_len - this.ext = ext; this.width = width; this.thumbtime = thumbtime; + public Xof_url_bldr Init_for_trg_html(byte mode, Xof_repo_itm repo, byte[] ttl, byte[] md5, Xof_ext ext, int file_w, double time, int page) { + this.wmf_dir_hive = Bool_.N; this.file_is_thumb = mode == Xof_repo_itm.Mode_thumb; + this.dir_spr = Byte_ascii.Slash; this.root = repo.Root_http(); this.ttl = repo.Gen_name_trg(ttl, md5, ext); this.area = repo.Mode_names()[mode]; + this.md5 = md5; this.ext = ext; this.file_w = file_w; this.time = time; this.page = page; + this.md5_dir_depth = repo.Dir_depth(); return this; } public byte[] Xto_bry() {Bld(); byte[] rv = bfr.XtoAryAndClear(); Clear(); return rv;} @@ -74,14 +60,14 @@ public class Xof_url_bldr { public Io_url Xto_url() {Bld(); Io_url rv = Io_url_.new_fil_(bfr.XtoStr()); Clear(); return rv;} private void Bld() { Add_core(); - if (thumb) { + if (file_is_thumb) { if (wmf_dir_hive) Add_thumb_wmf(); else Add_thumb_xowa(); } } private Xof_url_bldr Add_core() { bfr.Add(root); // add root; EX: "C:\xowa\file\"; assume trailing dir_spr - if (area != null && !(wmf_dir_hive && !thumb)) // !(wmf_dir_hive && !thumb) means never add if wmf_dir_hive and orig + if (area != null && !(wmf_dir_hive && !file_is_thumb)) // !(wmf_dir_hive && !thumb) means never add if wmf_dir_hive and orig bfr.Add(area).Add_byte(dir_spr); // add area; EX: "thumb\" byte b0 = md5[0]; if (wmf_dir_hive) { @@ -89,7 +75,7 @@ public class Xof_url_bldr { bfr.Add_byte(b0).Add_byte(md5[1]).Add_byte(dir_spr); // add md5_01 EX: "01/" } else { - for (int i = 0; i < repo_dir_depth; i++) + for (int i = 0; i < md5_dir_depth; i++) bfr.Add_byte(md5[i]).Add_byte(dir_spr); // add md5_0123 EX: "0/1/2/3" } if (wmf_dir_hive) { @@ -104,13 +90,13 @@ public class Xof_url_bldr { } private Xof_url_bldr Add_thumb_xowa() { bfr.Add_byte(dir_spr); // add dir_spr; EX: "\" - bfr.Add_int_variable(width).Add(Bry_px); // add width; EX: "220px" - if (Xof_doc_thumb.Null_n(thumbtime)) - bfr.Add_byte(thumbtime_dlm).Add_str(Xof_doc_thumb.X_str(thumbtime)); // add thumbtime EX: "@5" + bfr.Add_int_variable(file_w).Add(Bry_px); // add file_w; EX: "220px" + if (Xof_doc_thumb.Null_n(time)) + bfr.Add_byte(time_dlm).Add_str(Xof_doc_thumb.X_str(time)); // add time EX: "@5" else if (page != Xof_doc_page.Null) bfr.Add_byte(Byte_ascii.Dash).Add_int_variable(page); // add page EX: "-5" bfr.Add_byte(Byte_ascii.Dot); // add . EX: "." - if (thumb) + if (file_is_thumb) bfr.Add(ext.Ext_view()); // add view_ext EX: ".png" else bfr.Add(ext.Ext()); // add orig_ext EX: ".svg" @@ -123,25 +109,25 @@ public class Xof_url_bldr { case Xof_ext_.Id_ogg: case Xof_ext_.Id_ogv: case Xof_ext_.Id_webm: - if (Xof_doc_thumb.Null_n(thumbtime)) - bfr.Add(Bry_seek).Add_str(Xof_doc_thumb.X_str(thumbtime)).Add_byte(Byte_ascii.Dash);// add seek; EX: "seek%3D5-" + if (Xof_doc_thumb.Null_n(time)) + bfr.Add(Bry_seek).Add_str(Xof_doc_thumb.X_str(time)).Add_byte(Byte_ascii.Dash);// add seek; EX: "seek%3D5-" else bfr.Add(Bry_mid); // add mid; EX: "mid-" break; case Xof_ext_.Id_tif: case Xof_ext_.Id_tiff: Add_thumb_wmf_page(Bry_lossy_page1, Bry_lossy_page); - bfr.Add_int_variable(width); // add file_w; EX: "220" + bfr.Add_int_variable(file_w); // add file_w; EX: "220" bfr.Add(Bry_px_dash); // add px; EX: "px-" break; case Xof_ext_.Id_pdf: case Xof_ext_.Id_djvu: Add_thumb_wmf_page(Bry_page1, Bry_page); - bfr.Add_int_variable(width); // add file_w; EX: "220" + bfr.Add_int_variable(file_w); // add file_w; EX: "220" bfr.Add(Bry_px_dash); // add px; EX: "px-" break; default: - bfr.Add_int_variable(width); // add file_w; EX: "220" + bfr.Add_int_variable(file_w); // add file_w; EX: "220" bfr.Add(Bry_px_dash); // add px; EX: "px-" break; } @@ -166,21 +152,22 @@ public class Xof_url_bldr { } private void Add_thumb_wmf_page(byte[] bry_page_1, byte[] bry_page) { if (Xof_doc_thumb.Null_y(page)) - bfr.Add(bry_page_1); // add "lossy-page1-" EX: "lossy-page1-" + bfr.Add(bry_page_1); // add "lossy-page1-" EX: "lossy-page1-" else { - bfr.Add(bry_page); // add "lossy-page" EX: "lossy-page" - bfr.Add_int_variable(page); // add page EX: 123 - bfr.Add_byte(Byte_ascii.Dash); // add - EX: "-" + bfr.Add(bry_page); // add "lossy-page" EX: "lossy-page" + bfr.Add_int_variable(page); // add page EX: 123 + bfr.Add_byte(Byte_ascii.Dash); // add - EX: "-" } } private Xof_url_bldr Clear() { root = area = ttl = md5 = null; - width = 0; thumbtime = Xof_doc_thumb.Null; + file_w = 0; time = Xof_doc_thumb.Null; ext = null; bfr.Clear(); return this; } - public static final byte[] Bry_reg = Bry_.new_ascii_("reg.csv") + public static final byte[] + Bry_reg = Bry_.new_ascii_("reg.csv") , Bry_px = Bry_.new_ascii_("px"), Bry_px_dash = Bry_.new_ascii_("px-") , Bry_thumb = Bry_.new_ascii_("thumb"), Bry_mid = Bry_.new_ascii_("mid-") ; @@ -189,5 +176,9 @@ public class Xof_url_bldr { , Bry_lossy_page1 = Bry_.new_ascii_("lossy-page1-"), Bry_page1 = Bry_.new_ascii_("page1-"), Bry_seek = Bry_.new_ascii_("seek%3D"); public static final Xof_url_bldr Temp = new Xof_url_bldr(); private static final Url_encoder encoder_src_http = Url_encoder.new_http_url_(); // NOTE: changed from new_html_href_mw_ to new_url_ on 2012-11-19; issues with A%2Cb becoming A%252Cb - public static Xof_url_bldr new_v2_() {return new Xof_url_bldr().Thumbtime_dlm_dash_();} + public static Xof_url_bldr new_v2_() { + Xof_url_bldr rv = new Xof_url_bldr(); + rv.time_dlm = Byte_ascii.Dash; + return rv; + } } diff --git a/400_xowa/src_160_file/gplx/xowa/Xof_url_bldr_tst.java b/400_xowa/src/gplx/xowa/files/Xof_url_bldr_tst.java similarity index 75% rename from 400_xowa/src_160_file/gplx/xowa/Xof_url_bldr_tst.java rename to 400_xowa/src/gplx/xowa/files/Xof_url_bldr_tst.java index 22c8afaf9..821630b0d 100644 --- a/400_xowa/src_160_file/gplx/xowa/Xof_url_bldr_tst.java +++ b/400_xowa/src/gplx/xowa/files/Xof_url_bldr_tst.java @@ -15,19 +15,17 @@ 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; import gplx.*; -import org.junit.*; -import gplx.gfui.*; -import gplx.xowa.files.*; +package gplx.xowa.files; import gplx.*; import gplx.xowa.*; +import org.junit.*; import gplx.xowa.files.*; public class Xof_url_bldr_tst { - Xof_url_bldr_fxt fxt = new Xof_url_bldr_fxt(); + private Xof_url_bldr_fxt fxt = new Xof_url_bldr_fxt(); @Before public void init() {fxt.ini();} - @Test public void Ogv() {fxt.Dir_spr_http_().Root_("http://test/").Md5_("d0").Ttl_("A.ogv").Expd_src_("http://test/d/d0/A.ogv/mid-A.ogv.jpg").tst();} - @Test public void Ogv_seek() {fxt.Dir_spr_http_().Root_("http://test/").Md5_("d0").Ttl_("A.ogv").Expd_src_("http://test/d/d0/A.ogv/seek%3D5-A.ogv.jpg").Seek_(5).tst();} - @Test public void Xcf() {fxt.Dir_spr_http_().Root_("http://test/").Md5_("44").Ttl_("A.xcf").Expd_src_("http://test/4/44/A.xcf/0px-A.xcf.png").tst();} - @Test public void Bmp() {fxt.Dir_spr_http_().Root_("http://test/").Md5_("70").Ttl_("A.bmp").Expd_src_("http://test/7/70/A.bmp/0px-A.bmp.png").tst();} - @Test public void Pdf_none() {fxt.Dir_spr_http_().Root_("http://test/").Md5_("ef").Ttl_("A.pdf").Expd_src_("http://test/e/ef/A.pdf/page1-0px-A.pdf.jpg").tst();} - @Test public void Pdf_page_2() {fxt.Dir_spr_http_().Root_("http://test/").Md5_("ef").Ttl_("A.pdf").Page_(2).Expd_src_("http://test/e/ef/A.pdf/page2-0px-A.pdf.jpg").tst();} + @Test public void Ogv() {fxt.Dir_spr_http_().Root_("http://test/").Md5_("d0").Ttl_("A.ogv").Expd_src_("http://test/thumb/d/d0/A.ogv/mid-A.ogv.jpg").tst();} + @Test public void Ogv_seek() {fxt.Dir_spr_http_().Root_("http://test/").Md5_("d0").Ttl_("A.ogv").Expd_src_("http://test/thumb/d/d0/A.ogv/seek%3D5-A.ogv.jpg").Seek_(5).tst();} + @Test public void Xcf() {fxt.Dir_spr_http_().Root_("http://test/").Md5_("44").Ttl_("A.xcf").Expd_src_("http://test/thumb/4/44/A.xcf/0px-A.xcf.png").tst();} + @Test public void Bmp() {fxt.Dir_spr_http_().Root_("http://test/").Md5_("70").Ttl_("A.bmp").Expd_src_("http://test/thumb/7/70/A.bmp/0px-A.bmp.png").tst();} + @Test public void Pdf_none() {fxt.Dir_spr_http_().Root_("http://test/").Md5_("ef").Ttl_("A.pdf").Expd_src_("http://test/thumb/e/ef/A.pdf/page1-0px-A.pdf.jpg").tst();} + @Test public void Pdf_page_2() {fxt.Dir_spr_http_().Root_("http://test/").Md5_("ef").Ttl_("A.pdf").Page_(2).Expd_src_("http://test/thumb/e/ef/A.pdf/page2-0px-A.pdf.jpg").tst();} } class Xof_url_bldr_fxt { public Xof_url_bldr_fxt ini() {this.Clear(); return this;} @@ -47,7 +45,8 @@ class Xof_url_bldr_fxt { page = Xof_doc_page.Null; } public Xof_url_bldr_fxt tst() { - url_bldr.Wmf_dir_hive_(true).Thumb_(true).Dir_spr_(dir_spr).Root_(Bry_.new_utf8_(root)).Md5_(Bry_.new_utf8_(md5)).Ttl_(Bry_.new_utf8_(ttl)).Ext_(ext).Thumbtime_(seek).Page_(page); + url_bldr.Init_by_root(Bry_.new_utf8_(root), dir_spr, Bool_.Y, Bool_.N, 2); + url_bldr.Init_by_itm (Xof_repo_itm.Mode_thumb, Bry_.new_utf8_(ttl), Bry_.new_utf8_(md5), ext, 0, seek, page); Tfds.Eq(expd_src, url_bldr.Xto_str()); return this; } diff --git a/400_xowa/src/gplx/xowa/files/Xof_xfer_itm.java b/400_xowa/src/gplx/xowa/files/Xof_xfer_itm.java index c90a2a8f7..90319c0c6 100644 --- a/400_xowa/src/gplx/xowa/files/Xof_xfer_itm.java +++ b/400_xowa/src/gplx/xowa/files/Xof_xfer_itm.java @@ -53,8 +53,8 @@ public class Xof_xfer_itm implements Xof_file_itm { } private Xof_repo_itm trg_repo; public int Trg_repo_idx() {return trg_repo_idx;} public Xof_xfer_itm Trg_repo_idx_(int trg_repo_idx) {this.trg_repo_idx = trg_repo_idx; return this;} private int trg_repo_idx = Xof_meta_itm.Repo_unknown; public byte[] Trg_repo_root() {return trg_repo_root;} private byte[] trg_repo_root = Bry_.Empty; // HACK: needed for hdump - private byte[] Trg_html(byte mode_id, int width) {return url_bldr.Set_trg_html_(mode_id, trg_repo, lnki_ttl, lnki_md5, lnki_ext, width, lnki_thumbtime, lnki_page).Xto_bry();} - public Io_url Trg_file(byte mode_id, int width) {return url_bldr.Set_trg_file_(mode_id, trg_repo, lnki_ttl, lnki_md5, lnki_ext, width, lnki_thumbtime, lnki_page).Xto_url();} + private byte[] Trg_html(byte mode_id, int width) {return url_bldr.Init_for_trg_html(mode_id, trg_repo, lnki_ttl, lnki_md5, lnki_ext, width, lnki_thumbtime, lnki_page).Xto_bry();} + public Io_url Trg_file(byte mode_id, int width) {return url_bldr.Init_for_trg_file(mode_id, trg_repo, lnki_ttl, lnki_md5, lnki_ext, width, lnki_thumbtime, lnki_page).Xto_url();} public Xof_url_bldr Url_bldr(){ return url_bldr;} public Xof_xfer_itm Url_bldr_(Xof_url_bldr v) {url_bldr = v; return this;} private Xof_url_bldr url_bldr = Xof_url_bldr.Temp; public Xof_xfer_itm Clear() { diff --git a/400_xowa/src/gplx/xowa/files/bins/Xof_bin_mgr.java b/400_xowa/src/gplx/xowa/files/bins/Xof_bin_mgr.java index 34113713c..52a3c79d5 100644 --- a/400_xowa/src/gplx/xowa/files/bins/Xof_bin_mgr.java +++ b/400_xowa/src/gplx/xowa/files/bins/Xof_bin_mgr.java @@ -95,8 +95,8 @@ public class Xof_bin_mgr implements GfoInvkAble { private Io_url Get_url(Xof_fsdb_itm itm, byte mode, boolean src) { Xof_repo_pair repo = repo_mgr.Repos_get_by_wiki(itm.Orig_wiki()); return src - ? url_bldr.Set_src_file_(mode, repo.Src(), itm.Lnki_ttl(), itm.Lnki_md5(), itm.Lnki_ext(), itm.Html_w(), itm.Lnki_thumbtime(), itm.Lnki_page()).Xto_url() - : url_bldr.Set_trg_file_(mode, repo.Trg(), itm.Lnki_ttl(), itm.Lnki_md5(), itm.Lnki_ext(), itm.Html_w(), itm.Lnki_thumbtime(), itm.Lnki_page()).Xto_url() + ? url_bldr.Init_for_src_file(mode, repo.Src(), itm.Lnki_ttl(), itm.Lnki_md5(), itm.Lnki_ext(), itm.Html_w(), itm.Lnki_thumbtime(), itm.Lnki_page()).Xto_url() + : url_bldr.Init_for_trg_file(mode, repo.Trg(), itm.Lnki_ttl(), itm.Lnki_md5(), itm.Lnki_ext(), itm.Html_w(), itm.Lnki_thumbtime(), itm.Lnki_page()).Xto_url() ; } public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { diff --git a/400_xowa/src/gplx/xowa/files/bins/Xof_bin_wkr_fsys_base.java b/400_xowa/src/gplx/xowa/files/bins/Xof_bin_wkr_fsys_base.java index 8013c49cb..769ab0182 100644 --- a/400_xowa/src/gplx/xowa/files/bins/Xof_bin_wkr_fsys_base.java +++ b/400_xowa/src/gplx/xowa/files/bins/Xof_bin_wkr_fsys_base.java @@ -23,17 +23,17 @@ public abstract class Xof_bin_wkr_fsys_base implements Xof_bin_wkr, GfoInvkAble public boolean Bin_wkr_resize() {return bin_wkr_resize;} public void Bin_wkr_resize_(boolean v) {bin_wkr_resize = v;} private boolean bin_wkr_resize = false; public gplx.ios.Io_stream_rdr Bin_wkr_get_as_rdr(ListAdp temp_files, Xof_fsdb_itm itm, boolean is_thumb, int w) { byte mode = is_thumb ? Xof_repo_itm.Mode_thumb : Xof_repo_itm.Mode_orig; - Io_url src_url = this.Get_src_url(mode, String_.new_utf8_(itm.Orig_wiki()), itm.Lnki_ttl(), itm.Lnki_md5(), itm.Lnki_ext(), w, itm.Lnki_thumbtime()); + Io_url src_url = this.Get_src_url(mode, String_.new_utf8_(itm.Orig_wiki()), itm.Lnki_ttl(), itm.Lnki_md5(), itm.Lnki_ext(), w, itm.Lnki_thumbtime(), itm.Lnki_page()); return (src_url == Io_url_.Null) ? gplx.ios.Io_stream_rdr_.Null : gplx.ios.Io_stream_rdr_.file_(src_url); } public boolean Bin_wkr_get_to_url(ListAdp temp_files, Xof_fsdb_itm itm, boolean is_thumb, int w, Io_url bin_url) { byte mode = is_thumb ? Xof_repo_itm.Mode_thumb : Xof_repo_itm.Mode_orig; - Io_url src_url = this.Get_src_url(mode, String_.new_utf8_(itm.Orig_wiki()), itm.Lnki_ttl(), itm.Lnki_md5(), itm.Lnki_ext(), w, itm.Lnki_thumbtime()); + Io_url src_url = this.Get_src_url(mode, String_.new_utf8_(itm.Orig_wiki()), itm.Lnki_ttl(), itm.Lnki_md5(), itm.Lnki_ext(), w, itm.Lnki_thumbtime(), itm.Lnki_page()); if (src_url == Io_url_.Null) return false; byte[] bin = Io_mgr._.LoadFilBry(src_url); return bin != Io_mgr.LoadFilBry_fail; } - protected abstract Io_url Get_src_url(byte mode, String wiki, byte[] ttl_wo_ns, byte[] md5, Xof_ext ext, int w, double thumbtime); + protected abstract Io_url Get_src_url(byte mode, String wiki, byte[] ttl_wo_ns, byte[] md5, Xof_ext ext, int w, double time, int page); public abstract void Url_(Io_url v); public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { if (ctx.Match(k, Invk_url_)) this.Url_(m.ReadIoUrl("v")); @@ -45,8 +45,8 @@ abstract class Xof_bin_wkr_fsys_wmf_base extends Xof_bin_wkr_fsys_base { public Xof_url_bldr Url_bldr() {return url_bldr;} private Xof_url_bldr url_bldr = new Xof_url_bldr(); public abstract void Init_by_root(); @Override public void Url_(Io_url v) {url_bldr.Root_(Bry_.new_utf8_(v.Raw()));} - @Override protected Io_url Get_src_url(byte mode, String wiki, byte[] ttl_wo_ns, byte[] md5, Xof_ext ext, int w, double thumbtime) { - return this.Url_bldr().Init_by_itm(mode, ttl_wo_ns, md5, ext, w, thumbtime).Xto_url(); + @Override protected Io_url Get_src_url(byte mode, String wiki, byte[] ttl_wo_ns, byte[] md5, Xof_ext ext, int w, double time, int page) { + return this.Url_bldr().Init_by_itm(mode, ttl_wo_ns, md5, ext, w, time, page).Xto_url(); } } class Xof_bin_wkr_fsys_wmf extends Xof_bin_wkr_fsys_wmf_base { diff --git a/400_xowa/src/gplx/xowa/files/bins/Xof_bin_wkr_http_wmf.java b/400_xowa/src/gplx/xowa/files/bins/Xof_bin_wkr_http_wmf.java index 7a836a1ad..7f92664c1 100644 --- a/400_xowa/src/gplx/xowa/files/bins/Xof_bin_wkr_http_wmf.java +++ b/400_xowa/src/gplx/xowa/files/bins/Xof_bin_wkr_http_wmf.java @@ -48,7 +48,7 @@ public class Xof_bin_wkr_http_wmf implements Xof_bin_wkr { Xof_repo_pair repo_itm = repo_mgr.Repos_get_by_wiki(itm.Orig_wiki()); String queue_msg = String_.Format("downloading ~{0} of ~{1}: ~{2};", 0, 0, String_.new_utf8_(itm.Lnki_ttl())); download.Prog_fmt_hdr_(queue_msg); - String src = url_bldr.Set_src_file_(mode, repo_itm.Src(), itm.Lnki_ttl(), itm.Lnki_md5(), itm.Lnki_ext(), w, itm.Lnki_thumbtime(), itm.Lnki_page()).Xto_str(); + String src = url_bldr.Init_for_src_file(mode, repo_itm.Src(), itm.Lnki_ttl(), itm.Lnki_md5(), itm.Lnki_ext(), w, itm.Lnki_thumbtime(), itm.Lnki_page()).Xto_str(); download.Init(src, bin_url); } public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { diff --git a/400_xowa/src/gplx/xowa/files/fsdb/Xof_fsdb_itm.java b/400_xowa/src/gplx/xowa/files/fsdb/Xof_fsdb_itm.java index 8eaf496ca..ab2f959d1 100644 --- a/400_xowa/src/gplx/xowa/files/fsdb/Xof_fsdb_itm.java +++ b/400_xowa/src/gplx/xowa/files/fsdb/Xof_fsdb_itm.java @@ -91,8 +91,8 @@ public class Xof_fsdb_itm { byte[] name_bry = Bry_.Len_eq_0(orig_redirect) ? lnki_ttl : orig_redirect; if (!lnki_ext.Id_is_media() && lnki_thumbtime != Xof_doc_thumb.Null) // file is not media, but has thumbtime; this check can't be moved to Lnki_thumbtime_() b/c it needs ext lnki_thumbtime = Xof_doc_thumb.Null; // set thumbtime to null; needed else url will reference thumbtime; PAGE:en.w:Moon; EX:[[File:Lunar libration with phase Oct 2007 450px.gif|thumbtime=0:02]]; DATE:2014-07-20 - html_url = url_bldr.Set_trg_file_(lnki_type_as_mode, repo, name_bry, lnki_md5, lnki_ext, html_w, lnki_thumbtime, lnki_page).Xto_url(); - html_orig_url = url_bldr.Set_trg_file_(Xof_repo_itm.Mode_orig, repo, name_bry, lnki_md5, lnki_ext, Xof_img_size.Size_null_deprecated, Xof_doc_thumb.Null, Xof_doc_page.Null).Xto_url(); + html_url = url_bldr.Init_for_trg_file(lnki_type_as_mode, repo, name_bry, lnki_md5, lnki_ext, html_w, lnki_thumbtime, lnki_page).Xto_url(); + html_orig_url = url_bldr.Init_for_trg_file(Xof_repo_itm.Mode_orig, repo, name_bry, lnki_md5, lnki_ext, Xof_img_size.Size_null_deprecated, Xof_doc_thumb.Null, Xof_doc_page.Null).Xto_url(); } public Io_url Html_orig_url() {return html_orig_url;} public Xof_fsdb_itm Html_orig_url_(Io_url v) {this.html_orig_url = v; return this;} private Io_url html_orig_url = Io_url_.Null; public int Gallery_mgr_h() {return gallery_mgr_h;} public Xof_fsdb_itm Gallery_mgr_h_(int v) {gallery_mgr_h = v; return this;} private int gallery_mgr_h = Int_.Neg1; diff --git a/400_xowa/src/gplx/xowa/files/fsdb/caches/Cache_fil_mgr.java b/400_xowa/src/gplx/xowa/files/fsdb/caches/Cache_fil_mgr.java index 8ff82b36f..fc33dc803 100644 --- a/400_xowa/src/gplx/xowa/files/fsdb/caches/Cache_fil_mgr.java +++ b/400_xowa/src/gplx/xowa/files/fsdb/caches/Cache_fil_mgr.java @@ -127,7 +127,7 @@ class Cache_fil_mgr { byte[] ttl = itm.Fil_name(); byte[] md5 = Xof_xfer_itm_.Md5_(ttl); int itm_ext_id = itm.Fil_ext().Id(); - Io_url fil_url = url_bldr.Set_trg_file_(mode_id, trg_repo, ttl, md5, itm.Fil_ext(), itm.Fil_w() + Io_url fil_url = url_bldr.Init_for_trg_file(mode_id, trg_repo, ttl, md5, itm.Fil_ext(), itm.Fil_w() , Xof_doc_thumb.Convert_to_xowa_thumbtime (itm_ext_id, itm.Fil_thumbtime()) , Xof_doc_thumb.Convert_to_xowa_page (itm_ext_id, itm.Fil_thumbtime()) ).Xto_url(); diff --git a/400_xowa/src/gplx/xowa/files/wiki_orig/Xof_wiki_orig_tbl_in_wkr.java b/400_xowa/src/gplx/xowa/files/wiki_orig/Xof_wiki_orig_tbl_in_wkr.java index dd232b92c..402922911 100644 --- a/400_xowa/src/gplx/xowa/files/wiki_orig/Xof_wiki_orig_tbl_in_wkr.java +++ b/400_xowa/src/gplx/xowa/files/wiki_orig/Xof_wiki_orig_tbl_in_wkr.java @@ -75,7 +75,7 @@ class Xof_wiki_orig_tbl_evaluator { if (Bry_.Len_gt_0(regy_itm.Orig_redirect())) // redirect exists; fsdb_itm.Init_by_redirect(regy_itm.Orig_redirect()); fsdb_itm.Html_size_calc(img_size, exec_tid); - Io_url html_url = url_bldr.Set_trg_file_(fsdb_itm.Lnki_type_as_mode(), repo, fsdb_itm.Lnki_ttl(), fsdb_itm.Lnki_md5(), fsdb_itm.Lnki_ext(), fsdb_itm.Html_w(), fsdb_itm.Lnki_thumbtime(), fsdb_itm.Lnki_page()).Xto_url(); + Io_url html_url = url_bldr.Init_for_trg_file(fsdb_itm.Lnki_type_as_mode(), repo, fsdb_itm.Lnki_ttl(), fsdb_itm.Lnki_md5(), fsdb_itm.Lnki_ext(), fsdb_itm.Html_w(), fsdb_itm.Lnki_thumbtime(), fsdb_itm.Lnki_page()).Xto_url(); fsdb_itm.Html_url_(html_url); if (!Io_mgr._.ExistsFil(html_url)) fsdb_itm.Rslt_reg_(Xof_wiki_orig_wkr_.Tid_missing_reg); diff --git a/400_xowa/src/gplx/xowa/gui/urls/Xog_url_wkr.java b/400_xowa/src/gplx/xowa/gui/urls/Xog_url_wkr.java index f92b72986..12d0cb52f 100644 --- a/400_xowa/src/gplx/xowa/gui/urls/Xog_url_wkr.java +++ b/400_xowa/src/gplx/xowa/gui/urls/Xog_url_wkr.java @@ -47,7 +47,7 @@ public class Xog_url_wkr { return Rslt_handled; } private Xoa_url Exec_url_http(Xoa_app app) { // EX: http:a.org - app.Fsys_mgr().App_mgr().Exec_view_web(href.Raw()); + app.Launcher().Exec_view_web(href.Raw()); return Rslt_handled; } private Xoa_url Exec_url_anchor(Xog_win_itm win) { // EX: #anchor @@ -85,7 +85,7 @@ public class Xog_url_wkr { page.Wiki().File_mgr().Repo_mgr().Xfer_mgr().Force_orig_n_(); } if (Io_mgr._.ExistsFil(href_url)) { - ProcessAdp media_player = app.Fsys_mgr().App_mgr().App_by_ext(href_url.Ext()); + ProcessAdp media_player = app.Launcher().App_by_ext(href_url.Ext()); media_player.Run(href_url); } return Rslt_handled; diff --git a/400_xowa/src/gplx/xowa/gui/views/Xog_win_itm.java b/400_xowa/src/gplx/xowa/gui/views/Xog_win_itm.java index 8d42525a2..e7dbdfec2 100644 --- a/400_xowa/src/gplx/xowa/gui/views/Xog_win_itm.java +++ b/400_xowa/src/gplx/xowa/gui/views/Xog_win_itm.java @@ -77,7 +77,6 @@ public class Xog_win_itm implements GfoInvkAble, GfoEvObj { else if (ctx.Match(k, Invk_page_goto_recent)) Page__navigate_by_url_bar(app.User().History_mgr().Get_at_last(app)); else if (ctx.Match(k, Invk_history_bwd)) {Page__navigate_by_history(Bool_.N);} else if (ctx.Match(k, Invk_history_fwd)) {Page__navigate_by_history(Bool_.Y);} - else if (ctx.Match(k, Invk_app_exit)) App__exit(); else if (ctx.Match(k, Invk_eval)) App__eval(m.ReadStr("cmd")); else if (ctx.Match(k, Invk_page_async_cancel_wait)) Page__async__cancel__wait(); else if (ctx.Match(k, Invk_page_async_restart)) Page__async__restart(); @@ -104,7 +103,6 @@ public class Xog_win_itm implements GfoInvkAble, GfoEvObj { , Invk_page_edit_focus_box = "page_edit_focus_box", Invk_page_edit_focus_first = "page_edit_focus_first" , Invk_page_edit_save = "page_edit_save", Invk_page_edit_save_draft = "page_edit_save_draft", Invk_page_edit_preview = "page_edit_preview", Invk_page_edit_rename = "page_edit_rename" , Invk_page_dbg_wiki = "page_dbg_wiki", Invk_page_dbg_html = "page_dbg_html" - , Invk_app_exit = "app_exit" , Invk_eval = "eval" // xowa.gfs: shortcuts , Invk_page_goto = "page_goto", Invk_page_goto_recent = "page_goto_recent" @@ -134,8 +132,7 @@ public class Xog_win_itm implements GfoInvkAble, GfoEvObj { app.User().History_mgr().Add(page.Url(), page.Ttl(), Bry_.Add_w_dlm(Byte_ascii.Hash, page.Url().Page_bry(), anchor_bry)); } public void App__exit() { - if (!app.Term_cbk()) return; // NOTE: exit called by keyboard shortcut, or exit link; must call Term_cbk manually; Alt-F4/X button will call Term_cbk in closing event - app.Gui_mgr().Kit().Kit_term(); + kit.Kit_term(); // NOTE: Kit_term calls shell.close() which in turn is hooked up to app.Term_cbk() event; DATE:2014-09-09 } private void App__eval(String s) { String snippet = this.Active_html_box().Html_elem_atr_get_str(s, Gfui_html.Atr_innerHTML); diff --git a/400_xowa/src/gplx/xowa/hdumps/Xob_hdump_bldr.java b/400_xowa/src/gplx/xowa/hdumps/Xob_hdump_bldr.java new file mode 100644 index 000000000..906a5780a --- /dev/null +++ b/400_xowa/src/gplx/xowa/hdumps/Xob_hdump_bldr.java @@ -0,0 +1,90 @@ +/* +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.hdumps; import gplx.*; import gplx.xowa.*; +import gplx.dbs.*; import gplx.xowa.dbs.*; import gplx.xowa.dbs.tbls.*; import gplx.xowa.hdumps.saves.*; import gplx.xowa.hdumps.dbs.*; +public class Xob_hdump_bldr { + private Bry_bfr tmp_bfr = Bry_bfr.reset_(Io_mgr.Len_mb); + private Xow_wiki wiki; private Xodb_file core_db; private Xodb_xowa_cfg_tbl cfg_tbl; private Db_stmt cfg_update_stmt; + private int hdump_db_id; private long hdump_db_size, hdump_db_max; private Db_provider hdump_db_provider; + private Xodb_hdump_mgr hdump_mgr; private Hdump_save_mgr hdump_save_mgr; + public Xob_hdump_bldr(Xow_wiki wiki, Db_provider make_provider, long hdump_db_max) { + this.wiki = wiki; this.hdump_db_max = hdump_db_max; + core_db = wiki.Db_mgr_as_sql().Fsys_mgr().Get_tid_root(Xodb_file_tid.Tid_core); + hdump_mgr = wiki.Db_mgr_as_sql().Hdump_mgr(); hdump_save_mgr = hdump_mgr.Save_mgr(); + cfg_tbl = new Xodb_xowa_cfg_tbl().Provider_(make_provider); cfg_update_stmt = cfg_tbl.Update_stmt(); + Init_hdump_db(Db_get_last_or_make(wiki), cfg_tbl.Select_val_as_long_or(Cfg_grp_hdump_make, Cfg_itm_hdump_size, 0)); + hdump_db_provider.Txn_mgr().Txn_bgn_if_none(); + //wiki.Db_mgr().Data_storage_format_(gplx.ios.Io_stream_.Tid_gzip); + } + public void Insert_page(Xoa_page page) { + hdump_mgr.Write(tmp_bfr, page); + int body_len = hdump_save_mgr.Insert_body(page, page.Revision_data().Id()); + hdump_db_size += body_len; + if (hdump_db_size > hdump_db_max) { + Db_term(core_db, hdump_db_provider, hdump_db_id); + Init_hdump_db(wiki.Db_mgr_as_sql().Fsys_mgr().Make(Xodb_file_tid.Tid_html), 0); + Db_init(hdump_db_provider); + } + } + public void Commit() { + hdump_db_provider.Txn_mgr().Txn_end_all_bgn_if_none(); + cfg_tbl.Update(cfg_update_stmt, Cfg_grp_hdump_make, Cfg_itm_hdump_size, Long_.Xto_str(hdump_db_size)); + } + public void Bld_term() { + this.Commit(); + Db_term(core_db, hdump_db_provider, hdump_db_id); + } + private void Init_hdump_db(Xodb_file db_file, long hdump_db_size) { + this.hdump_db_id = db_file.Id(); + this.hdump_db_provider = db_file.Provider(); + this.hdump_db_size = hdump_db_size; + this.hdump_save_mgr.Tbl().Provider_(hdump_db_provider); + } + private static Xodb_file Db_get_last_or_make(Xow_wiki wiki) { + Xodb_fsys_mgr fsys_mgr = wiki.Db_mgr_as_sql().Fsys_mgr(); + Xodb_file rv = fsys_mgr.Get_tid_root(Xodb_file_tid.Tid_html); + if (rv == null) { + rv = fsys_mgr.Make(Xodb_file_tid.Tid_html); + Db_init(rv.Provider()); + } + return rv; + } + private static void Db_init(Db_provider p) {p.Exec_sql(Hdump_text_tbl.Tbl_sql);} + private static void Db_term(Xodb_file core_db_file, Db_provider hdump_db_provider, int hdump_db_id) { + hdump_db_provider.Txn_mgr().Txn_end(); + Sqlite_engine_.Db_attach(hdump_db_provider, "page_db", core_db_file.Url().Raw()); + hdump_db_provider.Exec_sql(String_.Format(Sql_update_page, hdump_db_id)); // update all page_html_db_id entries in page_db + Sqlite_engine_.Db_detach(hdump_db_provider, "page_db"); + hdump_db_provider.Txn_mgr().Txn_end_all(); + } + private static final String Cfg_grp_hdump_make = "hdump.make", Cfg_itm_hdump_size = "hdump.size"; + private static final String Sql_update_page = String_.Concat_lines_nl_skip_last + ( "REPLACE INTO page_db.page" + , "SELECT p.page_id" + , ", p.page_namespace" + , ", p.page_title" + , ", p.page_is_redirect" + , ", p.page_touched" + , ", p.page_len" + , ", p.page_random_int" + , ", p.page_file_idx" + , ", {0}" + , "FROM page_db.page p" + , " JOIN html_text h ON p.page_id = h.page_id" + ); +} diff --git a/400_xowa/src/gplx/xowa/hdumps/Xodb_hdump_mgr.java b/400_xowa/src/gplx/xowa/hdumps/Xodb_hdump_mgr.java index 521db703f..0a4a81230 100644 --- a/400_xowa/src/gplx/xowa/hdumps/Xodb_hdump_mgr.java +++ b/400_xowa/src/gplx/xowa/hdumps/Xodb_hdump_mgr.java @@ -24,6 +24,7 @@ public class Xodb_hdump_mgr { this.wiki = wiki; load_mgr = new Hdump_load_mgr(this); Tbl_(new Hdump_text_tbl()); + text_tbl.Init_by_wiki(wiki); Xoa_app app = wiki.App(); html_mgr.Init_by_app(app); } @@ -51,7 +52,7 @@ public class Xodb_hdump_mgr { wiki.Db_mgr_as_sql().Tbl_page().Update_html_db_id(page.Revision_data().Id(), hdump_db_file.Id()); tmp_bfr.Mkr_rls(); } - @gplx.Internal protected void Write(Bry_bfr bfr, Xoa_page page) { + public void Write(Bry_bfr bfr, Xoa_page page) { page.File_queue().Clear(); // need to reset uid to 0, else xowa_file_# will resume from last Xoh_page_wtr_wkr wkr = wiki.Html_mgr().Page_wtr_mgr().Wkr(Xopg_view_mode.Tid_read); wkr.Write_body(bfr, Xoh_wtr_ctx.Hdump, page); diff --git a/400_xowa/src/gplx/xowa/hdumps/Xodb_hdump_mgr__save_tst.java b/400_xowa/src/gplx/xowa/hdumps/Xodb_hdump_mgr__save_tst.java index d57b7e9ed..14fb7deb8 100644 --- a/400_xowa/src/gplx/xowa/hdumps/Xodb_hdump_mgr__save_tst.java +++ b/400_xowa/src/gplx/xowa/hdumps/Xodb_hdump_mgr__save_tst.java @@ -27,8 +27,8 @@ public class Xodb_hdump_mgr__save_tst { fxt.Test_save("a[[File:A.png|test_caption]]b[[File:B.png|test_caption]]" , fxt.Make_row_body(2, "a\"test_caption\"b\"test_caption\"") , fxt.Make_row_img - ( fxt.Make_img(0, 0, 0, "A.png", "trg/orig/7/0/A.png") - , fxt.Make_img(1, 0, 0, "B.png", "trg/orig/5/7/B.png") + ( fxt.Make_xfer("A.png", 0, 0, 0, Bool_.Y, Xof_ext_.Id_png) + , fxt.Make_xfer("B.png", 1, 0, 0, Bool_.Y, Xof_ext_.Id_png) ) ); } @@ -63,6 +63,13 @@ public class Xodb_hdump_mgr__save_tst { , "bcd" )); } + @Test public void Redlink() { + fxt.Init_redlinks(1); + fxt.Test_save("[[A]] [[B]]" + , fxt.Make_row_body(0, "A B") + , fxt.Make_row_redlink(1) + ); + } } class Xodb_hdump_mgr__save_fxt extends Xodb_hdump_mgr__base_fxt { private int page_id = 0; @@ -71,20 +78,41 @@ class Xodb_hdump_mgr__save_fxt extends Xodb_hdump_mgr__base_fxt { @Override public void Clear_end() { hdump_mgr.Tbl_mem_(); hdump_mgr.Text_tbl().Provider_(Hdump_text_tbl_mem.Null_provider); + init_redlinks = null; } + public void Init_redlinks(int... uids) { + this.init_redlinks = uids; + page.Lnki_redlinks_mgr().Page_bgn(); + } private int[] init_redlinks; public Hdump_text_row Make_row_body(int imgs_count, String body) { page.Hdump_data().Body_(Bry_.new_utf8_(body)); page.Hdump_data().Data_count_imgs_(imgs_count); Hdump_page_body_srl.Save(tmp_bfr, page); return new Hdump_text_row(page_id, Hdump_text_row_tid.Tid_body, tmp_bfr.XtoAryAndClear()); } - public Hdump_data_img__base Make_img(int uid, int img_w, int img_h, String lnki_ttl, String img_src_rel) {return new Hdump_data_img__basic().Init_by_base(uid, img_w, img_h, Bry_.new_utf8_(lnki_ttl), Bry_.new_utf8_(img_src_rel));} public Hdump_text_row Make_row_img(Hdump_data_img__base... itms) { ListAdp tmp_list = ListAdp_.new_(); tmp_list.AddMany((Object[])itms); byte[] imgs_bry = Hdump_save_mgr.Write_imgs(tmp_bfr, tmp_list); return new Hdump_text_row(page_id, Hdump_text_row_tid.Tid_data, imgs_bry); } + public Hdump_text_row Make_row_redlink(int... uids) { + Xopg_redlink_mgr redlink_mgr = new Xopg_redlink_mgr(); + for (int uid : uids) + redlink_mgr.Add(uid); + byte[] redlinks_bry = Hdump_save_mgr.Write_redlinks(tmp_bfr, redlink_mgr); + return new Hdump_text_row(page_id, Hdump_data_tid.Tid_redlink, redlinks_bry); + } + @Override public void Exec_write(String raw) { + super.Exec_write(raw); + if (init_redlinks != null) { + Xopg_redlink_mgr redlink_mgr = page.Hdump_data().Redlink_mgr(); + int len = init_redlinks.length; + for (int i = 0; i < len; ++i) { + redlink_mgr.Add(init_redlinks[i]); + } + } + } public void Test_write(String raw, String expd) { this.Exec_write(raw); Hdump_page_body_srl.Save(tmp_bfr, page); diff --git a/400_xowa/src/gplx/xowa/hdumps/Xodb_hdump_mgr__write_tst.java b/400_xowa/src/gplx/xowa/hdumps/Xodb_hdump_mgr__write_tst.java index 8af625008..7e7872b1b 100644 --- a/400_xowa/src/gplx/xowa/hdumps/Xodb_hdump_mgr__write_tst.java +++ b/400_xowa/src/gplx/xowa/hdumps/Xodb_hdump_mgr__write_tst.java @@ -17,17 +17,17 @@ along with this program. If not, see . */ package gplx.xowa.hdumps; import gplx.*; import gplx.xowa.*; import org.junit.*; import gplx.xowa.files.*; -import gplx.xowa.hdumps.core.*; import gplx.xowa.hdumps.dbs.*; import gplx.xowa.hdumps.pages.*; import gplx.xowa.xtns.hieros.*; +import gplx.xowa.hdumps.core.*; import gplx.xowa.hdumps.dbs.*; import gplx.xowa.hdumps.pages.*; import gplx.xowa.xtns.hieros.*; import gplx.xowa.xtns.gallery.*; public class Xodb_hdump_mgr__write_tst { @Before public void init() {fxt.Clear();} private Xodb_hdump_mgr__write_fxt fxt = new Xodb_hdump_mgr__write_fxt(); @Test public void Image_full() { - fxt.Expd_itms_xfers(fxt.Make_xfer(0, 0, 0, "A.png", "trg/orig/7/0/A.png")); + fxt.Expd_itms_xfers(fxt.Make_xfer("A.png", 0, 0, 0, Bool_.Y, Xof_ext_.Id_png)); fxt.Test_write_all ( "[[File:A.png|test_caption]]" , "\"test_caption\""); } @Test public void Image_thumb() { - fxt.Expd_itms_xfers(fxt.Make_xfer(0, 0, 0, "A.png", "trg/thumb/7/0/A.png/220px.png")); + fxt.Expd_itms_xfers(fxt.Make_xfer("A.png", 0, 0, 0, Bool_.N, Xof_ext_.Id_png)); fxt.Test_write_all ( "[[File:A.png|thumb|test_caption]]", String_.Concat_lines_nl_skip_last ( "
" @@ -41,7 +41,7 @@ public class Xodb_hdump_mgr__write_tst { )); } @Test public void Audio_thumb() { - fxt.Expd_itms_xfers(fxt.Make_xfer(0, 220, -1, "A.oga", "")); + fxt.Expd_itms_xfers(fxt.Make_xfer("A.oga", 0, 220, -1, Bool_.N, Xof_ext_.Id_oga)); fxt.Test_write_all ( "[[File:A.oga|thumb|test_caption]]", String_.Concat_lines_nl_skip_last ( "
" @@ -56,7 +56,7 @@ public class Xodb_hdump_mgr__write_tst { )); } @Test public void Video_thumb() { - fxt.Expd_itms_xfers(fxt.Make_xfer(0, 0, 0, "A.ogv", "")); + fxt.Expd_itms_xfers(fxt.Make_xfer("A.ogv", 0, 0, 0, Bool_.N, Xof_ext_.Id_ogv)); fxt.Test_write_all ( "[[File:A.ogv|thumb|test_caption]]", String_.Concat_lines_nl_skip_last ( "
" @@ -82,6 +82,7 @@ public class Xodb_hdump_mgr__write_tst { fxt.Test_write_frag("A1", "src='~{xowa_hiero_dir}hiero_A1.png'"); } @Test public void Gallery() { + Gallery_mgr_base.File_found_mode = Bool_.__byte; fxt.Test_write_all ( "File:A.png|A1", String_.Concat_lines_nl_skip_last ( "