From df10db140c7516b0c54713ab5fcc45dc0e87ae03 Mon Sep 17 00:00:00 2001 From: gnosygnu Date: Mon, 17 Aug 2015 02:09:16 -0400 Subject: [PATCH] v2.8.3.1 --- 100_core/src/gplx/Err.java | 2 +- 100_core/src/gplx/Err_.java | 11 +- .../src/gplx/core/btries/Btrie_fast_mgr.java | 20 +- .../gplx/core/btries/Btrie_fast_mgr_tst.java | 2 +- .../gplx/core/btries/Btrie_slim_itm_tst.java | 2 +- .../src/gplx/core/criterias/Criteria.java | 2 +- .../gplx/core/criterias/Criteria_between.java | 2 +- .../core/criterias/Criteria_bool_base.java | 6 +- .../gplx/core/criterias/Criteria_comp.java | 2 +- .../src/gplx/core/criterias/Criteria_eq.java | 2 +- .../src/gplx/core/criterias/Criteria_fld.java | 2 +- .../src/gplx/core/criterias/Criteria_in.java | 2 +- .../gplx/core/criterias/Criteria_ioMatch.java | 2 +- .../gplx/core/criterias/Criteria_like.java | 2 +- .../src/gplx/core/regxs/Regx_adp__tst.java | 2 +- 100_core/src/gplx/core/regxs/Regx_bldr.java | 2 +- .../src/gplx/core/strings/String_bldr.java | 12 +- 100_core/src_100_interface/gplx/RlsAble_.java | 4 + 100_core/src_100_interface/gplx/SrlAble_.java | 16 +- .../src_100_interface/gplx/SrlAble__tst.java | 2 +- .../{XtoStrAble.java => To_str_able.java} | 4 +- .../{XtoStrAble_.java => To_str_able_.java} | 4 +- 100_core/src_110_primitive/gplx/Array_.java | 4 +- 100_core/src_110_primitive/gplx/Bry_bfr.java | 1 + 100_core/src_110_primitive/gplx/Bry_fmtr.java | 2 +- 100_core/src_110_primitive/gplx/Char_.java | 8 +- 100_core/src_110_primitive/gplx/Int_.java | 11 +- 100_core/src_110_primitive/gplx/String_.java | 26 +- .../src_110_primitive/gplx/String__tst.java | 4 +- .../src_120_basicDataType/gplx/EnmMgr.java | 2 +- .../src_120_basicDataType/gplx/Guid_adp.java | 2 +- .../gplx/Guid_adp__tst.java | 2 +- .../src_120_basicDataType/gplx/Io_url.java | 2 +- .../src_120_basicDataType/gplx/KeyVal.java | 6 +- .../gplx/KeyValList.java | 4 +- .../src_120_basicDataType/gplx/KeyVal_.java | 2 +- .../src_120_basicDataType/gplx/RandomAdp.java | 4 +- .../gplx/TimeSpanAdp.java | 10 +- .../gplx/TimeSpanAdp_.java | 4 +- .../gplx/TimeSpanAdp_xtoStr_tst.java | 20 +- 100_core/src_140_list/gplx/Hash_adp_bry.java | 6 + .../src_140_list/gplx/Ordered_hash_base.java | 2 +- .../gplx/lists/Hash_adp_base.java | 20 +- .../src_150_text/gplx/texts/CharStream.java | 6 +- .../gplx/texts/CharStream_tst.java | 6 +- .../src_150_text/gplx/texts/HexDecUtl.java | 2 +- .../gplx/texts/HexDecUtl_tst.java | 4 +- .../gplx/texts/RegxPatn_cls_ioMatch_.java | 2 +- .../gplx/texts/RegxPatn_cls_like_.java | 2 +- .../gplx/texts/StringTableBldr.java | 2 +- .../gplx/texts/StringTableBldr_tst.java | 4 +- .../src_200_io/gplx/ios/IoEnginePool.java | 2 +- .../gplx/ios/IoEngine_xrg_recycleFil.java | 4 +- .../src_200_io/gplx/ios/IoRecycleBin.java | 4 +- 100_core/src_200_io/gplx/ios/IoUrlInfo.java | 2 +- .../src_200_io/gplx/ios/IoUrlTypeRegy.java | 4 +- .../src_200_io/gplx/ios/Io_size__tst.java | 2 +- 100_core/src_210_env/gplx/Env_.java | 9 +- 100_core/src_210_env/gplx/Op_sys.java | 5 +- 100_core/src_210_env/gplx/ProcessAdp.java | 4 +- .../src_300_classXtn/gplx/ClassXtnPool.java | 2 +- .../gplx/TimeSpanAdpClassXtn.java | 2 +- 100_core/src_310_gfoNde/gplx/GfoFldList.java | 2 +- 100_core/src_310_gfoNde/gplx/GfoFldList_.java | 6 +- 100_core/src_310_gfoNde/gplx/GfoNde.java | 4 +- 100_core/src_311_gfoObj/gplx/GfoMsg.java | 2 +- 100_core/src_311_gfoObj/gplx/GfoMsg_.java | 16 +- 100_core/src_311_gfoObj/gplx/GfoMsg_tst.java | 2 +- 100_core/src_330_store/gplx/DataRdr.java | 2 +- 100_core/src_330_store/gplx/DataRdr_.java | 4 +- 100_core/src_330_store/gplx/DataWtr.java | 2 +- 100_core/src_330_store/gplx/DataWtr_.java | 2 +- .../gplx/stores/DataRdr_mem.java | 2 +- .../gplx/stores/xmls/XmlDataRdr.java | 2 +- .../gplx/stores/xmls/XmlDataWtr_.java | 4 +- .../gplx/stores/dsvs/DsvDataRdr_.java | 2 +- .../gplx/stores/dsvs/DsvDataWtr.java | 4 +- .../gplx/stores/dsvs/DsvDataWtr_csv_tst.java | 2 +- 100_core/src_400_gfs/gplx/GfsCoreHelp.java | 6 +- 100_core/src_400_gfs/gplx/GfsCtx.java | 2 +- .../src_420_usrMsg/gplx/Gfo_usr_dlg_.java | 5 + .../gplx/Gfo_usr_dlg__gui_.java | 6 +- 100_core/src_420_usrMsg/gplx/UsrMsg.java | 8 +- .../gplx/UsrMsgWkr_console.java | 2 +- .../src_420_usrMsg/gplx/UsrMsgWkr_test.java | 2 +- 100_core/src_800_tst/gplx/PerfLogMgr_fxt.java | 8 +- 100_core/src_800_tst/gplx/Tfds.java | 20 +- .../src_800_tst/gplx/TfdsEqListItmStr.java | 2 +- 100_core/src_900_xml/gplx/Base85_utl.java | 2 +- 100_core/src_900_xml/gplx/Base85_utl_tst.java | 4 +- 100_core/src_900_xml/gplx/HierStrBldr.java | 2 +- 100_core/tst/gplx/TfdsTstr_fxt.java | 4 +- .../tst/gplx/stores/xmls/XmlDataWtr_tst.java | 2 +- 110_gfml/src_100_tkn/gplx/gfml/GfmlTkn.java | 4 +- 110_gfml/src_200_type/gplx/gfml/GfmlFld.java | 4 +- 110_gfml/src_300_gdoc/gplx/gfml/GfmlAtr.java | 2 +- .../src_300_gdoc/gplx/gfml/GfmlDocPos.java | 4 +- 110_gfml/src_300_gdoc/gplx/gfml/GfmlDoc_.java | 2 +- 110_gfml/src_300_gdoc/gplx/gfml/GfmlItm.java | 2 +- 110_gfml/src_300_gdoc/gplx/gfml/GfmlNde.java | 2 +- .../gplx/gfml/GfmlStringHighlighter.java | 6 +- .../src_600_rdrWtr/gplx/gfml/GfmlDataNde.java | 6 +- .../src_600_rdrWtr/gplx/gfml/GfmlDataRdr.java | 2 +- .../gplx/gfml/GfmlDataRdr_base.java | 2 +- .../src_600_rdrWtr/gplx/gfml/GfmlDataWtr.java | 6 +- 110_gfml/src_600_rdrWtr/gplx/gfml/SqlDoc.java | 2 +- .../gplx/gfml/ymoks_GfmlAtr_GfmlNde_mok.java | 4 +- .../gplx/gfml/ymoks_GfmlTyp_GfmlFld_mok.java | 2 +- .../tst/gplx/gfml/z081_GfmlDataWtr_tst.java | 2 +- .../gplx/gfml/z082_GfmlDataWtrOpts_tst.java | 2 +- 110_gfml/tst/gplx/gfml/z601_edit_atr_tst.java | 2 +- .../gfml/z803_useCase_KbdKeyboard_tst.java | 2 +- .../gplx/gfml/z811_useCase_GfmlIoSql_tst.java | 4 +- 110_gfml/tst/gplx/gfml/z901_perf_tst.java | 6 +- 140_dbs/src/gplx/dbs/Db_conn.java | 4 +- 140_dbs/src/gplx/dbs/Db_conn_info__base.java | 2 +- .../src/gplx/dbs/Db_tbl.java | 7 +- 140_dbs/src/gplx/dbs/Db_tbl_.java | 30 ++ 140_dbs/src/gplx/dbs/engines/Db_engine.java | 2 +- .../gplx/dbs/engines/Db_engine_sql_base.java | 11 +- .../gplx/dbs/engines/mems/Db_engine__mem.java | 2 +- .../gplx/dbs/engines/nulls/Noop_engine.java | 2 +- .../dbs/engines/sqlite/Sqlite_engine.java | 2 +- .../dbs/engines/sqlite/Sqlite_txn_mgr.java | 5 +- .../dbs/engines/tdbs/TdbDbLoadMgr_tst.java | 6 +- .../gplx/dbs/engines/tdbs/TdbDbSaveMgr.java | 2 +- .../dbs/engines/tdbs/TdbDbSaveMgr_tst.java | 6 +- .../src/gplx/dbs/engines/tdbs/TdbEngine.java | 2 +- .../gplx/dbs/engines/tdbs/TdbFileList.java | 2 +- .../src/gplx/dbs/engines/tdbs/TdbInsert.java | 2 +- .../gplx/dbs/qrys/Db_qry__select_in_tbl.java | 2 +- .../src/gplx/dbs/qrys/Db_qry_select_tst.java | 6 +- 140_dbs/src/gplx/dbs/sqls/Db_obj_ary_crt.java | 2 +- .../src/gplx/dbs/sqls/Sql_qry_wtr_ansi.java | 2 +- .../gplx/dbs/sqls/Sql_qry_wtr_iosql_tst.java | 2 +- .../src/gplx/dbs/sqls/Sql_qry_wtr_tst.java | 4 +- .../gplx/dbs/sqls/Sql_select_fld_list.java | 8 +- 140_dbs/src/gplx/stores/DbMaprRdr.java | 2 +- 140_dbs/src/gplx/stores/DbMaprWtr.java | 2 +- 140_dbs/src/gplx/stores/Db_data_rdr.java | 2 +- .../gplx/gfui/GfuiBorderEdge.java | 2 +- .../src_100_basic/gplx/gfui/PointAdp.java | 6 +- 150_gfui/src_100_basic/gplx/gfui/SizeAdp.java | 4 +- .../src_110_draw_core/gplx/gfui/ColorAdp.java | 10 +- .../src_110_draw_core/gplx/gfui/FontAdp.java | 2 +- .../src_110_draw_core/gplx/gfui/PenAdp.java | 2 +- .../gplx/gfui/GfuiBorderMgr.java | 4 +- 150_gfui/src_200_ipt/gplx/gfui/IptArg.java | 2 +- 150_gfui/src_200_ipt/gplx/gfui/IptBndMgr.java | 2 +- .../src_200_ipt/gplx/gfui/IptBndMgr_tst.java | 2 +- 150_gfui/src_200_ipt/gplx/gfui/IptBnd_.java | 2 +- 150_gfui/src_200_ipt/gplx/gfui/IptKey.java | 2 +- .../src_200_ipt/gplx/gfui/IptKeyStrMgr.java | 4 +- .../gplx/gfui/GxwTextHtml_lang.java | 2 +- .../src_400_win/gplx/gfui/GfoConsoleWin.java | 4 +- .../gplx/gfui/GfuiWinKeyCmdMgr.java | 2 +- .../gplx/gfui/GfuiElemBase.java | 2 +- .../gplx/gfui/GfuiBnd_box_status.java | 2 +- .../gplx/gfui/GfuiStatusBox.java | 2 +- .../src_600_adp/gplx/gfui/ClipboardAdp_.java | 2 +- 150_gfui/src_600_adp/gplx/gfui/ImageAdp.java | 2 +- 150_gfui/src_700_env/gplx/gfui/GfuiEnv_.java | 2 +- 150_gfui/src_700_env/gplx/gfui/Swt_kit.java | 2 +- 150_gfui/tst/gplx/gfui/GfxItm_base.java | 2 +- 150_gfui/tst/gplx/gfui/GfxLineItm.java | 2 +- 150_gfui/tst/gplx/gfui/GfxRectItm.java | 2 +- 400_xowa/src/gplx/core/json/Json_itm_.java | 5 + 400_xowa/src/gplx/core/json/Json_kv.java | 2 + 400_xowa/src/gplx/core/json/Json_nde.java | 5 +- 400_xowa/src/gplx/core/json/Json_parser.java | 4 +- 400_xowa/src/gplx/core/logs/Gfo_log_fil.java | 55 +++ 400_xowa/src/gplx/core/logs/Gfo_log_fmtr.java | 58 +++ 400_xowa/src/gplx/core/logs/Gfo_log_mgr.java | 55 +++ .../gplx/core/net/Http_request_parser.java | 5 +- .../core/net/Http_request_parser_tst.java | 3 + 400_xowa/src/gplx/dbs/cfgs/Db_cfg_itm.java | 4 +- 400_xowa/src/gplx/dbs/cfgs/Db_cfg_tbl.java | 4 +- 400_xowa/src/gplx/fsdb/Fsdb_db_mgr_.java | 2 + .../src/gplx/fsdb/Fsdb_db_mgr__v2_bldr.java | 4 +- 400_xowa/src/gplx/fsdb/data/Fsd_bin_tbl.java | 2 +- 400_xowa/src/gplx/fsdb/meta/Fsm_atr_mgr.java | 2 +- 400_xowa/src/gplx/fsdb/meta/Fsm_bin_mgr.java | 2 +- 400_xowa/src/gplx/gfs/Gfs_msg_bldr_tst.java | 2 +- 400_xowa/src/gplx/gfs/Gfs_parser.java | 2 +- 400_xowa/src/gplx/gfs/Gfs_parser_ctx.java | 4 +- 400_xowa/src/gplx/php/Php_srl_parser.java | 6 +- .../srls/dsvs/Dsv_tbl_parser_int_tst.java | 6 +- .../srls/dsvs/Dsv_tbl_parser_str_tst.java | 10 +- 400_xowa/src/gplx/xowa/Xoa_app_.java | 55 ++- 400_xowa/src/gplx/xowa/Xoa_app_fxt.java | 8 + 400_xowa/src/gplx/xowa/Xoa_url.java | 2 +- 400_xowa/src/gplx/xowa/apis/Xoapi_root.java | 1 + .../src/gplx/xowa/apis/xowa/Xoapi_html.java | 11 +- .../gplx/xowa/apis/xowa/html/Xoapi_page.java | 5 +- .../xowa/apis/xowa/html/Xoapi_toggle_itm.java | 35 +- .../xowa/apis/xowa/html/Xoapi_toggle_mgr.java | 6 +- 400_xowa/src/gplx/xowa/apps/Xoa_gfs_mgr.java | 2 +- .../src/gplx/xowa/apps/fsys/Xoa_fsys_mgr.java | 13 +- .../src/gplx/xowa/apps/metas/Xoa_ns_mgr.java | 17 +- .../src/gplx/xowa/bldrs/Xob_cmd_keys.java | 2 +- 400_xowa/src/gplx/xowa/bldrs/Xob_cmd_mgr.java | 2 +- .../xowa/bldrs/cmds/ctgs/Xob_ctg_v1_base.java | 2 +- .../bldrs/cmds/files/Xob_fsdb_make_cmd.java | 32 +- .../bldrs/cmds/files/Xob_lnki_temp_tbl.java | 2 +- .../bldrs/cmds/files/Xob_xfer_regy_cmd.java | 2 +- .../cmds/files/Xob_xfer_regy_update_cmd.java | 4 +- .../cmds/files/Xob_xfer_temp_cmd_orig.java | 2 +- .../cmds/files/Xob_xfer_temp_cmd_thumb.java | 2 +- .../bldrs/cmds/texts/sqls/Xob_css_cmd.java | 2 +- .../bldrs/cmds/texts/sqls/Xob_page_cmd.java | 2 +- .../cmds/utils/Xob_site_meta_cmd.java} | 15 +- .../xowa/bldrs/cmds/wikis/Xob_image_cmd.java | 2 +- .../bldrs/cmds/wikis/Xob_page_dump_tbl.java | 1 + .../bldrs/cmds/wikis/Xob_redirect_cmd.java | 2 +- .../xowa/bldrs/css/Xoa_css_extractor.java | 2 +- .../dansguardians/Crt__match_base.java | 2 +- .../filters/dansguardians/Dg_log_mgr.java | 2 +- .../gplx/xowa/bldrs/infos/Xob_info_file.java | 2 +- .../xowa/bldrs/infos/Xob_info_session.java | 2 +- .../gplx/xowa/bldrs/xmls/Xob_xml_parser_.java | 2 +- 400_xowa/src/gplx/xowa/files/Xof_ext_.java | 2 +- .../src/gplx/xowa/files/Xof_file_wkr_.java | 2 +- .../src/gplx/xowa/files/Xof_fsdb_itm.java | 5 +- .../src/gplx/xowa/files/Xof_fsdb_itm_fxt.java | 80 ++++ .../src/gplx/xowa/files/Xof_img_size.java | 108 ++--- .../src/gplx/xowa/files/Xof_img_size_tst.java | 8 +- .../src/gplx/xowa/files/Xof_lnki_time.java | 2 +- .../src/gplx/xowa/files/Xof_url_bldr.java | 25 +- .../src/gplx/xowa/files/Xof_url_bldr_tst.java | 40 +- .../src/gplx/xowa/files/Xof_xfer_itm.java | 8 +- .../src/gplx/xowa/files/Xow_file_mgr.java | 8 +- .../bins/Io_download_mgr.java} | 12 +- .../xowa/files/bins/Io_download_mgr_.java | 31 ++ .../files/bins/Io_download_mgr__memory.java | 28 ++ .../files/bins/Xof_bin_wkr__http_wmf.java | 41 +- .../bins/Xof_bin_wkr__http_wmf__tst.java | 67 +++ .../gplx/xowa/files/caches/Xofc_fil_mgr.java | 4 +- .../gplx/xowa/files/caches/Xou_cache_mgr.java | 8 +- .../cnvs/Xof_img_wkr_resize_img_mok.java | 2 +- .../files/fsdb/fs_roots/Fs_root_dir_tst.java | 2 +- .../Xof_img_wkr_convert_djvu_to_tiff_.java | 2 +- .../files/origs/Xof_orig_wkr__xo_meta.java | 2 +- .../gplx/xowa/files/repos/Xowe_repo_mgr.java | 2 +- .../gplx/xowa/files/xfers/Xof_xfer_mgr.java | 12 +- .../xfers/Xof_xfer_queue_html_cases_tst.java | 10 +- .../files/xfers/Xof_xfer_queue_html_fxt.java | 4 +- .../Xof_xfer_queue_html_wmf_api_tst.java | 2 +- 400_xowa/src/gplx/xowa/gui/Xoa_gui_mgr.java | 14 +- .../gui/urls/Xof_orig_file_downloader.java | 2 +- .../gplx/xowa/gui/views/Load_page_wkr.java | 54 ++- .../src/gplx/xowa/gui/views/Xog_tab_itm.java | 5 +- .../xowa/gui/views/Xog_tab_itm_read_mgr.java | 8 +- .../xowa/gui/views/boots/Xog_error_data.java | 28 ++ .../xowa/gui/views/boots/Xog_error_win.java | 107 +++++ .../xowa/gui/views/boots/Xog_splash_win.java | 51 +++ .../html/bridges/dbuis/tbls/Dbui_btn_itm.java | 1 + .../html/bridges/dbuis/tbls/Dbui_col_itm.java | 2 +- .../gplx/xowa/html/css/Xowd_css_core_mgr.java | 2 +- .../gplx/xowa/html/hdumps/Xohd_hdump_rdr.java | 2 +- .../gplx/xowa/html/hdumps/Xohd_hdump_wtr.java | 6 + .../xowa/html/hdumps/abrvs/Xohd_abrv_mgr.java | 2 +- .../html/hdumps/bldrs/Xob_link_dump_tbl.java | 2 +- .../hdumps/bldrs/Xob_redlink_mkr_cmd.java | 2 +- .../xowa/html/hzips/Xow_hzip_itm__anchor.java | 2 +- .../gplx/xowa/html/portal/Xow_portal_mgr.java | 2 +- .../gplx/xowa/langs/cases/Xol_case_mgr.java | 2 +- .../xowa/langs/numbers/Xol_num_fmtr_base.java | 2 +- .../xowa/langs/numbers/Xol_transform_mgr.java | 4 +- .../gplx/xowa/langs/vnts/Xop_vnt_flag.java | 2 +- .../xowa/langs/vnts/Xop_vnt_flag_parser.java | 2 +- .../parsers/amps/Xop_amp_mgr_decode_tst.java | 2 +- .../xowa/parsers/lists/Xop_list_tkn_chkr.java | 2 +- .../gplx/xowa/parsers/logs/Xop_log_mgr.java | 2 +- .../src/gplx/xowa/parsers/utils/Xop_util.java | 40 ++ .../gplx/xowa/parsers/utils/Xop_util_tst.java | 36 ++ .../gplx/xowa/setup/maints/Xoa_maint_mgr.java | 2 +- .../specials/search/Xows_page__search.java | 3 +- .../specials/search/Xows_ui_async_tst.java | 4 +- .../xowa/bookmarks/Dbui_tbl_itm__bmk.java | 2 +- .../xowa/bookmarks/Dbui_tbl_itm__history.java | 95 ++++ .../xowa/system_data/System_data_page.java | 2 +- .../src/gplx/xowa/urls/Xoa_url_parser.java | 2 +- .../xowa/urls/Xoa_url_parser__xwiki_tst.java | 2 +- .../src/gplx/xowa/users/Xou_fsys_mgr.java | 2 - 400_xowa/src/gplx/xowa/users/Xou_user_.java | 3 +- .../src/gplx/xowa/users/Xouc_setup_mgr.java | 8 +- 400_xowa/src/gplx/xowa/users/Xoue_user.java | 3 - .../src/gplx/xowa/users/data/Xou_db_file.java | 5 - .../xowa/users/data/Xoud_history_mgr.java | 12 +- .../xowa/users/data/Xoud_history_row.java | 21 +- .../xowa/users/data/Xoud_history_special.java | 44 +- .../xowa/users/data/Xoud_history_tbl.java | 49 +- .../src/gplx/xowa/users/prefs/Prefs_mgr.java | 4 +- .../xowa/wikis/data/Xowd_core_db_props.java | 2 +- .../src/gplx/xowa/wikis/data/Xowd_db_mgr.java | 2 +- .../wikis/data/tbls/Xowd_cat_core_tbl.java | 4 +- .../wikis/data/tbls/Xowd_cat_link_tbl.java | 2 +- .../xowa/wikis/data/tbls/Xowd_html_tbl.java | 2 +- .../xowa/wikis/data/tbls/Xowd_page_tbl.java | 4 +- .../wikis/data/tbls/Xowd_search_link_tbl.java | 2 +- .../wikis/data/tbls/Xowd_search_temp_tbl.java | 2 +- .../wikis/data/tbls/Xowd_search_word_tbl.java | 4 +- .../xowa/wikis/data/tbls/Xowd_text_tbl.java | 2 +- .../wikis/data/tbls/Xowd_wbase_pid_tbl.java | 2 +- .../wikis/data/tbls/Xowd_wbase_qid_tbl.java | 2 +- .../wikis/data/tbls/Xowd_xowa_db_tbl.java | 2 +- .../wikis/domains/Xow_domain_abrv_xo_.java | 4 + .../gplx/xowa/wikis/xwikis/Xow_lang_mgr.java | 2 +- .../src/gplx/xowa/wmfs/Xow_wmf_api_mgr.java | 49 +- .../gplx/xowa/wmfs/Xow_wmf_api_wkr__ns.java | 78 ---- .../data/Json_parser__list_nde__base.java | 349 +++++++++++++++ .../src/gplx/xowa/wmfs/data/Site_core_db.java | 124 +++++ ...mf_skin_itm.java => Site_core_db_tst.java} | 14 +- .../gplx/xowa/wmfs/data/Site_core_itm.java | 33 ++ .../gplx/xowa/wmfs/data/Site_core_tbl.java | 94 ++++ .../xowa/wmfs/data/Site_extension_itm.java | 43 ++ .../xowa/wmfs/data/Site_extension_tbl.java | 113 +++++ .../gplx/xowa/wmfs/data/Site_general_itm.java | 112 +++++ .../xowa/wmfs/data/Site_interwikimap_itm.java | 35 ++ .../xowa/wmfs/data/Site_interwikimap_tbl.java | 83 ++++ .../gplx/xowa/wmfs/data/Site_json_parser.java | 99 ++++ .../xowa/wmfs/data/Site_json_parser_tst.java | 422 ++++++++++++++++++ .../{Xowmf_kv_itm.java => Site_kv_itm.java} | 4 +- .../src/gplx/xowa/wmfs/data/Site_kv_tbl.java | 69 +++ ...nguage_itm.java => Site_language_itm.java} | 5 +- .../xowa/wmfs/data/Site_language_tbl.java | 71 +++ ...library_itm.java => Site_library_itm.java} | 5 +- .../gplx/xowa/wmfs/data/Site_library_tbl.java | 71 +++ .../xowa/wmfs/data/Site_magicword_itm.java | 27 ++ .../xowa/wmfs/data/Site_magicword_tbl.java | 74 +++ .../gplx/xowa/wmfs/data/Site_meta_itm.java | 82 ++++ .../xowa/wmfs/data/Site_namespace_itm.java | 34 ++ .../xowa/wmfs/data/Site_namespace_tbl.java | 86 ++++ ..._itm.java => Site_namespacealias_itm.java} | 9 +- .../wmfs/data/Site_namespacealias_tbl.java | 71 +++ .../xowa/wmfs/data/Site_showhook_itm.java | 27 ++ .../xowa/wmfs/data/Site_showhook_tbl.java | 74 +++ .../gplx/xowa/wmfs/data/Site_skin_itm.java | 28 ++ .../gplx/xowa/wmfs/data/Site_skin_tbl.java | 77 ++++ ...tm.java => Site_specialpagealias_itm.java} | 5 +- .../wmfs/data/Site_specialpagealias_tbl.java | 71 +++ .../xowa/wmfs/data/Site_statistic_itm.java | 42 ++ .../xowa/wmfs/data/Site_statistic_tbl.java | 87 ++++ .../src/gplx/xowa/wmfs/data/Site_val_tbl.java | 67 +++ .../wmfs/data/Xowmf_defaultoption_tbl.java | 45 -- .../xowa/wmfs/data/Xowmf_extensions_tbl.java | 69 --- .../xowa/wmfs/data/Xowmf_general_tbl.java | 233 ---------- .../wmfs/data/Xowmf_interwikimap_tbl.java | 53 --- .../xowa/wmfs/data/Xowmf_json_parser.java | 308 ------------- .../gplx/xowa/wmfs/data/Xowmf_json_tbl.java | 51 --- .../xowa/wmfs/data/Xowmf_language_tbl.java | 45 -- .../src/gplx/xowa/wmfs/data/Xowmf_ns_tbl.java | 64 --- .../xowa/wmfs/data/Xowmf_protocol_tbl.java | 43 -- .../gplx/xowa/wmfs/data/Xowmf_site_tbl.java | 60 --- .../wmfs/data/Xowmf_specialpagealias_tbl.java | 45 -- .../xowa/wmfs/data/Xowmf_statistics_tbl.java | 57 --- .../gplx/xowa/wmfs/data/Xowmf_wiki_data.java | 36 -- .../xtns/pfuncs/exprs/Pfunc_expr_ops.java | 2 +- .../xtns/pfuncs/exprs/Pfunc_expr_shunter.java | 4 +- .../xowa/xtns/pfuncs/times/Pft_fmt_itm_.java | 2 +- .../pfuncs/times/Pft_func_formatdate.java | 2 +- .../xtns/pfuncs/ttls/Pfunc_anchorencode.java | 2 +- .../xowa/xtns/pfuncs/ttls/Pfunc_filepath.java | 2 +- .../xowa/xtns/pfuncs/ttls/Pfunc_rel2abs.java | 2 +- .../src/gplx/xowa/xtns/scores/Score_xnde.java | 2 +- .../xtns/scribunto/Scrib_invoke_func.java | 12 +- .../xtns/scribunto/errs/Gfo_fld_owner.java | 2 +- .../xtns/scribunto/libs/Scrib_lib_mw.java | 27 +- .../xtns/scribunto/libs/Scrib_lib_text.java | 84 ++-- .../xtns/scribunto/libs/Scrib_lib_text_.java | 67 +++ .../xtns/wdatas/Wdata_prop_val_visitor.java | 10 +- .../gplx/xowa/xtns/wdatas/Wdata_wiki_mgr.java | 3 +- .../xtns/wdatas/Wdata_xwiki_link_wtr.java | 5 +- .../wdatas/core/Wdata_claim_itm_time.java | 18 +- .../xowa/xtns/wdatas/core/Wdata_date_tst.java | 1 + .../xtns/wdatas/hwtrs/Wdata_hwtr_mgr_tst.java | 5 +- .../wdatas/hwtrs/Wdata_visitor__html_wtr.java | 17 +- .../wdatas/imports/Xob_wbase_ns_parser.java | 14 +- .../xtns/wdatas/imports/Xob_wdata_db_cmd.java | 2 +- .../wdatas/imports/Xob_wdata_qid_base.java | 2 +- .../imports/Xob_wdata_qid_base_tst.java | 11 +- .../wdatas/pfuncs/Wdata_pf_property_tst.java | 2 +- 400_xowa/src_040_io/gplx/ios/Io_sort.java | 2 +- 400_xowa/src_060_utl/gplx/App_cmd_arg.java | 2 +- 400_xowa/src_060_utl/gplx/HierPosAryBldr.java | 4 +- 400_xowa/src_060_utl/gplx/Tst_mgr.java | 4 +- .../src_120_wiki/gplx/xowa/Xow_ns_case_.java | 1 + .../src_140_lang/gplx/xowa/Xol_msg_itm_.java | 52 +-- .../gplx/xowa/Xof_meta_fil_tst.java | 2 +- .../src_161_meta/gplx/xowa/Xof_meta_mgr.java | 2 +- .../gplx/xowa/Xof_meta_mgr_tst.java | 2 +- .../src_200_bldr/gplx/xowa/Xob_stat_itm.java | 2 +- .../src_200_bldr/gplx/xowa/Xob_stat_mgr.java | 8 +- .../src_200_bldr/gplx/xowa/Xob_stat_type.java | 4 +- .../gplx/xowa/Xob_xdat_file_tst.java | 2 +- .../gplx/xowa/Sql_file_parser_cmd.java | 2 +- .../xowa/Xoi_cmd_imageMagick_download.java | 67 +++ .../gplx/xowa/Xoi_cmd_wiki.java | 199 --------- .../gplx/xowa/Xoi_cmd_wiki_download.java | 53 +++ .../gplx/xowa/Xoi_cmd_wiki_goto_page.java | 30 ++ .../gplx/xowa/Xoi_cmd_wiki_image_cfg.java | 28 ++ .../gplx/xowa/Xoi_cmd_wiki_tst.java | 2 +- .../gplx/xowa/Xoi_cmd_wiki_unzip.java | 50 +++ .../gplx/xowa/Xoi_cmd_wiki_zip.java | 69 +++ .../src_400_parser/gplx/xowa/TstObj_tst.java | 2 +- .../src_400_parser/gplx/xowa/Xoa_ttl.java | 2 +- .../src_400_parser/gplx/xowa/Xop_lxr_mgr.java | 2 +- .../gplx/xowa/Xop_under_lxr.java | 2 +- .../gplx/xowa/Xop_lnki_arg_parser.java | 8 +- .../src_440_lnki/gplx/xowa/Xop_lnki_type.java | 4 +- .../gplx/xowa/Xop_lnki_wkr__basic_tst.java | 39 -- .../gplx/xowa/Xop_lnki_wkr__size_tst.java | 63 +++ .../gplx/xowa/Xop_lnki_wkr__uncommon_tst.java | 6 - .../gplx/xowa/Xop_lnki_wkr__video_tst.java | 31 ++ .../gplx/xowa/Xop_xnde_wkr__nowiki_tst.java | 2 +- .../gplx/xowa/Xop_curly_bgn_lxr.java | 2 +- .../gplx/xowa/Xot_defn_trace_brief_tst.java | 2 +- 400_xowa/xtn/gplx/xowa/Xowa_main.java | 5 +- .../en.wikipedia.org-file-user.xowa | Bin 57344 -> 0 bytes .../en.wikipedia.org-file.xowa | Bin 57344 -> 0 bytes .../en.wikipedia.org-text.xowa | Bin 36864 -> 49152 bytes 421 files changed, 4866 insertions(+), 2428 deletions(-) rename 100_core/src_100_interface/gplx/{XtoStrAble.java => To_str_able.java} (93%) rename 100_core/src_100_interface/gplx/{XtoStrAble_.java => To_str_able_.java} (84%) rename 400_xowa/src/gplx/xowa/wmfs/data/Xowmf_val_itm.java => 140_dbs/src/gplx/dbs/Db_tbl.java (76%) create mode 100644 140_dbs/src/gplx/dbs/Db_tbl_.java create mode 100644 400_xowa/src/gplx/core/logs/Gfo_log_fil.java create mode 100644 400_xowa/src/gplx/core/logs/Gfo_log_fmtr.java create mode 100644 400_xowa/src/gplx/core/logs/Gfo_log_mgr.java rename 400_xowa/src/gplx/xowa/{xtns/wdatas/imports/Xob_site_ns_cmd.java => bldrs/cmds/utils/Xob_site_meta_cmd.java} (62%) create mode 100644 400_xowa/src/gplx/xowa/files/Xof_fsdb_itm_fxt.java rename 400_xowa/src/gplx/xowa/{wmfs/Xow_wmf_api_wkr.java => files/bins/Io_download_mgr.java} (71%) create mode 100644 400_xowa/src/gplx/xowa/files/bins/Io_download_mgr_.java create mode 100644 400_xowa/src/gplx/xowa/files/bins/Io_download_mgr__memory.java create mode 100644 400_xowa/src/gplx/xowa/files/bins/Xof_bin_wkr__http_wmf__tst.java create mode 100644 400_xowa/src/gplx/xowa/gui/views/boots/Xog_error_data.java create mode 100644 400_xowa/src/gplx/xowa/gui/views/boots/Xog_error_win.java create mode 100644 400_xowa/src/gplx/xowa/gui/views/boots/Xog_splash_win.java create mode 100644 400_xowa/src/gplx/xowa/parsers/utils/Xop_util.java create mode 100644 400_xowa/src/gplx/xowa/parsers/utils/Xop_util_tst.java create mode 100644 400_xowa/src/gplx/xowa/specials/xowa/bookmarks/Dbui_tbl_itm__history.java delete mode 100644 400_xowa/src/gplx/xowa/wmfs/Xow_wmf_api_wkr__ns.java create mode 100644 400_xowa/src/gplx/xowa/wmfs/data/Json_parser__list_nde__base.java create mode 100644 400_xowa/src/gplx/xowa/wmfs/data/Site_core_db.java rename 400_xowa/src/gplx/xowa/wmfs/data/{Xowmf_skin_itm.java => Site_core_db_tst.java} (67%) create mode 100644 400_xowa/src/gplx/xowa/wmfs/data/Site_core_itm.java create mode 100644 400_xowa/src/gplx/xowa/wmfs/data/Site_core_tbl.java create mode 100644 400_xowa/src/gplx/xowa/wmfs/data/Site_extension_itm.java create mode 100644 400_xowa/src/gplx/xowa/wmfs/data/Site_extension_tbl.java create mode 100644 400_xowa/src/gplx/xowa/wmfs/data/Site_general_itm.java create mode 100644 400_xowa/src/gplx/xowa/wmfs/data/Site_interwikimap_itm.java create mode 100644 400_xowa/src/gplx/xowa/wmfs/data/Site_interwikimap_tbl.java create mode 100644 400_xowa/src/gplx/xowa/wmfs/data/Site_json_parser.java create mode 100644 400_xowa/src/gplx/xowa/wmfs/data/Site_json_parser_tst.java rename 400_xowa/src/gplx/xowa/wmfs/data/{Xowmf_kv_itm.java => Site_kv_itm.java} (89%) create mode 100644 400_xowa/src/gplx/xowa/wmfs/data/Site_kv_tbl.java rename 400_xowa/src/gplx/xowa/wmfs/data/{Xowmf_language_itm.java => Site_language_itm.java} (80%) create mode 100644 400_xowa/src/gplx/xowa/wmfs/data/Site_language_tbl.java rename 400_xowa/src/gplx/xowa/wmfs/data/{Xowmf_library_itm.java => Site_library_itm.java} (80%) create mode 100644 400_xowa/src/gplx/xowa/wmfs/data/Site_library_tbl.java create mode 100644 400_xowa/src/gplx/xowa/wmfs/data/Site_magicword_itm.java create mode 100644 400_xowa/src/gplx/xowa/wmfs/data/Site_magicword_tbl.java create mode 100644 400_xowa/src/gplx/xowa/wmfs/data/Site_meta_itm.java create mode 100644 400_xowa/src/gplx/xowa/wmfs/data/Site_namespace_itm.java create mode 100644 400_xowa/src/gplx/xowa/wmfs/data/Site_namespace_tbl.java rename 400_xowa/src/gplx/xowa/wmfs/data/{Xowmf_namespacealias_itm.java => Site_namespacealias_itm.java} (71%) create mode 100644 400_xowa/src/gplx/xowa/wmfs/data/Site_namespacealias_tbl.java create mode 100644 400_xowa/src/gplx/xowa/wmfs/data/Site_showhook_itm.java create mode 100644 400_xowa/src/gplx/xowa/wmfs/data/Site_showhook_tbl.java create mode 100644 400_xowa/src/gplx/xowa/wmfs/data/Site_skin_itm.java create mode 100644 400_xowa/src/gplx/xowa/wmfs/data/Site_skin_tbl.java rename 400_xowa/src/gplx/xowa/wmfs/data/{Xowmf_specialpagealias_itm.java => Site_specialpagealias_itm.java} (75%) create mode 100644 400_xowa/src/gplx/xowa/wmfs/data/Site_specialpagealias_tbl.java create mode 100644 400_xowa/src/gplx/xowa/wmfs/data/Site_statistic_itm.java create mode 100644 400_xowa/src/gplx/xowa/wmfs/data/Site_statistic_tbl.java create mode 100644 400_xowa/src/gplx/xowa/wmfs/data/Site_val_tbl.java delete mode 100644 400_xowa/src/gplx/xowa/wmfs/data/Xowmf_defaultoption_tbl.java delete mode 100644 400_xowa/src/gplx/xowa/wmfs/data/Xowmf_extensions_tbl.java delete mode 100644 400_xowa/src/gplx/xowa/wmfs/data/Xowmf_general_tbl.java delete mode 100644 400_xowa/src/gplx/xowa/wmfs/data/Xowmf_interwikimap_tbl.java delete mode 100644 400_xowa/src/gplx/xowa/wmfs/data/Xowmf_json_parser.java delete mode 100644 400_xowa/src/gplx/xowa/wmfs/data/Xowmf_json_tbl.java delete mode 100644 400_xowa/src/gplx/xowa/wmfs/data/Xowmf_language_tbl.java delete mode 100644 400_xowa/src/gplx/xowa/wmfs/data/Xowmf_ns_tbl.java delete mode 100644 400_xowa/src/gplx/xowa/wmfs/data/Xowmf_protocol_tbl.java delete mode 100644 400_xowa/src/gplx/xowa/wmfs/data/Xowmf_site_tbl.java delete mode 100644 400_xowa/src/gplx/xowa/wmfs/data/Xowmf_specialpagealias_tbl.java delete mode 100644 400_xowa/src/gplx/xowa/wmfs/data/Xowmf_statistics_tbl.java delete mode 100644 400_xowa/src/gplx/xowa/wmfs/data/Xowmf_wiki_data.java create mode 100644 400_xowa/src/gplx/xowa/xtns/scribunto/libs/Scrib_lib_text_.java create mode 100644 400_xowa/src_240_install/gplx/xowa/Xoi_cmd_imageMagick_download.java delete mode 100644 400_xowa/src_240_install/gplx/xowa/Xoi_cmd_wiki.java create mode 100644 400_xowa/src_240_install/gplx/xowa/Xoi_cmd_wiki_download.java create mode 100644 400_xowa/src_240_install/gplx/xowa/Xoi_cmd_wiki_goto_page.java create mode 100644 400_xowa/src_240_install/gplx/xowa/Xoi_cmd_wiki_image_cfg.java create mode 100644 400_xowa/src_240_install/gplx/xowa/Xoi_cmd_wiki_unzip.java create mode 100644 400_xowa/src_240_install/gplx/xowa/Xoi_cmd_wiki_zip.java create mode 100644 400_xowa/src_440_lnki/gplx/xowa/Xop_lnki_wkr__size_tst.java create mode 100644 400_xowa/src_440_lnki/gplx/xowa/Xop_lnki_wkr__video_tst.java delete mode 100644 tst/400_xowa/root/wiki/en.wikipedia.org/en.wikipedia.org-file-user.xowa delete mode 100644 tst/400_xowa/root/wiki/en.wikipedia.org/en.wikipedia.org-file.xowa diff --git a/100_core/src/gplx/Err.java b/100_core/src/gplx/Err.java index facdd557f..0e0ecf454 100644 --- a/100_core/src/gplx/Err.java +++ b/100_core/src/gplx/Err.java @@ -47,7 +47,7 @@ public class Err extends RuntimeException { public String To_str__full() {return To_str(Bool_.N, Bool_.Y);} public String To_str__log() {return To_str(Bool_.Y, Bool_.Y);} public String To_str__msg_only(){ - return msgs_idx == 0 ? "<>" : msgs_ary[0].To_str(); // take 1st message only + return msgs_idx == 0 ? "<>" : msgs_ary[0].To_str_wo_type(); // take 1st message only } public String To_str__top_wo_args() { return msgs_idx == 0 ? "<>" : msgs_ary[0].To_str_wo_args(); diff --git a/100_core/src/gplx/Err_.java b/100_core/src/gplx/Err_.java index f62d4f43c..72bc16387 100644 --- a/100_core/src/gplx/Err_.java +++ b/100_core/src/gplx/Err_.java @@ -50,17 +50,18 @@ public class Err_ { } public static String Message_lang(Exception e) {return e.getMessage();} - public static String Trace_lang(Exception e) { - String rv = ""; - StackTraceElement[] ary = e.getStackTrace(); + public static String Trace_lang(Exception e) {return Trace_lang_exec(e.getStackTrace());} + public static String Trace_lang(Error e) {return Trace_lang_exec(e.getStackTrace());} + private static String Trace_lang_exec(StackTraceElement[] ary) { + String rv = ""; int len = ary.length; for (int i = 0; i < len; i++) { if (i != 0) rv += "\n"; rv += ary[i].toString(); } return rv; - } - public static boolean Type_match(Exception e, String type) { + } + public static boolean Type_match(Exception e, String type) { Err exc = Err_.as_(e); return exc == null ? false : exc.Type_match(type); } diff --git a/100_core/src/gplx/core/btries/Btrie_fast_mgr.java b/100_core/src/gplx/core/btries/Btrie_fast_mgr.java index f3544de3c..adb2a5a7a 100644 --- a/100_core/src/gplx/core/btries/Btrie_fast_mgr.java +++ b/100_core/src/gplx/core/btries/Btrie_fast_mgr.java @@ -110,11 +110,11 @@ public class Btrie_fast_mgr { } return dirty ? tmp_bfr.Xto_bry_and_clear() : src; } - public static Btrie_fast_mgr cs_() {return new Btrie_fast_mgr(false);} - public static Btrie_fast_mgr ci_ascii_() {return new Btrie_fast_mgr(true);} + public static Btrie_fast_mgr cs() {return new Btrie_fast_mgr(Bool_.N);} + public static Btrie_fast_mgr ci_a7() {return new Btrie_fast_mgr(Bool_.Y);} public static Btrie_fast_mgr new_(boolean case_any) {return new Btrie_fast_mgr(case_any);} - Btrie_fast_mgr(boolean caseAny) { - root = new ByteTrieItm_fast(Byte_.Zero, null, caseAny); + Btrie_fast_mgr(boolean case_any) { + root = new ByteTrieItm_fast(Byte_.Zero, null, case_any); } } class ByteTrieItm_fast { @@ -122,7 +122,7 @@ class ByteTrieItm_fast { public byte Key_byte() {return key_byte;} private byte key_byte; public Object Val() {return val;} public void Val_set(Object val) {this.val = val;} Object val; public boolean Ary_is_empty() {return ary_is_empty;} private boolean ary_is_empty; - public boolean CaseAny() {return caseAny;} public ByteTrieItm_fast CaseAny_(boolean v) {caseAny = v; return this;} private boolean caseAny; + public boolean CaseAny() {return case_any;} public ByteTrieItm_fast CaseAny_(boolean v) {case_any = v; return this;} private boolean case_any; public void Clear() { val = null; for (int i = 0; i < 256; i++) { @@ -135,22 +135,22 @@ class ByteTrieItm_fast { ary_is_empty = true; } public ByteTrieItm_fast Ary_find(byte b) { - int key_byte = (caseAny && (b > 64 && b < 91) ? b + 32 : b) & 0xff;// PATCH.JAVA:need to convert to unsigned byte + int key_byte = (case_any && (b > 64 && b < 91) ? b + 32 : b) & 0xff;// PATCH.JAVA:need to convert to unsigned byte return ary[key_byte]; } public ByteTrieItm_fast Ary_add(byte b, Object val) { - int key_byte = (caseAny && (b > 64 && b < 91) ? b + 32 : b) & 0xff;// PATCH.JAVA:need to convert to unsigned byte - ByteTrieItm_fast rv = new ByteTrieItm_fast(b, val, caseAny); + int key_byte = (case_any && (b > 64 && b < 91) ? b + 32 : b) & 0xff;// PATCH.JAVA:need to convert to unsigned byte + ByteTrieItm_fast rv = new ByteTrieItm_fast(b, val, case_any); ary[key_byte] = rv; ++ary_len; ary_is_empty = false; return rv; } public void Ary_del(byte b) { - int key_byte = (caseAny && (b > 64 && b < 91) ? b + 32 : b) & 0xff;// PATCH.JAVA:need to convert to unsigned byte + int key_byte = (case_any && (b > 64 && b < 91) ? b + 32 : b) & 0xff;// PATCH.JAVA:need to convert to unsigned byte ary[key_byte] = null; --ary_len; ary_is_empty = ary_len == 0; } int ary_len = 0; - public ByteTrieItm_fast(byte key_byte, Object val, boolean caseAny) {this.key_byte = key_byte; this.val = val; this.caseAny = caseAny;} + public ByteTrieItm_fast(byte key_byte, Object val, boolean case_any) {this.key_byte = key_byte; this.val = val; this.case_any = case_any;} } diff --git a/100_core/src/gplx/core/btries/Btrie_fast_mgr_tst.java b/100_core/src/gplx/core/btries/Btrie_fast_mgr_tst.java index bbc521ae8..a39857240 100644 --- a/100_core/src/gplx/core/btries/Btrie_fast_mgr_tst.java +++ b/100_core/src/gplx/core/btries/Btrie_fast_mgr_tst.java @@ -59,7 +59,7 @@ public class Btrie_fast_mgr_tst { class Btrie_fast_mgr_fxt { private Btrie_fast_mgr trie; public void Clear() { - trie = Btrie_fast_mgr.cs_(); + trie = Btrie_fast_mgr.cs(); Init_add( 1 , Byte_ascii.Ltr_a); Init_add(123 , Byte_ascii.Ltr_a, Byte_ascii.Ltr_b, Byte_ascii.Ltr_c); } diff --git a/100_core/src/gplx/core/btries/Btrie_slim_itm_tst.java b/100_core/src/gplx/core/btries/Btrie_slim_itm_tst.java index 472011704..26770864a 100644 --- a/100_core/src/gplx/core/btries/Btrie_slim_itm_tst.java +++ b/100_core/src/gplx/core/btries/Btrie_slim_itm_tst.java @@ -44,6 +44,6 @@ public class Btrie_slim_itm_tst { Object actl = actl_itm == null ? null : actl_itm.Val(); Tfds.Eq(expd, actl); } - private void run_Add(byte... ary) {for (byte b : ary) itm.Ary_add(b, Char_.XtoStr((char)b));} + private void run_Add(byte... ary) {for (byte b : ary) itm.Ary_add(b, Char_.To_str((char)b));} private void run_Del(byte... ary) {for (byte b : ary) itm.Ary_del(b);} } diff --git a/100_core/src/gplx/core/criterias/Criteria.java b/100_core/src/gplx/core/criterias/Criteria.java index 18f209c53..30e11db16 100644 --- a/100_core/src/gplx/core/criterias/Criteria.java +++ b/100_core/src/gplx/core/criterias/Criteria.java @@ -16,7 +16,7 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.core.criterias; import gplx.*; import gplx.core.*; -public interface Criteria extends XtoStrAble { +public interface Criteria extends To_str_able { byte Tid(); boolean Matches(Object obj); void Val_from_args(Hash_adp args); diff --git a/100_core/src/gplx/core/criterias/Criteria_between.java b/100_core/src/gplx/core/criterias/Criteria_between.java index 4202afee6..91a36439b 100644 --- a/100_core/src/gplx/core/criterias/Criteria_between.java +++ b/100_core/src/gplx/core/criterias/Criteria_between.java @@ -28,7 +28,7 @@ public class Criteria_between implements Criteria { } public Comparable Lhs() {return lhs;} private Comparable lhs; public Comparable Rhs() {return rhs;} private Comparable rhs; - public String XtoStr() {return String_.Concat_any("BETWEEN ", lhs, " AND ", rhs);} + public String To_str() {return String_.Concat_any("BETWEEN ", lhs, " AND ", rhs);} public boolean Matches(Object compObj) { Comparable comp = CompareAble_.as_(compObj); int lhsResult = CompareAble_.CompareComparables(lhs, comp); diff --git a/100_core/src/gplx/core/criterias/Criteria_bool_base.java b/100_core/src/gplx/core/criterias/Criteria_bool_base.java index 025a8be3f..b5aa9a3bb 100644 --- a/100_core/src/gplx/core/criterias/Criteria_bool_base.java +++ b/100_core/src/gplx/core/criterias/Criteria_bool_base.java @@ -22,7 +22,7 @@ public abstract class Criteria_bool_base implements Criteria { public abstract boolean Matches(Object curVal); public void Val_from_args(Hash_adp args) {lhs.Val_from_args(args); rhs.Val_from_args(args);} public void Val_as_obj_(Object v) {throw Err_.new_unimplemented();} - public String XtoStr() {return String_.Concat(lhs.XtoStr(), " ", this.op_literal, " ", rhs.XtoStr());} + public String To_str() {return String_.Concat(lhs.To_str(), " ", this.op_literal, " ", rhs.To_str());} public String Op_literal() {return op_literal;} private String op_literal; public Criteria Lhs() {return lhs;} private Criteria lhs; public Criteria Rhs() {return rhs;} private Criteria rhs; @@ -44,7 +44,7 @@ class Criteria_const implements Criteria { public boolean Matches(Object comp) {return val;} private final boolean val; public void Val_from_args(Hash_adp args) {;} public void Val_as_obj_(Object v) {throw Err_.new_unimplemented();} - public String XtoStr() {return String_.Concat(" IS ", Bool_.Xto_str_lower(val));} + public String To_str() {return String_.Concat(" IS ", Bool_.Xto_str_lower(val));} } class Criteria_not implements Criteria { private final Criteria criteria; @@ -53,5 +53,5 @@ class Criteria_not implements Criteria { public boolean Matches(Object obj) {return !criteria.Matches(obj);} public void Val_from_args(Hash_adp args) {criteria.Val_from_args(args);} public void Val_as_obj_(Object v) {criteria.Val_as_obj_(v);} - public String XtoStr() {return String_.Concat_any(" NOT ", criteria.XtoStr());} + public String To_str() {return String_.Concat_any(" NOT ", criteria.To_str());} } diff --git a/100_core/src/gplx/core/criterias/Criteria_comp.java b/100_core/src/gplx/core/criterias/Criteria_comp.java index b8fd3e2b8..241e7d97e 100644 --- a/100_core/src/gplx/core/criterias/Criteria_comp.java +++ b/100_core/src/gplx/core/criterias/Criteria_comp.java @@ -27,7 +27,7 @@ public class Criteria_comp implements Criteria { Comparable comp = CompareAble_.as_(compObj); return CompareAble_.Is(comp_mode, comp, val); } - public String XtoStr() {return String_.Concat_any(XtoSymbol(), " ", val);} + public String To_str() {return String_.Concat_any(XtoSymbol(), " ", val);} public String XtoSymbol() { String comp_sym = comp_mode < CompareAble_.Same ? "<" : ">"; String eq_sym = comp_mode % 2 == CompareAble_.Same ? "=" : ""; diff --git a/100_core/src/gplx/core/criterias/Criteria_eq.java b/100_core/src/gplx/core/criterias/Criteria_eq.java index 76586b147..5be5b84a3 100644 --- a/100_core/src/gplx/core/criterias/Criteria_eq.java +++ b/100_core/src/gplx/core/criterias/Criteria_eq.java @@ -29,6 +29,6 @@ public class Criteria_eq implements Criteria { boolean rv = Object_.Eq(val, comp); return negated ? !rv : rv; } - public String XtoStr() {return String_.Concat_any("= ", val);} + public String To_str() {return String_.Concat_any("= ", val);} public static Criteria_eq as_(Object obj) {return obj instanceof Criteria_eq ? (Criteria_eq)obj : null;} } diff --git a/100_core/src/gplx/core/criterias/Criteria_fld.java b/100_core/src/gplx/core/criterias/Criteria_fld.java index 4eb67c4fa..9d3b303b8 100644 --- a/100_core/src/gplx/core/criterias/Criteria_fld.java +++ b/100_core/src/gplx/core/criterias/Criteria_fld.java @@ -33,7 +33,7 @@ public class Criteria_fld implements Criteria { Object comp = GfoInvkAble_.InvkCmd(invk, key); return crt.Matches(comp); } - public String XtoStr() {return String_.Concat(key, " ", crt.XtoStr());} + public String To_str() {return String_.Concat(key, " ", crt.To_str());} public static final String Key_null = null; public static Criteria_fld as_(Object obj) {return obj instanceof Criteria_fld ? (Criteria_fld)obj : null;} public static Criteria_fld new_(String key, Criteria crt) {return new Criteria_fld(key, crt);} diff --git a/100_core/src/gplx/core/criterias/Criteria_in.java b/100_core/src/gplx/core/criterias/Criteria_in.java index ae761d3ce..b031b60b4 100644 --- a/100_core/src/gplx/core/criterias/Criteria_in.java +++ b/100_core/src/gplx/core/criterias/Criteria_in.java @@ -41,6 +41,6 @@ public class Criteria_in implements Criteria { } return negated ? !rv : rv; } - public String XtoStr() {return String_.Concat_any("IN ", String_.Concat_any(ary));} + public String To_str() {return String_.Concat_any("IN ", String_.Concat_any(ary));} public static Criteria_in as_(Object obj) {return obj instanceof Criteria_in ? (Criteria_in)obj : null;} } diff --git a/100_core/src/gplx/core/criterias/Criteria_ioMatch.java b/100_core/src/gplx/core/criterias/Criteria_ioMatch.java index 3c33ef2d1..ca8a237d4 100644 --- a/100_core/src/gplx/core/criterias/Criteria_ioMatch.java +++ b/100_core/src/gplx/core/criterias/Criteria_ioMatch.java @@ -29,7 +29,7 @@ public class Criteria_ioMatch implements Criteria { // EX: url IOMATCH '*.xml|*. boolean rv = pattern.Matches(comp.XtoCaseNormalized()); return match ? rv : !rv; } - public String XtoStr() {return String_.Concat_any("IOMATCH ", pattern);} + public String To_str() {return String_.Concat_any("IOMATCH ", pattern);} public static final String TokenName = "IOMATCH"; public static Criteria_ioMatch as_(Object obj) {return obj instanceof Criteria_ioMatch ? (Criteria_ioMatch)obj : null;} diff --git a/100_core/src/gplx/core/criterias/Criteria_like.java b/100_core/src/gplx/core/criterias/Criteria_like.java index e84270902..2f6c4417c 100644 --- a/100_core/src/gplx/core/criterias/Criteria_like.java +++ b/100_core/src/gplx/core/criterias/Criteria_like.java @@ -31,6 +31,6 @@ public class Criteria_like implements Criteria { boolean rv = pattern.Matches(comp); return negated ? !rv : rv; } - public String XtoStr() {return String_.Concat_any("LIKE ", pattern);} + public String To_str() {return String_.Concat_any("LIKE ", pattern);} public static Criteria_like as_(Object obj) {return obj instanceof Criteria_like ? (Criteria_like)obj : null;} } \ No newline at end of file diff --git a/100_core/src/gplx/core/regxs/Regx_adp__tst.java b/100_core/src/gplx/core/regxs/Regx_adp__tst.java index 352f91da3..42fab6e83 100644 --- a/100_core/src/gplx/core/regxs/Regx_adp__tst.java +++ b/100_core/src/gplx/core/regxs/Regx_adp__tst.java @@ -84,7 +84,7 @@ public class Regx_adp__tst implements TfdsEqListItmStr { } return rv.To_str_ary(); } - public String XtoStr(Object curObj, Object expdObj) { + public String To_str(Object curObj, Object expdObj) { Regx_match cur = (Regx_match)curObj, expd = (Regx_match)expdObj; String rv = "bgn=" + cur.Find_bgn(); if (expd != null && expd.Find_len() != Int_.MinValue) rv += " len=" + cur.Find_len(); diff --git a/100_core/src/gplx/core/regxs/Regx_bldr.java b/100_core/src/gplx/core/regxs/Regx_bldr.java index cae6f4c69..a29f0c18e 100644 --- a/100_core/src/gplx/core/regxs/Regx_bldr.java +++ b/100_core/src/gplx/core/regxs/Regx_bldr.java @@ -30,7 +30,7 @@ public class Regx_bldr { sb.Add(Regx_bldr.Tkn_Escape); sb.Add(c); } - return sb.XtoStr(); + return sb.To_str(); } public static boolean RegxChar_chk(char c) { return diff --git a/100_core/src/gplx/core/strings/String_bldr.java b/100_core/src/gplx/core/strings/String_bldr.java index 0099a2506..a6a19c9de 100644 --- a/100_core/src/gplx/core/strings/String_bldr.java +++ b/100_core/src/gplx/core/strings/String_bldr.java @@ -31,7 +31,7 @@ public interface String_bldr { String_bldr Add_spr_unless_first(String s, String spr, int i); String_bldr Clear(); String Xto_str_and_clear(); - String XtoStr(); + String To_str(); int Count(); String_bldr Add(byte[] v); String_bldr Add(String s); @@ -71,12 +71,12 @@ abstract class String_bldr_base implements String_bldr { } public String_bldr Clear() {Del(0, Count()); return this;} public String Xto_str_and_clear() { - String rv = XtoStr(); + String rv = To_str(); Clear(); return rv; } - @Override public String toString() {return XtoStr();} - public abstract String XtoStr(); + @Override public String toString() {return To_str();} + public abstract String To_str(); public abstract int Count(); public abstract String_bldr Add_at(int idx, String s); public abstract String_bldr Add(byte[] v); @@ -89,7 +89,7 @@ abstract class String_bldr_base implements String_bldr { } class String_bldr_thread_single extends String_bldr_base { private java.lang.StringBuilder sb = new java.lang.StringBuilder(); - @Override public String XtoStr() {return sb.toString();} + @Override public String To_str() {return sb.toString();} @Override public int Count() {return sb.length();} @Override public String_bldr Add_at(int idx, String s) {sb.insert(idx, s); return this;} @Override public String_bldr Add(byte[] v) {sb.append(String_.new_u8(v)); return this;} @@ -102,7 +102,7 @@ class String_bldr_thread_single extends String_bldr_base { } class String_bldr_thread_multiple extends String_bldr_base { private java.lang.StringBuffer sb = new java.lang.StringBuffer(); - @Override public String XtoStr() {return sb.toString();} + @Override public String To_str() {return sb.toString();} @Override public int Count() {return sb.length();} @Override public String_bldr Add_at(int idx, String s) {sb.insert(idx, s); return this;} @Override public String_bldr Add(byte[] v) {sb.append(String_.new_u8(v)); return this;} diff --git a/100_core/src_100_interface/gplx/RlsAble_.java b/100_core/src_100_interface/gplx/RlsAble_.java index 80fc62122..1ee71dbd0 100644 --- a/100_core/src_100_interface/gplx/RlsAble_.java +++ b/100_core/src_100_interface/gplx/RlsAble_.java @@ -19,4 +19,8 @@ package gplx; public class RlsAble_ { public static RlsAble as_(Object obj) {return obj instanceof RlsAble ? (RlsAble)obj : null;} public static RlsAble cast_(Object obj) {try {return (RlsAble)obj;} catch(Exception exc) {throw Err_.new_type_mismatch_w_exc(exc, RlsAble.class, obj);}} + public static final RlsAble Null = new RlsAble__noop(); +} +class RlsAble__noop implements RlsAble { + public void Rls() {} } diff --git a/100_core/src_100_interface/gplx/SrlAble_.java b/100_core/src_100_interface/gplx/SrlAble_.java index 8f9e0c85f..9196a5e87 100644 --- a/100_core/src_100_interface/gplx/SrlAble_.java +++ b/100_core/src_100_interface/gplx/SrlAble_.java @@ -19,18 +19,18 @@ package gplx; import gplx.core.strings.*; public class SrlAble_ { public static SrlAble as_(Object obj) {return obj instanceof SrlAble ? (SrlAble)obj : null;} - public static String XtoStr(GfoMsg owner) { + public static String To_str(GfoMsg owner) { String_bldr sb = String_bldr_.new_(); - XtoStr(owner, sb, 0, false); - return sb.XtoStr(); + To_str(owner, sb, 0, false); + return sb.To_str(); } - public static String XtoStr(Object o) { + public static String To_str(Object o) { SrlAble s = SrlAble_.as_(o); if (s == null) return Object_.Xto_str_strict_or_null_mark(o); GfoMsg m = GfoMsg_.new_parse_("root"); s.Srl(m); - return XtoStr(m); + return To_str(m); } - static void XtoStr(GfoMsg owner, String_bldr sb, int depth, boolean indentOn) { + static void To_str(GfoMsg owner, String_bldr sb, int depth, boolean indentOn) { String indent = String_.Repeat(" ", depth * 4); if (indentOn) sb.Add(indent); sb.Add(owner.Key()).Add(":"); @@ -46,7 +46,7 @@ public class SrlAble_ { } else if (subsCount == 1) { sb.Add("{"); - XtoStr(owner.Subs_getAt(0), sb, depth + 1, false); + To_str(owner.Subs_getAt(0), sb, depth + 1, false); sb.Add("}"); return; } @@ -55,7 +55,7 @@ public class SrlAble_ { if (subsCount > 1) sb.Add_char_crlf(); for (int i = 0; i < subsCount; i++) { GfoMsg sub = owner.Subs_getAt(i); - XtoStr(sub, sb, depth + 1, true); + To_str(sub, sb, depth + 1, true); sb.Add_char_crlf(); } sb.Add(indent); diff --git a/100_core/src_100_interface/gplx/SrlAble__tst.java b/100_core/src_100_interface/gplx/SrlAble__tst.java index 8b7bbd7a2..2ff075fe4 100644 --- a/100_core/src_100_interface/gplx/SrlAble__tst.java +++ b/100_core/src_100_interface/gplx/SrlAble__tst.java @@ -61,6 +61,6 @@ public class SrlAble__tst { ) ); } - void tst_Srl_(GfoMsg m, String expd) {Tfds.Eq(expd, SrlAble_.XtoStr(m));} + void tst_Srl_(GfoMsg m, String expd) {Tfds.Eq(expd, SrlAble_.To_str(m));} } //class SrlAble__tst diff --git a/100_core/src_100_interface/gplx/XtoStrAble.java b/100_core/src_100_interface/gplx/To_str_able.java similarity index 93% rename from 100_core/src_100_interface/gplx/XtoStrAble.java rename to 100_core/src_100_interface/gplx/To_str_able.java index e65d978f1..69946ef14 100644 --- a/100_core/src_100_interface/gplx/XtoStrAble.java +++ b/100_core/src_100_interface/gplx/To_str_able.java @@ -16,6 +16,6 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx; -public interface XtoStrAble { - String XtoStr(); +public interface To_str_able { + String To_str(); } diff --git a/100_core/src_100_interface/gplx/XtoStrAble_.java b/100_core/src_100_interface/gplx/To_str_able_.java similarity index 84% rename from 100_core/src_100_interface/gplx/XtoStrAble_.java rename to 100_core/src_100_interface/gplx/To_str_able_.java index 755b274bf..f44291933 100644 --- a/100_core/src_100_interface/gplx/XtoStrAble_.java +++ b/100_core/src_100_interface/gplx/To_str_able_.java @@ -16,6 +16,6 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx; -public class XtoStrAble_ { - public static XtoStrAble as_(Object obj) {return obj instanceof XtoStrAble ? (XtoStrAble)obj : null;} +class To_str_able_ { + public static To_str_able as_(Object obj) {return obj instanceof To_str_able ? (To_str_able)obj : null;} } diff --git a/100_core/src_110_primitive/gplx/Array_.java b/100_core/src_110_primitive/gplx/Array_.java index 52d77562b..ff9efc8aa 100644 --- a/100_core/src_110_primitive/gplx/Array_.java +++ b/100_core/src_110_primitive/gplx/Array_.java @@ -62,12 +62,12 @@ public class Array_ { CopyTo(src, 0, trg, 0, copy_len); return trg; } - public static String XtoStr(Object ary) { + public static String To_str(Object ary) { String_bldr sb = String_bldr_.new_(); int ary_len = Len(ary); for (int i = 0; i < ary_len; i++) sb.Add_obj(Get(ary, i)).Add_char_nl(); - return sb.XtoStr(); + return sb.To_str(); } public static int Len(Object ary) {return Array.getLength(ary);} public static final int LenAry(Object[] ary) {return ary == null ? 0 : ary.length;} diff --git a/100_core/src_110_primitive/gplx/Bry_bfr.java b/100_core/src_110_primitive/gplx/Bry_bfr.java index 7d842727e..61d68c943 100644 --- a/100_core/src_110_primitive/gplx/Bry_bfr.java +++ b/100_core/src_110_primitive/gplx/Bry_bfr.java @@ -495,6 +495,7 @@ public class Bry_bfr { return this; } public boolean Eq(byte b) {return bfr_len == 1 && bfr[0] == b;} + public byte[] Xto_bry(int bgn, int end) {return bfr_len == 0 ? Bry_.Empty : Bry_.Mid(bfr, bgn, end);} public byte[] Xto_bry() {return bfr_len == 0 ? Bry_.Empty : Bry_.Mid(bfr, 0, bfr_len);} public byte[] Xto_bry_and_reset(int v) { byte[] rv = Xto_bry(); diff --git a/100_core/src_110_primitive/gplx/Bry_fmtr.java b/100_core/src_110_primitive/gplx/Bry_fmtr.java index b360192aa..d7a4a38e5 100644 --- a/100_core/src_110_primitive/gplx/Bry_fmtr.java +++ b/100_core/src_110_primitive/gplx/Bry_fmtr.java @@ -113,7 +113,7 @@ public class Bry_fmtr { else rv.Add(itm.DatStr()); } - return rv.XtoStr(); + return rv.To_str(); } private Bry_fmtr_itm[] itms; int itms_len; public byte[] Missing_bgn() {return missing_bgn;} public Bry_fmtr Missing_bgn_(byte[] v) {missing_bgn = v; return this;} private byte[] missing_bgn = missing_bgn_static; static byte[] missing_bgn_static = Bry_.new_u8("~{"), missing_end_static = Bry_.new_u8("}"); public byte[] Missing_end() {return missing_end;} public Bry_fmtr Missing_end_(byte[] v) {missing_end = v; return this;} private byte[] missing_end = missing_end_static; diff --git a/100_core/src_110_primitive/gplx/Char_.java b/100_core/src_110_primitive/gplx/Char_.java index 9eb41d364..cfa2d176f 100644 --- a/100_core/src_110_primitive/gplx/Char_.java +++ b/100_core/src_110_primitive/gplx/Char_.java @@ -65,11 +65,11 @@ public class Char_ { if (itm == match) return true; return false; } - public static String XtoStr(char[] ary, int pos, int length) {return new String(ary, pos, length);} - public static byte[] XtoByteAry(int v) {return Bry_.new_u8(Char_.XtoStr((char)v));} + public static String To_str(char[] ary, int pos, int length) {return new String(ary, pos, length);} + public static byte[] XtoByteAry(int v) {return Bry_.new_u8(Char_.To_str((char)v));} public static char XbyInt(int i) {return (char)i;} - public static String XtoStr(int b) {return XtoStr((char)b);} - public static String XtoStr(char c) {return String.valueOf(c);} + public static String To_str(int b) {return To_str((char)b);} + public static String To_str(char c) {return String.valueOf(c);} public static byte XtoByte(char c) {return (byte)c;} public static char cast_(Object o) {try {return (Character)o;} catch(Exception e) {throw Err_.new_type_mismatch_w_exc(e, char.class, o);}} public static char parse_(String raw) {try {return raw.charAt(0);} catch(Exception exc) {throw Err_.new_parse_exc(exc, char.class, raw);}} diff --git a/100_core/src_110_primitive/gplx/Int_.java b/100_core/src_110_primitive/gplx/Int_.java index 9e8afd184..9e080e8e0 100644 --- a/100_core/src_110_primitive/gplx/Int_.java +++ b/100_core/src_110_primitive/gplx/Int_.java @@ -198,18 +198,19 @@ public class Int_ implements GfoInvkAble { return -1; } } - public static String Xto_str_hex(int v) { + public static String Xto_str_hex(int v) {return Xto_str_hex(Bool_.Y, Bool_.Y, v);} + public static String Xto_str_hex(boolean zero_pad, boolean upper, int v) { String rv = Integer.toHexString(v); - int rvLen = String_.Len(rv); - if (rvLen < 8) rv = String_.Repeat("0", 8 - rvLen) + rv; - return String_.Upper(rv); + int rv_len = String_.Len(rv); + if (zero_pad && rv_len < 8) rv = String_.Repeat("0", 8 - rv_len) + rv; + return upper ? String_.Upper(rv) : rv; } public static String Xto_str(int[] ary) {return Xto_str(ary, " ");} public static String Xto_str(int[] ary, String dlm) { String_bldr sb = String_bldr_.new_(); for (int i = 0; i < ary.length; i++) sb.Add_spr_unless_first(Int_.Xto_str(ary[i]), dlm, i); - return sb.XtoStr(); + return sb.To_str(); } public static int[] Ary_parse(String raw_str, int reqd_len, int[] or) { byte[] raw_bry = Bry_.new_a7(raw_str); diff --git a/100_core/src_110_primitive/gplx/String_.java b/100_core/src_110_primitive/gplx/String_.java index be26c4eec..7b392b98e 100644 --- a/100_core/src_110_primitive/gplx/String_.java +++ b/100_core/src_110_primitive/gplx/String_.java @@ -238,7 +238,7 @@ public class String_ implements GfoInvkAble { for (int i = 0; i < padLen; i++) sb.Add(pad); if (bgn) sb.Add(s); - return sb.XtoStr(); + return sb.To_str(); } public static String TrimEnd(String s) {if (s == null) return null; int len = String_.Len(s); @@ -258,7 +258,7 @@ public class String_ implements GfoInvkAble { String_bldr sb = String_bldr_.new_(); for (int i = 0; i < count; i++) sb.Add(s); - return sb.XtoStr(); + return sb.To_str(); } public static String Insert(String s, int pos, String toInsert) { if (pos < 0 || pos >= String_.Len(s)) throw Err_.new_wo_type("String_.Insert failed; pos invalid", "pos", pos, "s", s, "toInsert", toInsert); @@ -272,15 +272,15 @@ public class String_ implements GfoInvkAble { String_bldr sb = String_bldr_.new_(); for (String val : ary) sb.Add(val); - return sb.XtoStr(); + return sb.To_str(); } public static String Concat_any(Object... ary) { String_bldr sb = String_bldr_.new_(); for (Object val : ary) sb.Add_obj(val); - return sb.XtoStr(); + return sb.To_str(); } - public static String ConcatWith_any(String separator, Object... ary) { + public static String Concat_with_obj(String separator, Object... ary) { String_bldr sb = String_bldr_.new_(); int aryLen = Array_.Len(ary); for (int i = 0; i < aryLen; i++) { @@ -288,7 +288,7 @@ public class String_ implements GfoInvkAble { Object val = ary[i]; sb.Add_obj(Object_.Xto_str_strict_or_empty(val)); } - return sb.XtoStr(); + return sb.To_str(); } public static String Concat_with_str(String spr, String... ary) { String_bldr sb = String_bldr_.new_(); @@ -297,13 +297,13 @@ public class String_ implements GfoInvkAble { if (i != 0) sb.Add(spr); sb.Add_obj(ary[i]); } - return sb.XtoStr(); + return sb.To_str(); } public static String Concat_lines_crlf(String... values) { String_bldr sb = String_bldr_.new_(); for (String val : values) sb.Add(val).Add(String_.CrLf); - return sb.XtoStr(); + return sb.To_str(); } public static String Concat_lines_crlf_skipLast(String... values) { String_bldr sb = String_bldr_.new_(); @@ -311,13 +311,13 @@ public class String_ implements GfoInvkAble { if (sb.Count() != 0) sb.Add(String_.CrLf); sb.Add(val); } - return sb.XtoStr(); + return sb.To_str(); } public static String Concat_lines_nl(String... values) { String_bldr sb = String_bldr_.new_(); for (String val : values) sb.Add(val).Add("\n"); - return sb.XtoStr(); + return sb.To_str(); } public static String Concat_lines_nl_skip_last(String... ary) { String_bldr sb = String_bldr_.new_(); @@ -326,7 +326,7 @@ public class String_ implements GfoInvkAble { sb.Add(ary[i]); if (i != ary_end) sb.Add("\n"); } - return sb.XtoStr(); + return sb.To_str(); } public static String[] Ary(String... ary) {return ary;} @@ -344,7 +344,7 @@ public class String_ implements GfoInvkAble { String_bldr sb = String_bldr_.new_(); for (String s : ary) sb.Add(s).Add(";"); - return sb.XtoStr(); + return sb.To_str(); } public static final String[] Ary_empty = new String[0]; public static String[] Split(String raw, char dlm) {return Split(raw, dlm, false);} @@ -419,7 +419,7 @@ public class String_ implements GfoInvkAble { } if (Len(numberStr) > 0) // unclosed bracket; add bracketBgn and whatever is in numberStr; ex: "{0" sb.Add(bracketBgn).Add(numberStr); - return sb.XtoStr(); + return sb.To_str(); } static String[] Split_do(String s, String spr, boolean skipChar13) { if (String_.Eq(s, "") // "".Split('a') return array with one member: "" diff --git a/100_core/src_110_primitive/gplx/String__tst.java b/100_core/src_110_primitive/gplx/String__tst.java index 285eaaf75..21dc0f83c 100644 --- a/100_core/src_110_primitive/gplx/String__tst.java +++ b/100_core/src_110_primitive/gplx/String__tst.java @@ -153,11 +153,11 @@ public class String__tst { // acceptance tst_Split("this\r\nis\na\rtest\r\n.", "\r\n", "this", "is\na\rtest", "."); } void tst_Split(String text, String separator, String... expd) {Tfds.Eq_ary(expd, String_.Split(text, separator));} - @Test public void ConcatWith_any() { + @Test public void Concat_with_obj() { tst_ConcatWith_any("a|b", "|", "a", "b"); // do not append final delimiter tst_ConcatWith_any("a||c", "|", "a", null, "c"); // null tst_ConcatWith_any("a|b", "|", Object_.Ary("a", "b")); // pass array as arg - } void tst_ConcatWith_any(String expd, String delimiter, Object... array) {Tfds.Eq(expd, String_.ConcatWith_any(delimiter, array));} + } void tst_ConcatWith_any(String expd, String delimiter, Object... array) {Tfds.Eq(expd, String_.Concat_with_obj(delimiter, array));} @Test public void Compare_byteAry() { tst_Compare_byteAry("a", "a", CompareAble_.Same); tst_Compare_byteAry("a", "b", CompareAble_.Less); diff --git a/100_core/src_120_basicDataType/gplx/EnmMgr.java b/100_core/src_120_basicDataType/gplx/EnmMgr.java index 53fabd0a3..ff5cbb945 100644 --- a/100_core/src_120_basicDataType/gplx/EnmMgr.java +++ b/100_core/src_120_basicDataType/gplx/EnmMgr.java @@ -59,7 +59,7 @@ public class EnmMgr { if (cur > 0 // cur is non-Modifier; NOTE: check needed for args that are just a Modifier; || sb.Count() == 0) // cur is IptKey.None; cur == 0, but sb.length will also be 0 AppendRaw(sb, cur); - return sb.XtoStr(); + return sb.To_str(); } void AppendRaw(String_bldr sb, int key) { String raw = (String)valRegy.Get_by(key); diff --git a/100_core/src_120_basicDataType/gplx/Guid_adp.java b/100_core/src_120_basicDataType/gplx/Guid_adp.java index 04822f682..2abe4054d 100644 --- a/100_core/src_120_basicDataType/gplx/Guid_adp.java +++ b/100_core/src_120_basicDataType/gplx/Guid_adp.java @@ -17,6 +17,6 @@ along with this program. If not, see . */ package gplx; public class Guid_adp { - public String XtoStr() {return guid.toString();} + public String To_str() {return guid.toString();} public Guid_adp(java.util.UUID guid) {this.guid = guid;} java.util.UUID guid; } \ No newline at end of file diff --git a/100_core/src_120_basicDataType/gplx/Guid_adp__tst.java b/100_core/src_120_basicDataType/gplx/Guid_adp__tst.java index e3c11cb66..f51c7733b 100644 --- a/100_core/src_120_basicDataType/gplx/Guid_adp__tst.java +++ b/100_core/src_120_basicDataType/gplx/Guid_adp__tst.java @@ -23,6 +23,6 @@ public class Guid_adp__tst { } void tst_parse_(String s) { Guid_adp uuid = Guid_adp_.parse_(s); - Tfds.Eq(uuid.XtoStr(), s); + Tfds.Eq(uuid.To_str(), s); } } diff --git a/100_core/src_120_basicDataType/gplx/Io_url.java b/100_core/src_120_basicDataType/gplx/Io_url.java index a1d264e9b..fd2507f04 100644 --- a/100_core/src_120_basicDataType/gplx/Io_url.java +++ b/100_core/src_120_basicDataType/gplx/Io_url.java @@ -82,7 +82,7 @@ public class Io_url implements CompareAble, EqAble, ParseAble, GfoInvkAble { //_ if (isFil && i == len - 1) break; // do not add closing backslash if last term sb.Add(info.DirSpr()); } - return Io_url_.new_inf_(sb.XtoStr(), info); + return Io_url_.new_inf_(sb.To_str(), info); } public Object ParseAsObj(String raw) {return Io_url_.new_any_(raw);} @Override public String toString() {return raw;} diff --git a/100_core/src_120_basicDataType/gplx/KeyVal.java b/100_core/src_120_basicDataType/gplx/KeyVal.java index 9df3f77fb..4bea51870 100644 --- a/100_core/src_120_basicDataType/gplx/KeyVal.java +++ b/100_core/src_120_basicDataType/gplx/KeyVal.java @@ -16,7 +16,7 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx; -public class KeyVal implements XtoStrAble { +public class KeyVal implements To_str_able { @gplx.Internal protected KeyVal(byte key_tid, Object k, Object v) {this.key_tid = key_tid; key = k; val = v;} public String Key() {return Object_.Xto_str_strict_or_null(key);} public byte Key_tid() {return key_tid;} private byte key_tid; @@ -26,6 +26,6 @@ public class KeyVal implements XtoStrAble { public String Val_to_str_or_empty() {return Object_.Xto_str_strict_or_empty(val);} public String Val_to_str_or_null() {return Object_.Xto_str_strict_or_null(val);} public byte[] Val_to_bry() {return Bry_.new_u8(Object_.Xto_str_strict_or_null(val));} - @Override public String toString() {return XtoStr();} - public String XtoStr() {return Key() + "=" + Object_.Xto_str_strict_or_null_mark(val);} + @Override public String toString() {return To_str();} + public String To_str() {return Key() + "=" + Object_.Xto_str_strict_or_null_mark(val);} } diff --git a/100_core/src_120_basicDataType/gplx/KeyValList.java b/100_core/src_120_basicDataType/gplx/KeyValList.java index e6e3957f2..2e7cb1e50 100644 --- a/100_core/src_120_basicDataType/gplx/KeyValList.java +++ b/100_core/src_120_basicDataType/gplx/KeyValList.java @@ -23,14 +23,14 @@ public class KeyValList {//20101217 public KeyVal GetAt(int i) {return (KeyVal)list.Get_at(i);} public KeyValList Add(String key, Object val) {list.Add(KeyVal_.new_(key, val)); return this;} public KeyVal[] Xto_bry() {return (KeyVal[])list.To_ary(KeyVal.class);} - public String XtoStr() { + public String To_str() { String_bldr sb = String_bldr_.new_(); for (int i = 0; i < list.Count(); i++) { KeyVal kv = (KeyVal)list.Get_at(i); sb.Add_spr_unless_first(kv.Key(), " ", i); sb.Add("=").Add(kv.Val_to_str_or_empty()); } - return sb.XtoStr(); + return sb.To_str(); } public static KeyValList args_(String key, Object val) {return new KeyValList().Add(key, val);} } diff --git a/100_core/src_120_basicDataType/gplx/KeyVal_.java b/100_core/src_120_basicDataType/gplx/KeyVal_.java index 43318582d..05493295b 100644 --- a/100_core/src_120_basicDataType/gplx/KeyVal_.java +++ b/100_core/src_120_basicDataType/gplx/KeyVal_.java @@ -53,7 +53,7 @@ public class KeyVal_ { sb.Add(Object_.Xto_str_strict_or_null_mark(itm_val)); sb.Add_char_nl(); } - return sb.XtoStr(); + return sb.To_str(); } public static Object Ary_get_by_key_or_null(KeyVal[] ary, String key) { int len = ary.length; diff --git a/100_core/src_120_basicDataType/gplx/RandomAdp.java b/100_core/src_120_basicDataType/gplx/RandomAdp.java index 604c90dd5..6ad67f181 100644 --- a/100_core/src_120_basicDataType/gplx/RandomAdp.java +++ b/100_core/src_120_basicDataType/gplx/RandomAdp.java @@ -18,7 +18,7 @@ along with this program. If not, see . package gplx; import java.util.*; public class RandomAdp { + private final Random under; + public RandomAdp(Random v) {this.under = v;} public int Next(int max) {return under.nextInt(max);} - public RandomAdp(Random v) {under = v;} - Random under; } diff --git a/100_core/src_120_basicDataType/gplx/TimeSpanAdp.java b/100_core/src_120_basicDataType/gplx/TimeSpanAdp.java index 7ab01cb26..700f76728 100644 --- a/100_core/src_120_basicDataType/gplx/TimeSpanAdp.java +++ b/100_core/src_120_basicDataType/gplx/TimeSpanAdp.java @@ -46,13 +46,13 @@ public class TimeSpanAdp implements CompareAble, EqAble { TimeSpanAdp comp = TimeSpanAdp_.cast_(o); if (comp == null) return false; return fracs == comp.fracs; } - @Override public String toString() {return XtoStr(TimeSpanAdp_.Fmt_Default);} + @Override public String toString() {return To_str(TimeSpanAdp_.Fmt_Default);} @Override public boolean equals(Object obj) {TimeSpanAdp comp = TimeSpanAdp_.cast_(obj); return Object_.Eq(fracs, comp.fracs);} @Override public int hashCode() {return super.hashCode();} - public String XtoStr() {return TimeSpanAdp_.XtoStr(fracs, TimeSpanAdp_.Fmt_Default);} - public String XtoStr(String format) { - return TimeSpanAdp_.XtoStr(fracs, format); + public String To_str() {return TimeSpanAdp_.To_str(fracs, TimeSpanAdp_.Fmt_Default);} + public String To_str(String format) { + return TimeSpanAdp_.To_str(fracs, format); } public String XtoStrUiAbbrv() { if (fracs == 0) return "0" + UnitAbbrv(0); @@ -70,7 +70,7 @@ public class TimeSpanAdp implements CompareAble, EqAble { if (sb.Count() != 0) sb.Add(" "); sb.Add_obj(unit).Add(UnitAbbrv(i)); } - return sb.XtoStr(); + return sb.To_str(); } String UnitAbbrv(int i) { switch (i) { diff --git a/100_core/src_120_basicDataType/gplx/TimeSpanAdp_.java b/100_core/src_120_basicDataType/gplx/TimeSpanAdp_.java index b2ae64542..012e796e0 100644 --- a/100_core/src_120_basicDataType/gplx/TimeSpanAdp_.java +++ b/100_core/src_120_basicDataType/gplx/TimeSpanAdp_.java @@ -80,7 +80,7 @@ public class TimeSpanAdp_ { } return sign * (val_f + (val_s * Divisors[1]) + (val_m * Divisors[2]) + (val_h * Divisors[3])); } - @gplx.Internal protected static String XtoStr(long frc, String fmt) { + @gplx.Internal protected static String To_str(long frc, String fmt) { String_bldr sb = String_bldr_.new_(); int[] units = Split_long(frc, Divisors); @@ -119,7 +119,7 @@ public class TimeSpanAdp_ { sb.Add(Int_.Xto_str_pad_bgn_zero(val, zeros)); first = false; } - return sb.XtoStr(); + return sb.To_str(); } @gplx.Internal protected static int[] Split_long(long fracs, int[] divisors) { int divLength = Array_.Len(divisors); diff --git a/100_core/src_120_basicDataType/gplx/TimeSpanAdp_xtoStr_tst.java b/100_core/src_120_basicDataType/gplx/TimeSpanAdp_xtoStr_tst.java index 7c5be5acc..f55fe9a34 100644 --- a/100_core/src_120_basicDataType/gplx/TimeSpanAdp_xtoStr_tst.java +++ b/100_core/src_120_basicDataType/gplx/TimeSpanAdp_xtoStr_tst.java @@ -18,28 +18,28 @@ along with this program. If not, see . package gplx; import org.junit.*; public class TimeSpanAdp_xtoStr_tst { - @Test public void Zero() { + @Test public void Zero() { tst_Default(0, "0"); } - @Test public void MinuteSeconds() { + @Test public void MinuteSeconds() { tst_Default(77000, "1:17"); } - @Test public void ZeroSuppression() { + @Test public void ZeroSuppression() { tst_Default(660000, "11:00"); //fractional 0 and leading 0s are suppressed; i.e.: not 00:11:00.000 } - @Test public void HourTest() { + @Test public void HourTest() { tst_Default(3723987, "1:02:03.987"); } - @Test public void NegSeconds() { + @Test public void NegSeconds() { tst_Default(-2000, "-2"); } - @Test public void NegMins() { + @Test public void NegMins() { tst_Default(-60000, "-1:00"); } - @Test public void NegHours() { + @Test public void NegHours() { tst_Default(-3723981, "-1:02:03.981"); } - @Test public void ZeroPadding() { + @Test public void ZeroPadding() { tst_ZeroPadding("0", "00:00:00.000"); tst_ZeroPadding("1:02:03.123", "01:02:03.123"); tst_ZeroPadding("1", "00:00:01.000"); @@ -48,12 +48,12 @@ public class TimeSpanAdp_xtoStr_tst { } void tst_Default(long fractionals, String expd) { TimeSpanAdp ts = TimeSpanAdp_.fracs_(fractionals); - String actl = ts.XtoStr(TimeSpanAdp_.Fmt_Default); + String actl = ts.To_str(TimeSpanAdp_.Fmt_Default); Tfds.Eq(expd, actl); } void tst_ZeroPadding(String val, String expd) { TimeSpanAdp timeSpan = TimeSpanAdp_.parse_(val); - String actl = timeSpan.XtoStr(TimeSpanAdp_.Fmt_PadZeros); + String actl = timeSpan.To_str(TimeSpanAdp_.Fmt_PadZeros); Tfds.Eq(expd, actl); } } diff --git a/100_core/src_140_list/gplx/Hash_adp_bry.java b/100_core/src_140_list/gplx/Hash_adp_bry.java index 30c27544d..60a8a372c 100644 --- a/100_core/src_140_list/gplx/Hash_adp_bry.java +++ b/100_core/src_140_list/gplx/Hash_adp_bry.java @@ -49,6 +49,12 @@ public class Hash_adp_bry extends gplx.lists.Hash_adp_base implements Hash_adp { } return this; } + public Hash_adp_bry Add_many_bry(byte[]... ary) { + int ary_len = ary.length; + for (int i = 0; i < ary_len; i++) + Add_bry_bry(ary[i]); + return this; + } @Override protected void Add_base(Object key, Object val) { byte[] key_bry = (byte[])key; Hash_adp_bry_itm_base key_itm = proto.New(); diff --git a/100_core/src_140_list/gplx/Ordered_hash_base.java b/100_core/src_140_list/gplx/Ordered_hash_base.java index d35ea27c5..302d66eba 100644 --- a/100_core/src_140_list/gplx/Ordered_hash_base.java +++ b/100_core/src_140_list/gplx/Ordered_hash_base.java @@ -73,7 +73,7 @@ public class Ordered_hash_base extends Hash_adp_base implements Ordered_hash, Gf .Add(":").Add(ordered.Get_at(i).toString()) .Add(Op_sys.Cur().Nl_str()); } - return sb.XtoStr(); + return sb.To_str(); } public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { if (ctx.Match(k, Invk_SetKeyOnly)) { diff --git a/100_core/src_140_list/gplx/lists/Hash_adp_base.java b/100_core/src_140_list/gplx/lists/Hash_adp_base.java index 74054878f..b7c5b9475 100644 --- a/100_core/src_140_list/gplx/lists/Hash_adp_base.java +++ b/100_core/src_140_list/gplx/lists/Hash_adp_base.java @@ -19,7 +19,7 @@ package gplx.lists; import gplx.*; public abstract class Hash_adp_base implements Hash_adp { public boolean Has(Object key) {return Has_base(key);} public Object Get_by(Object key) {return Fetch_base(key);} - public Object Get_by_or_fail(Object key) {return FetchOrFail_base(key);} + public Object Get_by_or_fail(Object key) {return Get_by_or_fail_base(key);} public Object Get_by_or_new(Object key, NewAble proto) { Object rv = Fetch_base(key); if (rv == null) { @@ -40,18 +40,18 @@ public abstract class Hash_adp_base implements Hash_adp { return true; } @gplx.Virtual public void Del(Object key) {Del_base(key);} - protected Object FetchOrFail_base(Object key) { + protected Object Get_by_or_fail_base(Object key) { if (key == null) throw Err_.new_wo_type("key cannot be null"); if (!Has_base(key)) throw Err_.new_wo_type("key not found", "key", key); return Fetch_base(key); } - java.util.Hashtable hash = new java.util.Hashtable(); - @gplx.Virtual public int Count() {return hash.size();} - @gplx.Virtual public void Clear() {hash.clear();} - @gplx.Virtual protected void Add_base(Object key, Object val) {hash.put(key, val);} - @gplx.Virtual protected void Del_base(Object key) {hash.remove(key);} - @gplx.Virtual protected boolean Has_base(Object key) {return hash.containsKey(key);} - @gplx.Virtual protected Object Fetch_base(Object key) {return hash.get(key);} - @gplx.Virtual public java.util.Iterator iterator() {return hash.values().iterator();} + private final java.util.Hashtable hash = new java.util.Hashtable(); + @gplx.Virtual public int Count() {return hash.size();} + @gplx.Virtual public void Clear() {hash.clear();} + @gplx.Virtual protected void Add_base(Object key, Object val) {hash.put(key, val);} + @gplx.Virtual protected void Del_base(Object key) {hash.remove(key);} + @gplx.Virtual protected boolean Has_base(Object key) {return hash.containsKey(key);} + @gplx.Virtual protected Object Fetch_base(Object key) {return hash.get(key);} + @gplx.Virtual public java.util.Iterator iterator() {return hash.values().iterator();} } diff --git a/100_core/src_150_text/gplx/texts/CharStream.java b/100_core/src_150_text/gplx/texts/CharStream.java index 51470b652..68be5f4f6 100644 --- a/100_core/src_150_text/gplx/texts/CharStream.java +++ b/100_core/src_150_text/gplx/texts/CharStream.java @@ -48,14 +48,14 @@ public class CharStream { if (rv) pos++; return rv; } - public String XtoStr() {return Char_.XtoStr(ary, 0, len);} + public String To_str() {return Char_.To_str(ary, 0, len);} public String XtoStrAtCur(int length) { length = (pos + length > len) ? len - pos : length; - return Char_.XtoStr(ary, pos, length); + return Char_.To_str(ary, pos, length); } public String Xto_str_by_pos(int bgn, int end) { if (bgn < 0) bgn = 0; if (end > len - 1) end = len - 1; - return Char_.XtoStr(ary, bgn, end - bgn + 1); + return Char_.To_str(ary, bgn, end - bgn + 1); } public static CharStream pos0_(String text) { CharStream rv = new CharStream(); diff --git a/100_core/src_150_text/gplx/texts/CharStream_tst.java b/100_core/src_150_text/gplx/texts/CharStream_tst.java index edbefd647..535e5d9c9 100644 --- a/100_core/src_150_text/gplx/texts/CharStream_tst.java +++ b/100_core/src_150_text/gplx/texts/CharStream_tst.java @@ -21,13 +21,13 @@ public class CharStream_tst { @Before public void setup() { stream = CharStream.pos0_("abcdefgh"); } - @Test public void XtoStr() { - Tfds.Eq(stream.XtoStr(), "abcdefgh"); + @Test public void To_str() { + Tfds.Eq(stream.To_str(), "abcdefgh"); } @Test public void CurrentText() { stream.MoveNextBy(1); Tfds.Eq(stream.XtoStrAtCur(2), "bc"); - Tfds.Eq(stream.XtoStr(), "abcdefgh"); + Tfds.Eq(stream.To_str(), "abcdefgh"); } @Test public void CurrentText_outOfBounds() { stream.MoveNextBy(7); diff --git a/100_core/src_150_text/gplx/texts/HexDecUtl.java b/100_core/src_150_text/gplx/texts/HexDecUtl.java index e4b0a858a..858196963 100644 --- a/100_core/src_150_text/gplx/texts/HexDecUtl.java +++ b/100_core/src_150_text/gplx/texts/HexDecUtl.java @@ -49,7 +49,7 @@ public class HexDecUtl { int rv = parse_or_(raw, -1); if (rv == -1) throw Err_.new_parse("HexDec", "raw"); return rv; } - public static String XtoStr(int val, int pad) { + public static String To_str(int val, int pad) { char[] ary = new char[8]; int idx = 8; // 8 is max len of hexString; (2^4 * 8); EX: int.MaxValue = 7FFFFFFF do { int byt = val % 16; diff --git a/100_core/src_150_text/gplx/texts/HexDecUtl_tst.java b/100_core/src_150_text/gplx/texts/HexDecUtl_tst.java index 4202b5479..9288279c8 100644 --- a/100_core/src_150_text/gplx/texts/HexDecUtl_tst.java +++ b/100_core/src_150_text/gplx/texts/HexDecUtl_tst.java @@ -30,7 +30,7 @@ public class HexDecUtl_tst { tst_XtoInt("7FFFFFFF", Int_.MaxValue); tst_XtoInt_bry("100", 256); } - @Test public void XtoStr() { + @Test public void To_str() { tst_XtoStr(0, "0"); tst_XtoStr(15, "F"); tst_XtoStr(16, "10"); @@ -57,7 +57,7 @@ public class HexDecUtl_tst { private void tst_XtoInt_bry(String raw, int expd) {Tfds.Eq(expd, HexDecUtl.parse_or_(Bry_.new_a7(raw), -1));} private void tst_XtoStr(int val, String expd) {tst_XtoStr(val, 0, expd);} private void tst_XtoStr(int val, int pad, String expd) { - String actl = HexDecUtl.XtoStr(val, pad); + String actl = HexDecUtl.To_str(val, pad); Tfds.Eq(expd, actl); } } diff --git a/100_core/src_150_text/gplx/texts/RegxPatn_cls_ioMatch_.java b/100_core/src_150_text/gplx/texts/RegxPatn_cls_ioMatch_.java index 10f124fa8..fb4356bed 100644 --- a/100_core/src_150_text/gplx/texts/RegxPatn_cls_ioMatch_.java +++ b/100_core/src_150_text/gplx/texts/RegxPatn_cls_ioMatch_.java @@ -46,7 +46,7 @@ public class RegxPatn_cls_ioMatch_ { sb.Add(c); } sb.Add(Regx_bldr.Tkn_LineEnd); - return sb.XtoStr(); + return sb.To_str(); } public static final String InvalidCharacters = "|*?\"<>"; // : / \ are omitted b/c they will cause full paths to fail public static final String ValidCharacters = Regx_bldr.Excludes(InvalidCharacters); diff --git a/100_core/src_150_text/gplx/texts/RegxPatn_cls_like_.java b/100_core/src_150_text/gplx/texts/RegxPatn_cls_like_.java index cb7c05c9a..c43a0e697 100644 --- a/100_core/src_150_text/gplx/texts/RegxPatn_cls_like_.java +++ b/100_core/src_150_text/gplx/texts/RegxPatn_cls_like_.java @@ -58,6 +58,6 @@ public class RegxPatn_cls_like_ { sb.Add(c); } sb.Add(Regx_bldr.Tkn_LineEnd); - return sb.XtoStr(); + return sb.To_str(); } } diff --git a/100_core/src_150_text/gplx/texts/StringTableBldr.java b/100_core/src_150_text/gplx/texts/StringTableBldr.java index 76b46af3a..45b6207f1 100644 --- a/100_core/src_150_text/gplx/texts/StringTableBldr.java +++ b/100_core/src_150_text/gplx/texts/StringTableBldr.java @@ -36,7 +36,7 @@ public class StringTableBldr { cols.Add(i, col); return col; } - public String XtoStr() { + public String To_str() { sb.Clear(); for (int rowI = 0; rowI < rows.Count(); rowI++) { String[] row = (String[])rows.Get_at(rowI); diff --git a/100_core/src_150_text/gplx/texts/StringTableBldr_tst.java b/100_core/src_150_text/gplx/texts/StringTableBldr_tst.java index 11ae3414e..1ca0b4dda 100644 --- a/100_core/src_150_text/gplx/texts/StringTableBldr_tst.java +++ b/100_core/src_150_text/gplx/texts/StringTableBldr_tst.java @@ -53,7 +53,7 @@ public class StringTableBldr_tst { ); } void tst_XtoStr(String... expdLines) { - String expd = String_.ConcatWith_any(String_.CrLf, (Object[])expdLines); - Tfds.Eq(expd, bldr.XtoStr()); + String expd = String_.Concat_with_obj(String_.CrLf, (Object[])expdLines); + Tfds.Eq(expd, bldr.To_str()); } } diff --git a/100_core/src_200_io/gplx/ios/IoEnginePool.java b/100_core/src_200_io/gplx/ios/IoEnginePool.java index 2dc6b9684..4c52c1939 100644 --- a/100_core/src_200_io/gplx/ios/IoEnginePool.java +++ b/100_core/src_200_io/gplx/ios/IoEnginePool.java @@ -17,6 +17,7 @@ along with this program. If not, see . */ package gplx.ios; import gplx.*; public class IoEnginePool { + private final Hash_adp hash = Hash_adp_.new_(); public void Add_if_dupe_use_nth(IoEngine engine) { hash.Del(engine.Key()); hash.Add(engine.Key(), engine); @@ -25,7 +26,6 @@ public class IoEnginePool { IoEngine rv = (IoEngine)hash.Get_by(key); return rv == null ? IoEngine_.Mem : rv; // rv == null when url is null or empty; return Mem which should be a noop; DATE:2013-06-04 } - Hash_adp hash = Hash_adp_.new_(); public static final IoEnginePool _ = new IoEnginePool(); IoEnginePool() { this.Add_if_dupe_use_nth(IoEngine_.Sys); diff --git a/100_core/src_200_io/gplx/ios/IoEngine_xrg_recycleFil.java b/100_core/src_200_io/gplx/ios/IoEngine_xrg_recycleFil.java index 2b4e2ecd3..787209286 100644 --- a/100_core/src_200_io/gplx/ios/IoEngine_xrg_recycleFil.java +++ b/100_core/src_200_io/gplx/ios/IoEngine_xrg_recycleFil.java @@ -30,7 +30,7 @@ public class IoEngine_xrg_recycleFil extends IoEngine_xrg_fil_affects1_base { String dayName = time.XtoStr_fmt("yyyyMMdd"), timeName = time.XtoStr_fmt("hhmmssfff"); String rootDirStr = ConcatWith_ary(this.Url().Info().DirSpr(), rootDirNames); Io_url recycleDir = this.Url().OwnerRoot().GenSubDir_nest(rootDirStr, dayName); - String uuidStr = uuid_include ? uuid.XtoStr() : ""; + String uuidStr = uuid_include ? uuid.To_str() : ""; return recycleDir.GenSubFil_ary(appName, ";", timeName, ";", uuidStr, ";", String_.LimitToFirst(this.Url().NameAndExt(), 128)); } String ConcatWith_ary(String separator, List_adp ary) { @@ -41,7 +41,7 @@ public class IoEngine_xrg_recycleFil extends IoEngine_xrg_fil_affects1_base { Object val = ary.Get_at(i); sb.Add_obj(Object_.Xto_str_strict_or_empty(val)); } - return sb.XtoStr(); + return sb.To_str(); } @Override public void Exec() { IoEnginePool._.Get_by(this.Url().Info().EngineKey()).RecycleFil(this); diff --git a/100_core/src_200_io/gplx/ios/IoRecycleBin.java b/100_core/src_200_io/gplx/ios/IoRecycleBin.java index f5c3aa312..999b1ad24 100644 --- a/100_core/src_200_io/gplx/ios/IoRecycleBin.java +++ b/100_core/src_200_io/gplx/ios/IoRecycleBin.java @@ -26,12 +26,12 @@ public class IoRecycleBin { int listCount = list.Count(); if (listCount > 1) throw Err_.new_wo_type("found more than 1 url", "count", list.Count()); Io_url trgUrl = (Io_url)list.Get_at(0); IoEngine_xrg_xferFil.move_(url, trgUrl).ReadOnlyFails_(true).Overwrite_(false).Exec(); - IoEngine_xrg_saveFilStr.new_(FetchRegistryUrl(url), sb.XtoStr()).Exec(); + IoEngine_xrg_saveFilStr.new_(FetchRegistryUrl(url), sb.To_str()).Exec(); } public void Regy_add(IoEngine_xrg_recycleFil xrg) { Io_url url = xrg.RecycleUrl(); Io_url regyUrl = FetchRegistryUrl(url); - String text = String_.ConcatWith_any("|", url.NameAndExt_noDirSpr(), xrg.Url().GenRelUrl_orEmpty(url.OwnerRoot()), xrg.Uuid().XtoStr(), xrg.AppName(), xrg.Time()); + String text = String_.Concat_with_obj("|", url.NameAndExt_noDirSpr(), xrg.Url().GenRelUrl_orEmpty(url.OwnerRoot()), xrg.Uuid().To_str(), xrg.AppName(), xrg.Time()); IoEngine_xrg_saveFilStr.new_(regyUrl, text).Append_().Exec(); } public List_adp Regy_search(Io_url url, String_bldr sb) { diff --git a/100_core/src_200_io/gplx/ios/IoUrlInfo.java b/100_core/src_200_io/gplx/ios/IoUrlInfo.java index a128beff6..36cf4e663 100644 --- a/100_core/src_200_io/gplx/ios/IoUrlInfo.java +++ b/100_core/src_200_io/gplx/ios/IoUrlInfo.java @@ -131,7 +131,7 @@ class IoUrlInfo_wnt extends IoUrlInfo_base { @Override public boolean Match(String raw) {return String_.Len(raw) > 1 && String_.CharAt(raw, 1) == ':';} // 2nd char is :; assumes 1 letter drives @Override public String XtoRootName(String raw, int rawLen) { return rawLen == 3 && String_.CharAt(raw, 1) == ':' // only allow single letter drives; ex: C:\; note, CharAt(raw, 1) to match Match - ? Char_.XtoStr(String_.CharAt(raw, 0)) + ? Char_.To_str(String_.CharAt(raw, 0)) : null; } public static final IoUrlInfo_wnt _ = new IoUrlInfo_wnt(); IoUrlInfo_wnt() {} diff --git a/100_core/src_200_io/gplx/ios/IoUrlTypeRegy.java b/100_core/src_200_io/gplx/ios/IoUrlTypeRegy.java index d176fc46b..30ac64dd8 100644 --- a/100_core/src_200_io/gplx/ios/IoUrlTypeRegy.java +++ b/100_core/src_200_io/gplx/ios/IoUrlTypeRegy.java @@ -54,7 +54,7 @@ class IoUrlTypeGrp implements GfoInvkAble { for (int i = 0; i < m.Args_count(); i++) { String s = m.ReadStr("v"); if (list.Has(s)) { - ctx.Write_warn(UsrMsg.new_("itm already has filter").Add("key", key).Add("filter", s).XtoStr()); + ctx.Write_warn(UsrMsg.new_("itm already has filter").Add("key", key).Add("filter", s).To_str()); list.Del(s); } list.Add(s, s); @@ -67,7 +67,7 @@ class IoUrlTypeGrp implements GfoInvkAble { for (int i = 0; i < list.Count(); i++) sb.Add_spr_unless_first((String)list.Get_at(i), " ", i); sb.Add("}"); - return sb.XtoStr(); + return sb.To_str(); } else if (ctx.Match(k, Invk_Clear)) {if (ctx.Deny()) return this; list.Clear();} else return GfoInvkAble_.Rv_unhandled; diff --git a/100_core/src_200_io/gplx/ios/Io_size__tst.java b/100_core/src_200_io/gplx/ios/Io_size__tst.java index 46c64fdd6..510027753 100644 --- a/100_core/src_200_io/gplx/ios/Io_size__tst.java +++ b/100_core/src_200_io/gplx/ios/Io_size__tst.java @@ -34,7 +34,7 @@ public class Io_size__tst { // fxt.Test_XtoLongFail("1.1"); // DELETED:do not check for fractional bytes; EX: 10.7 GB DATE:2015-01-06 // fxt.Test_XtoLongFail("1.51 kb"); } - @Test public void XtoStr() { + @Test public void To_str() { fxt.Test_XtoStr(1, "1.000 B"); fxt.Test_XtoStr(1024, "1.000 KB"); fxt.Test_XtoStr(1536, "1.500 KB"); diff --git a/100_core/src_210_env/gplx/Env_.java b/100_core/src_210_env/gplx/Env_.java index 205f27df1..efd5ef7e0 100644 --- a/100_core/src_210_env/gplx/Env_.java +++ b/100_core/src_210_env/gplx/Env_.java @@ -87,10 +87,15 @@ public class Env_ { ); return String_.Format(fmt, programName); } - public static String Env_prop__user_language() {return Env_prop(Env_prop_key__user_language);} + public static String Env_prop__user_language() {return Env_prop(Env_prop_key__user_language);} + public static String Env_prop__java_version() {return Env_prop(Env_prop_key__java_version);} public static String Env_prop(String key) { return System.getProperty(key); - } static final String Env_prop_key__user_language = "user.language"; + } + private static final String + Env_prop_key__user_language = "user.language" + , Env_prop_key__java_version = "java.version" + ; public static void Term_add(GfoInvkAble invk, String cmd) { Thread_adp thread = Thread_adp_.invk_(invk, cmd); Runtime.getRuntime().addShutdownHook(thread.Under_thread()); diff --git a/100_core/src_210_env/gplx/Op_sys.java b/100_core/src_210_env/gplx/Op_sys.java index 0342b3c7a..2876b2b6b 100644 --- a/100_core/src_210_env/gplx/Op_sys.java +++ b/100_core/src_210_env/gplx/Op_sys.java @@ -18,12 +18,13 @@ along with this program. If not, see . package gplx; public class Op_sys { Op_sys(byte tid, byte sub_tid, String os_name, byte bitness, String nl_str, byte fsys_dir_spr_byte, boolean fsys_case_match) { - this.tid = tid; this.sub_tid = sub_tid; this.os_name = os_name; this.bitness = bitness; this.nl_str = nl_str; this.fsys_dir_spr_byte = fsys_dir_spr_byte; this.fsys_dir_spr_str = Char_.XtoStr((char)fsys_dir_spr_byte); this.fsys_case_match = fsys_case_match; + this.tid = tid; this.sub_tid = sub_tid; this.os_name = os_name; this.bitness = bitness; this.nl_str = nl_str; this.fsys_dir_spr_byte = fsys_dir_spr_byte; this.fsys_dir_spr_str = Char_.To_str((char)fsys_dir_spr_byte); this.fsys_case_match = fsys_case_match; } public byte Tid() {return tid;} private final byte tid; public byte Sub_tid() {return sub_tid;} private final byte sub_tid; public String Os_name() {return os_name;} private String os_name; public byte Bitness() {return bitness;} private final byte bitness; + public String Bitness_str() {return (bitness == Bitness_32 ? "32" : "64");} public String Nl_str() {return nl_str;} private final String nl_str; public String Fsys_dir_spr_str() {return fsys_dir_spr_str;} private final String fsys_dir_spr_str; public byte Fsys_dir_spr_byte() {return fsys_dir_spr_byte;} private final byte fsys_dir_spr_byte; @@ -34,7 +35,7 @@ public class Op_sys { public boolean Tid_is_lnx() {return tid == Tid_lnx;} public boolean Tid_is_osx() {return tid == Tid_osx;} public boolean Tid_is_drd() {return tid == Tid_drd;} - public String Xto_str() {return os_name + (bitness == Bitness_32 ? "32" : "64");} + public String To_str() {return os_name + Bitness_str();} public static final byte Tid_nil = 0, Tid_wnt = 1, Tid_lnx = 2, Tid_osx = 3, Tid_drd = 4; public static final byte Sub_tid_unknown = 0, Sub_tid_win_xp = 1, Sub_tid_win_7 = 2, Sub_tid_win_8 = 3; diff --git a/100_core/src_210_env/gplx/ProcessAdp.java b/100_core/src_210_env/gplx/ProcessAdp.java index bb7d7074d..9ecde72d9 100644 --- a/100_core/src_210_env/gplx/ProcessAdp.java +++ b/100_core/src_210_env/gplx/ProcessAdp.java @@ -274,7 +274,7 @@ public class ProcessAdp implements GfoInvkAble, RlsAble { for (int i = 0; i < len; i++) { char c = String_.CharAt(args_str, i); if (c == ' ' && !in_quotes) { // space encountered; assume arg done - list.Add(sb.XtoStr()); + list.Add(sb.To_str()); sb.Clear(); } else if (c == '"') // NOTE: ProcessBuilder seems to have issues with quotes; do not call sb.Add() @@ -282,7 +282,7 @@ public class ProcessAdp implements GfoInvkAble, RlsAble { else sb.Add(c); } - if (sb.Has_some()) list.Add(sb.XtoStr()); + if (sb.Has_some()) list.Add(sb.To_str()); return list.To_str_ary(); } } diff --git a/100_core/src_300_classXtn/gplx/ClassXtnPool.java b/100_core/src_300_classXtn/gplx/ClassXtnPool.java index ef917f8c3..3b40733c6 100644 --- a/100_core/src_300_classXtn/gplx/ClassXtnPool.java +++ b/100_core/src_300_classXtn/gplx/ClassXtnPool.java @@ -19,7 +19,7 @@ package gplx; import gplx.lists.*; public class ClassXtnPool extends Hash_adp_base { public void Add(ClassXtn typx) {Add_base(typx.Key(), typx);} - public ClassXtn Get_by_or_fail(String key) {return (ClassXtn)FetchOrFail_base(key);} + public ClassXtn Get_by_or_fail(String key) {return (ClassXtn)Get_by_or_fail_base(key);} public static final ClassXtnPool _ = new ClassXtnPool(); public static final String Format_null = ""; diff --git a/100_core/src_300_classXtn/gplx/TimeSpanAdpClassXtn.java b/100_core/src_300_classXtn/gplx/TimeSpanAdpClassXtn.java index 014aa7a6d..f877a033b 100644 --- a/100_core/src_300_classXtn/gplx/TimeSpanAdpClassXtn.java +++ b/100_core/src_300_classXtn/gplx/TimeSpanAdpClassXtn.java @@ -22,7 +22,7 @@ public class TimeSpanAdpClassXtn extends ClassXtn_base implements ClassXtn { public Object DefaultValue() {return TimeSpanAdp_.Zero;} @Override public Object ParseOrNull(String raw) {return TimeSpanAdp_.parse_(raw);} @Override public Object XtoDb(Object obj) {return TimeSpanAdp_.cast_(obj).TotalSecs();} - @Override public String XtoUi(Object obj, String fmt) {return TimeSpanAdp_.cast_(obj).XtoStr(fmt);} + @Override public String XtoUi(Object obj, String fmt) {return TimeSpanAdp_.cast_(obj).To_str(fmt);} public boolean Eq(Object lhs, Object rhs) {try {return TimeSpanAdp_.cast_(lhs).Eq(rhs);} catch (Exception e) {Err_.Noop(e); return false;}} public static final TimeSpanAdpClassXtn _ = new TimeSpanAdpClassXtn(); TimeSpanAdpClassXtn() {} // added to ClassXtnPool by default } \ No newline at end of file diff --git a/100_core/src_310_gfoNde/gplx/GfoFldList.java b/100_core/src_310_gfoNde/gplx/GfoFldList.java index 09ceef0db..5b66da7fe 100644 --- a/100_core/src_310_gfoNde/gplx/GfoFldList.java +++ b/100_core/src_310_gfoNde/gplx/GfoFldList.java @@ -23,5 +23,5 @@ public interface GfoFldList { GfoFld Get_at(int i); GfoFld FetchOrNull(String key); GfoFldList Add(String key, ClassXtn c); - String XtoStr(); + String To_str(); } diff --git a/100_core/src_310_gfoNde/gplx/GfoFldList_.java b/100_core/src_310_gfoNde/gplx/GfoFldList_.java index 4c5d322cd..9535ef31a 100644 --- a/100_core/src_310_gfoNde/gplx/GfoFldList_.java +++ b/100_core/src_310_gfoNde/gplx/GfoFldList_.java @@ -42,13 +42,13 @@ class GfoFldList_base implements GfoFldList { idxs.Add(key, idxs.Count()); return this; } - public String XtoStr() { + public String To_str() { String_bldr sb = String_bldr_.new_(); for (int i = 0; i < hash.Count(); i++) { GfoFld fld = this.Get_at(i); sb.Add(fld.Key()).Add("|"); } - return sb.XtoStr(); + return sb.To_str(); } Ordered_hash hash = Ordered_hash_.new_(); Hash_adp idxs = Hash_adp_.new_(); // PERF: idxs used for Idx_of; need to recalc if Del ever added } @@ -59,5 +59,5 @@ class GfoFldList_null implements GfoFldList { public GfoFld Get_at(int i) {return GfoFld.Null;} public GfoFld FetchOrNull(String key) {return null;} public GfoFldList Add(String key, ClassXtn typx) {return this;} - public String XtoStr() {return "<>";} + public String To_str() {return "<>";} } \ No newline at end of file diff --git a/100_core/src_310_gfoNde/gplx/GfoNde.java b/100_core/src_310_gfoNde/gplx/GfoNde.java index f25a674cc..ab7cec34b 100644 --- a/100_core/src_310_gfoNde/gplx/GfoNde.java +++ b/100_core/src_310_gfoNde/gplx/GfoNde.java @@ -30,14 +30,14 @@ public class GfoNde implements GfoInvkAble { public GfoNdeList Subs() {return subs;} GfoNdeList subs = GfoNdeList_.new_(); public GfoFldList SubFlds() {return subFlds;} GfoFldList subFlds = GfoFldList_.new_(); public void XtoStr_wtr(DataWtr wtr) {XtoStr_wtr(this, wtr);}// TEST - public String XtoStr() { + public String To_str() { String_bldr sb = String_bldr_.new_(); for (int i = 0; i < aryLen; i++) { String key = i >= flds.Count() ? "<< NULL " + i + " >>" : flds.Get_at(i).Key(); String val = i >= aryLen ? "<< NULL " + i + " >>" : Object_.Xto_str_strict_or_null_mark(ary[i]); sb.Add(key).Add("=").Add(val); } - return sb.XtoStr(); + return sb.To_str(); } int IndexOfOrFail(String key) { int i = flds.Idx_of(key); diff --git a/100_core/src_311_gfoObj/gplx/GfoMsg.java b/100_core/src_311_gfoObj/gplx/GfoMsg.java index c2c87386a..e694a8538 100644 --- a/100_core/src_311_gfoObj/gplx/GfoMsg.java +++ b/100_core/src_311_gfoObj/gplx/GfoMsg.java @@ -19,7 +19,7 @@ package gplx; public interface GfoMsg { String Key(); GfoMsg CloneNew(); - String XtoStr(); + String To_str(); GfoMsg Clear(); GfoMsg Parse_(boolean v); diff --git a/100_core/src_311_gfoObj/gplx/GfoMsg_.java b/100_core/src_311_gfoObj/gplx/GfoMsg_.java index f1706b6f0..08b0fe097 100644 --- a/100_core/src_311_gfoObj/gplx/GfoMsg_.java +++ b/100_core/src_311_gfoObj/gplx/GfoMsg_.java @@ -199,7 +199,7 @@ class GfoMsg_base implements GfoMsg { KeyVal rv = (KeyVal)this.Args_getAt(i); sb.Add_fmt("{0};", rv.Key()); } - return sb.XtoStr(); + return sb.To_str(); } public GfoMsg CloneNew() { GfoMsg_base rv = new GfoMsg_base().ctor_(key, parse); @@ -220,12 +220,12 @@ class GfoMsg_base implements GfoMsg { protected List_adp args; List_adp subs; - public String XtoStr() { + public String To_str() { String_bldr sb = String_bldr_.new_(); - XtoStr(sb, new XtoStrWkr_gplx(), this); + To_str(sb, new XtoStrWkr_gplx(), this); return sb.Xto_str_and_clear(); } - void XtoStr(String_bldr sb, XtoStrWkr wkr, GfoMsg m) { + void To_str(String_bldr sb, XtoStrWkr wkr, GfoMsg m) { sb.Add(m.Key()); if (m.Subs_count() == 0) { sb.Add(":"); @@ -236,7 +236,7 @@ class GfoMsg_base implements GfoMsg { if (!first) sb.Add(" "); sb.Add(kv.Key()); sb.Add("='"); - sb.Add(wkr.XtoStr(kv.Val())); + sb.Add(wkr.To_str(kv.Val())); sb.Add("'"); first = false; } @@ -244,7 +244,7 @@ class GfoMsg_base implements GfoMsg { } else { sb.Add("."); - XtoStr(sb, wkr, m.Subs_getAt(0)); + To_str(sb, wkr, m.Subs_getAt(0)); } } @@ -253,10 +253,10 @@ class GfoMsg_base implements GfoMsg { static final String_obj_val Nil = String_obj_val.new_("<>"); } interface XtoStrWkr { - String XtoStr(Object o); + String To_str(Object o); } class XtoStrWkr_gplx implements XtoStrWkr { - public String XtoStr(Object o) { + public String To_str(Object o) { if (o == null) return "<>"; Class type = ClassAdp_.ClassOf_obj(o); String rv = null; diff --git a/100_core/src_311_gfoObj/gplx/GfoMsg_tst.java b/100_core/src_311_gfoObj/gplx/GfoMsg_tst.java index 25ea8af03..aef741b74 100644 --- a/100_core/src_311_gfoObj/gplx/GfoMsg_tst.java +++ b/100_core/src_311_gfoObj/gplx/GfoMsg_tst.java @@ -33,7 +33,7 @@ public class GfoMsg_tst { mok.Str0 = "b"; tst_Msg(GfoInvkXtoStr.ReadMsg(mok, Mok.Invk_Cmd0), "Mok.Cmd0:bool0='y' int0='2' str0='b';"); } - void tst_Msg(GfoMsg m, String expd) {Tfds.Eq(expd, m.XtoStr());} + void tst_Msg(GfoMsg m, String expd) {Tfds.Eq(expd, m.To_str());} class Mok implements GfoInvkAble { public boolean Bool0; public int Int0; diff --git a/100_core/src_330_store/gplx/DataRdr.java b/100_core/src_330_store/gplx/DataRdr.java index 3e058c1e7..86c31c6ea 100644 --- a/100_core/src_330_store/gplx/DataRdr.java +++ b/100_core/src_330_store/gplx/DataRdr.java @@ -18,7 +18,7 @@ along with this program. If not, see . package gplx; import gplx.core.strings.*; public interface DataRdr extends SrlMgr, RlsAble { - String NameOfNode(); String XtoStr(); + String NameOfNode(); String To_str(); Io_url Uri(); void Uri_set(Io_url s); Hash_adp EnvVars(); boolean Parse(); void Parse_set(boolean v); diff --git a/100_core/src_330_store/gplx/DataRdr_.java b/100_core/src_330_store/gplx/DataRdr_.java index e04805888..701fe01f6 100644 --- a/100_core/src_330_store/gplx/DataRdr_.java +++ b/100_core/src_330_store/gplx/DataRdr_.java @@ -23,13 +23,13 @@ public class DataRdr_ { public static DataRdr cast_(Object obj) {try {return (DataRdr)obj;} catch(Exception exc) {throw Err_.new_type_mismatch_w_exc(exc, DataRdr.class, obj);}} } class DataRdr_null implements DataRdr { - public String NameOfNode() {return XtoStr();} public String XtoStr() {return "<< NULL READER >>";} + public String NameOfNode() {return To_str();} public String To_str() {return "<< NULL READER >>";} public boolean Type_rdr() {return true;} public Hash_adp EnvVars() {return Hash_adp_.Noop;} public Io_url Uri() {return Io_url_.Empty;} public void Uri_set(Io_url s) {} public boolean Parse() {return parse;} public void Parse_set(boolean v) {parse = v;} private boolean parse; public int FieldCount() {return 0;} - public String KeyAt(int i) {return XtoStr();} + public String KeyAt(int i) {return To_str();} public Object ReadAt(int i) {return null;} public KeyVal KeyValAt(int i) {return KeyVal_.new_(this.KeyAt(i), this.ReadAt(i));} public Object Read(String name) {return null;} diff --git a/100_core/src_330_store/gplx/DataWtr.java b/100_core/src_330_store/gplx/DataWtr.java index e99108e13..158218177 100644 --- a/100_core/src_330_store/gplx/DataWtr.java +++ b/100_core/src_330_store/gplx/DataWtr.java @@ -28,5 +28,5 @@ public interface DataWtr extends SrlMgr { void WriteLeafEnd(); void Clear(); - String XtoStr(); + String To_str(); } diff --git a/100_core/src_330_store/gplx/DataWtr_.java b/100_core/src_330_store/gplx/DataWtr_.java index d0611ad65..b000838d9 100644 --- a/100_core/src_330_store/gplx/DataWtr_.java +++ b/100_core/src_330_store/gplx/DataWtr_.java @@ -31,7 +31,7 @@ class DataWtr_null implements DataWtr { public void WriteNodeEnd() {} public void WriteLeafEnd() {} public void Clear() {} - public String XtoStr() {return "";} + public String To_str() {return "";} public Object StoreRoot(SrlObj root, String key) {return null;} public boolean SrlBoolOr(String key, boolean v) {return v;} public byte SrlByteOr(String key, byte v) {return v;} diff --git a/100_core/src_330_store/gplx/stores/DataRdr_mem.java b/100_core/src_330_store/gplx/stores/DataRdr_mem.java index 50f530b4b..ed81660f7 100644 --- a/100_core/src_330_store/gplx/stores/DataRdr_mem.java +++ b/100_core/src_330_store/gplx/stores/DataRdr_mem.java @@ -50,7 +50,7 @@ public class DataRdr_mem extends DataRdr_base implements GfoNdeRdr { boolean hasFirst = subRdr.MoveNextPeer(); return (hasFirst) ? subRdr : DataRdr_.Null; } - public String XtoStr() {return cur.XtoStr();} + public String To_str() {return cur.To_str();} public void Rls() {this.cur = null; this.peerList = null;} @Override public SrlMgr SrlMgr_new(Object o) {return new DataRdr_mem();} GfoNdeList Peers_get() { diff --git a/100_core/src_330_store/gplx/stores/xmls/XmlDataRdr.java b/100_core/src_330_store/gplx/stores/xmls/XmlDataRdr.java index 615735946..58391283d 100644 --- a/100_core/src_330_store/gplx/stores/xmls/XmlDataRdr.java +++ b/100_core/src_330_store/gplx/stores/xmls/XmlDataRdr.java @@ -18,7 +18,7 @@ along with this program. If not, see . package gplx.stores.xmls; import gplx.*; import gplx.stores.*; import gplx.xmls.*; /*Xpath_*/ public class XmlDataRdr extends DataRdr_base implements DataRdr { - @Override public String NameOfNode() {return nde.Name();} public String XtoStr() {return nde.Xml_outer();} + @Override public String NameOfNode() {return nde.Name();} public String To_str() {return nde.Xml_outer();} @Override public int FieldCount() {return nde.Atrs() == null ? 0 : nde.Atrs().Count();} // nde.Attributes == null when nde is XmlText; ex: val @Override public String KeyAt(int i) {return nde.Atrs().Get_at(i).Name();} @Override public Object ReadAt(int i) { diff --git a/100_core/src_330_store/gplx/stores/xmls/XmlDataWtr_.java b/100_core/src_330_store/gplx/stores/xmls/XmlDataWtr_.java index 55cbcae17..1b0d547ac 100644 --- a/100_core/src_330_store/gplx/stores/xmls/XmlDataWtr_.java +++ b/100_core/src_330_store/gplx/stores/xmls/XmlDataWtr_.java @@ -45,11 +45,11 @@ class XmlDataWtr extends DataWtr_base implements DataWtr { public void WriteTableBgn(String name, GfoFldList fields) {this.WriteXmlNodeBegin(name);} @Override public void WriteNodeBgn(String nodeName) {this.WriteXmlNodeBegin(nodeName);} @Override public void WriteNodeEnd() {this.WriteXmlNodeEnd();} - public String XtoStr() { + public String To_str() { while (names.Count() > 0) { WriteXmlNodeEnd(); } - return sb.XtoStr(); + return sb.To_str(); // while (nde.ParentNode != null) // WriteXmlNodeEnd(); // close all open ndes automatically // return doc.OuterXml; diff --git a/100_core/src_340_dsv/gplx/stores/dsvs/DsvDataRdr_.java b/100_core/src_340_dsv/gplx/stores/dsvs/DsvDataRdr_.java index 950d4e455..9d5aaa0b0 100644 --- a/100_core/src_340_dsv/gplx/stores/dsvs/DsvDataRdr_.java +++ b/100_core/src_340_dsv/gplx/stores/dsvs/DsvDataRdr_.java @@ -190,7 +190,7 @@ class DsvTblBldr { String_bldr sb = String_bldr_.new_(); for (int i = 0; i < tkns.Count(); i++) sb.Add((String)tkns.Get_at(i)); - layout.HeaderList().Add_Comment(sb.XtoStr()); + layout.HeaderList().Add_Comment(sb.To_str()); tkns.Clear(); } } diff --git a/100_core/src_340_dsv/gplx/stores/dsvs/DsvDataWtr.java b/100_core/src_340_dsv/gplx/stores/dsvs/DsvDataWtr.java index 7e3fc3cb1..095fd4007 100644 --- a/100_core/src_340_dsv/gplx/stores/dsvs/DsvDataWtr.java +++ b/100_core/src_340_dsv/gplx/stores/dsvs/DsvDataWtr.java @@ -38,7 +38,7 @@ public class DsvDataWtr extends DataWtr_base implements DataWtr { } @Override public void WriteNodeEnd() {} public void Clear() {sb.Clear();} - public String XtoStr() {return sb.XtoStr();} + public String To_str() {return sb.To_str();} void WriteTableName(String tableName) { sb.WriteFld(tableName); sb.WriteCmd(sym.TblNameSym()); @@ -64,7 +64,7 @@ public class DsvDataWtr extends DataWtr_base implements DataWtr { } class DsvStringBldr { public void Clear() {sb.Clear();} - public String XtoStr() {return sb.XtoStr();} + public String To_str() {return sb.To_str();} public void WriteCmd(String cmd) { WriteFld(sym.CmdSequence(), true); WriteFld(cmd); diff --git a/100_core/src_340_dsv/gplx/stores/dsvs/DsvDataWtr_csv_tst.java b/100_core/src_340_dsv/gplx/stores/dsvs/DsvDataWtr_csv_tst.java index 1954777e6..1967e6e42 100644 --- a/100_core/src_340_dsv/gplx/stores/dsvs/DsvDataWtr_csv_tst.java +++ b/100_core/src_340_dsv/gplx/stores/dsvs/DsvDataWtr_csv_tst.java @@ -93,7 +93,7 @@ class DsvDataWtr_fxt { public void tst_XtoStr(DsvDataWtr wtr, GfoNde root, String expd) { wtr.Clear(); root.XtoStr_wtr(wtr); - String actl = wtr.XtoStr(); + String actl = wtr.To_str(); Tfds.Eq(expd, actl); } public static DsvDataWtr_fxt new_() {return new DsvDataWtr_fxt();} DsvDataWtr_fxt() {} diff --git a/100_core/src_400_gfs/gplx/GfsCoreHelp.java b/100_core/src_400_gfs/gplx/GfsCoreHelp.java index 6d9f98ea3..386b7ef2a 100644 --- a/100_core/src_400_gfs/gplx/GfsCoreHelp.java +++ b/100_core/src_400_gfs/gplx/GfsCoreHelp.java @@ -26,7 +26,7 @@ class GfsCoreHelp implements GfoInvkAble { GfsRegyItm itm = (GfsRegyItm)core.Root_as_regy().Get_at(i); sb.Add_spr_unless_first(itm.Key(), String_.CrLf, i); } - return sb.XtoStr(); + return sb.To_str(); } else return Exec(ctx, core.Root_as_regy(), path); } @@ -35,7 +35,7 @@ class GfsCoreHelp implements GfoInvkAble { String_bldr sb = String_bldr_.new_(); for (int j = 0; j < i; j++) sb.Add_spr_unless_first(itmAry[j], ".", j); - return Err_Unhandled(sb.XtoStr(), itmAry[i]); + return Err_Unhandled(sb.To_str(), itmAry[i]); } static Object Exec(GfsCtx rootCtx, GfoInvkAble rootInvk, String path) { String[] itmAry = String_.Split(path, "."); @@ -60,7 +60,7 @@ class GfsCoreHelp implements GfoInvkAble { String s = (String)ctx.Help_browseList().Get_at(i); sb.Add_spr_unless_first(s, String_.CrLf, i); } - return sb.XtoStr(); + return sb.To_str(); } } public static GfsCoreHelp as_(Object obj) {return obj instanceof GfsCoreHelp ? (GfsCoreHelp)obj : null;} diff --git a/100_core/src_400_gfs/gplx/GfsCtx.java b/100_core/src_400_gfs/gplx/GfsCtx.java index eb9c9d35f..460c93ac9 100644 --- a/100_core/src_400_gfs/gplx/GfsCtx.java +++ b/100_core/src_400_gfs/gplx/GfsCtx.java @@ -42,7 +42,7 @@ public class GfsCtx { } public boolean Write_note(String fmt, Object... ary) {UsrDlg_._.Note(fmt, ary); return false;} public boolean Write_warn(String fmt, Object... ary) {UsrDlg_._.Note("! " + fmt, ary); return false;} - public boolean Write_stop(UsrMsg umsg) {UsrDlg_._.Note("* " + umsg.XtoStr()); return false;} + public boolean Write_stop(UsrMsg umsg) {UsrDlg_._.Note("* " + umsg.To_str()); return false;} public boolean Write_stop(String fmt, Object... ary) {UsrDlg_._.Note("* " + fmt, ary); return false;} public boolean Deny() {return deny;} private boolean deny; public static final GfsCtx _ = new GfsCtx(); diff --git a/100_core/src_420_usrMsg/gplx/Gfo_usr_dlg_.java b/100_core/src_420_usrMsg/gplx/Gfo_usr_dlg_.java index d264b11ae..55a422c82 100644 --- a/100_core/src_420_usrMsg/gplx/Gfo_usr_dlg_.java +++ b/100_core/src_420_usrMsg/gplx/Gfo_usr_dlg_.java @@ -24,6 +24,11 @@ public class Gfo_usr_dlg_ { test = new Gfo_usr_dlg_base(Gfo_usr_dlg__log_.Noop, Gfo_usr_dlg__gui_.Test); return test; } private static Gfo_usr_dlg_base test; + public static Gfo_usr_dlg Test_console() { + if (test_console == null) + test_console = new Gfo_usr_dlg_base(Gfo_usr_dlg__log_.Noop, Gfo_usr_dlg__gui_.Console); + return test_console; + } private static Gfo_usr_dlg_base test_console; } class Gfo_usr_dlg_noop implements Gfo_usr_dlg { public boolean Canceled() {return false;} public void Canceled_y_() {} public void Canceled_n_() {} diff --git a/100_core/src_420_usrMsg/gplx/Gfo_usr_dlg__gui_.java b/100_core/src_420_usrMsg/gplx/Gfo_usr_dlg__gui_.java index 572a68fc4..748d37d61 100644 --- a/100_core/src_420_usrMsg/gplx/Gfo_usr_dlg__gui_.java +++ b/100_core/src_420_usrMsg/gplx/Gfo_usr_dlg__gui_.java @@ -19,7 +19,7 @@ package gplx; import gplx.core.consoles.*; import gplx.core.strings.*; public class Gfo_usr_dlg__gui_ { public static final Gfo_usr_dlg__gui Noop = new Gfo_usr_dlg__gui_noop(); - public static final Gfo_usr_dlg__gui Console = new Gfo_usr_dlg__gui_console(); + public static final Gfo_usr_dlg__gui Console = new Gfo_usr_dlg__gui_console(); public static final Gfo_usr_dlg__gui Test = new Gfo_usr_dlg__gui_test(); } class Gfo_usr_dlg__gui_noop implements Gfo_usr_dlg__gui { @@ -31,11 +31,11 @@ class Gfo_usr_dlg__gui_noop implements Gfo_usr_dlg__gui { public void Write_stop(String text) {} } class Gfo_usr_dlg__gui_console implements Gfo_usr_dlg__gui { + private final Console_adp__sys console = Console_adp__sys.I; public void Clear() {} - public String_ring Prog_msgs() {return ring;} String_ring ring = new String_ring().Max_(0); + public String_ring Prog_msgs() {return ring;} private final String_ring ring = new String_ring().Max_(0); public void Write_prog(String text) {console.Write_tmp(text);} public void Write_note(String text) {console.Write_str_w_nl(text);} public void Write_warn(String text) {console.Write_str_w_nl(text);} public void Write_stop(String text) {console.Write_str_w_nl(text);} - Console_adp__sys console = Console_adp__sys.I; } diff --git a/100_core/src_420_usrMsg/gplx/UsrMsg.java b/100_core/src_420_usrMsg/gplx/UsrMsg.java index 940e20a82..792e04214 100644 --- a/100_core/src_420_usrMsg/gplx/UsrMsg.java +++ b/100_core/src_420_usrMsg/gplx/UsrMsg.java @@ -29,9 +29,9 @@ public class UsrMsg { args.Add_if_dupe_use_nth(k, KeyVal_.new_(k, v)); return this; } - public String XtoStrSingleLine() {return XtoStr(" ");} - public String XtoStr() {return XtoStr(Op_sys.Cur().Nl_str());} - String XtoStr(String spr) { + public String XtoStrSingleLine() {return To_str(" ");} + public String To_str() {return To_str(Op_sys.Cur().Nl_str());} + String To_str(String spr) { if (hdr == null) { GfoMsg m = GfoMsg_.new_cast_(cmd); for (int i = 0; i < args.Count(); i++) { @@ -47,7 +47,7 @@ public class UsrMsg { sb.Add_spr_unless_first("", " ", i); sb.Add_fmt("{0}={1}", kv.Key(), kv.Val(), spr); } - return sb.XtoStr(); + return sb.To_str(); } public static UsrMsg fmt_(String hdr, Object... ary) { UsrMsg rv = new UsrMsg(); diff --git a/100_core/src_420_usrMsg/gplx/UsrMsgWkr_console.java b/100_core/src_420_usrMsg/gplx/UsrMsgWkr_console.java index 77a92631e..0a6a3aef7 100644 --- a/100_core/src_420_usrMsg/gplx/UsrMsgWkr_console.java +++ b/100_core/src_420_usrMsg/gplx/UsrMsgWkr_console.java @@ -19,7 +19,7 @@ package gplx; import gplx.core.consoles.*; public class UsrMsgWkr_console implements UsrMsgWkr { public void ExecUsrMsg(int type, UsrMsg umsg) { - String text = umsg.XtoStr(); + String text = umsg.To_str(); if (type == UsrMsgWkr_.Type_Warn) text = "!!!!" + text; else if (type == UsrMsgWkr_.Type_Stop) diff --git a/100_core/src_420_usrMsg/gplx/UsrMsgWkr_test.java b/100_core/src_420_usrMsg/gplx/UsrMsgWkr_test.java index 4d95fa164..b3129b509 100644 --- a/100_core/src_420_usrMsg/gplx/UsrMsgWkr_test.java +++ b/100_core/src_420_usrMsg/gplx/UsrMsgWkr_test.java @@ -23,7 +23,7 @@ public class UsrMsgWkr_test implements UsrMsgWkr { public boolean HasWarn(UsrMsg um) { for (int i = 0; i < msgs.Count(); i++) { UsrMsg found = (UsrMsg)msgs.Get_at(i); - if (String_.Eq(um.XtoStr(), found.XtoStr())) return true; + if (String_.Eq(um.To_str(), found.To_str())) return true; } return false; } diff --git a/100_core/src_800_tst/gplx/PerfLogMgr_fxt.java b/100_core/src_800_tst/gplx/PerfLogMgr_fxt.java index 72df704cd..3e3c7007b 100644 --- a/100_core/src_800_tst/gplx/PerfLogMgr_fxt.java +++ b/100_core/src_800_tst/gplx/PerfLogMgr_fxt.java @@ -39,16 +39,16 @@ public class PerfLogMgr_fxt { String_bldr sb = String_bldr_.new_(); for (Object itmObj : entries) { PerfLogItm itm = (PerfLogItm)itmObj; - sb.Add(itm.XtoStr()).Add_char_crlf(); + sb.Add(itm.To_str()).Add_char_crlf(); } - Io_mgr.I.AppendFilStr(url, sb.XtoStr()); + Io_mgr.I.AppendFilStr(url, sb.To_str()); entries.Clear(); } List_adp entries = List_adp_.new_(); PerfLogTmr tmr = PerfLogTmr.new_(); Io_url url = Io_url_.Empty; public static final PerfLogMgr_fxt _ = new PerfLogMgr_fxt(); PerfLogMgr_fxt() {} class PerfLogItm { - public String XtoStr() { - String secondsStr = TimeSpanAdp_.XtoStr(milliseconds, TimeSpanAdp_.Fmt_Default); + public String To_str() { + String secondsStr = TimeSpanAdp_.To_str(milliseconds, TimeSpanAdp_.Fmt_Default); secondsStr = String_.PadBgn(secondsStr, 7, "0"); // 7=000.000; left-aligns all times return String_.Concat(secondsStr, "|", text); } diff --git a/100_core/src_800_tst/gplx/Tfds.java b/100_core/src_800_tst/gplx/Tfds.java index 48b606e56..13cf9bc2f 100644 --- a/100_core/src_800_tst/gplx/Tfds.java +++ b/100_core/src_800_tst/gplx/Tfds.java @@ -40,8 +40,8 @@ public class Tfds { // URL:doc/gplx.tfds/Tfds.txt public static void Eq_str(String expd, byte[] actl) {Eq_wkr(expd, String_.new_u8(actl), true, EmptyStr);} public static void Eq_bry(String expd, byte[] actl) {Eq_wkr(expd, String_.new_u8(actl), true, EmptyStr);} public static void Eq_bry(byte[] expd, byte[] actl) {Eq_wkr(String_.new_u8(expd), String_.new_u8(actl), true, EmptyStr);} - public static void Eq_str_intf(XtoStrAble expd, XtoStrAble actl, String msg) {Eq_wkr(expd.XtoStr(), actl.XtoStr(), true, msg);} - public static void Eq_str_intf(XtoStrAble expd, XtoStrAble actl) {Eq_wkr(expd.XtoStr(), actl.XtoStr(), true, String_.Empty);} + public static void Eq_str_intf(To_str_able expd, To_str_able actl, String msg) {Eq_wkr(expd.To_str(), actl.To_str(), true, msg);} + public static void Eq_str_intf(To_str_able expd, To_str_able actl) {Eq_wkr(expd.To_str(), actl.To_str(), true, String_.Empty);} public static void Eq_str_lines(String lhs, String rhs) {Eq_str_lines(lhs, rhs, EmptyStr);} public static void Eq_str_lines(String lhs, String rhs, String note) { if (lhs == null && rhs == null) return; // true @@ -117,15 +117,15 @@ public class Tfds { // URL:doc/gplx.tfds/Tfds.txt for (int i = 0; i < lhsLen; i++) { Object lhs = lhsList.Get_at(i); Object rhs = i >= rhsLen ? null : rhsList.Get_at(i); - String lhsStr = xtoStr.XtoStr(lhs, lhs); - String rhsStr = rhs == null ? "<>" : xtoStr.XtoStr(rhs, lhs); + String lhsStr = xtoStr.To_str(lhs, lhs); + String rhsStr = rhs == null ? "<>" : xtoStr.To_str(rhs, lhs); boolean isEq = Object_.Eq(lhsStr, rhsStr); if (!isEq) pass = false; Eq_ary_wkr_addItm(list, i, isEq, lhsStr, rhsStr); } for (int i = lhsLen; i < rhsLen; i++) { String lhsStr = "<>"; Object rhs = rhsList.Get_at(i); - String rhsStr = xtoStr.XtoStr(rhs, null); + String rhsStr = xtoStr.To_str(rhs, null); Eq_ary_wkr_addItm(list, i, false, lhsStr, rhsStr); pass = false; } @@ -169,11 +169,11 @@ public class Tfds { // URL:doc/gplx.tfds/Tfds.txt int aryLen = Array_.Len(ary); for (int i = 0; i < aryLen; i++) sb.Add_many("'", Object_.Xto_str_strict_or_null_mark(ary[i]), "'", " "); - WriteText(sb.XtoStr() + String_.CrLf); + WriteText(sb.To_str() + String_.CrLf); } } class TfdsEqListItmStr_cls_default implements TfdsEqListItmStr { - public String XtoStr(Object cur, Object actl) { + public String To_str(Object cur, Object actl) { return Object_.Xto_str_strict_or_null_mark(cur); } public static final TfdsEqListItmStr_cls_default _ = new TfdsEqListItmStr_cls_default(); TfdsEqListItmStr_cls_default() {} @@ -221,7 +221,7 @@ class TfdsMsgBldr { // String itmComparison = (String)obj; // sb.Add_fmt_line("{0}{1}", "\t\t", itmComparison); // } - return WrapMsg(sb.XtoStr()); + return WrapMsg(sb.To_str()); } String CustomMsg_xtoStr(String customMsg) { return (customMsg == EmptyStr) @@ -231,8 +231,8 @@ class TfdsMsgBldr { public String Obj_xtoStr(Object obj) { String s = String_.as_(obj); if (s != null) return String_.Concat("'", s, "'"); // if Object is String, put quotes around it for legibility - XtoStrAble xtoStrAble = XtoStrAble_.as_(obj); - if (xtoStrAble != null) return xtoStrAble.XtoStr(); + To_str_able xtoStrAble = To_str_able_.as_(obj); + if (xtoStrAble != null) return xtoStrAble.To_str(); return Object_.Xto_str_strict_or_null_mark(obj); } String WrapMsg(String text) { diff --git a/100_core/src_800_tst/gplx/TfdsEqListItmStr.java b/100_core/src_800_tst/gplx/TfdsEqListItmStr.java index 92d98f50e..38fa86b87 100644 --- a/100_core/src_800_tst/gplx/TfdsEqListItmStr.java +++ b/100_core/src_800_tst/gplx/TfdsEqListItmStr.java @@ -17,5 +17,5 @@ along with this program. If not, see . */ package gplx; public interface TfdsEqListItmStr { - String XtoStr(Object cur, Object actl); + String To_str(Object cur, Object actl); } diff --git a/100_core/src_900_xml/gplx/Base85_utl.java b/100_core/src_900_xml/gplx/Base85_utl.java index 95d25e9fe..40975239a 100644 --- a/100_core/src_900_xml/gplx/Base85_utl.java +++ b/100_core/src_900_xml/gplx/Base85_utl.java @@ -17,7 +17,7 @@ along with this program. If not, see . */ package gplx; public class Base85_utl { - public static String XtoStr(int val, int minLen) {return String_.new_u8(XtoStrByAry(val, null, 0, minLen));} + public static String To_str(int val, int minLen) {return String_.new_u8(XtoStrByAry(val, null, 0, minLen));} public static byte[] XtoStrByAry(int val, int minLen) {return XtoStrByAry(val, null, 0, minLen);} public static byte[] XtoStrByAry(int val, byte[] ary, int aryPos, int minLen) { int strLen = DigitCount(val); diff --git a/100_core/src_900_xml/gplx/Base85_utl_tst.java b/100_core/src_900_xml/gplx/Base85_utl_tst.java index be649d09c..9f38e91dc 100644 --- a/100_core/src_900_xml/gplx/Base85_utl_tst.java +++ b/100_core/src_900_xml/gplx/Base85_utl_tst.java @@ -30,7 +30,7 @@ public class Base85_utl_tst { tst_Log( 52200625, 5); tst_Log(Int_.MaxValue, 5); } void tst_Log(int val, int expd) {Tfds.Eq(expd, Base85_utl.DigitCount(val));} - @Test public void XtoStr() { + @Test public void To_str() { tst_XtoStr( 0, "!"); tst_XtoStr( 84, "u"); tst_XtoStr( 85, "\"!"); @@ -42,7 +42,7 @@ public class Base85_utl_tst { tst_XtoStr( 52200625, "\"!!!!"); } void tst_XtoStr(int val, String expd) { - String actl = Base85_utl.XtoStr(val, 0); + String actl = Base85_utl.To_str(val, 0); Tfds.Eq(expd, actl); Tfds.Eq(val, Base85_utl.XtoIntByStr(expd)); } diff --git a/100_core/src_900_xml/gplx/HierStrBldr.java b/100_core/src_900_xml/gplx/HierStrBldr.java index d2f2bd5ea..6a2a6e331 100644 --- a/100_core/src_900_xml/gplx/HierStrBldr.java +++ b/100_core/src_900_xml/gplx/HierStrBldr.java @@ -44,7 +44,7 @@ public class HierStrBldr { for (int i = 0; i < multipleAry.length; i++) sb.Add_fmt(dirFmt, Int_.Xto_str_fmt(multipleAry[i], numFmt)); sb.Add_fmt(filFmt, Int_.Xto_str_fmt(idx, numFmt)); - return sb.XtoStr(); + return sb.To_str(); } public HierStrBldr Ctor_io(Io_url root, String dirFmt, String filFmt, String numFmt, int... filCountMaxs) { this.Ctor(root.Raw(), dirFmt + dirSpr, filFmt, numFmt, filCountMaxs); diff --git a/100_core/tst/gplx/TfdsTstr_fxt.java b/100_core/tst/gplx/TfdsTstr_fxt.java index 5fca0bc4e..96b83c255 100644 --- a/100_core/tst/gplx/TfdsTstr_fxt.java +++ b/100_core/tst/gplx/TfdsTstr_fxt.java @@ -64,7 +64,7 @@ public class TfdsTstr_fxt { sb.Add_fmt_line("{0}{1} {2}", errorKey, String_.PadEnd("", nameLenMax, " "), itm.Actl()); } sb.Add(String_.Repeat("_", 80)); - throw Err_.new_wo_type(sb.XtoStr()); + throw Err_.new_wo_type(sb.To_str()); } List_adp list = List_adp_.new_(); public static TfdsTstr_fxt new_() {return new TfdsTstr_fxt();} TfdsTstr_fxt() {} @@ -83,7 +83,7 @@ class TfdsTstrItm { if (i != 0) sb.Add("."); sb.Add((String)list.Get_at(i)); } - subName = sb.XtoStr(); + subName = sb.To_str(); } public int CompareResult() {return compareResult;} public TfdsTstrItm CompareResult_(int val) {compareResult = val; return this;} int compareResult; public boolean Compare() { diff --git a/100_core/tst/gplx/stores/xmls/XmlDataWtr_tst.java b/100_core/tst/gplx/stores/xmls/XmlDataWtr_tst.java index d2bbde0c2..28810694c 100644 --- a/100_core/tst/gplx/stores/xmls/XmlDataWtr_tst.java +++ b/100_core/tst/gplx/stores/xmls/XmlDataWtr_tst.java @@ -89,7 +89,7 @@ public class XmlDataWtr_tst { } void tst_XStr(XmlDataWtr wtr, String... parts) { String expd = String_.Concat(parts); - Tfds.Eq(expd, wtr.XtoStr()); + Tfds.Eq(expd, wtr.To_str()); } XmlDataWtr wtr; } diff --git a/110_gfml/src_100_tkn/gplx/gfml/GfmlTkn.java b/110_gfml/src_100_tkn/gplx/gfml/GfmlTkn.java index 7e5d2b6fb..dd431b5d4 100644 --- a/110_gfml/src_100_tkn/gplx/gfml/GfmlTkn.java +++ b/110_gfml/src_100_tkn/gplx/gfml/GfmlTkn.java @@ -32,7 +32,7 @@ class GfmlTknAry_ { String_bldr sb = String_bldr_.new_(); for (GfmlTkn tkn : ary) sb.Add(tkn.Raw()); - return sb.XtoStr(); + return sb.To_str(); } @gplx.Internal protected static String XtoVal(GfmlTkn[] ary) {return XtoVal(ary, 0, ary.length);} static String XtoVal(GfmlTkn[] ary, int bgn, int end) { @@ -41,6 +41,6 @@ class GfmlTknAry_ { GfmlTkn tkn = ary[i]; sb.Add(tkn.Val()); } - return sb.XtoStr(); + return sb.To_str(); } } diff --git a/110_gfml/src_200_type/gplx/gfml/GfmlFld.java b/110_gfml/src_200_type/gplx/gfml/GfmlFld.java index dd1f074bf..885296ae1 100644 --- a/110_gfml/src_200_type/gplx/gfml/GfmlFld.java +++ b/110_gfml/src_200_type/gplx/gfml/GfmlFld.java @@ -28,8 +28,8 @@ public class GfmlFld { rv.defaultTkn = defaultTkn; // FIXME: defaultTkn.clone_() return rv; } - public String XtoStr() {String_bldr sb = String_bldr_.new_(); this.XtoStr(sb); return sb.Xto_str_and_clear();} - public void XtoStr(String_bldr sb) {sb.Add_fmt("name={0} typeKey={1}", name, typeKey);} + public String To_str() {String_bldr sb = String_bldr_.new_(); this.To_str(sb); return sb.Xto_str_and_clear();} + public void To_str(String_bldr sb) {sb.Add_fmt("name={0} typeKey={1}", name, typeKey);} public static final GfmlFld Null = new_(false, GfmlItmKeys.NullKey, GfmlType_.AnyKey); public static GfmlFld new_(boolean name_isKey, String name, String typeKey) { diff --git a/110_gfml/src_300_gdoc/gplx/gfml/GfmlAtr.java b/110_gfml/src_300_gdoc/gplx/gfml/GfmlAtr.java index f54002660..9bd22e5f1 100644 --- a/110_gfml/src_300_gdoc/gplx/gfml/GfmlAtr.java +++ b/110_gfml/src_300_gdoc/gplx/gfml/GfmlAtr.java @@ -25,7 +25,7 @@ public class GfmlAtr implements GfmlItm { public int SubObjs_Count() {return subObjs.Count();} public GfmlObj SubObjs_GetAt(int i) {return (GfmlObj)subObjs.Get_at(i);} GfmlObjList subObjs = GfmlObjList.new_(); // PERF?: make capacity 3 instead of 8 public void SubObjs_Add(GfmlObj o) {subObjs.Add(o);} - public String XtoStr() {return String_.Concat(this.Key(), "=", this.DatTkn().Val());} + public String To_str() {return String_.Concat(this.Key(), "=", this.DatTkn().Val());} @gplx.Internal protected void Key_set(String v) {keyTkn = GfmlTkn_.val_(v);} // used for 1 test public static GfmlAtr as_(Object obj) {return obj instanceof GfmlAtr ? (GfmlAtr)obj : null;} diff --git a/110_gfml/src_300_gdoc/gplx/gfml/GfmlDocPos.java b/110_gfml/src_300_gdoc/gplx/gfml/GfmlDocPos.java index ca934ab13..3d6e0f671 100644 --- a/110_gfml/src_300_gdoc/gplx/gfml/GfmlDocPos.java +++ b/110_gfml/src_300_gdoc/gplx/gfml/GfmlDocPos.java @@ -52,7 +52,7 @@ public class GfmlDocPos implements CompareAble { int newIdx = ary[oldLen - 1]; return new GfmlDocPos(newAry, newIdx); } - @Override public String toString() {return path;} public String XtoStr() {return path;} + @Override public String toString() {return path;} public String To_str() {return path;} void MakePath() { String_bldr sb = String_bldr_.new_(); for (int i = 0; i < ary.length; i++) { @@ -60,7 +60,7 @@ public class GfmlDocPos implements CompareAble { sb.Add("_"); } sb.Add(idx); - path = sb.XtoStr(); + path = sb.To_str(); } int[] ary; int idx; @gplx.Internal protected GfmlDocPos(int[] ary, int idx) {this.ary = ary; this.idx = idx;} diff --git a/110_gfml/src_300_gdoc/gplx/gfml/GfmlDoc_.java b/110_gfml/src_300_gdoc/gplx/gfml/GfmlDoc_.java index 8540d0977..c7f136f51 100644 --- a/110_gfml/src_300_gdoc/gplx/gfml/GfmlDoc_.java +++ b/110_gfml/src_300_gdoc/gplx/gfml/GfmlDoc_.java @@ -39,7 +39,7 @@ class GfmlUsrMsgs { Err rv = Err_.new_wo_type("gfml parse error"); for (int i = 0; i < bldr.Doc().UsrMsgs().Count(); i++) { UsrMsg um = (UsrMsg)bldr.Doc().UsrMsgs().Get_at(i); - rv.Args_add("err" + Int_.Xto_str(i), um.XtoStr()); + rv.Args_add("err" + Int_.Xto_str(i), um.To_str()); } return rv; } diff --git a/110_gfml/src_300_gdoc/gplx/gfml/GfmlItm.java b/110_gfml/src_300_gdoc/gplx/gfml/GfmlItm.java index d32437799..24e1bb195 100644 --- a/110_gfml/src_300_gdoc/gplx/gfml/GfmlItm.java +++ b/110_gfml/src_300_gdoc/gplx/gfml/GfmlItm.java @@ -16,7 +16,7 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.gfml; import gplx.*; -public interface GfmlItm extends GfmlObj, XtoStrAble { +public interface GfmlItm extends GfmlObj, To_str_able { GfmlTkn KeyTkn(); String Key(); // Key() is alternative to Key().Val() GfmlType Type(); boolean KeyedSubObj(); diff --git a/110_gfml/src_300_gdoc/gplx/gfml/GfmlNde.java b/110_gfml/src_300_gdoc/gplx/gfml/GfmlNde.java index 2c359412d..1d348f318 100644 --- a/110_gfml/src_300_gdoc/gplx/gfml/GfmlNde.java +++ b/110_gfml/src_300_gdoc/gplx/gfml/GfmlNde.java @@ -40,7 +40,7 @@ public class GfmlNde implements GfmlItm { public GfmlDocPos DocPos() {return docPos;} GfmlDocPos docPos = GfmlDocPos_.Null; public GfmlItmKeys SubKeys() {return subKeys;} GfmlItmKeys subKeys = GfmlItmKeys.new_(); public GfmlItmHnds SubHnds() {return subHnds;} GfmlItmHnds subHnds = GfmlItmHnds.new_(); - public String XtoStr() {return GfmlDocWtr_.xtoStr_(this);} + public String To_str() {return GfmlDocWtr_.xtoStr_(this);} public void UpdateNde(String hnd) { for (int i = 0; i < subHnds.Count(); i++) { GfmlNde nde = (GfmlNde)subHnds.Get_at(i); diff --git a/110_gfml/src_500_build/gplx/gfml/GfmlStringHighlighter.java b/110_gfml/src_500_build/gplx/gfml/GfmlStringHighlighter.java index 30d278921..bb5e43682 100644 --- a/110_gfml/src_500_build/gplx/gfml/GfmlStringHighlighter.java +++ b/110_gfml/src_500_build/gplx/gfml/GfmlStringHighlighter.java @@ -80,9 +80,9 @@ class GfmlStringHighlighter { symBfr.Add_at(0, " "); } List_adp rv = List_adp_.new_(); - rv.Add(posBfr.XtoStr()); - rv.Add(rawBfr.XtoStr()); - rv.Add(symBfr.XtoStr()); + rv.Add(posBfr.To_str()); + rv.Add(rawBfr.To_str()); + rv.Add(symBfr.To_str()); if (symList.Count() > 0) rv.Add(""); for (int i = 0; i < symList.Count(); i++) diff --git a/110_gfml/src_600_rdrWtr/gplx/gfml/GfmlDataNde.java b/110_gfml/src_600_rdrWtr/gplx/gfml/GfmlDataNde.java index a8209e9f3..a2274c66b 100644 --- a/110_gfml/src_600_rdrWtr/gplx/gfml/GfmlDataNde.java +++ b/110_gfml/src_600_rdrWtr/gplx/gfml/GfmlDataNde.java @@ -79,7 +79,7 @@ public class GfmlDataNde { class GfmlDataWtr2 extends DataWtr_base implements DataWtr { @Override public void WriteData(String name, Object val) { GfmlTkn nameTkn = GfmlTkn_.raw_(name); - GfmlTkn valTkn = GfmlTkn_.raw_(XtoStr(val)); + GfmlTkn valTkn = GfmlTkn_.raw_(To_str(val)); GfmlAtr atr = GfmlAtr.new_(nameTkn, valTkn, GfmlType_.String); GfmlNde nde = gdoc.RootNde().SubHnds().Get_at(0); nde.SubKeys().Add(atr); @@ -91,8 +91,8 @@ class GfmlDataWtr2 extends DataWtr_base implements DataWtr { @Override public void WriteNodeEnd() {} public void WriteLeafEnd() {} public void Clear() {} - public String XtoStr() {return "";} - String XtoStr(Object obj) { + public String To_str() {return "";} + String To_str(Object obj) { if (obj == null) return "''"; String s = obj.toString(); return String_.Concat("'", String_.Replace(s, "'", "''"), "'"); diff --git a/110_gfml/src_600_rdrWtr/gplx/gfml/GfmlDataRdr.java b/110_gfml/src_600_rdrWtr/gplx/gfml/GfmlDataRdr.java index 201ac7797..c22abd303 100644 --- a/110_gfml/src_600_rdrWtr/gplx/gfml/GfmlDataRdr.java +++ b/110_gfml/src_600_rdrWtr/gplx/gfml/GfmlDataRdr.java @@ -35,7 +35,7 @@ public class GfmlDataRdr extends GfmlDataRdr_base { rv.SetNode(nde); return rv; } - public static DataRdr wtr_(DataWtr wtr) {return raw_root_(wtr.XtoStr());} + public static DataRdr wtr_(DataWtr wtr) {return raw_root_(wtr.To_str());} @Override public SrlMgr SrlMgr_new(Object o) {return new GfmlDataRdr();} @gplx.Internal protected GfmlDataRdr() { this.Parse_set(true); diff --git a/110_gfml/src_600_rdrWtr/gplx/gfml/GfmlDataRdr_base.java b/110_gfml/src_600_rdrWtr/gplx/gfml/GfmlDataRdr_base.java index 82870bf66..4ea5faf7b 100644 --- a/110_gfml/src_600_rdrWtr/gplx/gfml/GfmlDataRdr_base.java +++ b/110_gfml/src_600_rdrWtr/gplx/gfml/GfmlDataRdr_base.java @@ -54,7 +54,7 @@ public abstract class GfmlDataRdr_base extends DataRdr_base implements DataRdr { return rv; } public void Rls() {} - public String XtoStr() {return curNde.XtoStr();} + public String To_str() {return curNde.To_str();} @gplx.Internal protected void SetNode(GfmlNde curNde) {this.curNde = curNde; this.list = curNde.SubHnds();} GfmlNde curNde; GfmlItmHnds list; int pos = -1; } diff --git a/110_gfml/src_600_rdrWtr/gplx/gfml/GfmlDataWtr.java b/110_gfml/src_600_rdrWtr/gplx/gfml/GfmlDataWtr.java index 8c14fea1b..cb4883b83 100644 --- a/110_gfml/src_600_rdrWtr/gplx/gfml/GfmlDataWtr.java +++ b/110_gfml/src_600_rdrWtr/gplx/gfml/GfmlDataWtr.java @@ -29,7 +29,7 @@ public class GfmlDataWtr extends DataWtr_base implements DataWtr { if (nde.SubKeys().Count() != 0) AddTkn_nullVal(keyedSpr); // add keyedSprTkn if not first GfmlTkn keyTkn = AddTkn_raw(name); AddTkn_raw("="); - GfmlTkn valTkn = AddTkn_raw(XtoStr(val)); + GfmlTkn valTkn = AddTkn_raw(To_str(val)); GfmlAtr atr = GfmlAtr.new_(keyTkn, valTkn, GfmlType_.String); nde.SubObjs_Add(atr); } @@ -72,13 +72,13 @@ public class GfmlDataWtr extends DataWtr_base implements DataWtr { public void Clear() {nde.SubObjs_Clear();} public void WriteTableBgn(String name, GfoFldList fields) {} public void CloseBranchHdr(boolean isInline) {} - public String XtoStr() { + public String To_str() { while (stack.Count() > 0) { // auto-close all nodes WriteNodeEnd(); } return GfmlDocWtr_.xtoStr_(gdoc.RootNde()); } - String XtoStr(Object obj) { + String To_str(Object obj) { if (obj == null) return "''"; String s = Object_.Xto_str_strict_or_empty(obj); return String_.Concat("'", String_.Replace(s, "'", "''"), "'"); diff --git a/110_gfml/src_600_rdrWtr/gplx/gfml/SqlDoc.java b/110_gfml/src_600_rdrWtr/gplx/gfml/SqlDoc.java index c36d016ef..8bd64c6dc 100644 --- a/110_gfml/src_600_rdrWtr/gplx/gfml/SqlDoc.java +++ b/110_gfml/src_600_rdrWtr/gplx/gfml/SqlDoc.java @@ -83,7 +83,7 @@ class SqlCmd_quote_end implements GfmlBldrCmd { sb.Add(pnd.Val()); } //Int_.Xto_str(bldr.CurNdeFrame().Nde().SubTkns().length) - GfmlAtr atr = GfmlAtr.new_(GfmlTkn_.raw_("word"), GfmlTkn_.raw_(sb.XtoStr()), GfmlType_.String); + GfmlAtr atr = GfmlAtr.new_(GfmlTkn_.raw_("word"), GfmlTkn_.raw_(sb.To_str()), GfmlType_.String); bldr.CurNdeFrame().CurNde().SubObjs_Add(atr); bldr.Frames_end(); } diff --git a/110_gfml/tst/gplx/gfml/ymoks_GfmlAtr_GfmlNde_mok.java b/110_gfml/tst/gplx/gfml/ymoks_GfmlAtr_GfmlNde_mok.java index e09357cde..d498e9309 100644 --- a/110_gfml/tst/gplx/gfml/ymoks_GfmlAtr_GfmlNde_mok.java +++ b/110_gfml/tst/gplx/gfml/ymoks_GfmlAtr_GfmlNde_mok.java @@ -31,7 +31,7 @@ class GfmlAtr_mok implements GfmlItm_mok { public String XtoStrStub() { String_bldr sb = String_bldr_.new_(); sb.Add_kv("key=", key).Add_kv("val=", val); - return sb.XtoStr(); + return sb.To_str(); } public static final GfmlAtr_mok Null = new GfmlAtr_mok().Key_(String_.Null_mark).Val_(String_.Null_mark); public static GfmlAtr_mok as_(Object obj) {return obj instanceof GfmlAtr_mok ? (GfmlAtr_mok)obj : null;} @@ -54,7 +54,7 @@ class GfmlNde_mok implements GfmlItm_mok { public String XtoStrStub() { String_bldr sb = String_bldr_.new_(); sb.Add_kv("key=", key).Add_kv("hnd=", hnd).Add_kv("typ=", typ).Add_kv("subs=", Int_.Xto_str(subs.Count())); - return sb.XtoStr(); + return sb.To_str(); } public GfmlNde_mok Subs_(GfmlItm_mok... ary) { for (GfmlItm_mok itm : ary) diff --git a/110_gfml/tst/gplx/gfml/ymoks_GfmlTyp_GfmlFld_mok.java b/110_gfml/tst/gplx/gfml/ymoks_GfmlTyp_GfmlFld_mok.java index 0185bc092..615850334 100644 --- a/110_gfml/tst/gplx/gfml/ymoks_GfmlTyp_GfmlFld_mok.java +++ b/110_gfml/tst/gplx/gfml/ymoks_GfmlTyp_GfmlFld_mok.java @@ -37,7 +37,7 @@ class GfmlFld_mok { GfmlTkn tkn = GfmlTkn_.as_(gobj); if (tkn != null) return tkn.Raw(); GfmlNde nde = GfmlNde.as_(gobj); - return nde.XtoStr(); + return nde.To_str(); } } class GfmlTyp_mok { diff --git a/110_gfml/tst/gplx/gfml/z081_GfmlDataWtr_tst.java b/110_gfml/tst/gplx/gfml/z081_GfmlDataWtr_tst.java index 801ec54df..9bf2ee4f8 100644 --- a/110_gfml/tst/gplx/gfml/z081_GfmlDataWtr_tst.java +++ b/110_gfml/tst/gplx/gfml/z081_GfmlDataWtr_tst.java @@ -65,7 +65,7 @@ public class z081_GfmlDataWtr_tst { tst_XtoStr(wtr, "root:key='data''s';"); } void tst_XtoStr(DataWtr wtr, String expd) { - String actl = wtr.XtoStr(); + String actl = wtr.To_str(); Tfds.Eq(expd, actl); } } diff --git a/110_gfml/tst/gplx/gfml/z082_GfmlDataWtrOpts_tst.java b/110_gfml/tst/gplx/gfml/z082_GfmlDataWtrOpts_tst.java index da7fa4308..8610cf2f7 100644 --- a/110_gfml/tst/gplx/gfml/z082_GfmlDataWtrOpts_tst.java +++ b/110_gfml/tst/gplx/gfml/z082_GfmlDataWtrOpts_tst.java @@ -48,7 +48,7 @@ public class z082_GfmlDataWtrOpts_tst { tst_XtoStr(wtr, String_.Concat("root:{key1='data1';}")); } void tst_XtoStr(DataWtr wtr, String expd) { - String actl = wtr.XtoStr(); + String actl = wtr.To_str(); Tfds.Eq(expd, actl); } } diff --git a/110_gfml/tst/gplx/gfml/z601_edit_atr_tst.java b/110_gfml/tst/gplx/gfml/z601_edit_atr_tst.java index fc9524128..ec187cc92 100644 --- a/110_gfml/tst/gplx/gfml/z601_edit_atr_tst.java +++ b/110_gfml/tst/gplx/gfml/z601_edit_atr_tst.java @@ -121,7 +121,7 @@ class GfmlUpdateFx { GfmlUpdateCmd cmd = (GfmlUpdateCmd)cmds.Get_at(i); cmd.Exec(actlDoc); } - String actl = actlDoc.RootNde().XtoStr(); + String actl = actlDoc.RootNde().To_str(); Tfds.Eq(expd, actl); cmds.Clear(); return this; diff --git a/110_gfml/tst/gplx/gfml/z803_useCase_KbdKeyboard_tst.java b/110_gfml/tst/gplx/gfml/z803_useCase_KbdKeyboard_tst.java index 335e774c8..850c4c35f 100644 --- a/110_gfml/tst/gplx/gfml/z803_useCase_KbdKeyboard_tst.java +++ b/110_gfml/tst/gplx/gfml/z803_useCase_KbdKeyboard_tst.java @@ -58,7 +58,7 @@ public class z803_useCase_KbdKeyboard_tst { Io_url url = Tfds.RscDir.GenSubFil_nest("110_gfml", "cfgs_archive", "gfui-keyboard-ui.cfg.gfml"); raw = Io_mgr.I.LoadFilStr(url); gdoc = GfmlDoc_.parse_any_eol_(raw); -// Tfds.Write(gdoc.RootNde().XtoStr()); +// Tfds.Write(gdoc.RootNde().To_str()); } String TypeHeader = String_.Concat ( "_type:{" diff --git a/110_gfml/tst/gplx/gfml/z811_useCase_GfmlIoSql_tst.java b/110_gfml/tst/gplx/gfml/z811_useCase_GfmlIoSql_tst.java index 2e105c07f..58854eef0 100644 --- a/110_gfml/tst/gplx/gfml/z811_useCase_GfmlIoSql_tst.java +++ b/110_gfml/tst/gplx/gfml/z811_useCase_GfmlIoSql_tst.java @@ -36,9 +36,9 @@ public class z811_useCase_GfmlIoSql_tst { void tst_Doc(String raw, GfmlNdeWrapper expd) { GfmlDoc doc = SqlDoc.XtoDoc(raw); GfmlNde actl = (GfmlNde)doc.RootNde(); - Tfds.Eq_ary_str(XtoStr(expd.Nde()), XtoStr(actl)); + Tfds.Eq_ary_str(To_str(expd.Nde()), To_str(actl)); } - String[] XtoStr(GfmlNde nde) { + String[] To_str(GfmlNde nde) { List_adp list = List_adp_.new_(); for (int i = 0; i < nde.SubObjs_Count(); i++) { GfmlAtr atr = (GfmlAtr)nde.SubObjs_GetAt(i); diff --git a/110_gfml/tst/gplx/gfml/z901_perf_tst.java b/110_gfml/tst/gplx/gfml/z901_perf_tst.java index c5b6565ab..330678ca6 100644 --- a/110_gfml/tst/gplx/gfml/z901_perf_tst.java +++ b/110_gfml/tst/gplx/gfml/z901_perf_tst.java @@ -29,7 +29,7 @@ public class z901_perf_tst { // sbXml.Add(longText); // sbXml.Add("/>"); // tmr.Bgn(); -// gplx.xmls.XmlDoc_.parse_(sbXml.XtoStr()); +// gplx.xmls.XmlDoc_.parse_(sbXml.To_str()); // tmr.End_and_print("xml"); // 400 String_bldr sbGfml = String_bldr_.new_(); @@ -40,11 +40,11 @@ public class z901_perf_tst { // sbGfml.Add(longText); } // tmr.Bgn(); -// gplx.texts.CharStream.pos0_(sbGfml.XtoStr()); +// gplx.texts.CharStream.pos0_(sbGfml.To_str()); // tmr.End_and_print("char"); // 1700 tmr.Bgn(); - GfmlDoc_.parse_any_eol_(sbGfml.XtoStr()); + GfmlDoc_.parse_any_eol_(sbGfml.To_str()); tmr.End_and_print("gfml"); // 1700 } //@Test diff --git a/140_dbs/src/gplx/dbs/Db_conn.java b/140_dbs/src/gplx/dbs/Db_conn.java index a6e5a067e..5f2e687f2 100644 --- a/140_dbs/src/gplx/dbs/Db_conn.java +++ b/140_dbs/src/gplx/dbs/Db_conn.java @@ -22,7 +22,7 @@ public class Db_conn { public Db_conn(Db_engine engine) {this.engine = engine;} public Db_conn_info Conn_info() {return engine.Conn_info();} public boolean Eq(Db_conn comp) {return String_.Eq(engine.Conn_info().Xto_api(), comp.Conn_info().Xto_api());} - public void Txn_bgn() {engine.Txn_bgn("");} +// public void Txn_bgn() {engine.Txn_bgn("");} public void Txn_bgn(String name) {engine.Txn_bgn(name);} public void Txn_end() {engine.Txn_end();} public void Txn_cxl() {engine.Txn_cxl();} @@ -67,7 +67,7 @@ public class Db_conn { public int Exec_sql_plog_txn(String msg, String sql) {return Exec_sql_plog(Bool_.Y, msg, sql);} public int Exec_sql_plog(boolean txn, String msg, String sql) { Gfo_usr_dlg_.I.Plog_many("", "", msg); - if (txn) this.Txn_bgn(); + if (txn) this.Txn_bgn(msg); int rv = Exec_sql(sql); if (txn) this.Txn_end(); Gfo_usr_dlg_.I.Plog_many("", "", "done:" + msg); diff --git a/140_dbs/src/gplx/dbs/Db_conn_info__base.java b/140_dbs/src/gplx/dbs/Db_conn_info__base.java index 71ec8edc7..b74461fff 100644 --- a/140_dbs/src/gplx/dbs/Db_conn_info__base.java +++ b/140_dbs/src/gplx/dbs/Db_conn_info__base.java @@ -37,7 +37,7 @@ public abstract class Db_conn_info__base implements Db_conn_info { if (hash.Has(xtn.Key())) continue; sb.Add_fmt("{0}={1};", xtn.Key(), xtn.Val_to_str_or_empty()); } - return sb.XtoStr(); + return sb.To_str(); } protected static String Bld_raw(String... ary) { Bry_bfr bfr = Bry_bfr.reset_(255); diff --git a/400_xowa/src/gplx/xowa/wmfs/data/Xowmf_val_itm.java b/140_dbs/src/gplx/dbs/Db_tbl.java similarity index 76% rename from 400_xowa/src/gplx/xowa/wmfs/data/Xowmf_val_itm.java rename to 140_dbs/src/gplx/dbs/Db_tbl.java index 999ddf8c0..1570f10aa 100644 --- a/400_xowa/src/gplx/xowa/wmfs/data/Xowmf_val_itm.java +++ b/140_dbs/src/gplx/dbs/Db_tbl.java @@ -15,8 +15,7 @@ GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ -package gplx.xowa.wmfs.data; import gplx.*; import gplx.xowa.*; import gplx.xowa.wmfs.*; -class Xowmf_val_itm { - public Xowmf_val_itm(byte[] val) {this.val = val;} - public byte[] Val() {return val;} private byte[] val; +package gplx.dbs; import gplx.*; +public interface Db_tbl extends RlsAble { + void Create_tbl(); } diff --git a/140_dbs/src/gplx/dbs/Db_tbl_.java b/140_dbs/src/gplx/dbs/Db_tbl_.java new file mode 100644 index 000000000..ef7d1bd1c --- /dev/null +++ b/140_dbs/src/gplx/dbs/Db_tbl_.java @@ -0,0 +1,30 @@ +/* +XOWA: the XOWA Offline Wiki Application +Copyright (C) 2012 gnosygnu@gmail.com + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as +published by the Free Software Foundation, either version 3 of the +License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . +*/ +package gplx.dbs; import gplx.*; +public class Db_tbl_ { + public static void Create_tbl(Db_tbl... ary) { + int len = ary.length; + for (int i = 0; i < len; ++i) + ary[i].Create_tbl(); + } + public static void Rls(Db_tbl... ary) { + int len = ary.length; + for (int i = 0; i < len; ++i) + ary[i].Rls(); + } +} diff --git a/140_dbs/src/gplx/dbs/engines/Db_engine.java b/140_dbs/src/gplx/dbs/engines/Db_engine.java index 1f8c21544..a3cd2bfa0 100644 --- a/140_dbs/src/gplx/dbs/engines/Db_engine.java +++ b/140_dbs/src/gplx/dbs/engines/Db_engine.java @@ -26,7 +26,7 @@ public interface Db_engine { Object New_stmt_prep_as_obj(String sql); DataRdr New_rdr(java.sql.ResultSet rdr, String sql); void Txn_bgn(String name); - void Txn_end(); + String Txn_end(); void Txn_cxl(); void Txn_sav(); void Conn_open(); diff --git a/140_dbs/src/gplx/dbs/engines/Db_engine_sql_base.java b/140_dbs/src/gplx/dbs/engines/Db_engine_sql_base.java index 95d5e05b4..05cd56332 100644 --- a/140_dbs/src/gplx/dbs/engines/Db_engine_sql_base.java +++ b/140_dbs/src/gplx/dbs/engines/Db_engine_sql_base.java @@ -27,10 +27,13 @@ public abstract class Db_engine_sql_base implements Db_engine { public Db_rdr New_rdr__rls_auto(Db_stmt stmt, Object rdr_obj, String sql) {return New_rdr(stmt, rdr_obj, sql);} @gplx.Virtual public Db_rdr New_rdr_clone() {return new Db_rdr__basic();} public Db_stmt New_stmt_prep(Db_qry qry) {return new Db_stmt_cmd(this, qry);} - @gplx.Virtual public void Txn_bgn(String name) {Exec_as_obj(Db_qry_sql.xtn_("BEGIN TRANSACTION;"));} - @gplx.Virtual public void Txn_end() {Exec_as_obj(Db_qry_sql.xtn_("COMMIT TRANSACTION;"));} - @gplx.Virtual public void Txn_cxl() {Exec_as_obj(Db_qry_sql.xtn_("ROLLBACK TRANSACTION;"));} - @gplx.Virtual public void Txn_sav() {this.Txn_end(); this.Txn_bgn("");} + @gplx.Virtual public void Txn_bgn(String name) {Exec_as_obj(Db_qry_sql.xtn_("BEGIN TRANSACTION;"));} + @gplx.Virtual public String Txn_end() {Exec_as_obj(Db_qry_sql.xtn_("COMMIT TRANSACTION;")); return "";} + @gplx.Virtual public void Txn_cxl() {Exec_as_obj(Db_qry_sql.xtn_("ROLLBACK TRANSACTION;"));} + @gplx.Virtual public void Txn_sav() { + String txn_name = this.Txn_end(); + this.Txn_bgn(txn_name); + } public Object Exec_as_obj(Db_qry qry) { if (qry.Tid() == Db_qry_.Tid_flush) return null; // ignore flush (delete-db) statements String sql = this.SqlWtr().Xto_str(qry, false); // DBG: Tfds.Write(sql); diff --git a/140_dbs/src/gplx/dbs/engines/mems/Db_engine__mem.java b/140_dbs/src/gplx/dbs/engines/mems/Db_engine__mem.java index 22d45a486..6e95628b1 100644 --- a/140_dbs/src/gplx/dbs/engines/mems/Db_engine__mem.java +++ b/140_dbs/src/gplx/dbs/engines/mems/Db_engine__mem.java @@ -25,7 +25,7 @@ public class Db_engine__mem implements Db_engine { public Db_stmt New_stmt_prep(Db_qry qry) {return new Db_stmt__mem(this, qry);} public Mem_tbl Tbls_get(String name) {return (Mem_tbl)tbl_hash.Get_by(name);} public void Txn_bgn(String name) {++txn_count;} private int txn_count = 0; - public void Txn_end() {--txn_count;} + public String Txn_end() {--txn_count; return "";} public void Txn_cxl() {--txn_count;} public void Txn_sav() {this.Txn_end(); this.Txn_bgn("");} public Object Exec_as_obj(Db_qry qry) {throw Err_.new_unimplemented();} diff --git a/140_dbs/src/gplx/dbs/engines/nulls/Noop_engine.java b/140_dbs/src/gplx/dbs/engines/nulls/Noop_engine.java index ade850800..c23368516 100644 --- a/140_dbs/src/gplx/dbs/engines/nulls/Noop_engine.java +++ b/140_dbs/src/gplx/dbs/engines/nulls/Noop_engine.java @@ -28,7 +28,7 @@ public class Noop_engine implements Db_engine { public Object New_stmt_prep_as_obj(String sql) {throw Err_.new_unimplemented();} public DataRdr New_rdr(java.sql.ResultSet rdr, String sql) {return DataRdr_.Null;} public void Txn_bgn(String name) {} - public void Txn_end() {} + public String Txn_end() {return "";} public void Txn_cxl() {} public void Txn_sav() {} public Object Exec_as_obj(Db_qry cmd) {return cmd.Exec_is_rdr() ? (Object)DataRdr_.Null : -1;} diff --git a/140_dbs/src/gplx/dbs/engines/sqlite/Sqlite_engine.java b/140_dbs/src/gplx/dbs/engines/sqlite/Sqlite_engine.java index 1be0ce7ed..94480f31a 100644 --- a/140_dbs/src/gplx/dbs/engines/sqlite/Sqlite_engine.java +++ b/140_dbs/src/gplx/dbs/engines/sqlite/Sqlite_engine.java @@ -36,7 +36,7 @@ public class Sqlite_engine extends Db_engine_sql_base { @Override public void Env_db_attach(String alias, Io_url db_url) {Exec_as_int(String_.Format("ATTACH '{0}' AS {1};", db_url.Raw(), alias));} @Override public void Env_db_detach(String alias) {Exec_as_int(String_.Format("DETACH {0};", alias));} @Override public void Txn_bgn(String name) {txn_mgr.Txn_bgn(name);} - @Override public void Txn_end() {txn_mgr.Txn_end();} + @Override public String Txn_end() {return txn_mgr.Txn_end();} @Override public void Txn_cxl() {txn_mgr.Txn_cxl();} @Override public void Txn_sav() {txn_mgr.Txn_sav();} @Override public boolean Meta_tbl_exists(String tbl) {return schema_mgr.Tbl_exists(tbl);} diff --git a/140_dbs/src/gplx/dbs/engines/sqlite/Sqlite_txn_mgr.java b/140_dbs/src/gplx/dbs/engines/sqlite/Sqlite_txn_mgr.java index b61d1535d..e99e5e2fa 100644 --- a/140_dbs/src/gplx/dbs/engines/sqlite/Sqlite_txn_mgr.java +++ b/140_dbs/src/gplx/dbs/engines/sqlite/Sqlite_txn_mgr.java @@ -42,8 +42,8 @@ public class Sqlite_txn_mgr { } txn_list.Add(name); } - public void Txn_end() { - if (txn_list.Count() == 0) {Gfo_usr_dlg_.I.Warn_many("", "", "no txns in stack;"); return;} + public String Txn_end() { + if (txn_list.Count() == 0) {Gfo_usr_dlg_.I.Warn_many("", "", "no txns in stack;"); return "";} String txn_last = (String)List_adp_.Pop_last(txn_list); if (txn_list.Count() == 0) {// no txns left; commit it engine.Exec_as_obj(Db_qry_sql.xtn_("COMMIT TRANSACTION;")); @@ -51,6 +51,7 @@ public class Sqlite_txn_mgr { } else engine.Exec_as_obj(Db_qry_sql.xtn_(String_.Format("RELEASE SAVEPOINT {0};", txn_last))); + return txn_last; } public void Txn_cxl() { if (txn_list.Count() == 0) {Gfo_usr_dlg_.I.Warn_many("", "", "no txns in stack;"); return;} diff --git a/140_dbs/src/gplx/dbs/engines/tdbs/TdbDbLoadMgr_tst.java b/140_dbs/src/gplx/dbs/engines/tdbs/TdbDbLoadMgr_tst.java index 5368ba427..a5be48b3b 100644 --- a/140_dbs/src/gplx/dbs/engines/tdbs/TdbDbLoadMgr_tst.java +++ b/140_dbs/src/gplx/dbs/engines/tdbs/TdbDbLoadMgr_tst.java @@ -45,7 +45,7 @@ public class TdbDbLoadMgr_tst { Tfds.Eq(file2.Path().Raw(), "C:\\file.dsv"); db.Files().DataObj_Wtr(wtr); - Tfds.Eq(wtr.XtoStr(), raw); + Tfds.Eq(wtr.To_str(), raw); } @Test public void ReadDbTbls() { String raw = String_.Concat_lines_crlf @@ -66,7 +66,7 @@ public class TdbDbLoadMgr_tst { Tfds.Eq(table.File().Id(), 1); db.Tables().DataObj_Wtr(wtr); - Tfds.Eq(wtr.XtoStr(), raw); + Tfds.Eq(wtr.To_str(), raw); } @Test public void ReadTbl() { String raw = String_.Concat_lines_crlf @@ -91,7 +91,7 @@ public class TdbDbLoadMgr_tst { Tfds.Eq(row.Read("name"), "me"); tbl.DataObj_Wtr(wtr); - Tfds.Eq(wtr.XtoStr(), raw); + Tfds.Eq(wtr.To_str(), raw); } DataRdr rdr_(String raw) { DataRdr rdr = DsvDataRdr_.dsv_(raw); diff --git a/140_dbs/src/gplx/dbs/engines/tdbs/TdbDbSaveMgr.java b/140_dbs/src/gplx/dbs/engines/tdbs/TdbDbSaveMgr.java index 0a03d85ef..d03e11a86 100644 --- a/140_dbs/src/gplx/dbs/engines/tdbs/TdbDbSaveMgr.java +++ b/140_dbs/src/gplx/dbs/engines/tdbs/TdbDbSaveMgr.java @@ -48,7 +48,7 @@ class TdbDbSaveMgr { TdbTable tbl = (TdbTable)tblObj; tbl.DataObj_Wtr(wtr); } - Io_mgr.I.SaveFilStr(fil.Path(), wtr.XtoStr()); + Io_mgr.I.SaveFilStr(fil.Path(), wtr.To_str()); } List_adp FetchTablesWithSamePath(TdbDatabase db, Io_url filPath) { List_adp list = List_adp_.new_(); diff --git a/140_dbs/src/gplx/dbs/engines/tdbs/TdbDbSaveMgr_tst.java b/140_dbs/src/gplx/dbs/engines/tdbs/TdbDbSaveMgr_tst.java index 8e4d3cbb3..b7adfa6ab 100644 --- a/140_dbs/src/gplx/dbs/engines/tdbs/TdbDbSaveMgr_tst.java +++ b/140_dbs/src/gplx/dbs/engines/tdbs/TdbDbSaveMgr_tst.java @@ -37,7 +37,7 @@ public class TdbDbSaveMgr_tst { , "1,mem/dir/db0.dsv,dsv" ); db.Files().DataObj_Wtr(wtr); - String actl = wtr.XtoStr(); + String actl = wtr.To_str(); Tfds.Eq(expd, actl); } @Test public void WriteDbTbls() { @@ -52,7 +52,7 @@ public class TdbDbSaveMgr_tst { , "================================, ,\" \",//" ); db.Tables().DataObj_Wtr(wtr); - String actl = wtr.XtoStr(); + String actl = wtr.To_str(); Tfds.Eq(expd, actl); } @Test public void WriteTbl() { @@ -71,7 +71,7 @@ public class TdbDbSaveMgr_tst { tbl.Flds().Add("name", StringClassXtn._); tbl.DataObj_Wtr(wtr); - String actl = wtr.XtoStr(); + String actl = wtr.To_str(); Tfds.Eq(expd, actl); } } diff --git a/140_dbs/src/gplx/dbs/engines/tdbs/TdbEngine.java b/140_dbs/src/gplx/dbs/engines/tdbs/TdbEngine.java index 0044e77fb..46d6c5fb9 100644 --- a/140_dbs/src/gplx/dbs/engines/tdbs/TdbEngine.java +++ b/140_dbs/src/gplx/dbs/engines/tdbs/TdbEngine.java @@ -28,7 +28,7 @@ public class TdbEngine implements Db_engine { } public void Conn_term() {} public void Txn_bgn(String name) {} - public void Txn_end() {} + public String Txn_end() {return "";} public void Txn_cxl() {} public void Txn_sav() {} public Db_engine New_clone(Db_conn_info conn_info) { diff --git a/140_dbs/src/gplx/dbs/engines/tdbs/TdbFileList.java b/140_dbs/src/gplx/dbs/engines/tdbs/TdbFileList.java index dacd139f5..190c4e358 100644 --- a/140_dbs/src/gplx/dbs/engines/tdbs/TdbFileList.java +++ b/140_dbs/src/gplx/dbs/engines/tdbs/TdbFileList.java @@ -18,7 +18,7 @@ along with this program. If not, see . package gplx.dbs.engines.tdbs; import gplx.*; import gplx.dbs.*; import gplx.dbs.engines.*; import gplx.lists.*; /*Ordered_hash_base*/ import gplx.stores.dsvs.*; /*DsvStoreLayout*/ public class TdbFileList extends Ordered_hash_base { - public TdbFile Get_by_or_fail(int id) {return TdbFile.as_(FetchOrFail_base(id));} + public TdbFile Get_by_or_fail(int id) {return TdbFile.as_(Get_by_or_fail_base(id));} public void Add(TdbFile src) {Add_base(src.Id(), src);} Io_url dbInfo; diff --git a/140_dbs/src/gplx/dbs/engines/tdbs/TdbInsert.java b/140_dbs/src/gplx/dbs/engines/tdbs/TdbInsert.java index 8cd581967..2f6b17a0d 100644 --- a/140_dbs/src/gplx/dbs/engines/tdbs/TdbInsert.java +++ b/140_dbs/src/gplx/dbs/engines/tdbs/TdbInsert.java @@ -34,7 +34,7 @@ class TdbInsertWkr implements Db_qryWkr { GfoFldList selectFldsForNewRow = null; try {selectFldsForNewRow = insertFlds.XtoGfoFldLst(tbl);} catch (Exception e) {throw Err_.new_exc(e, "db", "failed to generate flds for new row");} - if (insertFldsCount > selectFldsForNewRow.Count()) throw Err_.new_wo_type("insert flds cannot exceed selectFlds", "insertFlds", insertFlds.XtoStr(), "selectFlds", selectFldsForNewRow.XtoStr()); + if (insertFldsCount > selectFldsForNewRow.Count()) throw Err_.new_wo_type("insert flds cannot exceed selectFlds", "insertFlds", insertFlds.To_str(), "selectFlds", selectFldsForNewRow.To_str()); while (rdr.MoveNextPeer()) { count++; GfoNde row = GfoNde_.vals_(selectFldsForNewRow, new Object[insertFldsCount]); diff --git a/140_dbs/src/gplx/dbs/qrys/Db_qry__select_in_tbl.java b/140_dbs/src/gplx/dbs/qrys/Db_qry__select_in_tbl.java index 1789b72f3..afe3d1cde 100644 --- a/140_dbs/src/gplx/dbs/qrys/Db_qry__select_in_tbl.java +++ b/140_dbs/src/gplx/dbs/qrys/Db_qry__select_in_tbl.java @@ -56,7 +56,7 @@ public class Db_qry__select_in_tbl implements Db_qry { if (having_sql != null) sb.Add(having_sql); if (order_by_sql != null) {sb.Add(" ORDER BY "); sb.Add(order_by_sql);} if (limit_sql != null) sb.Add(limit_sql); - return sb.XtoStr(); + return sb.To_str(); } } public static Db_qry__select_in_tbl new_(String base_table, String[] where_flds, String[] select_flds, String[] order_flds) { diff --git a/140_dbs/src/gplx/dbs/qrys/Db_qry_select_tst.java b/140_dbs/src/gplx/dbs/qrys/Db_qry_select_tst.java index a28354a9f..904892ec7 100644 --- a/140_dbs/src/gplx/dbs/qrys/Db_qry_select_tst.java +++ b/140_dbs/src/gplx/dbs/qrys/Db_qry_select_tst.java @@ -72,18 +72,18 @@ public class Db_qry_select_tst { // @Test public void GroupBy() { // cmd.From_("tbl0").groupBy_("fld0", "fld1"); // expd = "SELECT fld0, fld1 FROM tbl0 GROUP BY fld0, fld1"; -// Tfds.Eq(cmd.XtoStr(), expd); +// Tfds.Eq(cmd.To_str(), expd); // } // @Test public void Union() { // cmd.From_("tbl0").select("fld0").union_(qry2.from("tbl1").select("fld0")); // cmd.From_("tbl0").select("fld0").union_().from("tbl1").select("fld0"); // feasible, but will be bad later when trying to access Db_qry__select_cmd props // expd = "SELECT fld0 FROM tbl0 UNION SELECT fld0 FROM tbl1"; -// Tfds.Eq(cmd.XtoStr(), expd); +// Tfds.Eq(cmd.To_str(), expd); // } // @Test public void Having() { // cmd.From_("tbl0").groupBy_("fld0", "fld1"); // expd = "SELECT fld0, fld1 FROM tbl0 GROUP BY fld0, fld1 HAVING Count(fld0) > 1"; -// Tfds.Eq(cmd.XtoStr(), expd); +// Tfds.Eq(cmd.To_str(), expd); // } void tst_XtoStr(Db_qry qry, String expd) {Tfds.Eq(expd, cmd.Xto_sql());} } diff --git a/140_dbs/src/gplx/dbs/sqls/Db_obj_ary_crt.java b/140_dbs/src/gplx/dbs/sqls/Db_obj_ary_crt.java index 063aad5ec..d07dde655 100644 --- a/140_dbs/src/gplx/dbs/sqls/Db_obj_ary_crt.java +++ b/140_dbs/src/gplx/dbs/sqls/Db_obj_ary_crt.java @@ -24,7 +24,7 @@ public class Db_obj_ary_crt implements gplx.core.criterias.Criteria { public void Val_from_args(Hash_adp args) {throw Err_.new_unimplemented();} public void Val_as_obj_(Object v) {throw Err_.new_unimplemented();} public boolean Matches(Object obj) {return false;} - public String XtoStr() {return "";} + public String To_str() {return "";} public static Db_obj_ary_crt new_(Db_fld... flds) {return new Db_obj_ary_crt().Flds_(flds);} public static Db_obj_ary_crt new_by_type(byte type_tid, String... names) { int len = names.length; diff --git a/140_dbs/src/gplx/dbs/sqls/Sql_qry_wtr_ansi.java b/140_dbs/src/gplx/dbs/sqls/Sql_qry_wtr_ansi.java index c8bef1844..c6635e643 100644 --- a/140_dbs/src/gplx/dbs/sqls/Sql_qry_wtr_ansi.java +++ b/140_dbs/src/gplx/dbs/sqls/Sql_qry_wtr_ansi.java @@ -211,7 +211,7 @@ public class Sql_qry_wtr_ansi implements Sql_qry_wtr { Append_db_obj_ary(sb, (Db_obj_ary_crt)crt); } else { - Criteria_fld leaf = Criteria_fld.as_(crt); if (leaf == null) throw Err_.new_invalid_op(crt.XtoStr()); + Criteria_fld leaf = Criteria_fld.as_(crt); if (leaf == null) throw Err_.new_invalid_op(crt.To_str()); sb.Add(leaf.Key()); Bld_where_crt(sb, leaf.Crt()); } diff --git a/140_dbs/src/gplx/dbs/sqls/Sql_qry_wtr_iosql_tst.java b/140_dbs/src/gplx/dbs/sqls/Sql_qry_wtr_iosql_tst.java index e9ce26e77..adcacc09f 100644 --- a/140_dbs/src/gplx/dbs/sqls/Sql_qry_wtr_iosql_tst.java +++ b/140_dbs/src/gplx/dbs/sqls/Sql_qry_wtr_iosql_tst.java @@ -55,6 +55,6 @@ public class Sql_qry_wtr_iosql_tst { String_bldr sb = String_bldr_.new_(); Sql_qry_wtr_ansi whereWtr = (Sql_qry_wtr_ansi)Sql_qry_wtr_.new_ansi(); whereWtr.Bld_where_val(sb, crt); - Tfds.Eq(expd, sb.XtoStr()); + Tfds.Eq(expd, sb.To_str()); } } diff --git a/140_dbs/src/gplx/dbs/sqls/Sql_qry_wtr_tst.java b/140_dbs/src/gplx/dbs/sqls/Sql_qry_wtr_tst.java index 01f14d357..675a4255e 100644 --- a/140_dbs/src/gplx/dbs/sqls/Sql_qry_wtr_tst.java +++ b/140_dbs/src/gplx/dbs/sqls/Sql_qry_wtr_tst.java @@ -50,11 +50,11 @@ class Sql_qry_wtr_fxt { String_bldr sb = String_bldr_.new_(); Db_arg arg = new Db_arg("not needed", val); sql_wtr.Bld_val(sb, arg); - Tfds.Eq(expd, sb.XtoStr()); + Tfds.Eq(expd, sb.To_str()); } public void Test_where(Criteria crt, String expd) { String_bldr sb = String_bldr_.new_(); sql_wtr.Bld_where_val(sb, crt); - Tfds.Eq(expd, sb.XtoStr()); + Tfds.Eq(expd, sb.To_str()); } } diff --git a/140_dbs/src/gplx/dbs/sqls/Sql_select_fld_list.java b/140_dbs/src/gplx/dbs/sqls/Sql_select_fld_list.java index 4774e2a59..abaadef79 100644 --- a/140_dbs/src/gplx/dbs/sqls/Sql_select_fld_list.java +++ b/140_dbs/src/gplx/dbs/sqls/Sql_select_fld_list.java @@ -28,8 +28,8 @@ public class Sql_select_fld_list { for (int i = 0; i < this.Count(); i++) { Sql_select_fld_base selectFld = this.Get_at(i); GfoFld fld = tbl.Flds().FetchOrNull(selectFld.Fld()); - if (fld == null) throw Err_.new_wo_type("fld not found in tbl", "fldName", selectFld.Fld(), "tblName", tbl.Name(), "tblFlds", tbl.Flds().XtoStr()); - if (rv.Has(selectFld.Alias())) throw Err_.new_wo_type("alias is not unique", "fldName", selectFld.Fld(), "flds", rv.XtoStr()); + if (fld == null) throw Err_.new_wo_type("fld not found in tbl", "fldName", selectFld.Fld(), "tblName", tbl.Name(), "tblFlds", tbl.Flds().To_str()); + if (rv.Has(selectFld.Alias())) throw Err_.new_wo_type("alias is not unique", "fldName", selectFld.Fld(), "flds", rv.To_str()); selectFld.GroupBy_type(fld); rv.Add(selectFld.Alias(), selectFld.ValType()); } @@ -44,13 +44,13 @@ public class Sql_select_fld_list { } return rv; } - public String XtoStr() { + public String To_str() { String_bldr sb = String_bldr_.new_(); for (int i = 0; i < this.Count(); i++) { Sql_select_fld_base fld = this.Get_at(i); sb.Add_fmt("{0},{1}|", fld.Fld(), fld.Alias()); } - return sb.XtoStr(); + return sb.To_str(); } Ordered_hash hash = Ordered_hash_.new_(); public static Sql_select_fld_list new_() {return new Sql_select_fld_list();} Sql_select_fld_list() {} diff --git a/140_dbs/src/gplx/stores/DbMaprRdr.java b/140_dbs/src/gplx/stores/DbMaprRdr.java index 4e486a1b2..acef30709 100644 --- a/140_dbs/src/gplx/stores/DbMaprRdr.java +++ b/140_dbs/src/gplx/stores/DbMaprRdr.java @@ -23,7 +23,7 @@ public class DbMaprRdr extends DataRdr_base implements SrlMgr { mgr = (DbMaprMgr)this.EnvVars().Get_by_or_fail(DbMaprWtr.Key_Mgr); DbMaprItm rootMapr = mgr.Root(); - GfoNde tbl = GetTbl(rootMapr, rootCrt); int subsCount = tbl.Subs().Count(); if (subsCount == 0) return null; if (subsCount > 1) throw Err_.new_wo_type("criteria returned > 1 row", "criteria", rootCrt.XtoStr(), "subsCount", subsCount); + GfoNde tbl = GetTbl(rootMapr, rootCrt); int subsCount = tbl.Subs().Count(); if (subsCount == 0) return null; if (subsCount > 1) throw Err_.new_wo_type("criteria returned > 1 row", "criteria", rootCrt.To_str(), "subsCount", subsCount); SrlObj root = subProto.SrlObj_New(null); mgr.EnvStack_add(rootMapr, root); RowStack_add(tbl, 0); root.SrlObj_Srl(this); diff --git a/140_dbs/src/gplx/stores/DbMaprWtr.java b/140_dbs/src/gplx/stores/DbMaprWtr.java index c083eb9b8..bdc5e8e61 100644 --- a/140_dbs/src/gplx/stores/DbMaprWtr.java +++ b/140_dbs/src/gplx/stores/DbMaprWtr.java @@ -81,7 +81,7 @@ public class DbMaprWtr extends DataWtr_base implements DataWtr { public void WriteLeafBgn(String leafName) {} public void WriteLeafEnd() {} public void Clear() {} - public String XtoStr() {return "";} + public String To_str() {return "";} @Override public SrlMgr SrlMgr_new(Object o) {return new DbMaprWtr();} DbMaprMgr mgr; Db_conn conn; String curTableName; Db_qry_insert insertCmd; public static DbMaprWtr new_by_url_(Db_conn_info url) { diff --git a/140_dbs/src/gplx/stores/Db_data_rdr.java b/140_dbs/src/gplx/stores/Db_data_rdr.java index 44d6b2239..bf0e0ca10 100644 --- a/140_dbs/src/gplx/stores/Db_data_rdr.java +++ b/140_dbs/src/gplx/stores/Db_data_rdr.java @@ -23,7 +23,7 @@ import java.sql.Timestamp; import java.util.GregorianCalendar; import gplx.dbs.*; public class Db_data_rdr extends DataRdr_base implements DataRdr { - @Override public String NameOfNode() {return commandText;} public String XtoStr() {return commandText;} private String commandText; + @Override public String NameOfNode() {return commandText;} public String To_str() {return commandText;} private String commandText; private ResultSet rdr; private int fieldCount; @Override public int FieldCount() {return fieldCount;} diff --git a/150_gfui/src_100_basic/gplx/gfui/GfuiBorderEdge.java b/150_gfui/src_100_basic/gplx/gfui/GfuiBorderEdge.java index 331246582..a6c6c46b6 100644 --- a/150_gfui/src_100_basic/gplx/gfui/GfuiBorderEdge.java +++ b/150_gfui/src_100_basic/gplx/gfui/GfuiBorderEdge.java @@ -30,7 +30,7 @@ public class GfuiBorderEdge { public static final GfuiBorderEdge All = new GfuiBorderEdge(15); } class GfuiBorderEdge_ { - public static String XtoStr(GfuiBorderEdge edge) { + public static String To_str(GfuiBorderEdge edge) { int val = edge.Val(); if (val == GfuiBorderEdge.Left.Val()) return Left_raw; else if (val == GfuiBorderEdge.Right.Val()) return Right_raw; diff --git a/150_gfui/src_100_basic/gplx/gfui/PointAdp.java b/150_gfui/src_100_basic/gplx/gfui/PointAdp.java index 33356c36e..a48d48c9a 100644 --- a/150_gfui/src_100_basic/gplx/gfui/PointAdp.java +++ b/150_gfui/src_100_basic/gplx/gfui/PointAdp.java @@ -16,7 +16,7 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.gfui; import gplx.*; -public class PointAdp implements XtoStrAble { +public class PointAdp implements To_str_able { public int X() {return x;} final int x; public int Y() {return y;} final int y; public PointAdp Op_add(PointAdp val) {return new PointAdp(x + val.x, y + val.y);} @@ -27,8 +27,8 @@ public class PointAdp implements XtoStrAble { PointAdp comp = PointAdp_.as_(compObj); if (comp == null) return false; return x == comp.x && y == comp.y; } - public String XtoStr() {return String_.Concat_any(x, ",", y);} - @Override public String toString() {return XtoStr();} + public String To_str() {return String_.Concat_any(x, ",", y);} + @Override public String toString() {return To_str();} @Override public boolean equals(Object obj) {return Eq(obj);} @Override public int hashCode() {return super.hashCode();} @gplx.Internal protected PointAdp(int x, int y) {this.x = x; this.y = y;} diff --git a/150_gfui/src_100_basic/gplx/gfui/SizeAdp.java b/150_gfui/src_100_basic/gplx/gfui/SizeAdp.java index 51f15ce3f..2d653167e 100644 --- a/150_gfui/src_100_basic/gplx/gfui/SizeAdp.java +++ b/150_gfui/src_100_basic/gplx/gfui/SizeAdp.java @@ -24,12 +24,12 @@ public class SizeAdp { @gplx.Internal protected SizeAdp Op_add(SizeAdp s) {return SizeAdp_.new_(width + s.width, height + s.height);} @gplx.Internal protected SizeAdp Op_subtract(int val) {return SizeAdp_.new_(width - val, height - val);} @gplx.Internal protected SizeAdp Op_subtract(int w, int h) {return SizeAdp_.new_(width - w, height - h);} - public String XtoStr() {return String_.Concat_any(width, ",", height);} + public String To_str() {return String_.Concat_any(width, ",", height);} public boolean Eq(Object o) { SizeAdp comp = (SizeAdp)o; if (comp == null) return false; return width == comp.width && height == comp.height; } - @Override public String toString() {return XtoStr();} + @Override public String toString() {return To_str();} @Override public boolean equals(Object obj) {return Eq(obj);} @Override public int hashCode() {return super.hashCode();} @gplx.Internal protected SizeAdp(int width, int height) {this.width = width; this.height = height;} diff --git a/150_gfui/src_110_draw_core/gplx/gfui/ColorAdp.java b/150_gfui/src_110_draw_core/gplx/gfui/ColorAdp.java index 5a13ae22e..e20ced5d8 100644 --- a/150_gfui/src_110_draw_core/gplx/gfui/ColorAdp.java +++ b/150_gfui/src_110_draw_core/gplx/gfui/ColorAdp.java @@ -26,11 +26,11 @@ public class ColorAdp { public String XtoHexStr() { String_bldr sb = String_bldr_.new_(); sb.Add("#"); - sb.Add(HexDecUtl.XtoStr(Alpha(), 2)); - sb.Add(HexDecUtl.XtoStr(Red(), 2)); - sb.Add(HexDecUtl.XtoStr(Green(), 2)); - sb.Add(HexDecUtl.XtoStr(Blue(), 2)); - return sb.XtoStr(); + sb.Add(HexDecUtl.To_str(Alpha(), 2)); + sb.Add(HexDecUtl.To_str(Red(), 2)); + sb.Add(HexDecUtl.To_str(Green(), 2)); + sb.Add(HexDecUtl.To_str(Blue(), 2)); + return sb.To_str(); } public boolean Eq(Object obj) { ColorAdp comp = ColorAdp_.as_(obj); if (comp == null) return false; diff --git a/150_gfui/src_110_draw_core/gplx/gfui/FontAdp.java b/150_gfui/src_110_draw_core/gplx/gfui/FontAdp.java index 386c18b32..6f09aff0a 100644 --- a/150_gfui/src_110_draw_core/gplx/gfui/FontAdp.java +++ b/150_gfui/src_110_draw_core/gplx/gfui/FontAdp.java @@ -52,7 +52,7 @@ public class FontAdp implements GfoInvkAble { } else return GfoInvkAble_.Rv_unhandled; } static final String Invk_name_ = "name_", Invk_size_ = "size_", Invk_style_ = "style_"; - @Override public String toString() {return String_bldr_.new_().Add_kv("name", name).Add_kv_obj("size", size).Add_kv_obj("style", style).XtoStr();} + @Override public String toString() {return String_bldr_.new_().Add_kv("name", name).Add_kv_obj("size", size).Add_kv_obj("style", style).To_str();} public static final FontAdp NullPtr = null; public static FontAdp as_(Object obj) {return obj instanceof FontAdp ? (FontAdp)obj : null;} diff --git a/150_gfui/src_110_draw_core/gplx/gfui/PenAdp.java b/150_gfui/src_110_draw_core/gplx/gfui/PenAdp.java index c318e7b11..317b9f037 100644 --- a/150_gfui/src_110_draw_core/gplx/gfui/PenAdp.java +++ b/150_gfui/src_110_draw_core/gplx/gfui/PenAdp.java @@ -31,7 +31,7 @@ public class PenAdp implements GfoInvkAble { else return GfoInvkAble_.Rv_unhandled; return this; } static final String Invk_Width_ = "Width_", Invk_Color_ = "Color_"; - @Override public String toString() {return String_bldr_.new_().Add_kv_obj("width", width).Add_kv("color", color.XtoHexStr()).XtoStr();} + @Override public String toString() {return String_bldr_.new_().Add_kv_obj("width", width).Add_kv("color", color.XtoHexStr()).To_str();} @Override public int hashCode() {return color.Value() ^ (int)width;} @Override public boolean equals(Object obj) { // cannot use Eq b/c of difficulty in comparing null instances PenAdp comp = PenAdp_.as_(obj); if (comp == null) return false; diff --git a/150_gfui/src_120_draw_objs/gplx/gfui/GfuiBorderMgr.java b/150_gfui/src_120_draw_objs/gplx/gfui/GfuiBorderMgr.java index c6adb3b56..ccc28afef 100644 --- a/150_gfui/src_120_draw_objs/gplx/gfui/GfuiBorderMgr.java +++ b/150_gfui/src_120_draw_objs/gplx/gfui/GfuiBorderMgr.java @@ -63,7 +63,7 @@ public class GfuiBorderMgr { all = null; } } - public String XtoStr() {return String_bldr_.new_().Add_kv_obj("all", all).Add_kv_obj("left", left).Add_kv_obj("right", right).Add_kv_obj("top", top).Add_kv_obj("bot", bot).XtoStr();} - @Override public String toString() {return XtoStr();} + public String To_str() {return String_bldr_.new_().Add_kv_obj("all", all).Add_kv_obj("left", left).Add_kv_obj("right", right).Add_kv_obj("top", top).Add_kv_obj("bot", bot).To_str();} + @Override public String toString() {return To_str();} public static GfuiBorderMgr new_() {return new GfuiBorderMgr();} GfuiBorderMgr() {} } diff --git a/150_gfui/src_200_ipt/gplx/gfui/IptArg.java b/150_gfui/src_200_ipt/gplx/gfui/IptArg.java index bdcd4f0e0..76ff9b0d2 100644 --- a/150_gfui/src_200_ipt/gplx/gfui/IptArg.java +++ b/150_gfui/src_200_ipt/gplx/gfui/IptArg.java @@ -32,7 +32,7 @@ class IptKeyChain implements IptArg { IptArg itm = ary[i]; sb.Add_spr_unless_first(itm.Key(), ",", i); } - key = sb.XtoStr(); + key = sb.To_str(); } public static IptKeyChain parse_(String raw) { String[] itms = String_.Split(raw, ","); diff --git a/150_gfui/src_200_ipt/gplx/gfui/IptBndMgr.java b/150_gfui/src_200_ipt/gplx/gfui/IptBndMgr.java index 41388b3e4..664944251 100644 --- a/150_gfui/src_200_ipt/gplx/gfui/IptBndMgr.java +++ b/150_gfui/src_200_ipt/gplx/gfui/IptBndMgr.java @@ -219,7 +219,7 @@ class IptBndListItm implements SrlAble { IptBnd bnd = (IptBnd)list.Get_at(i); try {bnd.Exec(evData);} catch (Exception exc) { - UsrDlg_._.Stop(UsrMsg.new_("Error while processing event").Add("bnd", SrlAble_.XtoStr(bnd)).Add("exc", Err_.Message_lang(exc))); + UsrDlg_._.Stop(UsrMsg.new_("Error while processing event").Add("bnd", SrlAble_.To_str(bnd)).Add("exc", Err_.Message_lang(exc))); return false; } if (evData.CancelIteration) break; diff --git a/150_gfui/src_200_ipt/gplx/gfui/IptBndMgr_tst.java b/150_gfui/src_200_ipt/gplx/gfui/IptBndMgr_tst.java index cc8562a8d..9fd061d60 100644 --- a/150_gfui/src_200_ipt/gplx/gfui/IptBndMgr_tst.java +++ b/150_gfui/src_200_ipt/gplx/gfui/IptBndMgr_tst.java @@ -53,7 +53,7 @@ public class IptBndMgr_tst { IptEventData evData = IptEventData.new_(null, IptArg_.EventType_default(arg), arg, null, null); under.Process(evData); } - Tfds.Eq(expd, output.XtoStr()); + Tfds.Eq(expd, output.To_str()); return this; } String_bldr output = String_bldr_.new_(); diff --git a/150_gfui/src_200_ipt/gplx/gfui/IptBnd_.java b/150_gfui/src_200_ipt/gplx/gfui/IptBnd_.java index 2b30ac8a9..c72a33302 100644 --- a/150_gfui/src_200_ipt/gplx/gfui/IptBnd_.java +++ b/150_gfui/src_200_ipt/gplx/gfui/IptBnd_.java @@ -38,7 +38,7 @@ public class IptBnd_ { String_bldr sb = String_bldr_.new_(); for (int i = 0; i < ary.Count(); i++) sb.Add_spr_unless_first(((IptArg)ary.Get_at(i)).Key(), "|", i); - return sb.XtoStr(); + return sb.To_str(); } } class IptBnd_invk implements IptBnd { diff --git a/150_gfui/src_200_ipt/gplx/gfui/IptKey.java b/150_gfui/src_200_ipt/gplx/gfui/IptKey.java index a5fd45790..f82fda0ba 100644 --- a/150_gfui/src_200_ipt/gplx/gfui/IptKey.java +++ b/150_gfui/src_200_ipt/gplx/gfui/IptKey.java @@ -21,7 +21,7 @@ public class IptKey implements IptArg { public String Key() {return key;} private final String key; public int Val() {return val;} private final int val; public boolean Eq(IptArg comp) {return String_.Eq(key, comp.Key());} - public String XtoUiStr() {return IptKeyStrMgr._.XtoStr(this);} + public String XtoUiStr() {return IptKeyStrMgr._.To_str(this);} public IptKey Add(IptKey comp) {return IptKey_.add_(this, comp);} public boolean Mod_shift() {return Enm_.HasInt(val, IptKey_.Shift.Val());} public boolean Mod_ctrl() {return Enm_.HasInt(val, IptKey_.Ctrl.Val());} diff --git a/150_gfui/src_200_ipt/gplx/gfui/IptKeyStrMgr.java b/150_gfui/src_200_ipt/gplx/gfui/IptKeyStrMgr.java index 1280552f7..960c08884 100644 --- a/150_gfui/src_200_ipt/gplx/gfui/IptKeyStrMgr.java +++ b/150_gfui/src_200_ipt/gplx/gfui/IptKeyStrMgr.java @@ -22,7 +22,7 @@ class IptKeyStrMgr { IptKey rv = charKeys[charVal]; return (rv == null) ? IptKey_.None : rv; } - public String XtoStr(IptKey key) { + public String To_str(IptKey key) { if (literals == null) Init(); Object rv = literals.Get_by(key.Val()); return rv == null ? String_.Empty : (String)rv; @@ -62,7 +62,7 @@ class IptKeyStrMgr { Reg(lowerKey, lowerChr); Reg(upperKey, upperChr); } - void Reg(IptKey k, char c) {Reg(k, Char_.XtoStr(c), (int)c);} + void Reg(IptKey k, char c) {Reg(k, Char_.To_str(c), (int)c);} void Reg(IptKey k, String s, int charVal) { int v = k.Val(); literals.Add(v, s); diff --git a/150_gfui/src_300_gxw/gplx/gfui/GxwTextHtml_lang.java b/150_gfui/src_300_gxw/gplx/gfui/GxwTextHtml_lang.java index 488b249b5..271c10840 100644 --- a/150_gfui/src_300_gxw/gplx/gfui/GxwTextHtml_lang.java +++ b/150_gfui/src_300_gxw/gplx/gfui/GxwTextHtml_lang.java @@ -167,7 +167,7 @@ class GxwTextHtml_editor extends JEditorPane implements GxwTextHtml { KeyVal atr = atrs[i]; sb.Add(atr.Key() + "=").Add(atr.Val_to_str_or_null()).Add_char_crlf(); } - return sb.XtoStr(); + return sb.To_str(); } Element Html_sel_elm() { HTMLDocument doc = (HTMLDocument)this.getDocument(); diff --git a/150_gfui/src_400_win/gplx/gfui/GfoConsoleWin.java b/150_gfui/src_400_win/gplx/gfui/GfoConsoleWin.java index d57a60169..fd6aaadb9 100644 --- a/150_gfui/src_400_win/gplx/gfui/GfoConsoleWin.java +++ b/150_gfui/src_400_win/gplx/gfui/GfoConsoleWin.java @@ -64,10 +64,10 @@ public class GfoConsoleWin implements GfoInvkAble, UsrMsgWkr { } public void ExecUsrMsg(int type, UsrMsg umsg) { if (win == null) this.Init(); - String s = umsg.XtoStr(); + String s = umsg.To_str(); if (type == UsrMsgWkr_.Type_Warn) { if (!win.Pin()) win.Pin_(); - s = "!!warn!! " + umsg.XtoStr(); + s = "!!warn!! " + umsg.To_str(); if (logger == null) return; logger.Write(s); } diff --git a/150_gfui/src_400_win/gplx/gfui/GfuiWinKeyCmdMgr.java b/150_gfui/src_400_win/gplx/gfui/GfuiWinKeyCmdMgr.java index e6afe9c20..f963d0f0b 100644 --- a/150_gfui/src_400_win/gplx/gfui/GfuiWinKeyCmdMgr.java +++ b/150_gfui/src_400_win/gplx/gfui/GfuiWinKeyCmdMgr.java @@ -56,6 +56,6 @@ class GfuiWinKeyCmdMgr implements GfuiWinOpenAble, GfoInvkAble, GfoEvObj { } public static IptKey ExtractKeyFromText(String raw) { int pos = ExtractPosFromText(raw); if (pos == String_.Find_none) return IptKey_.None; - return IptKey_.parse_("key." + String_.Lower(Char_.XtoStr(String_.CharAt(raw, pos + 1)))); // pos=& pos; + 1 to get next letter + return IptKey_.parse_("key." + String_.Lower(Char_.To_str(String_.CharAt(raw, pos + 1)))); // pos=& pos; + 1 to get next letter } } diff --git a/150_gfui/src_410_box_core/gplx/gfui/GfuiElemBase.java b/150_gfui/src_410_box_core/gplx/gfui/GfuiElemBase.java index d4e9f94ac..b9b9cf10c 100644 --- a/150_gfui/src_410_box_core/gplx/gfui/GfuiElemBase.java +++ b/150_gfui/src_410_box_core/gplx/gfui/GfuiElemBase.java @@ -241,7 +241,7 @@ public class GfuiElemBase implements GfuiElem { GfuiElem subE = (GfuiElem)this.SubElems().Get_at(i); sb.Add_str_w_crlf(subE.Key_of_GfuiElem()); } - return sb.XtoStr(); + return sb.To_str(); } else { Object rv = this.InvkMgr().Invk(ctx, ikey, k, m, this); diff --git a/150_gfui/src_430_box_custom/gplx/gfui/GfuiBnd_box_status.java b/150_gfui/src_430_box_custom/gplx/gfui/GfuiBnd_box_status.java index d78040ebf..e0ba77fb1 100644 --- a/150_gfui/src_430_box_custom/gplx/gfui/GfuiBnd_box_status.java +++ b/150_gfui/src_430_box_custom/gplx/gfui/GfuiBnd_box_status.java @@ -19,7 +19,7 @@ package gplx.gfui; import gplx.*; public class GfuiBnd_box_status implements GfoInvkAble, UsrMsgWkr { public GfuiElem Box() {return box;} GfuiElem box; public void ExecUsrMsg(int type, UsrMsg umsg) { - box.Invoke(GfoInvkAbleCmd.arg_(this, WriteText_cmd, umsg.XtoStr())); + box.Invoke(GfoInvkAbleCmd.arg_(this, WriteText_cmd, umsg.To_str())); } public void WriteText(String text) { GfuiElem lastFocus = GfuiFocusMgr._.FocusedElem(); // HACK:WINFORMS:.Visible=true will automatically transfer focus to textBox; force Focus back to original diff --git a/150_gfui/src_430_box_custom/gplx/gfui/GfuiStatusBox.java b/150_gfui/src_430_box_custom/gplx/gfui/GfuiStatusBox.java index df77c85d7..0fddf1fba 100644 --- a/150_gfui/src_430_box_custom/gplx/gfui/GfuiStatusBox.java +++ b/150_gfui/src_430_box_custom/gplx/gfui/GfuiStatusBox.java @@ -29,7 +29,7 @@ public class GfuiStatusBox extends GfuiTextBox implements UsrMsgWkr { public Gf ) return; this.CreateControlIfNeeded(); // WORKAROUND.WINFORMS: else will sometimes throw: Cannot call Invoke or InvokeAsync on a control until the window handle has been created this.VisibilityDuration_(umsg.VisibilityDuration()); - String text = String_.Replace(umsg.XtoStr(), Op_sys.Cur().Nl_str(), " "); // replace NewLine with " " since TextBox cannot show NewLine + String text = String_.Replace(umsg.To_str(), Op_sys.Cur().Nl_str(), " "); // replace NewLine with " " since TextBox cannot show NewLine Invoke(GfoInvkAbleCmd.arg_(this, Invk_WriteText, text)); } public void WriteText(String text) { diff --git a/150_gfui/src_600_adp/gplx/gfui/ClipboardAdp_.java b/150_gfui/src_600_adp/gplx/gfui/ClipboardAdp_.java index a878d5226..75b8a3889 100644 --- a/150_gfui/src_600_adp/gplx/gfui/ClipboardAdp_.java +++ b/150_gfui/src_600_adp/gplx/gfui/ClipboardAdp_.java @@ -51,7 +51,7 @@ public class ClipboardAdp_ { } remake.Add(c); } - rv = remake.XtoStr(); + rv = remake.To_str(); // rv = String_.Replace(rv, "\n", Env_.NewLine); } return rv; diff --git a/150_gfui/src_600_adp/gplx/gfui/ImageAdp.java b/150_gfui/src_600_adp/gplx/gfui/ImageAdp.java index f4e9fa925..c761e3860 100644 --- a/150_gfui/src_600_adp/gplx/gfui/ImageAdp.java +++ b/150_gfui/src_600_adp/gplx/gfui/ImageAdp.java @@ -42,7 +42,7 @@ class ImageAdp_txt implements ImageAdp { public void Rls() {disposed = true;} public void SaveAsBmp(Io_url url) {SaveAs(url, ".bmp");} public void SaveAsPng(Io_url url) {SaveAs(url, ".png");} - void SaveAs(Io_url url, String ext) {Io_mgr.I.SaveFilStr(url.GenNewExt(ext), size.XtoStr());} + void SaveAs(Io_url url, String ext) {Io_mgr.I.SaveFilStr(url.GenNewExt(ext), size.To_str());} public ImageAdp Extract_image(RectAdp src_rect, SizeAdp trg_size) {return Extract_image(src_rect.X(), src_rect.Y(), src_rect.Width(), src_rect.Height(), trg_size.Width(), trg_size.Height());} public ImageAdp Extract_image(int src_x, int src_y, int src_w, int src_h, int trg_w, int trg_h) {return ImageAdp_.txt_mem_(Io_url_.Empty, SizeAdp_.new_(trg_w, trg_h));} public ImageAdp Resize(int width, int height) {return ImageAdp_.txt_mem_(Io_url_.Empty, SizeAdp_.new_(width, height));} diff --git a/150_gfui/src_700_env/gplx/gfui/GfuiEnv_.java b/150_gfui/src_700_env/gplx/gfui/GfuiEnv_.java index 28308ba8f..a14517586 100644 --- a/150_gfui/src_700_env/gplx/gfui/GfuiEnv_.java +++ b/150_gfui/src_700_env/gplx/gfui/GfuiEnv_.java @@ -97,7 +97,7 @@ public class GfuiEnv_ { public static final String Err_GfuiException = "gplx.dbs.GfuiException"; // TODO: used in JAVA. move } class GfuiInterruptLnr implements UsrMsgWkr { - public void ExecUsrMsg(int type, UsrMsg umsg) {GfuiEnv_.ShowMsg(umsg.XtoStr());} + public void ExecUsrMsg(int type, UsrMsg umsg) {GfuiEnv_.ShowMsg(umsg.To_str());} public static GfuiInterruptLnr new_() {return new GfuiInterruptLnr();} GfuiInterruptLnr() {} } class GfuiFormRunner implements Runnable { 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 564349ca0..be79d5bab 100644 --- a/150_gfui/src_700_env/gplx/gfui/Swt_kit.java +++ b/150_gfui/src_700_env/gplx/gfui/Swt_kit.java @@ -334,7 +334,7 @@ class Swt_msg_wkr_stop implements UsrMsgWkr { private final Swt_kit kit; private final Gfo_usr_dlg gui_wtr; public Swt_msg_wkr_stop(Swt_kit kit, Gfo_usr_dlg gui_wtr) {this.kit = kit; this.gui_wtr = gui_wtr;} public void ExecUsrMsg(int type, UsrMsg umsg) { - String msg = umsg.XtoStr(); + String msg = umsg.To_str(); kit.Ask_ok("xowa.gui", "stop", msg); gui_wtr.Log_many("", "", msg); } diff --git a/150_gfui/tst/gplx/gfui/GfxItm_base.java b/150_gfui/tst/gplx/gfui/GfxItm_base.java index 45d28d27b..42ba0a61e 100644 --- a/150_gfui/tst/gplx/gfui/GfxItm_base.java +++ b/150_gfui/tst/gplx/gfui/GfxItm_base.java @@ -20,7 +20,7 @@ import gplx.core.strings.*; public abstract class GfxItm_base implements GfxItm { public PointAdp Pos() {return pos;} PointAdp pos = PointAdp_.Zero; public SizeAdp Size() {return size;} SizeAdp size = SizeAdp_.Zero; - @Override public String toString() {return String_bldr_.new_().Add_kv_obj("pos", pos).Add_kv_obj("size", size).XtoStr();} + @Override public String toString() {return String_bldr_.new_().Add_kv_obj("pos", pos).Add_kv_obj("size", size).To_str();} @Override public int hashCode() {return this.toString().hashCode();} @Override public boolean equals(Object obj) { GfxItm_base comp = GfxItm_base.as_(obj); if (comp == null) return false; diff --git a/150_gfui/tst/gplx/gfui/GfxLineItm.java b/150_gfui/tst/gplx/gfui/GfxLineItm.java index e6d4d444e..c9b68f5c9 100644 --- a/150_gfui/tst/gplx/gfui/GfxLineItm.java +++ b/150_gfui/tst/gplx/gfui/GfxLineItm.java @@ -23,7 +23,7 @@ public class GfxLineItm implements GfxItm { public float Width() {return width;} float width; public ColorAdp Color() {return color;} ColorAdp color; - @Override public String toString() {return String_bldr_.new_().Add_kv_obj("src", src).Add_kv_obj("trg", trg).Add_kv_obj("width", width).Add_kv_obj("color", color.XtoHexStr()).XtoStr();} + @Override public String toString() {return String_bldr_.new_().Add_kv_obj("src", src).Add_kv_obj("trg", trg).Add_kv_obj("width", width).Add_kv_obj("color", color.XtoHexStr()).To_str();} @Override public int hashCode() {return this.toString().hashCode();} @Override public boolean equals(Object obj) { GfxLineItm comp = GfxLineItm.as_(obj); if (comp == null) return false; diff --git a/150_gfui/tst/gplx/gfui/GfxRectItm.java b/150_gfui/tst/gplx/gfui/GfxRectItm.java index 70824f323..3d679463d 100644 --- a/150_gfui/tst/gplx/gfui/GfxRectItm.java +++ b/150_gfui/tst/gplx/gfui/GfxRectItm.java @@ -21,7 +21,7 @@ public class GfxRectItm extends GfxItm_base { public float Width() {return width;} float width; public ColorAdp Color() {return color;} ColorAdp color; - @Override public String toString() {return String_.Concat(super.toString(), String_bldr_.new_().Add_kv_obj("width", width).Add_kv("color", color.XtoHexStr()).XtoStr());} + @Override public String toString() {return String_.Concat(super.toString(), String_bldr_.new_().Add_kv_obj("width", width).Add_kv("color", color.XtoHexStr()).To_str());} @Override public int hashCode() {return this.toString().hashCode();} @Override public boolean equals(Object obj) { GfxRectItm comp = GfxRectItm.as_(obj); if (comp == null) return false; diff --git a/400_xowa/src/gplx/core/json/Json_itm_.java b/400_xowa/src/gplx/core/json/Json_itm_.java index 42942f96d..0fed5ee1f 100644 --- a/400_xowa/src/gplx/core/json/Json_itm_.java +++ b/400_xowa/src/gplx/core/json/Json_itm_.java @@ -21,4 +21,9 @@ public class Json_itm_ { public static final byte Tid_unknown = 0, Tid_null = 1, Tid_bool = 2, Tid_int = 3, Tid_decimal = 4, Tid_string = 5, Tid_kv = 6, Tid_array = 7, Tid_nde = 8; public static final byte[][] Names = Bry_.Ary("unknown", "null", "boolean", "int", "decimal", "string", "keyval", "array", "nde"); public static final byte[] Const_true = Bry_.new_a7("true"), Const_false = Bry_.new_a7("false"), Const_null = Bry_.new_a7("null"); + public static byte[] To_bry(Bry_bfr bfr, Json_itm itm) { + if (itm == null) return Bry_.Empty; + itm.Print_as_json(bfr, 0); + return bfr.Xto_bry_and_clear(); + } } diff --git a/400_xowa/src/gplx/core/json/Json_kv.java b/400_xowa/src/gplx/core/json/Json_kv.java index 40c6644a7..437fd3902 100644 --- a/400_xowa/src/gplx/core/json/Json_kv.java +++ b/400_xowa/src/gplx/core/json/Json_kv.java @@ -21,6 +21,8 @@ public class Json_kv extends Json_itm_base { @Override public byte Tid() {return Json_itm_.Tid_kv;} public Json_itm Key() {return key;} Json_itm key; public Json_itm Val() {return val;} Json_itm val; + public Json_nde Val_as_nde() {return Json_nde.cast_(val);} + public Json_ary Val_as_ary() {return Json_ary.cast(val);} public byte[] Key_as_bry() {return key.Data_bry();} public String Key_as_str() {return (String)key.Data();} public byte[] Val_as_bry() {return val.Data_bry();} diff --git a/400_xowa/src/gplx/core/json/Json_nde.java b/400_xowa/src/gplx/core/json/Json_nde.java index 91574f372..23b84aea6 100644 --- a/400_xowa/src/gplx/core/json/Json_nde.java +++ b/400_xowa/src/gplx/core/json/Json_nde.java @@ -31,6 +31,7 @@ public class Json_nde extends Json_itm_base implements Json_grp { return rv; } public Json_itm Get_at(int i) {return subs[i];} + public Json_kv Get_kv(byte[] key) {return Json_kv.cast_(Get_itm(key));} public Json_nde Get(String key) {return Get(Bry_.new_u8(key));} public Json_nde Get(byte[] key) { Json_kv kv = Json_kv.cast_(this.Get_itm(key)); if (kv == null) throw Err_.new_("json", "kv not found", "key", key); @@ -48,6 +49,7 @@ public class Json_nde extends Json_itm_base implements Json_grp { } return null; } + public boolean Has(byte[] key) {return Get_bry(key, null) != null;} public byte[] Get_bry(byte[] key) { byte[] rv = Get_bry(key, null); if (rv == null) throw Err_.new_("json", "key missing", "key", key); return rv; @@ -60,8 +62,7 @@ public class Json_nde extends Json_itm_base implements Json_grp { if (kv_obj.Tid() != Json_itm_.Tid_kv) return or; // key is not a key_val Json_kv kv = (Json_kv)kv_obj; Json_itm val = kv.Val(); - if (val == null) return or; - return val.Data_bry(); + return (val == null) ? or : val.Data_bry(); } public Json_nde Add_many(Json_itm... ary) { int len = ary.length; diff --git a/400_xowa/src/gplx/core/json/Json_parser.java b/400_xowa/src/gplx/core/json/Json_parser.java index e3cc59c71..007962457 100644 --- a/400_xowa/src/gplx/core/json/Json_parser.java +++ b/400_xowa/src/gplx/core/json/Json_parser.java @@ -71,7 +71,7 @@ public class Json_parser { case Byte_ascii.Brack_bgn: return Make_ary(doc); case Byte_ascii.Curly_bgn: return Make_nde(doc); } - throw Err_.new_unhandled(Char_.XtoStr(b)); + throw Err_.new_unhandled(Char_.To_str(b)); } throw Err_.new_wo_type("eos reached in val"); } @@ -157,7 +157,7 @@ public class Json_parser { if (src[pos] == expd) ++pos; else - throw err_(src, pos, "expected '{0}' but got '{1}'", Char_.XtoStr(expd), Char_.XtoStr(src[pos])); + throw err_(src, pos, "expected '{0}' but got '{1}'", Char_.To_str(expd), Char_.To_str(src[pos])); } Err err_(byte[] src, int bgn, String fmt, Object... args) {return err_(src, bgn, src.length, fmt, args);} Err err_(byte[] src, int bgn, int src_len, String fmt, Object... args) { diff --git a/400_xowa/src/gplx/core/logs/Gfo_log_fil.java b/400_xowa/src/gplx/core/logs/Gfo_log_fil.java new file mode 100644 index 000000000..137438352 --- /dev/null +++ b/400_xowa/src/gplx/core/logs/Gfo_log_fil.java @@ -0,0 +1,55 @@ +/* +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.core.logs; import gplx.*; import gplx.core.*; +public class Gfo_log_fil { + private final Bry_bfr fil_bfr = Bry_bfr.new_(), msg_bfr = Bry_bfr.new_(); + private final String key; + private final Io_url dir; + private final long size_max; + private int file_idx; + private Io_url fil_cur; + private final Gfo_log_fmtr fmtr = new Gfo_log_fmtr(); + private final Gfo_log_fil session; + public Gfo_log_fil(Gfo_log_fil session, String key, Io_url dir, long size_max) { + this.session = session; + this.key = key; + this.dir = dir; + this.size_max = size_max; + this.fil_cur = Fil_new(); + } + public void Add(String msg, Object... vals) { + fmtr.Add(msg_bfr, msg, vals); + Add_by_bfr(msg_bfr); + msg_bfr.Clear(); + } + public void Add_by_bfr(Bry_bfr msg_bfr) { + if (msg_bfr.Len() + fil_bfr.Len() > size_max) { + this.Flush(); + fil_cur = Fil_new(); + } + fil_bfr.Add_bfr_and_preserve(msg_bfr); + if (session != null) session.Add_by_bfr(msg_bfr); + } + public void Flush() { + Io_mgr.I.AppendFilBfr(fil_cur, fil_bfr); + } + private Io_url Fil_new() { + String part = size_max == -1 ? "" : "-" + Int_.Xto_str(++file_idx); + return dir.OwnerDir().GenSubFil_ary(key, part, ".log"); + } +} diff --git a/400_xowa/src/gplx/core/logs/Gfo_log_fmtr.java b/400_xowa/src/gplx/core/logs/Gfo_log_fmtr.java new file mode 100644 index 000000000..b3696ab05 --- /dev/null +++ b/400_xowa/src/gplx/core/logs/Gfo_log_fmtr.java @@ -0,0 +1,58 @@ +/* +XOWA: the XOWA Offline Wiki Application +Copyright (C) 2012 gnosygnu@gmail.com + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as +published by the Free Software Foundation, either version 3 of the +License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . +*/ +package gplx.core.logs; import gplx.*; import gplx.core.*; +import gplx.core.btries.*; +class Gfo_log_fmtr { + private final Btrie_fast_mgr trie = Btrie_fast_mgr.cs() + .Add("~|" , Bry_.new_a7("~|<")) + .Add("|" , Bry_.new_a7("~||")) + .Add("\n" , Bry_.new_a7("~|n")) + .Add("\t" , Bry_.new_a7("~|t")) + ; + public void Add(Bry_bfr bfr, String msg, Object... vals) { + Add_bry(bfr, Bry_.new_u8(msg)); + int len = vals.length; + for (int i = 0; i < len; ++i) { + bfr.Add_byte(Byte_ascii.Pipe); + byte[] val_bry = Bry_.new_u8(Object_.Xto_str_strict_or_empty(vals[i])); + Add_bry(bfr, val_bry); + } + bfr.Add_byte_nl(); + } + private void Add_bry(Bry_bfr bfr, byte[] src) { + if (src == null) return; + int len = src.length; if (len == 0) return; + int pos = 0; + int add_bgn = -1; + while (true) { + if (pos == len) break; + byte b = src[pos]; + Object o = trie.Match_bgn_w_byte(b, src, pos, len); + if (o == null) { + if (add_bgn == -1) add_bgn = pos; + } + else { + if (add_bgn != -1) bfr.Add_mid(src, add_bgn, pos); + byte[] repl = (byte[])o; + bfr.Add(repl); + pos = trie.Match_pos(); + } + } + if (add_bgn != -1) bfr.Add_mid(src, add_bgn, len); + } +} diff --git a/400_xowa/src/gplx/core/logs/Gfo_log_mgr.java b/400_xowa/src/gplx/core/logs/Gfo_log_mgr.java new file mode 100644 index 000000000..ce1ea27a5 --- /dev/null +++ b/400_xowa/src/gplx/core/logs/Gfo_log_mgr.java @@ -0,0 +1,55 @@ +/* +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.core.logs; import gplx.*; import gplx.core.*; +public class Gfo_log_mgr { + private final Ordered_hash fil_list = Ordered_hash_.new_(); + private final Gfo_log_fil session_fil; + private final Io_url dir; + private final long size_dflt = Io_mgr.Len_mb * 2; + public Gfo_log_mgr(Io_url dir) { + this.dir = dir; + this.session_fil = new Gfo_log_fil(null, "session", dir, -1); + } + public Gfo_log_fil Fils__get_or_new(String key) { + Gfo_log_fil rv = (Gfo_log_fil)fil_list.Get_by(key); + if (rv == null) { + rv = new Gfo_log_fil(session_fil, key, dir, size_dflt); + fil_list.Add(key, rv); + } + return rv; + } + public void Msgs__add(String fil_key, String msg, Object... vals) { + Gfo_log_fil fil = (Gfo_log_fil)Fils__get_or_new(fil_key); + fil.Add(msg, vals); + } +} +// class Some_log_cls { +// private final Gfo_log_mgr log_mgr = new Gfo_log_mgr(); +// public void Init() { +// } +// private Gfo_log_fil dedicated; +// public void Init_dedicated() { +// dedicated = log_mgr.Fil_get_or_new("parse"); +// } +// public void Proc_w_dedicate() { +// dedicated.Add("file download failed", "url", "msg"); +// } +// public void Proc_dynamic() { +// log_mgr.Msg_add("parse", "file download failed", "url", "msg"); +// } +// } diff --git a/400_xowa/src/gplx/core/net/Http_request_parser.java b/400_xowa/src/gplx/core/net/Http_request_parser.java index 9da1034a3..92469e858 100644 --- a/400_xowa/src/gplx/core/net/Http_request_parser.java +++ b/400_xowa/src/gplx/core/net/Http_request_parser.java @@ -57,7 +57,7 @@ public class Http_request_parser { if (Bry_.Has_at_end(line, Tkn_content_type_boundary_end)) break; // last form_data pair will end with "--"; stop line = Parse_content_type_boundary(rdr); } - break; // assume form_data ends POST request + break; // assume form_data sends POST request } Object o = trie.Match_bgn(line, 0, line_len); if (o == null) { @@ -101,7 +101,8 @@ public class Http_request_parser { this.protocol = Bry_.Mid(line, url_end + 1, line_len); } private void Parse_content_type(int val_bgn, byte[] line, int line_len) { // EX: Content-Type: multipart/form-data; boundary=---------------------------72432484930026 - int boundary_bgn = Bry_finder.Find_fwd(line, Tkn_boundary, val_bgn, line_len); if (boundary_bgn == Bry_finder.Not_found) throw Err_.new_wo_type("invalid content_type", "line", line, "request", To_str()); + // handle wolfram and other clients; DATE:2015-08-03 + int boundary_bgn = Bry_finder.Find_fwd(line, Tkn_boundary, val_bgn, line_len); if (boundary_bgn == Bry_finder.Not_found) return; // PURPOSE: ignore content-type for GET calls like by Mathematica server; DATE:2015-08-04 // throw Err_.new_wo_type("invalid content_type", "line", line, "request", To_str()); int content_type_end = Bry_finder.Find_bwd(line, Byte_ascii.Semic, boundary_bgn); this.content_type = Bry_.Mid(line, val_bgn, content_type_end); this.content_type_boundary = Bry_.Add(Tkn_content_type_boundary_end, Bry_.Mid(line, boundary_bgn += Tkn_boundary.length, line_len)); diff --git a/400_xowa/src/gplx/core/net/Http_request_parser_tst.java b/400_xowa/src/gplx/core/net/Http_request_parser_tst.java index 02e151f0f..e9657c0b8 100644 --- a/400_xowa/src/gplx/core/net/Http_request_parser_tst.java +++ b/400_xowa/src/gplx/core/net/Http_request_parser_tst.java @@ -25,6 +25,9 @@ public class Http_request_parser_tst { @Test public void Type_content_type() { fxt.Test_content_type("Content-Type: multipart/form-data; boundary=---------------------------72432484930026", "multipart/form-data", "-----------------------------72432484930026"); } + @Test public void Type_content_type__x_www_form_url_encoded() { // PURPOSE: ignore content-type for GET calls like by Mathematica server; DATE:2015-08-04 + fxt.Test_content_type("Content-Type: application/x-www-form-urlencoded", null, null); + } @Test public void Type_form_data() { fxt.Test_form_data(String_.Ary ( "POST /url HTTP/1.1" diff --git a/400_xowa/src/gplx/dbs/cfgs/Db_cfg_itm.java b/400_xowa/src/gplx/dbs/cfgs/Db_cfg_itm.java index 6c0d7ae47..ac5fa509d 100644 --- a/400_xowa/src/gplx/dbs/cfgs/Db_cfg_itm.java +++ b/400_xowa/src/gplx/dbs/cfgs/Db_cfg_itm.java @@ -52,8 +52,8 @@ public class Db_cfg_itm { public static Db_cfg_itm new_yn (String grp, String key, boolean val) {return new Db_cfg_itm(grp , key, Yn.Xto_str(val));} public static Db_cfg_itm new_DateAdp (String key, DateAdp val) {return new Db_cfg_itm(Grp_none , key, val.XtoStr_fmt_yyyyMMdd_HHmmss());} public static Db_cfg_itm new_DateAdp (String grp, String key, DateAdp val) {return new Db_cfg_itm(grp , key, val.XtoStr_fmt_yyyyMMdd_HHmmss());} - public static Db_cfg_itm new_guid (String key, Guid_adp val) {return new Db_cfg_itm(Grp_none , key, val.XtoStr());} - public static Db_cfg_itm new_guid (String grp, String key, Guid_adp val) {return new Db_cfg_itm(grp , key, val.XtoStr());} + public static Db_cfg_itm new_guid (String key, Guid_adp val) {return new Db_cfg_itm(Grp_none , key, val.To_str());} + public static Db_cfg_itm new_guid (String grp, String key, Guid_adp val) {return new Db_cfg_itm(grp , key, val.To_str());} public static final Db_cfg_itm Empty = new Db_cfg_itm("empty", "empty", null); } diff --git a/400_xowa/src/gplx/dbs/cfgs/Db_cfg_tbl.java b/400_xowa/src/gplx/dbs/cfgs/Db_cfg_tbl.java index 8fb53b984..d604b2faa 100644 --- a/400_xowa/src/gplx/dbs/cfgs/Db_cfg_tbl.java +++ b/400_xowa/src/gplx/dbs/cfgs/Db_cfg_tbl.java @@ -43,7 +43,7 @@ public class Db_cfg_tbl implements RlsAble { public void Insert_int (String grp, String key, int val) {Insert_str(grp, key, Int_.Xto_str(val));} public void Insert_long (String grp, String key, long val) {Insert_str(grp, key, Long_.Xto_str(val));} public void Insert_date (String grp, String key, DateAdp val) {Insert_str(grp, key, val.XtoStr_fmt_yyyyMMdd_HHmmss());} - public void Insert_guid (String grp, String key, Guid_adp val) {Insert_str(grp, key, val.XtoStr());} + public void Insert_guid (String grp, String key, Guid_adp val) {Insert_str(grp, key, val.To_str());} public void Insert_bry (String grp, String key, byte[] val) {Insert_str(grp, key, String_.new_u8(val));} public void Insert_str (String grp, String key, String val) { if (stmt_insert == null) stmt_insert = conn.Stmt_insert(tbl_name, flds); @@ -56,7 +56,7 @@ public class Db_cfg_tbl implements RlsAble { public void Update_int (String grp, String key, int val) {Update_str(grp, key, Int_.Xto_str(val));} public void Update_long (String grp, String key, long val) {Update_str(grp, key, Long_.Xto_str(val));} public void Update_date (String grp, String key, DateAdp val) {Update_str(grp, key, val.XtoStr_fmt_yyyyMMdd_HHmmss());} - public void Update_guid (String grp, String key, Guid_adp val) {Update_str(grp, key, val.XtoStr());} + public void Update_guid (String grp, String key, Guid_adp val) {Update_str(grp, key, val.To_str());} public void Update_bry (String grp, String key, byte[] val) {Update_str(grp, key, String_.new_u8(val));} public void Update_str (String grp, String key, String val) { if (stmt_update == null) stmt_update = conn.Stmt_update_exclude(tbl_name, flds, fld_grp, fld_key); diff --git a/400_xowa/src/gplx/fsdb/Fsdb_db_mgr_.java b/400_xowa/src/gplx/fsdb/Fsdb_db_mgr_.java index 24944af6a..5e13f3265 100644 --- a/400_xowa/src/gplx/fsdb/Fsdb_db_mgr_.java +++ b/400_xowa/src/gplx/fsdb/Fsdb_db_mgr_.java @@ -44,6 +44,8 @@ public class Fsdb_db_mgr_ { if (!Db_conn_bldr.I.Exists(main_core_url)) return null; usr_dlg.Log_many("", "", "fsdb.db_core.v2: type=~{0} url=~{1}", layout.Name(), main_core_url.Raw()); Db_conn main_core_conn = Db_conn_bldr.I.Get(main_core_url); + if (wiki.Data__core_mgr().Props().Layout_file().Tid_is_all()) + return new Fsdb_db_mgr__v2(Fsdb_db_mgr__v2.Cfg__layout_file__get(main_core_conn), wiki_dir, new Fsdb_db_file(main_core_url, main_core_conn), new Fsdb_db_file(main_core_url, main_core_conn)); Io_url user_core_url = wiki_dir.GenSubFil(Fsdb_db_mgr__v2_bldr.Make_user_name(domain_str)); if (!Db_conn_bldr.I.Exists(user_core_url)) // if user file does not exist, create it; needed b/c offline packages don't include file; DATE:2015-04-19 Fsdb_db_mgr__v2_bldr.I.Make_core_file_user(wiki, user_core_url, user_core_url.NameAndExt(), main_core_url.NameAndExt()); diff --git a/400_xowa/src/gplx/fsdb/Fsdb_db_mgr__v2_bldr.java b/400_xowa/src/gplx/fsdb/Fsdb_db_mgr__v2_bldr.java index 486e95bcb..9671fbed9 100644 --- a/400_xowa/src/gplx/fsdb/Fsdb_db_mgr__v2_bldr.java +++ b/400_xowa/src/gplx/fsdb/Fsdb_db_mgr__v2_bldr.java @@ -40,7 +40,7 @@ public class Fsdb_db_mgr__v2_bldr { private Fsdb_db_file Load_core_file(Io_url url) {return new Fsdb_db_file(url, Db_conn_bldr.I.Get(url));} private Fsdb_db_file Make_core_file_main(Xow_wiki wiki, Io_url main_core_url, String main_core_name, Xowd_db_layout layout) { Db_conn conn = layout.Tid_is_all() ? Db_conn_bldr.I.Get(main_core_url) : Db_conn_bldr.I.New(main_core_url); // if all, use existing (assumes same file name); else, create new - conn.Txn_bgn(); + conn.Txn_bgn("fsdb__core_file"); Fsdb_db_file rv = Make_core_file(main_core_url, conn, schema_is_1, Fsm_mnt_mgr.Mnt_idx_main); if (!layout.Tid_is_all()) // do not make cfg data if all Make_cfg_data(wiki, main_core_name, rv, Main_core_tid(layout), -1); @@ -50,7 +50,7 @@ public class Fsdb_db_mgr__v2_bldr { } public Fsdb_db_file Make_core_file_user(Xow_wiki wiki, Io_url user_core_url, String user_file_name, String main_core_name) { // always create file; do not create mnt_tbl; Db_conn conn = Db_conn_bldr.I.New(user_core_url); - conn.Txn_bgn(); + conn.Txn_bgn("fsdb__core_user"); Fsdb_db_file rv = Make_core_file(user_core_url, conn, schema_is_1, Fsm_mnt_mgr.Mnt_idx_user); Fsm_bin_tbl dbb_tbl = new Fsm_bin_tbl(conn, schema_is_1, Fsm_mnt_mgr.Mnt_idx_user); dbb_tbl.Insert(0, user_file_name); Make_bin_tbl(rv); diff --git a/400_xowa/src/gplx/fsdb/data/Fsd_bin_tbl.java b/400_xowa/src/gplx/fsdb/data/Fsd_bin_tbl.java index e738c702b..7fe617c65 100644 --- a/400_xowa/src/gplx/fsdb/data/Fsd_bin_tbl.java +++ b/400_xowa/src/gplx/fsdb/data/Fsd_bin_tbl.java @@ -38,7 +38,7 @@ public class Fsd_bin_tbl implements RlsAble { stmt_select = Db_stmt_.Rls(stmt_select); } public void Create_tbl() {conn.Ddl_create_tbl(Db_meta_tbl.new_(tbl_name, flds));} - public void Insert_bgn() {conn.Txn_bgn(); stmt_insert = conn.Stmt_insert(tbl_name, flds);} + public void Insert_bgn() {conn.Txn_bgn("fsdb_bin__insert"); stmt_insert = conn.Stmt_insert(tbl_name, flds);} public void Insert_commit() {conn.Txn_sav();} public void Insert_end() {conn.Txn_end(); stmt_insert = Db_stmt_.Rls(stmt_insert);} public void Insert_rdr(int id, byte tid, long bin_len, Io_stream_rdr bin_rdr) { diff --git a/400_xowa/src/gplx/fsdb/meta/Fsm_atr_mgr.java b/400_xowa/src/gplx/fsdb/meta/Fsm_atr_mgr.java index a69080f08..e84ba4c06 100644 --- a/400_xowa/src/gplx/fsdb/meta/Fsm_atr_mgr.java +++ b/400_xowa/src/gplx/fsdb/meta/Fsm_atr_mgr.java @@ -29,6 +29,6 @@ public class Fsm_atr_mgr { public Fsm_atr_fil Db__core() {return db__core;} public Fsd_fil_itm Select_fil_or_null(byte[] dir, byte[] fil) {return db__core.Select_fil_or_null(dir, fil);} public boolean Select_thm(boolean exact, Fsd_thm_itm rv, int dir_id, int fil_id) {return db__core.Select_thm(exact, rv, dir_id, fil_id);} - public void Txn_bgn() {db__core.Conn().Txn_bgn();} + public void Txn_bgn() {db__core.Conn().Txn_bgn("fsdb__fsm_atr_mgr");} public void Txn_end() {db__core.Conn().Txn_end();} } diff --git a/400_xowa/src/gplx/fsdb/meta/Fsm_bin_mgr.java b/400_xowa/src/gplx/fsdb/meta/Fsm_bin_mgr.java index c6bd91b34..e48f0babf 100644 --- a/400_xowa/src/gplx/fsdb/meta/Fsm_bin_mgr.java +++ b/400_xowa/src/gplx/fsdb/meta/Fsm_bin_mgr.java @@ -46,7 +46,7 @@ public class Fsm_bin_mgr { } public void Txn_bgn() { for (int i = 0; i < dbs__ary_len; ++i) - dbs__ary[i].Conn().Txn_bgn(); + dbs__ary[i].Conn().Txn_bgn("fsdb__meta__bin"); } public void Txn_end() { for (int i = 0; i < dbs__ary_len; ++i) diff --git a/400_xowa/src/gplx/gfs/Gfs_msg_bldr_tst.java b/400_xowa/src/gplx/gfs/Gfs_msg_bldr_tst.java index e839c0ff0..2c4d311ec 100644 --- a/400_xowa/src/gplx/gfs/Gfs_msg_bldr_tst.java +++ b/400_xowa/src/gplx/gfs/Gfs_msg_bldr_tst.java @@ -69,7 +69,7 @@ class Gfs_msg_bldr_fxt { int len = ary.length; for (int i = 0; i < len; i++) { if (i != 0) sb.Add_char_crlf(); - sb.Add(ary[i].XtoStr()); + sb.Add(ary[i].To_str()); } return sb.Xto_str_and_clear(); } diff --git a/400_xowa/src/gplx/gfs/Gfs_parser.java b/400_xowa/src/gplx/gfs/Gfs_parser.java index 4bd6017b9..6d106b78a 100644 --- a/400_xowa/src/gplx/gfs/Gfs_parser.java +++ b/400_xowa/src/gplx/gfs/Gfs_parser.java @@ -66,7 +66,7 @@ public class Gfs_parser { } class Gfs_parser_ { public static Btrie_fast_mgr trie_() { - Btrie_fast_mgr rv = Btrie_fast_mgr.ci_ascii_(); // NOTE:ci.ascii:gfs;letters/symbols only; + Btrie_fast_mgr rv = Btrie_fast_mgr.ci_a7(); // NOTE:ci.ascii:gfs;letters/symbols only; Gfs_lxr_identifier word_lxr = Gfs_lxr_identifier._; trie_add_rng(rv, word_lxr, Byte_ascii.Ltr_a, Byte_ascii.Ltr_z); trie_add_rng(rv, word_lxr, Byte_ascii.Ltr_A, Byte_ascii.Ltr_Z); diff --git a/400_xowa/src/gplx/gfs/Gfs_parser_ctx.java b/400_xowa/src/gplx/gfs/Gfs_parser_ctx.java index ca4471ee2..2e1faa9f0 100644 --- a/400_xowa/src/gplx/gfs/Gfs_parser_ctx.java +++ b/400_xowa/src/gplx/gfs/Gfs_parser_ctx.java @@ -66,10 +66,10 @@ class Gfs_parser_ctx { } class Gfs_err_mgr { public void Fail_eos(Gfs_parser_ctx ctx) {Fail(ctx, Fail_msg_eos, ctx.Src_len());} - public void Fail_unknown_char(Gfs_parser_ctx ctx, int pos, byte c) {Fail(ctx, Fail_msg_unknown_char, pos, KeyVal_.new_("char", Char_.XtoStr((char)c)));} + public void Fail_unknown_char(Gfs_parser_ctx ctx, int pos, byte c) {Fail(ctx, Fail_msg_unknown_char, pos, KeyVal_.new_("char", Char_.To_str((char)c)));} public void Fail_nde_stack_empty(Gfs_parser_ctx ctx, int pos) {Fail(ctx, Fail_msg_nde_stack_empty, pos);} public void Fail_invalid_lxr(Gfs_parser_ctx ctx, int pos, byte cur_lxr, byte c) { - Fail(ctx, Fail_msg_invalid_lxr, pos, KeyVal_.new_("char", Char_.XtoStr((char)c)), KeyVal_.new_("cur_lxr", Gfs_lxr_.Tid__name(cur_lxr)), KeyVal_.new_("prv_lxr", Gfs_lxr_.Tid__name(ctx.Prv_lxr()))); + Fail(ctx, Fail_msg_invalid_lxr, pos, KeyVal_.new_("char", Char_.To_str((char)c)), KeyVal_.new_("cur_lxr", Gfs_lxr_.Tid__name(cur_lxr)), KeyVal_.new_("prv_lxr", Gfs_lxr_.Tid__name(ctx.Prv_lxr()))); } private void Fail(Gfs_parser_ctx ctx, String msg, int pos, KeyVal... args) { byte[] src = ctx.Src(); int src_len = ctx.Src_len(); diff --git a/400_xowa/src/gplx/php/Php_srl_parser.java b/400_xowa/src/gplx/php/Php_srl_parser.java index 2d3ce467b..eba2d437f 100644 --- a/400_xowa/src/gplx/php/Php_srl_parser.java +++ b/400_xowa/src/gplx/php/Php_srl_parser.java @@ -96,7 +96,7 @@ public class Php_srl_parser { switch (b) { case Byte_ascii.Num_1: rv = factory.Bool_y(); break; case Byte_ascii.Num_0: rv = factory.Bool_n(); break; - default: throw err_(raw, pos, raw_len, "unknown boolean type {0}", Char_.XtoStr(b)); + default: throw err_(raw, pos, raw_len, "unknown boolean type {0}", Char_.To_str(b)); } pos = Chk(raw, pos + 1, Byte_ascii.Semic); break; @@ -139,7 +139,7 @@ public class Php_srl_parser { rv = factory.Func(func_bgn, pos, func_id); pos += 2; break; - default: throw err_(raw, pos, "unexpected type: {0}", Char_.XtoStr(b)); + default: throw err_(raw, pos, "unexpected type: {0}", Char_.To_str(b)); } return rv; } static final byte[] CONST_funct_bgn = Bry_.new_a7("O:42:\"Scribunto_LuaStandaloneInterpreterFunction\":1:{s:2:\"id\";i:"), CONST_funct_end = Bry_.new_a7(";}"); @@ -165,7 +165,7 @@ public class Php_srl_parser { if (actl == expd) return i + 1; else - throw err_(raw, i, "expected '{0}' but got '{1}'", Char_.XtoStr(expd), Char_.XtoStr(actl)); + throw err_(raw, i, "expected '{0}' but got '{1}'", Char_.To_str(expd), Char_.To_str(actl)); } int Skip_while_num(byte[] raw, int raw_len, int bgn, boolean num_is_int) { int num_len = 1; diff --git a/400_xowa/src/gplx/srls/dsvs/Dsv_tbl_parser_int_tst.java b/400_xowa/src/gplx/srls/dsvs/Dsv_tbl_parser_int_tst.java index 768be5ebd..1c552d2db 100644 --- a/400_xowa/src/gplx/srls/dsvs/Dsv_tbl_parser_int_tst.java +++ b/400_xowa/src/gplx/srls/dsvs/Dsv_tbl_parser_int_tst.java @@ -30,15 +30,15 @@ public class Dsv_tbl_parser_int_tst { ); } } -class Mok_int_itm implements XtoStrAble { +class Mok_int_itm implements To_str_able { private String fld_0; private int fld_1, fld_2; public Mok_int_itm(String fld_0, int fld_1, int fld_2) {this.fld_0 = fld_0; this.fld_1 = fld_1; this.fld_2 = fld_2;} - public String XtoStr() {return String_.Concat_with_str("|", fld_0, Int_.Xto_str(fld_1), Int_.Xto_str(fld_2));} + public String To_str() {return String_.Concat_with_str("|", fld_0, Int_.Xto_str(fld_1), Int_.Xto_str(fld_2));} } class Mok_int_mgr extends Mok_mgr_base { public void Clear() {itms.Clear();} - @Override public XtoStrAble[] Itms() {return (XtoStrAble[])itms.To_ary(XtoStrAble.class);} private List_adp itms = List_adp_.new_(); + @Override public To_str_able[] Itms() {return (To_str_able[])itms.To_ary(To_str_able.class);} private List_adp itms = List_adp_.new_(); private String fld_0; private int fld_1, fld_2; @Override public Dsv_fld_parser[] Fld_parsers() { diff --git a/400_xowa/src/gplx/srls/dsvs/Dsv_tbl_parser_str_tst.java b/400_xowa/src/gplx/srls/dsvs/Dsv_tbl_parser_str_tst.java index ccd865d51..94cf09922 100644 --- a/400_xowa/src/gplx/srls/dsvs/Dsv_tbl_parser_str_tst.java +++ b/400_xowa/src/gplx/srls/dsvs/Dsv_tbl_parser_str_tst.java @@ -55,7 +55,7 @@ public class Dsv_tbl_parser_str_tst { } } abstract class Mok_mgr_base extends Dsv_wkr_base { - public abstract XtoStrAble[] Itms(); + public abstract To_str_able[] Itms(); } class Dsv_mok_fxt { private Dsv_tbl_parser tbl_parser = new Dsv_tbl_parser(); @@ -67,15 +67,15 @@ class Dsv_mok_fxt { public Mok_mgr_base mgr_str_(int len) {return new Mok_str_mgr(len);} public Mok_str_itm itm_str_(String... flds) {return new Mok_str_itm(flds);} public Mok_int_itm itm_int_(String fld_0, int fld_1, int fld_2) {return new Mok_int_itm(fld_0, fld_1, fld_2);} - public void Test_load(String src, Mok_mgr_base mgr, XtoStrAble... expd) { + public void Test_load(String src, Mok_mgr_base mgr, To_str_able... expd) { mgr.Load_by_bry(Bry_.new_u8(src)); Tfds.Eq_ary_str(expd, mgr.Itms()); } } -class Mok_str_itm implements XtoStrAble { +class Mok_str_itm implements To_str_able { private String[] flds; public Mok_str_itm(String[] flds) {this.flds = flds;} - public String XtoStr() {return String_.Concat_with_str("|", flds);} + public String To_str() {return String_.Concat_with_str("|", flds);} } class Mok_str_mgr extends Mok_mgr_base { private int flds_len; @@ -83,7 +83,7 @@ class Mok_str_mgr extends Mok_mgr_base { this.flds_len = flds_len; } public void Clear() {itms.Clear();} - @Override public XtoStrAble[] Itms() {return (XtoStrAble[])itms.To_ary(XtoStrAble.class);} private List_adp itms = List_adp_.new_(); + @Override public To_str_able[] Itms() {return (To_str_able[])itms.To_ary(To_str_able.class);} private List_adp itms = List_adp_.new_(); private List_adp flds = List_adp_.new_(); @Override public boolean Write_bry(Dsv_tbl_parser parser, int fld_idx, byte[] src, int bgn, int end) { flds.Add(String_.new_u8(src, bgn, end)); diff --git a/400_xowa/src/gplx/xowa/Xoa_app_.java b/400_xowa/src/gplx/xowa/Xoa_app_.java index d675f2777..5e45427c2 100644 --- a/400_xowa/src/gplx/xowa/Xoa_app_.java +++ b/400_xowa/src/gplx/xowa/Xoa_app_.java @@ -19,16 +19,48 @@ package gplx.xowa; import gplx.*; import gplx.core.consoles.*; import gplx.dbs.*; import gplx.ios.*; import gplx.gfui.*; import gplx.xowa.apps.*; import gplx.xowa.langs.*; import gplx.xowa.users.*; import gplx.xowa.files.*; import gplx.xowa.html.hdumps.*; import gplx.xowa.html.hdumps.core.*; +import gplx.xowa.gui.views.boots.*; import gplx.xowa.urls.encoders.*; public class Xoa_app_ { public static void Run(String... args) { - Xoa_app_boot_mgr boot_mgr = new Xoa_app_boot_mgr(); - boot_mgr.Run(args); + try { + Xoa_app_boot_mgr boot_mgr = new Xoa_app_boot_mgr(); + boot_mgr.Run(args); + } catch (Error e) { + String err_text = e.toString(); + String err_details = String_.Concat_lines_nl_skip_last + ( "OS: " + Op_sys.Cur().Os_name() + , "Java: " + Env_.Env_prop__java_version() + " (" + Op_sys.Cur().Bitness_str() + " bit)" + , "Java path: " + Env_.Env_prop("java.home") + , "XOWA: " + Version + , "XOWA path: " + Env_.AppUrl().Raw() + , "" + , "Error: " + err_text + , "Stack: " + Err_.Trace_lang(e) + ); + String full_msg = String_.Concat_lines_nl_skip_last + ( "Sorry! XOWA failed to run!" + , "" + , "Please check the TROUBLESHOOTING section in the readme.txt for known issues." + , "" + , "You can also open an issue or send an email with the data below." + , "" + , "Thanks!" + , "" + , "----" + , err_details + ); + if (Op_sys.Cur().Tid_is_osx()) + Console_adp__sys.I.Write_str(err_text); + else + new Xog_error_win(new Xog_error_data(full_msg, err_details, err_text)); + Gfo_usr_dlg_.I.Log_many("", "", err_details); + } } public static final String Name = "xowa"; - public static final String Version = "2.8.1.1"; + public static final String Version = "2.8.3.1"; public static String Build_date = "2012-12-30 00:00:00"; - public static String Op_sys; + public static String Op_sys_str; public static String User_agent = ""; public static final Gfo_msg_grp Nde = Gfo_msg_grp_.prj_(Name); public static Gfo_usr_dlg usr_dlg_console_() { @@ -65,7 +97,7 @@ class Xoa_app_boot_mgr { Io_url jar_url = Env_.AppUrl(); Xoa_app_.Build_date = Io_mgr.I.QueryFil(jar_url).ModifiedTime().XtoUtc().XtoStr_fmt("yyyy-MM-dd HH:mm"); log_wtr.Log_to_session_fmt("env.init: jar_url=~{0}; build_date=~{1}", jar_url.NameAndExt(), Xoa_app_.Build_date); - log_wtr.Log_to_session_fmt("env.init: op_sys=~{0}", Op_sys.Cur().Xto_str()); + log_wtr.Log_to_session_fmt("env.init: op_sys=~{0}", Op_sys.Cur().To_str()); chkpoint = "init_env"; return true; } @@ -86,7 +118,7 @@ class Xoa_app_boot_mgr { , App_cmd_arg.opt_("wiki_dir").Example_url_("C:\\xowa\\wiki\\").Note_("directory for wikis; defaults to '/xowa/wiki/'") , App_cmd_arg.opt_("bin_dir_name").Example_("windows").Note_("platform-dependent directory name inside /xowa/bin/; valid values are 'linux', 'macosx', 'windows', 'linux_64', 'macosx_64', 'windows_64'; defaults to detected version") , App_cmd_arg.opt_("app_mode").Example_("gui").Note_("type of app to run; valid values are 'gui', 'cmd', 'server', 'http_server'; defaults to 'gui'") - , App_cmd_arg.opt_("cmd_file").Example_url_("C:\\xowa\\xowa.gfs").Note_("file_path of script to execute; defaults to 'xowa.gfs'") + , App_cmd_arg.opt_("cmd_file").Example_url_("C:\\xowa\\bin\\any\\xowa\\cfg\\app\\xowa.gfs").Note_("file_path of script to execute; defaults to 'xowa.gfs'") , App_cmd_arg.opt_("cmd_text").Example_("\"app.shell.fetch_page('en.wikipedia.org/wiki/Earth', 'html');\"").Note_("script to run; runs after cmd_file; does nothing if empty; default is empty.\nCurrently a useful cmd is to do 'java -jar xowa_your_platform.jar --app_mode cmd --show_license n --show_args n --cmd_text \"app.shell.fetch_page('en.wikipedia.org/wiki/Earth' 'html');\"'. This will output the page's html to the console. You can also change 'html' to 'wiki' to get the wikitext.") , App_cmd_arg.opt_("url").Example_("en.wikipedia.org/wiki/Earth").Note_("url to be shown when xowa first launches; default is home/wiki/Main_Page") , App_cmd_arg.opt_("server_port_recv").Example_("55000").Note_("applies to --app_mode server; port where xowa server will receive messages; clients should send messages to this port") @@ -124,22 +156,23 @@ class Xoa_app_boot_mgr { Io_url root_dir = args_mgr.Args_get("root_dir").Val_as_url_rel_dir_or(jar_dir, jar_dir); Io_url user_dir = args_mgr.Args_get("user_dir").Val_as_url_rel_dir_or(root_dir.GenSubDir("user"), root_dir.GenSubDir_nest("user", Xoue_user.Key_xowa_user)); Io_url wiki_dir = args_mgr.Args_get("wiki_dir").Val_as_url_rel_dir_or(root_dir.GenSubDir("wiki"), root_dir.GenSubDir("wiki")); - Io_url cmd_file = args_mgr.Args_get("cmd_file").Val_as_url_rel_fil_or(jar_dir, root_dir.GenSubFil("xowa.gfs")); + Io_url cmd_file = args_mgr.Args_get("cmd_file").Val_as_url_rel_fil_or(jar_dir, root_dir.GenSubFil_nest("bin", "any", "xowa", "cfg" ,"app", "xowa.gfs")); String app_mode = args_mgr.Args_get("app_mode").Val_as_str_or("gui"); String launch_url = args_mgr.Args_get("url").Val_as_str_or(null); int server_port_recv = args_mgr.Args_get("server_port_recv").Val_as_int_or(55000); int server_port_send = args_mgr.Args_get("server_port_send").Val_as_int_or(55001); int http_server_port = args_mgr.Args_get("http_server_port").Val_as_int_or(8080); String http_server_home = args_mgr.Args_get("http_server_home").Val_as_str_or("home/wiki/Main_Page"); - Xoa_app_.Op_sys = args_mgr.Args_get("bin_dir_name").Val_as_str_or(Bin_dir_name()); - Xoa_app_.User_agent = String_.Format("XOWA/{0} ({1}) [gnosygnu@gmail.com]", Xoa_app_.Version, Xoa_app_.Op_sys); + Xoa_app_.Op_sys_str = args_mgr.Args_get("bin_dir_name").Val_as_str_or(Bin_dir_name()); + Xoa_app_.User_agent = String_.Format("XOWA/{0} ({1}) [gnosygnu@gmail.com]", Xoa_app_.Version, Xoa_app_.Op_sys_str); String cmd_text = args_mgr.Args_get("cmd_text").Val_as_str_or(null); Xoa_app_type app_type = Xoa_app_type.parse(app_mode); app_type_is_gui = app_type.Uid_is_gui(); + Xog_splash_win splash_win = new Xog_splash_win(app_type_is_gui); // init app Db_conn_bldr.I.Reg_default_sqlite(); - app = new Xoae_app(usr_dlg, app_type, root_dir, wiki_dir, root_dir.GenSubDir("file"), user_dir, root_dir.GenSubDir_nest("user", "anonymous", "wiki"), Xoa_app_.Op_sys); + app = new Xoae_app(usr_dlg, app_type, root_dir, wiki_dir, root_dir.GenSubDir("file"), user_dir, root_dir.GenSubDir_nest("user", "anonymous", "wiki"), Xoa_app_.Op_sys_str); usr_dlg.Log_wkr().Queue_enabled_(false); log_wtr.Log_to_session_fmt("app.init"); try { app.Sys_cfg().Lang_(System_lang()); @@ -175,7 +208,7 @@ class Xoa_app_boot_mgr { Console_adp__sys.I.Write_str_w_nl_utf8(Object_.Xto_str_strict_or_empty(app.Gfs_mgr().Run_str(cmd_text))); } if (app_type_is_gui) { - app.Gui_mgr().Run(); chkpoint = "run"; + app.Gui_mgr().Run(splash_win); chkpoint = "run"; } else // teardown app, else lua will keep process running if (gplx.xowa.xtns.scribunto.Scrib_core.Core() != null) gplx.xowa.xtns.scribunto.Scrib_core.Core().Term(); diff --git a/400_xowa/src/gplx/xowa/Xoa_app_fxt.java b/400_xowa/src/gplx/xowa/Xoa_app_fxt.java index 2a7302a2d..e680b4f6a 100644 --- a/400_xowa/src/gplx/xowa/Xoa_app_fxt.java +++ b/400_xowa/src/gplx/xowa/Xoa_app_fxt.java @@ -59,6 +59,14 @@ public class Xoa_app_fxt { app.File_mgr().Repo_mgr().Set("trg:c", "mem/wiki/repo/trg/", "commons.wikimedia.org").Ext_rules_(Xof_rule_grp.Grp_app_default).Dir_depth_(2).Primary_(true); wiki.File_mgr().Repo_mgr().Add_repo(Bry_.new_a7("src:c"), Bry_.new_a7("trg:c")); } + public static void repo2_(Xoae_app app, Xowe_wiki wiki) { + app.File_mgr().Repo_mgr().Set("src:wiki", "mem/http/en.wikipedia.org/" , wiki.Domain_str()).Ext_rules_(Xof_rule_grp.Grp_app_default).Dir_depth_(2); + app.File_mgr().Repo_mgr().Set("trg:wiki", "mem/file/en.wikipedia.org/" , wiki.Domain_str()).Ext_rules_(Xof_rule_grp.Grp_app_default).Dir_depth_(2).Primary_(true); + wiki.File_mgr().Repo_mgr().Add_repo(Bry_.new_a7("src:wiki"), Bry_.new_a7("trg:wiki")); + app.File_mgr().Repo_mgr().Set("src:comm", "mem/http/commons.wikimedia.org/" , "commons.wikimedia.org").Ext_rules_(Xof_rule_grp.Grp_app_default).Dir_depth_(2); + app.File_mgr().Repo_mgr().Set("trg:comm", "mem/file/commons.wikimedia.org/" , "commons.wikimedia.org").Ext_rules_(Xof_rule_grp.Grp_app_default).Dir_depth_(2).Primary_(true); + wiki.File_mgr().Repo_mgr().Add_repo(Bry_.new_a7("src:comm"), Bry_.new_a7("trg:comm")); + } public static void Init_gui(Xoae_app app, Xowe_wiki wiki) { app.Gui_mgr().Browser_win().Init_by_kit(gplx.gfui.Mem_kit._); app.Gui_mgr().Browser_win().Tab_mgr().Tabs_new_init(wiki, Xoae_page.Empty); diff --git a/400_xowa/src/gplx/xowa/Xoa_url.java b/400_xowa/src/gplx/xowa/Xoa_url.java index eced4fbfa..177797c17 100644 --- a/400_xowa/src/gplx/xowa/Xoa_url.java +++ b/400_xowa/src/gplx/xowa/Xoa_url.java @@ -68,7 +68,7 @@ public class Xoa_url { public byte[] To_bry(boolean full, boolean show_qargs) { // currently used for status bar; not embedded in any html switch (tid) { case Xoa_url_.Tid_unknown: // unknown; should not occur? - return Bry_.Len_eq_0(raw) ? Bry_.Add(wiki_bry, Byte_ascii.Slash_bry, page_bry) : raw; // raw is empty when using new_(); + return Bry_.Len_eq_0(raw) ? Bry_.Add(wiki_bry, Xoh_href_.Bry__wiki, page_bry) : raw; // raw is empty when using new_(); case Xoa_url_.Tid_inet: // protocol; embed all; EX: "http://a.org/A"; "file:///C/dir/file.txt" case Xoa_url_.Tid_file: // file; EX: "file:///C:/A/B.jpg" return raw; diff --git a/400_xowa/src/gplx/xowa/apis/Xoapi_root.java b/400_xowa/src/gplx/xowa/apis/Xoapi_root.java index c80dfc3e1..e185d8f83 100644 --- a/400_xowa/src/gplx/xowa/apis/Xoapi_root.java +++ b/400_xowa/src/gplx/xowa/apis/Xoapi_root.java @@ -23,6 +23,7 @@ public class Xoapi_root implements GfoInvkAble { app_api.Ctor_by_app(app); usr_api.Ctor_by_app(app); bldr_api.Ctor_by_app(app); + html_api.Ctor_by_app(app); } public void Init_by_kit(Xoae_app app) { this.app = app; diff --git a/400_xowa/src/gplx/xowa/apis/xowa/Xoapi_html.java b/400_xowa/src/gplx/xowa/apis/xowa/Xoapi_html.java index d46141ed6..22b06f813 100644 --- a/400_xowa/src/gplx/xowa/apis/xowa/Xoapi_html.java +++ b/400_xowa/src/gplx/xowa/apis/xowa/Xoapi_html.java @@ -18,14 +18,17 @@ along with this program. If not, see . package gplx.xowa.apis.xowa; import gplx.*; import gplx.xowa.*; import gplx.xowa.apis.*; import gplx.xowa.apis.xowa.html.*; public class Xoapi_html implements GfoInvkAble { + public void Ctor_by_app(Xoae_app app) { + page.Ctor_by_app(app); + } public void Init_by_kit(Xoae_app app) { tidy.Init_by_kit(app); modules.Init_by_kit(app); } - public Xoapi_tidy Tidy() {return tidy;} private Xoapi_tidy tidy = new Xoapi_tidy(); - public Xoapi_modules Modules() {return modules;} private Xoapi_modules modules = new Xoapi_modules(); - public Xoapi_skins Skins() {return skins;} private Xoapi_skins skins = new Xoapi_skins(); - public Xoapi_page Page() {return page;} private Xoapi_page page = new Xoapi_page(); + public Xoapi_tidy Tidy() {return tidy;} private final Xoapi_tidy tidy = new Xoapi_tidy(); + public Xoapi_modules Modules() {return modules;} private final Xoapi_modules modules = new Xoapi_modules(); + public Xoapi_skins Skins() {return skins;} private final Xoapi_skins skins = new Xoapi_skins(); + public Xoapi_page Page() {return page;} private final Xoapi_page page = new Xoapi_page(); public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { if (ctx.Match(k, Invk_tidy)) return tidy; else if (ctx.Match(k, Invk_modules)) return modules; diff --git a/400_xowa/src/gplx/xowa/apis/xowa/html/Xoapi_page.java b/400_xowa/src/gplx/xowa/apis/xowa/html/Xoapi_page.java index f262f9578..902885b18 100644 --- a/400_xowa/src/gplx/xowa/apis/xowa/html/Xoapi_page.java +++ b/400_xowa/src/gplx/xowa/apis/xowa/html/Xoapi_page.java @@ -18,7 +18,10 @@ along with this program. If not, see . package gplx.xowa.apis.xowa.html; import gplx.*; import gplx.xowa.*; import gplx.xowa.apis.*; import gplx.xowa.apis.xowa.*; import gplx.core.btries.*; public class Xoapi_page implements GfoInvkAble { - public Xoapi_toggle_mgr Toggle_mgr() {return toggle_mgr;} private Xoapi_toggle_mgr toggle_mgr = new Xoapi_toggle_mgr(); + public void Ctor_by_app(Xoae_app app) { + toggle_mgr.Ctor_by_app(app); + } + public Xoapi_toggle_mgr Toggle_mgr() {return toggle_mgr;} private final Xoapi_toggle_mgr toggle_mgr = new Xoapi_toggle_mgr(); public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { if (ctx.Match(k, Invk_toggles)) return toggle_mgr; else return GfoInvkAble_.Rv_unhandled; diff --git a/400_xowa/src/gplx/xowa/apis/xowa/html/Xoapi_toggle_itm.java b/400_xowa/src/gplx/xowa/apis/xowa/html/Xoapi_toggle_itm.java index a2bbf0637..6baf151d2 100644 --- a/400_xowa/src/gplx/xowa/apis/xowa/html/Xoapi_toggle_itm.java +++ b/400_xowa/src/gplx/xowa/apis/xowa/html/Xoapi_toggle_itm.java @@ -17,29 +17,24 @@ along with this program. If not, see . */ package gplx.xowa.apis.xowa.html; import gplx.*; import gplx.xowa.*; import gplx.xowa.apis.*; import gplx.xowa.apis.xowa.*; public class Xoapi_toggle_itm implements GfoInvkAble { - public Xoapi_toggle_itm(byte[] key_bry) {this.key_bry = key_bry;} - public byte[] Key_bry() {return key_bry;} private byte[] key_bry; + private final Xoae_app app; // NOTE: needed to get "img_dir" below + private byte[] img_title_val_y, img_title_val_n; + public Xoapi_toggle_itm(Xoae_app app, byte[] key_bry) { + this.app = app; this.key_bry = key_bry; + } + public byte[] Key_bry() {return key_bry;} private final byte[] key_bry; public byte[] Heading_bry() {return heading_bry;} private byte[] heading_bry; public byte[] Icon_src() {return icon_src;} private byte[] icon_src = Bry_.Empty; public byte[] Icon_title() {return icon_title;} private byte[] icon_title = Bry_.Empty; public byte[] Elem_display() {return elem_display;} private byte[] elem_display = Bry_.Empty; public byte[] Html_toggle_hdr_cls() {return html_toggle_hdr_cls;} public Xoapi_toggle_itm Html_toggle_hdr_cls_(byte[] v) {html_toggle_hdr_cls = v; return this;} private byte[] html_toggle_hdr_cls = Bry_.Empty; public boolean Visible() {return visible;} private boolean visible; - public Xoapi_toggle_itm Init(Xowe_wiki wiki, byte[] heading_bry) { - if (Img_src_y == null) { - Io_url img_dir = wiki.Appe().Usere().Fsys_mgr().App_img_dir().GenSubDir_nest("window", "portal"); - Img_src_y = img_dir.GenSubFil("twisty_down.png").To_http_file_bry(); - Img_src_n = img_dir.GenSubFil("twisty_right.png").To_http_file_bry(); - } - icon_src = visible ? Img_src_y : Img_src_n; - byte[] img_title_msg = visible ? Img_title_msg_y : Img_title_msg_n; - icon_title = wiki.Msg_mgr().Val_by_key_obj(img_title_msg); - elem_display = visible ? Img_display_y : Img_display_n; - this.heading_bry = heading_bry; + public Xoapi_toggle_itm Init(byte[] heading_bry) { + this.heading_bry = heading_bry; // NOTE: sets "Wikis" or "In other languages"; Wikidata twisties are empty; + this.icon_title = app.Usere().Msg_mgr().Val_by_key_obj(visible ? Img_title_msg_y : Img_title_msg_n); // set title ("show" or "hide") Html_toggle_gen(); return this; } - private byte[] img_title_val_y, img_title_val_n; public Xoapi_toggle_itm Init_fsys(Io_url img_dir) { if (Img_src_y == null) { Img_src_y = img_dir.GenSubFil("twisty_down.png").To_http_file_bry(); @@ -54,7 +49,15 @@ public class Xoapi_toggle_itm implements GfoInvkAble { } public byte[] Html_toggle_btn() {return html_toggle_btn;} private byte[] html_toggle_btn; public byte[] Html_toggle_hdr() {return html_toggle_hdr;} private byte[] html_toggle_hdr; - private void Html_toggle_gen() { + private void Assert_img_src() { + if (Img_src_y == null) { + Io_url img_dir = app.Usere().Fsys_mgr().App_img_dir().GenSubDir_nest("window", "portal"); + Img_src_y = img_dir.GenSubFil("twisty_down.png").To_http_file_bry(); + Img_src_n = img_dir.GenSubFil("twisty_right.png").To_http_file_bry(); + } + } + private void Html_toggle_gen() { + Assert_img_src();// NOTE: must call Assert_img_src else wikidata twisties will be missing img; DATE:2015-08-05 if (visible) { icon_src = Img_src_y; icon_title = img_title_val_y; @@ -77,7 +80,7 @@ public class Xoapi_toggle_itm implements GfoInvkAble { } public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { if (ctx.Match(k, Invk_visible)) return Yn.Xto_str(visible); - else if (ctx.Match(k, Invk_visible_)) {this.visible = m.ReadYn("v"); Html_toggle_gen();} + else if (ctx.Match(k, Invk_visible_)) this.visible = m.ReadYn("v"); else return GfoInvkAble_.Rv_unhandled; return this; } diff --git a/400_xowa/src/gplx/xowa/apis/xowa/html/Xoapi_toggle_mgr.java b/400_xowa/src/gplx/xowa/apis/xowa/html/Xoapi_toggle_mgr.java index 20aa55580..84c1b6b13 100644 --- a/400_xowa/src/gplx/xowa/apis/xowa/html/Xoapi_toggle_mgr.java +++ b/400_xowa/src/gplx/xowa/apis/xowa/html/Xoapi_toggle_mgr.java @@ -18,12 +18,14 @@ along with this program. If not, see . package gplx.xowa.apis.xowa.html; import gplx.*; import gplx.xowa.*; import gplx.xowa.apis.*; import gplx.xowa.apis.xowa.*; import gplx.xowa.cfgs.*; public class Xoapi_toggle_mgr implements GfoInvkAble { - private Ordered_hash hash = Ordered_hash_.new_bry_(); + private Xoae_app app; + private final Ordered_hash hash = Ordered_hash_.new_bry_(); + public void Ctor_by_app(Xoae_app app) {this.app = app;} public Xoapi_toggle_itm Get_or_new(String key_str) { byte[] key_bry = Bry_.new_u8(key_str); Xoapi_toggle_itm rv = (Xoapi_toggle_itm)hash.Get_by(key_bry); if (rv == null) { - rv = new Xoapi_toggle_itm(key_bry); + rv = new Xoapi_toggle_itm(app, key_bry); hash.Add(key_bry, rv); } return rv; diff --git a/400_xowa/src/gplx/xowa/apps/Xoa_gfs_mgr.java b/400_xowa/src/gplx/xowa/apps/Xoa_gfs_mgr.java index 15f3b1809..3773312f4 100644 --- a/400_xowa/src/gplx/xowa/apps/Xoa_gfs_mgr.java +++ b/400_xowa/src/gplx/xowa/apps/Xoa_gfs_mgr.java @@ -35,7 +35,7 @@ public class Xoa_gfs_mgr implements GfoInvkAble, GfoInvkRootWkr { else if (String_.Eq(type, "xowa_cfg_custom")) url = usr_fsys_mgr.App_data_cfg_custom_fil(); else if (String_.Eq(type, "xowa_cfg_user")) url = usr_fsys_mgr.App_data_cfg_user_fil(); else if (String_.Eq(type, "xowa_cfg_os")) {url = app_fsys_mgr.Bin_data_os_cfg_fil(); Xoa_gfs_mgr_.Cfg_os_assert(url);} - else if (String_.Eq(type, "xowa_cfg_app")) url = app_fsys_mgr.Root_dir().GenSubFil("xowa.gfs"); + else if (String_.Eq(type, "xowa_cfg_app")) url = app_fsys_mgr.Cfg_app_fil(); else throw Err_.new_wo_type("invalid gfs type", "type", type); try {Run_url(url);} catch (Exception e) { // gfs is corrupt; may happen if multiple XOWAs opened, and "Close all" chosen in OS; DATE:2014-07-01 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 18b0e258a..6af2014f3 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 @@ -16,6 +16,7 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.apps.fsys; import gplx.*; import gplx.xowa.*; import gplx.xowa.apps.*; +import gplx.xowa.wikis.*; public class Xoa_fsys_mgr implements GfoInvkAble { public Xoa_fsys_mgr(String plat_name, Io_url root_dir, Io_url wiki_dir, Io_url file_dir, Io_url css_dir) { this.root_dir = root_dir; @@ -25,9 +26,12 @@ public class Xoa_fsys_mgr implements GfoInvkAble { this.bin_plat_dir = root_dir.GenSubDir("bin").GenSubDir(plat_name); this.bin_any_dir = root_dir.GenSubDir("bin").GenSubDir("any"); this.bin_xowa_dir = bin_any_dir.GenSubDir("xowa"); - this.bin_xtns_dir = bin_any_dir.GenSubDir_nest("xowa", "xtns"); - this.cfg_lang_core_dir = bin_any_dir.GenSubDir_nest("xowa", "cfg", "lang", "core"); - this.cfg_wiki_core_dir = bin_any_dir.GenSubDir_nest("xowa", "cfg", "wiki", "core"); + this.bin_xtns_dir = bin_xowa_dir.GenSubDir_nest("xtns"); + this.cfg_app_fil = bin_xowa_dir.GenSubFil_nest("cfg", "app", "xowa.gfs"); + this.cfg_lang_core_dir = bin_xowa_dir.GenSubDir_nest("cfg", "lang", "core"); + this.cfg_wiki_core_dir = bin_xowa_dir.GenSubDir_nest("cfg", "wiki", "core"); + this.cfg_site_meta_fil = bin_xowa_dir.GenSubDir_nest("cfg", "wiki", "site_meta.sqlite3"); + this.home_wiki_dir = bin_xowa_dir.GenSubDir_nest("wiki", Xow_domain_.Domain_str_home); } public Io_url Root_dir() {return root_dir;} private final Io_url root_dir; public Io_url Wiki_dir() {return wiki_dir;} private final Io_url wiki_dir; @@ -39,9 +43,12 @@ public class Xoa_fsys_mgr implements GfoInvkAble { 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 Cfg_site_meta_fil() {return cfg_site_meta_fil;} private final Io_url cfg_site_meta_fil; public Io_url Bin_data_os_cfg_fil() {return bin_plat_dir.GenSubFil_nest("xowa", "cfg", Xoa_gfs_mgr.Cfg_os);} public Io_url Wiki_css_dir(String wiki) {return css_dir.GenSubDir_nest(wiki, "html");} // EX: /xowa/temp/simple.wikipedia.org/html/xowa_common.css public Io_url Wiki_file_dir(String wiki) {return file_dir.GenSubDir_nest(wiki);} // EX: /xowa/temp/simple.wikipedia.org/orig/ + public Io_url Home_wiki_dir() {return home_wiki_dir;} private final Io_url home_wiki_dir; + public Io_url Cfg_app_fil() {return cfg_app_fil;} private final Io_url cfg_app_fil; public void Init_by_app(GfoInvkAble app_mgr_invk) {this.app_mgr_invk = app_mgr_invk;} private GfoInvkAble app_mgr_invk; // for gfs and app.launcher public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { if (ctx.Match(k, Invk_apps)) return app_mgr_invk; diff --git a/400_xowa/src/gplx/xowa/apps/metas/Xoa_ns_mgr.java b/400_xowa/src/gplx/xowa/apps/metas/Xoa_ns_mgr.java index 54f687dda..f457c8cd9 100644 --- a/400_xowa/src/gplx/xowa/apps/metas/Xoa_ns_mgr.java +++ b/400_xowa/src/gplx/xowa/apps/metas/Xoa_ns_mgr.java @@ -18,11 +18,12 @@ along with this program. If not, see . package gplx.xowa.apps.metas; import gplx.*; import gplx.xowa.*; import gplx.xowa.apps.*; import gplx.dbs.*; import gplx.xowa.langs.cases.*; +import gplx.xowa.wikis.domains.*; import gplx.xowa.wmfs.data.*; public class Xoa_ns_mgr { private final Xoa_app app; private final Hash_adp_bry hash = Hash_adp_bry.cs(); - private Xowmf_site_tbl wmf_site_tbl; private Xowmf_ns_tbl wmf_ns_tbl; + private Site_core_db core_db; public Xoa_ns_mgr(Xoa_app app) { this.app = app; } @@ -30,20 +31,10 @@ public class Xoa_ns_mgr { public Xow_ns_mgr Get_or_load(byte[] wiki_domain) { Xow_ns_mgr rv = (Xow_ns_mgr)hash.Get_by_bry(wiki_domain); if (rv == null) { - rv = Load(wiki_domain); + if (core_db == null) core_db = new Site_core_db(app.Fsys_mgr().Cfg_site_meta_fil()); + rv = core_db.Load_ns(wiki_domain); Add(wiki_domain, rv); } return rv; } - private Xow_ns_mgr Load(byte[] wiki_domain) { - Xow_ns_mgr rv = new Xow_ns_mgr(Xol_case_mgr_.U8()); - if (wmf_site_tbl == null) { - Db_conn conn = Xowmf_site_tbl.Get_conn_or_new(app.Fsys_mgr().Root_dir()); - wmf_site_tbl = new Xowmf_site_tbl(conn); - wmf_ns_tbl = new Xowmf_ns_tbl(conn); - } - int site_id = wmf_site_tbl.Select_id(String_.new_u8(wiki_domain)); - wmf_ns_tbl.Select_all(rv, site_id); - return rv; - } } diff --git a/400_xowa/src/gplx/xowa/bldrs/Xob_cmd_keys.java b/400_xowa/src/gplx/xowa/bldrs/Xob_cmd_keys.java index 9fd59c393..1ee8acc03 100644 --- a/400_xowa/src/gplx/xowa/bldrs/Xob_cmd_keys.java +++ b/400_xowa/src/gplx/xowa/bldrs/Xob_cmd_keys.java @@ -52,7 +52,7 @@ public class Xob_cmd_keys { , Key_wbase_qid = "wbase.qid" // "text.wdata.qid" , Key_wbase_pid = "wbase.pid" // "text.wdata.pid" , Key_wbase_db = "wbase.db" // "wiki.wdata_db" - , Key_wbase_ns = "wbase.ns" + , Key_site_meta = "util.site_meta" , Key_tdb_text_init = "tdb.text.init" // "core.init" , Key_tdb_make_page = "tdb.text.page" // "core.make_page" , Key_tdb_make_id = "core.make_id" diff --git a/400_xowa/src/gplx/xowa/bldrs/Xob_cmd_mgr.java b/400_xowa/src/gplx/xowa/bldrs/Xob_cmd_mgr.java index ad4012a29..efe81747e 100644 --- a/400_xowa/src/gplx/xowa/bldrs/Xob_cmd_mgr.java +++ b/400_xowa/src/gplx/xowa/bldrs/Xob_cmd_mgr.java @@ -60,7 +60,7 @@ public class Xob_cmd_mgr implements GfoInvkAble { else if (String_.Eq(cmd_key, Xob_cmd_keys.Key_wbase_qid)) return Xml_rdr_direct_add(wiki, new Xob_wdata_qid_sql().Ctor(bldr, wiki)); else if (String_.Eq(cmd_key, Xob_cmd_keys.Key_wbase_pid)) return Xml_rdr_direct_add(wiki, new Xob_wdata_pid_sql().Ctor(bldr, wiki)); else if (String_.Eq(cmd_key, Xob_cmd_keys.Key_wbase_db)) return Add(new Xob_wdata_db_cmd(bldr, wiki)); - else if (String_.Eq(cmd_key, Xob_cmd_keys.Key_wbase_ns)) return Add(new Xob_site_ns_cmd(bldr, wiki)); + else if (String_.Eq(cmd_key, Xob_cmd_keys.Key_site_meta)) return Add(new Xob_site_meta_cmd(bldr, wiki)); else if (String_.Eq(cmd_key, Xob_cmd_keys.Key_tdb_text_init)) return Add(new Xob_init_tdb(bldr, wiki)); else if (String_.Eq(cmd_key, Xob_cmd_keys.Key_tdb_make_page)) return Xml_rdr_direct_add(wiki, new Xob_page_txt(bldr, wiki)); else if (String_.Eq(cmd_key, Xob_cmd_keys.Key_tdb_make_id)) return Xml_rdr_direct_add(wiki, new Xob_make_id_wkr(bldr, wiki)); diff --git a/400_xowa/src/gplx/xowa/bldrs/cmds/ctgs/Xob_ctg_v1_base.java b/400_xowa/src/gplx/xowa/bldrs/cmds/ctgs/Xob_ctg_v1_base.java index f649520d0..446595f75 100644 --- a/400_xowa/src/gplx/xowa/bldrs/cmds/ctgs/Xob_ctg_v1_base.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/ctgs/Xob_ctg_v1_base.java @@ -94,7 +94,7 @@ public abstract class Xob_ctg_v1_base extends Xob_itm_dump_base implements Xobd_ if (delete_temp) Io_mgr.I.DeleteDirDeep(temp_dir); } private Gfo_fld_wtr fld_wtr = Gfo_fld_wtr.xowa_(); - Btrie_fast_mgr trie = Btrie_fast_mgr.cs_().Add_stub(Tid_brack_end, "]]").Add_stub(Tid_pipe, "|").Add_stub(Tid_nl, "\n").Add_stub(Tid_brack_bgn, "[["); + Btrie_fast_mgr trie = Btrie_fast_mgr.cs().Add_stub(Tid_brack_end, "]]").Add_stub(Tid_pipe, "|").Add_stub(Tid_nl, "\n").Add_stub(Tid_brack_bgn, "[["); static final int row_fixed_len = 5 + 1 + 1; // 5=rowId; 1=|; 1=\n List_adp category_list = List_adp_.new_(); Int_obj_ref cur_pos = Int_obj_ref.zero_(); static final byte Tid_eos = 0, Tid_brack_end = 1, Tid_pipe = 2, Tid_nl = 3, Tid_brack_bgn = 4; diff --git a/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_fsdb_make_cmd.java b/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_fsdb_make_cmd.java index f19606718..ff87245fe 100644 --- a/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_fsdb_make_cmd.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_fsdb_make_cmd.java @@ -73,14 +73,14 @@ public class Xob_fsdb_make_cmd extends Xob_itm_basic_base implements Xob_cmd { this.trg_atr_fil = trg_mnt_itm.Atr_mgr().Db__core(); this.trg_cfg_mgr = trg_mnt_itm.Cfg_mgr(); bin_db_mgr.Init_by_mnt_mgr(trg_mnt_mgr); - trg_atr_fil.Conn().Txn_bgn(); + trg_atr_fil.Conn().Txn_bgn("bldr__fsdb_make__trg_atr_fil"); if (!trg_atr_fil.Conn().Eq(trg_cfg_mgr.Tbl().Conn())) // need to create txn for v1; DATE:2015-07-04 - trg_cfg_mgr.Tbl().Conn().Txn_bgn(); + trg_cfg_mgr.Tbl().Conn().Txn_bgn("bldr__fsdb_make__trg_cfg_fil"); // bldr_db Xob_db_file bldr_db = Xob_db_file.new__file_make(wiki.Fsys_mgr().Root_dir()); this.bldr_conn = bldr_db.Conn(); this.bldr_cfg_tbl = bldr_db.Tbl__cfg(); // NOTE: cfg and atr is in same db; use it - bldr_cfg_tbl.Conn().Txn_bgn(); + bldr_cfg_tbl.Conn().Txn_bgn("bldr__fsdb_make__bldr_cfg_tbl"); } public void Cmd_run() { Init_bldr_bmks(); @@ -129,7 +129,7 @@ public class Xob_fsdb_make_cmd extends Xob_itm_basic_base implements Xob_cmd { Db_cfg_hash bmk_hash = bldr_cfg_tbl.Select_as_hash(Cfg_fsdb_make); String tier_id_str = bmk_hash.Get(Cfg_tier_id_bmk).To_str_or(null); if (tier_id_str == null) { // bmks not found; new db; - bldr_conn.Txn_bgn(); + bldr_conn.Txn_bgn("bldr__fsdb_make__bldr_conn"); bldr_cfg_tbl.Insert_int(Cfg_fsdb_make, Cfg_tier_id_bmk , tier_id_bmk); bldr_cfg_tbl.Insert_int(Cfg_fsdb_make, Cfg_page_id_bmk , page_id_bmk); bldr_cfg_tbl.Insert_int(Cfg_fsdb_make, Cfg_lnki_id_bmk , lnki_id_bmk); @@ -227,21 +227,21 @@ public class Xob_fsdb_make_cmd extends Xob_itm_basic_base implements Xob_cmd { } private void Make_trg_bin_file(boolean try_nth, Xodb_tbl_oimg_xfer_itm fsdb, long src_rdr_len) { boolean make = true, txn_bgn = true; + if (trg_bin_fil != null) { // pre-existing bin_file; + if (trg_mnt_itm.Db_mgr().File__solo_file()) + txn_bgn = false; // solo file; do nothing + else + trg_bin_fil.Conn().Txn_end(); // close txn before making new db + } int tier_id = fsdb.Lnki_tier_id(); Xob_bin_db_itm nth_bin_db = bin_db_mgr.Get_nth_by_tier(tier_id); - if (try_nth) { // try_nth is true; occurs for new runs or changed tier - if ( nth_bin_db.Id() != -1 // nth exists; + if (try_nth) { // try_nth is true; occurs for new runs or changed tier + if ( nth_bin_db.Id() != -1 // nth exists; && nth_bin_db.Db_len() + src_rdr_len < trg_bin_db_max) { // if src_rdr_len exceeds - make = false; // do not make; use existing - txn_bgn = false; + make = false; // do not make; use existing } } - if (make) { // no nth; make it; - if (trg_bin_fil != null) { // pre-existing bin_file; - trg_bin_fil.Conn().Txn_end(); // close txn before making new db - if (trg_mnt_itm.Db_mgr().File__solo_file()) - txn_bgn = false; - } + if (make) { // no nth; make it; int ns_id = bin_db_mgr.Get_ns_id(tier_id); int pt_id = bin_db_mgr.Increment_pt_id(nth_bin_db); String new_bin_db_name = bin_db_mgr.Gen_name(wiki.Domain_str(), ns_id, pt_id); @@ -252,12 +252,12 @@ public class Xob_fsdb_make_cmd extends Xob_itm_basic_base implements Xob_cmd { Fsdb_db_mgr__v2_bldr.Make_cfg_data(wiki, trg_atr_fil.Url_rel(), trg_bin_db, Xowd_db_file_.Tid_file_data, trg_bin_fil.Id() + List_adp_.Base1); } } - else { // nth available; use it + else { // nth available; use it this.trg_bin_fil = trg_mnt_itm.Bin_mgr().Dbs__get_at(nth_bin_db.Id()); trg_bin_fil.Bin_len_(nth_bin_db.Db_len()); } if (txn_bgn) - trg_bin_fil.Conn().Txn_bgn(); + trg_bin_fil.Conn().Txn_bgn("bldr__fsdb_make__trg_bin_fil"); } private void Txn_sav() { usr_dlg.Prog_many("", "", "committing data: count=~{0} failed=~{1}", exec_count, exec_fail); diff --git a/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_lnki_temp_tbl.java b/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_lnki_temp_tbl.java index ed3e2c039..51a961662 100644 --- a/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_lnki_temp_tbl.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_lnki_temp_tbl.java @@ -40,7 +40,7 @@ class Xob_lnki_temp_tbl { public Xob_lnki_temp_tbl(Db_conn conn) {this.conn = conn;} public Db_conn Conn() {return conn;} private final Db_conn conn; public void Create_tbl() {conn.Ddl_create_tbl(Db_meta_tbl.new_(Tbl_name, flds));} - public void Insert_bgn() {conn.Txn_bgn(); stmt_insert = conn.Stmt_insert(Tbl_name, flds);} + public void Insert_bgn() {conn.Txn_bgn("bldr__lnki_temp"); stmt_insert = conn.Stmt_insert(Tbl_name, flds);} public void Insert_commit() {conn.Txn_sav();} public void Insert_end() {conn.Txn_end(); stmt_insert = Db_stmt_.Rls(stmt_insert);} public void Insert_cmd_by_batch(int tier_id, int page_id, byte[] ttl, byte[] ttl_commons, byte ext_id, byte img_type, byte lnki_src_tid, int w, int h, double upright, double time, int page) { diff --git a/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_xfer_regy_cmd.java b/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_xfer_regy_cmd.java index 9bfade654..3ac4c2f4a 100644 --- a/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_xfer_regy_cmd.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_xfer_regy_cmd.java @@ -24,7 +24,7 @@ public class Xob_xfer_regy_cmd extends Xob_itm_basic_base implements Xob_cmd { public void Cmd_bgn(Xob_bldr bldr) {} public void Cmd_run() { Db_conn conn = Xob_db_file.new__file_make(wiki.Fsys_mgr().Root_dir()).Conn(); - conn.Txn_bgn(); + conn.Txn_bgn("bldr__xfer_regy"); Xob_xfer_regy_tbl.Create_table(conn); Xob_xfer_regy_tbl.Create_data(usr_dlg, conn); Xob_xfer_regy_tbl.Create_index(usr_dlg, conn); diff --git a/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_xfer_regy_update_cmd.java b/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_xfer_regy_update_cmd.java index 3f906728d..191483a57 100644 --- a/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_xfer_regy_update_cmd.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_xfer_regy_update_cmd.java @@ -37,7 +37,7 @@ public class Xob_xfer_regy_update_cmd extends Xob_itm_basic_base implements Xob_ Io_url fsdb_atr_url = ((gplx.dbs.engines.sqlite.Sqlite_conn_info)conn.Conn_info()).Url(); Sqlite_engine_.Tbl_create_and_delete(make_db_provider, Xob_fsdb_regy_tbl.Tbl_name, Xob_fsdb_regy_tbl.Tbl_sql); Sqlite_engine_.Db_attach(make_db_provider, "fsdb_db", fsdb_atr_url.Raw()); - make_db_provider.Txn_bgn(); + make_db_provider.Txn_bgn("bldr__xfer_regy_update"); make_db_provider.Exec_sql(Xob_fsdb_regy_tbl.Update_regy_nil); make_db_provider.Exec_sql(Xob_fsdb_regy_tbl.Insert_fsdb_fil); String fsdb_thm_tbl = fsdb_abc_mgr.Db_mgr().File__schema_is_1() ? "fsdb_xtn_thm" : "fsdb_thm"; @@ -51,7 +51,7 @@ public class Xob_xfer_regy_update_cmd extends Xob_itm_basic_base implements Xob_ Sqlite_engine_.Db_detach(make_db_provider, "fsdb_db"); } private void Update_status(Db_conn make_db_provider) { - make_db_provider.Txn_bgn(); + make_db_provider.Txn_bgn("bldr__xfer_regy_update_status"); make_db_provider.Exec_sql(Xob_fsdb_regy_tbl.Update_regy_fil); make_db_provider.Exec_sql(Xob_fsdb_regy_tbl.Update_regy_thm); make_db_provider.Txn_end(); diff --git a/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_xfer_temp_cmd_orig.java b/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_xfer_temp_cmd_orig.java index a2b91321a..76d035c3d 100644 --- a/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_xfer_temp_cmd_orig.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_xfer_temp_cmd_orig.java @@ -26,7 +26,7 @@ public class Xob_xfer_temp_cmd_orig extends Xob_itm_basic_base implements Xob_cm Db_conn conn = Xob_db_file.new__file_make(wiki.Fsys_mgr().Root_dir()).Conn(); Xob_xfer_temp_tbl.Create_table(conn); Db_stmt trg_stmt = Xob_xfer_temp_tbl.Insert_stmt(conn); - conn.Txn_bgn(); + conn.Txn_bgn("bldr__xfer_temp"); DataRdr rdr = conn.Exec_sql_as_rdr(Sql_select); long[] ext_maxs = Calc_ext_max(); while (rdr.MoveNextPeer()) { diff --git a/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_xfer_temp_cmd_thumb.java b/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_xfer_temp_cmd_thumb.java index 031e13d3f..00089ada2 100644 --- a/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_xfer_temp_cmd_thumb.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_xfer_temp_cmd_thumb.java @@ -25,7 +25,7 @@ public class Xob_xfer_temp_cmd_thumb extends Xob_itm_basic_base implements Xob_c Db_conn conn = Xob_db_file.new__file_make(wiki.Fsys_mgr().Root_dir()).Conn(); Xob_xfer_temp_tbl.Create_table(conn); Db_stmt trg_stmt = Xob_xfer_temp_tbl.Insert_stmt(conn); - conn.Txn_bgn(); + conn.Txn_bgn("bldr__xfer_temp_thumb"); DataRdr rdr = conn.Exec_sql_as_rdr(Sql_select); Xob_xfer_temp_itm temp_itm = new Xob_xfer_temp_itm(); Xof_img_size img_size = new Xof_img_size(); diff --git a/400_xowa/src/gplx/xowa/bldrs/cmds/texts/sqls/Xob_css_cmd.java b/400_xowa/src/gplx/xowa/bldrs/cmds/texts/sqls/Xob_css_cmd.java index ff5151929..b34cda2e3 100644 --- a/400_xowa/src/gplx/xowa/bldrs/cmds/texts/sqls/Xob_css_cmd.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/texts/sqls/Xob_css_cmd.java @@ -32,7 +32,7 @@ public class Xob_css_cmd implements Xob_cmd { usr_dlg.Plog_many("", "", Cmd_key() + ":css_dir; dir=~{0}", css_dir.Raw()); wiki.Init_db_mgr(); // NOTE: must follow Install b/c Init_assert also calls Install; else will download any css from db Xowd_db_file core_db = wiki.Db_mgr_as_sql().Core_data_mgr().Db__core(); - core_db.Conn().Txn_bgn(); + core_db.Conn().Txn_bgn("bldr__css"); core_db.Tbl__css_core().Create_tbl(); core_db.Tbl__css_file().Create_tbl(); gplx.xowa.html.css.Xowd_css_core_mgr.Set(core_db.Tbl__css_core(), core_db.Tbl__css_file(), css_dir, css_key); diff --git a/400_xowa/src/gplx/xowa/bldrs/cmds/texts/sqls/Xob_page_cmd.java b/400_xowa/src/gplx/xowa/bldrs/cmds/texts/sqls/Xob_page_cmd.java index 97bbcb5e8..559b106fe 100644 --- a/400_xowa/src/gplx/xowa/bldrs/cmds/texts/sqls/Xob_page_cmd.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/texts/sqls/Xob_page_cmd.java @@ -36,7 +36,7 @@ public class Xob_page_cmd extends Xob_itm_basic_base implements Xobd_wkr, GfoInv this.ns_to_db_mgr = new Xob_ns_to_db_mgr(new Xob_ns_to_db_wkr__text(), db_mgr, import_cfg.Text_db_max()); if (redirect_id_enabled) { this.redirect_tbl = new Xob_redirect_tbl(wiki.Fsys_mgr().Root_dir(), Xoa_app_.Utl__encoder_mgr().Http_url_ttl()).Create_table(); - redirect_tbl.Conn().Txn_bgn(); + redirect_tbl.Conn().Txn_bgn("bldr__page__redirect"); } this.dg_match_mgr = app.Api_root().Bldr().Wiki().Filter().Dansguardian().New_mgr(wiki.Domain_str(), wiki.Fsys_mgr().Root_dir()); app.Bldr().Dump_parser().Trie_tab_del_(); // disable swapping for \t diff --git a/400_xowa/src/gplx/xowa/xtns/wdatas/imports/Xob_site_ns_cmd.java b/400_xowa/src/gplx/xowa/bldrs/cmds/utils/Xob_site_meta_cmd.java similarity index 62% rename from 400_xowa/src/gplx/xowa/xtns/wdatas/imports/Xob_site_ns_cmd.java rename to 400_xowa/src/gplx/xowa/bldrs/cmds/utils/Xob_site_meta_cmd.java index 76f50d9f1..1c71e02f3 100644 --- a/400_xowa/src/gplx/xowa/xtns/wdatas/imports/Xob_site_ns_cmd.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/utils/Xob_site_meta_cmd.java @@ -15,19 +15,16 @@ GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ -package gplx.xowa.xtns.wdatas.imports; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; import gplx.xowa.xtns.wdatas.*; +package gplx.xowa.bldrs.cmds.utils; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.cmds.*; import gplx.dbs.*; import gplx.xowa.bldrs.*; import gplx.xowa.wmfs.*; import gplx.xowa.wmfs.data.*; -public class Xob_site_ns_cmd implements Xob_cmd { +import gplx.xowa.wikis.domains.*; +public class Xob_site_meta_cmd implements Xob_cmd { private final Xob_bldr bldr; - public Xob_site_ns_cmd(Xob_bldr bldr, Xow_wiki wiki) {this.bldr = bldr;} - public String Cmd_key() {return Xob_cmd_keys.Key_wbase_ns;} + public Xob_site_meta_cmd(Xob_bldr bldr, Xow_wiki wiki) {this.bldr = bldr;} + public String Cmd_key() {return Xob_cmd_keys.Key_site_meta;} public void Cmd_run() { - Xow_wmf_api_mgr api_mgr = new Xow_wmf_api_mgr(); - Db_conn conn = Xowmf_site_tbl.Get_conn_or_new(bldr.App().Fsys_mgr().Root_dir()); - Xowmf_site_tbl tbl_site = new Xowmf_site_tbl(conn); Xowmf_ns_tbl tbl_itm = new Xowmf_ns_tbl(conn); - Xow_wmf_api_wkr__ns api_wkr = new Xow_wmf_api_wkr__ns(tbl_site, tbl_itm); - api_mgr.Api_exec(api_wkr); + Site_meta_itm.Build_site_meta(bldr.App().Wmf_mgr(), bldr.App().Fsys_mgr().Cfg_site_meta_fil(), Xow_wmf_api_mgr.Wikis, DateAdp_.Now()); } public void Cmd_init(Xob_bldr bldr) {} public void Cmd_bgn(Xob_bldr bldr) {} diff --git a/400_xowa/src/gplx/xowa/bldrs/cmds/wikis/Xob_image_cmd.java b/400_xowa/src/gplx/xowa/bldrs/cmds/wikis/Xob_image_cmd.java index 5790898a4..1a504635a 100644 --- a/400_xowa/src/gplx/xowa/bldrs/cmds/wikis/Xob_image_cmd.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/wikis/Xob_image_cmd.java @@ -37,7 +37,7 @@ public class Xob_image_cmd extends Xob_itm_dump_base implements Xob_cmd, GfoInvk parser.Src_fil_(src_fil).Trg_fil_gen_(dump_url_gen).Fld_cmd_(this).Flds_req_idx_(20, Fld_img_name, Fld_img_size, Fld_img_width, Fld_img_height, Fld_img_bits, Fld_img_media_type, Fld_img_minor_mime, Fld_img_timestamp); this.conn = Xob_db_file.new__wiki_image(wiki.Fsys_mgr().Root_dir()).Conn(); - conn.Txn_bgn(); + conn.Txn_bgn("bldr__image"); this.tbl_image = new Xob_image_tbl(); tbl_image.Create_table(conn); this.stmt = tbl_image.Insert_stmt(conn); diff --git a/400_xowa/src/gplx/xowa/bldrs/cmds/wikis/Xob_page_dump_tbl.java b/400_xowa/src/gplx/xowa/bldrs/cmds/wikis/Xob_page_dump_tbl.java index 49075c774..cf9dd9ac7 100644 --- a/400_xowa/src/gplx/xowa/bldrs/cmds/wikis/Xob_page_dump_tbl.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/wikis/Xob_page_dump_tbl.java @@ -30,6 +30,7 @@ class Xobd_page_dump_tbl { } public void Create_data(Io_url page_db_url, int text_db_id) { conn.Ddl_create_tbl(Db_meta_tbl.new_(Tbl_name, flds)); + conn.Stmt_delete(Tbl_name).Exec_delete(); // always clear tables again; allows commands to be rerun; DATE:2015-08-04 Db_attach_cmd.new_(conn, "page_db", page_db_url) .Add_fmt("text_db_prep.clone_page", Sql_insert_data, text_db_id) .Exec(); diff --git a/400_xowa/src/gplx/xowa/bldrs/cmds/wikis/Xob_redirect_cmd.java b/400_xowa/src/gplx/xowa/bldrs/cmds/wikis/Xob_redirect_cmd.java index 59a8143f5..6b5deb0f1 100644 --- a/400_xowa/src/gplx/xowa/bldrs/cmds/wikis/Xob_redirect_cmd.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/wikis/Xob_redirect_cmd.java @@ -35,7 +35,7 @@ public class Xob_redirect_cmd extends Xob_dump_mgr_base { encoder = Xoa_app_.Utl__encoder_mgr().Http_url_ttl(); redirect_tbl = new Xob_redirect_tbl(wiki.Fsys_mgr().Root_dir(), Xoa_app_.Utl__encoder_mgr().Http_url_ttl()).Create_table(); conn = redirect_tbl.Conn(); - conn.Txn_bgn(); + conn.Txn_bgn("bldr__redirect"); return conn; } @Override protected void Cmd_bgn_end() {} diff --git a/400_xowa/src/gplx/xowa/bldrs/css/Xoa_css_extractor.java b/400_xowa/src/gplx/xowa/bldrs/css/Xoa_css_extractor.java index 8e32941f5..82aeb8095 100644 --- a/400_xowa/src/gplx/xowa/bldrs/css/Xoa_css_extractor.java +++ b/400_xowa/src/gplx/xowa/bldrs/css/Xoa_css_extractor.java @@ -40,7 +40,7 @@ public class Xoa_css_extractor { Xof_download_wkr download_wkr = app.Wmf_mgr().Download_wkr(); this.download_xrg = download_wkr.Download_xrg(); css_img_downloader = new Xoa_css_img_downloader().Ctor(usr_dlg, download_wkr, Bry_.new_u8(protocol_prefix)); - failover_dir = app.Fsys_mgr().Bin_any_dir().GenSubDir_nest("html", "xowa", "import"); + failover_dir = app.Fsys_mgr().Bin_xowa_dir().GenSubDir_nest("html", "css", "failover"); url_encoder = Xoa_app_.Utl__encoder_mgr().Http_url(); } public void Install(Xow_wiki wiki, String css_key) { diff --git a/400_xowa/src/gplx/xowa/bldrs/filters/dansguardians/Crt__match_base.java b/400_xowa/src/gplx/xowa/bldrs/filters/dansguardians/Crt__match_base.java index 4f22d89c7..bc3ec957d 100644 --- a/400_xowa/src/gplx/xowa/bldrs/filters/dansguardians/Crt__match_base.java +++ b/400_xowa/src/gplx/xowa/bldrs/filters/dansguardians/Crt__match_base.java @@ -42,6 +42,6 @@ class Crt__match_exact implements Criteria { } public void Val_as_obj_(Object v) {Val_as_bry_ary_((byte[][])v);} public void Val_from_args(Hash_adp args) {throw Err_.new_unimplemented();} - public String XtoStr() {return String_.Concat_any(this.To_str_name(), " ", String_.Ary(ary));} + public String To_str() {return String_.Concat_any(this.To_str_name(), " ", String_.Ary(ary));} public byte Tid_match_exact = 12; } diff --git a/400_xowa/src/gplx/xowa/bldrs/filters/dansguardians/Dg_log_mgr.java b/400_xowa/src/gplx/xowa/bldrs/filters/dansguardians/Dg_log_mgr.java index 8734211b4..1a09d1d0c 100644 --- a/400_xowa/src/gplx/xowa/bldrs/filters/dansguardians/Dg_log_mgr.java +++ b/400_xowa/src/gplx/xowa/bldrs/filters/dansguardians/Dg_log_mgr.java @@ -31,7 +31,7 @@ class Dg_log_mgr { tbl_rule.Conn_(conn, created); tbl_page_score.Conn_(conn, created); tbl_page_rule.Conn_(conn, created); - conn.Txn_bgn(); + conn.Txn_bgn("dansguardian"); } public void Insert_file(Dg_file file) {tbl_file.Insert(file.Id(), file.Rel_path(), file.Lines().length);} public void Insert_rule(Dg_rule rule) {tbl_rule.Insert(rule.File_id(), rule.Id(), rule.Idx(), rule.Score(), Dg_word.Ary_concat(rule.Words(), tmp_bfr, Byte_ascii.Tilde));} diff --git a/400_xowa/src/gplx/xowa/bldrs/infos/Xob_info_file.java b/400_xowa/src/gplx/xowa/bldrs/infos/Xob_info_file.java index 7f704a7d0..0a2c9e225 100644 --- a/400_xowa/src/gplx/xowa/bldrs/infos/Xob_info_file.java +++ b/400_xowa/src/gplx/xowa/bldrs/infos/Xob_info_file.java @@ -31,7 +31,7 @@ public class Xob_info_file { public String Core_file_name() {return core_file_name;} private final String core_file_name; public String Orig_file_name() {return orig_file_name;} private final String orig_file_name; public void Save(Db_cfg_tbl tbl) { - tbl.Conn().Txn_bgn(); + tbl.Conn().Txn_bgn("make__info__file"); tbl.Insert_int (Cfg_grp, Cfg_key__id , id); tbl.Insert_str (Cfg_grp, Cfg_key__type , type); tbl.Insert_str (Cfg_grp, Cfg_key__ns_ids , ns_ids); diff --git a/400_xowa/src/gplx/xowa/bldrs/infos/Xob_info_session.java b/400_xowa/src/gplx/xowa/bldrs/infos/Xob_info_session.java index 3d25cb5e1..f5ddda0e0 100644 --- a/400_xowa/src/gplx/xowa/bldrs/infos/Xob_info_session.java +++ b/400_xowa/src/gplx/xowa/bldrs/infos/Xob_info_session.java @@ -28,7 +28,7 @@ public class Xob_info_session { public DateAdp Time() {return time;} private final DateAdp time; public Guid_adp Uuid() {return guid;} private final Guid_adp guid; public void Save(Db_cfg_tbl tbl) { - tbl.Conn().Txn_bgn(); + tbl.Conn().Txn_bgn("make__info__session"); tbl.Insert_str (Cfg_grp, Cfg_key__user , user); tbl.Insert_str (Cfg_grp, Cfg_key__version , version); tbl.Insert_str (Cfg_grp, Cfg_key__wiki_domain , wiki_domain); diff --git a/400_xowa/src/gplx/xowa/bldrs/xmls/Xob_xml_parser_.java b/400_xowa/src/gplx/xowa/bldrs/xmls/Xob_xml_parser_.java index 6ee3fdd73..2c4047f20 100644 --- a/400_xowa/src/gplx/xowa/bldrs/xmls/Xob_xml_parser_.java +++ b/400_xowa/src/gplx/xowa/bldrs/xmls/Xob_xml_parser_.java @@ -19,7 +19,7 @@ package gplx.xowa.bldrs.xmls; import gplx.*; import gplx.xowa.*; import gplx.xow import gplx.core.btries.*; public class Xob_xml_parser_ { public static Btrie_fast_mgr trie_() { - Btrie_fast_mgr rv = Btrie_fast_mgr.cs_(); + Btrie_fast_mgr rv = Btrie_fast_mgr.cs(); trie_add(rv, Bry_page_bgn, Id_page_bgn); trie_add(rv, Bry_page_bgn_frag, Id_page_bgn_frag); trie_add(rv, Bry_page_end, Id_page_end); trie_add(rv, Bry_id_bgn, Id_id_bgn); trie_add(rv, Bry_id_bgn_frag, Id_id_bgn_frag); trie_add(rv, Bry_id_end, Id_id_end); trie_add(rv, Bry_title_bgn, Id_title_bgn); trie_add(rv, Bry_title_bgn_frag, Id_title_bgn_frag); trie_add(rv, Bry_title_end, Id_title_end); diff --git a/400_xowa/src/gplx/xowa/files/Xof_ext_.java b/400_xowa/src/gplx/xowa/files/Xof_ext_.java index c08199e80..f4e4a45ac 100644 --- a/400_xowa/src/gplx/xowa/files/Xof_ext_.java +++ b/400_xowa/src/gplx/xowa/files/Xof_ext_.java @@ -122,7 +122,7 @@ public class Xof_ext_ { default: return false; } } - public static boolean Id_supports_thumbtime(int v) { // identifies if tid supports thumbtime in lnki; EX: [[File:A.ogv|thumbtime=1]]; + public static boolean Id_supports_time(int v) { // identifies if tid supports thumbtime in lnki; EX: [[File:A.ogv|thumbtime=1]]; switch (v) { case Id_ogg: case Id_ogv: case Id_webm: return true; default: return false; diff --git a/400_xowa/src/gplx/xowa/files/Xof_file_wkr_.java b/400_xowa/src/gplx/xowa/files/Xof_file_wkr_.java index a0b6cd540..143da3c50 100644 --- a/400_xowa/src/gplx/xowa/files/Xof_file_wkr_.java +++ b/400_xowa/src/gplx/xowa/files/Xof_file_wkr_.java @@ -20,7 +20,7 @@ import gplx.core.consoles.*; public class Xof_file_wkr_ { public static final Url_encoder Md5_decoder = Url_encoder.new_http_url_().Itms_raw_same_many(Byte_ascii.Plus); public static byte[] Md5_fast(byte[] v) {return Bry_.new_a7(gplx.security.HashAlgo_.Md5.CalcHash(Console_adp_.Noop, gplx.ios.IoStream_.ary_(v)));} - public static byte[] Md5_(byte[] ttl) { + public static byte[] Md5(byte[] ttl) { ttl = Md5_decoder.Decode_lax(Ttl_standardize(ttl)); return Xof_file_wkr_.Md5_fast(ttl); // NOTE: md5 is calculated off of url_decoded ttl; EX: A%2Cb is converted to A,b and then md5'd. note that A%2Cb still remains the title } diff --git a/400_xowa/src/gplx/xowa/files/Xof_fsdb_itm.java b/400_xowa/src/gplx/xowa/files/Xof_fsdb_itm.java index 20c55b20e..06eabdbdf 100644 --- a/400_xowa/src/gplx/xowa/files/Xof_fsdb_itm.java +++ b/400_xowa/src/gplx/xowa/files/Xof_fsdb_itm.java @@ -77,7 +77,7 @@ public class Xof_fsdb_itm implements Xof_file_itm { this.orig_ext = orig_ext; // NOTE: always use orig_ext since this comes directly from wmf_api; DATE:2015-05-17 } public void Init_at_lnki_by_near(int file_w) { - this.lnki_w = file_w; this.lnki_h = Xof_img_size.Size_null_deprecated; + this.lnki_w = file_w; this.lnki_h = Xof_img_size.Size__neg1; } public void Init_at_html(int exec_tid, Xof_img_size img_size, Xof_repo_itm repo, Xof_url_bldr url_bldr) { Calc_html_size(exec_tid, img_size); @@ -116,6 +116,9 @@ public class Xof_fsdb_itm implements Xof_file_itm { public void Init_at_xfer(int idx, int len) { this.xfer_idx = idx; this.xfer_len = len; } + public void Change_repo(byte orig_repo_id, byte[] orig_repo_name) { + this.orig_repo_id = orig_repo_id; this.orig_repo_name = orig_repo_name; + } public void File_is_orig_(boolean v) {this.file_is_orig = v;} public void Orig_repo_name_(byte[] v) {orig_repo_name = v;} public void Html_elem_tid_(byte v) {this.html_elem_tid = v;} diff --git a/400_xowa/src/gplx/xowa/files/Xof_fsdb_itm_fxt.java b/400_xowa/src/gplx/xowa/files/Xof_fsdb_itm_fxt.java new file mode 100644 index 000000000..27d60ec0f --- /dev/null +++ b/400_xowa/src/gplx/xowa/files/Xof_fsdb_itm_fxt.java @@ -0,0 +1,80 @@ +/* +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.files; import gplx.*; import gplx.xowa.*; +import gplx.xowa.wikis.*; +import gplx.xowa.files.repos.*; +public class Xof_fsdb_itm_fxt { + private byte[] wiki_abrv; + private byte[] lnki_ttl; + private byte lnki_type; + private double lnki_upright; + private int lnki_w; + private int lnki_h; + private double lnki_time; + private int lnki_page; + private byte orig_repo_id; + private byte[] orig_repo_name; + private byte[] orig_ttl; + private Xof_ext orig_ext; + private int orig_w; + private int orig_h; + private byte[] orig_redirect; + public Xof_fsdb_itm_fxt() {this.Clear();} + public void Clear() { + this.wiki_abrv = lnki_ttl = null; + this.lnki_type = Xop_lnki_type.Id_null; + this.lnki_upright = Xof_img_size.Upright_null; + this.lnki_w = this.lnki_h = this.orig_w = this.orig_h = Xof_img_size.Size__neg1; + this.lnki_h = Xof_img_size.Size__neg1; + this.lnki_time = Xof_lnki_time.Null; + this.lnki_page = Xof_lnki_page.Null; + this.orig_repo_id = Xof_repo_itm_.Repo_null; + this.orig_repo_name = orig_ttl = orig_redirect = null; + this.orig_ext = null; + } + public Xof_fsdb_itm_fxt Lnki__en_w(String lnki_ttl_str) { + this.wiki_abrv = Abrv__en_w; + this.lnki_ttl = Bry_.new_u8(lnki_ttl_str); + return this; + } + public Xof_fsdb_itm_fxt Orig__commons__lnki() { + this.orig_repo_name = Xow_domain_.Domain_bry_commons; + this.orig_repo_id = Xof_repo_itm_.Repo_remote; + this.orig_ttl = lnki_ttl; + this.orig_ext = Xof_ext_.new_by_ttl_(orig_ttl); + this.orig_w = 880; + this.orig_w = 440; + return this; + } + public Xof_fsdb_itm_fxt Orig__enwiki__lnki() { + this.orig_repo_name = Xow_domain_.Domain_bry_enwiki; + this.orig_repo_id = Xof_repo_itm_.Repo_local; + this.orig_ttl = lnki_ttl; + this.orig_ext = Xof_ext_.new_by_ttl_(orig_ttl); + this.orig_w = 880; + this.orig_w = 440; + return this; + } + public Xof_fsdb_itm Make() { + Xof_fsdb_itm rv = new Xof_fsdb_itm(); + rv.Init_at_lnki(Xof_exec_tid.Tid_wiki_page, wiki_abrv, lnki_ttl, lnki_type, lnki_upright, lnki_w, lnki_h, lnki_time, lnki_page, Xof_patch_upright_tid_.Tid_all); + rv.Init_at_orig(orig_repo_id, orig_repo_name, orig_ttl, orig_ext, orig_w, orig_h, orig_redirect); + return rv; + } + private final static byte[] Abrv__en_w = Bry_.new_a7("en.w"); +} diff --git a/400_xowa/src/gplx/xowa/files/Xof_img_size.java b/400_xowa/src/gplx/xowa/files/Xof_img_size.java index a257abb5f..9baefdf25 100644 --- a/400_xowa/src/gplx/xowa/files/Xof_img_size.java +++ b/400_xowa/src/gplx/xowa/files/Xof_img_size.java @@ -27,59 +27,63 @@ public class Xof_img_size { file_is_orig = false; } public void Html_size_calc(int exec_tid, int lnki_w, int lnki_h, byte lnki_type, int upright_patch, double lnki_upright, int orig_ext, int orig_w, int orig_h, int thm_dflt_w) { - this.Clear(); // always clear before calc; caller should be responsible, but just to be safe. - if (Enm_.HasInt(lnki_type, Xop_lnki_type.Id_frame) // frame: always return orig size; Linker.php!makeThumbLink2; // Use image dimensions, don't scale - && lnki_h == Null) { // unless lnki_h specified; DATE:2013-12-22 - html_w = file_w = orig_w; - html_h = file_h = orig_h; - file_is_orig = Xof_ext_.Orig_file_is_img(orig_ext); // file_is_orig = true, unless svg, ogv, pdf - if (file_is_orig) - file_w = file_h = Size__same_as_orig; - return; - } - html_w = lnki_w; html_h = lnki_h; // set html vals to lnki vals - file_is_orig = false; - if (html_w == Null && html_h == Null) { // no size set; NOTE: do not default to thumb if only height is set; EX: x900px should have w=0 h=900 - if (Xop_lnki_type.Id_defaults_to_thumb(lnki_type)) - html_w = thm_dflt_w; - else if ( orig_ext == Xof_ext_.Id_pdf // pdf and viewing on page; default to 220 - && exec_tid == Xof_exec_tid.Tid_wiki_page) - html_w = thm_dflt_w; - else - html_w = orig_w; - } - html_w = Upright_calc(upright_patch, lnki_upright, html_w, lnki_w, lnki_h, lnki_type); - if (orig_w == Null) return; // no orig_w; just use html_w and html_h (html_h will likely be -1 and wrong) + synchronized (this) { + this.Clear(); // always clear before calc; caller should be responsible, but just to be safe. + if (Xof_ext_.Id_supports_time(orig_ext) && lnki_w == Xof_img_size.Null) // use orig_w if no size specified for video; EX:[[File:A.ogv]] -> [[File:A.ogv|550px]] where 550px is orig_w; DATE:2015-08-07 + lnki_w = orig_w; + if (Enm_.HasInt(lnki_type, Xop_lnki_type.Id_frame) // frame: always return orig size; Linker.php!makeThumbLink2; // Use image dimensions, don't scale + && lnki_h == Null) { // unless lnki_h specified; DATE:2013-12-22 + html_w = file_w = orig_w; + html_h = file_h = orig_h; + file_is_orig = Xof_ext_.Orig_file_is_img(orig_ext); // file_is_orig = true, unless svg, ogv, pdf + if (file_is_orig) + file_w = file_h = Size__same_as_orig; + return; + } + html_w = lnki_w; html_h = lnki_h; // set html vals to lnki vals + file_is_orig = false; + if (html_w == Null && html_h == Null) { // no size set; NOTE: do not default to thumb if only height is set; EX: x900px should have w=0 h=900 + if (Xop_lnki_type.Id_defaults_to_thumb(lnki_type)) + html_w = thm_dflt_w; + else if ( orig_ext == Xof_ext_.Id_pdf // pdf and viewing on page; default to 220 + && exec_tid == Xof_exec_tid.Tid_wiki_page) + html_w = thm_dflt_w; + else + html_w = orig_w; + } + html_w = Upright_calc(upright_patch, lnki_upright, html_w, lnki_w, lnki_h, lnki_type); + if (orig_w == Null) return; // no orig_w; just use html_w and html_h (html_h will likely be -1 and wrong) - boolean ext_is_svg = orig_ext == Xof_ext_.Id_svg; - if (html_w == Xof_img_size.Null) { - if ( ext_is_svg // following strange MW logic; REF.MW:Linker.php|makeImageLink|If its a vector image, and user only specifies height, we don't want it to be limited by its "normal" width; DATE: 2013-11-26 - && html_h != Xof_img_size.Null) - html_w = Svg_max_width; - else - html_w = orig_w; // html_w missing >>> use orig_w; REF.MW:Linker.php|makeImageLink2|$hp['width'] = $file->getWidth( $page ); - } - if (html_h != Xof_img_size.Null) { // html_h exists; REF.MW:ImageHandler.php|normaliseParams|if ( isset( $params['height'] ) && $params['height'] != -1 ) { - if ( (long)html_w * (long)orig_h - > (long)html_h * (long)orig_w) // html ratio > orig ratio; recalc html_w; SEE:NOTE_2; NOTE: casting to long to prevent int overflow; [[File:A.png|9999999999x90px]]; DATE:2014-04-26 - html_w = Calc_w(orig_w, orig_h, html_h); - } - html_h = Scale_h(orig_w, orig_h, html_w); // calc html_h - if ( html_w >= orig_w // html >= orig - && ( Xof_ext_.Orig_file_is_img(orig_ext) // orig is img (ignore for svg, ogv, pdf, etc) - || ext_is_svg && exec_tid == Xof_exec_tid.Tid_wiki_file // limit to size if svg and [[File]] page - ) - ) { - file_is_orig = true; // use orig img (don't create thumb) - file_w = file_h = Size__same_as_orig; - if (Xop_lnki_type.Id_limits_large_size(lnki_type)) {// do not allow html_w > orig_w; REF.MW:Generic.php|normaliseParams - html_w = orig_w; - html_h = orig_h; + boolean ext_is_svg = orig_ext == Xof_ext_.Id_svg; + if (html_w == Xof_img_size.Null) { + if ( ext_is_svg // following strange MW logic; REF.MW:Linker.php|makeImageLink|If its a vector image, and user only specifies height, we don't want it to be limited by its "normal" width; DATE: 2013-11-26 + && html_h != Xof_img_size.Null) + html_w = Svg_max_width; + else + html_w = orig_w; // html_w missing >>> use orig_w; REF.MW:Linker.php|makeImageLink2|$hp['width'] = $file->getWidth( $page ); + } + if (html_h != Xof_img_size.Null) { // html_h exists; REF.MW:ImageHandler.php|normaliseParams|if ( isset( $params['height'] ) && $params['height'] != -1 ) { + if ( (long)html_w * (long)orig_h + > (long)html_h * (long)orig_w) // html ratio > orig ratio; recalc html_w; SEE:NOTE_2; NOTE: casting to long to prevent int overflow; [[File:A.png|9999999999x90px]]; DATE:2014-04-26 + html_w = Calc_w(orig_w, orig_h, html_h); + } + html_h = Scale_h(orig_w, orig_h, html_w); // calc html_h + if ( html_w >= orig_w // html >= orig + && ( Xof_ext_.Orig_file_is_img(orig_ext) // orig is img (ignore for svg, ogv, pdf, etc) + || ext_is_svg && exec_tid == Xof_exec_tid.Tid_wiki_file // limit to size if svg and [[File]] page + ) + ) { + file_is_orig = true; // use orig img (don't create thumb) + file_w = file_h = Size__same_as_orig; + if (Xop_lnki_type.Id_limits_large_size(lnki_type)) {// do not allow html_w > orig_w; REF.MW:Generic.php|normaliseParams + html_w = orig_w; + html_h = orig_h; + } + } + else { // html < orig + file_w = html_w; + file_h = html_h; } - } - else { // html < orig - file_w = html_w; - file_h = html_h; } } // private static boolean Calc_limit_size(int exec_tid, int lnki_type, int lnki_ext) { @@ -135,7 +139,7 @@ public class Xof_img_size { public static final int Null = -1; public static final int Thumb_width_img = 220, Thumb_width_ogv = 220; public static final double Upright_null = -1, Upright_default_marker = 0; // REF:MW: if ( isset( $fp['upright'] ) && $fp['upright'] == 0 ) - public static final int Size_null_deprecated = -1, Size_null = 0; // Size_null = 0, b/c either imageMagick / inkscape fails when -1 is passed + public static final int Size__neg1 = -1, Size_null = 0; // Size_null = 0, b/c either imageMagick / inkscape fails when -1 is passed public static final int Size__same_as_orig = -1; private static final int Svg_max_width = 2048; } diff --git a/400_xowa/src/gplx/xowa/files/Xof_img_size_tst.java b/400_xowa/src/gplx/xowa/files/Xof_img_size_tst.java index a3562c97d..d31c8d745 100644 --- a/400_xowa/src/gplx/xowa/files/Xof_img_size_tst.java +++ b/400_xowa/src/gplx/xowa/files/Xof_img_size_tst.java @@ -17,11 +17,12 @@ along with this program. If not, see . */ package gplx.xowa.files; import gplx.*; import gplx.xowa.*; import org.junit.*; import gplx.xowa.files.*; -public class Xof_img_size_tst { +public class Xof_img_size_tst { + private final Xof_img_size_fxt fxt = new Xof_img_size_fxt(); @Before public void init() { fxt.Reset(); fxt.Orig_(400, 200); - } private Xof_img_size_fxt fxt = new Xof_img_size_fxt(); + } @Test public void Lnki_lt_orig_null() {fxt.Lnki_type_(Xop_lnki_type.Id_null) .Lnki_(200, 100).Test_html(200, 100, Bool_.N);} // [[File:A.png|200px]] -> 200,100; File_is_orig = n @Test public void Lnki_lt_orig_thumb() {fxt.Lnki_type_(Xop_lnki_type.Id_thumb) .Lnki_(200, 100).Test_html(200, 100, Bool_.N);} // [[File:A.png|thumb|200px]] -> 200,100; File_is_orig = n @Test public void Lnki_lt_orig_frameless() {fxt.Lnki_type_(Xop_lnki_type.Id_frameless) .Lnki_(200, 100).Test_html(200, 100, Bool_.N);} // [[File:A.png|frameless|200px]] -> 200,100; File_is_orig = n @@ -77,6 +78,9 @@ public class Xof_img_size_tst { @Test public void Frame_and_thumb(){ // PURPOSE: frame and thumb should be treated as frame; Enm.Has(val, Id_frame) vs val == Id_frame; PAGE:en.w:History_of_Western_Civilization; DATE:2015-04-16 fxt.Lnki_type_(Enm_.Add_byte(Xop_lnki_type.Id_frame, Xop_lnki_type.Id_thumb)).Lnki_(200, -1).Test_html(400, 200, Bool_.Y); // mut return same as Lnki_lt_orig_frame above } + @Test public void Video__use_orig_w(){ // PURPOSE: video should use orig_w; DATE:2015-08-07 + fxt.Lnki_type_(Xop_lnki_type.Id_none).Lnki_ext_(Xof_ext_.Id_ogv).Lnki_(-1, -1).Orig_(500, 250).Test_html(500, 250, Bool_.N); + } } class Xof_img_size_fxt { private Xof_img_size img_size = new Xof_img_size(); diff --git a/400_xowa/src/gplx/xowa/files/Xof_lnki_time.java b/400_xowa/src/gplx/xowa/files/Xof_lnki_time.java index 78df0ef46..15f93c329 100644 --- a/400_xowa/src/gplx/xowa/files/Xof_lnki_time.java +++ b/400_xowa/src/gplx/xowa/files/Xof_lnki_time.java @@ -31,7 +31,7 @@ public class Xof_lnki_time { public static boolean Null_n(double v) {return v != Null;} public static final int Null_as_int = -1; - public static double Convert_to_xowa_thumbtime (int ext, double val) {return Xof_ext_.Id_supports_thumbtime(ext) ? val : Null;} + public static double Convert_to_xowa_thumbtime (int ext, double val) {return Xof_ext_.Id_supports_time(ext) ? val : Null;} public static int Convert_to_xowa_page (int ext, double val) {return Xof_ext_.Id_supports_page(ext) ? (int)val : Xof_lnki_page.Null;} public static double Convert_to_fsdb_thumbtime (int ext, double thumbtime, int page) { return page != Xof_lnki_page.Null diff --git a/400_xowa/src/gplx/xowa/files/Xof_url_bldr.java b/400_xowa/src/gplx/xowa/files/Xof_url_bldr.java index 350c356f8..4a24e9165 100644 --- a/400_xowa/src/gplx/xowa/files/Xof_url_bldr.java +++ b/400_xowa/src/gplx/xowa/files/Xof_url_bldr.java @@ -50,10 +50,11 @@ public class Xof_url_bldr { return Init(Bool_.N, Bool_.N, Byte_ascii.Slash, repo.Root_http() , repo.Mode_names()[mode], repo.Dir_depth(), repo.Gen_name_trg(ttl, md5, ext), md5, ext, mode, file_w, time, page); } - public Xof_url_bldr Init(boolean wmf_dir_hive, boolean wmf_protocol_is_file, byte dir_spr + private Xof_url_bldr Init(boolean wmf_dir_hive, boolean wmf_protocol_is_file, byte dir_spr , byte[] root, byte[] area, int md5_dir_depth , byte[] ttl, byte[] md5, Xof_ext ext - , byte file_mode, int file_w, double time, int page) { + , byte file_mode, int file_w, double time, int page + ) { this.wmf_dir_hive = wmf_dir_hive; this.wmf_protocol_is_file = wmf_protocol_is_file; this.dir_spr = dir_spr; this.root = root; this.area = area; this.md5_dir_depth = md5_dir_depth; this.ttl = ttl; this.md5 = md5; this.ext = ext; @@ -126,10 +127,12 @@ public class Xof_url_bldr { case Xof_ext_.Id_ogg: case Xof_ext_.Id_ogv: case Xof_ext_.Id_webm: + bfr.Add_int_variable(file_w); // add file_w; EX: "220"; PAGE:en.w:Alice_Brady; DATE:2015-08-06 + bfr.Add(Bry_px_dash); // add px; EX: "px-" if (Xof_lnki_time.Null_n(time)) - bfr.Add(Bry_seek).Add_str(Xof_lnki_time.X_str(time)).Add_byte(Byte_ascii.Dash);// add seek; EX: "seek%3D5-" + bfr.Add(Bry_seek).Add_str(Xof_lnki_time.X_str(time)).Add_byte(Byte_ascii.Dash);// add seek; EX: "seek%3D5-" else - bfr.Add(Bry_mid); // add mid; EX: "mid-" + bfr.Add_byte(Byte_ascii.Dash); // add mid; EX: "-"; NOTE: was "mid-"; DATE:2015-08-06 break; case Xof_ext_.Id_tif: case Xof_ext_.Id_tiff: @@ -148,7 +151,13 @@ public class Xof_url_bldr { bfr.Add(Bry_px_dash); // add px; EX: "px-" break; } - bfr.Add(encoder_src_http.Encode(ttl)); // add ttl again; EX: "A.png" + int ttl_len = ttl.length; + if (ttl_len > 160) { // long file name + bfr.Add(Bry_thumnbail_w_dot); + bfr.Add(ext.Ext()); + } + else + bfr.Add(encoder_src_http.Encode(ttl)); // add ttl again; EX: "A.png" switch (file_ext_id) { case Xof_ext_.Id_svg: case Xof_ext_.Id_bmp: @@ -178,7 +187,8 @@ public class Xof_url_bldr { } private Xof_url_bldr Clear() { root = area = ttl = md5 = null; - file_w = 0; time = Xof_lnki_time.Null; + file_w = Xof_img_size.Null; + time = Xof_lnki_time.Null; ext = null; bfr.Clear(); return this; @@ -186,7 +196,8 @@ public class Xof_url_bldr { public static final byte[] Bry_reg = Bry_.new_a7("reg.csv") , Bry_px = Bry_.new_a7("px"), Bry_px_dash = Bry_.new_a7("px-") - , Bry_thumb = Bry_.new_a7("thumb"), Bry_mid = Bry_.new_a7("mid-") + , Bry_thumb = Bry_.new_a7("thumb") + , Bry_thumnbail_w_dot = Bry_.new_a7("thumbnail.") ; private static final byte[] Bry_lossy_page = Bry_.new_a7("lossy-page"), Bry_page = Bry_.new_a7("page") diff --git a/400_xowa/src/gplx/xowa/files/Xof_url_bldr_tst.java b/400_xowa/src/gplx/xowa/files/Xof_url_bldr_tst.java index c9a2785c1..863735cc3 100644 --- a/400_xowa/src/gplx/xowa/files/Xof_url_bldr_tst.java +++ b/400_xowa/src/gplx/xowa/files/Xof_url_bldr_tst.java @@ -19,34 +19,44 @@ package gplx.xowa.files; import gplx.*; import gplx.xowa.*; import org.junit.*; import gplx.xowa.files.*; import gplx.xowa.files.repos.*; public class Xof_url_bldr_tst { 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/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();} + @Before public void init() {fxt.Clear();} + @Test public void Ogv() {fxt.Dir_spr_http_().Root_("http://test/").Md5_("d0").Ttl_("A.ogv").W_(220).Expd_src_("http://test/thumb/d/d0/A.ogv/220px--A.ogv.jpg").Test();} + @Test public void Ogv__seek() {fxt.Dir_spr_http_().Root_("http://test/").Md5_("d0").Ttl_("A.ogv").W_(220).Expd_src_("http://test/thumb/d/d0/A.ogv/220px-seek%3D5-A.ogv.jpg").Seek_(5).Test();} + @Test public void Ogv__no_w() {fxt.Dir_spr_http_().Root_("http://test/").Md5_("d0").Ttl_("A.ogv").W_( -1).Expd_src_("http://test/thumb/d/d0/A.ogv/-1px--A.ogv.jpg").Test();} // TODO: use orig_w, not -1 + @Test public void Xcf() {fxt.Dir_spr_http_().Root_("http://test/").Md5_("44").Ttl_("A.xcf").W_(220).Expd_src_("http://test/thumb/4/44/A.xcf/220px-A.xcf.png").Test();} + @Test public void Bmp() {fxt.Dir_spr_http_().Root_("http://test/").Md5_("70").Ttl_("A.bmp").W_(220).Expd_src_("http://test/thumb/7/70/A.bmp/220px-A.bmp.png").Test();} + @Test public void Pdf() {fxt.Dir_spr_http_().Root_("http://test/").Md5_("ef").Ttl_("A.pdf").W_(220).Expd_src_("http://test/thumb/e/ef/A.pdf/page1-220px-A.pdf.jpg").Test();} + @Test public void Pdf__page_2() {fxt.Dir_spr_http_().Root_("http://test/").Md5_("ef").Ttl_("A.pdf").W_(220).Expd_src_("http://test/thumb/e/ef/A.pdf/page2-220px-A.pdf.jpg").Page_(2).Test();} + @Test public void Long() { + String filename = String_.Repeat("A", 200) + ".png"; + fxt.Dir_spr_http_().Root_("http://test/").Md5_("14").Ttl_(filename).W_(220) + .Expd_src_("http://test/thumb/1/14/" + filename + "/220px-thumbnail.png") + .Test() + ; + } } class Xof_url_bldr_fxt { private final Xof_url_bldr url_bldr = new Xof_url_bldr(); - public Xof_url_bldr_fxt ini() {this.Clear(); return this;} + public Xof_url_bldr_fxt Clear() { + dir_spr = Byte_.Zero; ext = null; root = md5 = ttl = expd_src = null; + seek = Xof_lnki_time.Null; + page = Xof_lnki_page.Null; + w = Xof_img_size.Null; + return this; + } public Xof_url_bldr_fxt Dir_spr_http_() {return Dir_spr_(Byte_ascii.Slash);} public Xof_url_bldr_fxt Dir_spr_fsys_wnt_() {return Dir_spr_(Byte_ascii.Backslash);} public Xof_url_bldr_fxt Dir_spr_(byte v) {dir_spr = v; return this;} private byte dir_spr; public Xof_url_bldr_fxt Root_(String v) {root = v; return this;} private String root; public Xof_url_bldr_fxt Md5_(String v) {md5 = v; return this;} private String md5; public Xof_url_bldr_fxt Ttl_(String v) {ttl = v; ext = Xof_ext_.new_by_ttl_(Bry_.new_u8(v)); return this;} private String ttl; Xof_ext ext; + public Xof_url_bldr_fxt W_(int v) {this.w = v; return this;} private int w; public Xof_url_bldr_fxt Page_(int v) {page = v; return this;} private int page = Xof_lnki_page.Null; public Xof_url_bldr_fxt Seek_(int v) {seek = v; return this;} private double seek = Xof_lnki_time.Null; public Xof_url_bldr_fxt Expd_src_(String v) {expd_src = v; return this;} private String expd_src; - private void Clear() { - dir_spr = Byte_.Zero; ext = null; root = md5 = ttl = expd_src = null; - seek = Xof_lnki_time.Null; - page = Xof_lnki_page.Null; - } - public Xof_url_bldr_fxt tst() { + public Xof_url_bldr_fxt Test() { url_bldr.Init_by_root(Bry_.new_u8(root), dir_spr, Bool_.Y, Bool_.N, 2); - url_bldr.Init_by_itm (Xof_repo_itm_.Mode_thumb, Bry_.new_u8(ttl), Bry_.new_u8(md5), ext, 0, seek, page); + url_bldr.Init_by_itm (Xof_repo_itm_.Mode_thumb, Bry_.new_u8(ttl), Bry_.new_u8(md5), ext, w, 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 37e56dfff..2855e7755 100644 --- a/400_xowa/src/gplx/xowa/files/Xof_xfer_itm.java +++ b/400_xowa/src/gplx/xowa/files/Xof_xfer_itm.java @@ -78,7 +78,7 @@ public class Xof_xfer_itm implements Xof_file_itm { } public void Init_at_orig(byte orig_repo_id, byte[] orig_repo_name, byte[] orig_ttl, Xof_ext orig_ext, int orig_w, int orig_h, byte[] orig_redirect) { this.orig_repo_id = orig_repo_id; this.orig_repo_name = orig_repo_name; - this.orig_ttl = orig_ttl; this.orig_ttl_md5 = Xof_file_wkr_.Md5_(orig_ttl); + this.orig_ttl = orig_ttl; this.orig_ttl_md5 = Xof_file_wkr_.Md5(orig_ttl); this.orig_w = orig_w; this.orig_h = orig_h; this.orig_redirect = orig_redirect; if (Bry_.Len_gt_0(orig_redirect)) // redirect exists; EX: A.png redirected to B.png this.Orig_ttl_(orig_redirect); // update fsdb with atrs of B.png @@ -185,14 +185,14 @@ public class Xof_xfer_itm implements Xof_file_itm { if (meta_itm == null || trg_repo_itm == null) return false; if (meta_itm.Ptr_ttl_exists()) { lnki_ttl = meta_itm.Ptr_ttl(); - orig_ttl_md5 = Xof_file_wkr_.Md5_(lnki_ttl); + orig_ttl_md5 = Xof_file_wkr_.Md5(lnki_ttl); } boolean limit_size = !orig_ext.Id_is_svg() || (orig_ext.Id_is_svg() && caller_is_file_page); if (orig_ext.Id_is_media() && html_w < 1) // if media and no width, set to default; NOTE: must be set or else dynamic download will resize play button to small size; DATE:20121227 html_w = Xof_img_size.Thumb_width_ogv; if (!file_is_orig) { // file is thumb if (orig_ext.Id_is_video()) { // video is a special case; src is thumb_w but html_w / html_h is based on calc - html_orig_url = Trg_view_url(Xof_repo_itm_.Mode_orig, Xof_img_size.Size_null_deprecated); + html_orig_url = Trg_view_url(Xof_repo_itm_.Mode_orig, Xof_img_size.Size__neg1); if (meta_itm.Thumbs_indicates_oga() && orig_ext.Id_is_ogv()) {orig_ext = Xof_ext_.new_by_ext_(Xof_ext_.Bry_oga); return true;} // if audio, do not thumb; NOTE: must happen after html_orig_bry, b/c html must still be generated to auto-download files; NOTE: must change ext to oga b/c ogg may trigger video code elsewhere Xof_meta_thumb thumb = meta_itm.Thumbs_get_vid(Xof_lnki_time.X_int(lnki_time)); if (thumb != null) { @@ -204,7 +204,7 @@ public class Xof_xfer_itm implements Xof_file_itm { } } else { // regular thumb - html_orig_url = Trg_view_url(Xof_repo_itm_.Mode_orig, Xof_img_size.Size_null_deprecated); + html_orig_url = Trg_view_url(Xof_repo_itm_.Mode_orig, Xof_img_size.Size__neg1); if (orig_ext.Id_is_audio()) return true; // if audio, do not thumb; even if user requests thumb; Xof_meta_thumb[] thumbs = meta_itm.Thumbs(); int thumbs_len = thumbs.length; Xof_meta_thumb thumb = null; if (lnki_h > 0 && orig_w < 1 && thumbs_len > 0) { // if height is specified and no orig, then iterate over thumbs to find similar height; NOTE: this is a fallback case; orig_w/h is optimal; EX: c:Jacques-Louis David and diff --git a/400_xowa/src/gplx/xowa/files/Xow_file_mgr.java b/400_xowa/src/gplx/xowa/files/Xow_file_mgr.java index 7706f894a..9610d1995 100644 --- a/400_xowa/src/gplx/xowa/files/Xow_file_mgr.java +++ b/400_xowa/src/gplx/xowa/files/Xow_file_mgr.java @@ -117,10 +117,10 @@ public class Xow_file_mgr implements GfoInvkAble { public void Init_file_mgr_by_load(Xow_wiki wiki) { if (db_core != null) return; // already init'd this.db_core = Fsdb_db_mgr_.new_detect(wiki, wiki.Fsys_mgr().Root_dir(), wiki.Fsys_mgr().File_dir()); -// if (db_core == null) return; // no fsdb_core found; exit - if (db_core == null) { - db_core = Fsdb_db_mgr__v2_bldr.I.Get_or_make(wiki, false); - } + if ( db_core == null // "-file-core.xowa" not found + && !wiki.Data__core_mgr().Props().Layout_file().Tid_is_all() // DATE:2015-08-10 + ) + db_core = Fsdb_db_mgr__v2_bldr.I.Get_or_make(wiki, false); // make it this.version = Version_2; this.fsdb_mode = Xof_fsdb_mode.new_v2_gui(); orig_mgr.Init_by_wiki(wiki, fsdb_mode, db_core.File__orig_tbl_ary(), Xof_url_bldr.new_v2()); diff --git a/400_xowa/src/gplx/xowa/wmfs/Xow_wmf_api_wkr.java b/400_xowa/src/gplx/xowa/files/bins/Io_download_mgr.java similarity index 71% rename from 400_xowa/src/gplx/xowa/wmfs/Xow_wmf_api_wkr.java rename to 400_xowa/src/gplx/xowa/files/bins/Io_download_mgr.java index 71c45c50e..9db3451cb 100644 --- a/400_xowa/src/gplx/xowa/wmfs/Xow_wmf_api_wkr.java +++ b/400_xowa/src/gplx/xowa/files/bins/Io_download_mgr.java @@ -15,12 +15,8 @@ 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.wmfs; import gplx.*; import gplx.xowa.*; -import gplx.xowa.wmfs.data.*; -public interface Xow_wmf_api_wkr { - void Api_init(); - void Api_term(); - boolean Api_wiki_enabled(String wiki_domain); - String Api_qargs(); - boolean Api_exec(String wiki_domain, byte[] rslt); +package gplx.xowa.files.bins; import gplx.*; import gplx.xowa.*; import gplx.xowa.files.*; +import gplx.ios.*; +public interface Io_download_mgr { + Io_stream_rdr Download_as_rdr(String src); } diff --git a/400_xowa/src/gplx/xowa/files/bins/Io_download_mgr_.java b/400_xowa/src/gplx/xowa/files/bins/Io_download_mgr_.java new file mode 100644 index 000000000..29a449b4e --- /dev/null +++ b/400_xowa/src/gplx/xowa/files/bins/Io_download_mgr_.java @@ -0,0 +1,31 @@ +/* +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.files.bins; import gplx.*; import gplx.xowa.*; import gplx.xowa.files.*; +import gplx.ios.*; +public class Io_download_mgr_ { + public static Io_download_mgr new_system() {return new Io_download_mgr__system();} + public static Io_download_mgr__memory new_memory() {return new Io_download_mgr__memory();} +} +class Io_download_mgr__system implements Io_download_mgr { + private final IoEngine_xrg_downloadFil download_wkr = IoEngine_xrg_downloadFil.new_("", Io_url_.Empty); + public void Upload_data(String url, byte[] data) {throw Err_.new_unimplemented();} + public Io_stream_rdr Download_as_rdr(String url) { + download_wkr.Init(url, Io_url_.Empty); + return download_wkr.Exec_as_rdr(); + } +} diff --git a/400_xowa/src/gplx/xowa/files/bins/Io_download_mgr__memory.java b/400_xowa/src/gplx/xowa/files/bins/Io_download_mgr__memory.java new file mode 100644 index 000000000..52f8c9852 --- /dev/null +++ b/400_xowa/src/gplx/xowa/files/bins/Io_download_mgr__memory.java @@ -0,0 +1,28 @@ +/* +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.files.bins; import gplx.*; import gplx.xowa.*; import gplx.xowa.files.*; +import gplx.ios.*; +public class Io_download_mgr__memory implements Io_download_mgr { + private final Ordered_hash hash = Ordered_hash_.new_(); + public void Clear() {hash.Clear();} + public void Upload_data(String url, byte[] data) {hash.Add(url, data);} + public Io_stream_rdr Download_as_rdr(String url) { + byte[] data = (byte[])hash.Get_by(url); if (data == null) return Io_stream_rdr_.Noop; + return Io_stream_rdr_.mem_(data); + } +} 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 20f8ce5b4..8237a3a82 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 @@ -16,21 +16,38 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.files.bins; import gplx.*; import gplx.xowa.*; import gplx.xowa.files.*; -import gplx.ios.*; import gplx.core.threads.*; import gplx.xowa.files.fsdb.*; import gplx.xowa.files.repos.*; +import gplx.ios.*; import gplx.core.threads.*; +import gplx.xowa.apps.*; +import gplx.xowa.files.fsdb.*; import gplx.xowa.files.repos.*; +import gplx.xowa.wikis.*; public class Xof_bin_wkr__http_wmf implements Xof_bin_wkr { private final Xow_repo_mgr repo_mgr; private final IoEngine_xrg_downloadFil download_wkr; + private final Io_download_mgr download_mgr; private final Xof_url_bldr url_bldr = new Xof_url_bldr(); - public Xof_bin_wkr__http_wmf(Xow_repo_mgr repo_mgr, gplx.ios.IoEngine_xrg_downloadFil download_wkr) {this.repo_mgr = repo_mgr; this.download_wkr = download_wkr;} + public Xof_bin_wkr__http_wmf(Xow_repo_mgr repo_mgr, Io_download_mgr download_mgr, IoEngine_xrg_downloadFil download_wkr) { + this.repo_mgr = repo_mgr; this.download_mgr = download_mgr; this.download_wkr = download_wkr; + } public byte Tid() {return Xof_bin_wkr_.Tid_http_wmf;} public String Key() {return Xof_bin_wkr_.Key_http_wmf;} public boolean Resize_allowed() {return bin_wkr_resize;} public void Resize_allowed_(boolean v) {bin_wkr_resize = v;} private boolean bin_wkr_resize = true; public int Fail_timeout() {return fail_timeout;} public Xof_bin_wkr__http_wmf Fail_timeout_(int v) {fail_timeout = v; return this;} private int fail_timeout = 0; // NOTE: always default to 0; manually set to 1000 for fsdb_make only; DATE:2014-06-21 public Io_stream_rdr Get_as_rdr(Xof_fsdb_itm fsdb, boolean is_thumb, int w) { - Download_init(fsdb.Orig_repo_name(), fsdb.Orig_ttl(), fsdb.Orig_ttl_md5(), fsdb.Orig_ext(), is_thumb, w, fsdb.Lnki_time(), fsdb.Lnki_page(), Io_url_.Empty); - Io_stream_rdr rdr = download_wkr.Exec_as_rdr(); + String src = Make_src(fsdb.Orig_repo_name(), fsdb.Orig_ttl(), fsdb.Orig_ttl_md5(), fsdb.Orig_ext(), is_thumb, w, fsdb.Lnki_time(), fsdb.Lnki_page(), Io_url_.Empty); + Io_stream_rdr rdr = download_mgr.Download_as_rdr(src); boolean rv = rdr.Exists(); // NOTE: use Exists which detects for response_code 200, not content length > 0; DATE:2015-05-20 - if (!rv) Handle_error(); - fsdb.Fsdb_insert_y_(); + if (!rv) { + Handle_error(); + if (!rv && fsdb.Orig_repo_id() == Xof_repo_itm_.Repo_local) { // image is not found in local; check commons; occurs with bldr which relies on inaccurate data in image dumps; PAGE:en.w:Apollo_13; DATE:2015-08-05 + src = Make_src(Xow_domain_.Domain_bry_commons, fsdb.Orig_ttl(), fsdb.Orig_ttl_md5(), fsdb.Orig_ext(), is_thumb, w, fsdb.Lnki_time(), fsdb.Lnki_page(), Io_url_.Empty); + rdr = download_mgr.Download_as_rdr(src); + rv = rdr.Exists(); + if (rv) + fsdb.Change_repo(Xof_repo_itm_.Repo_remote, Xow_domain_.Domain_bry_commons); // set commons.wikimedia.org; DATE:2015-08-05 + else + Handle_error(); + } + } + if (rv) fsdb.Fsdb_insert_y_(); return rv ? rdr : Io_stream_rdr_.Noop; } public boolean Get_to_fsys(Xof_fsdb_itm fsdb, boolean is_thumb, int w, Io_url bin_url) { @@ -39,7 +56,7 @@ public class Xof_bin_wkr__http_wmf implements Xof_bin_wkr { return rv; } private boolean Get_to_fsys(byte[] orig_repo, byte[] orig_ttl, byte[] orig_md5, Xof_ext orig_ext, boolean lnki_is_thumb, int file_w, double lnki_time, int lnki_page, Io_url file_url) { - Download_init(orig_repo, orig_ttl, orig_md5, orig_ext, lnki_is_thumb, file_w, lnki_time, lnki_page, file_url); + Init_download(orig_repo, orig_ttl, orig_md5, orig_ext, lnki_is_thumb, file_w, lnki_time, lnki_page, file_url); boolean rv = download_wkr.Exec(); if (!rv) Handle_error(); return rv; @@ -48,16 +65,22 @@ public class Xof_bin_wkr__http_wmf implements Xof_bin_wkr { if (fail_timeout > 0) Thread_adp_.Sleep(fail_timeout); // as per WMF policy, pause 1 second for every cache miss; http://lists.wikimedia.org/pipermail/wikitech-l/2013-September/071948.html } - private void Download_init(byte[] orig_repo, byte[] orig_ttl, byte[] orig_md5, Xof_ext orig_ext, boolean lnki_is_thumb, int file_w, double lnki_time, int lnki_page, Io_url file_url) { + private void Init_download(byte[] orig_repo, byte[] orig_ttl, byte[] orig_md5, Xof_ext orig_ext, boolean lnki_is_thumb, int file_w, double lnki_time, int lnki_page, Io_url file_url) { byte mode = lnki_is_thumb ? Xof_repo_itm_.Mode_thumb : Xof_repo_itm_.Mode_orig; Xof_repo_pair repo_itm = repo_mgr.Repos_get_by_wiki(orig_repo); String src = url_bldr.Init_for_src_file(mode, repo_itm.Src(), orig_ttl, orig_md5, orig_ext, file_w, lnki_time, lnki_page).Xto_str(); download_wkr.Init(src, file_url); } + private String Make_src(byte[] orig_repo, byte[] orig_ttl, byte[] orig_md5, Xof_ext orig_ext, boolean lnki_is_thumb, int file_w, double lnki_time, int lnki_page, Io_url file_url) { + byte mode = lnki_is_thumb ? Xof_repo_itm_.Mode_thumb : Xof_repo_itm_.Mode_orig; + Xof_repo_pair repo_itm = repo_mgr.Repos_get_by_wiki(orig_repo); + return url_bldr.Init_for_src_file(mode, repo_itm.Src(), orig_ttl, orig_md5, orig_ext, file_w, lnki_time, lnki_page).Xto_str(); + } public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { if (ctx.Match(k, Invk_fail_timeout_)) fail_timeout = m.ReadInt("v"); else return GfoInvkAble_.Rv_unhandled; return this; } private static final String Invk_fail_timeout_ = "fail_timeout_"; - public static Xof_bin_wkr__http_wmf new_(Xow_wiki wiki) {return new Xof_bin_wkr__http_wmf(wiki.File__repo_mgr(), wiki.App().Wmf_mgr().Download_wkr().Download_xrg());} + public static Xof_bin_wkr__http_wmf new_(Xow_wiki wiki) {return new_(wiki, Io_download_mgr_.new_system());} + public static Xof_bin_wkr__http_wmf new_(Xow_wiki wiki, Io_download_mgr download_mgr) {return new Xof_bin_wkr__http_wmf(wiki.File__repo_mgr(), download_mgr, wiki.App().Wmf_mgr().Download_wkr().Download_xrg());} } diff --git a/400_xowa/src/gplx/xowa/files/bins/Xof_bin_wkr__http_wmf__tst.java b/400_xowa/src/gplx/xowa/files/bins/Xof_bin_wkr__http_wmf__tst.java new file mode 100644 index 000000000..2944ebb0f --- /dev/null +++ b/400_xowa/src/gplx/xowa/files/bins/Xof_bin_wkr__http_wmf__tst.java @@ -0,0 +1,67 @@ +/* +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.files.bins; import gplx.*; import gplx.xowa.*; import gplx.xowa.files.*; +import org.junit.*; import gplx.ios.*; import gplx.xowa.files.repos.*; +public class Xof_bin_wkr__http_wmf__tst { + private final Xof_bin_wkr__http_wmf__fxt fxt = new Xof_bin_wkr__http_wmf__fxt(); + @Before public void init() {fxt.Clear();} + @Test public void Basic() { + fxt.Init__Http("mem/http/commons.wikimedia.org/thumb/7/70/A.png/220px-A.png", "test_data"); + fxt.Exec__Get_as_rdr(fxt.Fsdb_itm_mkr().Lnki__en_w("A.png").Orig__commons__lnki(), Bool_.Y, 220); + fxt.Test__Get_as_rdr__rdr("test_data"); + } + @Test public void Enwiki_fails__fallback_to_commons() { + fxt.Init__Http("mem/http/commons.wikimedia.org/thumb/7/70/A.png/220px-A.png", "test_data"); // put file in commons + Xof_fsdb_itm fsdb_itm = fxt.Fsdb_itm_mkr().Lnki__en_w("A.png").Orig__enwiki__lnki().Make(); + fxt.Exec__Get_as_rdr(fsdb_itm, Bool_.Y, 220); // look in enwiki + fxt.Test__Get_as_rdr__rdr("test_data"); // test that enwiki tries commons again + Tfds.Eq_str("commons.wikimedia.org", fsdb_itm.Orig_repo_name(), "repo_name"); // test that it's now commons + Tfds.Eq_byte(Xof_repo_itm_.Repo_remote, fsdb_itm.Orig_repo_id(), "repo_tid"); // test that it's now commons + } + @Test public void Long_filename_becomes_thumbnail() { + String filename = String_.Repeat("A", 200) + ".png"; + fxt.Init__Http("mem/http/commons.wikimedia.org/thumb/1/14/" + filename + "/220px-thumbnail.png", "test_data"); // add file as "thumbnail.png" + Xof_fsdb_itm fsdb_itm = fxt.Fsdb_itm_mkr().Lnki__en_w(filename).Orig__enwiki__lnki().Make(); + fxt.Exec__Get_as_rdr(fsdb_itm, Bool_.Y, 220); // look in enwiki + fxt.Test__Get_as_rdr__rdr("test_data"); // test that file is there + } +} +class Xof_bin_wkr__http_wmf__fxt { + private final Xof_bin_wkr__http_wmf wkr; + private final Io_download_mgr__memory download_mgr; + private Io_stream_rdr get_as_rdr__rdr; + public Xof_fsdb_itm_fxt Fsdb_itm_mkr() {return fsdb_itm_mkr;} private final Xof_fsdb_itm_fxt fsdb_itm_mkr = new Xof_fsdb_itm_fxt(); + public Xof_bin_wkr__http_wmf__fxt() { + Xoae_app app = Xoa_app_fxt.app_(); + Xowe_wiki wiki = Xoa_app_fxt.wiki_tst_(app); + Xoa_app_fxt.repo2_(app, wiki); + this.download_mgr = Io_download_mgr_.new_memory(); + this.wkr = Xof_bin_wkr__http_wmf.new_(wiki, download_mgr); + } + public void Clear() { + download_mgr.Clear(); + } + public void Init__Http(String url, String data) {download_mgr.Upload_data(url, Bry_.new_u8(data));} + public void Exec__Get_as_rdr(Xof_fsdb_itm_fxt fsdb_itm_mkr, boolean is_thumb, int w) {Exec__Get_as_rdr(fsdb_itm_mkr.Make(), is_thumb, w);} + public void Exec__Get_as_rdr(Xof_fsdb_itm fsdb_itm , boolean is_thumb, int w) { + this.get_as_rdr__rdr = wkr.Get_as_rdr(fsdb_itm, is_thumb, w); + } + public void Test__Get_as_rdr__rdr(String expd) { + Tfds.Eq_str(expd, Io_stream_rdr_.Load_all_as_str(get_as_rdr__rdr), "rdr_contents"); + } +} diff --git a/400_xowa/src/gplx/xowa/files/caches/Xofc_fil_mgr.java b/400_xowa/src/gplx/xowa/files/caches/Xofc_fil_mgr.java index 7d0491bc0..0e604ebf9 100644 --- a/400_xowa/src/gplx/xowa/files/caches/Xofc_fil_mgr.java +++ b/400_xowa/src/gplx/xowa/files/caches/Xofc_fil_mgr.java @@ -85,7 +85,7 @@ class Xofc_fil_mgr { long cur_size = 0, actl_size = 0; Xof_url_bldr url_bldr = new Xof_url_bldr(); List_adp deleted = List_adp_.new_(); - tbl.Conn().Txn_bgn(); + tbl.Conn().Txn_bgn("user__file_cache__compress"); long compress_to = cfg_mgr.Cache_min(); for (int i = 0; i < len; ++i) { Xofc_fil_itm itm = (Xofc_fil_itm)hash.Get_at(i); @@ -124,7 +124,7 @@ class Xofc_fil_mgr { wiki.Init_assert(); Xof_repo_itm trg_repo = repo_mgr.Get_by_primary(wiki_domain); byte[] ttl = itm.Name(); - byte[] md5 = Xof_file_wkr_.Md5_(ttl); + byte[] md5 = Xof_file_wkr_.Md5(ttl); int itm_ext_id = itm.Ext().Id(); Io_url fil_url = url_bldr.Init_for_trg_file(mode_id, trg_repo, ttl, md5, itm.Ext(), itm.W() , Xof_lnki_time.Convert_to_xowa_thumbtime (itm_ext_id, itm.Time()) diff --git a/400_xowa/src/gplx/xowa/files/caches/Xou_cache_mgr.java b/400_xowa/src/gplx/xowa/files/caches/Xou_cache_mgr.java index 1d682538d..375d0907d 100644 --- a/400_xowa/src/gplx/xowa/files/caches/Xou_cache_mgr.java +++ b/400_xowa/src/gplx/xowa/files/caches/Xou_cache_mgr.java @@ -100,7 +100,7 @@ public class Xou_cache_mgr { synchronized (thread_lock) { Db_conn conn = cache_tbl.Conn(); try { - conn.Txn_bgn(); + conn.Txn_bgn("user__file_cache__save"); int len = hash.Count(); for (int i = 0; i < len; ++i) { Xou_cache_itm itm = (Xou_cache_itm)hash.Get_at(i); @@ -136,14 +136,16 @@ public class Xou_cache_mgr { for (int i = 0; i < len; ++i) { // iterate and find items to delete Xou_cache_grp grp = (Xou_cache_grp)grp_hash.Get_at(i); fsys_size_temp = fsys_size_calc + grp.File_size(); - if (fsys_size_temp > reduce_to) // fsys_size_cur exceeded; mark itm for deletion + if ( fsys_size_temp > reduce_to // fsys_size_cur exceeded; mark itm for deletion + || fsys_size_temp == -1 // fsys_size sometimes -1; note -1 b/c file is missing; should fix, but for now, consider -1 size deleted; DATE:2015-08-05 + ) deleted.Add(grp); else fsys_size_calc = fsys_size_temp; } len = deleted.Count(); Db_conn conn = cache_tbl.Conn(); - conn.Txn_bgn(); + conn.Txn_bgn("user__file_cache__delete"); for (int i = 0; i < len; i++) { // iterate and delete Xou_cache_grp grp = (Xou_cache_grp)deleted.Get_at(i); grp.Delete(hash, cache_tbl); diff --git a/400_xowa/src/gplx/xowa/files/cnvs/Xof_img_wkr_resize_img_mok.java b/400_xowa/src/gplx/xowa/files/cnvs/Xof_img_wkr_resize_img_mok.java index 784469b6c..0a323ccd8 100644 --- a/400_xowa/src/gplx/xowa/files/cnvs/Xof_img_wkr_resize_img_mok.java +++ b/400_xowa/src/gplx/xowa/files/cnvs/Xof_img_wkr_resize_img_mok.java @@ -23,7 +23,7 @@ public class Xof_img_wkr_resize_img_mok implements Xof_img_wkr_resize_img { int src_w = src_size.Width(), src_h = src_size.Height(); if (trg_w < 1) throw Err_.new_wo_type("trg_w must be > 0", "trg_w", trg_w); if (trg_h < 1) trg_h = Xof_xfer_itm_.Scale_h(src_w, src_h, trg_w); - Io_mgr.I.SaveFilStr(trg, SizeAdp_.new_(trg_w, trg_h).XtoStr()); + Io_mgr.I.SaveFilStr(trg, SizeAdp_.new_(trg_w, trg_h).To_str()); return true; } public static final Xof_img_wkr_resize_img_mok _ = new Xof_img_wkr_resize_img_mok(); Xof_img_wkr_resize_img_mok() {} diff --git a/400_xowa/src/gplx/xowa/files/fsdb/fs_roots/Fs_root_dir_tst.java b/400_xowa/src/gplx/xowa/files/fsdb/fs_roots/Fs_root_dir_tst.java index 7e42d0d45..d15022b27 100644 --- a/400_xowa/src/gplx/xowa/files/fsdb/fs_roots/Fs_root_dir_tst.java +++ b/400_xowa/src/gplx/xowa/files/fsdb/fs_roots/Fs_root_dir_tst.java @@ -61,7 +61,7 @@ class Fs_root_dir_fxt { } public static void Save_img(String url, int w, int h) { gplx.gfui.SizeAdp img_size = gplx.gfui.SizeAdp_.new_(w, h); - Io_mgr.I.SaveFilStr(url, img_size.XtoStr()); + Io_mgr.I.SaveFilStr(url, img_size.To_str()); } public void Test_xto_fil_bry(String url_str, String expd) { Io_url url = Io_url_.new_fil_(url_str); diff --git a/400_xowa/src/gplx/xowa/files/imgs/Xof_img_wkr_convert_djvu_to_tiff_.java b/400_xowa/src/gplx/xowa/files/imgs/Xof_img_wkr_convert_djvu_to_tiff_.java index 20f65eaf8..0c8b837b7 100644 --- a/400_xowa/src/gplx/xowa/files/imgs/Xof_img_wkr_convert_djvu_to_tiff_.java +++ b/400_xowa/src/gplx/xowa/files/imgs/Xof_img_wkr_convert_djvu_to_tiff_.java @@ -30,7 +30,7 @@ class Xof_img_wkr_convert_djvu_to_tiff_app implements Xof_img_wkr_convert_djvu_t class Xof_img_wkr_convert_djvu_to_tiff_mok implements Xof_img_wkr_convert_djvu_to_tiff { public Xof_img_wkr_convert_djvu_to_tiff_mok(int w, int h) {this.w = w; this.h = h;} private int w, h; public boolean Exec(Io_url src, Io_url trg) { - Io_mgr.I.SaveFilStr(trg, gplx.gfui.SizeAdp_.new_(w, h).XtoStr()); + Io_mgr.I.SaveFilStr(trg, gplx.gfui.SizeAdp_.new_(w, h).To_str()); return true; } } diff --git a/400_xowa/src/gplx/xowa/files/origs/Xof_orig_wkr__xo_meta.java b/400_xowa/src/gplx/xowa/files/origs/Xof_orig_wkr__xo_meta.java index 43e3eefef..d37c50618 100644 --- a/400_xowa/src/gplx/xowa/files/origs/Xof_orig_wkr__xo_meta.java +++ b/400_xowa/src/gplx/xowa/files/origs/Xof_orig_wkr__xo_meta.java @@ -25,7 +25,7 @@ public class Xof_orig_wkr__xo_meta implements Xof_orig_wkr { public byte Tid() {return Xof_orig_wkr_.Tid_xowa_meta;} public void Find_by_list(Ordered_hash rv, List_adp itms) {Xof_orig_wkr_.Find_by_list(this, rv, itms);} public Xof_orig_itm Find_as_itm(byte[] ttl, int list_idx, int list_len) { - byte[] md5 = Xof_file_wkr_.Md5_(ttl); + byte[] md5 = Xof_file_wkr_.Md5(ttl); url_bfr.Add(wiki_meta_dir.RawBry()) // /xowa/file/#meta/simple.wikipedia.org/ .Add_byte(md5[0]).Add_byte(dir_spr_byte) // 0/ .Add_byte(md5[1]).Add_byte(dir_spr_byte) // 6/ diff --git a/400_xowa/src/gplx/xowa/files/repos/Xowe_repo_mgr.java b/400_xowa/src/gplx/xowa/files/repos/Xowe_repo_mgr.java index c8c3ae2f8..487baaabb 100644 --- a/400_xowa/src/gplx/xowa/files/repos/Xowe_repo_mgr.java +++ b/400_xowa/src/gplx/xowa/files/repos/Xowe_repo_mgr.java @@ -95,7 +95,7 @@ public class Xowe_repo_mgr implements Xow_repo_mgr, GfoInvkAble { } byte[] Xfer_by_meta__find_main_ptr(Xof_meta_itm meta_itm, Xof_xfer_itm xfer_itm) { byte[] redirect = meta_itm.Ptr_ttl(); int redirect_tries = 0; - byte[] md5 = Xof_file_wkr_.Md5_(redirect); + byte[] md5 = Xof_file_wkr_.Md5(redirect); while (true) { boolean found = page_finder.Locate(tmp_rslt, repos, redirect); if (!found) return null; diff --git a/400_xowa/src/gplx/xowa/files/xfers/Xof_xfer_mgr.java b/400_xowa/src/gplx/xowa/files/xfers/Xof_xfer_mgr.java index fd29a0632..4346ea8b5 100644 --- a/400_xowa/src/gplx/xowa/files/xfers/Xof_xfer_mgr.java +++ b/400_xowa/src/gplx/xowa/files/xfers/Xof_xfer_mgr.java @@ -73,8 +73,8 @@ public class Xof_xfer_mgr { } // BLOCK: orig; get orig for convert; note that Img_download will not download file again if src exists - src_str = this.Src_url(src_repo, Xof_repo_itm_.Mode_orig, Xof_img_size.Size_null_deprecated); - trg_url = this.Trg_url(trg_repo, Xof_repo_itm_.Mode_orig, Xof_img_size.Size_null_deprecated); + src_str = this.Src_url(src_repo, Xof_repo_itm_.Mode_orig, Xof_img_size.Size__neg1); + trg_url = this.Trg_url(trg_repo, Xof_repo_itm_.Mode_orig, Xof_img_size.Size__neg1); if (!Img_download(src_str, trg_url, false)) return false; trg_url = rslt.Trg(); @@ -114,7 +114,7 @@ public class Xof_xfer_mgr { } if (!Bry_.Eq(rslts.Orig_page(), orig_ttl)) { orig_ttl = rslts.Orig_page(); - orig_ttl_md5 = Xof_file_wkr_.Md5_(orig_ttl); + orig_ttl_md5 = Xof_file_wkr_.Md5(orig_ttl); meta_itm.Ptr_ttl_(orig_ttl); } meta_itm.Vrtl_repo_(xfer_itm.Orig_repo_id()); @@ -138,7 +138,7 @@ public class Xof_xfer_mgr { if (!wmf_api_found) return false; // not found in wmf_api; exit now } else if (src_repo.Tarball()) { - String src_str = this.Src_url(src_repo, Xof_repo_itm_.Mode_orig, Xof_img_size.Size_null_deprecated); + String src_str = this.Src_url(src_repo, Xof_repo_itm_.Mode_orig, Xof_img_size.Size__neg1); meta_itm.Orig_exists_(Xof_meta_itm.Exists_unknown); // mark exists unknown; note need to assertively mark unknown b/c it may have been marked n in previous pass through multiple repos; DATE:20121227 meta_itm.Vrtl_repo_(Xof_meta_itm.Repo_unknown); // mark repo unknown; if (!Cmd_query_size(Io_url_.new_fil_(src_str))) { @@ -256,8 +256,8 @@ public class Xof_xfer_mgr { } boolean Make_other() { if (!Orig_max_download() && !force_orig) return false; - String src_str = this.Src_url(src_repo, Xof_repo_itm_.Mode_orig, Xof_img_size.Size_null_deprecated); - Io_url trg_url = this.Trg_url(trg_repo, Xof_repo_itm_.Mode_orig, Xof_img_size.Size_null_deprecated); + String src_str = this.Src_url(src_repo, Xof_repo_itm_.Mode_orig, Xof_img_size.Size__neg1); + Io_url trg_url = this.Trg_url(trg_repo, Xof_repo_itm_.Mode_orig, Xof_img_size.Size__neg1); return Cmd_download(src_str, trg_url, true); } boolean Orig_max_download() { diff --git a/400_xowa/src/gplx/xowa/files/xfers/Xof_xfer_queue_html_cases_tst.java b/400_xowa/src/gplx/xowa/files/xfers/Xof_xfer_queue_html_cases_tst.java index 917d63d69..27ea8af86 100644 --- a/400_xowa/src/gplx/xowa/files/xfers/Xof_xfer_queue_html_cases_tst.java +++ b/400_xowa/src/gplx/xowa/files/xfers/Xof_xfer_queue_html_cases_tst.java @@ -49,7 +49,7 @@ public class Xof_xfer_queue_html_cases_tst { @Test public void Ogg_vid_thumb() { fxt .ini_page_create_commons ("File:A.ogg"); fxt .Lnki_orig_("A.ogg") - .Src( fxt.img_("mem/src/commons.wikimedia.org/thumb/4/42/A.ogg/mid-A.ogg.jpg", 300, 40)) + .Src( fxt.img_("mem/src/commons.wikimedia.org/thumb/4/42/A.ogg/-1px--A.ogg.jpg", 300, 40)) .Trg( fxt.img_("mem/trg/commons.wikimedia.org/fit/4/2/A.ogg/300px.jpg", 300, 40) , fxt.reg_("mem/xowa/file/#meta/en.wikipedia.org/4/42.csv", "A.ogg|0||0?0,0|1?300,40") ); @@ -234,7 +234,7 @@ public class Xof_xfer_queue_html_cases_tst { fxt.Src_en_wiki_repo().Ext_rules().Get_or_new(Xof_ext_.Bry_ogv).View_max_(0); Io_mgr.I.SaveFilStr("mem/xowa/file/#meta/en.wikipedia.org/d/d0.csv", "A.ogv|0||2?0,0|1?300,40\n"); // simulate (a) fxt .Lnki_("A.ogv", true, -1, -1, -1, 5) - .Src( fxt.img_("mem/src/commons.wikimedia.org/thumb/d/d0/A.ogv/seek%3D5-A.ogv.jpg", 300, 40) + .Src( fxt.img_("mem/src/commons.wikimedia.org/thumb/d/d0/A.ogv/-1px-seek%3D5-A.ogv.jpg", 300, 40) ) .Trg( fxt.img_("mem/trg/commons.wikimedia.org/fit/d/0/A.ogv/300px@5.jpg", 300, 40) , fxt.reg_("mem/xowa/file/#meta/en.wikipedia.org/d/d0.csv", "A.ogv|0||2?0,0|1?300,40@5") @@ -246,7 +246,7 @@ public class Xof_xfer_queue_html_cases_tst { fxt .ini_page_create_commons ("File:A.webm"); fxt .Lnki_thumb_("A.webm", 220) .Src( fxt.ogg_("mem/src/commons.wikimedia.org/3/34/A.webm") - , fxt.img_("mem/src/commons.wikimedia.org/thumb/3/34/A.webm/mid-A.webm.jpg", 300, 40) + , fxt.img_("mem/src/commons.wikimedia.org/thumb/3/34/A.webm/220px--A.webm.jpg", 300, 40) ) .Trg( fxt.ogg_("mem/trg/commons.wikimedia.org/raw/3/4/A.webm") , fxt.img_("mem/trg/commons.wikimedia.org/fit/3/4/A.webm/300px.jpg", 300, 40) @@ -257,7 +257,7 @@ public class Xof_xfer_queue_html_cases_tst { @Test public void Ogv_thumb() {// d00d1d5019e37cc219a91a2f8ad47bfe fxt .ini_page_create_commons ("File:A.ogv"); fxt .Lnki_orig_("A.ogv") - .Src( fxt.img_("mem/src/commons.wikimedia.org/thumb/d/d0/A.ogv/mid-A.ogv.jpg", 300, 40)) + .Src( fxt.img_("mem/src/commons.wikimedia.org/thumb/d/d0/A.ogv/-1px--A.ogv.jpg", 300, 40)) .Trg( fxt.img_("mem/trg/commons.wikimedia.org/fit/d/0/A.ogv/300px.jpg", 300, 40) , fxt.reg_("mem/xowa/file/#meta/en.wikipedia.org/d/d0.csv", "A.ogv|0||0?0,0|1?300,40") ) @@ -269,7 +269,7 @@ public class Xof_xfer_queue_html_cases_tst { } @Test public void Thumbtime_ignored_if_non_media() { // PURPOSE: ignore thumbtime if not media; PAGE:en.w:Moon; EX:[[File:A.png|thumbtime=0.02]] DATE:2014-07-22 fxt .ini_page_create_en_wiki("File:A.png"); - fxt .Lnki_("A.png", true, 90, Xof_img_size.Size_null_deprecated, Xof_img_size.Size_null_deprecated, 2) // thumbtime of 2 specified; will be ignored below + fxt .Lnki_("A.png", true, 90, Xof_img_size.Size__neg1, Xof_img_size.Size__neg1, 2) // thumbtime of 2 specified; will be ignored below .Src( fxt.img_("mem/src/en.wikipedia.org/thumb/7/70/A.png/90px-A.png", 90, 80)) .Trg( fxt.img_("mem/trg/en.wikipedia.org/fit/7/0/A.png/90px.png", 90, 80) , fxt.reg_("mem/xowa/file/#meta/en.wikipedia.org/7/70.csv", "A.png|y||2?0,0|1?90,80") diff --git a/400_xowa/src/gplx/xowa/files/xfers/Xof_xfer_queue_html_fxt.java b/400_xowa/src/gplx/xowa/files/xfers/Xof_xfer_queue_html_fxt.java index 295415468..6653f6e48 100644 --- a/400_xowa/src/gplx/xowa/files/xfers/Xof_xfer_queue_html_fxt.java +++ b/400_xowa/src/gplx/xowa/files/xfers/Xof_xfer_queue_html_fxt.java @@ -25,8 +25,8 @@ public class Xof_xfer_queue_html_fxt extends Xof_xfer_queue_base_fxt { super.Clear(src_repo_is_wmf); this.Api_size().Clear(); } - public Xof_xfer_queue_html_fxt Lnki_orig_ (String lnki_ttl) {return Lnki_(lnki_ttl, Bool_.N, Xof_img_size.Size_null_deprecated, Xof_img_size.Size_null_deprecated, Xop_lnki_tkn.Upright_null, Xof_lnki_time.Null_as_int);} - public Xof_xfer_queue_html_fxt Lnki_thumb_(String lnki_ttl, int lnki_w) {return Lnki_(lnki_ttl, Bool_.Y, lnki_w, Xof_img_size.Size_null_deprecated, Xop_lnki_tkn.Upright_null, Xof_lnki_time.Null_as_int);} + public Xof_xfer_queue_html_fxt Lnki_orig_ (String lnki_ttl) {return Lnki_(lnki_ttl, Bool_.N, Xof_img_size.Size__neg1, Xof_img_size.Size__neg1, Xop_lnki_tkn.Upright_null, Xof_lnki_time.Null_as_int);} + public Xof_xfer_queue_html_fxt Lnki_thumb_(String lnki_ttl, int lnki_w) {return Lnki_(lnki_ttl, Bool_.Y, lnki_w, Xof_img_size.Size__neg1, Xop_lnki_tkn.Upright_null, Xof_lnki_time.Null_as_int);} public Xof_xfer_queue_html_fxt Lnki_thumb_(String lnki_ttl, int lnki_w, int lnki_h) {return Lnki_(lnki_ttl, Bool_.Y, lnki_w, lnki_h, Xop_lnki_tkn.Upright_null, Xof_lnki_time.Null_as_int);} public Xof_xfer_queue_html_fxt Lnki_(String lnki_ttl, boolean thumb, int lnki_w, int lnki_h, double upright, int seek_time) { // NOTE: only one xfer_itm; supports one Lnki_ per test only Xowe_wiki wiki = this.En_wiki(); diff --git a/400_xowa/src/gplx/xowa/files/xfers/Xof_xfer_queue_html_wmf_api_tst.java b/400_xowa/src/gplx/xowa/files/xfers/Xof_xfer_queue_html_wmf_api_tst.java index bb29145d5..0c3a6f3f7 100644 --- a/400_xowa/src/gplx/xowa/files/xfers/Xof_xfer_queue_html_wmf_api_tst.java +++ b/400_xowa/src/gplx/xowa/files/xfers/Xof_xfer_queue_html_wmf_api_tst.java @@ -158,7 +158,7 @@ public class Xof_xfer_queue_html_wmf_api_tst { @Test public void Imap() { // PURPOSE: check that imap downloads orig, even when thumb is requested; DATE:2014-08-08 fxt .ini_page_create_commons("File:A.png"); fxt .ini_page_api("commons", "A.png", "", 180, 160); - fxt .Lnki_("A.png", true, 90, Xof_img_size.Size_null_deprecated, Xof_img_size.Size_null_deprecated, Xof_lnki_time.Null_as_int); // thumbtime of 2 specified; will be ignored below + fxt .Lnki_("A.png", true, 90, Xof_img_size.Size__neg1, Xof_img_size.Size__neg1, Xof_lnki_time.Null_as_int); // thumbtime of 2 specified; will be ignored below fxt .Xfer_itm().Html_elem_tid_(Xof_html_elem.Tid_imap); fxt .Src( fxt.img_("mem/src/commons.wikimedia.org/thumb/7/70/A.png/90px-A.png", 90, 80)) .Trg( fxt.img_("mem/trg/commons.wikimedia.org/fit/7/0/A.png/90px.png", 90, 80) diff --git a/400_xowa/src/gplx/xowa/gui/Xoa_gui_mgr.java b/400_xowa/src/gplx/xowa/gui/Xoa_gui_mgr.java index e6abf7346..9a70ac06b 100644 --- a/400_xowa/src/gplx/xowa/gui/Xoa_gui_mgr.java +++ b/400_xowa/src/gplx/xowa/gui/Xoa_gui_mgr.java @@ -18,20 +18,21 @@ along with this program. If not, see . package gplx.xowa.gui; import gplx.*; import gplx.xowa.*; import gplx.gfui.*; import gplx.xowa.specials.search.*; import gplx.xowa.gui.menus.*; import gplx.xowa.gui.cmds.*; import gplx.xowa.cfgs.gui.*; import gplx.xowa.users.*; import gplx.xowa.gui.bnds.*; import gplx.xowa.gui.views.*; import gplx.xowa.gui.urls.url_macros.*; +import gplx.xowa.gui.views.boots.*; public class Xoa_gui_mgr implements GfoEvObj, GfoInvkAble { public Xoa_gui_mgr(Xoae_app app) { - evMgr = GfoEvMgr.new_(this); + this.ev_mgr = GfoEvMgr.new_(this); this.app = app; - browser_win = new Xog_win_itm(app, this); + this.browser_win = new Xog_win_itm(app, this); bnd_mgr = new Xog_bnd_mgr(browser_win); win_cfg = new Xocfg_win(app); html_mgr = new Xog_html_mgr(app); menu_mgr = new Xog_menu_mgr(this); search_suggest_mgr = new Xog_search_suggest_mgr(this); } - public GfoEvMgr EvMgr() {return evMgr;} private GfoEvMgr evMgr; + public GfoEvMgr EvMgr() {return ev_mgr;} private GfoEvMgr ev_mgr; public Xoae_app App() {return app;} private Xoae_app app; - public Xog_win_itm Browser_win() {return browser_win;} private Xog_win_itm browser_win; + public Xog_win_itm Browser_win() {return browser_win;} private final Xog_win_itm browser_win; public IptCfgRegy Ipt_cfgs() {return ipt_cfgs;} IptCfgRegy ipt_cfgs = new IptCfgRegy(); public Xog_bnd_mgr Bnd_mgr() {return bnd_mgr;} private Xog_bnd_mgr bnd_mgr; public Gfui_kit Kit() {return kit;} private Gfui_kit kit = Gfui_kit_.Mem(); @@ -78,7 +79,7 @@ public class Xoa_gui_mgr implements GfoEvObj, GfoInvkAble { public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { if (ctx.Match(k, Invk_kit)) return kit; else if (ctx.Match(k, Invk_kit_)) this.kit = Gfui_kit_.Get_by_key(m.ReadStrOr("v", Gfui_kit_.Swt().Key())); - else if (ctx.Match(k, Invk_run)) Run(); + else if (ctx.Match(k, Invk_run)) Run(RlsAble_.Null); else if (ctx.Match(k, Invk_browser_type)) kit.Cfg_set("HtmlBox", "BrowserType", gplx.gfui.Swt_kit.Cfg_Html_BrowserType_parse(m.ReadStr("v"))); else if (ctx.Match(k, Invk_xul_runner_path_)) kit.Cfg_set("HtmlBox", "XulRunnerPath", Bry_fmtr_eval_mgr_.Eval_url(app.Url_cmd_eval(), m.ReadBry("v")).Xto_api()); else if (ctx.Match(k, Invk_bnds)) return bnd_mgr; @@ -100,7 +101,7 @@ public class Xoa_gui_mgr implements GfoEvObj, GfoInvkAble { , Invk_main_win = "main_win", Invk_browser_win = "browser_win", Invk_bnds = "bnds" , Invk_bindings = "bindings", Invk_win_opts = "win_opts", Invk_layout = "layout", Invk_html = "html" , Invk_search_suggest = "search_suggest", Invk_menus = "menus", Invk_cmds = "cmds", Invk_url_macros = "url_macros"; - public void Run() { + public void Run(RlsAble splash_win) { Gfo_log_bfr log_bfr = app.Log_bfr(); try { Xoa_gui_mgr ui_mgr = app.Gui_mgr(); @@ -110,6 +111,7 @@ public class Xoa_gui_mgr implements GfoEvObj, GfoInvkAble { Xog_win_itm_.Show_win(main_win); log_bfr.Add("app.gui.win_load.done"); Xog_tab_itm_read_mgr.Launch(main_win); app.Log_wtr().Log_to_session_direct(log_bfr.Xto_str()); + splash_win.Rls(); kit.Kit_run(); // NOTE: enters thread-loop } catch (Exception e) { app.Usr_dlg().Warn_many("", "", "run_failed: ~{0} ~{1}", log_bfr.Xto_str(), Err_.Message_gplx_full(e)); diff --git a/400_xowa/src/gplx/xowa/gui/urls/Xof_orig_file_downloader.java b/400_xowa/src/gplx/xowa/gui/urls/Xof_orig_file_downloader.java index b98f4ce2a..5b77c3cfd 100644 --- a/400_xowa/src/gplx/xowa/gui/urls/Xof_orig_file_downloader.java +++ b/400_xowa/src/gplx/xowa/gui/urls/Xof_orig_file_downloader.java @@ -21,7 +21,7 @@ public class Xof_orig_file_downloader { public static Xof_fsdb_itm Make_fsdb(Xowe_wiki wiki, byte[] lnki_ttl, Xof_img_size img_size, Xof_url_bldr url_bldr) { Xof_fsdb_itm fsdb = new Xof_fsdb_itm(); lnki_ttl = Xoa_ttl.Replace_spaces(Xoa_app_.Utl__encoder_mgr().Http_url().Decode(lnki_ttl)); - fsdb.Init_at_lnki(Xof_exec_tid.Tid_viewer_app, wiki.Domain_itm().Abrv_xo(), lnki_ttl, Xop_lnki_type.Id_none, Xop_lnki_tkn.Upright_null, Xof_img_size.Size_null_deprecated, Xof_img_size.Size_null_deprecated, Xof_lnki_time.Null, Xof_lnki_page.Null, Xof_patch_upright_tid_.Tid_all); + fsdb.Init_at_lnki(Xof_exec_tid.Tid_viewer_app, wiki.Domain_itm().Abrv_xo(), lnki_ttl, Xop_lnki_type.Id_none, Xop_lnki_tkn.Upright_null, Xof_img_size.Size__neg1, Xof_img_size.Size__neg1, Xof_lnki_time.Null, Xof_lnki_page.Null, Xof_patch_upright_tid_.Tid_all); fsdb.Init_at_hdoc(Int_.MaxValue, Xof_html_elem.Tid_img);// NOTE: set elem_id to "impossible" number, otherwise it will auto-update an image on the page with a super-large size; [[File:Alfred Sisley 062.jpg]] Xof_orig_itm orig = wiki.File__orig_mgr().Find_by_ttl_or_null(lnki_ttl); if (orig == Xof_orig_itm.Null) return null; // orig not found; need orig in order to get repo Xof_repo_itm repo = wiki.File__repo_mgr().Get_trg_by_id_or_null(orig.Repo(), lnki_ttl, Bry_.Empty); if (repo == null) return null; // repo not found diff --git a/400_xowa/src/gplx/xowa/gui/views/Load_page_wkr.java b/400_xowa/src/gplx/xowa/gui/views/Load_page_wkr.java index e933ccfb1..00dad2220 100644 --- a/400_xowa/src/gplx/xowa/gui/views/Load_page_wkr.java +++ b/400_xowa/src/gplx/xowa/gui/views/Load_page_wkr.java @@ -18,51 +18,35 @@ along with this program. If not, see . package gplx.xowa.gui.views; import gplx.*; import gplx.xowa.*; import gplx.xowa.gui.*; import gplx.core.threads.*; public class Load_page_wkr implements Gfo_thread_wkr { - private Xog_tab_itm tab; + private static final Object thread_lock = new Object(); private static boolean running = false; + private final Xog_tab_itm tab; public Load_page_wkr(Xog_tab_itm tab, Xowe_wiki wiki, Xoa_url url, Xoa_ttl ttl) {this.tab = tab; this.wiki = wiki; this.url = url; this.ttl = ttl;} public String Name() {return "xowa.load_page_wkr";} public boolean Resume() {return false;} - public Xowe_wiki Wiki() {return wiki;} private Xowe_wiki wiki; + public Xowe_wiki Wiki() {return wiki;} private final Xowe_wiki wiki; + public Xoa_url Url() {return url;} private final Xoa_url url; + public Xoa_ttl Ttl() {return ttl;} private final Xoa_ttl ttl; public Xoae_page Page() {return page;} private Xoae_page page; - public Xoa_url Url() {return url;} private Xoa_url url; - public Xoa_ttl Ttl() {return ttl;} private Xoa_ttl ttl; public boolean Hdump_enabled() {return hdump_enabled;} private boolean hdump_enabled; - public Exception Err() {return exc;} private Exception exc; - private final static Object thread_lock = new Object(); - public static boolean Running() { - boolean rv = false; - synchronized (thread_lock) { - rv = running; - } - return rv; - } private static boolean running = false; - private static void Running_(boolean v) { - synchronized (thread_lock) { - running = v; - } - } + public Exception Exec_err() {return exec_err;} private Exception exec_err; public void Exec() { try { Running_(true); int wait_count = 0; - while (gplx.xowa.html.modules.popups.Xow_popup_mgr.Running() && ++wait_count < 100) { + while (gplx.xowa.html.modules.popups.Xow_popup_mgr.Running() && ++wait_count < 100) Thread_adp_.Sleep(10); - } Xoae_app app = wiki.Appe(); app.Usr_dlg().Log_many("", "", "page.load: url=~{0}", url.To_str()); if (Env_.System_memory_free() < app.Sys_cfg().Free_mem_when()) // check if low in memory - app.Free_mem(false); // clear caches (which will clear bry_bfr_mk) + app.Free_mem(false); // clear caches (which will clear bry_bfr_mkr) else // not low in memory - app.Utl__bfr_mkr().Clear(); // clear bry_bfr_mk only; NOTE: call before page parse, not when page is first added, else threading errors; DATE:2014-05-30 + app.Utl__bfr_mkr().Clear(); // clear bry_bfr_mkr only; NOTE: call before page parse, not when page is first added, else threading errors; DATE:2014-05-30 this.page = wiki.Load_page_by_ttl(url, ttl, wiki.Lang(), tab, false); - int html_db_id = page.Revision_data().Html_db_id(); - if (wiki.Html__hdump_enabled()) - hdump_enabled = true; + this.hdump_enabled = wiki.Html__hdump_enabled(); wait_count = 0; - while (gplx.xowa.html.modules.popups.Xow_popup_mgr.Running() && ++wait_count < 100) { + while (gplx.xowa.html.modules.popups.Xow_popup_mgr.Running() && ++wait_count < 100) Thread_adp_.Sleep(10); - } - if (wiki.Html__hdump_enabled() && html_db_id != -1) { + if (hdump_enabled && page.Revision_data().Html_db_id() != -1) { // wiki.ParsePage(page, false); wiki.Html__hdump_rdr().Get_by_ttl(page); } @@ -71,11 +55,23 @@ public class Load_page_wkr implements Gfo_thread_wkr { GfoInvkAble_.InvkCmd_val(tab.Cmd_sync(), Xog_tab_itm.Invk_show_url_loaded_swt, this); } catch (Exception e) { - this.exc = e; + this.exec_err = e; GfoInvkAble_.InvkCmd_val(tab.Cmd_sync(), Xog_tab_itm.Invk_show_url_failed_swt, this); } finally { Running_(false); } } + public static boolean Running() { + boolean rv = false; + synchronized (thread_lock) { + rv = running; + } + return rv; + } + private static void Running_(boolean v) { + synchronized (thread_lock) { + running = v; + } + } } diff --git a/400_xowa/src/gplx/xowa/gui/views/Xog_tab_itm.java b/400_xowa/src/gplx/xowa/gui/views/Xog_tab_itm.java index ffa18712a..b8f20d6a9 100644 --- a/400_xowa/src/gplx/xowa/gui/views/Xog_tab_itm.java +++ b/400_xowa/src/gplx/xowa/gui/views/Xog_tab_itm.java @@ -202,9 +202,12 @@ public class Xog_tab_itm implements GfoInvkAble { thread_pool.Add_at_end(redlink_thread); thread_pool.Run(); } } + public void Exec_notify(boolean pass, String msg) { + this.Html_box().Html_js_eval_proc_as_str("xowa.cmds.exec_by_str", "xowa.notify", "{\"text\":\"" + msg + "\",\"status\":\"" + (pass ? "success" : "error") + "\"}"); + } @gplx.Internal protected void Show_url_failed(Load_page_wkr wkr) { try { - Xog_tab_itm_read_mgr.Show_page_err(win, this, wkr.Wiki(), wkr.Url(), wkr.Ttl(), wkr.Err()); + Xog_tab_itm_read_mgr.Show_page_err(win, this, wkr.Wiki(), wkr.Url(), wkr.Ttl(), wkr.Exec_err()); } finally { wkr.Wiki().Appe().Thread_mgr().Page_load_mgr().Resume(); } diff --git a/400_xowa/src/gplx/xowa/gui/views/Xog_tab_itm_read_mgr.java b/400_xowa/src/gplx/xowa/gui/views/Xog_tab_itm_read_mgr.java index 4f878f0d8..ece0df7de 100644 --- a/400_xowa/src/gplx/xowa/gui/views/Xog_tab_itm_read_mgr.java +++ b/400_xowa/src/gplx/xowa/gui/views/Xog_tab_itm_read_mgr.java @@ -60,12 +60,8 @@ public class Xog_tab_itm_read_mgr { public static void Update_selected_tab_blank(Xog_win_itm win) {Update_selected_tab(win, null, null);} // called when all tabs are null public static void Update_selected_tab(Xog_win_itm win, Xoa_url url, Xoa_ttl ttl) { String url_str = "", win_str = Win_text_blank; - if (url != null && ttl != null) { // TODO: remove; no longer needed for new url parser - try {url_str = url.To_str();} - catch (Exception e) { // HACK: failed pages will have a null wiki; for now, catch and ignore; DATE:2014-06-22 - Gfo_usr_dlg_.I.Warn_many("", "", "failed to build url: url=~{0}, err=~{1}", String_.new_u8(url.Raw()), Err_.Message_gplx_full(e)); - url_str = String_.new_u8(ttl.Full_txt()); - } + if (url != null && ttl != null) { + url_str = url.To_str(); win_str = String_.new_u8(Bry_.Add(ttl.Full_txt(), Win_text_suffix_page)); } win.Url_box().Text_(url_str); diff --git a/400_xowa/src/gplx/xowa/gui/views/boots/Xog_error_data.java b/400_xowa/src/gplx/xowa/gui/views/boots/Xog_error_data.java new file mode 100644 index 000000000..eb161048c --- /dev/null +++ b/400_xowa/src/gplx/xowa/gui/views/boots/Xog_error_data.java @@ -0,0 +1,28 @@ +/* +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.gui.views.boots; import gplx.*; import gplx.xowa.*; import gplx.xowa.gui.*; import gplx.xowa.gui.views.*; +public class Xog_error_data { + public Xog_error_data(String full_msg, String err_details, String err_msg) { + this.full_msg = full_msg; + this.err_details = err_details; + this.err_msg = err_msg; + } + public String Full_msg() {return full_msg;} private final String full_msg; + public String Err_details() {return err_details;} private final String err_details; + public String Err_msg() {return err_msg;} private final String err_msg; +} diff --git a/400_xowa/src/gplx/xowa/gui/views/boots/Xog_error_win.java b/400_xowa/src/gplx/xowa/gui/views/boots/Xog_error_win.java new file mode 100644 index 000000000..74097a188 --- /dev/null +++ b/400_xowa/src/gplx/xowa/gui/views/boots/Xog_error_win.java @@ -0,0 +1,107 @@ +/* +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.gui.views.boots; import gplx.*; import gplx.xowa.*; import gplx.xowa.gui.*; import gplx.xowa.gui.views.*; +import java.awt.*; +import java.awt.event.*; +import java.io.IOException; +import java.net.*; +import java.awt.*; import java.awt.event.*; +import javax.swing.*; +public class Xog_error_win extends JFrame implements GfoInvkAble { + private Xog_error_data error_data; + public Xog_error_win(Xog_error_data error_data) { + super("XOWA Error"); + this.setTitle("XOWA Error"); + this.error_data = error_data; + try { + UIManager.setLookAndFeel( + UIManager.getSystemLookAndFeelClassName()); + } + catch (Exception e) {System.out.println(e.getMessage());} + this.setSize(700, 580); + this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + this.setLocationRelativeTo(null); + this.setBackground(Color.WHITE); + JPanel main_panel = new JPanel(); + main_panel.setSize(700, 580); + this.setContentPane(main_panel); + this.setLayout(null); + new_text_area(main_panel, error_data); + new_link_lbl(this, main_panel, 10, 520, Invk_open_site, "open issue"); + new_link_lbl(this, main_panel, 605, 520, Invk_send_mail, "send email"); + this.setVisible(true); + } + private static JScrollPane new_text_area(JPanel owner, Xog_error_data error_data) { + JTextArea text_area = new JTextArea(); + text_area.setForeground(Color.BLACK); + text_area.setBackground(Color.WHITE); + text_area.setMargin(new Insets(0, 0, 0,0)); + text_area.setLineWrap(true); + text_area.setWrapStyleWord(true); // else text will wrap in middle of words + text_area.setCaretColor(Color.BLACK); + text_area.getCaret().setBlinkRate(0); + text_area.setText(error_data.Full_msg()); + JScrollPane text_scroll_pane = new JScrollPane(text_area); + text_scroll_pane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED); + owner.add(text_scroll_pane); + text_scroll_pane.setSize(675, 500); + text_scroll_pane.setLocation(10, 10); + return text_scroll_pane; + } + private static JLabel new_link_lbl(GfoInvkAble invk, JPanel owner, int x, int y, String invk_cmd, String text) { + JLabel rv = new JLabel(); + rv.setText(text); + rv.setCursor(new Cursor(Cursor.HAND_CURSOR)); + rv.addMouseListener(new Swing_mouse_adapter(GfoInvkAbleCmd.new_(invk, invk_cmd))); + rv.setLocation(x, y); + rv.setSize(80, 20); + owner.add(rv); + return rv; + } + public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { + if (ctx.Match(k, Invk_send_mail)) { + try { + Url_encoder url_encoder = Xoa_app_.Utl__encoder_mgr().Fsys_safe(); + String subject = url_encoder.Encode_str("XOWA boot error: " + error_data.Err_msg()); + String body = url_encoder.Encode_str(error_data.Err_details()); + Desktop.getDesktop().mail(new URI("mailto:gnosygnu+xowa_error_boot@gmail.com?subject=" + subject + "&body=" + body)); + } catch (URISyntaxException | IOException ex) { + //It looks like there's a problem + } + } + else if (ctx.Match(k, Invk_open_site)) { + try { + Desktop.getDesktop().browse(new URI("https://github.com/gnosygnu/xowa/issues")); + } catch (URISyntaxException | IOException ex) { + //It looks like there's a problem + } + } + else return GfoInvkAble_.Rv_unhandled; + return this; + } private static final String Invk_send_mail = "send_mail", Invk_open_site = "open_site"; + } +class Swing_mouse_adapter extends MouseAdapter { + private final GfoInvkAbleCmd cmd; + public Swing_mouse_adapter(GfoInvkAbleCmd cmd) {this.cmd = cmd;} + @Override public void mouseClicked(MouseEvent ev) { + try {cmd.Invk();} + catch (Exception e) { + System.out.println(Err_.Message_gplx_full(e)); + } + } +} diff --git a/400_xowa/src/gplx/xowa/gui/views/boots/Xog_splash_win.java b/400_xowa/src/gplx/xowa/gui/views/boots/Xog_splash_win.java new file mode 100644 index 000000000..0786f0347 --- /dev/null +++ b/400_xowa/src/gplx/xowa/gui/views/boots/Xog_splash_win.java @@ -0,0 +1,51 @@ +/* +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.gui.views.boots; import gplx.*; import gplx.xowa.*; import gplx.xowa.gui.*; import gplx.xowa.gui.views.*; +import java.awt.*; +import java.awt.event.*; +public class Xog_splash_win implements RlsAble { + private SplashScreen splash; + private Graphics2D graphics; private boolean graphics_init = true; + public Xog_splash_win(boolean app_mode_is_gui) { + if (app_mode_is_gui) { + this.splash = SplashScreen.getSplashScreen(); + if (splash == null) System.out.println("SplashScreen.getSplashScreen() returned null"); + } + } + public void Write(String msg) { + if (splash == null) return; + if (graphics_init) { + graphics_init = false; + if (graphics == null) { + graphics = splash.createGraphics(); + if (graphics == null) System.out.println("graphics is null"); + } + } + if (graphics == null) return; + graphics.setComposite(AlphaComposite.Clear); + graphics.fillRect(120,140,200,40); + graphics.setPaintMode(); + graphics.setColor(Color.BLACK); + graphics.drawString(msg, 0, 0); + splash.update(); + } + public void Rls() { + if (splash == null) return; + splash.close(); + } +} diff --git a/400_xowa/src/gplx/xowa/html/bridges/dbuis/tbls/Dbui_btn_itm.java b/400_xowa/src/gplx/xowa/html/bridges/dbuis/tbls/Dbui_btn_itm.java index 5db8120a3..c9ead143c 100644 --- a/400_xowa/src/gplx/xowa/html/bridges/dbuis/tbls/Dbui_btn_itm.java +++ b/400_xowa/src/gplx/xowa/html/bridges/dbuis/tbls/Dbui_btn_itm.java @@ -22,4 +22,5 @@ public class Dbui_btn_itm { public String Cmd() {return cmd;} private final String cmd; public String Img() {return img;} private final String img; public String Text() {return text;} private final String text; + public static final Dbui_btn_itm[] Ary_empty = new Dbui_btn_itm[0]; } diff --git a/400_xowa/src/gplx/xowa/html/bridges/dbuis/tbls/Dbui_col_itm.java b/400_xowa/src/gplx/xowa/html/bridges/dbuis/tbls/Dbui_col_itm.java index a08c9dbb4..38b859a9f 100644 --- a/400_xowa/src/gplx/xowa/html/bridges/dbuis/tbls/Dbui_col_itm.java +++ b/400_xowa/src/gplx/xowa/html/bridges/dbuis/tbls/Dbui_col_itm.java @@ -22,5 +22,5 @@ public class Dbui_col_itm { public String Key() {return key;} private final String key; public String Display() {return display;} private final String display; public int Width() {return width;} private final int width; - public static final int Type_id_str = 1, Type_id_text = 2; + public static final int Type_id_str = 1, Type_id_text = 2, Type_id_int = 3, Type_id_datetime = 4; } diff --git a/400_xowa/src/gplx/xowa/html/css/Xowd_css_core_mgr.java b/400_xowa/src/gplx/xowa/html/css/Xowd_css_core_mgr.java index 074654f21..bb4237d12 100644 --- a/400_xowa/src/gplx/xowa/html/css/Xowd_css_core_mgr.java +++ b/400_xowa/src/gplx/xowa/html/css/Xowd_css_core_mgr.java @@ -24,7 +24,7 @@ public class Xowd_css_core_mgr { Db_conn conn = core_tbl.Conn(); Io_url[] file_list = Io_mgr.I.QueryDir_args(css_dir).Recur_().ExecAsUrlAry(); try { - conn.Txn_bgn(); + conn.Txn_bgn("schema__css_core__set"); int css_id = core_tbl.Select_id_by_key(key); DateAdp updated_on = DateAdp_.Now().XtoUtc(); if (css_id == -1) diff --git a/400_xowa/src/gplx/xowa/html/hdumps/Xohd_hdump_rdr.java b/400_xowa/src/gplx/xowa/html/hdumps/Xohd_hdump_rdr.java index 87211b502..7c63b9425 100644 --- a/400_xowa/src/gplx/xowa/html/hdumps/Xohd_hdump_rdr.java +++ b/400_xowa/src/gplx/xowa/html/hdumps/Xohd_hdump_rdr.java @@ -47,7 +47,7 @@ public class Xohd_hdump_rdr { synchronized (dbpg) { dbpg.Clear(); if ( !Get_by_ttl__fill_hpg(rv, ttl) - || rv.Page_body() == null) { // occurs when row exists in page, but not in html + || rv.Page_body() == null) { // occurs when row exists in page_table, but not in html_table rv.Exists_n_(); return; } diff --git a/400_xowa/src/gplx/xowa/html/hdumps/Xohd_hdump_wtr.java b/400_xowa/src/gplx/xowa/html/hdumps/Xohd_hdump_wtr.java index 9d36c538c..824b3b092 100644 --- a/400_xowa/src/gplx/xowa/html/hdumps/Xohd_hdump_wtr.java +++ b/400_xowa/src/gplx/xowa/html/hdumps/Xohd_hdump_wtr.java @@ -36,6 +36,12 @@ public class Xohd_hdump_wtr { Xowd_db_file hdump_db = Xowd_db_file.Null; if (html_db_id == -1) { hdump_db = core_data_mgr.Db__html(); + if (hdump_db == null) { + hdump_db = core_data_mgr.Dbs__make_by_tid(Xowd_db_file_.Tid_html_data); + Xowd_html_tbl tbl = hdump_db.Tbl__html(); + tbl.Create_tbl(); + } + html_db_id = hdump_db.Id(); page.Revision_data().Html_db_id_(html_db_id); core_data_mgr.Tbl__page().Update__html_db_id(page.Revision_data().Id(), html_db_id); diff --git a/400_xowa/src/gplx/xowa/html/hdumps/abrvs/Xohd_abrv_mgr.java b/400_xowa/src/gplx/xowa/html/hdumps/abrvs/Xohd_abrv_mgr.java index d086e04f2..d93a987f9 100644 --- a/400_xowa/src/gplx/xowa/html/hdumps/abrvs/Xohd_abrv_mgr.java +++ b/400_xowa/src/gplx/xowa/html/hdumps/abrvs/Xohd_abrv_mgr.java @@ -127,7 +127,7 @@ public class Xohd_abrv_mgr { } } url_bldr.Init_by_root(img.Orig_repo_id() == Xof_repo_itm_.Repo_remote ? file_dir_comm : file_dir_wiki, Byte_ascii.Slash, false, false, 2); - url_bldr.Init_by_itm(img.File_is_orig() ? Xof_repo_itm_.Mode_orig : Xof_repo_itm_.Mode_thumb, img.Lnki_ttl(), Xof_file_wkr_.Md5_(img.Lnki_ttl()), Xof_ext_.new_by_id_(img.Orig_ext()), img.File_w(), img.Lnki_time(), img.Lnki_page()); + url_bldr.Init_by_itm(img.File_is_orig() ? Xof_repo_itm_.Mode_orig : Xof_repo_itm_.Mode_thumb, img.Lnki_ttl(), Xof_file_wkr_.Md5(img.Lnki_ttl()), Xof_ext_.new_by_id_(img.Orig_ext()), img.File_w(), img.Lnki_time(), img.Lnki_page()); byte[] img_src = url_bldr.Xto_bry(); if (tid == Xohd_abrv_.Tid_img) { fmtr_img.Bld_bfr_many(bfr, img_src, img_view_w, img.Html_h()); diff --git a/400_xowa/src/gplx/xowa/html/hdumps/bldrs/Xob_link_dump_tbl.java b/400_xowa/src/gplx/xowa/html/hdumps/bldrs/Xob_link_dump_tbl.java index 5248dc62b..e48991c7c 100644 --- a/400_xowa/src/gplx/xowa/html/hdumps/bldrs/Xob_link_dump_tbl.java +++ b/400_xowa/src/gplx/xowa/html/hdumps/bldrs/Xob_link_dump_tbl.java @@ -48,7 +48,7 @@ class Xob_link_dump_tbl implements RlsAble { public void Rls() { stmt_insert = Db_stmt_.Rls(stmt_insert); } - public void Insert_bgn() {conn.Txn_bgn();} + public void Insert_bgn() {conn.Txn_bgn("bldr__link_dump");} public void Insert_end() {conn.Txn_end(); stmt_insert = Db_stmt_.Rls(stmt_insert);} public void Insert_cmd_by_batch(int src_page_id, int src_html_uid, int trg_ns, byte[] trg_ttl) { if (stmt_insert == null) stmt_insert = conn.Stmt_insert(Tbl_name, flds.To_str_ary_wo_autonum()); diff --git a/400_xowa/src/gplx/xowa/html/hdumps/bldrs/Xob_redlink_mkr_cmd.java b/400_xowa/src/gplx/xowa/html/hdumps/bldrs/Xob_redlink_mkr_cmd.java index 99c680f91..58a8391b9 100644 --- a/400_xowa/src/gplx/xowa/html/hdumps/bldrs/Xob_redlink_mkr_cmd.java +++ b/400_xowa/src/gplx/xowa/html/hdumps/bldrs/Xob_redlink_mkr_cmd.java @@ -40,7 +40,7 @@ public class Xob_redlink_mkr_cmd extends Xob_itm_basic_base implements Xob_cmd { if (html_db_id != cur_html_db_id) { if (html_dump_tbl != null) html_dump_tbl.Conn().Txn_end(); html_dump_tbl = wiki.Data__core_mgr().Dbs__get_at(html_db_id).Tbl__html(); - html_dump_tbl.Conn().Txn_bgn(); + html_dump_tbl.Conn().Txn_bgn("bldr__redlink"); cur_html_db_id = html_db_id; } // commit page_id if needed diff --git a/400_xowa/src/gplx/xowa/html/hzips/Xow_hzip_itm__anchor.java b/400_xowa/src/gplx/xowa/html/hzips/Xow_hzip_itm__anchor.java index 45fab269b..da4ffb687 100644 --- a/400_xowa/src/gplx/xowa/html/hzips/Xow_hzip_itm__anchor.java +++ b/400_xowa/src/gplx/xowa/html/hzips/Xow_hzip_itm__anchor.java @@ -226,7 +226,7 @@ public class Xow_hzip_itm__anchor { ; private static final byte Href_tid_wiki = 1, Href_tid_site = 2; private static final int Href_bry_len = 6; // "/wiki/".length - private static final Btrie_fast_mgr btrie_href = Btrie_fast_mgr.cs_() + private static final Btrie_fast_mgr btrie_href = Btrie_fast_mgr.cs() .Add_str_byte("/wiki/", Href_tid_wiki) .Add_str_byte("/site/", Href_tid_site); private static final int diff --git a/400_xowa/src/gplx/xowa/html/portal/Xow_portal_mgr.java b/400_xowa/src/gplx/xowa/html/portal/Xow_portal_mgr.java index 80bafa41b..5aaf6a21f 100644 --- a/400_xowa/src/gplx/xowa/html/portal/Xow_portal_mgr.java +++ b/400_xowa/src/gplx/xowa/html/portal/Xow_portal_mgr.java @@ -102,7 +102,7 @@ public class Xow_portal_mgr implements GfoInvkAble { public byte[] Div_home_bry() {return api_skin != null && api_skin.Sidebar_home_enabled() ? div_home_bry : Bry_.Empty;} private byte[] div_home_bry = Bry_.Empty; public byte[] Div_wikis_bry(Bry_bfr_mkr bfr_mkr) { if (toggle_itm == null) // TEST:lazy-new b/c Init_by_wiki - toggle_itm = wiki.Appe().Api_root().Html().Page().Toggle_mgr().Get_or_new("offline-wikis").Init(wiki.Appe().Usere().Wiki(), Bry_.new_a7("Wikis")); + toggle_itm = wiki.Appe().Api_root().Html().Page().Toggle_mgr().Get_or_new("offline-wikis").Init(Bry_.new_a7("Wikis")); Bry_bfr tmp_bfr = bfr_mkr.Get_k004(); div_wikis_fmtr.Bld_bfr_many(tmp_bfr, toggle_itm.Html_toggle_btn(), toggle_itm.Html_toggle_hdr()); return tmp_bfr.To_bry_and_rls(); diff --git a/400_xowa/src/gplx/xowa/langs/cases/Xol_case_mgr.java b/400_xowa/src/gplx/xowa/langs/cases/Xol_case_mgr.java index 0f69d3379..eeff9ed6a 100644 --- a/400_xowa/src/gplx/xowa/langs/cases/Xol_case_mgr.java +++ b/400_xowa/src/gplx/xowa/langs/cases/Xol_case_mgr.java @@ -18,7 +18,7 @@ along with this program. If not, see . package gplx.xowa.langs.cases; import gplx.*; import gplx.xowa.*; import gplx.xowa.langs.*; import gplx.core.btries.*; import gplx.intl.*; public class Xol_case_mgr implements GfoInvkAble, Gfo_case_mgr { - private Bry_bfr tmp_bfr = Bry_bfr.new_(); private Btrie_fast_mgr upper_trie = Btrie_fast_mgr.cs_(), lower_trie = Btrie_fast_mgr.cs_(); private Xol_case_itm[] itms; + private Bry_bfr tmp_bfr = Bry_bfr.new_(); private Btrie_fast_mgr upper_trie = Btrie_fast_mgr.cs(), lower_trie = Btrie_fast_mgr.cs(); private Xol_case_itm[] itms; public Xol_case_mgr(byte tid) {this.tid = tid;} public byte Tid() {return tid;} private byte tid; public Gfo_case_itm Get_or_null(byte bgn_byte, byte[] src, int bgn, int end) { diff --git a/400_xowa/src/gplx/xowa/langs/numbers/Xol_num_fmtr_base.java b/400_xowa/src/gplx/xowa/langs/numbers/Xol_num_fmtr_base.java index 5124e693b..201a223d4 100644 --- a/400_xowa/src/gplx/xowa/langs/numbers/Xol_num_fmtr_base.java +++ b/400_xowa/src/gplx/xowa/langs/numbers/Xol_num_fmtr_base.java @@ -18,7 +18,7 @@ along with this program. If not, see . package gplx.xowa.langs.numbers; import gplx.*; import gplx.xowa.*; import gplx.xowa.langs.*; import gplx.core.primitives.*; import gplx.core.btries.*; public class Xol_num_fmtr_base implements GfoInvkAble { - private Btrie_fast_mgr dlm_trie = Btrie_fast_mgr.cs_(); + private Btrie_fast_mgr dlm_trie = Btrie_fast_mgr.cs(); private Xol_num_grp[] grp_ary = Xol_num_grp.Ary_empty; int grp_ary_len; private Gfo_num_fmt_wkr[] cache; int cache_len = 16; private Bry_bfr tmp = Bry_bfr.new_(); diff --git a/400_xowa/src/gplx/xowa/langs/numbers/Xol_transform_mgr.java b/400_xowa/src/gplx/xowa/langs/numbers/Xol_transform_mgr.java index d888b4550..eceb8d90e 100644 --- a/400_xowa/src/gplx/xowa/langs/numbers/Xol_transform_mgr.java +++ b/400_xowa/src/gplx/xowa/langs/numbers/Xol_transform_mgr.java @@ -18,8 +18,8 @@ along with this program. If not, see . package gplx.xowa.langs.numbers; import gplx.*; import gplx.xowa.*; import gplx.xowa.langs.*; import gplx.core.btries.*; public class Xol_transform_mgr implements GfoInvkAble { - private Btrie_fast_mgr trie_k_to_v = Btrie_fast_mgr.cs_(); - private Btrie_fast_mgr trie_v_to_k = Btrie_fast_mgr.cs_(); + private Btrie_fast_mgr trie_k_to_v = Btrie_fast_mgr.cs(); + private Btrie_fast_mgr trie_v_to_k = Btrie_fast_mgr.cs(); private Ordered_hash hash = Ordered_hash_.new_bry_(); private boolean empty = true; public void Clear() {hash.Clear(); trie_k_to_v.Clear(); trie_v_to_k.Clear(); empty = true;} diff --git a/400_xowa/src/gplx/xowa/langs/vnts/Xop_vnt_flag.java b/400_xowa/src/gplx/xowa/langs/vnts/Xop_vnt_flag.java index 4813c7922..9808a188c 100644 --- a/400_xowa/src/gplx/xowa/langs/vnts/Xop_vnt_flag.java +++ b/400_xowa/src/gplx/xowa/langs/vnts/Xop_vnt_flag.java @@ -82,7 +82,7 @@ class Xop_vnt_flag_ { , Flag_macro = new Xop_vnt_flag(Tid_macro) , Flag_name = new Xop_vnt_flag(Tid_name) ; - public static final Btrie_fast_mgr Trie = Btrie_fast_mgr.ci_ascii_() // NOTE: match either lc or uc; EX: -{D}- or -{d}-; // NOTE:ci.ascii:MW_const.en; flag keys; EX: -{S|a}- + public static final Btrie_fast_mgr Trie = Btrie_fast_mgr.ci_a7() // NOTE: match either lc or uc; EX: -{D}- or -{d}-; // NOTE:ci.ascii:MW_const.en; flag keys; EX: -{S|a}- .Add(Byte_ascii.Ltr_S , Xop_vnt_flag_.Flag_show) .Add(Byte_ascii.Plus , Xop_vnt_flag_.Flag_all) .Add(Byte_ascii.Ltr_E , Xop_vnt_flag_.Flag_err) diff --git a/400_xowa/src/gplx/xowa/langs/vnts/Xop_vnt_flag_parser.java b/400_xowa/src/gplx/xowa/langs/vnts/Xop_vnt_flag_parser.java index 136944b97..a59aec8f5 100644 --- a/400_xowa/src/gplx/xowa/langs/vnts/Xop_vnt_flag_parser.java +++ b/400_xowa/src/gplx/xowa/langs/vnts/Xop_vnt_flag_parser.java @@ -100,7 +100,7 @@ class Xop_vnt_flag_parser { } private static Btrie_fast_mgr flag_trie = Xop_vnt_flag_.Trie; // private static final byte Dlm_tid_bgn = 0, Dlm_tid_end = 1, Dlm_tid_pipe = 2, Dlm_tid_colon = 3, Dlm_tid_semic = 4, Dlm_tid_kv = 5; -// private static Btrie_fast_mgr dlm_trie = Btrie_fast_mgr.cs_() +// private static Btrie_fast_mgr dlm_trie = Btrie_fast_mgr.cs() // .Add_bry_byte(Xop_vnt_lxr_.Hook_bgn , Dlm_tid_bgn) // .Add_bry_byte(Xop_vnt_lxr_.Hook_end , Dlm_tid_end) // .Add_bry_byte(Byte_ascii.Pipe , Dlm_tid_pipe) diff --git a/400_xowa/src/gplx/xowa/parsers/amps/Xop_amp_mgr_decode_tst.java b/400_xowa/src/gplx/xowa/parsers/amps/Xop_amp_mgr_decode_tst.java index 69ff01443..c63988a8c 100644 --- a/400_xowa/src/gplx/xowa/parsers/amps/Xop_amp_mgr_decode_tst.java +++ b/400_xowa/src/gplx/xowa/parsers/amps/Xop_amp_mgr_decode_tst.java @@ -33,7 +33,7 @@ public class Xop_amp_mgr_decode_tst { @Test public void Hex_zero_padded() {fxt.Test_decode_as_bry("Σ" , "Σ");} @Test public void Hex_upper_x() {fxt.Test_decode_as_bry("Σ" , "Σ");} @Test public void Num_fail_large_codepoint() {fxt.Test_decode_as_bry("�" , "�");} - @Test public void Num_ignore_extra_x() {fxt.Test_decode_as_bry("&#xx26D0;" , Char_.XtoStr(Char_.XbyInt(9936)));} // 2nd x is ignored + @Test public void Num_ignore_extra_x() {fxt.Test_decode_as_bry("&#xx26D0;" , Char_.To_str(Char_.XbyInt(9936)));} // 2nd x is ignored } class Xop_amp_mgr_fxt { private Xop_amp_mgr amp_mgr = Xop_amp_mgr.I; diff --git a/400_xowa/src/gplx/xowa/parsers/lists/Xop_list_tkn_chkr.java b/400_xowa/src/gplx/xowa/parsers/lists/Xop_list_tkn_chkr.java index c95ebb209..46fe1343f 100644 --- a/400_xowa/src/gplx/xowa/parsers/lists/Xop_list_tkn_chkr.java +++ b/400_xowa/src/gplx/xowa/parsers/lists/Xop_list_tkn_chkr.java @@ -30,7 +30,7 @@ public class Xop_list_tkn_chkr extends Xop_tkn_chkr_base { err += mgr.Tst_val(list_bgn == 0, path, "list_bgn", list_bgn, actl.List_bgn()); err += mgr.Tst_val(list_itmTyp == Xop_list_tkn_.List_itmTyp_null, path, "list_itmTyp", list_itmTyp, actl.List_itmTyp()); err += mgr.Tst_val(list_sub_last == Bool_.__byte, path, "list_sub_last", list_sub_last, actl.List_sub_last()); - err += mgr.Tst_val(list_path == Int_.Ary_empty, path, "list_path", Array_.XtoStr(list_path), Array_.XtoStr(actl.List_path())); + err += mgr.Tst_val(list_path == Int_.Ary_empty, path, "list_path", Array_.To_str(list_path), Array_.To_str(actl.List_path())); return err; } } diff --git a/400_xowa/src/gplx/xowa/parsers/logs/Xop_log_mgr.java b/400_xowa/src/gplx/xowa/parsers/logs/Xop_log_mgr.java index f176f65c5..d240d45e8 100644 --- a/400_xowa/src/gplx/xowa/parsers/logs/Xop_log_mgr.java +++ b/400_xowa/src/gplx/xowa/parsers/logs/Xop_log_mgr.java @@ -53,7 +53,7 @@ public class Xop_log_mgr implements GfoInvkAble { public void Delete_all() { log_tbl.Delete(); } - public void Txn_bgn() {conn.Txn_bgn();} + public void Txn_bgn() {conn.Txn_bgn("log_mgr");} public void Txn_end() {conn.Txn_end();} public void Rls() { if (log_tbl != null) log_tbl.Rls(); diff --git a/400_xowa/src/gplx/xowa/parsers/utils/Xop_util.java b/400_xowa/src/gplx/xowa/parsers/utils/Xop_util.java new file mode 100644 index 000000000..ad3d480c1 --- /dev/null +++ b/400_xowa/src/gplx/xowa/parsers/utils/Xop_util.java @@ -0,0 +1,40 @@ +/* +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.parsers.utils; import gplx.*; import gplx.xowa.*; import gplx.xowa.parsers.*; +import gplx.core.primitives.*; +public class Xop_util { + public byte[] Uniq_bry_new() { + return Bry_.Add + ( Random_bry_hdr // "\x7fUNIQ" where "\x7f" is (byte)127 + , Random_bry_new(16)); // random hexdecimal String + } + public void Random_int_ary_(int... v) {random_int_ary = v;} private int[] random_int_ary; // TEST: + public byte[] Random_bry_new(int len) { + Bry_bfr tmp_bfr = Bry_bfr.new_(); + RandomAdp random_gen = RandomAdp_.new_(); + for (int i = 0; i < len; i += 7) { + int rand = random_int_ary == null ? random_gen.Next(Int_.MaxValue) : random_int_ary[i / 7]; + String rand_str = Int_.Xto_str_hex(Bool_.N, Bool_.Y, rand & 0xfffffff); // limits value to 268435455 + tmp_bfr.Add_str_a7(rand_str); + } + byte[] rv = tmp_bfr.Xto_bry(0, len); + tmp_bfr.Clear(); + return rv; + } + private final static byte[] Random_bry_hdr = Bry_.new_a7("\u007fUNIQ"); +} diff --git a/400_xowa/src/gplx/xowa/parsers/utils/Xop_util_tst.java b/400_xowa/src/gplx/xowa/parsers/utils/Xop_util_tst.java new file mode 100644 index 000000000..968efb115 --- /dev/null +++ b/400_xowa/src/gplx/xowa/parsers/utils/Xop_util_tst.java @@ -0,0 +1,36 @@ +/* +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.parsers.utils; import gplx.*; import gplx.xowa.*; import gplx.xowa.parsers.*; +import org.junit.*; +public class Xop_util_tst { + private final Xop_util_fxt fxt = new Xop_util_fxt(); + @Test public void Basic() { + fxt.Init_random_int_ary(Int_.Ary(240563374, 22728940, 1451248133)); + fxt.Test_uniq_bry_new("UNIQE56B4AE15AD0EC68"); + + fxt.Init_random_int_ary(Int_.Ary(1363621437, 426295411, 421041101)); + fxt.Test_uniq_bry_new("UNIQ147363D968C07391"); + } +} +class Xop_util_fxt { + private final Xop_util util = new Xop_util(); + public Xop_util_fxt Init_random_int_ary(int... v) {util.Random_int_ary_(v); return this;} + public void Test_uniq_bry_new(String expd) { + Tfds.Eq_str(expd, String_.new_a7(util.Uniq_bry_new()), "unique_bry"); + } +} diff --git a/400_xowa/src/gplx/xowa/setup/maints/Xoa_maint_mgr.java b/400_xowa/src/gplx/xowa/setup/maints/Xoa_maint_mgr.java index af72f061d..d44620c88 100644 --- a/400_xowa/src/gplx/xowa/setup/maints/Xoa_maint_mgr.java +++ b/400_xowa/src/gplx/xowa/setup/maints/Xoa_maint_mgr.java @@ -77,5 +77,5 @@ public class Xoa_maint_mgr implements GfoInvkAble { else return GfoInvkAble_.Rv_unhandled; return this; } private static final String Invk_wmf_status_update = "wmf_status_update", Invk_wikis = "wikis"; - public static Io_url Wmf_dump_status_url(Xoae_app app) {return app.Fsys_mgr().Bin_any_dir().GenSubDir_nest("html", "xowa", "maint", "backup-index.html");} + public static Io_url Wmf_dump_status_url(Xoae_app app) {return app.Fsys_mgr().Bin_xowa_dir().GenSubDir_nest("xtns", "xowa", "maintenance", "backup-index.html");} } diff --git a/400_xowa/src/gplx/xowa/specials/search/Xows_page__search.java b/400_xowa/src/gplx/xowa/specials/search/Xows_page__search.java index 40454cfec..0a1c31781 100644 --- a/400_xowa/src/gplx/xowa/specials/search/Xows_page__search.java +++ b/400_xowa/src/gplx/xowa/specials/search/Xows_page__search.java @@ -59,8 +59,9 @@ public class Xows_page__search implements Xows_page, GfoInvkAble, GfoEvObj { search_bry = ttl.Leaf_txt_wo_qarg(); // assume search is in leaf; EX: Special:Search/Earth args_mgr.Search_bry_(search_bry); } + if (Bry_.Len_eq_0(search_bry)) return; // emptry String; exit now, else null ref error; DATE:2015-08-11 if ( search_suggest_mgr.Auto_wildcard() // add * automatically if option set - && wiki.Db_mgr().Tid() == gplx.xowa.dbs.Xodb_mgr_sql.Tid_sql // only apply to sql + && wiki.Db_mgr().Tid() == gplx.xowa.dbs.Xodb_mgr_sql.Tid_sql // only apply to sql && Bry_finder.Find_fwd(search_bry, Byte_ascii.Star) == -1 // search term does not have asterisk ) search_bry = Bry_.Add(search_bry, Byte_ascii.Star); diff --git a/400_xowa/src/gplx/xowa/specials/search/Xows_ui_async_tst.java b/400_xowa/src/gplx/xowa/specials/search/Xows_ui_async_tst.java index f40af0d31..892dd4d3d 100644 --- a/400_xowa/src/gplx/xowa/specials/search/Xows_ui_async_tst.java +++ b/400_xowa/src/gplx/xowa/specials/search/Xows_ui_async_tst.java @@ -53,8 +53,8 @@ class Xows_ui_async_fxt { int expd_len = expd.length; Tfds.Eq(expd_len, js_wkr.Log__len()); for (int i = 0; i < expd_len; ++i) { - String expd_str = String_.ConcatWith_any("\n", expd[i]); - String actl_str = String_.ConcatWith_any("\n", js_wkr.Log__get_at(i)); + String expd_str = String_.Concat_with_obj("\n", expd[i]); + String actl_str = String_.Concat_with_obj("\n", js_wkr.Log__get_at(i)); Tfds.Eq_str_lines(expd_str, actl_str); } js_wkr.Log__clear(); diff --git a/400_xowa/src/gplx/xowa/specials/xowa/bookmarks/Dbui_tbl_itm__bmk.java b/400_xowa/src/gplx/xowa/specials/xowa/bookmarks/Dbui_tbl_itm__bmk.java index 8332b41c7..8d99208d2 100644 --- a/400_xowa/src/gplx/xowa/specials/xowa/bookmarks/Dbui_tbl_itm__bmk.java +++ b/400_xowa/src/gplx/xowa/specials/xowa/bookmarks/Dbui_tbl_itm__bmk.java @@ -21,6 +21,7 @@ import gplx.xowa.users.data.*; import gplx.xowa.users.bmks.*; import gplx.xowa.html.bridges.*; import gplx.xowa.html.bridges.dbuis.*; import gplx.xowa.html.bridges.dbuis.tbls.*; import gplx.xowa.html.bridges.dbuis.fmtrs.*; public class Dbui_tbl_itm__bmk implements Dbui_tbl_itm { private final Xoa_app app; private final Xoud_bmk_itm_tbl tbl; + private final Dbui_tbl_fmtr tbl_fmtr = new Dbui_tbl_fmtr(); private final Dbui_cells_fmtr cells_fmtr = new Dbui_cells_fmtr(); private final Dbui_val_fmtr edit_val_fmtr = Dbui_val_fmtr_.new_edit(); private final Dbui_val_fmtr view_val_fmtr = Dbui_val_fmtr_.new_view(); private final Bry_bfr tmp_bfr = Bry_bfr.new_(255); private final Bridge_msg_bldr msg_bldr; @@ -29,7 +30,6 @@ public class Dbui_tbl_itm__bmk implements Dbui_tbl_itm { public Dbui_btn_itm[] View_btns() {return view_btns;} public Dbui_btn_itm[] Edit_btns() {return edit_btns;} public Dbui_col_itm[] Cols() {return cols;} - private final Dbui_tbl_fmtr tbl_fmtr = new Dbui_tbl_fmtr(); public void Reg(Bridge_cmd_mgr bridge_mgr) { Dbui_cmd_mgr dbui_mgr = Dbui_cmd_mgr.I; dbui_mgr.Init_by_bridge(bridge_mgr); diff --git a/400_xowa/src/gplx/xowa/specials/xowa/bookmarks/Dbui_tbl_itm__history.java b/400_xowa/src/gplx/xowa/specials/xowa/bookmarks/Dbui_tbl_itm__history.java new file mode 100644 index 000000000..80a5433e4 --- /dev/null +++ b/400_xowa/src/gplx/xowa/specials/xowa/bookmarks/Dbui_tbl_itm__history.java @@ -0,0 +1,95 @@ +/* +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.specials.xowa.bookmarks; import gplx.*; import gplx.xowa.*; import gplx.xowa.specials.*; import gplx.xowa.specials.xowa.*; +import gplx.core.json.*; import gplx.html.*; +import gplx.xowa.users.data.*; import gplx.xowa.users.bmks.*; +import gplx.xowa.html.bridges.*; import gplx.xowa.html.bridges.dbuis.*; import gplx.xowa.html.bridges.dbuis.tbls.*; import gplx.xowa.html.bridges.dbuis.fmtrs.*; +public class Dbui_tbl_itm__history implements Dbui_tbl_itm { + private final Xoa_app app; private final Xoud_history_tbl tbl; + private final Dbui_tbl_fmtr tbl_fmtr = new Dbui_tbl_fmtr(); + private final Bry_bfr tmp_bfr = Bry_bfr.new_(255); + private final Bridge_msg_bldr msg_bldr; + public Dbui_tbl_itm__history(Xoa_app app, Xoud_history_tbl tbl) {this.app = app; this.tbl = tbl; this.msg_bldr = app.Html__bridge_mgr().Msg_bldr();} + public byte[] Key() {return key;} private static final byte[] key = Bry_.new_a7("history"); + public Dbui_btn_itm[] View_btns() {return view_btns;} + public Dbui_btn_itm[] Edit_btns() {return Dbui_btn_itm.Ary_empty;} + public Dbui_col_itm[] Cols() {return cols;} + public void Reg(Bridge_cmd_mgr bridge_mgr) { + Dbui_cmd_mgr dbui_mgr = Dbui_cmd_mgr.I; + dbui_mgr.Init_by_bridge(bridge_mgr); + dbui_mgr.Add(this); + } + private final List_adp select_list = List_adp_.new_(); + public void Select(Bry_bfr bfr, int top) { + tbl.Select_by_top(select_list, 100); + Xoud_history_row[] db_rows = (Xoud_history_row[])select_list.To_ary_and_clear(Xoud_history_row.class); + byte[] option_link = app.Html__lnki_bldr().Href_(Bry_.new_a7("home"), app.User().Wikii().Ttl_parse(Bry_.new_a7("Help:Options/PageHistory"))).Img_16x16(gplx.xowa.html.wtrs.Xoh_img_path.Img_option).Bld_to_bry(); + byte[] delete_confirm_msg = app.Api_root().Usr().Bookmarks().Delete_confirm() ? Msg__delete_confirm : Bry_.Empty; + tbl_fmtr.Write(bfr, this, option_link, delete_confirm_msg, To_ui_rows(db_rows)); + } private static final byte[] Msg__delete_confirm = Bry_.new_a7(" data-dbui-delete_confirm_msg='Are you sure you want to delete this row?'"); + public String Del(byte[] row_id, byte[] row_pkey) { + Xoud_history_row db_row = Get_db_row(row_pkey); if (db_row == null) return Fail_missing_row(row_pkey); + tbl.Delete(db_row.Id()); + return msg_bldr.To_json_str__empty(); + } + public String Edit(byte[] row_id, byte[] row_pkey) {throw Err_.new_unimplemented();} + public String Save(byte[] row_id, byte[] row_pkey, Dbui_val_hash vals) {throw Err_.new_unimplemented();} + public String Reorder(byte[][] pkeys, int owner) {throw Err_.new_unimplemented();} + public Dbui_row_itm[] To_ui_rows(Xoud_history_row[] db_rows) { + int len = db_rows.length; + Dbui_row_itm[] rv = new Dbui_row_itm[len]; + for (int i = 0; i < len; ++i) + rv[i] = Get_ui_row(db_rows[i]); + return rv; + } + private Xoud_history_row Get_db_row(byte[] pkey) { + int id = Bry_.To_int(pkey); + return tbl.Select_or_null(id); + } + private Dbui_row_itm Get_ui_row(Xoud_history_row row) {return Get_ui_row(Int_.Xto_bry(row.Id()), row.Wiki(), row.Url(), row.Count(), row.Time());} + private Dbui_row_itm Get_ui_row(byte[] pkey, byte[] wiki, byte[] url, int count, DateAdp time) { + Dbui_val_itm[] vals = new Dbui_val_itm[4]; + vals[0] = new Dbui_val_itm(url, url_fmtr.Bld_bry_many(tmp_bfr, Html_utl.Escape_for_atr_val_as_bry(tmp_bfr, Byte_ascii.Apos, url))); + vals[1] = new Dbui_val_itm(wiki, wiki); + byte[] count_bry = Int_.Xto_bry(count); + vals[2] = new Dbui_val_itm(count_bry, count_bry); + byte[] time_bry = Bry_.new_u8(time.XtoStr_fmt_yyyy_MM_dd_HH_mm_ss()); + vals[3] = new Dbui_val_itm(time_bry, time_bry); + return new Dbui_row_itm(this, pkey, vals); + } + private String Fail_missing_row(byte[] row_pkey) { + return msg_bldr.Clear().Notify_fail_(Err_msg.To_str("Item has been deleted", "key", row_pkey)).Notify_hint_("Please reload the page").To_json_str(); + } + private static final Dbui_col_itm[] cols = new Dbui_col_itm[] + { new Dbui_col_itm(Dbui_col_itm.Type_id_str , 300, "page" , "Page") + , new Dbui_col_itm(Dbui_col_itm.Type_id_str , 150, "wiki" , "Wiki") + , new Dbui_col_itm(Dbui_col_itm.Type_id_int , 80, "views" , "Views") + , new Dbui_col_itm(Dbui_col_itm.Type_id_datetime, 100, "time" , "Time") + }; + private static final Dbui_btn_itm[] view_btns = new Dbui_btn_itm[] + { new Dbui_btn_itm("rows__delete" , "delete.png" , "delete") + }; + private static final Bry_fmtr url_fmtr = Bry_fmtr.new_("~{url}", "url"); + public static Dbui_tbl_itm__history get_or_new(Xoa_app app, Xoud_history_tbl db_tbl) { + if (I == null) { + I = new Dbui_tbl_itm__history(app, db_tbl); + I.Reg(app.Html__bridge_mgr().Cmd_mgr()); + } + return I; + } private static Dbui_tbl_itm__history I; +} diff --git a/400_xowa/src/gplx/xowa/specials/xowa/system_data/System_data_page.java b/400_xowa/src/gplx/xowa/specials/xowa/system_data/System_data_page.java index 2056dfca5..97dd733b8 100644 --- a/400_xowa/src/gplx/xowa/specials/xowa/system_data/System_data_page.java +++ b/400_xowa/src/gplx/xowa/specials/xowa/system_data/System_data_page.java @@ -36,7 +36,7 @@ public class System_data_page implements Xows_page { Xoae_app app = wiki.Appe(); switch (type) { case Type_log_session: return app.Log_wtr().Session_fil(); - case Type_cfg_app: return app.Fsys_mgr().Root_dir().GenSubFil("xowa.gfs"); + case Type_cfg_app: return app.Fsys_mgr().Cfg_app_fil(); case Type_cfg_lang: return Xol_lang_.xo_lang_fil_(app.Fsys_mgr(), wiki.Lang().Key_str()); case Type_cfg_user: return app.Usere().Fsys_mgr().App_data_cfg_user_fil(); case Type_cfg_custom: return app.Usere().Fsys_mgr().App_data_cfg_custom_fil(); diff --git a/400_xowa/src/gplx/xowa/urls/Xoa_url_parser.java b/400_xowa/src/gplx/xowa/urls/Xoa_url_parser.java index ef68acf3d..4c46dcd18 100644 --- a/400_xowa/src/gplx/xowa/urls/Xoa_url_parser.java +++ b/400_xowa/src/gplx/xowa/urls/Xoa_url_parser.java @@ -36,7 +36,7 @@ public class Xoa_url_parser { this.app = wiki.App(); this.wiki = wiki; this.domain_bry = wiki.Domain_bry(); this.encoder = app.Utl__encoder_mgr().Xourl(); - this.vnt_mgr = wiki.Lang().Vnt_mgr(); + this.vnt_mgr = wiki.Type_is_edit() ? wiki.Lang().Vnt_mgr() : null; } public Xoa_url Parse_by_urlbar(String str) { Xoae_app app = (Xoae_app)wiki.App(); diff --git a/400_xowa/src/gplx/xowa/urls/Xoa_url_parser__xwiki_tst.java b/400_xowa/src/gplx/xowa/urls/Xoa_url_parser__xwiki_tst.java index 37c9a59fc..8e6062faa 100644 --- a/400_xowa/src/gplx/xowa/urls/Xoa_url_parser__xwiki_tst.java +++ b/400_xowa/src/gplx/xowa/urls/Xoa_url_parser__xwiki_tst.java @@ -52,7 +52,7 @@ public class Xoa_url_parser__xwiki_tst { tstr.Run_parse(en_s, "Category:A").Chk_wiki("en.wikisource.org").Chk_page("Category:A"); } @Test public void Case_sensitive() { - // tstr.Run_parse("en.wikipedia.org/wiki/a").Chk_wiki("en.wikipedia.org").Chk_page("A"); // TODO: enforce case sentitive? + // tstr.Run_parse("en.wikipedia.org/wiki/a").Chk_wiki("en.wikipedia.org").Chk_page("A"); Xowe_wiki en_d = tstr.Prep_create_wiki("en.wiktionary.org"); Xow_ns_mgr ns_mgr = en_d.Ns_mgr(); diff --git a/400_xowa/src/gplx/xowa/users/Xou_fsys_mgr.java b/400_xowa/src/gplx/xowa/users/Xou_fsys_mgr.java index 27a002397..cd741531a 100644 --- a/400_xowa/src/gplx/xowa/users/Xou_fsys_mgr.java +++ b/400_xowa/src/gplx/xowa/users/Xou_fsys_mgr.java @@ -26,7 +26,6 @@ public class Xou_fsys_mgr implements GfoInvkAble { app_temp_html_dir = app_temp_dir.GenSubDir("html"); app_data_history_fil = app_root_dir.GenSubFil_nest("data", "history", "page_history.csv"); wiki_root_dir = cur_root.GenSubDir("wiki"); - home_wiki_dir = wiki_root_dir.GenSubDir_nest(Xow_domain_type_.Key_str_home); } public Io_url Root_dir() {return cur_root;} public Io_url Wiki_root_dir() {return wiki_root_dir;} @@ -39,7 +38,6 @@ public class Xou_fsys_mgr implements GfoInvkAble { public Io_url App_data_cfg_dir() {return app_root_dir.GenSubDir_nest("data", "cfg");} public Io_url App_data_cfg_user_fil() {return app_root_dir.GenSubFil_nest("data", "cfg", Xoa_gfs_mgr.Cfg_user_file);} public Io_url App_data_cfg_custom_fil() {return app_root_dir.GenSubFil_nest("data", "cfg", Xoa_gfs_mgr.Cfg_user_custom_file);} - public Io_url Home_wiki_dir() {return home_wiki_dir;} private Io_url home_wiki_dir; public static final String Name_user_system_cfg = "user_system_cfg.gfs"; public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { if (ctx.Match(k, Invk_root_dir)) return cur_root; diff --git a/400_xowa/src/gplx/xowa/users/Xou_user_.java b/400_xowa/src/gplx/xowa/users/Xou_user_.java index 17cde09a5..00122368a 100644 --- a/400_xowa/src/gplx/xowa/users/Xou_user_.java +++ b/400_xowa/src/gplx/xowa/users/Xou_user_.java @@ -20,7 +20,8 @@ import gplx.xowa.langs.cases.*; import gplx.xowa.wikis.*; import gplx.xowa.xtns. import gplx.xowa.wikis.domains.*; class Xou_user_ { public static Xowe_wiki new_or_create_(Xoue_user user, Xoae_app app) { - Io_url wiki_dir = user.Fsys_mgr().Home_wiki_dir().GenSubDir_nest("wiki", Xow_domain_type_.Key_str_home); +// Io_url wiki_dir = user.Fsys_mgr().Home_wiki_dir().GenSubDir_nest("wiki", Xow_domain_type_.Key_str_home); + Io_url wiki_dir = app.Fsys_mgr().Home_wiki_dir(); Xol_lang lang = app.Lang_mgr().Get_by_key_or_new(app.Lang_mgr().Default_lang()); lang.Init_by_load(); // NOTE: lang.Load() must occur before Xowe_wiki.new() b/c wiki will create parsers based on lang Xowe_wiki rv = new Xowe_wiki(app, lang, ns_home_(lang.Case_mgr()), Xow_domain_uid_.To_domain(Xow_domain_uid_.Tid_xowa), wiki_dir); diff --git a/400_xowa/src/gplx/xowa/users/Xouc_setup_mgr.java b/400_xowa/src/gplx/xowa/users/Xouc_setup_mgr.java index 69da0679f..42346c445 100644 --- a/400_xowa/src/gplx/xowa/users/Xouc_setup_mgr.java +++ b/400_xowa/src/gplx/xowa/users/Xouc_setup_mgr.java @@ -31,17 +31,13 @@ public class Xouc_setup_mgr implements GfoInvkAble { case Op_sys.Tid_drd: case Op_sys.Tid_wnt: return; } - String op_sys_name = Xoa_app_.Op_sys; + String op_sys_name = Xoa_app_.Op_sys_str; String[] plats_ary = String_.Split(setup_completed, ";"); int plats_ary_len = plats_ary.length; for (int i = 0; i < plats_ary_len; i++) { if (String_.Eq(plats_ary[i], op_sys_name)) return; } -// Io_url lua_url = app.Fsys_mgr().Bin_plat_dir().GenSubFil_nest("lua", "lua"); -// Io_url lua_install_url = app.Fsys_mgr().Bin_plat_dir().GenSubFil_nest("lua", "lua_install"); -// Run(String_.Format("mv -f \"{0}\" \"{1}\"", lua_install_url.Raw(), lua_url.Raw())); -// Run(String_.Format("chmod 774 \"{0}\"", lua_url.Raw())); - Io_url setup_url = app.Fsys_mgr().Root_dir().GenSubFil_ary("setup_", op_sys_name, ".sh"); + Io_url setup_url = app.Fsys_mgr().Root_dir().GenSubFil_nest("bin", op_sys_name, "xowa", "script", "setup_lua.sh"); Run("sh", String_.Format("\"{0}\"", setup_url.Raw())); setup_completed += op_sys_name + ";"; app.Cfg_mgr().Set_by_all("app.user.cfg.setup.setup_completed", setup_completed); diff --git a/400_xowa/src/gplx/xowa/users/Xoue_user.java b/400_xowa/src/gplx/xowa/users/Xoue_user.java index f3b3a44ee..8e5dd7be0 100644 --- a/400_xowa/src/gplx/xowa/users/Xoue_user.java +++ b/400_xowa/src/gplx/xowa/users/Xoue_user.java @@ -101,9 +101,6 @@ public class Xoue_user implements Xou_user, GfoEvMgrOwner, GfoInvkAble { public static final String Key_xowa_user = "anonymous"; public static final String Evt_lang_changed = "lang_changed"; public void Available_from_fsys() { - Io_url bookmarks_dir = fsys_mgr.Home_wiki_dir().GenSubDir_nest("wiki", "home", "ns", "730"); // NOTE: putting bookmark check here (instead of at init) b/c Init runs before xowa.gfs, and Bookmarks needs xowa.gfs to run first - if (!Io_mgr.I.ExistsDir(bookmarks_dir)) Xou_user_.Bookmarks_make(app, this.Wiki()); - Io_url[] dirs = Io_mgr.I.QueryDir_args(app.Fsys_mgr().Wiki_dir()).Recur_(false).DirOnly_().ExecAsUrlAry(); Xowe_wiki usr_wiki = Wiki(); int dirs_len = dirs.length; diff --git a/400_xowa/src/gplx/xowa/users/data/Xou_db_file.java b/400_xowa/src/gplx/xowa/users/data/Xou_db_file.java index 4eb8df864..33e2f09ed 100644 --- a/400_xowa/src/gplx/xowa/users/data/Xou_db_file.java +++ b/400_xowa/src/gplx/xowa/users/data/Xou_db_file.java @@ -27,20 +27,15 @@ public class Xou_db_file { this.tbl__site = new Xoud_site_tbl(conn); this.tbl__history = new Xoud_history_tbl(conn); this.tbl__cache = new Xou_cache_tbl(conn); -// this.tbl__bmk = new Xoud_bmk_tbl(conn); } public Db_cfg_tbl Tbl__cfg() {return tbl__cfg;} private final Db_cfg_tbl tbl__cfg; public Xoud_site_tbl Tbl__site() {return tbl__site;} private final Xoud_site_tbl tbl__site; public Xoud_history_tbl Tbl__history() {return tbl__history;} private final Xoud_history_tbl tbl__history; public Xou_cache_tbl Tbl__cache() {return tbl__cache;} private final Xou_cache_tbl tbl__cache; -// public Xoud_bmk_tbl Tbl__bmk() {return tbl__bmk;} private final Xoud_bmk_tbl tbl__bmk; public void Init_assert() { if (!conn.Meta_tbl_exists(tbl__cache.Tbl_name())) { tbl__cfg.Create_tbl(); tbl__cache.Create_tbl(); } -// if (!conn.Meta_tbl_exists(tbl__bmk.Tbl_name())) { -// tbl__bmk.Create_tbl(); -// } } } \ No newline at end of file diff --git a/400_xowa/src/gplx/xowa/users/data/Xoud_history_mgr.java b/400_xowa/src/gplx/xowa/users/data/Xoud_history_mgr.java index 527cfc31f..b982a0110 100644 --- a/400_xowa/src/gplx/xowa/users/data/Xoud_history_mgr.java +++ b/400_xowa/src/gplx/xowa/users/data/Xoud_history_mgr.java @@ -29,12 +29,12 @@ public class Xoud_history_mgr implements GfoInvkAble { // async_mgr.Queue(this, Invk_update, "wiki", String_.new_u8(url.Wiki_bry()), "page", String_.new_u8(url.Page_bry()), "qarg", String_.new_u8(url.Args_all_as_bry())); } private void Update(String wiki, String page, String qarg) { - Xoud_history_row row = history_tbl.Select_by_page(wiki, page, qarg); - DateAdp time = DateAdp_.Now(); - if (row == null) - history_tbl.Insert(wiki, page, qarg, time, 1); - else - history_tbl.Update(wiki, page, qarg, time, row.History_count() + 1); +// Xoud_history_row row = history_tbl.Select_by_page(wiki, page, qarg); +// DateAdp time = DateAdp_.Now(); +// if (row == null) +// history_tbl.Insert(wiki, page, qarg, time, 1); +// else +// history_tbl.Update(wiki, page, qarg, time, row.Count() + 1); } public void Select(List_adp rv, int top) { history_tbl.Select_by_top(rv, top); diff --git a/400_xowa/src/gplx/xowa/users/data/Xoud_history_row.java b/400_xowa/src/gplx/xowa/users/data/Xoud_history_row.java index a5dfbfe82..a736e0c28 100644 --- a/400_xowa/src/gplx/xowa/users/data/Xoud_history_row.java +++ b/400_xowa/src/gplx/xowa/users/data/Xoud_history_row.java @@ -17,17 +17,14 @@ along with this program. If not, see . */ package gplx.xowa.users.data; import gplx.*; import gplx.xowa.*; import gplx.xowa.users.*; public class Xoud_history_row { - public Xoud_history_row(String history_wiki, String history_page, String history_qarg, DateAdp history_time, int history_count) { - this.history_wiki = history_wiki; - this.history_page = history_page; - this.history_qarg = history_qarg; - this.history_time = history_time; - this.history_count = history_count; + public Xoud_history_row(int id, byte[] wiki, byte[] url, DateAdp time, int count) { + this.id = id; + this.wiki = wiki; this.url = url; + this.time = time; this.count = count; } - public String History_wiki() {return history_wiki;} private final String history_wiki; - public String History_page() {return history_page;} private final String history_page; - public String History_qarg() {return history_qarg;} private final String history_qarg; - public DateAdp History_time() {return history_time;} private final DateAdp history_time; - public int History_count() {return history_count;} private final int history_count; - public static final Xoud_history_row Null = null; + public int Id() {return id;} private final int id; + public byte[] Wiki() {return wiki;} private final byte[] wiki; + public byte[] Url() {return url;} private final byte[] url; + public DateAdp Time() {return time;} private final DateAdp time; + public int Count() {return count;} private final int count; } diff --git a/400_xowa/src/gplx/xowa/users/data/Xoud_history_special.java b/400_xowa/src/gplx/xowa/users/data/Xoud_history_special.java index 0e77d5399..f80beb7dc 100644 --- a/400_xowa/src/gplx/xowa/users/data/Xoud_history_special.java +++ b/400_xowa/src/gplx/xowa/users/data/Xoud_history_special.java @@ -17,43 +17,15 @@ along with this program. If not, see . */ package gplx.xowa.users.data; import gplx.*; import gplx.xowa.*; import gplx.xowa.users.*; import gplx.xowa.specials.*; -public class Xoud_history_special implements Bry_fmtr_arg, Xows_page { - private List_adp rows = List_adp_.new_(); +import gplx.xowa.specials.xowa.bookmarks.*; +public class Xoud_history_special implements Xows_page { public Xows_special_meta Special_meta() {return Xows_special_meta_.Itm__page_history;} public void Special_gen(Xowe_wiki wiki, Xoae_page page, Xoa_url url, Xoa_ttl ttl) { - Xoae_app app = wiki.Appe(); - Xoud_history_mgr mgr = app.User().User_db_mgr().History_mgr(); - mgr.Select(rows, 100); - Bry_bfr bfr = app.Utl__bfr_mkr().Get_m001(); - html_grp.Bld_bfr_many(bfr, this); - page.Data_raw_(bfr.To_bry_and_rls()); + Xoa_app app = wiki.App(); + Dbui_tbl_itm__history ui_tbl = Dbui_tbl_itm__history.get_or_new(app, app.User().User_db_mgr().Db_file().Tbl__history()); + page.Html_data().Head_mgr().Itm__dbui().Init(app).Enabled_y_(); + Bry_bfr bfr = wiki.Utl__bfr_mkr().Get_m001(); + ui_tbl.Select(bfr, 100); + page.Hdump_data().Body_(bfr.To_bry_and_rls()); } - public void XferAry(Bry_bfr bfr, int idx) { - int len = rows.Count(); - for (int i = 0; i < len; i++) { - Xoud_history_row row = (Xoud_history_row)rows.Get_at(i); - html_itm.Bld_bfr_many(bfr, row.History_wiki(), row.History_page(), row.History_count(), row.History_time().XtoStr_fmt_yyyy_MM_dd_HH_mm()); - } - } - private static Bry_fmtr html_grp = Bry_fmtr.new_(String_.Concat_lines_nl_skip_last - ( "" - , " " - , " " - , " " - , " " - , " " - , " ~{itms}" - , "
pagewikiviewstime
" - ), "itms" - ); - private static Bry_fmtr html_itm = Bry_fmtr.new_(String_.Concat_lines_nl_skip_last - ( "" - , " " - , " [[~{itm_wiki}:~{itm_page}|~{itm_page}]]" - , " ~{itm_wiki}" - , " ~{itm_count}" - , " ~{itm_last}" - , " " - ), "itm_wiki", "itm_page", "itm_count", "itm_last" - ); } diff --git a/400_xowa/src/gplx/xowa/users/data/Xoud_history_tbl.java b/400_xowa/src/gplx/xowa/users/data/Xoud_history_tbl.java index 309b6ebc7..be2f50a5b 100644 --- a/400_xowa/src/gplx/xowa/users/data/Xoud_history_tbl.java +++ b/400_xowa/src/gplx/xowa/users/data/Xoud_history_tbl.java @@ -19,19 +19,19 @@ package gplx.xowa.users.data; import gplx.*; import gplx.xowa.*; import gplx.xow import gplx.dbs.*; import gplx.dbs.qrys.*; import gplx.dbs.metas.*; import gplx.dbs.metas.updates.*; public class Xoud_history_tbl implements RlsAble { private final String tbl_name = "user_history"; private final Db_meta_fld_list flds = Db_meta_fld_list.new_(); - private final String fld_wiki, fld_page, fld_qarg, fld_time, fld_count; + private final String fld_id, fld_wiki, fld_url, fld_time, fld_count; private final Db_conn conn; private Db_stmt stmt_select_by_page, stmt_select_by_top, stmt_insert, stmt_update, stmt_delete; - public Xoud_history_tbl(Db_conn conn) { + public Xoud_history_tbl(Db_conn conn) { this.conn = conn; + fld_id = flds.Add_int_pkey_autonum("hist_id"); fld_wiki = flds.Add_str("hist_wiki", 255); - fld_page = flds.Add_str("hist_page", 255); - fld_qarg = flds.Add_str("hist_qarg", 255); + fld_url = flds.Add_str("hist_url", 255); fld_time = flds.Add_str("hist_time", 20); fld_count = flds.Add_int("hist_count"); stmt_insert = stmt_update = stmt_delete = stmt_select_by_page = stmt_select_by_top = null; conn.Rls_reg(this); } - public void Create_tbl() {conn.Ddl_create_tbl(Db_meta_tbl.new_(tbl_name, flds, Db_meta_idx.new_unique_by_tbl(tbl_name, "pkey", fld_wiki, fld_page, fld_qarg)));} + public void Create_tbl() {conn.Ddl_create_tbl(Db_meta_tbl.new_(tbl_name, flds, Db_meta_idx.new_unique_by_tbl(tbl_name, "pkey", fld_wiki, fld_url)));} public void Rls() { stmt_insert = Db_stmt_.Rls(stmt_insert); stmt_update = Db_stmt_.Rls(stmt_update); @@ -39,31 +39,32 @@ public class Xoud_history_tbl implements RlsAble { stmt_select_by_page = Db_stmt_.Rls(stmt_select_by_page); stmt_select_by_top = Db_stmt_.Rls(stmt_select_by_top); } - public void Insert(String wiki, String page, String qarg, DateAdp time, int count) { + public void Insert(byte[] wiki, byte[] url, DateAdp time, int count) { if (stmt_insert == null) stmt_insert = conn.Stmt_insert(tbl_name, flds); stmt_insert.Clear() - .Val_str(fld_wiki, wiki).Val_str(fld_page, page).Val_str(fld_qarg, qarg) - .Val_str(fld_time, time.XtoStr_fmt_iso_8561()).Val_int(fld_count, count) + .Val_bry_as_str(fld_wiki, wiki) + .Val_bry_as_str(fld_url , url) + .Val_str(fld_time, time.XtoStr_fmt_iso_8561()) + .Val_int(fld_count, count) .Exec_insert(); } - public void Update(String wiki, String page, String qarg, DateAdp time, int count) { - if (stmt_update == null) stmt_update = conn.Stmt_update(tbl_name, String_.Ary(fld_wiki, fld_page, fld_qarg), fld_time, fld_count); + public void Update(int id, DateAdp time, int count) { + if (stmt_update == null) stmt_update = conn.Stmt_update(tbl_name, String_.Ary(fld_id), fld_time, fld_count); stmt_update.Clear() - .Val_str(fld_time, time.XtoStr_fmt_iso_8561()).Val_int(fld_count, count) - .Crt_str(fld_wiki, wiki).Crt_str(fld_page, page).Crt_str(fld_qarg, qarg) + .Val_str(fld_time, time.XtoStr_fmt_iso_8561()) + .Val_int(fld_count, count) + .Crt_int(fld_id, id) .Exec_update(); } - public void Delete(String wiki, String page, String qarg) { - if (stmt_delete == null) stmt_delete = conn.Stmt_delete(tbl_name, fld_wiki, fld_page, fld_qarg); - stmt_delete.Clear() - .Crt_str(fld_wiki, wiki).Crt_str(fld_page, page).Crt_str(fld_qarg, qarg) - .Exec_delete(); + public void Delete(int id) { + Db_stmt stmt_delete = conn.Stmt_delete(tbl_name, fld_id); + stmt_delete.Clear().Crt_int(fld_id, id).Exec_delete(); } - public Xoud_history_row Select_by_page(String wiki, String page, String qarg) { - if (stmt_select_by_page == null) stmt_select_by_page = conn.Stmt_select(tbl_name, flds, fld_wiki, fld_page, fld_qarg); - Db_rdr rdr = stmt_select_by_page.Clear().Crt_str(fld_wiki, wiki).Crt_str(fld_page, page).Crt_str(fld_qarg, qarg).Exec_select__rls_manual(); + public Xoud_history_row Select_or_null(int id) { + if (stmt_select_by_page == null) stmt_select_by_page = conn.Stmt_select(tbl_name, flds, fld_id); + Db_rdr rdr = stmt_select_by_page.Clear().Crt_int(fld_id, id).Exec_select__rls_manual(); try { - return rdr.Move_next() ? new_row(rdr) : Xoud_history_row.Null; + return rdr.Move_next() ? new_row(rdr) : null; } finally {rdr.Rls();} } @@ -84,9 +85,9 @@ public class Xoud_history_tbl implements RlsAble { } private Xoud_history_row new_row(Db_rdr rdr) { return new Xoud_history_row - ( rdr.Read_str(fld_wiki) - , rdr.Read_str(fld_page) - , rdr.Read_str(fld_qarg) + ( rdr.Read_int(fld_id) + , rdr.Read_bry_by_str(fld_wiki) + , rdr.Read_bry_by_str(fld_url) , rdr.Read_date_by_str(fld_time) , rdr.Read_int(fld_count) ); diff --git a/400_xowa/src/gplx/xowa/users/prefs/Prefs_mgr.java b/400_xowa/src/gplx/xowa/users/prefs/Prefs_mgr.java index f232dc416..96c961c7d 100644 --- a/400_xowa/src/gplx/xowa/users/prefs/Prefs_mgr.java +++ b/400_xowa/src/gplx/xowa/users/prefs/Prefs_mgr.java @@ -55,8 +55,8 @@ public class Prefs_mgr implements GfoInvkAble { Xoae_page page = app.Gui_mgr().Browser_win().Active_page(); Props_set(page.Data_raw()); page.Wikie().ParsePage_root(page, true); // reparse in order to save new values to root; needed for history and going back / fwd; DATE:2014-02-07 - app.Api_root().Gui().Page().View().Reload(); // force reload to update page; needed for language; DATE:2014-05-26 - app.Usr_dlg().Prog_direct("options saved (" + DateAdp_.Now().XtoStr_fmt("HH:mm:ss") + ")"); + // app.Api_root().Gui().Page().View().Reload(); // force reload to update page; needed for language; DATE:2014-05-26; NOTE: deactivate on 2015-08-13; refreshing page causes options to not show + Xog_tab_itm tab = app.Gui_mgr().Browser_win().Active_tab(); if (tab != null) tab.Exec_notify(Bool_.Y, "options saved"); } public void Props_set(byte[] src) { src = Bry_.Replace(src, Bry_.new_a7(""), Bry_.new_a7("<xowa_cmd>")); diff --git a/400_xowa/src/gplx/xowa/wikis/data/Xowd_core_db_props.java b/400_xowa/src/gplx/xowa/wikis/data/Xowd_core_db_props.java index 85721256e..29762a894 100644 --- a/400_xowa/src/gplx/xowa/wikis/data/Xowd_core_db_props.java +++ b/400_xowa/src/gplx/xowa/wikis/data/Xowd_core_db_props.java @@ -32,7 +32,7 @@ public class Xowd_core_db_props { public byte Zip_tid_text() {return zip_tid_text;} private final byte zip_tid_text; public byte Zip_tid_html() {return zip_tid_html;} private final byte zip_tid_html; public void Cfg_save(Db_cfg_tbl tbl) { - tbl.Conn().Txn_bgn(); + tbl.Conn().Txn_bgn("make__core__cfg__save"); tbl.Insert_int (Cfg_grp, Cfg_key__schema_version , schema); tbl.Insert_str (Cfg_grp, Cfg_key__layout_text , layout_text.Name()); tbl.Insert_str (Cfg_grp, Cfg_key__layout_html , layout_html.Name()); diff --git a/400_xowa/src/gplx/xowa/wikis/data/Xowd_db_mgr.java b/400_xowa/src/gplx/xowa/wikis/data/Xowd_db_mgr.java index 76e341ec4..3df390a44 100644 --- a/400_xowa/src/gplx/xowa/wikis/data/Xowd_db_mgr.java +++ b/400_xowa/src/gplx/xowa/wikis/data/Xowd_db_mgr.java @@ -78,7 +78,7 @@ public class Xowd_db_mgr { byte core_db_tid = Core_db_tid(props.Layout_text()); Io_url core_db_url = wiki_root_dir.GenSubFil(core_file_name); Db_conn conn = Db_conn_bldr.I.New(core_db_url); - conn.Txn_bgn(); + conn.Txn_bgn("make__core__tbls"); Dbs__set_by_tid(Xowd_db_file.make_(info_session, props, Xowd_db_file_.Id_core, core_db_tid, core_db_url, Xob_info_file.Ns_ids_empty, Xob_info_file.Part_id_1st, core_file_name, conn)); db__core.Tbl__db().Create_tbl(); db__core.Tbl__ns().Create_tbl(); diff --git a/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_cat_core_tbl.java b/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_cat_core_tbl.java index acce74a55..ff9f17ecc 100644 --- a/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_cat_core_tbl.java +++ b/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_cat_core_tbl.java @@ -38,7 +38,7 @@ public class Xowd_cat_core_tbl implements RlsAble { conn.Rls_reg(this); } public Xowd_cat_core_tbl Create_tbl() {conn.Ddl_create_tbl(Db_meta_tbl.new_(tbl_name, flds)); return this;} - public void Insert_bgn() {conn.Txn_bgn(); stmt_insert = conn.Stmt_insert(tbl_name, flds);} + public void Insert_bgn() {conn.Txn_bgn("schema__cat_core__insert"); stmt_insert = conn.Stmt_insert(tbl_name, flds);} public void Insert_end() {conn.Txn_end(); stmt_insert = Db_stmt_.Rls(stmt_insert);} public void Insert_cmd_by_batch(int id, int pages, int subcats, int files, byte hidden, int link_db_id) { stmt_insert.Clear() @@ -46,7 +46,7 @@ public class Xowd_cat_core_tbl implements RlsAble { .Val_byte(fld_hidden, hidden).Val_int(fld_link_db_id, link_db_id) .Exec_insert(); } - public void Update_bgn() {conn.Txn_bgn(); stmt_update = conn.Stmt_update(tbl_name, String_.Ary(fld_id), fld_hidden);} + public void Update_bgn() {conn.Txn_bgn("schema__cat_core__update"); stmt_update = conn.Stmt_update(tbl_name, String_.Ary(fld_id), fld_hidden);} public void Update_end() {conn.Txn_end(); stmt_update = Db_stmt_.Rls(stmt_update);} public void Update_by_batch(int id, byte hidden) { stmt_update.Clear().Val_byte(fld_hidden, hidden).Crt_int(fld_id, id).Exec_update(); diff --git a/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_cat_link_tbl.java b/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_cat_link_tbl.java index 552f422dd..702b81e32 100644 --- a/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_cat_link_tbl.java +++ b/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_cat_link_tbl.java @@ -39,7 +39,7 @@ public class Xowd_cat_link_tbl implements RlsAble { , Db_meta_idx.new_normal_by_tbl(tbl_name, "from", fld_from) ); } - public void Insert_bgn() {conn.Txn_bgn(); stmt_insert = conn.Stmt_insert(tbl_name, flds);} + public void Insert_bgn() {conn.Txn_bgn("schema__cat_link__insert"); stmt_insert = conn.Stmt_insert(tbl_name, flds);} public void Insert_end() {conn.Txn_end(); stmt_insert = Db_stmt_.Rls(stmt_insert);} public void Insert_cmd_by_batch(int page_id, int ctg_page_id, byte ctg_tid, byte[] sortkey, int timestamp) { stmt_insert.Clear() diff --git a/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_html_tbl.java b/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_html_tbl.java index eaf8d9ba6..1aab199fc 100644 --- a/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_html_tbl.java +++ b/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_html_tbl.java @@ -32,7 +32,7 @@ public class Xowd_html_tbl implements RlsAble { public Db_conn Conn() {return conn;} public void Create_tbl() {conn.Ddl_create_tbl(Db_meta_tbl.new_(tbl_name, flds));} public void Create_idx() {conn.Ddl_create_idx(Gfo_usr_dlg_.I, Db_meta_idx.new_unique_by_tbl(tbl_name, "main", fld_page_id, fld_html_tid));} - public void Insert_bgn() {conn.Txn_bgn(); stmt_insert = conn.Stmt_insert(tbl_name, flds);} + public void Insert_bgn() {conn.Txn_bgn("schema__html__insert"); stmt_insert = conn.Stmt_insert(tbl_name, flds);} public void Insert_end() {conn.Txn_end(); stmt_insert = Db_stmt_.Rls(stmt_insert);} public int Insert(int page_id, int tid, byte[] data) { if (stmt_insert == null) stmt_insert = conn.Stmt_insert(tbl_name, flds); diff --git a/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_page_tbl.java b/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_page_tbl.java index 97d4707de..d37116f6a 100644 --- a/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_page_tbl.java +++ b/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_page_tbl.java @@ -53,7 +53,7 @@ public class Xowd_page_tbl implements RlsAble { conn.Rls_reg(this); } public void Create_tbl() {conn.Ddl_create_tbl(Db_meta_tbl.new_(tbl_name, flds.To_fld_ary()));} - public void Insert_bgn() {conn.Txn_bgn(); stmt_insert = conn.Stmt_insert(tbl_name, flds);} + public void Insert_bgn() {conn.Txn_bgn("schema__page__insert"); stmt_insert = conn.Stmt_insert(tbl_name, flds);} public void Insert_end() {conn.Txn_end(); stmt_insert = Db_stmt_.Rls(stmt_insert);} public void Insert_cmd_by_batch(int page_id, int ns_id, byte[] ttl_wo_ns, boolean page_is_redirect, DateAdp modified_on, int page_len, int random_int, int text_db_id, int html_db_id) { stmt_insert.Clear() @@ -141,7 +141,7 @@ public class Xowd_page_tbl implements RlsAble { hash.Add(p.Id_val(), p); } hash.Sort_by(Xowd_page_itm_sorter.IdAsc); // sort by ID to reduce disk thrashing; DATE:2015-03-31 - conn.Txn_bgn(); + conn.Txn_bgn("schema__page__select_in"); try { Xowd_page_tbl__id wkr = new Xowd_page_tbl__id(); wkr.Ctor(this, tbl_name, fld_id); diff --git a/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_search_link_tbl.java b/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_search_link_tbl.java index ea969ac79..95f04804d 100644 --- a/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_search_link_tbl.java +++ b/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_search_link_tbl.java @@ -37,7 +37,7 @@ public class Xowd_search_link_tbl { public void Create_tbl() {conn.Ddl_create_tbl(Db_meta_tbl.new_(tbl_name, flds));} public void Create_idx_unique() {conn.Ddl_create_idx(Xoa_app_.Usr_dlg(), Db_meta_idx.new_unique_by_tbl(tbl_name, "main", fld_word_id, fld_page_id));} public void Create_idx_normal() {conn.Ddl_create_idx(Xoa_app_.Usr_dlg(), Db_meta_idx.new_normal_by_tbl(tbl_name, "main", fld_word_id, fld_page_id));} - public void Insert_bgn() {conn.Txn_bgn(); stmt_insert = conn.Stmt_insert(tbl_name, flds);} + public void Insert_bgn() {conn.Txn_bgn("schema__search_link__insert"); stmt_insert = conn.Stmt_insert(tbl_name, flds);} public void Insert_end() {conn.Txn_end(); stmt_insert = Db_stmt_.Rls(stmt_insert);} public void Insert_cmd_by_batch(int word_id, int page_id) { stmt_insert.Clear().Val_int(fld_word_id, word_id).Val_int(fld_page_id, page_id).Exec_insert(); diff --git a/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_search_temp_tbl.java b/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_search_temp_tbl.java index 1162959b5..f6a7e3022 100644 --- a/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_search_temp_tbl.java +++ b/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_search_temp_tbl.java @@ -31,7 +31,7 @@ public class Xowd_search_temp_tbl { fld_word_text = flds.Add_str("word_text", 255); } public void Create_tbl() {conn.Ddl_create_tbl(Db_meta_tbl.new_(tbl_name, flds));} - public void Insert_bgn() {conn.Txn_bgn(); stmt_insert = conn.Stmt_insert(tbl_name, flds);} + public void Insert_bgn() {conn.Txn_bgn("schema__search_temp__insert"); stmt_insert = conn.Stmt_insert(tbl_name, flds);} public void Insert_end() {conn.Txn_end(); stmt_insert = Db_stmt_.Rls(stmt_insert);} public void Insert_cmd_by_batch(int page_id, byte[] word) { stmt_insert.Clear() diff --git a/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_search_word_tbl.java b/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_search_word_tbl.java index f25b6fc0c..f1fd2b5df 100644 --- a/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_search_word_tbl.java +++ b/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_search_word_tbl.java @@ -33,7 +33,7 @@ public class Xowd_search_word_tbl implements RlsAble { } public void Create_tbl() {conn.Ddl_create_tbl(Db_meta_tbl.new_(tbl_name, flds));} public void Create_idx() {conn.Ddl_create_idx(Xoa_app_.Usr_dlg(), Db_meta_idx.new_unique_by_tbl(tbl_name, "main", fld_text, fld_id, fld_page_count));} - public void Insert_bgn() {conn.Txn_bgn(); stmt_insert = conn.Stmt_insert(tbl_name, flds);} + public void Insert_bgn() {conn.Txn_bgn("schema__search_word__insert"); stmt_insert = conn.Stmt_insert(tbl_name, flds);} public void Insert_end() {conn.Txn_end(); stmt_insert = Db_stmt_.Rls(stmt_insert);} public void Insert_cmd_by_batch(int id, byte[] word, int page_count) { stmt_insert.Clear().Val_int(fld_id, id).Val_bry_as_str(fld_text, word).Val_int(fld_page_count, page_count).Exec_insert(); @@ -98,7 +98,7 @@ public class Xowd_search_word_tbl implements RlsAble { } public void Ddl__page_count__add(Xowd_search_link_tbl link_tbl, Db_cfg_tbl cfg_tbl) { Db_meta_fld page_count_fld = Db_meta_fld.new_int("word_page_count").Default_(0); - conn.Txn_bgn(); + conn.Txn_bgn("schema__search_word__upgrade"); conn.Ddl_append_fld(tbl_name, page_count_fld); // SQL: ALTER TABLE search_word ADD word_page_count integer NOT NULL DEFAULT 0; String sql = String_.Format(String_.Concat_lines_nl_skip_last ( "REPLACE INTO {0} ({1}, {2}, word_page_count)" diff --git a/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_text_tbl.java b/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_text_tbl.java index 31fe63eea..692100e42 100644 --- a/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_text_tbl.java +++ b/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_text_tbl.java @@ -32,7 +32,7 @@ public class Xowd_text_tbl implements RlsAble { conn.Rls_reg(this); } public void Create_tbl() {conn.Ddl_create_tbl(Db_meta_tbl.new_(tbl_name, flds));} - public void Insert_bgn() {conn.Txn_bgn(); stmt_insert = conn.Stmt_insert(tbl_name, flds);} + public void Insert_bgn() {conn.Txn_bgn("schema__text__insert"); stmt_insert = conn.Stmt_insert(tbl_name, flds);} public void Insert_end() {conn.Txn_end(); stmt_insert = Db_stmt_.Rls(stmt_insert);} public void Insert_cmd_by_batch(int page_id, byte[] text_data) { stmt_insert.Clear().Val_int(fld_page_id, page_id).Val_bry(fld_text_data, text_data).Exec_insert(); diff --git a/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_wbase_pid_tbl.java b/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_wbase_pid_tbl.java index 09104d1c6..3eda255de 100644 --- a/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_wbase_pid_tbl.java +++ b/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_wbase_pid_tbl.java @@ -33,7 +33,7 @@ public class Xowd_wbase_pid_tbl implements RlsAble { } public void Create_tbl() {conn.Ddl_create_tbl(Db_meta_tbl.new_(tbl_name, flds));} public void Create_idx() {conn.Ddl_create_idx(Xoa_app_.Usr_dlg(), Db_meta_idx.new_normal_by_tbl(tbl_name, "src", fld_src_lang, fld_src_ttl));} - public void Insert_bgn() {conn.Txn_bgn(); stmt_insert = conn.Stmt_insert(tbl_name, flds);} + public void Insert_bgn() {conn.Txn_bgn("schema__wbase_pid__insert"); stmt_insert = conn.Stmt_insert(tbl_name, flds);} public void Insert_end() {conn.Txn_end(); stmt_insert = Db_stmt_.Rls(stmt_insert);} public void Insert_cmd_by_batch(byte[] src_lang, byte[] src_ttl, byte[] trg_ttl) { stmt_insert.Clear() diff --git a/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_wbase_qid_tbl.java b/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_wbase_qid_tbl.java index a4e424bd4..40abd1e62 100644 --- a/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_wbase_qid_tbl.java +++ b/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_wbase_qid_tbl.java @@ -35,7 +35,7 @@ public class Xowd_wbase_qid_tbl implements RlsAble { } public void Create_tbl() {conn.Ddl_create_tbl(Db_meta_tbl.new_(tbl_name, flds));} public void Create_idx() {conn.Ddl_create_idx(Xoa_app_.Usr_dlg(), Db_meta_idx.new_normal_by_tbl(tbl_name, "src", fld_src_wiki, fld_src_ns, fld_src_ttl));} - public void Insert_bgn() {conn.Txn_bgn(); stmt_insert = conn.Stmt_insert(tbl_name, flds);} + public void Insert_bgn() {conn.Txn_bgn("schema__wbase_qid__insert"); stmt_insert = conn.Stmt_insert(tbl_name, flds);} public void Insert_end() {conn.Txn_end(); stmt_insert = Db_stmt_.Rls(stmt_insert);} public void Insert_cmd_by_batch(byte[] src_wiki, int src_ns, byte[] src_ttl, byte[] trg_ttl) { stmt_insert.Clear() diff --git a/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_xowa_db_tbl.java b/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_xowa_db_tbl.java index 3e4036a0d..0149dab28 100644 --- a/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_xowa_db_tbl.java +++ b/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_xowa_db_tbl.java @@ -76,7 +76,7 @@ public class Xowd_xowa_db_tbl { itm.Cmd_mode_(Db_cmd_mode.Tid_ignore); } private void Commit_itm_vals(Db_stmt stmt, Xowd_db_file itm) { - stmt.Val_byte(fld_type, itm.Tid()).Val_str(fld_url, itm.Url_rel()).Val_str(fld_ns_ids, itm.Ns_ids()).Val_int(fld_part_id, itm.Part_id()).Val_str(fld_guid, itm.Guid().XtoStr()); + stmt.Val_byte(fld_type, itm.Tid()).Val_str(fld_url, itm.Url_rel()).Val_str(fld_ns_ids, itm.Ns_ids()).Val_int(fld_part_id, itm.Part_id()).Val_str(fld_guid, itm.Guid().To_str()); } } class Xowd_db_file_sorter__id implements gplx.lists.ComparerAble { diff --git a/400_xowa/src/gplx/xowa/wikis/domains/Xow_domain_abrv_xo_.java b/400_xowa/src/gplx/xowa/wikis/domains/Xow_domain_abrv_xo_.java index 094154b84..f6b4b2508 100644 --- a/400_xowa/src/gplx/xowa/wikis/domains/Xow_domain_abrv_xo_.java +++ b/400_xowa/src/gplx/xowa/wikis/domains/Xow_domain_abrv_xo_.java @@ -18,6 +18,10 @@ along with this program. If not, see . package gplx.xowa.wikis.domains; import gplx.*; import gplx.xowa.*; import gplx.xowa.wikis.*; import gplx.xowa.langs.*; public class Xow_domain_abrv_xo_ { + public static byte[] To_bry(byte[] domain_bry) { + Xow_domain domain_itm = Xow_domain_.parse(domain_bry); + return Xow_domain_abrv_xo_.To_bry(domain_itm.Domain_bry(), domain_itm.Lang_orig_itm(), domain_itm.Domain_type()); + } public static byte[] To_bry(byte[] domain_bry, Xol_lang_itm lang, Xow_domain_type type) { // en.wikipedia.org -> en.w byte[] type_abrv = type.Abrv(); if (type.Multi_lang()) // wikipedia,wiktionary,etc.. diff --git a/400_xowa/src/gplx/xowa/wikis/xwikis/Xow_lang_mgr.java b/400_xowa/src/gplx/xowa/wikis/xwikis/Xow_lang_mgr.java index 6b630361b..c5410c665 100644 --- a/400_xowa/src/gplx/xowa/wikis/xwikis/Xow_lang_mgr.java +++ b/400_xowa/src/gplx/xowa/wikis/xwikis/Xow_lang_mgr.java @@ -110,7 +110,7 @@ class Xow_lang_html implements Bry_fmtr_arg { Bry_bfr tmp_bfr = wiki.Utl__bfr_mkr().Get_b128().Mkr_rls(); byte[] msg_lang = wiki.Msg_mgr().Val_by_id(Xol_msg_itm_.Id_page_lang_header); byte[] wikidata_link = Bry_.Len_eq_0(qid) ? Bry_.Empty : lang_mgr.Html_wikidata_link().Bld_bry_many(tmp_bfr, qid); - toggle_itm.Init(wiki, msg_lang); + toggle_itm.Init(msg_lang); lang_mgr.Html_div().Bld_bfr_many(bfr, ttl_list.Count(), wikidata_link, toggle_itm.Html_toggle_btn(), toggle_itm.Html_toggle_hdr(), this); stage = 0; break; diff --git a/400_xowa/src/gplx/xowa/wmfs/Xow_wmf_api_mgr.java b/400_xowa/src/gplx/xowa/wmfs/Xow_wmf_api_mgr.java index 6b816631d..3e8b58572 100644 --- a/400_xowa/src/gplx/xowa/wmfs/Xow_wmf_api_mgr.java +++ b/400_xowa/src/gplx/xowa/wmfs/Xow_wmf_api_mgr.java @@ -16,48 +16,16 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.wmfs; import gplx.*; import gplx.xowa.*; +import gplx.core.json.*; import gplx.xowa.wmfs.data.*; public class Xow_wmf_api_mgr { public void Trg_engine_key(String v) {this.trg_engine_key = v;} private String trg_engine_key = gplx.ios.IoEngine_.SysKey; - public void Api_exec(Xow_wmf_api_wkr wkr) {this.Api_exec(Wikis, wkr);} - public void Api_exec(String[] wiki_ary, Xow_wmf_api_wkr wkr) { - Gfo_usr_dlg usr_dlg = Xoa_app_.Usr_dlg(); - int len = wiki_ary.length; - wkr.Api_init(); - for (int i = 0; i < len; ++i) { - String wiki = wiki_ary[i]; - if (!wkr.Api_wiki_enabled(wiki)) continue; - String call = String_.Format("https://{0}/w/api.php?{1}", wiki, wkr.Api_qargs()); // EX: https://en.wikipedia.org/w/api.php?action=query&meta=siteinfo&siprop=namespaces - usr_dlg.Prog_many("", "", "wmf_api:calling; wiki=~{0} api=~{1}", wiki, call); - byte[] rslt = null; - for (int j = 0; j < 5; ++j) { - rslt = Io_mgr.I.DownloadFil_args("", null).User_agent_(Xoa_app_.User_agent).Trg_engine_key_(trg_engine_key).Exec_as_bry(call); - if (rslt != null) break; - usr_dlg.Warn_many("", "", "wmf_api:wmf api returned nothing; retrying; api=~{0}", call); - gplx.core.threads.Thread_adp_.Sleep(1000); - } - if (rslt == null) { - usr_dlg.Warn_many("", "", "wmf_api:wmf api returned nothing; api=~{0}", call); - continue; - } - wkr.Api_exec(wiki, rslt); - } - wkr.Api_term(); - } - public void Api_exec2(String[] wiki_ary, Xow_wmf_api_wkr[] wkr) { - Gfo_usr_dlg usr_dlg = Xoa_app_.Usr_dlg(); - int len = wiki_ary.length; - String all_args = ""; - Xowmf_json_tbl json_tbl = new Xowmf_json_tbl(null); - for (int i = 0; i < len; ++i) { - String wiki = wiki_ary[i]; - String call = String_.Format("https://{0}/w/api.php?{1}", wiki, all_args); // EX: https://en.wikipedia.org/w/api.php?action=query&meta=siteinfo&siprop=namespaces - usr_dlg.Prog_many("", "", "wmf_api:calling; wiki~{0} api=~{1}", wiki, call); - byte[] rslt = Io_mgr.I.DownloadFil_args("", null).Trg_engine_key_(trg_engine_key).Exec_as_bry(call); - if (rslt == null) {usr_dlg.Warn_many("", "", "wmf_api:wmf api returned nothing; api=~{0}", call); continue;} - int site_id = -1; - json_tbl.Insert(site_id, DateAdp_.Now(), rslt); - } + public byte[] Api_exec(Gfo_usr_dlg usr_dlg, Xowmf_mgr wmf_mgr, String domain_str, String api_args) { + String call = String_.Format("https://{0}/w/api.php?{1}", domain_str, api_args); // EX: https://en.wikipedia.org/w/api.php?action=query&meta=siteinfo&siprop=namespaces + usr_dlg.Prog_many("", "", "wmf_api:calling; wiki~{0} api=~{1}", domain_str, call); + byte[] rslt = wmf_mgr.Download_wkr().Download_xrg().Trg_engine_key_(trg_engine_key).Exec_as_bry(call); + if (rslt == null) usr_dlg.Warn_many("", "", "wmf_api:wmf api returned nothing; api=~{0}", call); + return rslt; } public static String[] Wikis = new String[] { "commons.wikimedia.org" @@ -269,7 +237,7 @@ public class Xow_wmf_api_mgr { , "uk.wikiquote.org" , "uk.wikinews.org" , "uk.wikivoyage.org" -, "uk.wikimedia.org" +, "ua.wikimedia.org" , "vi.wikipedia.org" , "vi.wiktionary.org" , "vi.wikisource.org" @@ -884,6 +852,7 @@ public class Xow_wmf_api_mgr { , "zu.wikibooks.org" , "gom.wikipedia.org" , "lrc.wikipedia.org" +, "azb.wikipedia.org" }; //, "als.wikisource.org" //, "als.wikinews.org" diff --git a/400_xowa/src/gplx/xowa/wmfs/Xow_wmf_api_wkr__ns.java b/400_xowa/src/gplx/xowa/wmfs/Xow_wmf_api_wkr__ns.java deleted file mode 100644 index 559b7574c..000000000 --- a/400_xowa/src/gplx/xowa/wmfs/Xow_wmf_api_wkr__ns.java +++ /dev/null @@ -1,78 +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 . -*/ -package gplx.xowa.wmfs; import gplx.*; import gplx.xowa.*; -import gplx.core.json.*; -import gplx.xowa.wmfs.data.*; -public class Xow_wmf_api_wkr__ns implements Xow_wmf_api_wkr { - private final Json_parser parser = new Json_parser(); - private final Xowmf_site_tbl tbl_site; private final Xowmf_ns_tbl tbl_ns; - private int site_id_next = 1; - public Xow_wmf_api_wkr__ns(Xowmf_site_tbl tbl_site, Xowmf_ns_tbl tbl_ns) { - this.tbl_site = tbl_site; this.tbl_ns = tbl_ns; - } - public boolean Api_wiki_enabled(String wiki_domain) {return true;} // run against all wikis - public String Api_qargs() {return "action=query&meta=siteinfo&siprop=namespaces&format=json";} - public void Api_init() { - tbl_site.Conn().Txn_bgn(); - tbl_site.Delete_all(); - tbl_ns.Delete_all(); - } - public boolean Api_exec(String wiki_domain, byte[] rslt) { - try { - int site_id = ++site_id_next; - tbl_site.Insert(site_id, wiki_domain); - Json_doc jdoc = parser.Parse(rslt); - Json_grp ns_grp = jdoc.Get_grp(Bry_jpath); if (ns_grp == null) throw Err_.new_wo_type("wmf_api_wkr.ns:invalid json", "json", rslt); - int ns_len = ns_grp.Len(); - for (int i = 0; i < ns_len; ++i) { - try { - Json_kv kv = (Json_kv)ns_grp.Get_at(i); - Json_nde nde = (Json_nde)kv.Val(); - int ns_id = Bry_.To_int_or(Get_val_or_null(nde, Bry_id), Int_.MinValue); - byte ns_case = Xow_ns_case_.parse_(String_.new_u8(Get_val_or_null(nde, Bry_case))); - byte[] ns_name = Get_val_or_null(nde, Bry_name); - byte[] ns_canonical = Get_val_or_null(nde, Bry_canonical); - if (ns_canonical == null) ns_canonical = Bry_.Empty; // main_ns has no canonical - byte[] subpages = Get_val_or_null(nde, Bry_subpages); - byte[] content = Get_val_or_null(nde, Bry_content); - tbl_ns.Insert(site_id, ns_id, ns_case, subpages != null, content != null, ns_name, ns_canonical); - } catch (Exception e) { - Xoa_app_.Usr_dlg().Warn_many("", "", "wmf_api_wkr.ns:unknown; wiki=~{0} rslt=~{1} i=~{2} err=~{3}", wiki_domain, rslt, i, Err_.Message_gplx_full(e)); - continue; - } - } - tbl_site.Conn().Txn_sav(); - return true; - } catch (Exception e) { - Xoa_app_.Usr_dlg().Warn_many("", "", "wmf_api_wkr.ns:unknown; wiki=~{0} rslt=~{1} err=~{2}", wiki_domain, rslt, Err_.Message_gplx_full(e)); - return false; - } - } - public void Api_term() { - tbl_site.Conn().Txn_end(); - } - private byte[] Get_val_or_null(Json_nde nde, byte[] key) { - Json_itm sub = nde.Get_itm(key); - Json_kv sub_as_kv = (Json_kv)sub; - return sub_as_kv == null ? null : sub_as_kv.Val().Data_bry(); // sub_as_kv == null when key is not present; note that "canonical" does not exist for Main ns - } - private static final byte[] Bry_query = Bry_.new_a7("query"), Bry_namespaces = Bry_.new_a7("namespaces") - , Bry_id = Bry_.new_a7("id"), Bry_case = Bry_.new_a7("case"), Bry_name = Bry_.new_a7("*"), Bry_canonical = Bry_.new_a7("canonical") - , Bry_subpages = Bry_.new_a7("subpages"), Bry_content = Bry_.new_a7("content"); - private static final byte[][] Bry_jpath = new byte[][] {Bry_query, Bry_namespaces}; -} diff --git a/400_xowa/src/gplx/xowa/wmfs/data/Json_parser__list_nde__base.java b/400_xowa/src/gplx/xowa/wmfs/data/Json_parser__list_nde__base.java new file mode 100644 index 000000000..ee723716b --- /dev/null +++ b/400_xowa/src/gplx/xowa/wmfs/data/Json_parser__list_nde__base.java @@ -0,0 +1,349 @@ +/* +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.wmfs.data; import gplx.*; import gplx.xowa.*; import gplx.xowa.wmfs.*; +import gplx.core.primitives.*; import gplx.core.json.*; +abstract class Json_parser__base { + protected String context; + protected final Hash_adp_bry hash = Hash_adp_bry.cs(); + protected final Bry_bfr tmp_bfr = Bry_bfr.new_(255); + protected String[] keys; + protected Json_kv[] atrs; + protected Json_itm cur_itm; + protected int keys_len; + public void Ctor(String... keys) { + this.keys = keys; + this.keys_len = keys.length; + for (int i = 0; i < keys_len; ++i) + hash.Add(Bry_.new_u8(keys[i]), Int_obj_val.new_(i)); + this.atrs = new Json_kv[keys_len]; + } + public int Kv__int(Json_kv[] ary, int i) {return Bry_.To_int(ary[i].Val_as_bry());} + public long Kv__long(Json_kv[] ary, int i) {return Bry_.To_long_or(ary[i].Val_as_bry(), 0);} + public long Kv__long_or_0(Json_kv[] ary, int i) { + Json_kv kv = ary[i]; if (kv == null) return 0; + return Bry_.To_long_or(kv.Val_as_bry(), 0); + } + public byte[] Kv__bry(Json_kv[] ary, int i) { + byte[] rv = Kv__bry_or_null(ary, i); if (rv == null) throw Err_.new_("json.parser", "missing val", "key", context + "." + keys[i], "excerpt", Json_itm_.To_bry(tmp_bfr, cur_itm)); + return rv; + } + public byte[][] Kv__bry_ary(Json_kv[] ary, int i) { + return ary[i].Val_as_ary().Xto_bry_ary(); + } + public byte[] Kv__bry_or_empty(Json_kv[] ary, int i) { + byte[] rv = Kv__bry_or_null(ary, i); + return rv == null ? Bry_.Empty : rv; + } + public byte[] Kv__bry_or_null(Json_kv[] ary, int i) { + Json_kv kv = ary[i]; if (kv == null) return null; + Json_itm val = kv.Val(); + return kv == null ? null : val.Data_bry(); + } + public boolean Kv__mw_bool(Json_kv[] ary, int i) { + Json_kv kv = ary[i]; if (kv == null) return false; + Json_itm val = kv.Val(); + if ( val.Tid() == Json_itm_.Tid_string + && Bry_.Len_eq_0(val.Data_bry())) { + return true; + } + else { + Warn("unknown val: val=" + String_.new_u8(kv.Data_bry()) + " excerpt=" + String_.new_u8(Json_itm_.To_bry(tmp_bfr, cur_itm)), kv); + return false; + } + } + public boolean Kv__has(Json_kv[] ary, int i) {return Kv__bry_or_empty(ary, i) != null;} + protected abstract void Parse_hook_nde(Json_nde sub, Json_kv[] atrs); + protected void Warn(String msg, Json_kv kv) { + Gfo_usr_dlg_.I.Warn_many("", "", msg + ": path=~{0}.~{1} excerpt=~{2}", context, kv.Key_as_bry(), Json_itm_.To_bry(tmp_bfr, cur_itm)); + } +} +class Json_parser__list_nde__base extends Json_parser__base { + public void Parse_grp(String context, Json_grp grp) { + this.context = context; + int len = grp.Len(); + for (int i = 0; i < len; ++i) { + Json_nde sub = null; + if (grp.Tid() == Json_itm_.Tid_nde) { + Json_kv kv = Json_nde.cast_(grp).Get_at_as_kv(i); + sub = kv.Val_as_nde(); + } + else { + sub = Json_nde.cast_(grp.Get_at(i)); + } + Parse_nde(context, sub); + } + } + public void Parse_nde(String context, Json_nde nde) { + this.cur_itm = nde; + for (int j = 0; j < keys_len; ++j) + atrs[j] = null; + int atr_len = nde.Len(); + for (int j = 0; j < atr_len; ++j) { + Json_kv atr = nde.Get_at_as_kv(j); + Object idx_obj = hash.Get_by_bry(atr.Key_as_bry()); + if (idx_obj == null) {Warn("unknown key", atr); continue;} + int idx_int = ((Int_obj_val)idx_obj).Val(); + atrs[idx_int] = atr; + } + Parse_hook_nde(nde, atrs); + } + public void Parse_to_list_as_bry(String context, Json_ary ary, Ordered_hash list) { + this.cur_itm = ary; + int len = ary.Len(); + for (int i = 0; i < len; ++i) { + byte[] val = ary.Get_at(i).Data_bry(); + list.Add(val, val); + } + } + public void Parse_to_list_as_kv(String context, Json_nde nde, Ordered_hash list) { + this.cur_itm = nde; + int len = nde.Len(); + for (int i = 0; i < len; ++i) { + Json_kv sub = nde.Get_at_as_kv(i); + byte[] key = sub.Key_as_bry(); + byte[] val = Parse_to_list_as_kv__get_val(sub, key); + list.Add(key, KeyVal_.new_(String_.new_u8(key), String_.new_u8(val))); + } + } + @gplx.Virtual protected byte[] Parse_to_list_as_kv__get_val(Json_kv sub, byte[] key) {return sub.Val_as_bry();} + @Override protected void Parse_hook_nde(Json_nde sub, Json_kv[] atrs) {} +} +class Site_meta_parser__general extends Json_parser__list_nde__base { + public void Parse(String context, Ordered_hash list, Json_nde nde) { + this.Parse_to_list_as_kv(context + ".general", nde, list); + } + @Override protected byte[] Parse_to_list_as_kv__get_val(Json_kv sub, byte[] key) { + Object o = complex_props.Get_by_bry(key); + if (o == null) return sub.Val_as_bry(); + switch (((Int_obj_val)o).Val()) { + case Tid__thumblimits: return Bry_.Add_w_dlm(Byte_ascii.Pipe, sub.Val_as_ary().Xto_bry_ary()); // [120, 150, 180] -> "120|150|180" + case Tid__imagelimits: return Parse_thumblimits(sub); // [ {'width':320,'height':240}, {'width':640,'height':480}] -> '320=240|640=480' + default: throw Err_.new_unhandled(o); + } + } + private byte[] Parse_thumblimits(Json_kv sub) { + Json_ary ary = sub.Val_as_ary(); + int ary_len = ary.Len(); + for (int i = 0; i < ary_len; ++i) { + Json_nde nde = ary.Get_at_as_nde(i); + int atr_len = nde.Len(); + for (int j = 0; j < atr_len; ++j) { + Json_kv atr = nde.Get_at_as_kv(j); + Object idx_obj = complex_props.Get_by_bry(atr.Key_as_bry()); + if (idx_obj == null) {Warn("unknown key", atr); continue;} + int atr_tid = ((Int_obj_val)idx_obj).Val(); + switch (atr_tid) { + case Tid__imagelimits__width: if (i != 0) tmp_bfr.Add_byte_pipe(); break; + case Tid__imagelimits__height: tmp_bfr.Add_byte_eq(); break; + default: throw Err_.new_unhandled(atr_tid); + } + tmp_bfr.Add(atr.Val_as_bry()); + } + } + return tmp_bfr.Xto_bry_and_clear(); + } + private static final int Tid__thumblimits = 1, Tid__imagelimits = 2, Tid__imagelimits__width = 3, Tid__imagelimits__height = 4; + private static final Hash_adp_bry complex_props = Hash_adp_bry.cs() + .Add_str_int("thumblimits" , Tid__thumblimits) + .Add_str_int("imagelimits" , Tid__imagelimits) + .Add_str_int("width" , Tid__imagelimits__width) + .Add_str_int("height" , Tid__imagelimits__height) + ; +} +class Site_meta_parser__namespace extends Json_parser__list_nde__base { + private Ordered_hash list; + public Site_meta_parser__namespace() { + this.Ctor("id", "canonical", "ca"+"se", "*", "subpages", "content", "defaultcontentmodel"); + } + public void Parse(String context, Ordered_hash list, Json_nde nde) { + this.list = list; + this.Parse_grp(context + ".namespace", nde); + } + @Override protected void Parse_hook_nde(Json_nde sub, Json_kv[] atrs) { + int id = Kv__int(atrs, 0); + list.Add(id, new Site_namespace_itm(id, Kv__bry(atrs, 2), Kv__bry_or_empty(atrs, 1), Kv__bry(atrs, 3), Kv__mw_bool(atrs, 4), Kv__mw_bool(atrs, 5), Kv__bry_or_empty(atrs, 6))); + } +} +class Site_meta_parser__statistic extends Json_parser__list_nde__base { + private Site_statistic_itm itm; + public Site_meta_parser__statistic() { + this.Ctor("pages", "articles", "edits", "images", "users", "activeusers", "admins", "jobs", "queued-massmessages"); + } + public void Parse(String context, Site_statistic_itm itm, Json_nde nde) { + this.itm = itm; + this.Parse_nde(context + ".statistic", nde); + } + @Override protected void Parse_hook_nde(Json_nde sub, Json_kv[] atrs) { + itm.Ctor + ( Kv__long(atrs, 0) + , Kv__long(atrs, 1) + , Kv__long(atrs, 2) + , Kv__long(atrs, 3) + , Kv__long(atrs, 4) + , Kv__long(atrs, 5) + , Kv__long(atrs, 6) + , Kv__long(atrs, 7) + , Kv__long_or_0(atrs, 8) + ); + } +} +class Site_meta_parser__interwikimap extends Json_parser__list_nde__base { + private Ordered_hash list; + public Site_meta_parser__interwikimap() { + this.Ctor("prefix", "local", "language", "localinterwiki", "url", "protorel"); + } + public void Parse(String context, Ordered_hash list, Json_ary nde) { + this.list = list; + this.Parse_grp(context + ".interwikimap", nde); + } + @Override protected void Parse_hook_nde(Json_nde sub, Json_kv[] atrs) { + byte[] key = Kv__bry(atrs, 0); + list.Add(key, new Site_interwikimap_itm(key, Kv__mw_bool(atrs, 1), Kv__bry_or_empty(atrs, 2), Kv__mw_bool(atrs, 3), Kv__bry(atrs, 4), Kv__mw_bool(atrs, 5))); + } +} +class Site_meta_parser__namespacealias extends Json_parser__list_nde__base { + private List_adp list; + public Site_meta_parser__namespacealias() { + this.Ctor("id", "*"); + } + public void Parse(String context, List_adp list, Json_ary nde) { + this.list = list; + this.Parse_grp(context + ".namespacealias", nde); + } + @Override protected void Parse_hook_nde(Json_nde sub, Json_kv[] atrs) { + Site_namespacealias_itm itm = new Site_namespacealias_itm(Kv__int(atrs, 0), Kv__bry(atrs, 1)); + list.Add(itm); + } +} +class Site_meta_parser__specialpagealias extends Json_parser__list_nde__base { + private Ordered_hash list; + public Site_meta_parser__specialpagealias() { + this.Ctor("realname", "aliases"); + } + public void Parse(String context, Ordered_hash list, Json_ary nde) { + this.list = list; + this.Parse_grp(context + ".specialpagealias", nde); + } + @Override protected void Parse_hook_nde(Json_nde sub, Json_kv[] atrs) { + byte[] key = Kv__bry(atrs, 0); + list.Add(key, new Site_specialpagealias_itm(key, Kv__bry_ary(atrs, 1))); + } +} +class Site_meta_parser__library extends Json_parser__list_nde__base { + private Ordered_hash list; + public Site_meta_parser__library() { + this.Ctor("name", "version"); + } + public void Parse(String context, Ordered_hash list, Json_ary nde) { + this.list = list; + this.Parse_grp(context + ".library", nde); + } + @Override protected void Parse_hook_nde(Json_nde sub, Json_kv[] atrs) { + byte[] key = Kv__bry(atrs, 0); + list.Add(key, new Site_library_itm(key, Kv__bry(atrs, 1))); + } +} +class Site_meta_parser__extension extends Json_parser__list_nde__base { + private Ordered_hash list; + public Site_meta_parser__extension() { + this.Ctor("type", "name", "namemsg", "description", "descriptionmsg", "author", "url", "version", "vcs-system", "vcs-version", "vcs-url", "vcs-date", "license-name", "license", "credits"); + } + public void Parse(String context, Ordered_hash list, Json_ary nde) { + this.list = list; + this.Parse_grp(context + ".extension", nde); + } + @Override protected void Parse_hook_nde(Json_nde sub, Json_kv[] atrs) { + Site_extension_itm itm = new Site_extension_itm(Kv__bry(atrs, 0), Kv__bry(atrs, 1), Kv__bry_or_empty(atrs, 2), Kv__bry_or_empty(atrs, 3), Kv__bry_or_empty(atrs, 4) + , Kv__bry_or_empty(atrs, 5), Kv__bry_or_empty(atrs, 6) + , Kv__bry_or_empty(atrs, 7), Kv__bry_or_empty(atrs, 8), Kv__bry_or_empty(atrs, 9), Kv__bry_or_empty(atrs, 10), Kv__bry_or_empty(atrs, 11) + , Kv__bry_or_empty(atrs, 12), Kv__bry_or_empty(atrs, 13), Kv__bry_or_empty(atrs, 14) + ); + list.Add(itm.Key(), itm); + } +} +class Site_meta_parser__skin extends Json_parser__list_nde__base { + private Ordered_hash list; + public Site_meta_parser__skin() { + this.Ctor("code", "de"+"fault", "*", "unusable"); + } + public void Parse(String context, Ordered_hash list, Json_ary nde) { + this.list = list; + this.Parse_grp(context + ".skin", nde); + } + @Override protected void Parse_hook_nde(Json_nde sub, Json_kv[] atrs) { + byte[] key = Kv__bry(atrs, 0); + list.Add(key, new Site_skin_itm(key, Kv__mw_bool(atrs, 1), Kv__bry(atrs, 2), Kv__mw_bool(atrs, 3))); + } +} +class Site_meta_parser__magicword extends Json_parser__list_nde__base { + private Ordered_hash list; + public Site_meta_parser__magicword() { + this.Ctor("name", "case-sensitive", "aliases"); + } + public void Parse(String context, Ordered_hash list, Json_ary nde) { + this.list = list; + this.Parse_grp(context + ".magicword", nde); + } + @Override protected void Parse_hook_nde(Json_nde sub, Json_kv[] atrs) { + byte[] key = Kv__bry(atrs, 0); + list.Add(key, new Site_magicword_itm(key, Kv__mw_bool(atrs, 1), Kv__bry_ary(atrs, 2))); + } +} +class Site_meta_parser__showhook extends Json_parser__list_nde__base { + private Ordered_hash list; + public Site_meta_parser__showhook() { + this.Ctor("name", "subscribers"); + } + public void Parse(String context, Ordered_hash list, Json_ary nde) { + this.list = list; + this.Parse_grp(context + ".showhook", nde); + } + @Override protected void Parse_hook_nde(Json_nde sub, Json_kv[] atrs) { + byte[] key = Kv__bry(atrs, 0); + Json_kv subscribers_kv = atrs[1]; + byte[] scribunto = Bry_.Empty; + byte[][] subscribers_bry_ary = Bry_.Ary_empty; + if (subscribers_kv.Val().Tid() == Json_itm_.Tid_array) + subscribers_bry_ary = Kv__bry_ary(atrs, 1); + else { + Json_nde subscribers_nde = subscribers_kv.Val_as_nde(); + int atr_len = subscribers_nde.Len(); + for (int j = 0; j < atr_len; ++j) { + Json_kv atr = subscribers_nde.Get_at_as_kv(j); + if (!Bry_.Eq(atr.Key_as_bry(), Key__scribunto)) {Warn("unknown key", atr); continue;} + scribunto = atr.Val_as_bry(); + } + } + list.Add(key, new Site_showhook_itm(key, scribunto, subscribers_bry_ary)); + } + private final static byte[] Key__scribunto = Bry_.new_a7("scribunto"); +} +class Site_meta_parser__language extends Json_parser__list_nde__base { + private Ordered_hash list; + public Site_meta_parser__language() { + this.Ctor("code", "*"); + } + public void Parse(String context, Ordered_hash list, Json_ary nde) { + this.list = list; + this.Parse_grp(context + ".language", nde); + } + @Override protected void Parse_hook_nde(Json_nde sub, Json_kv[] atrs) { + byte[] key = Kv__bry(atrs, 0); + list.Add(key, new Site_language_itm(key, Kv__bry(atrs, 1))); + } +} diff --git a/400_xowa/src/gplx/xowa/wmfs/data/Site_core_db.java b/400_xowa/src/gplx/xowa/wmfs/data/Site_core_db.java new file mode 100644 index 000000000..0a100a810 --- /dev/null +++ b/400_xowa/src/gplx/xowa/wmfs/data/Site_core_db.java @@ -0,0 +1,124 @@ +/* +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.wmfs.data; import gplx.*; import gplx.xowa.*; import gplx.xowa.wmfs.*; +import gplx.dbs.*; +public class Site_core_db { + private Db_conn conn; + private final Site_core_tbl tbl__core; + private final Site_kv_tbl tbl__general; + private final Site_namespace_tbl tbl__namespace; + private final Site_statistic_tbl tbl__statistic; + private final Site_interwikimap_tbl tbl__interwikimap; + private final Site_namespacealias_tbl tbl__namespacealias; + private final Site_specialpagealias_tbl tbl__specialpagealias; + private final Site_library_tbl tbl__library; + private final Site_extension_tbl tbl__extension; + private final Site_skin_tbl tbl__skin; + private final Site_magicword_tbl tbl__magicword; + private final Site_val_tbl tbl__functionhook; + private final Site_showhook_tbl tbl__showhook; + private final Site_val_tbl tbl__extensiontag; + private final Site_val_tbl tbl__protocol; + private final Site_kv_tbl tbl__defaultoption; + private final Site_language_tbl tbl__language; + private final Db_tbl[] tbl_ary; + public Site_core_db(Io_url db_url) { + Db_conn_bldr_data conn_data = Db_conn_bldr.I.Get_or_new(db_url); + this.conn = conn_data.Conn(); boolean created = conn_data.Created(); + this.tbl__core = new Site_core_tbl(conn); + this.tbl__general = new Site_kv_tbl(conn, "site_general"); + this.tbl__namespace = new Site_namespace_tbl(conn); + this.tbl__statistic = new Site_statistic_tbl(conn); + this.tbl__namespacealias = new Site_namespacealias_tbl(conn); + this.tbl__interwikimap = new Site_interwikimap_tbl(conn); + this.tbl__specialpagealias = new Site_specialpagealias_tbl(conn); + this.tbl__library = new Site_library_tbl(conn); + this.tbl__extension = new Site_extension_tbl(conn); + this.tbl__skin = new Site_skin_tbl(conn); + this.tbl__magicword = new Site_magicword_tbl(conn); + this.tbl__functionhook = new Site_val_tbl(conn, "site_functionhook"); + this.tbl__showhook = new Site_showhook_tbl(conn); + this.tbl__extensiontag = new Site_val_tbl(conn, "site_extensiontag"); + this.tbl__protocol = new Site_val_tbl(conn, "site_protocol"); + this.tbl__defaultoption = new Site_kv_tbl(conn, "site_defaultoption"); + this.tbl__language = new Site_language_tbl(conn); + this.tbl_ary = new Db_tbl[] + { tbl__core, tbl__general, tbl__namespace, tbl__statistic, tbl__interwikimap, tbl__namespacealias, tbl__specialpagealias, tbl__library + , tbl__extension, tbl__skin, tbl__magicword, tbl__functionhook, tbl__showhook, tbl__extensiontag, tbl__protocol, tbl__defaultoption, tbl__language + }; + if (created) Db_tbl_.Create_tbl(tbl_ary); + } + public Site_core_tbl Tbl__core() {return tbl__core;} + public Site_namespace_tbl Tbl__namespace() {return tbl__namespace;} + public void Rls() {Db_tbl_.Rls(tbl_ary);} + public void Save(Site_meta_itm site_meta, byte[] site_abrv) { + conn.Txn_bgn("site_meta"); + tbl__general.Insert(site_abrv, site_meta.General_list()); + tbl__statistic.Insert(site_abrv, site_meta.Statistic_itm()); + tbl__namespace.Insert(site_abrv, site_meta.Namespace_list()); + tbl__interwikimap.Insert(site_abrv, site_meta.Interwikimap_list()); + tbl__namespacealias.Insert(site_abrv, site_meta.Namespacealias_list()); + tbl__specialpagealias.Insert(site_abrv, site_meta.Specialpagealias_list()); + tbl__library.Insert(site_abrv, site_meta.Library_list()); + tbl__extension.Insert(site_abrv, site_meta.Extension_list()); + tbl__skin.Insert(site_abrv, site_meta.Skin_list()); + tbl__magicword.Insert(site_abrv, site_meta.Magicword_list()); + tbl__showhook.Insert(site_abrv, site_meta.Showhook_list()); + tbl__functionhook.Insert(site_abrv, site_meta.Functionhook_list()); + tbl__extensiontag.Insert(site_abrv, site_meta.Extensiontag_list()); + tbl__protocol.Insert(site_abrv, site_meta.Protocol_list()); + tbl__defaultoption.Insert(site_abrv, site_meta.Defaultoption_list()); + tbl__language.Insert(site_abrv, site_meta.Language_list()); + tbl__core.Update(site_abrv, Bool_.Y); + conn.Txn_end(); + } + public void Load(Site_meta_itm site_meta, byte[] site_abrv) { + tbl__general.Select(site_abrv, site_meta.General_list()); + tbl__statistic.Select(site_abrv, site_meta.Statistic_itm()); + tbl__namespace.Select(site_abrv, site_meta.Namespace_list()); + tbl__interwikimap.Select(site_abrv, site_meta.Interwikimap_list()); + tbl__namespacealias.Select(site_abrv, site_meta.Namespacealias_list()); + tbl__specialpagealias.Select(site_abrv, site_meta.Specialpagealias_list()); + tbl__library.Select(site_abrv, site_meta.Library_list()); + tbl__extension.Select(site_abrv, site_meta.Extension_list()); + tbl__skin.Select(site_abrv, site_meta.Skin_list()); + tbl__magicword.Insert(site_abrv, site_meta.Magicword_list()); + tbl__showhook.Select(site_abrv, site_meta.Showhook_list()); + tbl__functionhook.Select(site_abrv, site_meta.Functionhook_list()); + tbl__extensiontag.Select(site_abrv, site_meta.Extensiontag_list()); + tbl__protocol.Select(site_abrv, site_meta.Protocol_list()); + tbl__defaultoption.Select(site_abrv, site_meta.Defaultoption_list()); + tbl__language.Select(site_abrv, site_meta.Language_list()); + } + public Xow_ns_mgr Load_ns(byte[] domain_bry) { + Xow_ns_mgr rv = new Xow_ns_mgr(gplx.xowa.langs.cases.Xol_case_mgr_.U8()); + Ordered_hash namespace_hash = Ordered_hash_.new_(); + tbl__namespace.Select(gplx.xowa.wikis.domains.Xow_domain_abrv_xo_.To_bry(domain_bry), namespace_hash); + Ns_mgr__load(rv, namespace_hash); + return rv; + } + private static void Ns_mgr__load(Xow_ns_mgr rv, Ordered_hash hash) { + rv.Clear(); + int len = hash.Count(); + for (int i = 0; i < len; ++i) { + Site_namespace_itm itm = (Site_namespace_itm)hash.Get_at(i); + byte case_match = Xow_ns_case_.parse_(String_.new_u8(itm.Case_tid())); + rv.Add_new(itm.Id(), itm.Localized(), case_match, Bool_.N); + } + } +} diff --git a/400_xowa/src/gplx/xowa/wmfs/data/Xowmf_skin_itm.java b/400_xowa/src/gplx/xowa/wmfs/data/Site_core_db_tst.java similarity index 67% rename from 400_xowa/src/gplx/xowa/wmfs/data/Xowmf_skin_itm.java rename to 400_xowa/src/gplx/xowa/wmfs/data/Site_core_db_tst.java index 90ea2dc07..2637f2690 100644 --- a/400_xowa/src/gplx/xowa/wmfs/data/Xowmf_skin_itm.java +++ b/400_xowa/src/gplx/xowa/wmfs/data/Site_core_db_tst.java @@ -16,11 +16,13 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.wmfs.data; import gplx.*; import gplx.xowa.*; import gplx.xowa.wmfs.*; -class Xowmf_skin_itm { - public Xowmf_skin_itm(byte[] code, byte[] dflt, byte[] name) { - this.code = code; this.dflt = dflt; this.name = name; +import org.junit.*; +import gplx.dbs.*; +import gplx.xowa.bldrs.cmds.utils.*; +public class Site_core_db_tst { + @Test public void Basic() { +// Db_conn_bldr.I.Reg_default_sqlite(); +// Io_url db_url = Tfds.RscDir.GenSubFil_nest("400_xowa", "site_meta.sqlite3"); +// Xob_site_meta_cmd.Build_site_meta(db_url, Xow_wmf_api_mgr.Wikis, DateAdp_.parse_iso8561("2015-08-11 23:38:00")); } - public byte[] Code() {return code;} private final byte[] code; - public byte[] Dflt() {return dflt;} private final byte[] dflt; - public byte[] Name() {return name;} private final byte[] name; } diff --git a/400_xowa/src/gplx/xowa/wmfs/data/Site_core_itm.java b/400_xowa/src/gplx/xowa/wmfs/data/Site_core_itm.java new file mode 100644 index 000000000..1faf6aaae --- /dev/null +++ b/400_xowa/src/gplx/xowa/wmfs/data/Site_core_itm.java @@ -0,0 +1,33 @@ +/* +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.wmfs.data; import gplx.*; import gplx.xowa.*; import gplx.xowa.wmfs.*; +public class Site_core_itm { + public Site_core_itm(byte[] site_abrv, byte[] site_domain, boolean json_completed, DateAdp json_date, byte[] json_text) { + this.site_abrv = site_abrv; + this.site_domain = site_domain; + this.json_completed = json_completed; + this.json_date = json_date; + this.json_text = json_text; + } + public byte[] Site_abrv() {return site_abrv;} private final byte[] site_abrv; + public byte[] Site_domain() {return site_domain;} private final byte[] site_domain; + public boolean Json_completed() {return json_completed;} private final boolean json_completed; + public DateAdp Json_date() {return json_date;} private final DateAdp json_date; + public byte[] Json_text() {return json_text;} private byte[] json_text; + public void Json_text_null_() {json_text = null;} +} diff --git a/400_xowa/src/gplx/xowa/wmfs/data/Site_core_tbl.java b/400_xowa/src/gplx/xowa/wmfs/data/Site_core_tbl.java new file mode 100644 index 000000000..a2b6c27be --- /dev/null +++ b/400_xowa/src/gplx/xowa/wmfs/data/Site_core_tbl.java @@ -0,0 +1,94 @@ +/* +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.wmfs.data; import gplx.*; import gplx.xowa.*; import gplx.xowa.wmfs.*; +import gplx.dbs.*; +public class Site_core_tbl implements Db_tbl { + private static final String tbl_name = "site_core"; private final Db_meta_fld_list flds = new Db_meta_fld_list(); + private final String fld_site_abrv, fld_site_domain, fld_json_completed, fld_json_date, fld_json_text; + private final Db_conn conn; + private Db_stmt stmt_select, stmt_insert, stmt_delete, stmt_update; + public Site_core_tbl(Db_conn conn) { + this.conn = conn; + this.fld_site_abrv = flds.Add_str("site_abrv", 255); + this.fld_site_domain = flds.Add_str("site_domain", 255); + this.fld_json_completed = flds.Add_bool("json_completed"); + this.fld_json_date = flds.Add_str("json_date", 20); + this.fld_json_text = flds.Add_text("json_text"); + conn.Rls_reg(this); + } + public Db_conn Conn() {return conn;} + public void Create_tbl() {conn.Ddl_create_tbl(Db_meta_tbl.new_(tbl_name, flds, Db_meta_idx.new_unique_by_name(tbl_name, Db_meta_idx.Bld_idx_name(tbl_name, "main"), fld_site_abrv)));} + public void Rls() { + stmt_select = Db_stmt_.Rls(stmt_select); + stmt_insert = Db_stmt_.Rls(stmt_insert); + stmt_delete = Db_stmt_.Rls(stmt_delete); + stmt_update = Db_stmt_.Rls(stmt_update); + } + public void Update(byte[] site_abrv, boolean json_completed) { + if (stmt_update == null) stmt_update = conn.Stmt_update(tbl_name, String_.Ary(fld_site_abrv), fld_json_completed); + stmt_update.Clear() + .Val_bool_as_byte (fld_json_completed , json_completed) + .Crt_bry_as_str (fld_site_abrv , site_abrv) + .Exec_update(); + } + public void Insert(byte[] site_abrv, byte[] site_domain, boolean json_completed, DateAdp json_date, byte[] json_text) { + if (stmt_delete == null) stmt_delete = conn.Stmt_delete(tbl_name, fld_site_abrv); + stmt_delete.Clear().Crt_bry_as_str(fld_site_abrv, site_abrv).Exec_delete(); + if (stmt_insert == null) stmt_insert = conn.Stmt_insert(tbl_name, flds); + stmt_insert.Clear() + .Val_bry_as_str (fld_site_abrv , site_abrv) + .Val_bry_as_str (fld_site_domain , site_domain) + .Val_bool_as_byte (fld_json_completed , json_completed) + .Val_str (fld_json_date , json_date.XtoStr_gplx()) + .Val_bry_as_str (fld_json_text , json_text) + .Exec_insert(); + } + public Site_core_itm Select_itm(byte[] site_abrv) { + Db_rdr rdr = conn.Stmt_select(tbl_name, flds, fld_site_abrv) + .Clear() + .Crt_bry_as_str(fld_site_abrv, site_abrv) + .Exec_select__rls_auto(); + try { + return (rdr.Move_next()) ? new_itm(rdr) : null; + } + finally {rdr.Rls();} + } + public Site_core_itm[] Select_all_downloaded(DateAdp cutoff) { + List_adp list = List_adp_.new_(); + Db_rdr rdr = conn.Stmt_select(tbl_name, flds).Clear().Exec_select__rls_auto(); + try { + while (rdr.Move_next()) { + Site_core_itm itm = new_itm(rdr); + if (itm.Json_date().compareTo(cutoff) == CompareAble_.MoreOrSame) continue; // ignore those downloaded after cutoff date + itm.Json_text_null_(); + list.Add(itm); + } + } + finally {rdr.Rls();} + return (Site_core_itm[])list.To_ary_and_clear(Site_core_itm.class); + } + private Site_core_itm new_itm(Db_rdr rdr) { + return new Site_core_itm + ( rdr.Read_bry_by_str(fld_site_abrv) + , rdr.Read_bry_by_str(fld_site_domain) + , rdr.Read_bool_by_byte(fld_json_completed) + , rdr.Read_date_by_str(fld_json_date) + , rdr.Read_bry_by_str(fld_json_text) + ); + } +} diff --git a/400_xowa/src/gplx/xowa/wmfs/data/Site_extension_itm.java b/400_xowa/src/gplx/xowa/wmfs/data/Site_extension_itm.java new file mode 100644 index 000000000..709475d25 --- /dev/null +++ b/400_xowa/src/gplx/xowa/wmfs/data/Site_extension_itm.java @@ -0,0 +1,43 @@ +/* +XOWA: the XOWA Offline Wiki Application +Copyright (C) 2012 gnosygnu@gmail.com + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as +published by the Free Software Foundation, either version 3 of the +License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . +*/ +package gplx.xowa.wmfs.data; import gplx.*; import gplx.xowa.*; import gplx.xowa.wmfs.*; +class Site_extension_itm implements To_str_able { + public Site_extension_itm(byte[] type, byte[] name, byte[] namemsg, byte[] description, byte[] descriptionmsg, byte[] author, byte[] url, byte[] version + , byte[] vcs_system, byte[] vcs_version, byte[] vcs_url, byte[] vcs_date, byte[] license_name, byte[] license, byte[] credits) { + this.type = type; this.name = name; this.namemsg = namemsg; this.description = description; this.descriptionmsg = descriptionmsg; this.author = author; this.url = url; this.version = version; + this.vcs_system = vcs_system; this.vcs_version = vcs_version; this.vcs_url = vcs_url; this.vcs_date = vcs_date; this.license_name = license_name; this.license = license; this.credits = credits; + this.key = Bry_.Add_w_dlm(Byte_ascii.Pipe, type, name); + } + public byte[] Key() {return key;} private final byte[] key; + public byte[] Type() {return type;} private final byte[] type; + public byte[] Name() {return name;} private final byte[] name; + public byte[] Namemsg() {return namemsg;} private final byte[] namemsg; + public byte[] Description() {return description;} private final byte[] description; + public byte[] Descriptionmsg() {return descriptionmsg;} private final byte[] descriptionmsg; + public byte[] Author() {return author;} private final byte[] author; + public byte[] Url() {return url;} private final byte[] url; + public byte[] Version() {return version;} private final byte[] version; + public byte[] Vcs_system() {return vcs_system;} private final byte[] vcs_system; + public byte[] Vcs_version() {return vcs_version;} private final byte[] vcs_version; + public byte[] Vcs_url() {return vcs_url;} private final byte[] vcs_url; + public byte[] Vcs_date() {return vcs_date;} private final byte[] vcs_date; + public byte[] License_name() {return license_name;} private final byte[] license_name; + public byte[] License() {return license;} private final byte[] license; + public byte[] Credits() {return credits;} private final byte[] credits; + public String To_str() {return String_.Concat_with_obj("|", type, name, namemsg, description, descriptionmsg, author, url, version, vcs_system, vcs_version, vcs_url, vcs_date, license_name, license, credits);} +} diff --git a/400_xowa/src/gplx/xowa/wmfs/data/Site_extension_tbl.java b/400_xowa/src/gplx/xowa/wmfs/data/Site_extension_tbl.java new file mode 100644 index 000000000..921c8ad31 --- /dev/null +++ b/400_xowa/src/gplx/xowa/wmfs/data/Site_extension_tbl.java @@ -0,0 +1,113 @@ +/* +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.wmfs.data; import gplx.*; import gplx.xowa.*; import gplx.xowa.wmfs.*; +import gplx.dbs.*; +class Site_extension_tbl implements Db_tbl { + private static final String tbl_name = "site_extension"; private final Db_meta_fld_list flds = new Db_meta_fld_list(); + private final String fld_site_abrv, fld_type, fld_name, fld_namemsg, fld_description, fld_descriptionmsg, fld_author, fld_url, fld_version + , fld_vcs_system, fld_vcs_version, fld_vcs_url, fld_vcs_date, fld_license_name, fld_license, fld_credits; + private final Db_conn conn; + private Db_stmt stmt_select, stmt_insert, stmt_delete; + public Site_extension_tbl(Db_conn conn) { + this.conn = conn; + this.fld_site_abrv = flds.Add_str("site_abrv", 255); + this.fld_type = flds.Add_str("type", 255); + this.fld_name = flds.Add_str("name", 255); + this.fld_namemsg = flds.Add_str("namemsg", 255); + this.fld_description = flds.Add_str("description", 255); + this.fld_descriptionmsg = flds.Add_str("descriptionmsg", 255); + this.fld_author = flds.Add_str("author", 255); + this.fld_url = flds.Add_str("url", 255); + this.fld_version = flds.Add_str("version", 255); + this.fld_vcs_system = flds.Add_str("vcs_system", 255); + this.fld_vcs_version = flds.Add_str("vcs_version", 255); + this.fld_vcs_url = flds.Add_str("vcs_url", 255); + this.fld_vcs_date = flds.Add_str("vcs_date", 255); + this.fld_license_name = flds.Add_str("license_name", 255); + this.fld_license = flds.Add_str("license", 255); + this.fld_credits = flds.Add_str("credits", 255); + conn.Rls_reg(this); + } + public void Create_tbl() {conn.Ddl_create_tbl(Db_meta_tbl.new_(tbl_name, flds, Db_meta_idx.new_unique_by_name(tbl_name, Db_meta_idx.Bld_idx_name(tbl_name, "main"), fld_site_abrv, fld_type, fld_name)));} + public void Delete_all() {conn.Stmt_delete(tbl_name, Db_meta_fld.Ary_empty).Exec_delete();} + public void Rls() { + stmt_select = Db_stmt_.Rls(stmt_select); + stmt_insert = Db_stmt_.Rls(stmt_insert); + stmt_delete = Db_stmt_.Rls(stmt_delete); + } + public void Select(byte[] site_abrv, Ordered_hash list) { + if (stmt_select == null) stmt_select = conn.Stmt_select(tbl_name, flds, fld_site_abrv); + list.Clear(); + Db_rdr rdr = stmt_select.Clear().Crt_bry_as_str(fld_site_abrv, site_abrv).Exec_select__rls_auto(); + try { + while (rdr.Move_next()) { + Site_extension_itm itm = new Site_extension_itm + ( rdr.Read_bry_by_str(fld_type) + , rdr.Read_bry_by_str(fld_name) + , rdr.Read_bry_by_str(fld_namemsg) + , rdr.Read_bry_by_str(fld_description) + , rdr.Read_bry_by_str(fld_descriptionmsg) + , rdr.Read_bry_by_str(fld_author) + , rdr.Read_bry_by_str(fld_url) + , rdr.Read_bry_by_str(fld_version) + , rdr.Read_bry_by_str(fld_vcs_system) + , rdr.Read_bry_by_str(fld_vcs_version) + , rdr.Read_bry_by_str(fld_vcs_url) + , rdr.Read_bry_by_str(fld_vcs_date) + , rdr.Read_bry_by_str(fld_license_name) + , rdr.Read_bry_by_str(fld_license) + , rdr.Read_bry_by_str(fld_credits) + ); + list.Add(itm.Key(), itm); + } + } + finally {rdr.Rls();} + } + public void Insert(byte[] site_abrv, Ordered_hash list) { + if (stmt_delete == null) stmt_delete = conn.Stmt_delete(tbl_name, fld_site_abrv); + if (stmt_insert == null) stmt_insert = conn.Stmt_insert(tbl_name, flds); + stmt_delete.Clear().Crt_bry_as_str(fld_site_abrv, site_abrv).Exec_delete(); + int len = list.Count(); + for (int i = 0; i < len; ++i) { + Site_extension_itm itm = (Site_extension_itm)list.Get_at(i); + Insert(site_abrv, itm.Type(), itm.Name(), itm.Namemsg(), itm.Description(), itm.Descriptionmsg(), itm.Author(), itm.Url(), itm.Version() + , itm.Vcs_system(), itm.Vcs_version(), itm.Vcs_url(), itm.Vcs_date(), itm.License_name(), itm.License(), itm.Credits()); + } + } + private void Insert(byte[] site_abrv, byte[] type, byte[] name, byte[] namemsg, byte[] description, byte[] descriptionmsg, byte[] author, byte[] url, byte[] version + , byte[] vcs_system, byte[] vcs_version, byte[] vcs_url, byte[] vcs_date, byte[] license_name, byte[] license, byte[] credits) { + stmt_insert.Clear() + .Val_bry_as_str(fld_site_abrv , site_abrv) + .Val_bry_as_str(fld_type , type) + .Val_bry_as_str(fld_name , name) + .Val_bry_as_str(fld_namemsg , namemsg) + .Val_bry_as_str(fld_description , description) + .Val_bry_as_str(fld_descriptionmsg , descriptionmsg) + .Val_bry_as_str(fld_author , author) + .Val_bry_as_str(fld_url , url) + .Val_bry_as_str(fld_version , version) + .Val_bry_as_str(fld_vcs_system , vcs_system) + .Val_bry_as_str(fld_vcs_version , vcs_version) + .Val_bry_as_str(fld_vcs_url , vcs_url) + .Val_bry_as_str(fld_vcs_date , vcs_date) + .Val_bry_as_str(fld_license_name , license_name) + .Val_bry_as_str(fld_license , license) + .Val_bry_as_str(fld_credits , credits) + .Exec_insert(); + } +} diff --git a/400_xowa/src/gplx/xowa/wmfs/data/Site_general_itm.java b/400_xowa/src/gplx/xowa/wmfs/data/Site_general_itm.java new file mode 100644 index 000000000..2dab0c9d2 --- /dev/null +++ b/400_xowa/src/gplx/xowa/wmfs/data/Site_general_itm.java @@ -0,0 +1,112 @@ +/* +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.wmfs.data; import gplx.*; import gplx.xowa.*; import gplx.xowa.wmfs.*; +class Site_general_itm implements To_str_able { + public Site_general_itm Ctor(byte[] main_page, byte[] base_url, byte[] site_name, byte[] logo, byte[] generator + , byte[] php_version, byte[] php_sapi, byte[] hhvm_version, byte[] db_type, byte[] db_version + , boolean image_whitelist_enabled, boolean lang_conversion, boolean title_conversion + , byte[] link_prefix_charset, byte[] link_prefix, byte[] link_trail, byte[] legal_title_chars + , byte[] git_hash, byte[] git_branch + , byte[] case_type, byte[] lang, byte[][] fallback, byte[] fallback_8bit_encoding + , boolean write_api, byte[] time_zone, int time_offset + , byte[] article_path, byte[] script_path, byte[] script, byte[] variant_article_path + , byte[] server, byte[] server_name, byte[] wiki_id, byte[] time + , boolean miser_mode, long max_upload_size, int[] thumb_limits, int[] image_limits, byte[] favicon + ) { + this.main_page = main_page; + this.base_url = base_url; + this.site_name = site_name; + this.logo = logo; + this.generator = generator; + this.php_version = php_version; + this.php_sapi = php_sapi; + this.hhvm_version = hhvm_version; + this.db_type = db_type; + this.db_version = db_version; + this.image_whitelist_enabled = image_whitelist_enabled; + this.lang_conversion = lang_conversion; + this.title_conversion = title_conversion; + this.link_prefix_charset = link_prefix_charset; + this.link_prefix = link_prefix; + this.link_trail = link_trail; + this.legal_title_chars = legal_title_chars; + this.git_hash = git_hash; + this.git_branch = git_branch; + this.case_type = case_type; + this.lang = lang; + this.fallback = fallback; + this.fallback_8bit_encoding = fallback_8bit_encoding; + this.write_api = write_api; + this.time_zone = time_zone; + this.time_offset = time_offset; + this.article_path = article_path; + this.script_path = script_path; + this.script = script; + this.variant_article_path = variant_article_path; + this.server = server; + this.server_name = server_name; + this.wiki_id = wiki_id; + this.time = time; + this.miser_mode = miser_mode; + this.max_upload_size = max_upload_size; + this.thumb_limits = thumb_limits; + this.image_limits = image_limits; + this.favicon = favicon; + return this; + } + public byte[] Main_page() {return main_page;} private byte[] main_page; + public byte[] Base_url() {return base_url;} private byte[] base_url; + public byte[] Site_name() {return site_name;} private byte[] site_name; + public byte[] Logo() {return logo;} private byte[] logo; + public byte[] Generator() {return generator;} private byte[] generator; + public byte[] Php_version() {return php_version;} private byte[] php_version; + public byte[] Php_sapi() {return php_sapi;} private byte[] php_sapi; + public byte[] Hhvm_version() {return hhvm_version;} private byte[] hhvm_version; + public byte[] Db_type() {return db_type;} private byte[] db_type; + public byte[] Db_version() {return db_version;} private byte[] db_version; + public boolean Image_whitelist_enabled() {return image_whitelist_enabled;} private boolean image_whitelist_enabled; + public boolean Lang_conversion() {return lang_conversion;} private boolean lang_conversion; + public boolean Title_conversion() {return title_conversion;} private boolean title_conversion; + public byte[] Link_prefix_charset() {return link_prefix_charset;} private byte[] link_prefix_charset; + public byte[] Link_prefix() {return link_prefix;} private byte[] link_prefix; + public byte[] Link_trail() {return link_trail;} private byte[] link_trail; + public byte[] Legal_title_chars() {return legal_title_chars;} private byte[] legal_title_chars; + public byte[] Git_hash() {return git_hash;} private byte[] git_hash; + public byte[] Git_branch() {return git_branch;} private byte[] git_branch; + public byte[] Case_type() {return case_type;} private byte[] case_type; + public byte[] Lang() {return lang;} private byte[] lang; + public byte[][] Fallback() {return fallback;} private byte[][] fallback; + public byte[] Fallback_8bit_encoding() {return fallback_8bit_encoding;} private byte[] fallback_8bit_encoding; + public boolean Write_api() {return write_api;} private boolean write_api; + public byte[] Time_zone() {return time_zone;} private byte[] time_zone; + public int Time_offset() {return time_offset;} private int time_offset; + public byte[] Article_path() {return article_path;} private byte[] article_path; + public byte[] Script_path() {return script_path;} private byte[] script_path; + public byte[] Script() {return script;} private byte[] script; + public byte[] Variant_article_path() {return variant_article_path;} private byte[] variant_article_path; + public byte[] Server() {return server;} private byte[] server; + public byte[] Server_name() {return server_name;} private byte[] server_name; + public byte[] Wiki_id() {return wiki_id;} private byte[] wiki_id; + public byte[] Time() {return time;} private byte[] time; + public boolean Miser_mode() {return miser_mode;} private boolean miser_mode; + public long Max_upload_size() {return max_upload_size;} private long max_upload_size; + public int[] Thumb_limits() {return thumb_limits;} private int[] thumb_limits; + public int[] Image_limits() {return image_limits;} private int[] image_limits; + public byte[] Favicon() {return favicon;} private byte[] favicon; + public String To_str() {return "";} +} diff --git a/400_xowa/src/gplx/xowa/wmfs/data/Site_interwikimap_itm.java b/400_xowa/src/gplx/xowa/wmfs/data/Site_interwikimap_itm.java new file mode 100644 index 000000000..c62a8bb92 --- /dev/null +++ b/400_xowa/src/gplx/xowa/wmfs/data/Site_interwikimap_itm.java @@ -0,0 +1,35 @@ +/* +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.wmfs.data; import gplx.*; import gplx.xowa.*; import gplx.xowa.wmfs.*; +class Site_interwikimap_itm implements To_str_able { + public Site_interwikimap_itm(byte[] prefix, boolean local, byte[] language, boolean localinterwiki, byte[] url, boolean protorel) { + this.prefix = prefix; + this.local = local; + this.language = language; + this.localinterwiki = localinterwiki; + this.url = url; + this.protorel = protorel; + } + public byte[] Prefix() {return prefix;} private final byte[] prefix; + public boolean Local() {return local;} private final boolean local; + public byte[] Language() {return language;} private final byte[] language; + public boolean Localinterwiki() {return localinterwiki;} private final boolean localinterwiki; + public byte[] Url() {return url;} private final byte[] url; + public boolean Protorel() {return protorel;} private final boolean protorel; + public String To_str() {return String_.Concat_with_obj("|", prefix, local, language, url, protorel);} +} diff --git a/400_xowa/src/gplx/xowa/wmfs/data/Site_interwikimap_tbl.java b/400_xowa/src/gplx/xowa/wmfs/data/Site_interwikimap_tbl.java new file mode 100644 index 000000000..20c096200 --- /dev/null +++ b/400_xowa/src/gplx/xowa/wmfs/data/Site_interwikimap_tbl.java @@ -0,0 +1,83 @@ +/* +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.wmfs.data; import gplx.*; import gplx.xowa.*; import gplx.xowa.wmfs.*; +import gplx.dbs.*; +class Site_interwikimap_tbl implements Db_tbl { + private static final String tbl_name = "site_interwikimap"; private final Db_meta_fld_list flds = new Db_meta_fld_list(); + private final String fld_site_abrv, fld_prefix, fld_local, fld_language, fld_localinterwiki, fld_url, fld_protorel; + private final Db_conn conn; + private Db_stmt stmt_select, stmt_insert, stmt_delete; + public Site_interwikimap_tbl(Db_conn conn) { + this.conn = conn; + this.fld_site_abrv = flds.Add_str("site_abrv", 255); + this.fld_prefix = flds.Add_str("prefix", 255); + this.fld_local = flds.Add_bool("local"); + this.fld_language = flds.Add_str("language", 255); + this.fld_localinterwiki = flds.Add_bool("localinterwiki"); + this.fld_url = flds.Add_str("url", 255); + this.fld_protorel = flds.Add_bool("protorel"); + conn.Rls_reg(this); + } + public void Create_tbl() {conn.Ddl_create_tbl(Db_meta_tbl.new_(tbl_name, flds, Db_meta_idx.new_unique_by_name(tbl_name, Db_meta_idx.Bld_idx_name(tbl_name, "main"), fld_site_abrv, fld_prefix)));} + public void Delete_all() {conn.Stmt_delete(tbl_name, Db_meta_fld.Ary_empty).Exec_delete();} + public void Rls() { + stmt_select = Db_stmt_.Rls(stmt_select); + stmt_insert = Db_stmt_.Rls(stmt_insert); + stmt_delete = Db_stmt_.Rls(stmt_delete); + } + public void Select(byte[] site_abrv, Ordered_hash list) { + if (stmt_select == null) stmt_select = conn.Stmt_select(tbl_name, flds, fld_site_abrv); + list.Clear(); + Db_rdr rdr = stmt_select.Clear().Crt_bry_as_str(fld_site_abrv, site_abrv).Exec_select__rls_auto(); + try { + while (rdr.Move_next()) { + Site_interwikimap_itm itm = new Site_interwikimap_itm + ( rdr.Read_bry_by_str(fld_prefix) + , rdr.Read_bool_by_byte(fld_local) + , rdr.Read_bry_by_str(fld_language) + , rdr.Read_bool_by_byte(fld_localinterwiki) + , rdr.Read_bry_by_str(fld_url) + , rdr.Read_bool_by_byte(fld_protorel) + ); + list.Add(itm.Prefix(), itm); + } + } + finally {rdr.Rls();} + } + public void Insert(byte[] site_abrv, Ordered_hash list) { + if (stmt_delete == null) stmt_delete = conn.Stmt_delete(tbl_name, fld_site_abrv); + if (stmt_insert == null) stmt_insert = conn.Stmt_insert(tbl_name, flds); + stmt_delete.Clear().Crt_bry_as_str(fld_site_abrv, site_abrv).Exec_delete(); + int len = list.Count(); + for (int i = 0; i < len; ++i) { + Site_interwikimap_itm itm = (Site_interwikimap_itm)list.Get_at(i); + Insert(site_abrv, itm.Prefix(), itm.Local(), itm.Language(), itm.Localinterwiki(), itm.Url(), itm.Protorel()); + } + } + private void Insert(byte[] site_abrv, byte[] prefix, boolean local, byte[] language, boolean localinterwiki, byte[] url, boolean protorel) { + stmt_insert.Clear() + .Val_bry_as_str(fld_site_abrv , site_abrv) + .Val_bry_as_str(fld_prefix , prefix) + .Val_bool_as_byte(fld_local , local) + .Val_bry_as_str(fld_language , language) + .Val_bool_as_byte(fld_localinterwiki , localinterwiki) + .Val_bry_as_str(fld_url , url) + .Val_bool_as_byte(fld_protorel , protorel) + .Exec_insert(); + } +} diff --git a/400_xowa/src/gplx/xowa/wmfs/data/Site_json_parser.java b/400_xowa/src/gplx/xowa/wmfs/data/Site_json_parser.java new file mode 100644 index 000000000..0a0ec94bf --- /dev/null +++ b/400_xowa/src/gplx/xowa/wmfs/data/Site_json_parser.java @@ -0,0 +1,99 @@ +/* +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.wmfs.data; import gplx.*; import gplx.xowa.*; import gplx.xowa.wmfs.*; +import gplx.core.primitives.*; import gplx.core.json.*; +class Site_json_parser { + private final Json_parser__list_nde__base parser__basic = new Json_parser__list_nde__base(); + private final Site_meta_parser__general parser__general = new Site_meta_parser__general(); + private final Site_meta_parser__namespace parser__namespace = new Site_meta_parser__namespace(); + private final Site_meta_parser__statistic parser__statistic = new Site_meta_parser__statistic(); + private final Site_meta_parser__interwikimap parser__interwiki = new Site_meta_parser__interwikimap(); + private final Site_meta_parser__namespacealias parser__namespacealias = new Site_meta_parser__namespacealias(); + private final Site_meta_parser__specialpagealias parser__specialpagealias = new Site_meta_parser__specialpagealias(); + private final Site_meta_parser__library parser__library = new Site_meta_parser__library(); + private final Site_meta_parser__extension parser__extension = new Site_meta_parser__extension(); + private final Site_meta_parser__skin parser__skin = new Site_meta_parser__skin(); + private final Site_meta_parser__magicword parser__magicword = new Site_meta_parser__magicword(); + private final Site_meta_parser__showhook parser__showhook = new Site_meta_parser__showhook(); + private final Site_meta_parser__language parser__language = new Site_meta_parser__language(); + public void Parse_root(Site_meta_itm rv, String context, byte[] src) { + Json_doc jdoc = Json_doc.new_(src); + Parse_root(rv, context, jdoc.Root().Get_at_as_kv(1).Val_as_nde()); + } + public void Parse_root(Site_meta_itm rv, String context, Json_nde root) { + int len = root.Len(); + for (int i = 0; i < len; ++i) { + Json_kv sub = root.Get_at_as_kv(i); + byte[] sub_key = sub.Key_as_bry(); + switch (nde_hash.Get_as_int(sub_key)) { + case Tid_general : parser__general.Parse(context, rv.General_list(), sub.Val_as_nde()); break; + case Tid_namespace : parser__namespace.Parse(context, rv.Namespace_list(), sub.Val_as_nde()); break; + case Tid_statistic : parser__statistic.Parse(context, rv.Statistic_itm(), sub.Val_as_nde()); break; + case Tid_interwikimap : parser__interwiki.Parse(context, rv.Interwikimap_list(), sub.Val_as_ary()); break; + case Tid_namespacealias : parser__namespacealias.Parse(context, rv.Namespacealias_list(), sub.Val_as_ary()); break; + case Tid_specialpagealias : parser__specialpagealias.Parse(context, rv.Specialpagealias_list(), sub.Val_as_ary()); break; + case Tid_library : parser__library.Parse(context, rv.Library_list(), sub.Val_as_ary()); break; + case Tid_extension : parser__extension.Parse(context, rv.Extension_list(), sub.Val_as_ary()); break; + case Tid_skin : parser__skin.Parse(context, rv.Skin_list(), sub.Val_as_ary()); break; + case Tid_magicword : parser__magicword.Parse(context, rv.Magicword_list(), sub.Val_as_ary()); break; + case Tid_functionhook : parser__basic.Parse_to_list_as_bry(context, sub.Val_as_ary(), rv.Functionhook_list()); break; + case Tid_showhook : parser__showhook.Parse(context, rv.Showhook_list(), sub.Val_as_ary()); break; + case Tid_extensiontag : parser__basic.Parse_to_list_as_bry(context, sub.Val_as_ary(), rv.Extensiontag_list()); break; + case Tid_protocol : parser__basic.Parse_to_list_as_bry(context, sub.Val_as_ary(), rv.Protocol_list()); break; + case Tid_defaultoption : parser__basic.Parse_to_list_as_kv(context, sub.Val_as_nde(), rv.Defaultoption_list()); break; + case Tid_language : parser__language.Parse(context, rv.Language_list(), sub.Val_as_ary()); break; + } + } + } + private static final int + Tid_general = 0 + , Tid_namespace = 1 + , Tid_statistic = 2 + , Tid_interwikimap = 3 + , Tid_namespacealias = 4 + , Tid_specialpagealias = 5 + , Tid_library = 6 + , Tid_extension = 7 + , Tid_skin = 8 + , Tid_magicword = 9 + , Tid_functionhook = 10 + , Tid_showhook = 11 + , Tid_extensiontag = 12 + , Tid_protocol = 13 + , Tid_defaultoption = 14 + , Tid_language = 15 + ; + private static final Hash_adp_bry nde_hash = Hash_adp_bry.cs() + .Add_str_int("general" , Tid_general) + .Add_str_int("namespaces" , Tid_namespace) + .Add_str_int("statistics" , Tid_statistic) + .Add_str_int("interwikimap" , Tid_interwikimap) + .Add_str_int("namespacealiases" , Tid_namespacealias) + .Add_str_int("specialpagealiases" , Tid_specialpagealias) + .Add_str_int("libraries" , Tid_library) + .Add_str_int("extensions" , Tid_extension) + .Add_str_int("skins" , Tid_skin) + .Add_str_int("magicwords" , Tid_magicword) + .Add_str_int("functionhooks" , Tid_functionhook) + .Add_str_int("showhooks" , Tid_showhook) + .Add_str_int("extensiontags" , Tid_extensiontag) + .Add_str_int("protocols" , Tid_protocol) + .Add_str_int("defaultoptions" , Tid_defaultoption) + .Add_str_int("languages" , Tid_language) + ; +} diff --git a/400_xowa/src/gplx/xowa/wmfs/data/Site_json_parser_tst.java b/400_xowa/src/gplx/xowa/wmfs/data/Site_json_parser_tst.java new file mode 100644 index 000000000..7147593a6 --- /dev/null +++ b/400_xowa/src/gplx/xowa/wmfs/data/Site_json_parser_tst.java @@ -0,0 +1,422 @@ +/* +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.wmfs.data; import gplx.*; import gplx.xowa.*; import gplx.xowa.wmfs.*; +import org.junit.*; import gplx.core.json.*; +public class Site_json_parser_tst { + private final Site_json_parser_fxt fxt = new Site_json_parser_fxt(); + @Before public void init() {Gfo_usr_dlg_.I = Gfo_usr_dlg_.Test_console();} + @After public void term() {Gfo_usr_dlg_.I = Gfo_usr_dlg_.Noop;} + @Test public void General() { + fxt.Exec_parse(String_.Concat_lines_nl_skip_last + ( "{ 'general':" + , " { 'mainpage': 'Main Page'" + , " , 'imagewhitelistenabled': ''" + , " , 'timeoffset': 0" + , " , 'thumblimits': " + , " [ 120" + , " , 150" + , " ]" + , " , 'imagelimits': " + , " [ " + , " { 'width': 320" + , " , 'height': 240" + , " }" + , " , " + , " { 'width': 640" + , " , 'height': 480" + , " }" + , " ]" + , " }" + , "}" + )); + fxt.Test_general(KeyVal_.new_("mainpage", "Main Page"), KeyVal_.new_("imagewhitelistenabled", ""), KeyVal_.new_("timeoffset", "0"), KeyVal_.new_("thumblimits", "120|150"), KeyVal_.new_("imagelimits", "320=240|640=480")); + } + @Test public void Namespace() { + fxt.Exec_parse(String_.Concat_lines_nl_skip_last + ( "{ 'namespaces':" + , " { '0':" + , " { 'id': 0" + , " , 'case': 'first-letter'" + , " , 'content': ''" + , " , '*': ''" + , " }" + , " , '2': " + , " { 'id': 2" + , " , 'case': 'first-letter'" + , " , 'subpages': ''" + , " , 'canonical': 'User'" + , " , '*': 'User'" + , " }" + , " ,'4': " + , " { 'id': 4" + , " , 'case': 'first-letter'" + , " , 'subpages': ''" + , " , 'canonical': 'Project'" + , " , '*': 'Wikipedia'" + , " }" + , " ,'2600': " + , " { 'id': 2600" + , " , 'case': 'case-sensitive'" + , " , 'canonical': 'Topic'" + , " , 'defaultcontentmodel': 'flow-board'" + , " , '*': 'Topic'" + , " }" + , " }" + , "}" + )); + fxt.Test_namespace + ( fxt.Make_namespace(0 , Bool_.N, null , "" , Bool_.N, Bool_.Y, null) + , fxt.Make_namespace(2 , Bool_.N, "User" , "User" , Bool_.Y, Bool_.N, null) + , fxt.Make_namespace(4 , Bool_.N, "Project" , "Wikipedia" , Bool_.Y, Bool_.N, null) + , fxt.Make_namespace(2600 , Bool_.Y, "Topic" , "Topic" , Bool_.N, Bool_.N, "flow-board") + ); + } + @Test public void Statistic() { + fxt.Exec_parse(String_.Concat_lines_nl_skip_last + ( "{ 'statistics':" + , " { 'pages': 1" + , " , 'articles': 2" + , " , 'edits': 3" + , " , 'images': 4" + , " , 'users': 5" + , " , 'activeusers': 6" + , " , 'admins': 7" + , " , 'jobs': 8" + , " , 'queued-massmessages': 9" + , " }" + , "}" + )); + fxt.Test_statistic + ( fxt.Make_statistic(1, 2, 3, 4, 5, 6, 7, 8, 9) + ); + } + @Test public void Interwikimap() { + fxt.Exec_parse(String_.Concat_lines_nl_skip_last + ( "{ 'interwikimap':" + , " [" + , " { 'prefix': 'aquariumwiki'" + , " , 'url': 'http://www.theaquariumwiki.com/$1'" + , " }" + , " , { 'prefix': 'ar'" + , " , 'local': ''" + , " , 'language': '\u0627\u0644\u0639\u0631\u0628\u064a\u0629'" + , " , 'url': 'https://ar.wikipedia.org/wiki/$1'" + , " , 'protorel': ''" + , " }" + , " ]" + , "}" + )); + fxt.Test_interwikimap + ( fxt.Make_interwikimap("aquariumwiki" , Bool_.N, null , Bool_.N, "http://www.theaquariumwiki.com/$1" , Bool_.N) + , fxt.Make_interwikimap("ar" , Bool_.Y, "العربية" , Bool_.N, "https://ar.wikipedia.org/wiki/$1" , Bool_.Y) + ); + } + @Test public void Namespacealias() { + fxt.Exec_parse(String_.Concat_lines_nl_skip_last + ( "{ 'namespacealiases':" + , " [ " + , " { 'id': 4" + , " , '*': 'WP'" + , " }" + , " , " + , " { 'id': 7" + , " , '*': 'Image talk'" + , " }" + , " ]" + , "}" + )); + fxt.Test_namespacealias + ( fxt.Make_namespacealias(4 ,"WP") + , fxt.Make_namespacealias(7 , "Image talk") + ); + } + @Test public void Specialpagealias() { + fxt.Exec_parse(String_.Concat_lines_nl_skip_last + ( "{ 'specialpagealiases':" + , " [ " + , " { 'realname': 'BrokenRedirects'" + , " , 'aliases': " + , " [ 'BrokenRedirects'" + , " ]" + , " }" + , " , " + , " { 'realname': 'Lonelypages'" + , " , 'aliases': " + , " [ 'LonelyPages'" + , " , 'OrphanedPages'" + , " ]" + , " }" + , " ]" + , "}" + )); + fxt.Test_specialpagealias + ( fxt.Make_specialpagealias("BrokenRedirects" , "BrokenRedirects") + , fxt.Make_specialpagealias("Lonelypages" , "LonelyPages", "OrphanedPages") + ); + } + @Test public void Library() { + fxt.Exec_parse(String_.Concat_lines_nl_skip_last + ( "{ 'libraries':" + , " [ " + , " { 'name': 'cssjanus/cssjanus'" + , " , 'version': '1.1.1'" + , " }" + , " , " + , " { 'name': 'leafo/lessphp'" + , " , 'version': '0.5.0'" + , " }" + , " ]" + , "}" + )); + fxt.Test_library + ( fxt.Make_library("cssjanus/cssjanus" , "1.1.1") + , fxt.Make_library("leafo/lessphp" , "0.5.0") + ); + } + @Test public void Extension() { + fxt.Exec_parse(String_.Concat_lines_nl_skip_last + ( "{ 'extensions':" + , " [ " + , " { 'type': 'media'" + , " , 'name': 'PagedTiffHandler'" + , " , 'descriptionmsg': 'tiff-desc'" + , " , 'author': '[http://www.hallowelt.biz HalloWelt! Medienwerkstatt GmbH], Sebastian Ulbricht, Daniel Lynge, Marc Reymann, Markus Glaser for Wikimedia Deutschland'" + , " , 'url': 'https://www.mediawiki.org/wiki/Extension:PagedTiffHandler'" + , " , 'vcs-system': 'git'" + , " , 'vcs-version': 'b4a6c2077e3ea70cb0295b2282fe45d2e9ae06ba'" + , " , 'vcs-url': 'https://git.wikimedia.org/tree/mediawiki%2Fextensions%2FPagedTiffHandler.git/b4a6c2077e3ea70cb0295b2282fe45d2e9ae06ba'" + , " , 'vcs-date': '2015-03-27T16:44:25Z'" + , " , 'license-name': 'GPL-2.0+'" + , " , 'license': '/wiki/Special:Version/License/PagedTiffHandler'" + , " }" + , " , " + , " { 'type': 'media'" + , " , 'name': 'A'" + , " , 'namemsg': 'A-name'" + , " , 'description': 'desc'" + , " , 'descriptionmsg': 'A-desc'" + , " , 'author': 'B'" + , " , 'url': 'C'" + , " , 'version': '0.1.0'" + , " , 'vcs-system': 'git'" + , " , 'vcs-version': 'd'" + , " , 'vcs-url': 'e'" + , " , 'vcs-date': '2015-03-27T16:44:25Z'" + , " , 'license-name': 'f'" + , " , 'license': 'g'" + , " }" + , " ]" + , "}" + )); + fxt.Test_extension + ( fxt.Make_extension("media", "PagedTiffHandler", "", "", "tiff-desc", "[http://www.hallowelt.biz HalloWelt! Medienwerkstatt GmbH], Sebastian Ulbricht, Daniel Lynge, Marc Reymann, Markus Glaser for Wikimedia Deutschland", "https://www.mediawiki.org/wiki/Extension:PagedTiffHandler", null, "git", "b4a6c2077e3ea70cb0295b2282fe45d2e9ae06ba", "https://git.wikimedia.org/tree/mediawiki%2Fextensions%2FPagedTiffHandler.git/b4a6c2077e3ea70cb0295b2282fe45d2e9ae06ba", "2015-03-27T16:44:25Z", "GPL-2.0+", "/wiki/Special:Version/License/PagedTiffHandler", null) + , fxt.Make_extension("media", "A", "A-name", "desc", "A-desc", "B", "C", "0.1.0", "git", "d", "e", "2015-03-27T16:44:25Z", "f", "g", null) + ); + } + @Test public void Skin() { + fxt.Exec_parse(String_.Concat_lines_nl_skip_last + ( "{ 'skins':" + , " [ " + , " { 'code': 'vector'" + , " , 'default': ''" + , " , '*': 'Vector'" + , " }" + , " , " + , " { 'code': 'monobook'" + , " , '*': 'MonoBook'" + , " }" + , " , " + , " { 'code': 'fallback'" + , " , 'unusable': ''" + , " , '*': 'Fallback'" + , " }" + , " ]" + , "}" + )); + fxt.Test_skin + ( fxt.Make_skin("vector" , Bool_.Y, "Vector" , Bool_.N) + , fxt.Make_skin("monobook" , Bool_.N, "MonoBook" , Bool_.N) + , fxt.Make_skin("fallback" , Bool_.N, "Fallback" , Bool_.Y) + ); + } + @Test public void Magicword() { + fxt.Exec_parse(String_.Concat_lines_nl_skip_last + ( "{ 'magicwords':" + , " [ " + , " { 'name': 'expr'" + , " , 'aliases': " + , " [ 'expr'" + , " ]" + , " }" + , " , " + , " { 'name': 'currentmonth'" + , " , 'aliases': " + , " [ 'CURRENTMONTH'" + , " , 'CURRENTMONTH2'" + , " ]" + , " , 'case-sensitive': ''" + , " }" + , " ]" + , "}" + )); + fxt.Test_magicword + ( fxt.Make_magicword("expr" , Bool_.N, "expr") + , fxt.Make_magicword("currentmonth" , Bool_.Y, "CURRENTMONTH", "CURRENTMONTH2") + ); + } + @Test public void Functionhook() { + fxt.Exec_parse(String_.Concat_lines_nl_skip_last + ( "{ 'functionhooks':" + , " [ 'ns'" + , " , 'nse'" + , " ]" + , "}" + )); + fxt.Test_functionhook("ns", "nse"); + } + @Test public void Showhook() { + fxt.Exec_parse(String_.Concat_lines_nl_skip_last + ( "{ 'showhooks':" + , " [ " + , " { 'name': 'APIAfterExecute'" + , " , 'subscribers': " + , " [ 'ApiParseExtender::onAPIAfterExecute'" + , " , 'ZeroBanner\\\\MccMncLogging::onAPIAfterExecute'" + , " , 'XAnalytics::onAPIAfterExecute'" + , " ]" + , " }" + , " , " + , " { 'name': 'ParserLimitReport'" + , " , 'subscribers': " + , " { 'scribunto': 'ScribuntoHooks::reportLimits'" + , " }" + , " }" + , " ]" + , "}" + )); + fxt.Test_showhook + ( fxt.Make_showhook("APIAfterExecute" , "", "ApiParseExtender::onAPIAfterExecute", "ZeroBanner\\MccMncLogging::onAPIAfterExecute", "XAnalytics::onAPIAfterExecute") + , fxt.Make_showhook("ParserLimitReport" , "ScribuntoHooks::reportLimits") + ); + } + @Test public void Extensiontag() { + fxt.Exec_parse(String_.Concat_lines_nl_skip_last + ( "{ 'extensiontags':" + , " [ '
'"
+		, "  , ''"
+		, "  ]"
+		, "}"
+		));
+		fxt.Test_extensiontag("
", "");
+	}
+	@Test  public void Protocol() {
+		fxt.Exec_parse(String_.Concat_lines_nl_skip_last
+		( "{ 'protocols':"
+		, "  [ 'bitcoin:'"
+		, "  , 'ftp://'"
+		, "  ]"
+		, "}"
+		));
+		fxt.Test_protocol("bitcoin:", "ftp://");
+	}
+	@Test  public void Defaultoption() {
+		fxt.Exec_parse(String_.Concat_lines_nl_skip_last
+		( "{ 'defaultoptions':"
+		, "  { 'globaluserpage': true"
+		, "  , 'cols': 80"
+		, "  , 'echo-email-format': 'html'"
+		, "  }"
+		, "}"
+		));
+		fxt.Test_defaultoption(KeyVal_.new_("globaluserpage", "true"), KeyVal_.new_("cols", "80"), KeyVal_.new_("echo-email-format", "html"));
+	}
+	@Test  public void Language() {
+		fxt.Exec_parse(String_.Concat_lines_nl_skip_last
+		( "{ 'languages':"
+		, "  [ "
+		, "    { 'code': 'aa'"
+		, "    , '*': 'Qaf\u00e1r af'"
+		, "    }"
+		, "  , "
+		, "    { 'code': 'ab'"
+		, "    , '*': '\u0410\u04a7\u0441\u0448\u04d9\u0430'"
+		, "    }"
+		, "  ]"
+		, "}"
+		));
+		fxt.Test_language
+		( fxt.Make_language("aa"	, "Qafár af")
+		, fxt.Make_language("ab"	, "Аҧсшәа")
+		);
+	}
+//		@Test   public void Smoke() {
+//			Io_url json_url = Tfds.RscDir.GenSubFil_nest("400_xowa", "site_meta__en.wikipedia.org.json");
+//			byte[] src = Io_mgr.I.LoadFilBry(json_url);
+//			Site_json_parser parser = new Site_json_parser();
+//			Site_meta_itm meta_itm = new Site_meta_itm();
+//			parser.Parse_root(meta_itm, "en.wikipedia.org", src);
+//			gplx.dbs.Db_conn_bldr.I.Reg_default_sqlite();
+//			Site_core_db core_db = new Site_core_db(Tfds.RscDir.GenSubFil_nest("400_xowa", "site_meta.sqlite3"));
+//			core_db.Save(meta_itm, Bry_.new_a7("en.w"));
+//		}
+}
+class Site_json_parser_fxt {
+	private final Site_json_parser parser = new Site_json_parser();
+	private Site_meta_itm site_meta;
+	public void Exec_parse(String raw) {
+		Json_doc jdoc = Json_doc.new_apos_(raw);
+		site_meta = new Site_meta_itm();
+		parser.Parse_root(site_meta, "en.wikipedia.org", jdoc.Root());
+	}
+	public Site_namespace_itm Make_namespace(int id, boolean case_tid_is_cs, String canonical, String localized, boolean subpages, boolean content, String defaultcontentmodel) {
+		return new Site_namespace_itm(id, case_tid_is_cs ? Xow_ns_case_.Bry__all : Xow_ns_case_.Bry__1st, Bry_.new_u8_safe(canonical), Bry_.new_u8_safe(localized), subpages, content, Bry_.new_u8_safe(defaultcontentmodel));
+	}
+	public Site_statistic_itm Make_statistic(long pages, long articles, long edits, long images, long users, long activeusers, long admins, long jobs, long queued_massmessages) {return new Site_statistic_itm().Ctor(pages, articles, edits, images, users, activeusers, admins, jobs, queued_massmessages);}
+	public Site_interwikimap_itm Make_interwikimap(String prefix, boolean local, String language, boolean localinterwiki, String url, boolean protorel) {return new Site_interwikimap_itm(Bry_.new_u8_safe(prefix), local, Bry_.new_u8_safe(language), localinterwiki, Bry_.new_u8_safe(url), protorel);}
+	public Site_namespacealias_itm Make_namespacealias(int id, String alias) {return new Site_namespacealias_itm(id, Bry_.new_u8_safe(alias));}
+	public Site_specialpagealias_itm Make_specialpagealias(String realname, String... aliases) {return new Site_specialpagealias_itm(Bry_.new_u8_safe(realname), Bry_.Ary(aliases));}
+	public Site_library_itm Make_library(String name, String version) {return new Site_library_itm(Bry_.new_u8_safe(name), Bry_.new_u8_safe(version));}
+	public Site_extension_itm Make_extension
+		( String type, String name, String namemsg, String description, String descriptionmsg, String author, String url, String version
+		, String vcs_system, String vcs_version, String vcs_url, String vcs_date, String license_name, String license, String credits) {
+		return new Site_extension_itm
+		( Bry_.new_u8_safe(type), Bry_.new_u8_safe(name), Bry_.new_u8_safe(namemsg), Bry_.new_u8_safe(description), Bry_.new_u8_safe(descriptionmsg), Bry_.new_u8_safe(author), Bry_.new_u8_safe(url), Bry_.new_u8_safe(version)
+		, Bry_.new_u8_safe(vcs_system), Bry_.new_u8_safe(vcs_version), Bry_.new_u8_safe(vcs_url), Bry_.new_u8_safe(vcs_date), Bry_.new_u8_safe(license_name), Bry_.new_u8_safe(license), Bry_.new_u8_safe(credits)
+		);
+	}
+	public Site_skin_itm Make_skin(String code, boolean dflt, String name, boolean unusable) {return new Site_skin_itm(Bry_.new_u8_safe(code), dflt, Bry_.new_u8_safe(name), unusable);}
+	public Site_magicword_itm Make_magicword(String name, boolean case_match, String... aliases) {return new Site_magicword_itm(Bry_.new_u8_safe(name), case_match, Bry_.Ary(aliases));}
+	public Site_showhook_itm Make_showhook(String name, String scribunto, String... subscribers) {return new Site_showhook_itm(Bry_.new_u8_safe(name), Bry_.new_u8_safe(scribunto), Bry_.Ary(subscribers));}
+	public Site_language_itm Make_language(String code, String name) {return new Site_language_itm(Bry_.new_u8_safe(code), Bry_.new_u8_safe(name));}
+	public void Test_general(KeyVal... expd) {Tfds.Eq_ary_str(expd, (KeyVal[])site_meta.General_list().To_ary(KeyVal.class));}
+	public void Test_namespace(Site_namespace_itm... expd) {Tfds.Eq_ary_str(expd, (Site_namespace_itm[])site_meta.Namespace_list().To_ary(Site_namespace_itm.class));}
+	public void Test_statistic(Site_statistic_itm expd) {Tfds.Eq_str_intf(expd, site_meta.Statistic_itm());}
+	public void Test_interwikimap(Site_interwikimap_itm... expd) {Tfds.Eq_ary_str(expd, (Site_interwikimap_itm[])site_meta.Interwikimap_list().To_ary(Site_interwikimap_itm.class));}
+	public void Test_namespacealias(Site_namespacealias_itm... expd) {Tfds.Eq_ary_str(expd, (Site_namespacealias_itm[])site_meta.Namespacealias_list().To_ary(Site_namespacealias_itm.class));}
+	public void Test_specialpagealias(Site_specialpagealias_itm... expd) {Tfds.Eq_ary_str(expd, (Site_specialpagealias_itm[])site_meta.Specialpagealias_list().To_ary(Site_specialpagealias_itm.class));}
+	public void Test_library(Site_library_itm... expd) {Tfds.Eq_ary_str(expd, (Site_library_itm[])site_meta.Library_list().To_ary(Site_library_itm.class));}
+	public void Test_extension(Site_extension_itm... expd) {Tfds.Eq_ary_str(expd, (Site_extension_itm[])site_meta.Extension_list().To_ary(Site_extension_itm.class));}
+	public void Test_skin(Site_skin_itm... expd) {Tfds.Eq_ary_str(expd, (Site_skin_itm[])site_meta.Skin_list().To_ary(Site_skin_itm.class));}
+	public void Test_magicword(Site_magicword_itm... expd) {Tfds.Eq_ary_str(expd, (Site_magicword_itm[])site_meta.Magicword_list().To_ary(Site_magicword_itm.class));}
+	public void Test_functionhook(String... expd) {Tfds.Eq_ary_str(expd, String_.Ary((byte[][])site_meta.Functionhook_list().To_ary(byte[].class)));}
+	public void Test_showhook(Site_showhook_itm... expd) {Tfds.Eq_ary_str(expd, (Site_showhook_itm[])site_meta.Showhook_list().To_ary(Site_showhook_itm.class));}
+	public void Test_extensiontag(String... expd) {Tfds.Eq_ary_str(expd, String_.Ary((byte[][])site_meta.Extensiontag_list().To_ary(byte[].class)));}
+	public void Test_protocol(String... expd) {Tfds.Eq_ary_str(expd, String_.Ary((byte[][])site_meta.Protocol_list().To_ary(byte[].class)));}
+	public void Test_defaultoption(KeyVal... expd) {Tfds.Eq_ary_str(expd, (KeyVal[])site_meta.Defaultoption_list().To_ary(KeyVal.class));}
+	public void Test_language(Site_language_itm... expd) {Tfds.Eq_ary_str(expd, (Site_language_itm[])site_meta.Language_list().To_ary(Site_language_itm.class));}
+}
diff --git a/400_xowa/src/gplx/xowa/wmfs/data/Xowmf_kv_itm.java b/400_xowa/src/gplx/xowa/wmfs/data/Site_kv_itm.java
similarity index 89%
rename from 400_xowa/src/gplx/xowa/wmfs/data/Xowmf_kv_itm.java
rename to 400_xowa/src/gplx/xowa/wmfs/data/Site_kv_itm.java
index a8a2574e9..4416a31ac 100644
--- a/400_xowa/src/gplx/xowa/wmfs/data/Xowmf_kv_itm.java
+++ b/400_xowa/src/gplx/xowa/wmfs/data/Site_kv_itm.java
@@ -16,8 +16,8 @@ You should have received a copy of the GNU Affero General Public License
 along with this program.  If not, see .
 */
 package gplx.xowa.wmfs.data; import gplx.*; import gplx.xowa.*; import gplx.xowa.wmfs.*;
-class Xowmf_kv_itm {
-	public Xowmf_kv_itm(byte[] key, byte[] val) {this.key = key; this.val = val;}
+class Site_kv_itm {
+	public Site_kv_itm(byte[] key, byte[] val) {this.key = key; this.val = val;}
 	public byte[] Key() {return key;} private final byte[] key;
 	public byte[] Val() {return val;} private final byte[] val;
 }
diff --git a/400_xowa/src/gplx/xowa/wmfs/data/Site_kv_tbl.java b/400_xowa/src/gplx/xowa/wmfs/data/Site_kv_tbl.java
new file mode 100644
index 000000000..7a2c9057a
--- /dev/null
+++ b/400_xowa/src/gplx/xowa/wmfs/data/Site_kv_tbl.java
@@ -0,0 +1,69 @@
+/*
+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.wmfs.data; import gplx.*; import gplx.xowa.*; import gplx.xowa.wmfs.*;
+import gplx.dbs.*;
+class Site_kv_tbl implements Db_tbl {
+	private String tbl_name; private final Db_meta_fld_list flds = new Db_meta_fld_list();
+	private final String fld_site_abrv, fld_key, fld_val;
+	private final Db_conn conn;
+	private Db_stmt stmt_select, stmt_insert, stmt_delete;
+	public Site_kv_tbl(Db_conn conn, String tbl_name) {
+		this.conn = conn; this.tbl_name = tbl_name;
+		this.fld_site_abrv				= flds.Add_str("site_abrv", 255);
+		this.fld_key					= flds.Add_str("key", 255);
+		this.fld_val					= flds.Add_str("val", 255);
+		conn.Rls_reg(this);
+	}
+	public void Create_tbl() {conn.Ddl_create_tbl(Db_meta_tbl.new_(tbl_name, flds, Db_meta_idx.new_unique_by_name(tbl_name, Db_meta_idx.Bld_idx_name(tbl_name, "main"), fld_site_abrv, fld_key)));}
+	public void Delete_all() {conn.Stmt_delete(tbl_name, Db_meta_fld.Ary_empty).Exec_delete();}
+	public void Rls() {
+		stmt_select = Db_stmt_.Rls(stmt_select);
+		stmt_insert = Db_stmt_.Rls(stmt_insert);
+		stmt_delete = Db_stmt_.Rls(stmt_delete);
+	}
+	public void Select(byte[] site_abrv, Ordered_hash list) {
+		if (stmt_select == null) stmt_select = conn.Stmt_select(tbl_name, flds, fld_site_abrv);
+		list.Clear();
+		Db_rdr rdr = stmt_select.Clear().Crt_bry_as_str(fld_site_abrv, site_abrv).Exec_select__rls_auto();
+		try {
+			while (rdr.Move_next()) {
+				String key = rdr.Read_str(fld_key);
+				String val = rdr.Read_str(fld_val);
+				list.Add(key, KeyVal_.new_(key, val));
+			}
+		}
+		finally {rdr.Rls();}
+	}
+	public void Insert(byte[] site_abrv, Ordered_hash list) {
+		if (stmt_delete == null) stmt_delete = conn.Stmt_delete(tbl_name, fld_site_abrv);
+		if (stmt_insert == null) stmt_insert = conn.Stmt_insert(tbl_name, flds);
+		stmt_delete.Clear().Crt_bry_as_str(fld_site_abrv, site_abrv).Exec_delete();
+		int len = list.Count();
+		for (int i = 0; i < len; ++i) {
+			KeyVal itm = (KeyVal)list.Get_at(i);
+			Insert(site_abrv, itm.Key(), itm.Val_to_str_or_empty());
+		}
+	}
+	private void Insert(byte[] site_abrv, String key, String val) {
+		stmt_insert.Clear()
+			.Val_bry_as_str(fld_site_abrv	, site_abrv)
+			.Val_str(fld_key				, key)
+			.Val_str(fld_val				, val)
+			.Exec_insert();
+	}		
+}
diff --git a/400_xowa/src/gplx/xowa/wmfs/data/Xowmf_language_itm.java b/400_xowa/src/gplx/xowa/wmfs/data/Site_language_itm.java
similarity index 80%
rename from 400_xowa/src/gplx/xowa/wmfs/data/Xowmf_language_itm.java
rename to 400_xowa/src/gplx/xowa/wmfs/data/Site_language_itm.java
index beca8da92..e48fe0247 100644
--- a/400_xowa/src/gplx/xowa/wmfs/data/Xowmf_language_itm.java
+++ b/400_xowa/src/gplx/xowa/wmfs/data/Site_language_itm.java
@@ -16,8 +16,9 @@ You should have received a copy of the GNU Affero General Public License
 along with this program.  If not, see .
 */
 package gplx.xowa.wmfs.data; import gplx.*; import gplx.xowa.*; import gplx.xowa.wmfs.*;
-class Xowmf_language_itm {
-	public Xowmf_language_itm(byte[] code, byte[] name) {this.code = code; this.name = name;}
+class Site_language_itm implements To_str_able {
+	public Site_language_itm(byte[] code, byte[] name) {this.code = code; this.name = name;}
 	public byte[] Code() {return code;} private final byte[] code;
 	public byte[] Name() {return name;} private final byte[] name;
+	public String To_str() {return String_.Concat_with_obj("|", code, name);}
 }
diff --git a/400_xowa/src/gplx/xowa/wmfs/data/Site_language_tbl.java b/400_xowa/src/gplx/xowa/wmfs/data/Site_language_tbl.java
new file mode 100644
index 000000000..efc3f3e26
--- /dev/null
+++ b/400_xowa/src/gplx/xowa/wmfs/data/Site_language_tbl.java
@@ -0,0 +1,71 @@
+/*
+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.wmfs.data; import gplx.*; import gplx.xowa.*; import gplx.xowa.wmfs.*;
+import gplx.dbs.*;
+class Site_language_tbl implements Db_tbl {
+	private static final String tbl_name = "site_language"; private final Db_meta_fld_list flds = new Db_meta_fld_list();
+	private final String fld_site_abrv, fld_code, fld_name;
+	private final Db_conn conn;
+	private Db_stmt stmt_select, stmt_insert, stmt_delete;
+	public Site_language_tbl(Db_conn conn) {
+		this.conn = conn;
+		this.fld_site_abrv				= flds.Add_str("site_abrv", 255);
+		this.fld_code					= flds.Add_str("code", 255);
+		this.fld_name					= flds.Add_str("name", 255);
+		conn.Rls_reg(this);
+	}
+	public void Create_tbl() {conn.Ddl_create_tbl(Db_meta_tbl.new_(tbl_name, flds, Db_meta_idx.new_unique_by_name(tbl_name, Db_meta_idx.Bld_idx_name(tbl_name, "main"), fld_site_abrv, fld_code)));}
+	public void Delete_all() {conn.Stmt_delete(tbl_name, Db_meta_fld.Ary_empty).Exec_delete();}
+	public void Rls() {
+		stmt_select = Db_stmt_.Rls(stmt_select);
+		stmt_insert = Db_stmt_.Rls(stmt_insert);
+		stmt_delete = Db_stmt_.Rls(stmt_delete);
+	}
+	public void Select(byte[] site_abrv, Ordered_hash list) {
+		if (stmt_select == null) stmt_select = conn.Stmt_select(tbl_name, flds, fld_site_abrv);
+		list.Clear();
+		Db_rdr rdr = stmt_select.Clear().Crt_bry_as_str(fld_site_abrv, site_abrv).Exec_select__rls_auto();
+		try {
+			while (rdr.Move_next()) {
+				Site_language_itm itm = new Site_language_itm
+				( rdr.Read_bry_by_str(fld_code)
+				, rdr.Read_bry_by_str(fld_name)
+				);
+				list.Add(itm.Code(), itm);
+			}
+		}
+		finally {rdr.Rls();}
+	}
+	public void Insert(byte[] site_abrv, Ordered_hash list) {
+		if (stmt_delete == null) stmt_delete = conn.Stmt_delete(tbl_name, fld_site_abrv);
+		if (stmt_insert == null) stmt_insert = conn.Stmt_insert(tbl_name, flds);
+		stmt_delete.Clear().Crt_bry_as_str(fld_site_abrv, site_abrv).Exec_delete();
+		int len = list.Count();
+		for (int i = 0; i < len; ++i) {
+			Site_language_itm itm = (Site_language_itm)list.Get_at(i);
+			Insert(site_abrv, itm.Code(), itm.Name());
+		}
+	}
+	private void Insert(byte[] site_abrv, byte[] code, byte[] name) {
+		stmt_insert.Clear()
+			.Val_bry_as_str(fld_site_abrv		, site_abrv)
+			.Val_bry_as_str(fld_code			, code)
+			.Val_bry_as_str(fld_name			, name)
+			.Exec_insert();
+	}		
+}
diff --git a/400_xowa/src/gplx/xowa/wmfs/data/Xowmf_library_itm.java b/400_xowa/src/gplx/xowa/wmfs/data/Site_library_itm.java
similarity index 80%
rename from 400_xowa/src/gplx/xowa/wmfs/data/Xowmf_library_itm.java
rename to 400_xowa/src/gplx/xowa/wmfs/data/Site_library_itm.java
index 7b95275b0..8f504f393 100644
--- a/400_xowa/src/gplx/xowa/wmfs/data/Xowmf_library_itm.java
+++ b/400_xowa/src/gplx/xowa/wmfs/data/Site_library_itm.java
@@ -16,8 +16,9 @@ You should have received a copy of the GNU Affero General Public License
 along with this program.  If not, see .
 */
 package gplx.xowa.wmfs.data; import gplx.*; import gplx.xowa.*; import gplx.xowa.wmfs.*;
-class Xowmf_library_itm {
-	public Xowmf_library_itm(byte[] name, byte[] version) {this.name = name; this.version = version;}
+class Site_library_itm implements To_str_able {
+	public Site_library_itm(byte[] name, byte[] version) {this.name = name; this.version = version;}
 	public byte[] Name() {return name;} private final byte[] name;
 	public byte[] Version() {return version;} private final byte[] version;
+	public String To_str() {return String_.Concat_with_obj("|", name, version);}
 }
diff --git a/400_xowa/src/gplx/xowa/wmfs/data/Site_library_tbl.java b/400_xowa/src/gplx/xowa/wmfs/data/Site_library_tbl.java
new file mode 100644
index 000000000..c812c955d
--- /dev/null
+++ b/400_xowa/src/gplx/xowa/wmfs/data/Site_library_tbl.java
@@ -0,0 +1,71 @@
+/*
+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.wmfs.data; import gplx.*; import gplx.xowa.*; import gplx.xowa.wmfs.*;
+import gplx.dbs.*;
+class Site_library_tbl implements Db_tbl {
+	private static final String tbl_name = "site_library"; private final Db_meta_fld_list flds = new Db_meta_fld_list();
+	private final String fld_site_abrv, fld_name, fld_version;
+	private final Db_conn conn;
+	private Db_stmt stmt_select, stmt_insert, stmt_delete;
+	public Site_library_tbl(Db_conn conn) {
+		this.conn = conn;
+		this.fld_site_abrv				= flds.Add_str("site_abrv", 255);
+		this.fld_name					= flds.Add_str("name", 255);
+		this.fld_version				= flds.Add_str("version", 255);
+		conn.Rls_reg(this);
+	}
+	public void Create_tbl() {conn.Ddl_create_tbl(Db_meta_tbl.new_(tbl_name, flds, Db_meta_idx.new_unique_by_name(tbl_name, Db_meta_idx.Bld_idx_name(tbl_name, "main"), fld_site_abrv, fld_name)));}
+	public void Delete_all() {conn.Stmt_delete(tbl_name, Db_meta_fld.Ary_empty).Exec_delete();}
+	public void Rls() {
+		stmt_select = Db_stmt_.Rls(stmt_select);
+		stmt_insert = Db_stmt_.Rls(stmt_insert);
+		stmt_delete = Db_stmt_.Rls(stmt_delete);
+	}
+	public void Select(byte[] site_abrv, Ordered_hash list) {
+		if (stmt_select == null) stmt_select = conn.Stmt_select(tbl_name, flds, fld_site_abrv);
+		list.Clear();
+		Db_rdr rdr = stmt_select.Clear().Crt_bry_as_str(fld_site_abrv, site_abrv).Exec_select__rls_auto();
+		try {
+			while (rdr.Move_next()) {
+				Site_library_itm itm = new Site_library_itm
+				( rdr.Read_bry_by_str(fld_name)
+				, rdr.Read_bry_by_str(fld_version)
+				);
+				list.Add(itm.Name(), itm);
+			}
+		}
+		finally {rdr.Rls();}
+	}
+	public void Insert(byte[] site_abrv, Ordered_hash list) {
+		if (stmt_delete == null) stmt_delete = conn.Stmt_delete(tbl_name, fld_site_abrv);
+		if (stmt_insert == null) stmt_insert = conn.Stmt_insert(tbl_name, flds);
+		stmt_delete.Clear().Crt_bry_as_str(fld_site_abrv, site_abrv).Exec_delete();
+		int len = list.Count();
+		for (int i = 0; i < len; ++i) {
+			Site_library_itm itm = (Site_library_itm)list.Get_at(i);
+			Insert(site_abrv, itm.Name(), itm.Version());
+		}
+	}
+	private void Insert(byte[] site_abrv, byte[] name, byte[] version) {
+		stmt_insert.Clear()
+			.Val_bry_as_str(fld_site_abrv		, site_abrv)
+			.Val_bry_as_str(fld_name			, name)
+			.Val_bry_as_str(fld_version			, version)
+			.Exec_insert();
+	}		
+}
diff --git a/400_xowa/src/gplx/xowa/wmfs/data/Site_magicword_itm.java b/400_xowa/src/gplx/xowa/wmfs/data/Site_magicword_itm.java
new file mode 100644
index 000000000..0a7eb8265
--- /dev/null
+++ b/400_xowa/src/gplx/xowa/wmfs/data/Site_magicword_itm.java
@@ -0,0 +1,27 @@
+/*
+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.wmfs.data; import gplx.*; import gplx.xowa.*; import gplx.xowa.wmfs.*;
+class Site_magicword_itm implements To_str_able {
+	public Site_magicword_itm(byte[] name, boolean case_match, byte[][] aliases) {
+		this.name = name; this.case_match = case_match; this.aliases = aliases;
+	}
+	public byte[] Name() {return name;} private final byte[] name;
+	public boolean Case_match() {return case_match;} private final boolean case_match;
+	public byte[][] Aliases() {return aliases;} private final byte[][] aliases;
+	public String To_str() {return String_.Concat_with_obj("|", case_match, name, String_.Concat_with_obj(";", (Object[])aliases));}
+}
diff --git a/400_xowa/src/gplx/xowa/wmfs/data/Site_magicword_tbl.java b/400_xowa/src/gplx/xowa/wmfs/data/Site_magicword_tbl.java
new file mode 100644
index 000000000..7c37e09e9
--- /dev/null
+++ b/400_xowa/src/gplx/xowa/wmfs/data/Site_magicword_tbl.java
@@ -0,0 +1,74 @@
+/*
+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.wmfs.data; import gplx.*; import gplx.xowa.*; import gplx.xowa.wmfs.*;
+import gplx.dbs.*;
+class Site_magicword_tbl implements Db_tbl {
+	private static final String tbl_name = "site_magicword"; private final Db_meta_fld_list flds = new Db_meta_fld_list();
+	private final String fld_site_abrv, fld_name, fld_case_match, fld_aliases;
+	private final Db_conn conn;
+	private Db_stmt stmt_select, stmt_insert, stmt_delete;
+	public Site_magicword_tbl(Db_conn conn) {
+		this.conn = conn;
+		this.fld_site_abrv				= flds.Add_str("site_abrv", 255);
+		this.fld_name					= flds.Add_str("name", 255);
+		this.fld_case_match				= flds.Add_bool("case_match");
+		this.fld_aliases				= flds.Add_str("aliases", 2048);
+		conn.Rls_reg(this);
+	}
+	public void Create_tbl() {conn.Ddl_create_tbl(Db_meta_tbl.new_(tbl_name, flds, Db_meta_idx.new_unique_by_name(tbl_name, Db_meta_idx.Bld_idx_name(tbl_name, "main"), fld_site_abrv, fld_name)));}
+	public void Delete_all() {conn.Stmt_delete(tbl_name, Db_meta_fld.Ary_empty).Exec_delete();}
+	public void Rls() {
+		stmt_select = Db_stmt_.Rls(stmt_select);
+		stmt_insert = Db_stmt_.Rls(stmt_insert);
+		stmt_delete = Db_stmt_.Rls(stmt_delete);
+	}
+	public void Select(byte[] site_abrv, Ordered_hash list) {
+		if (stmt_select == null) stmt_select = conn.Stmt_select(tbl_name, flds, fld_site_abrv);
+		list.Clear();
+		Db_rdr rdr = stmt_select.Clear().Crt_bry_as_str(fld_site_abrv, site_abrv).Exec_select__rls_auto();
+		try {
+			while (rdr.Move_next()) {
+				Site_magicword_itm itm = new Site_magicword_itm
+				( rdr.Read_bry_by_str(fld_name)
+				, rdr.Read_bool_by_byte(fld_case_match)
+				, Bry_.Split(rdr.Read_bry_by_str(fld_aliases), Byte_ascii.Pipe_bry)
+				);
+				list.Add(itm.Name(), itm);
+			}
+		}
+		finally {rdr.Rls();}
+	}
+	public void Insert(byte[] site_abrv, Ordered_hash list) {
+		if (stmt_delete == null) stmt_delete = conn.Stmt_delete(tbl_name, fld_site_abrv);
+		if (stmt_insert == null) stmt_insert = conn.Stmt_insert(tbl_name, flds);
+		stmt_delete.Clear().Crt_bry_as_str(fld_site_abrv, site_abrv).Exec_delete();
+		int len = list.Count();
+		for (int i = 0; i < len; ++i) {
+			Site_magicword_itm itm = (Site_magicword_itm)list.Get_at(i);
+			Insert(site_abrv, itm.Name(), itm.Case_match(), itm.Aliases());
+		}
+	}
+	private void Insert(byte[] site_abrv, byte[] name, boolean case_match, byte[][] aliases) {
+		stmt_insert.Clear()
+			.Val_bry_as_str(fld_site_abrv		, site_abrv)
+			.Val_bry_as_str(fld_name			, name)
+			.Val_bool_as_byte(fld_case_match	, case_match)
+			.Val_bry_as_str(fld_aliases			, Bry_.Add_w_dlm(Byte_ascii.Pipe, aliases))
+			.Exec_insert();
+	}		
+}
diff --git a/400_xowa/src/gplx/xowa/wmfs/data/Site_meta_itm.java b/400_xowa/src/gplx/xowa/wmfs/data/Site_meta_itm.java
new file mode 100644
index 000000000..e82ef37c8
--- /dev/null
+++ b/400_xowa/src/gplx/xowa/wmfs/data/Site_meta_itm.java
@@ -0,0 +1,82 @@
+/*
+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.wmfs.data; import gplx.*; import gplx.xowa.*; import gplx.xowa.wmfs.*;
+import gplx.xowa.wikis.domains.*;
+public class Site_meta_itm {
+	public Ordered_hash			General_list() {return general_list;} private final Ordered_hash general_list = Ordered_hash_.new_bry_();
+	public Ordered_hash			Namespace_list() {return namespace_list;} private final Ordered_hash namespace_list = Ordered_hash_.new_();
+	public Site_statistic_itm	Statistic_itm() {return statistic_itm;} private final Site_statistic_itm statistic_itm = new Site_statistic_itm();
+	public Ordered_hash			Interwikimap_list() {return interwikimap_list;} private final Ordered_hash interwikimap_list = Ordered_hash_.new_bry_();
+	public List_adp				Namespacealias_list() {return namespacealias_list;} private final List_adp namespacealias_list = List_adp_.new_();
+	public Ordered_hash			Specialpagealias_list() {return specialpagealias_list;} private final Ordered_hash specialpagealias_list = Ordered_hash_.new_bry_();
+	public Ordered_hash			Library_list() {return library_list;} private final Ordered_hash library_list = Ordered_hash_.new_bry_();
+	public Ordered_hash			Extension_list() {return extension_list;} private final Ordered_hash extension_list = Ordered_hash_.new_bry_();
+	public Ordered_hash			Skin_list() {return skin_list;} private final Ordered_hash skin_list = Ordered_hash_.new_bry_();
+	public Ordered_hash			Magicword_list() {return magicword_list;} private final Ordered_hash magicword_list = Ordered_hash_.new_bry_();
+	public Ordered_hash			Functionhook_list() {return functionhook_list;} private final Ordered_hash functionhook_list = Ordered_hash_.new_bry_();
+	public Ordered_hash			Showhook_list() {return showhook_list;} private final Ordered_hash showhook_list = Ordered_hash_.new_bry_();
+	public Ordered_hash			Extensiontag_list() {return extensiontag_list;} private final Ordered_hash extensiontag_list = Ordered_hash_.new_bry_();
+	public Ordered_hash			Protocol_list() {return protocol_list;} private final Ordered_hash protocol_list = Ordered_hash_.new_bry_();
+	public Ordered_hash			Defaultoption_list() {return defaultoption_list;} private final Ordered_hash defaultoption_list = Ordered_hash_.new_();
+	public Ordered_hash			Language_list() {return language_list;} private final Ordered_hash language_list = Ordered_hash_.new_bry_();
+	public static void Build_site_meta(Xowmf_mgr wmf_mgr, Io_url db_url, String[] reqd_ary, DateAdp cutoff) {
+		Ordered_hash reqd_hash = Ordered_hash_.new_();
+		int reqd_len = reqd_ary.length;
+		for (int i = 0; i < reqd_len; ++i)
+			reqd_hash.Add_as_key_and_val(reqd_ary[i]);
+
+		Site_core_db json_db = new Site_core_db(db_url);			
+		Site_core_itm[] actl_ary = json_db.Tbl__core().Select_all_downloaded(cutoff);
+		int actl_len = actl_ary.length;
+		for (int i = 0; i < actl_len; ++i) {	// remove items that have been completed after cutoff date
+			Site_core_itm actl_itm = actl_ary[i];
+			reqd_hash.Del(String_.new_u8(actl_itm.Site_domain()));
+		}
+		
+		reqd_len = reqd_hash.Count();
+		Gfo_usr_dlg usr_dlg = Gfo_usr_dlg_.Test_console();
+		Xow_wmf_api_mgr api_wkr = new Xow_wmf_api_mgr();
+		for (int i = 0; i < reqd_len; ++i) {
+			String domain_str = (String)reqd_hash.Get_at(i);
+			DateAdp json_date = DateAdp_.Now();
+			byte[] json_text = null;
+			for (int j = 0; j < 5; ++j) {
+				json_text = api_wkr.Api_exec(usr_dlg, wmf_mgr, domain_str, "action=query&format=json&meta=siteinfo&siprop=general|namespaces|statistics|interwikimap|namespacealiases|specialpagealiases|libraries|extensions|skins|magicwords|functionhooks|showhooks|extensiontags|protocols|defaultoptions|languages");
+				if (json_text == null)
+					gplx.core.threads.Thread_adp_.Sleep(1000);
+				else
+					break;
+			}
+			byte[] domain_bry = Bry_.new_u8(domain_str);
+			byte[] site_abrv = Xow_domain_abrv_xo_.To_bry(domain_bry);
+			json_db.Tbl__core().Insert(site_abrv, domain_bry, Bool_.N, json_date, json_text);
+		}
+
+		Site_json_parser json_parser = new Site_json_parser();
+		reqd_len = reqd_ary.length;
+		for (int i = 0; i < reqd_len; ++i) {
+			String domain_str = reqd_ary[i];
+			byte[] site_abrv = Xow_domain_abrv_xo_.To_bry(Bry_.new_u8(domain_str));
+			Site_core_itm core_itm = json_db.Tbl__core().Select_itm(site_abrv);
+			if (core_itm.Json_completed()) continue;
+			Site_meta_itm meta_itm = new Site_meta_itm();
+			json_parser.Parse_root(meta_itm, String_.new_u8(core_itm.Site_domain()), core_itm.Json_text());
+			json_db.Save(meta_itm, site_abrv);
+		}
+	}
+}
diff --git a/400_xowa/src/gplx/xowa/wmfs/data/Site_namespace_itm.java b/400_xowa/src/gplx/xowa/wmfs/data/Site_namespace_itm.java
new file mode 100644
index 000000000..5e3330d3e
--- /dev/null
+++ b/400_xowa/src/gplx/xowa/wmfs/data/Site_namespace_itm.java
@@ -0,0 +1,34 @@
+/*
+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.wmfs.data; import gplx.*; import gplx.xowa.*; import gplx.xowa.wmfs.*;
+class Site_namespace_itm implements To_str_able {
+	public Site_namespace_itm(int id, byte[] case_tid, byte[] canonical, byte[] localized, boolean subpages, boolean content, byte[] defaultcontentmodel) {
+		this.id = id; this.case_tid = case_tid; this.canonical = canonical; this.localized = localized;
+		this.subpages = subpages; this.content = content; this.defaultcontentmodel = defaultcontentmodel;
+	}
+	public int Id() {return id;} private final int id;
+	public byte[] Case_tid() {return case_tid;} private final byte[] case_tid;
+	public byte[] Canonical() {return canonical;} private final byte[] canonical;
+	public byte[] Localized() {return localized;} private final byte[] localized;
+	public boolean Subpages() {return subpages;} private final boolean subpages;
+	public boolean Content() {return content;} private final boolean content;
+	public byte[] Defaultcontentmodel() {return defaultcontentmodel;} private final byte[] defaultcontentmodel;
+	public String To_str() {
+		return String_.Concat_with_obj("|", id, case_tid, canonical, localized, subpages, content, defaultcontentmodel);
+	}
+}
diff --git a/400_xowa/src/gplx/xowa/wmfs/data/Site_namespace_tbl.java b/400_xowa/src/gplx/xowa/wmfs/data/Site_namespace_tbl.java
new file mode 100644
index 000000000..fae3a4c05
--- /dev/null
+++ b/400_xowa/src/gplx/xowa/wmfs/data/Site_namespace_tbl.java
@@ -0,0 +1,86 @@
+/*
+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.wmfs.data; import gplx.*; import gplx.xowa.*; import gplx.xowa.wmfs.*;
+import gplx.dbs.*;
+public class Site_namespace_tbl implements Db_tbl {
+	private static final String tbl_name = "site_namespace"; private final Db_meta_fld_list flds = new Db_meta_fld_list();
+	private final String fld_site_abrv, fld_id, fld_case_tid, fld_canonical, fld_localized, fld_subpages, fld_content, fld_defaultcontentmodel;
+	private final Db_conn conn;
+	private Db_stmt stmt_select, stmt_insert, stmt_delete;
+	public Site_namespace_tbl(Db_conn conn) {
+		this.conn = conn;
+		this.fld_site_abrv				= flds.Add_str("site_abrv", 255);
+		this.fld_id						= flds.Add_int("id");
+		this.fld_case_tid				= flds.Add_bry("case_tid");
+		this.fld_canonical				= flds.Add_bry("canonical");
+		this.fld_localized				= flds.Add_bry("localized");
+		this.fld_subpages				= flds.Add_byte("subpages");
+		this.fld_content				= flds.Add_byte("content");
+		this.fld_defaultcontentmodel	= flds.Add_str("defaultcontentmodel", 255);
+		conn.Rls_reg(this);
+	}
+	public void Create_tbl() {conn.Ddl_create_tbl(Db_meta_tbl.new_(tbl_name, flds, Db_meta_idx.new_unique_by_name(tbl_name, Db_meta_idx.Bld_idx_name(tbl_name, "main"), fld_site_abrv, fld_id)));}
+	public void Delete_all() {conn.Stmt_delete(tbl_name, Db_meta_fld.Ary_empty).Exec_delete();}
+	public void Rls() {
+		stmt_select = Db_stmt_.Rls(stmt_select);
+		stmt_insert = Db_stmt_.Rls(stmt_insert);
+		stmt_delete = Db_stmt_.Rls(stmt_delete);
+	}
+	public void Select(byte[] site_abrv, Ordered_hash list) {
+		if (stmt_select == null) stmt_select = conn.Stmt_select(tbl_name, flds, fld_site_abrv);
+		list.Clear();
+		Db_rdr rdr = stmt_select.Clear().Crt_bry_as_str(fld_site_abrv, site_abrv).Exec_select__rls_manual();
+		try {
+			while (rdr.Move_next()) {
+				Site_namespace_itm itm = new Site_namespace_itm
+				( rdr.Read_int			(fld_id)
+				, rdr.Read_bry_by_str	(fld_case_tid)
+				, rdr.Read_bry_by_str	(fld_canonical)
+				, rdr.Read_bry_by_str	(fld_localized)
+				, rdr.Read_bool_by_byte	(fld_subpages)
+				, rdr.Read_bool_by_byte	(fld_content)
+				, rdr.Read_bry_by_str	(fld_defaultcontentmodel)
+				);
+				list.Add(itm.Id(), itm);
+			}
+		}
+		finally {rdr.Rls();}
+	}
+	public void Insert(byte[] site_abrv, Ordered_hash list) {
+		if (stmt_delete == null) stmt_delete = conn.Stmt_delete(tbl_name, fld_site_abrv);
+		stmt_delete.Clear().Crt_bry_as_str(fld_site_abrv, site_abrv).Exec_delete();
+		int len = list.Count();
+		for (int i = 0; i < len; ++i) {
+			Site_namespace_itm itm = (Site_namespace_itm)list.Get_at(i);
+			Insert(site_abrv, itm.Id(), itm.Case_tid(), itm.Canonical(), itm.Localized(), itm.Subpages(), itm.Content(), itm.Defaultcontentmodel());
+		}
+	}
+	public void Insert(byte[] site_abrv, int id, byte[] case_tid, byte[] canonical, byte[] localized, boolean subpages, boolean content, byte[] defaultcontentmodel) {
+		if (stmt_insert == null) stmt_insert = conn.Stmt_insert(tbl_name, flds);
+		stmt_insert.Clear()
+			.Val_bry_as_str		(fld_site_abrv				, site_abrv)
+			.Val_int			(fld_id						, id)
+			.Val_bry_as_str		(fld_case_tid				, case_tid)
+			.Val_bry_as_str		(fld_canonical				, canonical)
+			.Val_bry_as_str		(fld_localized				, localized)
+			.Val_bool_as_byte	(fld_subpages				, subpages)
+			.Val_bool_as_byte	(fld_content				, content)
+			.Val_bry_as_str		(fld_defaultcontentmodel	, defaultcontentmodel)
+			.Exec_insert();
+	}
+}
diff --git a/400_xowa/src/gplx/xowa/wmfs/data/Xowmf_namespacealias_itm.java b/400_xowa/src/gplx/xowa/wmfs/data/Site_namespacealias_itm.java
similarity index 71%
rename from 400_xowa/src/gplx/xowa/wmfs/data/Xowmf_namespacealias_itm.java
rename to 400_xowa/src/gplx/xowa/wmfs/data/Site_namespacealias_itm.java
index c3acb20ba..7f95e8180 100644
--- a/400_xowa/src/gplx/xowa/wmfs/data/Xowmf_namespacealias_itm.java
+++ b/400_xowa/src/gplx/xowa/wmfs/data/Site_namespacealias_itm.java
@@ -16,8 +16,13 @@ You should have received a copy of the GNU Affero General Public License
 along with this program.  If not, see .
 */
 package gplx.xowa.wmfs.data; import gplx.*; import gplx.xowa.*; import gplx.xowa.wmfs.*;
-class Xowmf_namespacealias_itm {
-	public Xowmf_namespacealias_itm(int id, byte[] alias) {this.id = id; this.alias = alias;}
+class Site_namespacealias_itm implements To_str_able {
+	public Site_namespacealias_itm(int id, byte[] alias) {
+		this.id = id; this.alias = alias;
+		this.key = Bry_.Add_w_dlm(Byte_ascii.Pipe, Int_.Xto_bry(id), alias);
+	}
+	public byte[] Key() {return key;} private final byte[] key;
 	public int Id() {return id;} private final int id;
 	public byte[] Alias() {return alias;} private final byte[] alias;
+	public String To_str() {return String_.Concat_with_obj("|", id, alias);}
 }
diff --git a/400_xowa/src/gplx/xowa/wmfs/data/Site_namespacealias_tbl.java b/400_xowa/src/gplx/xowa/wmfs/data/Site_namespacealias_tbl.java
new file mode 100644
index 000000000..0fe773006
--- /dev/null
+++ b/400_xowa/src/gplx/xowa/wmfs/data/Site_namespacealias_tbl.java
@@ -0,0 +1,71 @@
+/*
+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.wmfs.data; import gplx.*; import gplx.xowa.*; import gplx.xowa.wmfs.*;
+import gplx.dbs.*;
+class Site_namespacealias_tbl implements Db_tbl {
+	private static final String tbl_name = "site_namespacealias"; private final Db_meta_fld_list flds = new Db_meta_fld_list();
+	private final String fld_site_abrv, fld_id, fld_alias;
+	private final Db_conn conn;
+	private Db_stmt stmt_select, stmt_insert, stmt_delete;
+	public Site_namespacealias_tbl(Db_conn conn) {
+		this.conn = conn;
+		this.fld_site_abrv				= flds.Add_str("site_abrv", 255);
+		this.fld_id						= flds.Add_int("id");
+		this.fld_alias					= flds.Add_str("alias", 2048);
+		conn.Rls_reg(this);
+	}
+	public void Create_tbl() {conn.Ddl_create_tbl(Db_meta_tbl.new_(tbl_name, flds, Db_meta_idx.new_normal_by_name(tbl_name, Db_meta_idx.Bld_idx_name(tbl_name, "main"), fld_site_abrv, fld_id, fld_alias)));}	// NOTE: kk.w has duplicate entries in json
+	public void Delete_all() {conn.Stmt_delete(tbl_name, Db_meta_fld.Ary_empty).Exec_delete();}
+	public void Rls() {
+		stmt_select = Db_stmt_.Rls(stmt_select);
+		stmt_insert = Db_stmt_.Rls(stmt_insert);
+		stmt_delete = Db_stmt_.Rls(stmt_delete);
+	}
+	public void Select(byte[] site_abrv, List_adp list) {
+		if (stmt_select == null) stmt_select = conn.Stmt_select(tbl_name, flds, fld_site_abrv);
+		list.Clear();
+		Db_rdr rdr = stmt_select.Clear().Crt_bry_as_str(fld_site_abrv, site_abrv).Exec_select__rls_auto();
+		try {
+			while (rdr.Move_next()) {
+				Site_namespacealias_itm itm = new Site_namespacealias_itm
+				( rdr.Read_int(fld_id)
+				, rdr.Read_bry_by_str(fld_alias)
+				);
+				list.Add(itm);
+			}
+		}
+		finally {rdr.Rls();}
+	}
+	public void Insert(byte[] site_abrv, List_adp list) {
+		if (stmt_delete == null) stmt_delete = conn.Stmt_delete(tbl_name, fld_site_abrv);
+		if (stmt_insert == null) stmt_insert = conn.Stmt_insert(tbl_name, flds);
+		stmt_delete.Clear().Crt_bry_as_str(fld_site_abrv, site_abrv).Exec_delete();
+		int len = list.Count();
+		for (int i = 0; i < len; ++i) {
+			Site_namespacealias_itm itm = (Site_namespacealias_itm)list.Get_at(i);
+			Insert(site_abrv, itm.Id(), itm.Alias());
+		}
+	}
+	private void Insert(byte[] site_abrv, int id, byte[] alias) {
+		stmt_insert.Clear()
+			.Val_bry_as_str(fld_site_abrv			, site_abrv)
+			.Val_int(fld_id							, id)
+			.Val_bry_as_str(fld_alias				, alias)
+			.Exec_insert();
+	}
+}
diff --git a/400_xowa/src/gplx/xowa/wmfs/data/Site_showhook_itm.java b/400_xowa/src/gplx/xowa/wmfs/data/Site_showhook_itm.java
new file mode 100644
index 000000000..6db845560
--- /dev/null
+++ b/400_xowa/src/gplx/xowa/wmfs/data/Site_showhook_itm.java
@@ -0,0 +1,27 @@
+/*
+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.wmfs.data; import gplx.*; import gplx.xowa.*; import gplx.xowa.wmfs.*;
+class Site_showhook_itm implements To_str_able {
+	public Site_showhook_itm(byte[] name, byte[] scribunto, byte[][] subscribers) {
+		this.name = name; this.scribunto = scribunto; this.subscribers = subscribers;
+	}
+	public byte[] Name() {return name;} private final byte[] name;
+	public byte[] Scribunto() {return scribunto;} private final byte[] scribunto;
+	public byte[][] Subscribers() {return subscribers;} private final byte[][] subscribers;
+	public String To_str() {return String_.Concat_with_obj("|", name, scribunto, String_.Concat_with_obj(";", (Object[])subscribers));}
+}
diff --git a/400_xowa/src/gplx/xowa/wmfs/data/Site_showhook_tbl.java b/400_xowa/src/gplx/xowa/wmfs/data/Site_showhook_tbl.java
new file mode 100644
index 000000000..c34d2fb64
--- /dev/null
+++ b/400_xowa/src/gplx/xowa/wmfs/data/Site_showhook_tbl.java
@@ -0,0 +1,74 @@
+/*
+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.wmfs.data; import gplx.*; import gplx.xowa.*; import gplx.xowa.wmfs.*;
+import gplx.dbs.*;
+class Site_showhook_tbl implements Db_tbl {
+	private static final String tbl_name = "site_showhook"; private final Db_meta_fld_list flds = new Db_meta_fld_list();
+	private final String fld_site_abrv, fld_name, fld_scribunto, fld_subscribers;
+	private final Db_conn conn;
+	private Db_stmt stmt_select, stmt_insert, stmt_delete;
+	public Site_showhook_tbl(Db_conn conn) {
+		this.conn = conn;
+		this.fld_site_abrv				= flds.Add_str("site_abrv", 255);
+		this.fld_name					= flds.Add_str("name", 255);
+		this.fld_scribunto				= flds.Add_str("scribunto", 255);
+		this.fld_subscribers			= flds.Add_str("subscribers", 2048);
+		conn.Rls_reg(this);
+	}
+	public void Create_tbl() {conn.Ddl_create_tbl(Db_meta_tbl.new_(tbl_name, flds, Db_meta_idx.new_unique_by_name(tbl_name, Db_meta_idx.Bld_idx_name(tbl_name, "main"), fld_site_abrv, fld_name)));}
+	public void Delete_all() {conn.Stmt_delete(tbl_name, Db_meta_fld.Ary_empty).Exec_delete();}
+	public void Rls() {
+		stmt_select = Db_stmt_.Rls(stmt_select);
+		stmt_insert = Db_stmt_.Rls(stmt_insert);
+		stmt_delete = Db_stmt_.Rls(stmt_delete);
+	}
+	public void Select(byte[] site_abrv, Ordered_hash list) {
+		if (stmt_select == null) stmt_select = conn.Stmt_select(tbl_name, flds, fld_site_abrv);
+		list.Clear();
+		Db_rdr rdr = stmt_select.Clear().Crt_bry_as_str(fld_site_abrv, site_abrv).Exec_select__rls_auto();
+		try {
+			while (rdr.Move_next()) {
+				Site_showhook_itm itm = new Site_showhook_itm
+				( rdr.Read_bry_by_str(fld_name)
+				, rdr.Read_bry_by_str(fld_scribunto)
+				, Bry_.Split(rdr.Read_bry_by_str(fld_subscribers), Byte_ascii.Pipe_bry)
+				);
+				list.Add(itm.Name(), itm);
+			}
+		}
+		finally {rdr.Rls();}
+	}
+	public void Insert(byte[] site_abrv, Ordered_hash list) {
+		if (stmt_delete == null) stmt_delete = conn.Stmt_delete(tbl_name, fld_site_abrv);
+		if (stmt_insert == null) stmt_insert = conn.Stmt_insert(tbl_name, flds);
+		stmt_delete.Clear().Crt_bry_as_str(fld_site_abrv, site_abrv).Exec_delete();
+		int len = list.Count();
+		for (int i = 0; i < len; ++i) {
+			Site_showhook_itm itm = (Site_showhook_itm)list.Get_at(i);
+			Insert(site_abrv, itm.Name(), itm.Scribunto(), itm.Subscribers());
+		}
+	}
+	private void Insert(byte[] site_abrv, byte[] name, byte[] scribunto, byte[][] subscribers) {
+		stmt_insert.Clear()
+			.Val_bry_as_str(fld_site_abrv		, site_abrv)
+			.Val_bry_as_str(fld_name			, name)
+			.Val_bry_as_str(fld_scribunto		, scribunto)
+			.Val_bry_as_str(fld_subscribers		, Bry_.Add_w_dlm(Byte_ascii.Pipe, subscribers))
+			.Exec_insert();
+	}		
+}
diff --git a/400_xowa/src/gplx/xowa/wmfs/data/Site_skin_itm.java b/400_xowa/src/gplx/xowa/wmfs/data/Site_skin_itm.java
new file mode 100644
index 000000000..4dac834bf
--- /dev/null
+++ b/400_xowa/src/gplx/xowa/wmfs/data/Site_skin_itm.java
@@ -0,0 +1,28 @@
+/*
+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.wmfs.data; import gplx.*; import gplx.xowa.*; import gplx.xowa.wmfs.*;
+class Site_skin_itm implements To_str_able {
+	public Site_skin_itm(byte[] code, boolean dflt, byte[] name, boolean unusable) {
+		this.code = code; this.dflt = dflt; this.name = name; this.unusable = unusable;
+	}
+	public byte[] Code() {return code;} private final byte[] code;
+	public boolean Dflt() {return dflt;} private final boolean dflt;
+	public byte[] Name() {return name;} private final byte[] name;
+	public boolean Unusable() {return unusable;} private final boolean unusable;
+	public String To_str() {return String_.Concat_with_obj("|", code, dflt, name, unusable);}
+}
diff --git a/400_xowa/src/gplx/xowa/wmfs/data/Site_skin_tbl.java b/400_xowa/src/gplx/xowa/wmfs/data/Site_skin_tbl.java
new file mode 100644
index 000000000..7aeeeae7f
--- /dev/null
+++ b/400_xowa/src/gplx/xowa/wmfs/data/Site_skin_tbl.java
@@ -0,0 +1,77 @@
+/*
+XOWA: the XOWA Offline Wiki Application
+Copyright (C) 2012 gnosygnu@gmail.com
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU Affero General Public License as
+published by the Free Software Foundation, either version 3 of the
+License, or (at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU Affero General Public License for more details.
+
+You should have received a copy of the GNU Affero General Public License
+along with this program.  If not, see .
+*/
+package gplx.xowa.wmfs.data; import gplx.*; import gplx.xowa.*; import gplx.xowa.wmfs.*;
+import gplx.dbs.*;
+class Site_skin_tbl implements Db_tbl {
+	private static final String tbl_name = "site_skin"; private final Db_meta_fld_list flds = new Db_meta_fld_list();
+	private final String fld_site_abrv, fld_code, fld_dflt, fld_name, fld_unusable;
+	private final Db_conn conn;
+	private Db_stmt stmt_select, stmt_insert, stmt_delete;
+	public Site_skin_tbl(Db_conn conn) {
+		this.conn = conn;
+		this.fld_site_abrv				= flds.Add_str("site_abrv", 255);
+		this.fld_code					= flds.Add_str("code", 255);
+		this.fld_dflt					= flds.Add_bool("dflt");
+		this.fld_name					= flds.Add_str("name", 255);
+		this.fld_unusable				= flds.Add_bool("unusable");
+		conn.Rls_reg(this);
+	}
+	public void Create_tbl() {conn.Ddl_create_tbl(Db_meta_tbl.new_(tbl_name, flds, Db_meta_idx.new_unique_by_name(tbl_name, Db_meta_idx.Bld_idx_name(tbl_name, "main"), fld_site_abrv, fld_code)));}
+	public void Delete_all() {conn.Stmt_delete(tbl_name, Db_meta_fld.Ary_empty).Exec_delete();}
+	public void Rls() {
+		stmt_select = Db_stmt_.Rls(stmt_select);
+		stmt_insert = Db_stmt_.Rls(stmt_insert);
+		stmt_delete = Db_stmt_.Rls(stmt_delete);
+	}
+	public void Select(byte[] site_abrv, Ordered_hash list) {
+		if (stmt_select == null) stmt_select = conn.Stmt_select(tbl_name, flds, fld_site_abrv);
+		list.Clear();
+		Db_rdr rdr = stmt_select.Clear().Crt_bry_as_str(fld_site_abrv, site_abrv).Exec_select__rls_auto();
+		try {
+			while (rdr.Move_next()) {
+				Site_skin_itm itm = new Site_skin_itm
+				( rdr.Read_bry_by_str(fld_code)
+				, rdr.Read_bool_by_byte(fld_dflt)
+				, rdr.Read_bry_by_str(fld_name)
+				, rdr.Read_bool_by_byte(fld_unusable)
+				);
+				list.Add(itm.Name(), itm);
+			}
+		}
+		finally {rdr.Rls();}
+	}
+	public void Insert(byte[] site_abrv, Ordered_hash list) {
+		if (stmt_delete == null) stmt_delete = conn.Stmt_delete(tbl_name, fld_site_abrv);
+		if (stmt_insert == null) stmt_insert = conn.Stmt_insert(tbl_name, flds);
+		stmt_delete.Clear().Crt_bry_as_str(fld_site_abrv, site_abrv).Exec_delete();
+		int len = list.Count();
+		for (int i = 0; i < len; ++i) {
+			Site_skin_itm itm = (Site_skin_itm)list.Get_at(i);
+			Insert(site_abrv, itm.Code(), itm.Dflt(), itm.Name(), itm.Unusable());
+		}
+	}
+	private void Insert(byte[] site_abrv, byte[] code, boolean dflt, byte[] name, boolean unusable) {
+		stmt_insert.Clear()
+			.Val_bry_as_str(fld_site_abrv		, site_abrv)
+			.Val_bry_as_str(fld_code			, code)
+			.Val_bool_as_byte(fld_dflt			, dflt)
+			.Val_bry_as_str(fld_name			, name)
+			.Val_bool_as_byte(fld_unusable		, unusable)
+			.Exec_insert();
+	}		
+}
diff --git a/400_xowa/src/gplx/xowa/wmfs/data/Xowmf_specialpagealias_itm.java b/400_xowa/src/gplx/xowa/wmfs/data/Site_specialpagealias_itm.java
similarity index 75%
rename from 400_xowa/src/gplx/xowa/wmfs/data/Xowmf_specialpagealias_itm.java
rename to 400_xowa/src/gplx/xowa/wmfs/data/Site_specialpagealias_itm.java
index f5b9de057..b8e844dae 100644
--- a/400_xowa/src/gplx/xowa/wmfs/data/Xowmf_specialpagealias_itm.java
+++ b/400_xowa/src/gplx/xowa/wmfs/data/Site_specialpagealias_itm.java
@@ -16,8 +16,9 @@ You should have received a copy of the GNU Affero General Public License
 along with this program.  If not, see .
 */
 package gplx.xowa.wmfs.data; import gplx.*; import gplx.xowa.*; import gplx.xowa.wmfs.*;
-class Xowmf_specialpagealias_itm {
-	public Xowmf_specialpagealias_itm(byte[] realname, byte[][] aliases) {this.realname = realname; this.aliases = aliases;}
+class Site_specialpagealias_itm implements To_str_able {
+	public Site_specialpagealias_itm(byte[] realname, byte[][] aliases) {this.realname = realname; this.aliases = aliases;}
 	public byte[] Realname() {return realname;} private final byte[] realname;
 	public byte[][] Aliases() {return aliases;} private final byte[][] aliases;
+	public String To_str() {return String_.Concat_with_obj("|", realname, String_.Concat_with_obj(";", (Object[])aliases));}
 }
diff --git a/400_xowa/src/gplx/xowa/wmfs/data/Site_specialpagealias_tbl.java b/400_xowa/src/gplx/xowa/wmfs/data/Site_specialpagealias_tbl.java
new file mode 100644
index 000000000..d1e22d6d3
--- /dev/null
+++ b/400_xowa/src/gplx/xowa/wmfs/data/Site_specialpagealias_tbl.java
@@ -0,0 +1,71 @@
+/*
+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.wmfs.data; import gplx.*; import gplx.xowa.*; import gplx.xowa.wmfs.*;
+import gplx.dbs.*;
+class Site_specialpagealias_tbl implements Db_tbl {
+	private static final String tbl_name = "site_specialpagealias"; private final Db_meta_fld_list flds = new Db_meta_fld_list();
+	private final String fld_site_abrv, fld_realname, fld_aliases;
+	private final Db_conn conn;
+	private Db_stmt stmt_select, stmt_insert, stmt_delete;
+	public Site_specialpagealias_tbl(Db_conn conn) {
+		this.conn = conn;
+		this.fld_site_abrv				= flds.Add_str("site_abrv", 255);
+		this.fld_realname				= flds.Add_str("realname", 255);
+		this.fld_aliases				= flds.Add_str("aliases", 2048);
+		conn.Rls_reg(this);
+	}
+	public void Create_tbl() {conn.Ddl_create_tbl(Db_meta_tbl.new_(tbl_name, flds, Db_meta_idx.new_unique_by_name(tbl_name, Db_meta_idx.Bld_idx_name(tbl_name, Db_meta_idx.Bld_idx_name(tbl_name, "main")), fld_site_abrv, fld_realname)));}
+	public void Delete_all() {conn.Stmt_delete(tbl_name, Db_meta_fld.Ary_empty).Exec_delete();}
+	public void Rls() {
+		stmt_select = Db_stmt_.Rls(stmt_select);
+		stmt_insert = Db_stmt_.Rls(stmt_insert);
+		stmt_delete = Db_stmt_.Rls(stmt_delete);
+	}
+	public void Select(byte[] site_abrv, Ordered_hash list) {
+		if (stmt_select == null) stmt_select = conn.Stmt_select(tbl_name, flds, fld_site_abrv);
+		list.Clear();
+		Db_rdr rdr = stmt_select.Clear().Crt_bry_as_str(fld_site_abrv, site_abrv).Exec_select__rls_auto();
+		try {
+			while (rdr.Move_next()) {
+				Site_specialpagealias_itm itm = new Site_specialpagealias_itm
+				( rdr.Read_bry_by_str(fld_realname)
+				, Bry_.Split(rdr.Read_bry_by_str(fld_aliases), Byte_ascii.Pipe_bry)
+				);
+				list.Add(itm.Realname(), itm);
+			}
+		}
+		finally {rdr.Rls();}
+	}
+	public void Insert(byte[] site_abrv, Ordered_hash list) {
+		if (stmt_delete == null) stmt_delete = conn.Stmt_delete(tbl_name, fld_site_abrv);
+		if (stmt_insert == null) stmt_insert = conn.Stmt_insert(tbl_name, flds);
+		stmt_delete.Clear().Crt_bry_as_str(fld_site_abrv, site_abrv).Exec_delete();
+		int len = list.Count();
+		for (int i = 0; i < len; ++i) {
+			Site_specialpagealias_itm itm = (Site_specialpagealias_itm)list.Get_at(i);
+			Insert(site_abrv, itm.Realname(), itm.Aliases());
+		}
+	}
+	private void Insert(byte[] site_abrv, byte[] realname, byte[][] aliases) {
+		stmt_insert.Clear()
+			.Val_bry_as_str(fld_site_abrv			, site_abrv)
+			.Val_bry_as_str(fld_realname			, realname)
+			.Val_bry_as_str(fld_aliases				, Bry_.Add_w_dlm(Byte_ascii.Pipe_bry, aliases))
+			.Exec_insert();
+	}
+}
diff --git a/400_xowa/src/gplx/xowa/wmfs/data/Site_statistic_itm.java b/400_xowa/src/gplx/xowa/wmfs/data/Site_statistic_itm.java
new file mode 100644
index 000000000..9ef256f83
--- /dev/null
+++ b/400_xowa/src/gplx/xowa/wmfs/data/Site_statistic_itm.java
@@ -0,0 +1,42 @@
+/*
+XOWA: the XOWA Offline Wiki Application
+Copyright (C) 2012 gnosygnu@gmail.com
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU Affero General Public License as
+published by the Free Software Foundation, either version 3 of the
+License, or (at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU Affero General Public License for more details.
+
+You should have received a copy of the GNU Affero General Public License
+along with this program.  If not, see .
+*/
+package gplx.xowa.wmfs.data; import gplx.*; import gplx.xowa.*; import gplx.xowa.wmfs.*;
+public class Site_statistic_itm implements To_str_able {
+	public Site_statistic_itm Ctor(long pages, long articles, long edits, long images, long users, long activeusers, long admins, long jobs, long queued_massmessages) {
+		this.pages = pages;
+		this.articles = articles;
+		this.edits = edits;
+		this.images = images;
+		this.users = users;
+		this.activeusers = activeusers;
+		this.admins = admins;
+		this.jobs = jobs;
+		this.queued_massmessages = queued_massmessages;
+		return this;
+	}
+	public long Pages() {return pages;} private long pages;
+	public long Articles() {return articles;} private long articles;
+	public long Edits() {return edits;} private long edits;
+	public long Images() {return images;} private long images;
+	public long Users() {return users;} private long users;
+	public long Activeusers() {return activeusers;} private long activeusers;
+	public long Admins() {return admins;} private long admins;
+	public long Jobs() {return jobs;} private long jobs;
+	public long Queued_massmessages() {return queued_massmessages;} private long queued_massmessages;
+	public String To_str() {return String_.Concat_with_obj("|", pages, articles, edits, images, users, activeusers, admins, queued_massmessages);}
+}
diff --git a/400_xowa/src/gplx/xowa/wmfs/data/Site_statistic_tbl.java b/400_xowa/src/gplx/xowa/wmfs/data/Site_statistic_tbl.java
new file mode 100644
index 000000000..283a62437
--- /dev/null
+++ b/400_xowa/src/gplx/xowa/wmfs/data/Site_statistic_tbl.java
@@ -0,0 +1,87 @@
+/*
+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.wmfs.data; import gplx.*; import gplx.xowa.*; import gplx.xowa.wmfs.*;
+import gplx.dbs.*;
+class Site_statistic_tbl implements Db_tbl {
+	private static final String tbl_name = "site_statistic"; private final Db_meta_fld_list flds = new Db_meta_fld_list();
+	private final String fld_site_abrv, fld_pages, fld_articles, fld_edits, fld_images, fld_users, fld_activeusers, fld_admins, fld_jobs, fld_queued_massmessages;
+	private final Db_conn conn;
+	private Db_stmt stmt_select, stmt_insert, stmt_delete;
+	public Site_statistic_tbl(Db_conn conn) {
+		this.conn = conn;
+		this.fld_site_abrv				= flds.Add_str("site_abrv", 255);
+		this.fld_pages					= flds.Add_long("pages");
+		this.fld_articles				= flds.Add_long("articles");
+		this.fld_edits					= flds.Add_long("edits");
+		this.fld_images					= flds.Add_long("images");
+		this.fld_users					= flds.Add_long("users");
+		this.fld_activeusers			= flds.Add_long("activeusers");
+		this.fld_admins					= flds.Add_long("admins");
+		this.fld_jobs					= flds.Add_long("jobs");
+		this.fld_queued_massmessages	= flds.Add_long("queued_massmessages");
+		conn.Rls_reg(this);
+	}
+	public void Create_tbl() {conn.Ddl_create_tbl(Db_meta_tbl.new_(tbl_name, flds, Db_meta_idx.new_unique_by_name(tbl_name, Db_meta_idx.Bld_idx_name(tbl_name, "main"), fld_site_abrv)));}
+	public void Delete_all() {conn.Stmt_delete(tbl_name, Db_meta_fld.Ary_empty).Exec_delete();}
+	public void Rls() {
+		stmt_select = Db_stmt_.Rls(stmt_select);
+		stmt_insert = Db_stmt_.Rls(stmt_insert);
+		stmt_delete = Db_stmt_.Rls(stmt_delete);
+	}
+	public void Select(byte[] site_abrv, Site_statistic_itm itm) {
+		if (stmt_select == null) stmt_select = conn.Stmt_select(tbl_name, flds, fld_site_abrv);
+		Db_rdr rdr = stmt_select.Clear().Crt_bry_as_str(fld_site_abrv, site_abrv).Exec_select__rls_auto();
+		try {
+			if (rdr.Move_next()) {
+				itm.Ctor
+				( rdr.Read_long(fld_pages)
+				, rdr.Read_long(fld_articles)
+				, rdr.Read_long(fld_edits)
+				, rdr.Read_long(fld_images)
+				, rdr.Read_long(fld_users)
+				, rdr.Read_long(fld_activeusers)
+				, rdr.Read_long(fld_admins)
+				, rdr.Read_long(fld_jobs)
+				, rdr.Read_long(fld_queued_massmessages)
+				);
+			}
+		}
+		finally {rdr.Rls();}
+	}
+	public void Insert(byte[] site_abrv, Site_statistic_itm itm) {
+		if (stmt_delete == null) stmt_delete = conn.Stmt_delete(tbl_name, fld_site_abrv);
+		if (stmt_insert == null) stmt_insert = conn.Stmt_insert(tbl_name, flds);
+		stmt_delete.Clear().Crt_bry_as_str(fld_site_abrv, site_abrv).Exec_delete();
+		Insert(site_abrv, itm.Pages(), itm.Articles(), itm.Edits(), itm.Images(), itm.Users(), itm.Activeusers(), itm.Admins(), itm.Jobs(), itm.Queued_massmessages());
+	}
+	private void Insert(byte[] site_abrv, long pages, long articles, long edits, long images, long users, long activeusers, long admins, long jobs, long queued_massmessages) {
+		if (stmt_insert == null) stmt_insert = conn.Stmt_insert(tbl_name, flds);
+		stmt_insert.Clear()
+			.Val_bry_as_str(fld_site_abrv		, site_abrv)
+			.Val_long(fld_pages					, pages)
+			.Val_long(fld_articles				, articles)
+			.Val_long(fld_edits					, edits)
+			.Val_long(fld_images				, images)
+			.Val_long(fld_users					, users)
+			.Val_long(fld_activeusers			, activeusers)
+			.Val_long(fld_admins				, admins)
+			.Val_long(fld_jobs					, jobs)
+			.Val_long(fld_queued_massmessages	, queued_massmessages)
+			.Exec_insert();
+	}
+}
diff --git a/400_xowa/src/gplx/xowa/wmfs/data/Site_val_tbl.java b/400_xowa/src/gplx/xowa/wmfs/data/Site_val_tbl.java
new file mode 100644
index 000000000..0230d180b
--- /dev/null
+++ b/400_xowa/src/gplx/xowa/wmfs/data/Site_val_tbl.java
@@ -0,0 +1,67 @@
+/*
+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.wmfs.data; import gplx.*; import gplx.xowa.*; import gplx.xowa.wmfs.*;
+import gplx.dbs.*;
+class Site_val_tbl implements Db_tbl {
+	private String tbl_name; private final Db_meta_fld_list flds = new Db_meta_fld_list();
+	private final String fld_site_abrv, fld_val;
+	private final Db_conn conn;
+	private Db_stmt stmt_select, stmt_insert, stmt_delete;
+	public Site_val_tbl(Db_conn conn, String tbl_name) {
+		this.conn = conn;
+		this.tbl_name = tbl_name;
+		this.fld_site_abrv				= flds.Add_str("site_abrv", 255);
+		this.fld_val					= flds.Add_str("val", 255);
+		conn.Rls_reg(this);
+	}
+	public void Create_tbl() {conn.Ddl_create_tbl(Db_meta_tbl.new_(tbl_name, flds));}
+	public void Delete_all() {conn.Stmt_delete(tbl_name, Db_meta_fld.Ary_empty).Exec_delete();}
+	public void Rls() {
+		stmt_select = Db_stmt_.Rls(stmt_select);
+		stmt_insert = Db_stmt_.Rls(stmt_insert);
+		stmt_delete = Db_stmt_.Rls(stmt_delete);
+	}
+	public void Select(byte[] site_abrv, Ordered_hash list) {
+		if (stmt_select == null) stmt_select = conn.Stmt_select(tbl_name, flds, fld_site_abrv);
+		list.Clear();
+		Db_rdr rdr = stmt_select.Clear().Crt_bry_as_str(fld_site_abrv, site_abrv).Exec_select__rls_auto();
+		try {
+			while (rdr.Move_next()) {
+				byte[] val = rdr.Read_bry_by_str(fld_val);
+				list.Add(val, val);
+			}
+		}
+		finally {rdr.Rls();}
+	}
+	public void Insert(byte[] site_abrv, Ordered_hash list) {
+		if (stmt_delete == null) stmt_delete = conn.Stmt_delete(tbl_name, fld_site_abrv);
+		if (stmt_insert == null) stmt_insert = conn.Stmt_insert(tbl_name, flds);
+		stmt_delete.Clear().Crt_bry_as_str(fld_site_abrv, site_abrv).Exec_delete();
+		int len = list.Count();
+		for (int i = 0; i < len; ++i) {
+			byte[] itm = (byte[])list.Get_at(i);
+			Insert(site_abrv, itm);
+		}
+	}
+	private void Insert(byte[] site_abrv, byte[] val) {
+		stmt_insert.Clear()
+			.Val_bry_as_str(fld_site_abrv		, site_abrv)
+			.Val_bry_as_str(fld_val				, val)
+			.Exec_insert();
+	}		
+}
diff --git a/400_xowa/src/gplx/xowa/wmfs/data/Xowmf_defaultoption_tbl.java b/400_xowa/src/gplx/xowa/wmfs/data/Xowmf_defaultoption_tbl.java
deleted file mode 100644
index 22388035f..000000000
--- a/400_xowa/src/gplx/xowa/wmfs/data/Xowmf_defaultoption_tbl.java
+++ /dev/null
@@ -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 .
-*/
-package gplx.xowa.wmfs.data; import gplx.*; import gplx.xowa.*; import gplx.xowa.wmfs.*;
-import gplx.dbs.*;
-class Xowmf_defaultoption_tbl implements RlsAble {
-	private static final String tbl_name = "wmf_defaultoption"; private final Db_meta_fld_list flds = new Db_meta_fld_list();
-	private final String fld_site_id, fld_key, fld_val;
-	private final Db_conn conn;
-	private Db_stmt stmt_insert;
-	public Xowmf_defaultoption_tbl(Db_conn conn) {
-		this.conn = conn;
-		this.fld_site_id				= flds.Add_int("site_id");
-		this.fld_key					= flds.Add_str("key", 255);
-		this.fld_val					= flds.Add_str("val", 255);
-		conn.Rls_reg(this);
-	}
-	public void Create_tbl() {conn.Ddl_create_tbl(Db_meta_tbl.new_(tbl_name, flds, Db_meta_idx.new_unique_by_name(tbl_name, "main", fld_site_id, fld_key)));}
-	public void Delete_all() {conn.Stmt_delete(tbl_name, Db_meta_fld.Ary_empty).Exec_delete();}
-	public void Rls() {
-		stmt_insert = Db_stmt_.Rls(stmt_insert);
-	}
-	public void Insert(int site_id, byte[] key, byte[] val) {
-		if (stmt_insert == null) stmt_insert = conn.Stmt_insert(tbl_name, flds);
-		stmt_insert.Clear()
-			.Val_int(fld_site_id				, site_id)
-			.Val_bry_as_str(fld_key				, key)
-			.Val_bry_as_str(fld_val				, val)
-			.Exec_insert();
-	}		
-}
diff --git a/400_xowa/src/gplx/xowa/wmfs/data/Xowmf_extensions_tbl.java b/400_xowa/src/gplx/xowa/wmfs/data/Xowmf_extensions_tbl.java
deleted file mode 100644
index 1ed91c9a6..000000000
--- a/400_xowa/src/gplx/xowa/wmfs/data/Xowmf_extensions_tbl.java
+++ /dev/null
@@ -1,69 +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 .
-*/
-package gplx.xowa.wmfs.data; import gplx.*; import gplx.xowa.*; import gplx.xowa.wmfs.*;
-import gplx.dbs.*;
-class Xowmf_extensions_tbl implements RlsAble {
-	private static final String tbl_name = "wmf_extensions"; private final Db_meta_fld_list flds = new Db_meta_fld_list();
-	private final String fld_site_id, fld_type, fld_name, fld_descriptionmsg, fld_author, fld_url, fld_version
-	, fld_vcs_system, fld_vcs_version, fld_vcs_url, fld_vcs_date, fld_license_name, fld_license, fld_credits;
-	private final Db_conn conn;
-	private Db_stmt stmt_insert;
-	public Xowmf_extensions_tbl(Db_conn conn) {
-		this.conn = conn;
-		this.fld_site_id				= flds.Add_int("site_id");
-		this.fld_type					= flds.Add_str("type", 255);
-		this.fld_name					= flds.Add_str("name", 255);
-		this.fld_descriptionmsg			= flds.Add_str("descriptionmsg", 255);
-		this.fld_author					= flds.Add_str("author", 255);
-		this.fld_url					= flds.Add_str("url", 255);
-		this.fld_version				= flds.Add_str("version", 255);
-		this.fld_vcs_system				= flds.Add_str("vcs_system", 255);
-		this.fld_vcs_version			= flds.Add_str("vcs_version", 255);
-		this.fld_vcs_url				= flds.Add_str("vcs_url", 255);
-		this.fld_vcs_date				= flds.Add_str("vcs_date", 255);
-		this.fld_license_name			= flds.Add_str("license_name", 255);
-		this.fld_license				= flds.Add_str("license", 255);
-		this.fld_credits				= flds.Add_str("credits", 255);
-		conn.Rls_reg(this);
-	}
-	public void Create_tbl() {conn.Ddl_create_tbl(Db_meta_tbl.new_(tbl_name, flds, Db_meta_idx.new_unique_by_name(tbl_name, "main", fld_site_id)));}
-	public void Delete_all() {conn.Stmt_delete(tbl_name, Db_meta_fld.Ary_empty).Exec_delete();}
-	public void Rls() {
-		stmt_insert = Db_stmt_.Rls(stmt_insert);
-	}
-	public void Insert(int site_id, String type, String name, String descriptionmsg, String author, String url, String version
-		, String vcs_system, String vcs_version, String vcs_url, String vcs_date, String license_name, String license, String credits) {
-		if (stmt_insert == null) stmt_insert = conn.Stmt_insert(tbl_name, flds);
-		stmt_insert.Clear()
-			.Val_int(fld_site_id				, site_id)
-			.Val_str(fld_type					, type)
-			.Val_str(fld_name					, name)
-			.Val_str(fld_descriptionmsg			, descriptionmsg)
-			.Val_str(fld_author					, author)
-			.Val_str(fld_url					, url)
-			.Val_str(fld_version				, version)
-			.Val_str(fld_vcs_system				, vcs_system)
-			.Val_str(fld_vcs_version			, vcs_version)
-			.Val_str(fld_vcs_url				, vcs_url)
-			.Val_str(fld_vcs_date				, vcs_date)
-			.Val_str(fld_license_name			, license_name)
-			.Val_str(fld_license				, license)
-			.Val_str(fld_credits				, credits)
-			.Exec_insert();
-	}
-}
diff --git a/400_xowa/src/gplx/xowa/wmfs/data/Xowmf_general_tbl.java b/400_xowa/src/gplx/xowa/wmfs/data/Xowmf_general_tbl.java
deleted file mode 100644
index 882fb36f7..000000000
--- a/400_xowa/src/gplx/xowa/wmfs/data/Xowmf_general_tbl.java
+++ /dev/null
@@ -1,233 +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 .
-*/
-package gplx.xowa.wmfs.data; import gplx.*; import gplx.xowa.*; import gplx.xowa.wmfs.*;
-import gplx.dbs.*;
-public class Xowmf_general_tbl implements RlsAble {
-	private static final String tbl_name = "wmf_general"; private final Db_meta_fld_list flds = new Db_meta_fld_list();
-	private final String fld_site_id, fld_key, fld_val;
-	private final Db_conn conn;
-	private Db_stmt stmt_insert, stmt_select;
-	public Xowmf_general_tbl(Db_conn conn) {
-		this.conn = conn;
-		this.fld_site_id = flds.Add_int("site_id");
-		this.fld_key = flds.Add_str("prop_key", 255);
-		this.fld_val = flds.Add_str("prop_val", 4096);
-		conn.Rls_reg(this);
-	}
-	public Db_conn Conn() {return conn;}
-	public void Create_tbl() {conn.Ddl_create_tbl(Db_meta_tbl.new_(tbl_name, flds, Db_meta_idx.new_unique_by_name(tbl_name, "main", fld_site_id, fld_key, fld_val)));}
-	public void Rls() {
-		stmt_insert = Db_stmt_.Rls(stmt_insert);
-		stmt_select = Db_stmt_.Rls(stmt_select);
-	}
-	public void Delete_all() {conn.Stmt_delete(tbl_name, Db_meta_fld.Ary_empty).Exec_delete();}
-	public void Insert(int site_id, String key, String val) {
-		if (stmt_insert == null) stmt_insert = conn.Stmt_insert(tbl_name, flds);
-		stmt_insert.Clear().Val_int(fld_site_id, site_id).Val_str(fld_key, key).Val_str(fld_val, val).Exec_insert();
-	}
-	public String Select_val_or_null(int site_id, String key) {
-		if (stmt_select == null) stmt_select = conn.Stmt_select(tbl_name, flds, fld_site_id);
-		Db_rdr rdr = stmt_select.Clear().Crt_int(fld_site_id, site_id).Crt_str(fld_key, key).Exec_select__rls_manual();
-		try {
-			return rdr.Move_next() ? rdr.Read_str(fld_val) : null;
-		}
-		finally {rdr.Rls();}
-	}
-}
-//class Xowmf_general_row {
-//	public String Main_page() {return main_page;} private final String main_page;
-//	public String Base_url() {return base_url;} private final String base_url;
-//	public String Site_name() {return site_name;} private final String site_name;
-//	public String Logo() {return logo;} private final String logo;
-//	public String Generator() {return generator;} private final String generator;
-//	public String Php_version() {return php_version;} private final String php_version;
-//	public String Php_sapi() {return php_sapi;} private final String php_sapi;
-//	public String Hhvm_version() {return hhvm_version;} private final String hhvm_version;
-//	public String Db_type() {return db_type;} private final String db_type;
-//	public String Db_version() {return db_version;} private final String db_version;
-//	public String Image_whitelist_enabled() {return image_whitelist_enabled;} private final String image_whitelist_enabled;
-//	public String Lang_conversion() {return lang_conversion;} private final String lang_conversion;
-//	public String Title_conversion() {return title_conversion;} private final String title_conversion;
-//	public String Link_prefix_charset() {return link_prefix_charset;} private final String link_prefix_charset;
-//	public String Link_prefix() {return link_prefix;} private final String link_prefix;
-//	public String Link_trail() {return link_trail;} private final String link_trail;
-//	public String Legal_title_chars() {return legal_title_chars;} private final String legal_title_chars;
-//	public String Git_hash() {return git_hash;} private final String git_hash;
-//	public String Git_branch() {return git_branch;} private final String git_branch;
-//	public String Case_type() {return case_type;} private final String case_type;
-//	public String Lang() {return lang;} private final String lang;
-//	public String Fallback() {return fallback;} private final String fallback;
-//	public String Fallback_8bit_encoding() {return fallback_8bit_encoding;} private final String fallback_8bit_encoding;
-//	public String Write_api() {return write_api;} private final String write_api;
-//	public String Time_zone() {return time_zone;} private final String time_zone;
-//	public String Time_offset() {return time_offset;} private final String time_offset;
-//	public String Article_path() {return article_path;} private final String article_path;
-//	public String Script_path() {return script_path;} private final String script_path;
-//	public String Script() {return script;} private final String script;
-//	public String Variant_article_path() {return variant_article_path;} private final String variant_article_path;
-//	public String Server() {return server;} private final String server;
-//	public String Server_name() {return server_name;} private final String server_name;
-//	public String Wiki_id() {return wiki_id;} private final String wiki_id;
-//	public String Time() {return time;} private final String time;
-//	public String Miser_mode() {return miser_mode;} private final String miser_mode;
-//	public String Max_upload_size() {return max_upload_size;} private final String max_upload_size;
-//	public String Thumb_limits() {return thumb_limits;} private final String thumb_limits;
-//	public String Image_limits() {return image_limits;} private final String image_limits;
-//	public String Fav_icon() {return fav_icon;} private final String fav_icon;
-//}
-/*
-            "mainpage": "Main Page",
-            "super": "https://en.wikipedia.org/wiki/Main_Page",
-            "sitename": "Wikipedia",
-            "logo": "//upload.wikimedia.org/wikipedia/en/b/bc/Wiki.png",
-            "generator": "MediaWiki 1.26wmf1",
-            "phpversion": "5.6.99-hhvm",
-            "phpsapi": "srv",
-            "hhvmversion": "3.3.1",
-            "dbtype": "mysql",
-            "dbversion": "10.0.16-MariaDB-log",
-            "imagewhitelistenabled": "",
-            "langconversion": "",
-            "titleconversion": "",
-            "linkprefixcharset": "",
-            "linkprefix": "",
-            "linktrail": "/^([a-z]+)(.*)$/sD",
-            "legaltitlechars": " %!\"$&'()*,\\-.\\/0-9:;=?@A-Z\\\\^_`a-z~\\x80-\\xFF+",
-            "git-hash": "155a3c1e83a2fc06f7921600f439771a82c4d50c",
-            "git-branch": "wmf/1.26wmf1",
-            "case": "first-letter",
-            "lang": "en",
-            "fallback": [],
-            "fallback8bitEncoding": "windows-1252",
-            "writeapi": "",
-            "timezone": "UTC",
-            "timeoffset": 0,
-            "articlepath": "/wiki/$1",
-            "scriptpath": "/w",
-            "script": "/w/index.php",
-            "variantarticlepath": false,
-            "server": "//en.wikipedia.org",
-            "servername": "en.wikipedia.org",
-            "wikiid": "enwiki",
-            "time": "2015-04-20T05:21:44Z",
-            "misermode": "",
-            "maxuploadsize": 1048576000,
-            "thumblimits": [
-                120,
-                150,
-                180,
-                200,
-                220,
-                250,
-                300
-            ],
-            "imagelimits": [
-                {
-                    "width": 320,
-                    "height": 240
-                },
-                {
-                    "width": 640,
-                    "height": 480
-                },
-                {
-                    "width": 800,
-                    "height": 600
-                },
-                {
-                    "width": 1024,
-                    "height": 768
-                },
-                {
-                    "width": 1280,
-                    "height": 1024
-                }
-            ],
-            "favicon": "//bits.wikimedia.org/favicon/wikipedia.ico"
-
-
-            "mainpage": "Main Page",
-            "super": "https://en.wikipedia.org/wiki/Main_Page",			
-            "sitename": "Wikipedia",
-            "logo": "//upload.wikimedia.org/wikipedia/en/b/bc/Wiki.png",
-            "linkprefix": "",
-            "linktrail": "/^([a-z]+)(.*)$/sD",
-            "legaltitlechars": " %!\"$&'()*,\\-.\\/0-9:;=?@A-Z\\\\^_`a-z~\\x80-\\xFF+",
-            "case": "first-letter",
-            "lang": "en",
-            "fallback": [],
-            "servername": "en.wikipedia.org",
-            "wikiid": "enwiki",
-		
-            "generator": "MediaWiki 1.26wmf1",
-            "phpversion": "5.6.99-hhvm",
-            "phpsapi": "srv",
-            "hhvmversion": "3.3.1",
-            "dbtype": "mysql",
-            "dbversion": "10.0.16-MariaDB-log",
-            "imagewhitelistenabled": "",
-            "langconversion": "",
-            "titleconversion": "",
-            "linkprefixcharset": "",
-            "git-hash": "155a3c1e83a2fc06f7921600f439771a82c4d50c",
-            "git-branch": "wmf/1.26wmf1",
-            "fallback8bitEncoding": "windows-1252",
-            "writeapi": "",
-            "timezone": "UTC",
-            "timeoffset": 0,
-            "articlepath": "/wiki/$1",
-            "scriptpath": "/w",
-            "script": "/w/index.php",
-            "variantarticlepath": false,
-            "server": "//en.wikipedia.org",
-            "time": "2015-04-20T05:21:44Z",
-            "misermode": "",
-            "maxuploadsize": 1048576000,
-            "thumblimits": [
-                120,
-                150,
-                180,
-                200,
-                220,
-                250,
-                300
-            ],
-            "imagelimits": [
-                {
-                    "width": 320,
-                    "height": 240
-                },
-                {
-                    "width": 640,
-                    "height": 480
-                },
-                {
-                    "width": 800,
-                    "height": 600
-                },
-                {
-                    "width": 1024,
-                    "height": 768
-                },
-                {
-                    "width": 1280,
-                    "height": 1024
-                }
-            ],
-            "favicon": "//bits.wikimedia.org/favicon/wikipedia.ico"
-*/
diff --git a/400_xowa/src/gplx/xowa/wmfs/data/Xowmf_interwikimap_tbl.java b/400_xowa/src/gplx/xowa/wmfs/data/Xowmf_interwikimap_tbl.java
deleted file mode 100644
index e16068442..000000000
--- a/400_xowa/src/gplx/xowa/wmfs/data/Xowmf_interwikimap_tbl.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
-XOWA: the XOWA Offline Wiki Application
-Copyright (C) 2012 gnosygnu@gmail.com
-
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU Affero General Public License as
-published by the Free Software Foundation, either version 3 of the
-License, or (at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU Affero General Public License for more details.
-
-You should have received a copy of the GNU Affero General Public License
-along with this program.  If not, see .
-*/
-package gplx.xowa.wmfs.data; import gplx.*; import gplx.xowa.*; import gplx.xowa.wmfs.*;
-import gplx.dbs.*;
-class Xowmf_interwikimap_tbl implements RlsAble {
-	private static final String tbl_name = "wmf_interwikimap"; private final Db_meta_fld_list flds = new Db_meta_fld_list();
-	private final String fld_site_id, fld_prefix, fld_local, fld_language, fld_localinterwiki, fld_url, fld_protorel;
-	private final Db_conn conn;
-	private Db_stmt stmt_insert;
-	public Xowmf_interwikimap_tbl(Db_conn conn) {
-		this.conn = conn;
-		this.fld_site_id				= flds.Add_int("site_id");
-		this.fld_prefix					= flds.Add_str("prefix", 255);
-		this.fld_local					= flds.Add_str("local", 255);
-		this.fld_language				= flds.Add_str("language", 255);
-		this.fld_localinterwiki			= flds.Add_str("localinterwiki", 255);
-		this.fld_url					= flds.Add_str("url", 255);
-		this.fld_protorel				= flds.Add_str("protorel", 255);
-		conn.Rls_reg(this);
-	}
-	public void Create_tbl() {conn.Ddl_create_tbl(Db_meta_tbl.new_(tbl_name, flds, Db_meta_idx.new_unique_by_name(tbl_name, "main", fld_site_id)));}
-	public void Delete_all() {conn.Stmt_delete(tbl_name, Db_meta_fld.Ary_empty).Exec_delete();}
-	public void Rls() {
-		stmt_insert = Db_stmt_.Rls(stmt_insert);
-	}
-	public void Insert(int site_id, String prefix, String local, String language, String localinterwiki, String url, String protorel) {
-		if (stmt_insert == null) stmt_insert = conn.Stmt_insert(tbl_name, flds);
-		stmt_insert.Clear()
-			.Val_int(fld_site_id				, site_id)
-			.Val_str(fld_prefix					, prefix)
-			.Val_str(fld_local					, local)
-			.Val_str(fld_language				, language)
-			.Val_str(fld_localinterwiki			, localinterwiki)
-			.Val_str(fld_url					, url)
-			.Val_str(fld_protorel				, protorel)
-			.Exec_insert();
-	}
-}
diff --git a/400_xowa/src/gplx/xowa/wmfs/data/Xowmf_json_parser.java b/400_xowa/src/gplx/xowa/wmfs/data/Xowmf_json_parser.java
deleted file mode 100644
index 5b9a74326..000000000
--- a/400_xowa/src/gplx/xowa/wmfs/data/Xowmf_json_parser.java
+++ /dev/null
@@ -1,308 +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 .
-*/
-package gplx.xowa.wmfs.data; import gplx.*; import gplx.xowa.*; import gplx.xowa.wmfs.*;
-import gplx.core.json.*;
-class Xowmf_json_parser {
-	private byte[] src;
-	public void Parse_root(Json_nde root, Xowmf_wiki_data wiki_data) {
-		this.src = root.Doc().Src();
-		int len = root.Len();
-		for (int i = 0; i < len; ++i) {
-			Json_kv sub = root.Get_at_as_kv(i);
-			byte[] sub_key = sub.Key_as_bry();
-			switch (nde_hash.Get_as_int(sub_key)) {
-				case Tid_general			: Parse_kv(Json_nde.cast_(sub.Val()), wiki_data.General_list()); break;
-				case Tid_namespaces			: Parse_namespaces(Json_nde.cast_(sub.Val()), wiki_data.Namespaces_list()); break;
-				case Tid_statistics			: Parse_kv(Json_nde.cast_(sub.Val()), wiki_data.Statistics_list()); break;
-				case Tid_interwikimap		: Parse_interwikimap(Json_ary.cast(sub.Val()), wiki_data.Interwikimap_list()); break;
-				case Tid_namespacealiases	: Parse_namespacealiases(Json_ary.cast(sub.Val()), wiki_data.Namespacealiases_list()); break;
-				case Tid_specialpagealiases	: Parse_specialpagealiases(Json_ary.cast(sub.Val()), wiki_data.Specialpagealiases_list()); break;
-				case Tid_libraries			: Parse_libraries(Json_ary.cast(sub.Val()), wiki_data.Libraries_list()); break;
-				case Tid_extensions			: Parse_extensions(Json_ary.cast(sub.Val()), wiki_data.Extensions_list()); break;
-				case Tid_skins				: Parse_skins(Json_ary.cast(sub.Val()), wiki_data.Skins_list()); break;
-				case Tid_magicwords			: Parse_magicwords(Json_ary.cast(sub.Val()), wiki_data.Magicwords_list()); break;
-				case Tid_functionhooks		: Parse_val(Json_ary.cast(sub.Val()), wiki_data.Functionhooks_list()); break;
-				case Tid_showhooks			: Parse_showhooks(Json_ary.cast(sub.Val()), wiki_data.Showhooks_list()); break;
-				case Tid_extensiontags		: Parse_val(Json_ary.cast(sub.Val()), wiki_data.Extensiontags_list()); break;
-				case Tid_protocols			: Parse_val(Json_ary.cast(sub.Val()), wiki_data.Protocols_list()); break;
-				case Tid_defaultoptions		: Parse_kv(Json_nde.cast_(sub.Val()), wiki_data.Defaultoptions_list()); break;
-				case Tid_languages			: Parse_languages(Json_ary.cast(sub.Val()), wiki_data.Languages_list()); break;
-			}
-		}
-	}
-//		private void Parse_general(Json_nde nde, Ordered_hash list) {}
-	private void Parse_namespaces(Json_nde nde, Ordered_hash list) {}
-//		private void Parse_statistics(Json_nde nde, Ordered_hash list) {}
-	private void Parse_interwikimap(Json_ary ary, Ordered_hash list) {}
-	private void Parse_namespacealiases(Json_ary ary, Ordered_hash list) {
-		int len = ary.Len();
-		for (int i = 0; i < len; ++i) {
-			Json_nde sub = ary.Get_at_as_nde(i);
-			Fail_if_wrong_count(sub, sub.Len(), 2, "namespacealias");
-			byte[] id_bry = sub.Get_bry(Atr_namespacealias_id);
-			int id = Bry_.To_int_or(id_bry, Int_.MaxValue); if (id == Int_.MaxValue) throw Err_.new_("wmf.data", "invalid id for namespacealias", "id", id_bry, "src", Extract(sub));
-			list.Add(id, new Xowmf_namespacealias_itm(id, sub.Get_bry(Atr_namespacealias_alias)));
-		}
-	}
-	private void Parse_specialpagealiases(Json_ary ary, Ordered_hash list) {
-		int len = ary.Len();
-		for (int i = 0; i < len; ++i) {
-			Json_nde sub = ary.Get_at_as_nde(i);
-			Fail_if_wrong_count(sub, sub.Len(), 2, "specialpagealias");
-			byte[] key = sub.Get_bry(Atr_specialpagealias_realname);
-			Json_ary aliases_ary = Json_ary.cast(sub.Get(Atr_specialpagealias_aliases));
-			list.Add(key, new Xowmf_specialpagealias_itm(key, aliases_ary.Xto_bry_ary()));
-		}
-	}
-	private void Parse_libraries(Json_ary ary, Ordered_hash list) {
-		int len = ary.Len();
-		for (int i = 0; i < len; ++i) {
-			Json_nde sub = ary.Get_at_as_nde(i);
-			Fail_if_wrong_count(sub, sub.Len(), 2, "library");
-			byte[] key = sub.Get_bry(Atr_libraries_name);
-			list.Add(key, new Xowmf_library_itm(key, sub.Get_bry(Atr_libraries_version)));
-		}
-	}
-	private void Parse_extensions(Json_ary ary, Ordered_hash list) {}
-	private void Parse_skins(Json_ary ary, Ordered_hash list) {
-		int len = ary.Len();
-		for (int i = 0; i < len; ++i) {
-			Json_nde sub = ary.Get_at_as_nde(i);
-			Fail_if_wrong_count(sub, sub.Len(), 3, "skin");
-			byte[] key = sub.Get_bry(Atr_skins_code);
-			list.Add(key, new Xowmf_skin_itm(key, sub.Get_bry(Atr_skins_dflt), sub.Get_bry(Atr_skins_name)));
-		}
-	}
-	private void Parse_magicwords(Json_ary ary, Ordered_hash list) {}
-//		private void Parse_functionhooks(Json_ary ary, Ordered_hash list) {}
-	private void Parse_showhooks(Json_ary ary, Ordered_hash list) {}
-//		private void Parse_extensiontags(Json_ary ary, Ordered_hash list) {}
-	private void Parse_languages(Json_ary ary, Ordered_hash list) {
-		int len = ary.Len();
-		for (int i = 0; i < len; ++i) {
-			Json_nde sub = ary.Get_at_as_nde(i);
-			Fail_if_wrong_count(sub, sub.Len(), 2, "language");
-			byte[] key = sub.Get_bry(Atr_languages_code);
-			list.Add(key, new Xowmf_language_itm(key, sub.Get_bry(Atr_languages_name)));
-		}
-	}
-	private void Parse_val(Json_ary ary, Ordered_hash list) {
-		int len = ary.Len();
-		for (int i = 0; i < len; ++i) {
-			byte[] val = ary.Get_at(i).Data_bry();
-			list.Add(val, new Xowmf_val_itm(val));
-		}
-	}
-	private void Parse_kv(Json_nde nde, Ordered_hash list) {
-		int len = nde.Len();
-		for (int i = 0; i < len; ++i) {
-			Json_kv sub = nde.Get_at_as_kv(i);
-			byte[] key = sub.Key_as_bry();
-			list.Add(key, new Xowmf_kv_itm(key, sub.Val_as_bry()));
-		}
-	}
-	private byte[] Extract(Json_itm itm) {return Bry_.Mid(src, itm.Src_bgn(), itm.Src_end());}
-	private void Fail_if_wrong_count(Json_itm itm, int expd, int actl, String type) {
-		if (expd != actl) throw Err_.new_("wmf.data", "node does not have expected attribute count", "type", type, "expd", expd, "actl", actl, "src", Extract(itm));
-	}
-	private static final int
-	  Tid_general				=  0
-	, Tid_namespaces			=  1
-	, Tid_statistics			=  2
-	, Tid_interwikimap			=  3
-	, Tid_namespacealiases		=  4
-	, Tid_specialpagealiases	=  5
-	, Tid_libraries				=  6
-	, Tid_extensions			=  7
-	, Tid_skins					=  8
-	, Tid_magicwords			=  9
-	, Tid_functionhooks			= 10
-	, Tid_showhooks				= 11
-	, Tid_extensiontags			= 12
-	, Tid_protocols				= 13
-	, Tid_defaultoptions		= 14
-	, Tid_languages				= 15
-	;
-	private static final byte[]
-	  Nde_general				= Bry_.new_a7("general")
-	, Nde_namespaces			= Bry_.new_a7("namespaces")
-	, Nde_statistics			= Bry_.new_a7("statistics")
-	, Nde_interwikimap			= Bry_.new_a7("interwikimap")
-	, Nde_namespacealiases		= Bry_.new_a7("namespacealiases")
-	, Nde_specialpagealiases	= Bry_.new_a7("specialpagealiases")
-	, Nde_libraries				= Bry_.new_a7("libraries")
-	, Nde_extensions			= Bry_.new_a7("extensions")
-	, Nde_skins					= Bry_.new_a7("skins")
-	, Nde_magicwords			= Bry_.new_a7("magicwords")
-	, Nde_functionhooks			= Bry_.new_a7("functionhooks")
-	, Nde_showhooks				= Bry_.new_a7("showhooks")
-	, Nde_extensiontags			= Bry_.new_a7("extensiontags")
-	, Nde_protocols				= Bry_.new_a7("protocols")
-	, Nde_defaultoptions		= Bry_.new_a7("defaultoptions")
-	, Nde_languages				= Bry_.new_a7("languages")
-	, Atr_namespacealias_id	= Bry_.new_a7("id"), Atr_namespacealias_alias = Bry_.new_a7("*")
-	, Atr_specialpagealias_realname	= Bry_.new_a7("realname"), Atr_specialpagealias_aliases = Bry_.new_a7("aliases")
-	, Atr_libraries_name	= Bry_.new_a7("name"), Atr_libraries_version = Bry_.new_a7("version")
-	, Atr_skins_code		= Bry_.new_a7("code"), Atr_skins_dflt = Bry_.new_a7("de"+"fault"), Atr_skins_name = Bry_.new_a7("*")
-	, Atr_languages_code	= Bry_.new_a7("code"), Atr_languages_name = Bry_.new_a7("*")
-	;
-	private static final Hash_adp_bry nde_hash = Hash_adp_bry.cs()
-	.Add_bry_int(Nde_general				, Tid_general)
-	.Add_bry_int(Nde_namespaces				, Tid_namespaces)
-	.Add_bry_int(Nde_statistics				, Tid_statistics)
-	.Add_bry_int(Nde_interwikimap			, Tid_interwikimap)
-	.Add_bry_int(Nde_namespacealiases		, Tid_namespacealiases)
-	.Add_bry_int(Nde_specialpagealiases		, Tid_specialpagealiases)
-	.Add_bry_int(Nde_libraries				, Tid_libraries)
-	.Add_bry_int(Nde_extensions				, Tid_extensions)
-	.Add_bry_int(Nde_skins					, Tid_skins)
-	.Add_bry_int(Nde_magicwords				, Tid_magicwords)
-	.Add_bry_int(Nde_functionhooks			, Tid_functionhooks)
-	.Add_bry_int(Nde_showhooks				, Tid_showhooks)
-	.Add_bry_int(Nde_extensiontags			, Tid_extensiontags)
-	.Add_bry_int(Nde_protocols				, Tid_protocols)
-	.Add_bry_int(Nde_defaultoptions			, Tid_defaultoptions)
-	.Add_bry_int(Nde_languages				, Tid_languages)
-	;
-}
-/*
-"general": {
-    "mainpage": "Main Page",
-    "super": "https://en.wikipedia.org/wiki/Main_Page",
-    "sitename": "Wikipedia",
-    "logo": "//en.wikipedia.org/static/images/project-logos/enwiki.png",
-    "generator": "MediaWiki 1.26wmf6",
-    "phpversion": "5.6.99-hhvm",
-    "phpsapi": "srv",
-    "hhvmversion": "3.6.1",
-    "dbtype": "mysql",
-    "dbversion": "10.0.16-MariaDB-log",
-    "imagewhitelistenabled": "",
-    "langconversion": "",
-    "titleconversion": "",
-    "linkprefixcharset": "",
-    "linkprefix": "",
-    "linktrail": "/^([a-z]+)(.*)$/sD",
-    "legaltitlechars": " %!\"$&'()*,\\-.\\/0-9:;=?@A-Z\\\\^_`a-z~\\x80-\\xFF+",
-    "invalidusernamechars": "@:",
-    "git-hash": "84635a11fc9b739d84d9d108565d53d4ff4342b9",
-    "git-branch": "wmf/1.26wmf6",
-    "case": "first-letter",
-    "lang": "en",
-    "fallback": [],
-    "fallback8bitEncoding": "windows-1252",
-    "writeapi": "",
-    "timezone": "UTC",
-    "timeoffset": 0,
-    "articlepath": "/wiki/$1",
-    "scriptpath": "/w",
-    "script": "/w/index.php",
-    "variantarticlepath": false,
-    "server": "//en.wikipedia.org",
-    "servername": "en.wikipedia.org",
-    "wikiid": "enwiki",
-    "time": "2015-05-25T10:52:53Z",
-    "misermode": "",
-    "maxuploadsize": 1048576000,
-    "thumblimits": [
-        120,
-        150,
-        180,
-        200,
-        220,
-        250,
-        300
-    ],
-    "imagelimits": [
-        {
-            "width": 320,
-            "height": 240
-        },
-        {
-            "width": 640,
-            "height": 480
-        },
-        {
-            "width": 800,
-            "height": 600
-        },
-        {
-            "width": 1024,
-            "height": 768
-        },
-        {
-            "width": 1280,
-            "height": 1024
-        }
-    ],
-    "favicon": "//en.wikipedia.org/static/favicon/wikipedia.ico"
-},
-
-"namespaces": {
-"-2": {
-    "id": -2,
-    "case": "first-letter",
-    "canonical": "Media",
-    "*": "Media"
-},
-interwikimap
-{
-    "prefix": "zh-classical",
-    "local": "",
-    "language": "\u6587\u8a00",
-    "url": "https://zh-classical.wikipedia.org/wiki/$1",
-    "protorel": ""
-},
-
-extension
-{
-    "type": "other",
-    "name": "CirrusSearch",
-    "descriptionmsg": "cirrussearch-desc",
-    "author": "Nik Everett, Chad Horohoe",
-    "url": "https://www.mediawiki.org/wiki/Extension:CirrusSearch",
-    "version": "0.2",
-    "vcs-system": "git",
-    "vcs-version": "841147fa90ceafc64fb1573d6a6c010b04df2f64",
-    "vcs-url": "https://git.wikimedia.org/tree/mediawiki%2Fextensions%2FCirrusSearch.git/841147fa90ceafc64fb1573d6a6c010b04df2f64",
-    "vcs-date": "2015-05-13T16:18:35Z",
-    "license-name": "GPL-2.0+",
-    "license": "/wiki/Special:Version/License/CirrusSearch",
-    "credits": "/wiki/Special:Version/Credits/CirrusSearch"
-},
-		
-magicword
-{
-    "name": "revisionday",
-    "aliases": [
-        "REVISIONDAY"
-    ],
-    "case-sensitive": ""
-},
-
-showhook
-{
-    "name": "APIGetAllowedParams",
-    "subscribers": [
-        "FlaggedRevsApiHooks::addApiRevisionParams",
-        "ConfirmEditHooks::APIGetAllowedParams",
-        "CentralAuthHooks::onAPIGetAllowedParams",
-        "ApiParseExtender::onAPIGetAllowedParams"
-    ]
-},
-*/
diff --git a/400_xowa/src/gplx/xowa/wmfs/data/Xowmf_json_tbl.java b/400_xowa/src/gplx/xowa/wmfs/data/Xowmf_json_tbl.java
deleted file mode 100644
index 37f6eb5c3..000000000
--- a/400_xowa/src/gplx/xowa/wmfs/data/Xowmf_json_tbl.java
+++ /dev/null
@@ -1,51 +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 .
-*/
-package gplx.xowa.wmfs.data; import gplx.*; import gplx.xowa.*; import gplx.xowa.wmfs.*;
-import gplx.dbs.*;
-public class Xowmf_json_tbl implements RlsAble {
-	private static final String tbl_name = "wmf_json"; private final Db_meta_fld_list flds = new Db_meta_fld_list();
-	private final String fld_site_id, fld_text, fld_date;
-	private final Db_conn conn;
-	private Db_stmt stmt_insert, stmt_select;
-	public Xowmf_json_tbl(Db_conn conn) {
-		this.conn = conn;
-		this.fld_site_id = flds.Add_int("site_id");
-		this.fld_date = flds.Add_str("json_date", 20);
-		this.fld_text = flds.Add_text("json_text");
-		conn.Rls_reg(this);
-	}
-	public Db_conn Conn() {return conn;}
-	public void Create_tbl() {conn.Ddl_create_tbl(Db_meta_tbl.new_(tbl_name, flds, Db_meta_idx.new_unique_by_name(tbl_name, "main", fld_site_id)));}
-	public void Rls() {
-		stmt_insert = Db_stmt_.Rls(stmt_insert);
-		stmt_select = Db_stmt_.Rls(stmt_select);
-	}
-	public void Delete_all() {conn.Stmt_delete(tbl_name, Db_meta_fld.Ary_empty).Exec_delete();}
-	public void Insert(int site_id, DateAdp date, byte[] text) {
-		if (stmt_insert == null) stmt_insert = conn.Stmt_insert(tbl_name, flds);
-		stmt_insert.Clear().Val_int(fld_site_id, site_id).Val_str(fld_date, date.XtoStr_gplx()).Val_bry_as_str(fld_text, text).Exec_insert();
-	}
-	public String Select_text_or_null(int site_id) {
-		if (stmt_select == null) stmt_select = conn.Stmt_select(tbl_name, flds, fld_site_id);
-		Db_rdr rdr = stmt_select.Clear().Crt_int(fld_site_id, site_id).Exec_select__rls_manual();
-		try {
-			return rdr.Move_next() ? rdr.Read_str(fld_text) : null;
-		}
-		finally {rdr.Rls();}
-	}
-}
diff --git a/400_xowa/src/gplx/xowa/wmfs/data/Xowmf_language_tbl.java b/400_xowa/src/gplx/xowa/wmfs/data/Xowmf_language_tbl.java
deleted file mode 100644
index 145758ecd..000000000
--- a/400_xowa/src/gplx/xowa/wmfs/data/Xowmf_language_tbl.java
+++ /dev/null
@@ -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 .
-*/
-package gplx.xowa.wmfs.data; import gplx.*; import gplx.xowa.*; import gplx.xowa.wmfs.*;
-import gplx.dbs.*;
-class Xowmf_language_tbl implements RlsAble {
-	private static final String tbl_name = "wmf_language"; private final Db_meta_fld_list flds = new Db_meta_fld_list();
-	private final String fld_site_id, fld_code, fld_name;
-	private final Db_conn conn;
-	private Db_stmt stmt_insert;
-	public Xowmf_language_tbl(Db_conn conn) {
-		this.conn = conn;
-		this.fld_site_id				= flds.Add_int("site_id");
-		this.fld_code					= flds.Add_str("code", 255);
-		this.fld_name					= flds.Add_str("name", 255);
-		conn.Rls_reg(this);
-	}
-	public void Create_tbl() {conn.Ddl_create_tbl(Db_meta_tbl.new_(tbl_name, flds, Db_meta_idx.new_unique_by_name(tbl_name, "main", fld_site_id, fld_code)));}
-	public void Delete_all() {conn.Stmt_delete(tbl_name, Db_meta_fld.Ary_empty).Exec_delete();}
-	public void Rls() {
-		stmt_insert = Db_stmt_.Rls(stmt_insert);
-	}
-	public void Insert(int site_id, byte[] code, byte[] name) {
-		if (stmt_insert == null) stmt_insert = conn.Stmt_insert(tbl_name, flds);
-		stmt_insert.Clear()
-			.Val_int(fld_site_id				, site_id)
-			.Val_bry_as_str(fld_code			, code)
-			.Val_bry_as_str(fld_name			, name)
-			.Exec_insert();
-	}		
-}
diff --git a/400_xowa/src/gplx/xowa/wmfs/data/Xowmf_ns_tbl.java b/400_xowa/src/gplx/xowa/wmfs/data/Xowmf_ns_tbl.java
deleted file mode 100644
index 8d86ab013..000000000
--- a/400_xowa/src/gplx/xowa/wmfs/data/Xowmf_ns_tbl.java
+++ /dev/null
@@ -1,64 +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 .
-*/
-package gplx.xowa.wmfs.data; import gplx.*; import gplx.xowa.*; import gplx.xowa.wmfs.*;
-import gplx.dbs.*;
-public class Xowmf_ns_tbl implements RlsAble {
-	private static final String tbl_name = "wmf_ns"; private final Db_meta_fld_list flds = new Db_meta_fld_list();
-	private final String fld_site_id, fld_id, fld_case, fld_subpages, fld_content, fld_name, fld_canonical;
-	private final Db_conn conn;
-	private Db_stmt stmt_insert, stmt_select;
-	public Xowmf_ns_tbl(Db_conn conn) {
-		this.conn = conn;
-		this.fld_site_id	= flds.Add_int("site_id");
-		this.fld_id			= flds.Add_int("ns_id");
-		this.fld_case		= flds.Add_byte("ns_case");
-		this.fld_subpages	= flds.Add_byte("ns_subpages");
-		this.fld_content	= flds.Add_byte("ns_content");
-		this.fld_name		= flds.Add_str("ns_name", 255);
-		this.fld_canonical	= flds.Add_str("ns_canonical", 255);
-		conn.Rls_reg(this);
-	}
-	public void Create_tbl() {conn.Ddl_create_tbl(Db_meta_tbl.new_(tbl_name, flds, Db_meta_idx.new_unique_by_name(tbl_name, "main", fld_site_id, fld_id)));}
-	public void Delete_all() {conn.Stmt_delete(tbl_name, Db_meta_fld.Ary_empty).Exec_delete();}
-	public void Rls() {
-		stmt_insert = Db_stmt_.Rls(stmt_insert);
-		stmt_select = Db_stmt_.Rls(stmt_select);
-	}
-	public void Insert(int site_id, int id, byte case_match, boolean subpages, boolean content, byte[] name, byte[] canonical) {
-		if (stmt_insert == null) stmt_insert = conn.Stmt_insert(tbl_name, flds);
-		stmt_insert.Clear()
-			.Val_int(fld_site_id, site_id).Val_int(fld_id, id).Val_byte(fld_case, case_match).Val_bool_as_byte(fld_subpages, subpages).Val_bool_as_byte(fld_content, content)
-			.Val_bry_as_str(fld_name, name).Val_bry_as_str(fld_canonical, canonical).Exec_insert();
-	}
-	public void Select_all(Xow_ns_mgr rv, int site_id) {
-		if (stmt_select == null) stmt_select = conn.Stmt_select(tbl_name, flds, fld_site_id);
-		Db_rdr rdr = stmt_select.Clear().Crt_int(fld_site_id, site_id).Exec_select__rls_manual();
-		rv.Clear();
-		try {
-			while (rdr.Move_next()) {
-				rv.Add_new
-				( rdr.Read_int			(fld_id)
-				, rdr.Read_bry_by_str	(fld_name)
-				, rdr.Read_byte			(fld_case)
-				, Bool_.N);
-			}
-		}
-		finally {rdr.Rls();}
-		rv.Init();			
-	}
-}
diff --git a/400_xowa/src/gplx/xowa/wmfs/data/Xowmf_protocol_tbl.java b/400_xowa/src/gplx/xowa/wmfs/data/Xowmf_protocol_tbl.java
deleted file mode 100644
index 025b61686..000000000
--- a/400_xowa/src/gplx/xowa/wmfs/data/Xowmf_protocol_tbl.java
+++ /dev/null
@@ -1,43 +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 .
-*/
-package gplx.xowa.wmfs.data; import gplx.*; import gplx.xowa.*; import gplx.xowa.wmfs.*;
-import gplx.dbs.*;
-class Xowmf_protocol_tbl implements RlsAble {
-	private static final String tbl_name = "wmf_protocol"; private final Db_meta_fld_list flds = new Db_meta_fld_list();
-	private final String fld_site_id, fld_val;
-	private final Db_conn conn;
-	private Db_stmt stmt_insert;
-	public Xowmf_protocol_tbl(Db_conn conn) {
-		this.conn = conn;
-		this.fld_site_id				= flds.Add_int("site_id");
-		this.fld_val					= flds.Add_str("val", 255);
-		conn.Rls_reg(this);
-	}
-	public void Create_tbl() {conn.Ddl_create_tbl(Db_meta_tbl.new_(tbl_name, flds));}
-	public void Delete_all() {conn.Stmt_delete(tbl_name, Db_meta_fld.Ary_empty).Exec_delete();}
-	public void Rls() {
-		stmt_insert = Db_stmt_.Rls(stmt_insert);
-	}
-	public void Insert(int site_id, byte[] val) {
-		if (stmt_insert == null) stmt_insert = conn.Stmt_insert(tbl_name, flds);
-		stmt_insert.Clear()
-			.Val_int(fld_site_id				, site_id)
-			.Val_bry_as_str(fld_val				, val)
-			.Exec_insert();
-	}		
-}
diff --git a/400_xowa/src/gplx/xowa/wmfs/data/Xowmf_site_tbl.java b/400_xowa/src/gplx/xowa/wmfs/data/Xowmf_site_tbl.java
deleted file mode 100644
index 007f33429..000000000
--- a/400_xowa/src/gplx/xowa/wmfs/data/Xowmf_site_tbl.java
+++ /dev/null
@@ -1,60 +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 .
-*/
-package gplx.xowa.wmfs.data; import gplx.*; import gplx.xowa.*; import gplx.xowa.wmfs.*;
-import gplx.dbs.*;
-public class Xowmf_site_tbl implements RlsAble {
-	private static final String tbl_name = "wmf_site"; private final Db_meta_fld_list flds = new Db_meta_fld_list();
-	private final String fld_id, fld_name;
-	private final Db_conn conn;
-	private Db_stmt stmt_insert, stmt_select;
-	public Xowmf_site_tbl(Db_conn conn) {
-		this.conn = conn;
-		this.fld_id = flds.Add_int_pkey("site_id");
-		this.fld_name = flds.Add_str("site_name", 255);
-		conn.Rls_reg(this);
-	}
-	public Db_conn Conn() {return conn;}
-	public void Create_tbl() {conn.Ddl_create_tbl(Db_meta_tbl.new_(tbl_name, flds, Db_meta_idx.new_unique_by_name(tbl_name, "name", fld_name)));}
-	public void Rls() {
-		stmt_insert = Db_stmt_.Rls(stmt_insert);
-		stmt_select = Db_stmt_.Rls(stmt_select);
-	}
-	public void Delete_all() {conn.Stmt_delete(tbl_name, Db_meta_fld.Ary_empty).Exec_delete();}
-	public void Insert(int id, String name) {
-		if (stmt_insert == null) stmt_insert = conn.Stmt_insert(tbl_name, flds);
-		stmt_insert.Clear().Val_int(fld_id, id).Val_str(fld_name, name).Exec_insert();
-	}
-	public int Select_id(String name) {
-		if (stmt_select == null) stmt_select = conn.Stmt_select(tbl_name, flds, fld_name);
-		Db_rdr rdr = stmt_select.Clear().Crt_str(fld_name, name).Exec_select__rls_manual();
-		try {
-			return rdr.Move_next() ? rdr.Read_int(fld_id) : -1;
-		}
-		finally {rdr.Rls();}
-	}
-	public static Db_conn Get_conn_or_new(Io_url xowa_root) {
-		Io_url wmf_data_url = xowa_root.GenSubFil_nest("bin", "any", "xowa", "cfg", "wiki", "wmf_data.sqlite3");
-		Db_conn_bldr_data conn_data = Db_conn_bldr.I.Get_or_new(wmf_data_url);
-		Db_conn conn = conn_data.Conn();
-		if (conn_data.Created()) {
-			Xowmf_site_tbl site_tbl = new Xowmf_site_tbl(conn); site_tbl.Create_tbl();
-			Xowmf_ns_tbl itm_tbl = new Xowmf_ns_tbl(conn); itm_tbl.Create_tbl();
-		}
-		return conn;
-	}
-}
diff --git a/400_xowa/src/gplx/xowa/wmfs/data/Xowmf_specialpagealias_tbl.java b/400_xowa/src/gplx/xowa/wmfs/data/Xowmf_specialpagealias_tbl.java
deleted file mode 100644
index 337b4404b..000000000
--- a/400_xowa/src/gplx/xowa/wmfs/data/Xowmf_specialpagealias_tbl.java
+++ /dev/null
@@ -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 .
-*/
-package gplx.xowa.wmfs.data; import gplx.*; import gplx.xowa.*; import gplx.xowa.wmfs.*;
-import gplx.dbs.*;
-class Xowmf_specialpagealias_tbl implements RlsAble {
-	private static final String tbl_name = "wmf_specialpagealiases"; private final Db_meta_fld_list flds = new Db_meta_fld_list();
-	private final String fld_site_id, fld_realname, fld_aliases;
-	private final Db_conn conn;
-	private Db_stmt stmt_insert;
-	public Xowmf_specialpagealias_tbl(Db_conn conn) {
-		this.conn = conn;
-		this.fld_site_id				= flds.Add_int("site_id");
-		this.fld_realname				= flds.Add_str("realname", 255);
-		this.fld_aliases				= flds.Add_str("aliases", 2048);
-		conn.Rls_reg(this);
-	}
-	public void Create_tbl() {conn.Ddl_create_tbl(Db_meta_tbl.new_(tbl_name, flds, Db_meta_idx.new_unique_by_name(tbl_name, "main", fld_site_id)));}
-	public void Delete_all() {conn.Stmt_delete(tbl_name, Db_meta_fld.Ary_empty).Exec_delete();}
-	public void Rls() {
-		stmt_insert = Db_stmt_.Rls(stmt_insert);
-	}
-	public void Insert(int site_id, String realname, String[] aliases) {
-		if (stmt_insert == null) stmt_insert = conn.Stmt_insert(tbl_name, flds);
-		stmt_insert.Clear()
-			.Val_int(fld_site_id				, site_id)
-			.Val_str(fld_realname				, realname)
-			.Val_str(fld_aliases				, String_.Concat_with_str("|", aliases))
-			.Exec_insert();
-	}
-}
diff --git a/400_xowa/src/gplx/xowa/wmfs/data/Xowmf_statistics_tbl.java b/400_xowa/src/gplx/xowa/wmfs/data/Xowmf_statistics_tbl.java
deleted file mode 100644
index 0d169a2b6..000000000
--- a/400_xowa/src/gplx/xowa/wmfs/data/Xowmf_statistics_tbl.java
+++ /dev/null
@@ -1,57 +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 .
-*/
-package gplx.xowa.wmfs.data; import gplx.*; import gplx.xowa.*; import gplx.xowa.wmfs.*;
-import gplx.dbs.*;
-class Xowmf_statistics_tbl implements RlsAble {
-	private static final String tbl_name = "wmf_statistics"; private final Db_meta_fld_list flds = new Db_meta_fld_list();
-	private final String fld_site_id, fld_pages, fld_articles, fld_edits, fld_images, fld_users, fld_activeusers, fld_admins, fld_queued_massmessages;
-	private final Db_conn conn;
-	private Db_stmt stmt_insert;
-	public Xowmf_statistics_tbl(Db_conn conn) {
-		this.conn = conn;
-		this.fld_site_id				= flds.Add_int("site_id");
-		this.fld_pages					= flds.Add_long("pages");
-		this.fld_articles				= flds.Add_long("articles");
-		this.fld_edits					= flds.Add_long("edits");
-		this.fld_images					= flds.Add_long("images");
-		this.fld_users					= flds.Add_long("users");
-		this.fld_activeusers			= flds.Add_long("activeusers");
-		this.fld_admins					= flds.Add_long("admins");
-		this.fld_queued_massmessages	= flds.Add_long("queued_massmessages");
-		conn.Rls_reg(this);
-	}
-	public void Create_tbl() {conn.Ddl_create_tbl(Db_meta_tbl.new_(tbl_name, flds, Db_meta_idx.new_unique_by_name(tbl_name, "main", fld_site_id)));}
-	public void Delete_all() {conn.Stmt_delete(tbl_name, Db_meta_fld.Ary_empty).Exec_delete();}
-	public void Rls() {
-		stmt_insert = Db_stmt_.Rls(stmt_insert);
-	}
-	public void Insert(int site_id, long pages, long articles, long edits, long images, long users, long activeusers, long admins, long queued_massmessages) {
-		if (stmt_insert == null) stmt_insert = conn.Stmt_insert(tbl_name, flds);
-		stmt_insert.Clear()
-			.Val_int(fld_site_id				, site_id)
-			.Val_long(fld_pages					, pages)
-			.Val_long(fld_articles				, articles)
-			.Val_long(fld_edits					, edits)
-			.Val_long(fld_images				, images)
-			.Val_long(fld_users					, users)
-			.Val_long(fld_activeusers			, activeusers)
-			.Val_long(fld_admins				, admins)
-			.Val_long(fld_queued_massmessages	, queued_massmessages)
-			.Exec_insert();
-	}
-}
diff --git a/400_xowa/src/gplx/xowa/wmfs/data/Xowmf_wiki_data.java b/400_xowa/src/gplx/xowa/wmfs/data/Xowmf_wiki_data.java
deleted file mode 100644
index d912a3135..000000000
--- a/400_xowa/src/gplx/xowa/wmfs/data/Xowmf_wiki_data.java
+++ /dev/null
@@ -1,36 +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 .
-*/
-package gplx.xowa.wmfs.data; import gplx.*; import gplx.xowa.*; import gplx.xowa.wmfs.*;
-class Xowmf_wiki_data {
-	public Ordered_hash		General_list() {return general_list;}	private final Ordered_hash general_list = Ordered_hash_.new_bry_();
-	public Ordered_hash		Namespaces_list() {return namespaces_list;}	private final Ordered_hash namespaces_list = Ordered_hash_.new_bry_();
-	public Ordered_hash		Statistics_list() {return statistics_list;}	private final Ordered_hash statistics_list = Ordered_hash_.new_bry_();
-	public Ordered_hash		Interwikimap_list() {return interwikimap_list;}	private final Ordered_hash interwikimap_list = Ordered_hash_.new_bry_();
-	public Ordered_hash		Namespacealiases_list() {return namespacealiases_list;}	private final Ordered_hash namespacealiases_list = Ordered_hash_.new_bry_();
-	public Ordered_hash		Specialpagealiases_list() {return specialpagealiases_list;}	private final Ordered_hash specialpagealiases_list = Ordered_hash_.new_bry_();
-	public Ordered_hash		Libraries_list() {return libraries_list;}	private final Ordered_hash libraries_list = Ordered_hash_.new_bry_();
-	public Ordered_hash		Extensions_list() {return extensions_list;}	private final Ordered_hash extensions_list = Ordered_hash_.new_bry_();
-	public Ordered_hash		Skins_list() {return skins_list;}	private final Ordered_hash skins_list = Ordered_hash_.new_bry_();
-	public Ordered_hash		Magicwords_list() {return magicwords_list;}	private final Ordered_hash magicwords_list = Ordered_hash_.new_bry_();
-	public Ordered_hash		Functionhooks_list() {return functionhooks_list;}	private final Ordered_hash functionhooks_list = Ordered_hash_.new_bry_();
-	public Ordered_hash		Showhooks_list() {return showhooks_list;}	private final Ordered_hash showhooks_list = Ordered_hash_.new_bry_();
-	public Ordered_hash		Extensiontags_list() {return extensiontags_list;}	private final Ordered_hash extensiontags_list = Ordered_hash_.new_bry_();
-	public Ordered_hash		Protocols_list() {return protocols_list;} private final Ordered_hash protocols_list = Ordered_hash_.new_bry_();
-	public Ordered_hash		Defaultoptions_list() {return defaultoptions_list;} private final Ordered_hash defaultoptions_list = Ordered_hash_.new_bry_();
-	public Ordered_hash		Languages_list() {return languages_list;} private final Ordered_hash languages_list = Ordered_hash_.new_bry_();
-}
diff --git a/400_xowa/src/gplx/xowa/xtns/pfuncs/exprs/Pfunc_expr_ops.java b/400_xowa/src/gplx/xowa/xtns/pfuncs/exprs/Pfunc_expr_ops.java
index 5ac20da66..046cac186 100644
--- a/400_xowa/src/gplx/xowa/xtns/pfuncs/exprs/Pfunc_expr_ops.java
+++ b/400_xowa/src/gplx/xowa/xtns/pfuncs/exprs/Pfunc_expr_ops.java
@@ -35,7 +35,7 @@ class Ws_tkn implements Expr_tkn {
 	public int Tid() {return Expr_tkn_.Tid_space;}
 	public byte[] Val_ary() {return val_ary;} private byte[] val_ary;
 	public String Val_str() {return val_str;} private String val_str;
-	public Ws_tkn(byte b) {this.val_ary = new byte[] {b}; this.val_str = Char_.XtoStr(Char_.XbyInt(b));}
+	public Ws_tkn(byte b) {this.val_ary = new byte[] {b}; this.val_str = Char_.To_str(Char_.XbyInt(b));}
 }
 class Paren_bgn_tkn implements Expr_tkn, Func_tkn {
 	public int Tid() {return Expr_tkn_.Tid_paren_lhs;}
diff --git a/400_xowa/src/gplx/xowa/xtns/pfuncs/exprs/Pfunc_expr_shunter.java b/400_xowa/src/gplx/xowa/xtns/pfuncs/exprs/Pfunc_expr_shunter.java
index f8a62f776..3641793fd 100644
--- a/400_xowa/src/gplx/xowa/xtns/pfuncs/exprs/Pfunc_expr_shunter.java
+++ b/400_xowa/src/gplx/xowa/xtns/pfuncs/exprs/Pfunc_expr_shunter.java
@@ -158,7 +158,7 @@ public class Pfunc_expr_shunter {
 		return val_stack.Len() == 0 ? Null_rslt : val_stack.Pop();	// HACK: for [[List of Premiers of South Australia by time in office]] and {{#expr:\n{{age in days
 	}
 	private static Btrie_fast_mgr expression_() {
-		Btrie_fast_mgr rv = Btrie_fast_mgr.ci_ascii_();	// NOTE:ci.ascii:MW_const.en; math and expressions
+		Btrie_fast_mgr rv = Btrie_fast_mgr.ci_a7();	// NOTE:ci.ascii:MW_const.en; math and expressions
 		Trie_add(rv, new Ws_tkn(Byte_ascii.Space));
 		Trie_add(rv, new Ws_tkn(Byte_ascii.Tab));
 		Trie_add(rv, new Ws_tkn(Byte_ascii.Nl));
@@ -166,7 +166,7 @@ public class Pfunc_expr_shunter {
 		Trie_add(rv, Paren_end_tkn._);
 		Trie_add(rv, new Func_tkn_plus("+"));
 		Trie_add(rv, new Func_tkn_minus("-"));
-		Trie_add(rv, new Func_tkn_minus(Char_.XtoStr((char)8722)));
+		Trie_add(rv, new Func_tkn_minus(Char_.To_str((char)8722)));
 		Trie_add(rv, new Func_tkn_times("*"));
 		Trie_add(rv, new Func_tkn_divide("/"));
 		Trie_add(rv, new Func_tkn_divide("div"));
diff --git a/400_xowa/src/gplx/xowa/xtns/pfuncs/times/Pft_fmt_itm_.java b/400_xowa/src/gplx/xowa/xtns/pfuncs/times/Pft_fmt_itm_.java
index 7e25e3f39..d1c868648 100644
--- a/400_xowa/src/gplx/xowa/xtns/pfuncs/times/Pft_fmt_itm_.java
+++ b/400_xowa/src/gplx/xowa/xtns/pfuncs/times/Pft_fmt_itm_.java
@@ -108,7 +108,7 @@ public class Pft_fmt_itm_ {
 	, Hijiri_day_idx			= new Pft_fmt_itm_hijiri_day_idx()
 	, Hijiri_month_name			= new Pft_fmt_itm_hijiri_month_name()
 	;
-	public static final Btrie_fast_mgr Regy = Btrie_fast_mgr.cs_()
+	public static final Btrie_fast_mgr Regy = Btrie_fast_mgr.cs()
 	.Add(Byte_ascii.Ltr_Y		, Pft_fmt_itm_.Year_len4)				// 2012
 	.Add(Byte_ascii.Ltr_y		, Pft_fmt_itm_.Year_len2)				// 12
 	.Add(Byte_ascii.Ltr_L		, Pft_fmt_itm_.Year_isLeap)				// 1,0
diff --git a/400_xowa/src/gplx/xowa/xtns/pfuncs/times/Pft_func_formatdate.java b/400_xowa/src/gplx/xowa/xtns/pfuncs/times/Pft_func_formatdate.java
index efabccb1c..ae1124d29 100644
--- a/400_xowa/src/gplx/xowa/xtns/pfuncs/times/Pft_func_formatdate.java
+++ b/400_xowa/src/gplx/xowa/xtns/pfuncs/times/Pft_func_formatdate.java
@@ -39,7 +39,7 @@ public class Pft_func_formatdate extends Pf_func_base {
 	}
 	public static Pft_func_formatdate_bldr Date_bldr() {return date_bldr;} private static Pft_func_formatdate_bldr date_bldr = new Pft_func_formatdate_bldr();		
 	private static final Pft_fmt_itm[] Fmt_itms_default = new Pft_fmt_itm[0];
-	private static final Btrie_fast_mgr trie = Btrie_fast_mgr.cs_()
+	private static final Btrie_fast_mgr trie = Btrie_fast_mgr.cs()
 		.Add("dmy"			, new Pft_fmt_itm[] {Pft_fmt_itm_.Day_int, Pft_fmt_itm_.Byte_space, Pft_fmt_itm_.Month_name, Pft_fmt_itm_.Byte_space, Pft_fmt_itm_.Year_len4})
 		.Add("mdy"			, new Pft_fmt_itm[] {Pft_fmt_itm_.Month_name, Pft_fmt_itm_.Byte_space, Pft_fmt_itm_.Day_int, Pft_fmt_itm_.Byte_comma, Pft_fmt_itm_.Byte_space, Pft_fmt_itm_.Year_len4})
 		.Add("ymd"			, new Pft_fmt_itm[] {Pft_fmt_itm_.Year_len4, Pft_fmt_itm_.Byte_space, Pft_fmt_itm_.Month_name, Pft_fmt_itm_.Byte_space, Pft_fmt_itm_.Day_int})
diff --git a/400_xowa/src/gplx/xowa/xtns/pfuncs/ttls/Pfunc_anchorencode.java b/400_xowa/src/gplx/xowa/xtns/pfuncs/ttls/Pfunc_anchorencode.java
index 8652a51dc..b1294b678 100644
--- a/400_xowa/src/gplx/xowa/xtns/pfuncs/ttls/Pfunc_anchorencode.java
+++ b/400_xowa/src/gplx/xowa/xtns/pfuncs/ttls/Pfunc_anchorencode.java
@@ -98,7 +98,7 @@ public class Pfunc_anchorencode extends Pf_func_base {	// EX: {{anchorencode:a b
 			Tkn(src, xnde.Subs_get(i), xnde, i, tmp_bfr);
 		}		
 	}
-	private static Btrie_fast_mgr encode_trie = Btrie_fast_mgr.cs_();
+	private static Btrie_fast_mgr encode_trie = Btrie_fast_mgr.cs();
 	private static Xop_ctx anchor_ctx;  static Xop_tkn_mkr anchor_tkn_mkr;
 	private static Xop_parser anchor_parser; 
 }
diff --git a/400_xowa/src/gplx/xowa/xtns/pfuncs/ttls/Pfunc_filepath.java b/400_xowa/src/gplx/xowa/xtns/pfuncs/ttls/Pfunc_filepath.java
index b3e3f30bd..75b37b2a3 100644
--- a/400_xowa/src/gplx/xowa/xtns/pfuncs/ttls/Pfunc_filepath.java
+++ b/400_xowa/src/gplx/xowa/xtns/pfuncs/ttls/Pfunc_filepath.java
@@ -39,7 +39,7 @@ public class Pfunc_filepath extends Pf_func_base {
 		if (tmp_rslt.Repo_idx() == Byte_.Max_value_127) return;
 		Xof_repo_itm trg_repo = wiki.File_mgr().Repo_mgr().Repos_get_at(tmp_rslt.Repo_idx()).Trg();
 		xfer_itm.Orig_ttl_and_redirect_(ttl_bry, Bry_.Empty);	// redirect is empty b/c Get_page does all redirect lookups
-		byte[] url = url_bldr.Init_for_trg_html(Xof_repo_itm_.Mode_orig, trg_repo, ttl_bry, xfer_itm.Orig_ttl_md5(), xfer_itm.Orig_ext(), Xof_img_size.Size_null_deprecated, Xof_lnki_time.Null, Xof_lnki_page.Null).Xto_bry();
+		byte[] url = url_bldr.Init_for_trg_html(Xof_repo_itm_.Mode_orig, trg_repo, ttl_bry, xfer_itm.Orig_ttl_md5(), xfer_itm.Orig_ext(), Xof_img_size.Size__neg1, Xof_lnki_time.Null, Xof_lnki_page.Null).Xto_bry();
 		bfr.Add(url);
 	}
 	private static final Xof_xfer_itm xfer_itm = new Xof_xfer_itm();
diff --git a/400_xowa/src/gplx/xowa/xtns/pfuncs/ttls/Pfunc_rel2abs.java b/400_xowa/src/gplx/xowa/xtns/pfuncs/ttls/Pfunc_rel2abs.java
index 53709455f..df2738809 100644
--- a/400_xowa/src/gplx/xowa/xtns/pfuncs/ttls/Pfunc_rel2abs.java
+++ b/400_xowa/src/gplx/xowa/xtns/pfuncs/ttls/Pfunc_rel2abs.java
@@ -21,7 +21,7 @@ public class Pfunc_rel2abs extends Pf_func_base {
 	@Override public boolean Func_require_colon_arg() {return true;}
 	private static final byte[] Ary_dot_slash = Bry_.new_a7("./"), Ary_dot_dot = Bry_.new_a7(".."), Ary_dot_dot_slash = Bry_.new_a7("../");
 	private static void qry_bgns_with_init() {
-		qry_bgns_with = Btrie_fast_mgr.cs_();
+		qry_bgns_with = Btrie_fast_mgr.cs();
 		qry_bgns_with.Add(Byte_ascii.Slash, Int_obj_ref.new_(Id_slash));
 		qry_bgns_with.Add(Byte_ascii.Dot, Int_obj_ref.new_(Id_dot));
 		qry_bgns_with.Add(Ary_dot_slash, Int_obj_ref.new_(Id_dot_slash));
diff --git a/400_xowa/src/gplx/xowa/xtns/scores/Score_xnde.java b/400_xowa/src/gplx/xowa/xtns/scores/Score_xnde.java
index 9c27a5232..ba501ed30 100644
--- a/400_xowa/src/gplx/xowa/xtns/scores/Score_xnde.java
+++ b/400_xowa/src/gplx/xowa/xtns/scores/Score_xnde.java
@@ -69,7 +69,7 @@ public class Score_xnde implements Xox_xnde, Xop_xnde_atr_parser, Xoh_cmd_itm {
 		tmp_bfr.Add(code).Add_byte_pipe().Add_int_bool(lang_is_abc).Add_byte_pipe().Add_int_bool(code_is_raw);
 		sha1 = gplx.security.HashAlgo_.Sha1.Calc_hash_bry(tmp_bfr.To_bry_and_rls()); // NOTE: MW transforms to base32; for now, keep sha1 as raw
 		sha1_prefix = String_.new_a7(sha1, 0, 8);
-		output_dir = app.Fsys_mgr().File_dir().GenSubDir_nest(wiki.Domain_str(), "lilypond", Char_.XtoStr(sha1[0]), Char_.XtoStr(sha1[1]), String_.new_a7(sha1));	// NOTE: MW also adds an extra level for 8-len; EX: /.../sha1_32_len/sha1_8_len/
+		output_dir = app.Fsys_mgr().File_dir().GenSubDir_nest(wiki.Domain_str(), "lilypond", Char_.To_str(sha1[0]), Char_.To_str(sha1[1]), String_.new_a7(sha1));	// NOTE: MW also adds an extra level for 8-len; EX: /.../sha1_32_len/sha1_8_len/
 		png_file = output_dir.GenSubFil(sha1_prefix + ".png");
 		aud_file = output_dir.GenSubFil(sha1_prefix + ".midi");
 		hcmd_id = "xowa_score_" + Int_.Xto_str(page.Html_cmd_mgr().Count());
diff --git a/400_xowa/src/gplx/xowa/xtns/scribunto/Scrib_invoke_func.java b/400_xowa/src/gplx/xowa/xtns/scribunto/Scrib_invoke_func.java
index 7c7f049c1..ed4ca31c8 100644
--- a/400_xowa/src/gplx/xowa/xtns/scribunto/Scrib_invoke_func.java
+++ b/400_xowa/src/gplx/xowa/xtns/scribunto/Scrib_invoke_func.java
@@ -58,13 +58,13 @@ public class Scrib_invoke_func extends Pf_func_base {
 		}
 		catch (Exception e) {
 			Error(bfr, wiki.Msg_mgr(), e);
-			bfr.Add(Html_tag_.Comm_bgn).Add_str(Err_.Message_lang(e)).Add(Html_tag_.Comm_end);
-			String invoke_error = String_.Replace(Err_.Message_gplx_log(e), "\n", "");	// NOTE: replace \n as error may have excerpt which will have \n
+			Err err = Err_.cast_or_make(e);
+			bfr.Add(Html_tag_.Comm_bgn).Add_str(err.To_str__full()).Add(Html_tag_.Comm_end);
 			Scrib_err_filter_mgr err_filter_mgr = invoke_wkr == null ? null : invoke_wkr.Err_filter_mgr();
-			if (	err_filter_mgr == null																		// no err_filter_mgr defined;
-				||	err_filter_mgr.Count_eq_0()																	// err_filter_mgr exists, but no definitions
-				||	!err_filter_mgr.Match(String_.new_u8(mod_name), String_.new_u8(fnc_name), invoke_error))	// err_filter_mgr has defintion and it doesn't match current; print warn; DATE:2015-07-24					
-				ctx.App().Usr_dlg().Warn_many("", "", "invoke failed: ~{0} ~{1} ~{2}", ctx.Cur_page().Ttl().Raw(), String_.new_u8(src, self.Src_bgn(), self.Src_end()), String_.Replace(Err_.Message_gplx_log(e), "\n", "\t"));
+			if (	err_filter_mgr == null																				// no err_filter_mgr defined;
+				||	err_filter_mgr.Count_eq_0(	)																		// err_filter_mgr exists, but no definitions
+				||	!err_filter_mgr.Match(String_.new_u8(mod_name), String_.new_u8(fnc_name), err.To_str__msg_only()))	// NOTE: must be To_str__msg_only; err_filter_mgr has defintion and it doesn't match current; print warn; DATE:2015-07-24
+				ctx.App().Usr_dlg().Warn_many("", "", "invoke failed: ~{0} ~{1} ~{2}", ctx.Cur_page().Ttl().Raw(), String_.new_u8(src, self.Src_bgn(), self.Src_end()), err.To_str__log(), "\n", "\t");
 			Scrib_core.Core_invalidate_when_page_changes();	// NOTE: invalidate core when page changes, not for rest of page, else page with many errors will be very slow due to multiple invalidations; PAGE:th.d:all; DATE:2014-10-03
 		}
 	}
diff --git a/400_xowa/src/gplx/xowa/xtns/scribunto/errs/Gfo_fld_owner.java b/400_xowa/src/gplx/xowa/xtns/scribunto/errs/Gfo_fld_owner.java
index c4d4ae2c9..11a4ebfce 100644
--- a/400_xowa/src/gplx/xowa/xtns/scribunto/errs/Gfo_fld_owner.java
+++ b/400_xowa/src/gplx/xowa/xtns/scribunto/errs/Gfo_fld_owner.java
@@ -59,7 +59,7 @@ class Gfo_fld_crt implements Criteria {
 	}
 	public void				Val_from_args(Hash_adp args) {throw Err_.new_unimplemented();}
 	public void				Val_as_obj_(Object v) {throw Err_.new_unimplemented();}
-	public String XtoStr() {return String_.Concat(Byte_.Xto_str(fld_idx), " ", crt.XtoStr());}
+	public String To_str() {return String_.Concat(Byte_.Xto_str(fld_idx), " ", crt.To_str());}
 	public static Gfo_fld_crt new_(byte fld_idx, Criteria crt) {
 		Gfo_fld_crt rv = new Gfo_fld_crt();
 		rv.fld_idx = fld_idx; rv.crt = crt;
diff --git a/400_xowa/src/gplx/xowa/xtns/scribunto/libs/Scrib_lib_mw.java b/400_xowa/src/gplx/xowa/xtns/scribunto/libs/Scrib_lib_mw.java
index 04523ac10..2084092dd 100644
--- a/400_xowa/src/gplx/xowa/xtns/scribunto/libs/Scrib_lib_mw.java
+++ b/400_xowa/src/gplx/xowa/xtns/scribunto/libs/Scrib_lib_mw.java
@@ -48,43 +48,46 @@ public class Scrib_lib_mw implements Scrib_lib {
 			case Proc_loadPackage:							return LoadPackage(args, rslt);
 			case Proc_loadPHPLibrary:						return LoadPHPLibrary(args, rslt);
 			case Proc_frameExists:							return FrameExists(args, rslt);
-			case Proc_parentFrameExists:					return ParentFrameExists(args, rslt);
+			case Proc_newChildFrame:						return NewChildFrame(args, rslt);
 			case Proc_getExpandedArgument:					return GetExpandedArgument(args, rslt);
 			case Proc_getAllExpandedArguments:				return GetAllExpandedArguments(args, rslt);
 			case Proc_expandTemplate:						return ExpandTemplate(args, rslt);
-			case Proc_preprocess:							return Preprocess(args, rslt);
 			case Proc_callParserFunction:					return CallParserFunction(args, rslt);
+			case Proc_preprocess:							return Preprocess(args, rslt);
 			case Proc_incrementExpensiveFunctionCount:		return IncrementExpensiveFunctionCount(args, rslt);
 			case Proc_isSubsting:							return IsSubsting(args, rslt);
-			case Proc_newChildFrame:						return NewChildFrame(args, rslt);
 			case Proc_getFrameTitle:						return GetFrameTitle(args, rslt);
 			case Proc_setTTL:								return SetTTL(args, rslt);
+			case Proc_parentFrameExists:					return ParentFrameExists(args, rslt);	// DEPRECATED:not in Scribunto anymore
 			default: throw Err_.new_unhandled(key);
 		}
 	}
 	public static final int
 	  Proc_loadPackage = 0, Proc_loadPHPLibrary = 1
-	, Proc_frameExists = 2, Proc_parentFrameExists = 3
+	, Proc_frameExists = 2, Proc_newChildFrame = 3
 	, Proc_getExpandedArgument = 4, Proc_getAllExpandedArguments = 5
-	, Proc_expandTemplate = 6, Proc_preprocess = 7, Proc_callParserFunction = 8
+	, Proc_expandTemplate = 6, Proc_callParserFunction = 7, Proc_preprocess = 8
 	, Proc_incrementExpensiveFunctionCount = 9, Proc_isSubsting = 10
-	, Proc_newChildFrame = 11, Proc_getFrameTitle = 12, Proc_setTTL = 13
+	, Proc_getFrameTitle = 11, Proc_setTTL = 12
+	, Proc_parentFrameExists = 13
 	;
 	public static final String 
 	  Invk_loadPackage = "loadPackage", Invk_loadPHPLibrary = "loadPHPLibrary"
-	, Invk_frameExists = "frameExists", Invk_parentFrameExists = "parentFrameExists"
+	, Invk_frameExists = "frameExists", Invk_newChildFrame = "newChildFrame"
 	, Invk_getExpandedArgument = "getExpandedArgument", Invk_getAllExpandedArguments = "getAllExpandedArguments"
-	, Invk_expandTemplate = "expandTemplate", Invk_preprocess = "preprocess", Invk_callParserFunction = "callParserFunction"
+	, Invk_expandTemplate = "expandTemplate", Invk_callParserFunction = "callParserFunction", Invk_preprocess = "preprocess"
 	, Invk_incrementExpensiveFunctionCount = "incrementExpensiveFunctionCount", Invk_isSubsting = "isSubsting"
-	, Invk_newChildFrame = "newChildFrame", Invk_getFrameTitle = "getFrameTitle", Invk_setTTL = "setTTL"
+	, Invk_getFrameTitle = "getFrameTitle", Invk_setTTL = "setTTL"
+	, Invk_parentFrameExists = "parentFrameExists"
 	;
 	private static final String[] Proc_names = String_.Ary
 	( Invk_loadPackage, Invk_loadPHPLibrary
-	, Invk_frameExists, Invk_parentFrameExists
+	, Invk_frameExists, Invk_newChildFrame
 	, Invk_getExpandedArgument, Invk_getAllExpandedArguments
-	, Invk_expandTemplate, Invk_preprocess, Invk_callParserFunction
+	, Invk_expandTemplate, Invk_callParserFunction, Invk_preprocess
 	, Invk_incrementExpensiveFunctionCount, Invk_isSubsting
-	, Invk_newChildFrame, Invk_getFrameTitle, Invk_setTTL
+	, Invk_getFrameTitle, Invk_setTTL
+	, Invk_parentFrameExists
 	);
 	public boolean LoadPackage(Scrib_proc_args args, Scrib_proc_rslt rslt) {
 		String mod_name = args.Pull_str(0);
diff --git a/400_xowa/src/gplx/xowa/xtns/scribunto/libs/Scrib_lib_text.java b/400_xowa/src/gplx/xowa/xtns/scribunto/libs/Scrib_lib_text.java
index 7545eec4c..661dafb32 100644
--- a/400_xowa/src/gplx/xowa/xtns/scribunto/libs/Scrib_lib_text.java
+++ b/400_xowa/src/gplx/xowa/xtns/scribunto/libs/Scrib_lib_text.java
@@ -16,7 +16,6 @@ You should have received a copy of the GNU Affero General Public License
 along with this program.  If not, see .
 */
 package gplx.xowa.xtns.scribunto.libs; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; import gplx.xowa.xtns.scribunto.*;
-import gplx.core.net.*;
 public class Scrib_lib_text implements Scrib_lib {
 	public Scrib_lib_text(Scrib_core core) {this.core = core;} private Scrib_core core;
 	public Scrib_lua_mod Mod() {return mod;} private Scrib_lua_mod mod;
@@ -35,12 +34,15 @@ public class Scrib_lib_text implements Scrib_lib {
 			case Proc_killMarkers:						return KillMarkers(args, rslt);
 			case Proc_getEntityTable:					return GetEntityTable(args, rslt);
 			case Proc_init_text_for_wiki:				return Init_text_for_wiki(args, rslt);
+			case Proc_jsonEncode:						return JsonEncode(args, rslt);
+			case Proc_jsonDecode:						return JsonDecode(args, rslt);
 			default: throw Err_.new_unhandled(key);
 		}
 	}
-	private static final int Proc_unstrip = 0, Proc_unstripNoWiki = 1, Proc_killMarkers = 2, Proc_getEntityTable = 3, Proc_init_text_for_wiki = 4;
-	public static final String Invk_unstrip = "unstrip", Invk_unstripNoWiki = "unstripNoWiki", Invk_killMarkers = "killMarkers", Invk_getEntityTable = "getEntityTable", Invk_init_text_for_wiki = "init_text_for_wiki";
-	private static final String[] Proc_names = String_.Ary(Invk_unstrip, Invk_unstripNoWiki, Invk_killMarkers, Invk_getEntityTable, Invk_init_text_for_wiki);
+	private static final int Proc_unstrip = 0, Proc_unstripNoWiki = 1, Proc_killMarkers = 2, Proc_getEntityTable = 3, Proc_init_text_for_wiki = 4, Proc_jsonEncode = 5, Proc_jsonDecode = 6;
+	public static final String Invk_unstrip = "unstrip", Invk_unstripNoWiki = "unstripNoWiki", Invk_killMarkers = "killMarkers", Invk_getEntityTable = "getEntityTable"
+	, Invk_init_text_for_wiki = "init_text_for_wiki", Invk_jsonEncode = "jsonEncode", Invk_jsonDecode = "jsonDecode";
+	private static final String[] Proc_names = String_.Ary(Invk_unstrip, Invk_unstripNoWiki, Invk_killMarkers, Invk_getEntityTable, Invk_init_text_for_wiki, Invk_jsonEncode, Invk_jsonDecode);
 	public boolean Unstrip(Scrib_proc_args args, Scrib_proc_rslt rslt)			{return rslt.Init_obj(args.Pull_str(0));}	// NOTE: XOWA does not use MediaWiki strip markers; just return original; DATE:2015-01-20
 	public boolean UnstripNoWiki(Scrib_proc_args args, Scrib_proc_rslt rslt)	{return rslt.Init_obj(args.Pull_str(0));}	// NOTE: XOWA does not use MediaWiki strip markers; just return original; DATE:2015-01-20
 	public boolean KillMarkers(Scrib_proc_args args, Scrib_proc_rslt rslt)		{return rslt.Init_obj(args.Pull_str(0));}	// NOTE: XOWA does not use MediaWiki strip markers; just return original; DATE:2015-01-20
@@ -48,6 +50,21 @@ public class Scrib_lib_text implements Scrib_lib {
 		if (Html_entity_ == null) Html_entity_ = Scrib_lib_text_html_entities.new_();
 		return rslt.Init_obj(Html_entity_);
 	}	private static KeyVal[] Html_entity_;
+	public boolean JsonEncode(Scrib_proc_args args, Scrib_proc_rslt rslt) {
+		throw Err_.new_unimplemented();
+//			KeyVal[] kv_ary = args.Pull_kv_ary(0);
+//			int flags = args.Cast_int_or(1, 0);
+//			if (!(flags & Scrib_lib_text__json_util.Flag__preserve_keys)) {	// && is_array( $value )
+//				text = Scrib_lib_text__json_util.Reindex_arrays(text, true);
+//			}
+//			byte[] rv = Scrib_lib_text__json_util.Encode(kv_ary, flags && Scrib_lib_text__json_util.Flag__pretty, Scrib_lib_text__json_util.Skip__all);
+//			if (rv == null) throw Err_.new_("scribunto",  "mw.text.jsonEncode: Unable to encode value");
+//			return rslt.Init_obj(rv);
+	}
+	public boolean JsonDecode(Scrib_proc_args args, Scrib_proc_rslt rslt) {
+		throw Err_.new_unimplemented();
+//			return false;
+	}
 	public void Notify_wiki_changed() {if (notify_wiki_changed_fnc != null) core.Interpreter().CallFunction(notify_wiki_changed_fnc.Id(), KeyVal_.Ary_empty);}
 	public boolean Init_text_for_wiki(Scrib_proc_args args, Scrib_proc_rslt rslt) {
 		Xow_msg_mgr msg_mgr = core.Wiki().Msg_mgr();
@@ -62,51 +79,18 @@ public class Scrib_lib_text implements Scrib_lib {
 		return String_.new_u8(msg_mgr.Val_by_key_obj(Bry_.new_u8(msg_key)));
 	}
 }
-class Scrib_lib_text_ {
-	public static KeyVal[] Init_nowiki_protocols(Xowe_wiki wiki) {
-		Bry_bfr bfr = wiki.Utl__bfr_mkr().Get_b128();
-		Ordered_hash protocols = Gfo_protocol_itm.Regy;
-		int len = protocols.Count();
-		List_adp rv = List_adp_.new_();
-		for (int i = 0; i < len; i++) {
-			Gfo_protocol_itm itm = (Gfo_protocol_itm)protocols.Get_at(i);
-			if (itm.Text_ends_w_colon()) {	// To convert the protocol into a case-insensitive Lua pattern, we need to replace letters with a character class like [Xx] and insert a '%' before various punctuation.
-				KeyVal kv = Init_nowiki_protocols_itm(bfr, itm);
-				rv.Add(kv);
-			}
-		}
-		bfr.Mkr_rls();
-		return (KeyVal[])rv.To_ary(KeyVal.class);
+class Scrib_lib_text__json_util {
+	public static KeyVal[] Reindex_arrays(KeyVal[] kv_ary, boolean is_encoding) {
+		return kv_ary;
 	}
-	private static KeyVal Init_nowiki_protocols_itm(Bry_bfr bfr, Gfo_protocol_itm itm) {
-		byte[] key = itm.Key_wo_colon_bry();
-		int end = key.length - 1;	// -1 to ignore final colon
-		for (int i = 0; i < end; i++) {
-			byte b = key[i];
-			switch (b) {
-				case Byte_ascii.Ltr_A: case Byte_ascii.Ltr_B: case Byte_ascii.Ltr_C: case Byte_ascii.Ltr_D: case Byte_ascii.Ltr_E:
-				case Byte_ascii.Ltr_F: case Byte_ascii.Ltr_G: case Byte_ascii.Ltr_H: case Byte_ascii.Ltr_I: case Byte_ascii.Ltr_J:
-				case Byte_ascii.Ltr_K: case Byte_ascii.Ltr_L: case Byte_ascii.Ltr_M: case Byte_ascii.Ltr_N: case Byte_ascii.Ltr_O:
-				case Byte_ascii.Ltr_P: case Byte_ascii.Ltr_Q: case Byte_ascii.Ltr_R: case Byte_ascii.Ltr_S: case Byte_ascii.Ltr_T:
-				case Byte_ascii.Ltr_U: case Byte_ascii.Ltr_V: case Byte_ascii.Ltr_W: case Byte_ascii.Ltr_X: case Byte_ascii.Ltr_Y: case Byte_ascii.Ltr_Z:
-					bfr.Add_byte(Byte_ascii.Brack_bgn).Add_byte(b).Add_byte(Byte_ascii.Case_lower(b)).Add_byte(Byte_ascii.Brack_end);	// [Aa]
-					break;
-				case Byte_ascii.Ltr_a: case Byte_ascii.Ltr_b: case Byte_ascii.Ltr_c: case Byte_ascii.Ltr_d: case Byte_ascii.Ltr_e:
-				case Byte_ascii.Ltr_f: case Byte_ascii.Ltr_g: case Byte_ascii.Ltr_h: case Byte_ascii.Ltr_i: case Byte_ascii.Ltr_j:
-				case Byte_ascii.Ltr_k: case Byte_ascii.Ltr_l: case Byte_ascii.Ltr_m: case Byte_ascii.Ltr_n: case Byte_ascii.Ltr_o:
-				case Byte_ascii.Ltr_p: case Byte_ascii.Ltr_q: case Byte_ascii.Ltr_r: case Byte_ascii.Ltr_s: case Byte_ascii.Ltr_t:
-				case Byte_ascii.Ltr_u: case Byte_ascii.Ltr_v: case Byte_ascii.Ltr_w: case Byte_ascii.Ltr_x: case Byte_ascii.Ltr_y: case Byte_ascii.Ltr_z:
-					bfr.Add_byte(Byte_ascii.Brack_bgn).Add_byte(Byte_ascii.Case_upper(b)).Add_byte(b).Add_byte(Byte_ascii.Brack_end);	// [Aa]
-					break;
-				case Byte_ascii.Paren_bgn: case Byte_ascii.Paren_end: case Byte_ascii.Pow: case Byte_ascii.Dollar: case Byte_ascii.Percent: case Byte_ascii.Dot:
-				case Byte_ascii.Brack_bgn: case Byte_ascii.Brack_end: case Byte_ascii.Star: case Byte_ascii.Plus: case Byte_ascii.Question: case Byte_ascii.Dash:
-					bfr.Add_byte(Byte_ascii.Percent).Add_byte(b);	// regex is '/([a-zA-Z])|([()^$%.\[\]*+?-])/'
-					break;
-				default:	// ignore
-					break;
-			}
-		}
-		bfr.Add(Colon_encoded);
-		return KeyVal_.new_(itm.Key_wo_colon_str(), bfr.Xto_str_and_clear());
-	}	private static final byte[] Colon_encoded = Bry_.new_a7(":");
+	public static final int
+	  Flag__preserve_keys	= 1
+	, Flag__try_fixing		= 2
+	, Flag__pretty			= 4
+	;
+	public static final int
+	  Skip__utf8	= 1
+	, Skip__xml		= 2
+	, Skip__all		= 3
+	;
 }
diff --git a/400_xowa/src/gplx/xowa/xtns/scribunto/libs/Scrib_lib_text_.java b/400_xowa/src/gplx/xowa/xtns/scribunto/libs/Scrib_lib_text_.java
new file mode 100644
index 000000000..f66b0aa45
--- /dev/null
+++ b/400_xowa/src/gplx/xowa/xtns/scribunto/libs/Scrib_lib_text_.java
@@ -0,0 +1,67 @@
+/*
+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.xtns.scribunto.libs; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; import gplx.xowa.xtns.scribunto.*;
+import gplx.core.net.*;
+class Scrib_lib_text_ {
+	public static KeyVal[] Init_nowiki_protocols(Xowe_wiki wiki) {
+		Bry_bfr bfr = wiki.Utl__bfr_mkr().Get_b128();
+		Ordered_hash protocols = Gfo_protocol_itm.Regy;
+		int len = protocols.Count();
+		List_adp rv = List_adp_.new_();
+		for (int i = 0; i < len; i++) {
+			Gfo_protocol_itm itm = (Gfo_protocol_itm)protocols.Get_at(i);
+			if (itm.Text_ends_w_colon()) {	// To convert the protocol into a case-insensitive Lua pattern, we need to replace letters with a character class like [Xx] and insert a '%' before various punctuation.
+				KeyVal kv = Init_nowiki_protocols_itm(bfr, itm);
+				rv.Add(kv);
+			}
+		}
+		bfr.Mkr_rls();
+		return (KeyVal[])rv.To_ary(KeyVal.class);
+	}
+	private static KeyVal Init_nowiki_protocols_itm(Bry_bfr bfr, Gfo_protocol_itm itm) {
+		byte[] key = itm.Key_wo_colon_bry();
+		int end = key.length - 1;	// -1 to ignore final colon
+		for (int i = 0; i < end; i++) {
+			byte b = key[i];
+			switch (b) {
+				case Byte_ascii.Ltr_A: case Byte_ascii.Ltr_B: case Byte_ascii.Ltr_C: case Byte_ascii.Ltr_D: case Byte_ascii.Ltr_E:
+				case Byte_ascii.Ltr_F: case Byte_ascii.Ltr_G: case Byte_ascii.Ltr_H: case Byte_ascii.Ltr_I: case Byte_ascii.Ltr_J:
+				case Byte_ascii.Ltr_K: case Byte_ascii.Ltr_L: case Byte_ascii.Ltr_M: case Byte_ascii.Ltr_N: case Byte_ascii.Ltr_O:
+				case Byte_ascii.Ltr_P: case Byte_ascii.Ltr_Q: case Byte_ascii.Ltr_R: case Byte_ascii.Ltr_S: case Byte_ascii.Ltr_T:
+				case Byte_ascii.Ltr_U: case Byte_ascii.Ltr_V: case Byte_ascii.Ltr_W: case Byte_ascii.Ltr_X: case Byte_ascii.Ltr_Y: case Byte_ascii.Ltr_Z:
+					bfr.Add_byte(Byte_ascii.Brack_bgn).Add_byte(b).Add_byte(Byte_ascii.Case_lower(b)).Add_byte(Byte_ascii.Brack_end);	// [Aa]
+					break;
+				case Byte_ascii.Ltr_a: case Byte_ascii.Ltr_b: case Byte_ascii.Ltr_c: case Byte_ascii.Ltr_d: case Byte_ascii.Ltr_e:
+				case Byte_ascii.Ltr_f: case Byte_ascii.Ltr_g: case Byte_ascii.Ltr_h: case Byte_ascii.Ltr_i: case Byte_ascii.Ltr_j:
+				case Byte_ascii.Ltr_k: case Byte_ascii.Ltr_l: case Byte_ascii.Ltr_m: case Byte_ascii.Ltr_n: case Byte_ascii.Ltr_o:
+				case Byte_ascii.Ltr_p: case Byte_ascii.Ltr_q: case Byte_ascii.Ltr_r: case Byte_ascii.Ltr_s: case Byte_ascii.Ltr_t:
+				case Byte_ascii.Ltr_u: case Byte_ascii.Ltr_v: case Byte_ascii.Ltr_w: case Byte_ascii.Ltr_x: case Byte_ascii.Ltr_y: case Byte_ascii.Ltr_z:
+					bfr.Add_byte(Byte_ascii.Brack_bgn).Add_byte(Byte_ascii.Case_upper(b)).Add_byte(b).Add_byte(Byte_ascii.Brack_end);	// [Aa]
+					break;
+				case Byte_ascii.Paren_bgn: case Byte_ascii.Paren_end: case Byte_ascii.Pow: case Byte_ascii.Dollar: case Byte_ascii.Percent: case Byte_ascii.Dot:
+				case Byte_ascii.Brack_bgn: case Byte_ascii.Brack_end: case Byte_ascii.Star: case Byte_ascii.Plus: case Byte_ascii.Question: case Byte_ascii.Dash:
+					bfr.Add_byte(Byte_ascii.Percent).Add_byte(b);	// regex is '/([a-zA-Z])|([()^$%.\[\]*+?-])/'
+					break;
+				default:	// ignore
+					break;
+			}
+		}
+		bfr.Add(Colon_encoded);
+		return KeyVal_.new_(itm.Key_wo_colon_str(), bfr.Xto_str_and_clear());
+	}	private static final byte[] Colon_encoded = Bry_.new_a7(":");
+}
diff --git a/400_xowa/src/gplx/xowa/xtns/wdatas/Wdata_prop_val_visitor.java b/400_xowa/src/gplx/xowa/xtns/wdatas/Wdata_prop_val_visitor.java
index 423fdea47..bdecf7128 100644
--- a/400_xowa/src/gplx/xowa/xtns/wdatas/Wdata_prop_val_visitor.java
+++ b/400_xowa/src/gplx/xowa/xtns/wdatas/Wdata_prop_val_visitor.java
@@ -16,13 +16,17 @@ You should have received a copy of the GNU Affero General Public License
 along with this program.  If not, see .
 */
 package gplx.xowa.xtns.wdatas; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*;
-import gplx.xowa.xtns.wdatas.core.*;
+import gplx.xowa.xtns.wdatas.core.*; import gplx.xowa.xtns.wdatas.hwtrs.*;
 class Wdata_prop_val_visitor implements Wdata_claim_visitor {
 	private Wdata_wiki_mgr wdata_mgr; private Xoae_app app; private Bry_bfr bfr; private byte[] lang_key;
+	private final Bry_bfr tmp_time_bfr = Bry_bfr.reset_(255); private final Bry_fmtr tmp_time_fmtr = Bry_fmtr.new_();
+	private Wdata_hwtr_msgs msgs;
 	public Wdata_prop_val_visitor(Xoae_app app, Wdata_wiki_mgr wdata_mgr) {this.app = app; this.wdata_mgr = wdata_mgr;}
-	public void Init(Bry_bfr bfr, byte[] lang_key) {this.bfr = bfr; this.lang_key = lang_key;}
+	public void Init(Bry_bfr bfr, Wdata_hwtr_msgs msgs, byte[] lang_key) {this.bfr = bfr; ; this.msgs = msgs; this.lang_key = lang_key;}
 	public void Visit_str(Wdata_claim_itm_str itm)							{bfr.Add(itm.Val_str());}
-	public void Visit_time(Wdata_claim_itm_time itm)						{bfr.Add(itm.Time());}
+	public void Visit_time(Wdata_claim_itm_time itm) {
+		itm.Write_to_bfr(bfr, tmp_time_bfr, tmp_time_fmtr, msgs, Bry_.Empty);	// for now, don't bother passing ttl; only used for error msg; DATE:2015-08-03
+	}
 	public void Visit_monolingualtext(Wdata_claim_itm_monolingualtext itm)	{bfr.Add(itm.Text());}			// phrase only; PAGE:en.w:Alberta; EX: {{#property:motto}} -> "Fortis et libre"; DATE:2014-08-28
 	public void Visit_entity(Wdata_claim_itm_entity itm) {
 		Wdata_doc entity_doc = wdata_mgr.Pages_get(itm.Page_ttl_db());
diff --git a/400_xowa/src/gplx/xowa/xtns/wdatas/Wdata_wiki_mgr.java b/400_xowa/src/gplx/xowa/xtns/wdatas/Wdata_wiki_mgr.java
index 01b82fd2c..04de3f046 100644
--- a/400_xowa/src/gplx/xowa/xtns/wdatas/Wdata_wiki_mgr.java
+++ b/400_xowa/src/gplx/xowa/xtns/wdatas/Wdata_wiki_mgr.java
@@ -129,6 +129,7 @@ public class Wdata_wiki_mgr implements GfoEvObj, GfoInvkAble {
 		return qids[qid_idx];
 	}
 	public void Resolve_to_bfr(Bry_bfr bfr, Wdata_claim_grp prop_grp, byte[] lang_key) {
+		Hwtr_mgr_assert();
 		int len = prop_grp.Len();
 		Wdata_claim_itm_core selected = null;
 		for (int i = 0; i < len; i++) {								// NOTE: multiple props possible; EX: {{#property:P1082}}; PAGE:en.w:Earth DATE:2015-08-02
@@ -143,7 +144,7 @@ public class Wdata_wiki_mgr implements GfoEvObj, GfoInvkAble {
 			case Wdata_dict_snak_tid.Tid_novalue	: bfr.Add(Wdata_dict_snak_tid.Bry_novalue); break;
 			case Wdata_dict_snak_tid.Tid_somevalue	: bfr.Add(Wdata_dict_snak_tid.Bry_somevalue); break;
 			default: {
-				prop_val_visitor.Init(bfr, lang_key);
+				prop_val_visitor.Init(bfr, hwtr_mgr.Msgs(), lang_key);
 				selected.Welcome(prop_val_visitor);
 				break;
 			}
diff --git a/400_xowa/src/gplx/xowa/xtns/wdatas/Wdata_xwiki_link_wtr.java b/400_xowa/src/gplx/xowa/xtns/wdatas/Wdata_xwiki_link_wtr.java
index 600781fda..bf12432d9 100644
--- a/400_xowa/src/gplx/xowa/xtns/wdatas/Wdata_xwiki_link_wtr.java
+++ b/400_xowa/src/gplx/xowa/xtns/wdatas/Wdata_xwiki_link_wtr.java
@@ -21,8 +21,9 @@ public class Wdata_xwiki_link_wtr implements Bry_fmtr_arg {
 	public Wdata_xwiki_link_wtr Page_(Xoae_page page) {this.page = page; return this;} private Xoae_page page;
 	public void XferAry(Bry_bfr bfr, int idx) {
 		List_adp slink_list = page.Slink_list();
-		byte[] qid = Write_wdata_links(slink_list, page.Wikie(), page.Ttl(), page.Wdata_external_lang_links());
-		if (slink_list.Count() > 0)
+		Xoa_ttl page_ttl = page.Ttl();
+		byte[] qid = Write_wdata_links(slink_list, page.Wikie(), page_ttl, page.Wdata_external_lang_links());
+		if (!Bry_.Eq(qid, Qid_null) && !page_ttl.Ns().Id_special())	// don't write "In other languages" if no qid; also skip Special ns; needed for pages with wbase page, but no sitelinks; PAGE:en.w:Tintinan; DATE:2015-08-03
 			page.Wikie().Xwiki_mgr().Lang_mgr().Html_bld(bfr, page.Wikie(), slink_list, qid);
 	}
 	public static byte[] Write_wdata_links(List_adp slink_list, Xowe_wiki wiki, Xoa_ttl ttl, Wdata_external_lang_links_data external_links_mgr) {
diff --git a/400_xowa/src/gplx/xowa/xtns/wdatas/core/Wdata_claim_itm_time.java b/400_xowa/src/gplx/xowa/xtns/wdatas/core/Wdata_claim_itm_time.java
index bc56fa763..70553d440 100644
--- a/400_xowa/src/gplx/xowa/xtns/wdatas/core/Wdata_claim_itm_time.java
+++ b/400_xowa/src/gplx/xowa/xtns/wdatas/core/Wdata_claim_itm_time.java
@@ -26,7 +26,7 @@ public class Wdata_claim_itm_time extends Wdata_claim_itm_core { 	public Wdata_c
 	public Wdata_date Time_as_date() {
 		if (time_as_date == null) time_as_date = Wdata_date.parse(time, this.Precision_int(), this.Before_int(), this.After_int(), this.Calendar_is_julian());
 		return time_as_date;
-	} private Wdata_date time_as_date;
+	}	private Wdata_date time_as_date;
 	public byte[] Before() {return before;} private final byte[] before;
 	public byte[] After() {return after;} private final byte[] after;
 	public byte[] Precision() {return precision;} private final byte[] precision;
@@ -67,5 +67,21 @@ public class Wdata_claim_itm_time extends Wdata_claim_itm_core { 	public Wdata_c
 		return String_.Concat_with_str("|", Wdata_dict_snak_tid.Xto_str(this.Snak_tid()), Wdata_dict_val_tid.Xto_str(this.Val_tid()), String_.new_u8(time), String_.new_u8(before), String_.new_u8(after), String_.new_u8(precision), String_.new_u8(calendar));
 	}
 	@Override public void Welcome(Wdata_claim_visitor visitor) {visitor.Visit_time(this);}
+	public void Write_to_bfr(Bry_bfr bfr, Bry_bfr tmp_time_bfr, Bry_fmtr tmp_time_fmtr, Wdata_hwtr_msgs msgs, byte[] ttl) {
+		try {
+			Wdata_date date = this.Time_as_date();
+			boolean calendar_is_julian = this.Calendar_is_julian();
+			byte[] calendar_display = null;
+			if (calendar_is_julian) {
+				date = Wdata_date.Xto_julian(date);
+				calendar_display = msgs.Time_julian();
+			}
+			Wdata_date.Xto_str(bfr, tmp_time_fmtr, tmp_time_bfr, msgs, date);
+			if (calendar_display != null)
+				bfr.Add_byte_space().Add(calendar_display);
+		} catch (Exception e) {
+			Xoa_app_.Usr_dlg().Warn_many("", "", "failed to write time; ttl=~{0} pid=~{1} err=~{2}", ttl, this.Pid(), Err_.Message_gplx_log(e));
+		}
+	}
 	private static final byte[] Calendar_julian = Bry_.new_a7("http://www.wikidata.org/entity/Q1985786");
 }
diff --git a/400_xowa/src/gplx/xowa/xtns/wdatas/core/Wdata_date_tst.java b/400_xowa/src/gplx/xowa/xtns/wdatas/core/Wdata_date_tst.java
index 6986ebf96..91fe227d4 100644
--- a/400_xowa/src/gplx/xowa/xtns/wdatas/core/Wdata_date_tst.java
+++ b/400_xowa/src/gplx/xowa/xtns/wdatas/core/Wdata_date_tst.java
@@ -36,6 +36,7 @@ public class Wdata_date_tst {
 		fxt.Test_xto_str(date, Wdata_date.Fmt_ymdhns	, "4:05:06 3 Feb 2001");
 	}
 	@Test   public void Xto_str_year() {
+		fxt.Test_xto_str("+00000001970-01-01T00:00:00Z",  9, "1970");
 		fxt.Test_xto_str("-00000001234-01-01T00:00:00Z",  9, "1234 BC");
 		fxt.Test_xto_str("+00000001987-01-01T00:00:00Z",  8, "1980s");
 		fxt.Test_xto_str("+00000001987-01-01T00:00:00Z",  7, "19. century");
diff --git a/400_xowa/src/gplx/xowa/xtns/wdatas/hwtrs/Wdata_hwtr_mgr_tst.java b/400_xowa/src/gplx/xowa/xtns/wdatas/hwtrs/Wdata_hwtr_mgr_tst.java
index 210cfc25f..f4192fbd9 100644
--- a/400_xowa/src/gplx/xowa/xtns/wdatas/hwtrs/Wdata_hwtr_mgr_tst.java
+++ b/400_xowa/src/gplx/xowa/xtns/wdatas/hwtrs/Wdata_hwtr_mgr_tst.java
@@ -287,7 +287,10 @@ class Wdata_hwtr_mgr_fxt {
 		if (doc_hwtr == null) {
 			doc_hwtr = new Wdata_hwtr_mgr();
 			Wdata_hwtr_msgs msgs = Wdata_hwtr_msgs.new_en_();
-			doc_hwtr.Init_by_ctor(new Xoapi_wikibase(), new Wdata_lbl_wkr__test(resolved_ttls), Url_encoder.new_html_href_mw_(), new Xoapi_toggle_mgr(), new Xow_xwiki_mgr());
+			Xoapi_toggle_mgr toggle_mgr = new Xoapi_toggle_mgr();
+			wdata_fxt.Init();
+			toggle_mgr.Ctor_by_app(wdata_fxt.App());	// must init, else null error
+			doc_hwtr.Init_by_ctor(new Xoapi_wikibase(), new Wdata_lbl_wkr__test(resolved_ttls), Url_encoder.new_html_href_mw_(), toggle_mgr, new Xow_xwiki_mgr());
 			doc_hwtr.Init_by_lang(msgs);				
 		}
 		resolved_ttls.Clear();
diff --git a/400_xowa/src/gplx/xowa/xtns/wdatas/hwtrs/Wdata_visitor__html_wtr.java b/400_xowa/src/gplx/xowa/xtns/wdatas/hwtrs/Wdata_visitor__html_wtr.java
index 1629b26fe..27a300bfa 100644
--- a/400_xowa/src/gplx/xowa/xtns/wdatas/hwtrs/Wdata_visitor__html_wtr.java
+++ b/400_xowa/src/gplx/xowa/xtns/wdatas/hwtrs/Wdata_visitor__html_wtr.java
@@ -69,22 +69,7 @@ class Wdata_visitor__html_wtr implements Wdata_claim_visitor {
 			Gfo_usr_dlg_.I.Warn_many("", "", "failed to write quantity; ttl=~{0} pid=~{1} err=~{2}", ttl, itm.Pid(), Err_.Message_gplx_full(e));
 		}
 	}	private static final byte[] Time_plus_minus_spr = Bry_.new_a7(" / ");
-	public void Visit_time(Wdata_claim_itm_time itm) {
-		try {
-			Wdata_date date = itm.Time_as_date();
-			boolean calendar_is_julian = itm.Calendar_is_julian();
-			byte[] calendar_display = null;
-			if (calendar_is_julian) {
-				date = Wdata_date.Xto_julian(date);
-				calendar_display = msgs.Time_julian();
-			}
-			Wdata_date.Xto_str(tmp_bfr, tmp_time_fmtr, tmp_time_bfr, msgs, date);
-			if (calendar_display != null)
-				tmp_bfr.Add_byte_space().Add(calendar_display);
-		} catch (Exception e) {
-			Gfo_usr_dlg_.I.Warn_many("", "", "failed to write time; ttl=~{0} pid=~{1} err=~{2}", ttl, itm.Pid(), Err_.Message_gplx_full(e));
-		}
-	}
+	public void Visit_time(Wdata_claim_itm_time itm) {itm.Write_to_bfr(tmp_bfr, tmp_time_bfr, tmp_time_fmtr, msgs, ttl);}
 	public void Visit_globecoordinate(Wdata_claim_itm_globecoordinate itm) {
 		try {
 			Decimal_adp precision_frac = itm.Prc_as_num();						// precision is a decimal; EX: .00027777
diff --git a/400_xowa/src/gplx/xowa/xtns/wdatas/imports/Xob_wbase_ns_parser.java b/400_xowa/src/gplx/xowa/xtns/wdatas/imports/Xob_wbase_ns_parser.java
index 15376435e..569089cfd 100644
--- a/400_xowa/src/gplx/xowa/xtns/wdatas/imports/Xob_wbase_ns_parser.java
+++ b/400_xowa/src/gplx/xowa/xtns/wdatas/imports/Xob_wbase_ns_parser.java
@@ -17,14 +17,13 @@ along with this program.  If not, see .
 */
 package gplx.xowa.xtns.wdatas.imports; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; import gplx.xowa.xtns.wdatas.*;
 import gplx.dbs.*;
-import gplx.xowa.wikis.*;
+import gplx.xowa.wikis.*; import gplx.xowa.wikis.domains.*;
 import gplx.xowa.wmfs.data.*;
 class Xob_wbase_ns_parser {
 	private final Hash_adp_bry ns_mgr_hash = Hash_adp_bry.cs();
-	private final Xowmf_site_tbl tbl_site; private final Xowmf_ns_tbl tbl_itm;
-	public Xob_wbase_ns_parser(Db_conn conn) {
-		this.tbl_site	= new Xowmf_site_tbl(conn);
-		this.tbl_itm	= new Xowmf_ns_tbl(conn);
+	private final Site_core_db core_db;
+	public Xob_wbase_ns_parser(Io_url url) {
+		this.core_db = new Site_core_db(url);
 	}
 	public void Find(Xob_wbase_ns_parser_rslt rv, byte[] wiki_abrv, byte[] ttl) {	// enwiki, Category:Abc
 		Xow_ns_mgr ns_mgr = (Xow_ns_mgr)ns_mgr_hash.Get_by_bry(wiki_abrv);
@@ -34,9 +33,8 @@ class Xob_wbase_ns_parser {
 		if (ns_mgr == null) {			// ns_mgr not found; load from db
 			wiki_abrv = Bry_.Replace(wiki_abrv, Byte_ascii.Underline, Byte_ascii.Dash);
 			byte[] wiki_domain = Xow_wiki_alias.Parse__domain_name(wiki_abrv, 0, wiki_abrv.length);
-			int site_id = tbl_site.Select_id(String_.new_u8(wiki_domain)); if (site_id == -1) {Xoa_app_.Usr_dlg().Warn_many("", "", "wbase.ns_parser:unknown wmf_abrv; abrv=~{0}", wiki_abrv); return;}
-			ns_mgr = new Xow_ns_mgr(gplx.xowa.langs.cases.Xol_case_mgr_.U8());
-			tbl_itm.Select_all(ns_mgr, site_id); if (ns_mgr.Count() == 0) {Xoa_app_.Usr_dlg().Warn_many("", "", "wbase.ns_parser:no ns found; abrv=~{0}", wiki_abrv); return;}
+			ns_mgr = core_db.Load_ns(wiki_domain);
+			if (ns_mgr.Count() == 0) {Xoa_app_.Usr_dlg().Warn_many("", "", "wbase.ns_parser:no ns found; abrv=~{0}", wiki_abrv); return;}
 			ns_mgr_hash.Add_bry_obj(wiki_abrv, ns_mgr);
 		}
 		Xow_ns ns = ns_mgr.Names_get_or_null(ttl, 0, colon_pos); if (ns == null) return; // not a ns; EX: "No_namespace:Page_title"
diff --git a/400_xowa/src/gplx/xowa/xtns/wdatas/imports/Xob_wdata_db_cmd.java b/400_xowa/src/gplx/xowa/xtns/wdatas/imports/Xob_wdata_db_cmd.java
index 90ff0149b..937e5c7ff 100644
--- a/400_xowa/src/gplx/xowa/xtns/wdatas/imports/Xob_wdata_db_cmd.java
+++ b/400_xowa/src/gplx/xowa/xtns/wdatas/imports/Xob_wdata_db_cmd.java
@@ -40,7 +40,7 @@ public class Xob_wdata_db_cmd extends Xob_dump_mgr_base implements Xob_cmd {
 	@Override protected void Cmd_bgn_end() {
 		wdata_mgr = bldr.App().Wiki_mgr().Wdata_mgr();
 		json_parser = wdata_mgr.Jdoc_parser();
-		tbl_mgr.Conn().Txn_bgn();
+		tbl_mgr.Conn().Txn_bgn("bldr__wdata_db");
 	}
 	@Override public void Exec_pg_itm_hook(int ns_ord, Xow_ns ns, Xowd_page_itm page, byte[] page_src) {
 		Json_doc jdoc = json_parser.Parse(page_src); if (jdoc == null) return; // not a json document
diff --git a/400_xowa/src/gplx/xowa/xtns/wdatas/imports/Xob_wdata_qid_base.java b/400_xowa/src/gplx/xowa/xtns/wdatas/imports/Xob_wdata_qid_base.java
index 6ef6d54e4..07b5a4456 100644
--- a/400_xowa/src/gplx/xowa/xtns/wdatas/imports/Xob_wdata_qid_base.java
+++ b/400_xowa/src/gplx/xowa/xtns/wdatas/imports/Xob_wdata_qid_base.java
@@ -29,7 +29,7 @@ public abstract class Xob_wdata_qid_base extends Xob_itm_dump_base implements Xo
 	public void Wkr_bgn(Xob_bldr bldr) {
 		this.Init_dump(this.Wkr_key(), wiki.Tdb_fsys_mgr().Site_dir().GenSubDir_nest("data", "qid"));	// NOTE: must pass in correct make_dir in order to delete earlier version (else make_dirs will append)
 		this.parser = bldr.App().Wiki_mgr().Wdata_mgr().Jdoc_parser();
-		this.ns_parser = new Xob_wbase_ns_parser(Xowmf_site_tbl.Get_conn_or_new(bldr.App().Fsys_mgr().Root_dir()));
+		this.ns_parser = new Xob_wbase_ns_parser(bldr.App().Fsys_mgr().Cfg_site_meta_fil());
 		this.Qid_bgn();
 	}
 	public void Wkr_run(Xowd_page_itm page) {
diff --git a/400_xowa/src/gplx/xowa/xtns/wdatas/imports/Xob_wdata_qid_base_tst.java b/400_xowa/src/gplx/xowa/xtns/wdatas/imports/Xob_wdata_qid_base_tst.java
index 9d8ffd12a..633796214 100644
--- a/400_xowa/src/gplx/xowa/xtns/wdatas/imports/Xob_wdata_qid_base_tst.java
+++ b/400_xowa/src/gplx/xowa/xtns/wdatas/imports/Xob_wdata_qid_base_tst.java
@@ -57,13 +57,10 @@ public class Xob_wdata_qid_base_tst {
 	}
 	@Test  public void Ns() {
 		// setup db
-		Db_conn conn = Xowmf_site_tbl.Get_conn_or_new(fxt.App().Fsys_mgr().Root_dir());
-		Xowmf_site_tbl site_tbl = new Xowmf_site_tbl(conn);
-		site_tbl.Insert(1, "en.wikipedia.org");
-		site_tbl.Insert(2, "fr.wikipedia.org");
-		Xowmf_ns_tbl ns_tbl = new Xowmf_ns_tbl(conn);
-		ns_tbl.Insert(1, Xow_ns_.Id_help, Xow_ns_case_.Id_1st, Bool_.Y, Bool_.N, Bry_.new_a7("Help"), Bry_.Empty);
-		ns_tbl.Insert(2, Xow_ns_.Id_help, Xow_ns_case_.Id_1st, Bool_.Y, Bool_.N, Bry_.new_a7("Aide"), Bry_.Empty);
+		Site_core_db json_db = new Site_core_db(fxt.App().Fsys_mgr().Cfg_site_meta_fil());
+		Site_namespace_tbl ns_tbl = json_db.Tbl__namespace();
+		ns_tbl.Insert(Bry_.new_a7("en.w"), Xow_ns_.Id_help, Xow_ns_case_.Bry__1st, Bry_.Empty, Bry_.new_a7("Help"), Bool_.N, Bool_.N, Bry_.Empty);
+		ns_tbl.Insert(Bry_.new_a7("fr.w"), Xow_ns_.Id_help, Xow_ns_case_.Bry__1st, Bry_.Empty, Bry_.new_a7("Aide"), Bool_.N, Bool_.N, Bry_.Empty);
 		// run test
 		fxt.doc_ary_
 		(	fxt.doc_wo_date_(1, "11", Xob_wdata_pid_base_tst.json_("q1", "links", String_.Ary("enwiki", "Help:Q1_en", "frwiki", "Aide:Q1_fr")))
diff --git a/400_xowa/src/gplx/xowa/xtns/wdatas/pfuncs/Wdata_pf_property_tst.java b/400_xowa/src/gplx/xowa/xtns/wdatas/pfuncs/Wdata_pf_property_tst.java
index 382d8b350..9aed6a80b 100644
--- a/400_xowa/src/gplx/xowa/xtns/wdatas/pfuncs/Wdata_pf_property_tst.java
+++ b/400_xowa/src/gplx/xowa/xtns/wdatas/pfuncs/Wdata_pf_property_tst.java
@@ -46,7 +46,7 @@ public class Wdata_pf_property_tst {
 	@Test   public void Time() {
 		fxt.Init_links_add("enwiki", "Test_page", "q1");
 		fxt.Init_pages_add(fxt.doc_("q1", fxt.Make_claim_time(1, "2012-01-02 03:04:05")));
-		fxt.Test_parse("{{#property:p1}}", "+00000002012-01-02T03:04:05Z");
+		fxt.Test_parse("{{#property:p1}}", "30405 2 Jan 2012");	// NOTE: format is missing ":" b/c test does not init messages for html_wtr;  DATE:2015-08-03
 	}
 	@Test   public void Geodata() {
 		fxt.Init_links_add("enwiki", "Test_page", "q1");
diff --git a/400_xowa/src_040_io/gplx/ios/Io_sort.java b/400_xowa/src_040_io/gplx/ios/Io_sort.java
index 3cdbf9a4f..df6715930 100644
--- a/400_xowa/src_040_io/gplx/ios/Io_sort.java
+++ b/400_xowa/src_040_io/gplx/ios/Io_sort.java
@@ -46,7 +46,7 @@ public class Io_sort {
 		return (Io_url[])rv.To_ary(Io_url.class);
 	}
 	public void Merge(Gfo_usr_dlg usr_dlg, Io_url[] src_ary, ComparerAble comparer, Io_line_rdr_key_gen key_gen, Io_sort_cmd cmd) {
-		BinaryHeap_Io_line_rdr heap = load_(usr_dlg, src_ary, comparer, key_gen, memory_max); if (heap.Len() == 0) return;//throw Err_.new_wo_type(Array_.XtoStr(src_ary));
+		BinaryHeap_Io_line_rdr heap = load_(usr_dlg, src_ary, comparer, key_gen, memory_max); if (heap.Len() == 0) return;//throw Err_.new_wo_type(Array_.To_str(src_ary));
 		Io_line_rdr stream = null;
 		cmd.Sort_bgn();
 		while (true) {
diff --git a/400_xowa/src_060_utl/gplx/App_cmd_arg.java b/400_xowa/src_060_utl/gplx/App_cmd_arg.java
index 80f4f675b..d3047f627 100644
--- a/400_xowa/src_060_utl/gplx/App_cmd_arg.java
+++ b/400_xowa/src_060_utl/gplx/App_cmd_arg.java
@@ -41,7 +41,7 @@ public class App_cmd_arg {
 		return this;
 	}
 	public App_cmd_arg Example_list_str_(String v) {
-		example = String_.ConcatWith_any(" ", v);
+		example = String_.Concat_with_obj(" ", v);
 		val_tid = Val_tid_list_string;
 		return this;
 	}
diff --git a/400_xowa/src_060_utl/gplx/HierPosAryBldr.java b/400_xowa/src_060_utl/gplx/HierPosAryBldr.java
index cb7d3ab14..cc9a24343 100644
--- a/400_xowa/src_060_utl/gplx/HierPosAryBldr.java
+++ b/400_xowa/src_060_utl/gplx/HierPosAryBldr.java
@@ -50,11 +50,11 @@ public class HierPosAryBldr {
 			rv[i] = ary[i];
 		return rv;
 	}
-	public String XtoStr() {
+	public String To_str() {
 		String_bldr sb = String_bldr_.new_();
 		for (int i = 0; i < aryIdx; i++)
 			sb.Add_spr_unless_first(Int_.Xto_str(ary[i]), " ", i);
-		return sb.XtoStr();
+		return sb.To_str();
 	}
 	int[] ary; int aryIdx = -1; int root = -1;
 	public HierPosAryBldr(int ary_max)	{ary = new int[ary_max]; this.Init();}
diff --git a/400_xowa/src_060_utl/gplx/Tst_mgr.java b/400_xowa/src_060_utl/gplx/Tst_mgr.java
index 51f0eba49..0c8d3d1fb 100644
--- a/400_xowa/src_060_utl/gplx/Tst_mgr.java
+++ b/400_xowa/src_060_utl/gplx/Tst_mgr.java
@@ -33,7 +33,7 @@ public class Tst_mgr {
 		return itm.Pass() ? 0 : 1;
 	}
 	public int Tst_val_ary(boolean skip, String path, String name, Object expd, Object actl) {	
-		Tst_itm itm = Tst_itm.eq_(skip, path, name, XtoStr(expd), XtoStr(actl));
+		Tst_itm itm = Tst_itm.eq_(skip, path, name, To_str(expd), To_str(actl));
 		results.Add(itm);
 		return itm.Pass() ? 0 : 1;
 	}
@@ -79,7 +79,7 @@ public class Tst_mgr {
 			return expd_obj.Chk(this, path, actl_obj);
 		}
 	}
-	String XtoStr(Object ary) {	
+	String To_str(Object ary) {	
 		if (ary == null) return "";
 		int len = Array_.Len(ary);
 		for (int i = 0; i < len; i++) {
diff --git a/400_xowa/src_120_wiki/gplx/xowa/Xow_ns_case_.java b/400_xowa/src_120_wiki/gplx/xowa/Xow_ns_case_.java
index b2c34fd77..4174ae7fa 100644
--- a/400_xowa/src_120_wiki/gplx/xowa/Xow_ns_case_.java
+++ b/400_xowa/src_120_wiki/gplx/xowa/Xow_ns_case_.java
@@ -19,6 +19,7 @@ package gplx.xowa; import gplx.*;
 public class Xow_ns_case_ {
 	public static final byte Id_all = 0, Id_1st = 1;
 	public static final String Key_all = "case-sensitive", Key_1st = "first-letter";
+	public static final byte[] Bry__all = Bry_.new_a7(Key_all), Bry__1st = Bry_.new_a7(Key_1st);
 	public static byte parse_(String s) {
 		if		(String_.Eq(s, Key_1st))		return Id_1st;
 		else if	(String_.Eq(s, Key_all))		return Id_all;
diff --git a/400_xowa/src_140_lang/gplx/xowa/Xol_msg_itm_.java b/400_xowa/src_140_lang/gplx/xowa/Xol_msg_itm_.java
index 3dae7ae56..7332ad0a0 100644
--- a/400_xowa/src_140_lang/gplx/xowa/Xol_msg_itm_.java
+++ b/400_xowa/src_140_lang/gplx/xowa/Xol_msg_itm_.java
@@ -226,32 +226,33 @@ public static final int
 , Id_xowa_wikidata_east = 204
 , Id_xowa_wikidata_meters = 205
 , Id_xowa_wikidata_julian = 206
-, Id_xowa_wikidata_decade = 207
-, Id_xowa_wikidata_century = 208
-, Id_xowa_wikidata_millenium = 209
-, Id_xowa_wikidata_years1e4 = 210
-, Id_xowa_wikidata_years1e5 = 211
-, Id_xowa_wikidata_years1e6 = 212
-, Id_xowa_wikidata_years1e7 = 213
-, Id_xowa_wikidata_years1e8 = 214
-, Id_xowa_wikidata_years1e9 = 215
-, Id_xowa_wikidata_bc = 216
-, Id_xowa_wikidata_inTime = 217
-, Id_ctg_tbl_hidden = 218
-, Id_ctg_help_page = 219
-, Id_statistics_title = 220
-, Id_statistics_header_pages = 221
-, Id_statistics_articles = 222
-, Id_statistics_pages = 223
-, Id_statistics_pages_desc = 224
-, Id_statistics_header_ns = 225
-, Id_wikibase_diffview_rank = 226
-, Id_xowa_wikidata_deprecated = 227
-, Id_xowa_wikidata_normal = 228
-, Id_xowa_wikidata_preferred = 229
-, Id_xowa_wikidata_links_special = 230
+, Id_xowa_wikidata_year = 207
+, Id_xowa_wikidata_decade = 208
+, Id_xowa_wikidata_century = 209
+, Id_xowa_wikidata_millenium = 210
+, Id_xowa_wikidata_years1e4 = 211
+, Id_xowa_wikidata_years1e5 = 212
+, Id_xowa_wikidata_years1e6 = 213
+, Id_xowa_wikidata_years1e7 = 214
+, Id_xowa_wikidata_years1e8 = 215
+, Id_xowa_wikidata_years1e9 = 216
+, Id_xowa_wikidata_bc = 217
+, Id_xowa_wikidata_inTime = 218
+, Id_ctg_tbl_hidden = 219
+, Id_ctg_help_page = 220
+, Id_statistics_title = 221
+, Id_statistics_header_pages = 222
+, Id_statistics_articles = 223
+, Id_statistics_pages = 224
+, Id_statistics_pages_desc = 225
+, Id_statistics_header_ns = 226
+, Id_wikibase_diffview_rank = 227
+, Id_xowa_wikidata_deprecated = 228
+, Id_xowa_wikidata_normal = 229
+, Id_xowa_wikidata_preferred = 230
+, Id_xowa_wikidata_links_special = 231
 ;
-	public static final int Id__max = 231;
+	public static final int Id__max = 232;
 	public static Xol_msg_itm new_(int id, String key, String val) {return new_(id, Bry_.new_u8(key), Bry_.new_u8(val));}
 	public static Xol_msg_itm new_(int id, byte[] key, byte[] val) {
 		Xol_msg_itm rv = new Xol_msg_itm(id, key);
@@ -481,6 +482,7 @@ case Xol_msg_itm_.Id_xowa_wikidata_west: return new_(Xol_msg_itm_.Id_xowa_wikida
 case Xol_msg_itm_.Id_xowa_wikidata_east: return new_(Xol_msg_itm_.Id_xowa_wikidata_east, "xowa-wikidata-east", "E");
 case Xol_msg_itm_.Id_xowa_wikidata_meters: return new_(Xol_msg_itm_.Id_xowa_wikidata_meters, "xowa-wikidata-meters", " m");
 case Xol_msg_itm_.Id_xowa_wikidata_julian: return new_(Xol_msg_itm_.Id_xowa_wikidata_julian, "xowa-wikidata-julian", "jul");
+case Xol_msg_itm_.Id_xowa_wikidata_year: return new_(Xol_msg_itm_.Id_xowa_wikidata_year, "xowa-wikidata-year", "~{0}");
 case Xol_msg_itm_.Id_xowa_wikidata_decade: return new_(Xol_msg_itm_.Id_xowa_wikidata_decade, "xowa-wikidata-decade", "~{0}0s");
 case Xol_msg_itm_.Id_xowa_wikidata_century: return new_(Xol_msg_itm_.Id_xowa_wikidata_century, "xowa-wikidata-century", "~{0}. century");
 case Xol_msg_itm_.Id_xowa_wikidata_millenium: return new_(Xol_msg_itm_.Id_xowa_wikidata_millenium, "xowa-wikidata-millenium", "~{0}. millenium");
diff --git a/400_xowa/src_161_meta/gplx/xowa/Xof_meta_fil_tst.java b/400_xowa/src_161_meta/gplx/xowa/Xof_meta_fil_tst.java
index 6a5cd7ab8..1857c1013 100644
--- a/400_xowa/src_161_meta/gplx/xowa/Xof_meta_fil_tst.java
+++ b/400_xowa/src_161_meta/gplx/xowa/Xof_meta_fil_tst.java
@@ -23,7 +23,7 @@ public class Xof_meta_fil_tst {
 	@Test  public void Bld_url() {fxt.Bld_url("mem/root/", "abcdef", 3, "mem/root/a/b/abc.csv");}
 }
 class Xof_meta_fil_fxt {
-	byte[] md5_(byte[] name) {return Xof_file_wkr_.Md5_(name);}
+	byte[] md5_(byte[] name) {return Xof_file_wkr_.Md5(name);}
 	public void Ini() {}
 	public void Bld_url(String root, String md5, int depth, String expd) {Tfds.Eq(expd, Xof_meta_fil.Bld_url(Io_url_.new_dir_(root), Bry_.new_a7(md5), depth).Raw());}
 }
diff --git a/400_xowa/src_161_meta/gplx/xowa/Xof_meta_mgr.java b/400_xowa/src_161_meta/gplx/xowa/Xof_meta_mgr.java
index 26a0cbad8..d619d9789 100644
--- a/400_xowa/src_161_meta/gplx/xowa/Xof_meta_mgr.java
+++ b/400_xowa/src_161_meta/gplx/xowa/Xof_meta_mgr.java
@@ -37,7 +37,7 @@ public class Xof_meta_mgr implements GfoInvkAble {
 		}
 		return rv;
 	}
-	public Xof_meta_itm Get_itm_or_new(byte[] ttl) {return Get_itm_or_new(ttl, gplx.xowa.files.Xof_file_wkr_.Md5_(ttl));}
+	public Xof_meta_itm Get_itm_or_new(byte[] ttl) {return Get_itm_or_new(ttl, gplx.xowa.files.Xof_file_wkr_.Md5(ttl));}
 	public Xof_meta_itm Get_itm_or_new(byte[] ttl, byte[] md5) {
 		Xof_meta_fil fil = this.Get_fil_or_new(md5);
 		return fil.Get_or_new(ttl);
diff --git a/400_xowa/src_161_meta/gplx/xowa/Xof_meta_mgr_tst.java b/400_xowa/src_161_meta/gplx/xowa/Xof_meta_mgr_tst.java
index 11a03147e..b417151a7 100644
--- a/400_xowa/src_161_meta/gplx/xowa/Xof_meta_mgr_tst.java
+++ b/400_xowa/src_161_meta/gplx/xowa/Xof_meta_mgr_tst.java
@@ -59,7 +59,7 @@ public class Xof_meta_mgr_tst {
 }
 class Xof_file_regy_fxt {
 	Xof_meta_mgr regy_mgr;
-	byte[] md5_(byte[] name) {return Xof_file_wkr_.Md5_(name);}
+	byte[] md5_(byte[] name) {return Xof_file_wkr_.Md5(name);}
 	public void Ini() {
 		Io_mgr.I.InitEngine_mem();
 		Xoae_app app = Xoa_app_fxt.app_();
diff --git a/400_xowa/src_200_bldr/gplx/xowa/Xob_stat_itm.java b/400_xowa/src_200_bldr/gplx/xowa/Xob_stat_itm.java
index 0f912824f..3d054b770 100644
--- a/400_xowa/src_200_bldr/gplx/xowa/Xob_stat_itm.java
+++ b/400_xowa/src_200_bldr/gplx/xowa/Xob_stat_itm.java
@@ -28,7 +28,7 @@ public class Xob_stat_itm implements NewAble {
 		if (size > SizeMax) {SizeMax = size; SizeMaxIdx = idx;}
 		if (size < SizeMin) {SizeMin = size; SizeMinIdx = idx;}
 	}
-	public void XtoStr(String_bldr sb) {
+	public void To_str(String_bldr sb) {
 		XtoStr_fld(sb, ns).XtoStr_fld(sb, Fils).XtoStr_fld(sb, Size).XtoStr_fld(sb, SizeMax).XtoStr_fld(sb, SizeMaxIdx).XtoStr_fld(sb, SizeMin);
 		sb.Add(Int_.Xto_str(SizeMinIdx));
 	}
diff --git a/400_xowa/src_200_bldr/gplx/xowa/Xob_stat_mgr.java b/400_xowa/src_200_bldr/gplx/xowa/Xob_stat_mgr.java
index a9ad03e14..9324cafa6 100644
--- a/400_xowa/src_200_bldr/gplx/xowa/Xob_stat_mgr.java
+++ b/400_xowa/src_200_bldr/gplx/xowa/Xob_stat_mgr.java
@@ -42,15 +42,15 @@ public class Xob_stat_mgr {
 			}
 			sb.Add_str_w_crlf(ns);
 		}
-		return sb.XtoStr();
+		return sb.To_str();
 	}
-	public String XtoStr() {
+	public String To_str() {
 		String_bldr sb = String_bldr_.new_();
 		for (int i = 0; i < regy.Count(); i++) {
 			Xob_stat_type typ = (Xob_stat_type)regy.Get_at(i);
-			typ.XtoStr(sb);
+			typ.To_str(sb);
 		}
-		return sb.XtoStr();
+		return sb.To_str();
 	}
 	String[] GetNmsAry(Xow_ns_mgr nsMgr) {
 		Ordered_hash nsRegy = Ordered_hash_.new_();
diff --git a/400_xowa/src_200_bldr/gplx/xowa/Xob_stat_type.java b/400_xowa/src_200_bldr/gplx/xowa/Xob_stat_type.java
index c18c6184e..aac4a4863 100644
--- a/400_xowa/src_200_bldr/gplx/xowa/Xob_stat_type.java
+++ b/400_xowa/src_200_bldr/gplx/xowa/Xob_stat_type.java
@@ -23,11 +23,11 @@ public class Xob_stat_type {
 	public Xob_stat_itm GetOrNew(String ns) {return (Xob_stat_itm)regy.Get_by_or_new(ns, Xob_stat_itm._);}
 	public Xob_stat_itm GetAt(int i) {return (Xob_stat_itm)regy.Get_at(i);}
 	public int Count() {return regy.Count();}
-	public void XtoStr(String_bldr sb) {
+	public void To_str(String_bldr sb) {
 		for (int i = 0; i < regy.Count(); i++) {
 			Xob_stat_itm itm = (Xob_stat_itm)regy.Get_at(i);
 			sb.Add(Xotdb_dir_info_.Tid_name(tid)).Add(Xob_stat_itm.Dlm);
-			itm.XtoStr(sb);
+			itm.To_str(sb);
 			sb.Add(Byte_ascii.Nl);
 		}
 	}
diff --git a/400_xowa/src_200_bldr/gplx/xowa/Xob_xdat_file_tst.java b/400_xowa/src_200_bldr/gplx/xowa/Xob_xdat_file_tst.java
index 54082f481..021b6a932 100644
--- a/400_xowa/src_200_bldr/gplx/xowa/Xob_xdat_file_tst.java
+++ b/400_xowa/src_200_bldr/gplx/xowa/Xob_xdat_file_tst.java
@@ -112,7 +112,7 @@ public class Xob_xdat_file_tst {
 			String line = lines[i];
 			sb.Add(line).Add_char_nl();
 		}
-		byte[] bry = Bry_.new_u8(sb.XtoStr());
+		byte[] bry = Bry_.new_u8(sb.To_str());
 		return new Xob_xdat_file().Parse(bry, bry.length, Io_url_.Empty);
 	}
 }
diff --git a/400_xowa/src_210_bldr_core/gplx/xowa/Sql_file_parser_cmd.java b/400_xowa/src_210_bldr_core/gplx/xowa/Sql_file_parser_cmd.java
index d0331273b..625b4e87d 100644
--- a/400_xowa/src_210_bldr_core/gplx/xowa/Sql_file_parser_cmd.java
+++ b/400_xowa/src_210_bldr_core/gplx/xowa/Sql_file_parser_cmd.java
@@ -28,7 +28,7 @@ class Sql_file_parser_cmd_max_len implements Sql_file_parser_cmd {
 			String itm = (String)log.Get_at(i);
 			sb.Add(String_.Len(itm) + "|" + itm + "\n");
 		}
-		Io_mgr.I.SaveFilStr(url, sb.XtoStr());
+		Io_mgr.I.SaveFilStr(url, sb.To_str());
 	}
 	public int Max_len() {return max_len;} private int max_len; 
 	public void Exec(byte[] src, byte[] fld_key, int fld_idx, int fld_bgn, int fld_end, Bry_bfr file_bfr, Sql_file_parser_data data) {
diff --git a/400_xowa/src_240_install/gplx/xowa/Xoi_cmd_imageMagick_download.java b/400_xowa/src_240_install/gplx/xowa/Xoi_cmd_imageMagick_download.java
new file mode 100644
index 000000000..395e11d91
--- /dev/null
+++ b/400_xowa/src_240_install/gplx/xowa/Xoi_cmd_imageMagick_download.java
@@ -0,0 +1,67 @@
+/*
+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; import gplx.*;
+import gplx.gfui.*;
+import gplx.core.threads.*;
+class Xoi_cmd_imageMagick_download extends Gfo_thread_cmd_download implements Gfo_thread_cmd {//		private static final byte[] Bry_windows_zip = Bry_.new_a7("-windows.zip");
+//		static final String Src_imageMagick = "ftp://ftp.sunet.se/pub/multimedia/graphics/ImageMagick/binaries/";
+	public Xoi_cmd_imageMagick_download(Gfo_usr_dlg usr_dlg, Gfui_kit kit, Io_url trg) {this.Ctor(usr_dlg, kit); this.trg = trg;} Io_url trg;
+	@Override public byte Async_init() {	// 
+//			byte[] raw = xrg.Exec_as_bry(Src_imageMagick);
+//			int find_pos = Bry_finder.Find_fwd(raw, Bry_windows_zip);				if (find_pos == Bry_.NotFound) return Fail();
+//			int bgn_pos = Bry_finder.Find_bwd(raw, Byte_ascii.Quote, find_pos);	if (bgn_pos == Bry_.NotFound) return Fail();
+//			++bgn_pos;
+//			int end_pos = Bry_finder.Find_fwd(raw, Byte_ascii.Quote, bgn_pos);		if (end_pos == Bry_.NotFound) return Fail();
+//			String src = Src_imageMagick + String_.new_a7(Bry_.Mid(raw, bgn_pos, end_pos));
+		String src = "http://ftp.sunet.se/pub/multimedia/graphics/ImageMagick/binaries/ImageMagick-6.8.8-1-Q16-x86-windows.zip";
+		this.Init("downloading", src, trg);
+		return super.Async_init();
+	}
+	byte Fail() {
+		kit.Ask_ok(GRP_KEY, "windows_not_found", "Could not find Windows binary. Please download ImageMagick directly from the site.");
+		return Gfo_thread_cmd_.Init_cancel_step;
+	}
+	public static final String KEY_imageMagick = "download.imageMagick";
+	static final String GRP_KEY = "xowa.install.cmds.download.imageMagick";
+}
+class Xoi_cmd_msg_ok extends Gfo_thread_cmd_base implements Gfo_thread_cmd {
+	public Xoi_cmd_msg_ok(Gfo_usr_dlg usr_dlg, Gfui_kit kit, String msg) {this.msg = msg; this.Ctor(usr_dlg, kit);} private String msg;
+	@Override public boolean Async_term()	{
+		kit.Ask_ok("msg_ok", "msg", msg);
+		return true;
+	}
+	public static final String KEY = "msg.ok";
+}
+//	class Gfo_thread_exec_sync : Gfo_thread_cmd_base, Gfo_thread_cmd {
+//		public Gfo_thread_exec_sync(Gfo_usr_dlg usr_dlg, Gfui_kit kit, Io_url exec_url, String exec_args) {this.Ctor(usr_dlg, kit); this.exec_url = exec_url; this.exec_args = exec_args;} Io_url exec_url; String exec_args;
+//		public override byte Async_init() {
+//			if (!kit.Ask_yes_no(GRP_KEY, "confirm", "You are about to run '~{0}'. Please confirm that XOWA requested you to run '~{0}' and that you trust it to run on your machine.", exec_url.NameAndExt())) {
+//				usr_dlg.Warn_many(GRP_KEY, "confirm.fail", "program was untrusted: ~{0} ~{1}", exec_url.Raw(), exec_args);
+//				return Gfo_thread_cmd_.Init_cancel_all;
+//			}
+//			usr_dlg.Prog_many("exec_sync", "bgn", "running process. please wait; ~{0} ~{1}", exec_url.Raw(), exec_args);
+//			return Gfo_thread_cmd_.Init_ok;
+//		}
+//		public override void Async_run() {
+//			ProcessAdp process = new ProcessAdp().Exe_url_(exec_url).Args_str_(exec_args).Prog_dlg_(usr_dlg);
+//			process.Run_mode_(ProcessAdp.Run_mode_sync_block);
+//			process.Run();
+//		}
+//		public static final String KEY = "exec.sync";
+//		static final String GRP_KEY = "exec.sync";
+//	}
diff --git a/400_xowa/src_240_install/gplx/xowa/Xoi_cmd_wiki.java b/400_xowa/src_240_install/gplx/xowa/Xoi_cmd_wiki.java
deleted file mode 100644
index 70b116996..000000000
--- a/400_xowa/src_240_install/gplx/xowa/Xoi_cmd_wiki.java
+++ /dev/null
@@ -1,199 +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 .
-*/
-package gplx.xowa; import gplx.*;
-import gplx.gfui.*;
-import gplx.core.threads.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.cmds.utils.*;
-class Xoi_cmd_wiki_download extends Gfo_thread_cmd_download implements Gfo_thread_cmd {	private Xoi_setup_mgr install_mgr; private String wiki_key, dump_date, dump_type;
-	public Xoi_cmd_wiki_download Ctor_download_(Xoi_setup_mgr install_mgr, String wiki_key, String dump_date, String dump_type) {
-		this.install_mgr = install_mgr;
-		this.wiki_key = wiki_key;
-		this.dump_date = dump_date;
-		this.dump_type = dump_type;
-		this.Owner_(install_mgr);
-		return this;
-	}
-	@gplx.Virtual public String Download_file_ext() {return ".xml.bz2";}	// wiki.download is primarily used for dump files; default to .xml.bz2; NOTE: changed from ".xml"; DATE:2013-11-07
-	@Override public String Async_key() {return Key_wiki_download;}  public static final String Key_wiki_download = "wiki.download";
-	@Override public byte Async_init() {
-		Xoae_app app = install_mgr.App();
-		Xob_dump_file dump_file = Xob_dump_file.new_(wiki_key, dump_date, dump_type);
-		boolean connected = Xob_dump_file_.Connect_first(dump_file, install_mgr.Dump_mgr().Server_urls());
-		if (connected)
-			app.Usr_dlg().Note_many("", "", "url: ~{0}", dump_file.File_url());
-		else {
-			if (!Dump_servers_offline_msg_shown) {
-				app.Gui_mgr().Kit().Ask_ok("", "", "all dump servers are offline: ~{0}", String_.AryXtoStr(install_mgr.Dump_mgr().Server_urls()));
-				Dump_servers_offline_msg_shown = true;
-			}
-		}
-		Xowe_wiki wiki = app.Wiki_mgr().Get_by_key_or_make(dump_file.Wiki_type().Domain_bry());
-		Io_url root_dir = wiki.Fsys_mgr().Root_dir();
-		Io_url[] trg_fil_ary = Io_mgr.I.QueryDir_args(root_dir).FilPath_("*." + dump_type + Download_file_ext() + "*").ExecAsUrlAry();
-		Io_url trg = trg_fil_ary.length == 0 ? root_dir.GenSubFil(dump_file.File_name()) : trg_fil_ary[0];
-		this.Ctor(app.Usr_dlg(), app.Gui_mgr().Kit());
-		this.Init("download", dump_file.File_url(), trg);
-		return super.Async_init();
-	}
-	private static boolean Dump_servers_offline_msg_shown = false;
-}
-class Xoi_cmd_wiki_unzip extends Gfo_thread_cmd_unzip implements Gfo_thread_cmd {	public static final String KEY_dump = "wiki.unzip";
-	public Xoi_cmd_wiki_unzip(Xoi_setup_mgr install_mgr, String wiki_key, String dump_date, String dump_type) {this.install_mgr = install_mgr; this.Owner_(install_mgr); this.wiki_key = wiki_key; this.dump_date = dump_date; this.dump_type = dump_type;} private Xoi_setup_mgr install_mgr; String wiki_key, dump_date, dump_type;
-	@Override public String Async_key() {return KEY_dump;}
-	@Override public byte Async_init() {
-		Xoae_app app = install_mgr.App(); Gfui_kit kit = app.Gui_mgr().Kit();
-		Xowe_wiki wiki = app.Wiki_mgr().Get_by_key_or_make(Bry_.new_u8(wiki_key));
-		Io_url wiki_dir = wiki.Import_cfg().Src_dir();
-		Io_url[] urls = Io_mgr.I.QueryDir_args(wiki_dir).Recur_(false).FilPath_("*.xml.bz2").ExecAsUrlAry();
-		if (urls.length == 0) {
-			kit.Ask_ok(GRP_KEY, "dump.unzip_latest.file_missing", "Could not find a dump file for ~{0} in ~{1}", wiki_key, wiki_dir.Raw());
-			return Gfo_thread_cmd_.Init_cancel_step;
-		}
-		Io_url src = urls[urls.length - 1];
-		Io_url trg = app.Fsys_mgr().Wiki_dir().GenSubFil_nest(wiki_key, src.NameOnly());	// NOTE: NameOnly() will strip trailing .bz2; EX: a.xml.bz2 -> a.xml
-		super.Init(app.Usr_dlg(), app.Gui_mgr().Kit(), app.Prog_mgr().App_decompress_bz2(), app.Prog_mgr().App_decompress_zip(), app.Prog_mgr().App_decompress_gz(), src, trg);
-		this.Term_cmd_for_src_(Term_cmd_for_src_move);
-		this.Term_cmd_for_src_url_(app.Fsys_mgr().Wiki_dir().GenSubFil_nest("#dump", "done", src.NameAndExt()));
-		if (Io_mgr.I.ExistsFil(trg)) {
-			int rslt = kit.Ask_yes_no_cancel(GRP_KEY, "target_exists", "Target file already exists: '~{0}'.\nDo you want to delete it?", trg.Raw());
-			switch (rslt) {
-				case Gfui_dlg_msg_.Btn_yes:		Io_mgr.I.DeleteFil(trg); break;
-				case Gfui_dlg_msg_.Btn_no:		return Gfo_thread_cmd_.Init_cancel_step;
-				case Gfui_dlg_msg_.Btn_cancel:	return Gfo_thread_cmd_.Init_cancel_all;
-				default:						throw Err_.new_unhandled(rslt);
-			}
-		}
-		return Gfo_thread_cmd_.Init_ok;
-	}
-	static final String GRP_KEY = "xowa.thread.dump.unzip";
-}
-class Xoi_cmd_wiki_image_cfg extends Gfo_thread_cmd_replace implements Gfo_thread_cmd {	public Xoi_cmd_wiki_image_cfg(Xoae_app app, Io_url url) {this.app = app; super.Init(app.Usr_dlg(), app.Gui_mgr().Kit(), url);} private Xoae_app app;
-	@Override public void Async_run() {
-		super.Async_run();
-		app.Cfg_mgr().Set_by_app("app.files.download.enabled", "y");
-		app.Cfg_mgr().Db_save_txt();
-	}
-	static final String GRP_KEY = "xowa.thread.dump.image_cfg";
-	public static final String KEY_dump = "wiki.image_cfg";
-}
-class Xoi_cmd_wiki_goto_page extends Gfo_thread_cmd_base implements Gfo_thread_cmd {
-	public Xoi_cmd_wiki_goto_page(Xoae_app app, String page) {this.app = app; this.page = page; this.Ctor(app.Usr_dlg(), app.Gui_mgr().Kit());} private Xoae_app app; String page;
-	@Override public void Async_run()	{kit.New_cmd_sync(this).Invk(GfsCtx.new_(), 0, Invk_goto_page, GfoMsg_.Null);}
-	private void Goto_page(String page)			{app.Gui_mgr().Browser_win().Page__navigate_by_url_bar(page);}
-	@Override public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) {
-		if		(ctx.Match(k, Invk_goto_page))				Goto_page(page);
-		else	return super.Invk(ctx, ikey, k, m);
-		return this;
-	}	private static final String Invk_goto_page = "goto_page";
-	public static final String KEY = "wiki.goto_page";
-}
-class Xoi_cmd_imageMagick_download extends Gfo_thread_cmd_download implements Gfo_thread_cmd {//		private static final byte[] Bry_windows_zip = Bry_.new_a7("-windows.zip");
-//		static final String Src_imageMagick = "ftp://ftp.sunet.se/pub/multimedia/graphics/ImageMagick/binaries/";
-	public Xoi_cmd_imageMagick_download(Gfo_usr_dlg usr_dlg, Gfui_kit kit, Io_url trg) {this.Ctor(usr_dlg, kit); this.trg = trg;} Io_url trg;
-	@Override public byte Async_init() {	// 
-//			byte[] raw = xrg.Exec_as_bry(Src_imageMagick);
-//			int find_pos = Bry_finder.Find_fwd(raw, Bry_windows_zip);				if (find_pos == Bry_.NotFound) return Fail();
-//			int bgn_pos = Bry_finder.Find_bwd(raw, Byte_ascii.Quote, find_pos);	if (bgn_pos == Bry_.NotFound) return Fail();
-//			++bgn_pos;
-//			int end_pos = Bry_finder.Find_fwd(raw, Byte_ascii.Quote, bgn_pos);		if (end_pos == Bry_.NotFound) return Fail();
-//			String src = Src_imageMagick + String_.new_a7(Bry_.Mid(raw, bgn_pos, end_pos));
-		String src = "http://ftp.sunet.se/pub/multimedia/graphics/ImageMagick/binaries/ImageMagick-6.8.8-1-Q16-x86-windows.zip";
-		this.Init("downloading", src, trg);
-		return super.Async_init();
-	}
-	byte Fail() {
-		kit.Ask_ok(GRP_KEY, "windows_not_found", "Could not find Windows binary. Please download ImageMagick directly from the site.");
-		return Gfo_thread_cmd_.Init_cancel_step;
-	}
-	public static final String KEY_imageMagick = "download.imageMagick";
-	static final String GRP_KEY = "xowa.install.cmds.download.imageMagick";
-}
-class Xoi_cmd_msg_ok extends Gfo_thread_cmd_base implements Gfo_thread_cmd {
-	public Xoi_cmd_msg_ok(Gfo_usr_dlg usr_dlg, Gfui_kit kit, String msg) {this.msg = msg; this.Ctor(usr_dlg, kit);} private String msg;
-	@Override public boolean Async_term()	{
-		kit.Ask_ok("msg_ok", "msg", msg);
-		return true;
-	}
-	public static final String KEY = "msg.ok";
-}
-//	class Gfo_thread_exec_sync : Gfo_thread_cmd_base, Gfo_thread_cmd {
-//		public Gfo_thread_exec_sync(Gfo_usr_dlg usr_dlg, Gfui_kit kit, Io_url exec_url, String exec_args) {this.Ctor(usr_dlg, kit); this.exec_url = exec_url; this.exec_args = exec_args;} Io_url exec_url; String exec_args;
-//		public override byte Async_init() {
-//			if (!kit.Ask_yes_no(GRP_KEY, "confirm", "You are about to run '~{0}'. Please confirm that XOWA requested you to run '~{0}' and that you trust it to run on your machine.", exec_url.NameAndExt())) {
-//				usr_dlg.Warn_many(GRP_KEY, "confirm.fail", "program was untrusted: ~{0} ~{1}", exec_url.Raw(), exec_args);
-//				return Gfo_thread_cmd_.Init_cancel_all;
-//			}
-//			usr_dlg.Prog_many("exec_sync", "bgn", "running process. please wait; ~{0} ~{1}", exec_url.Raw(), exec_args);
-//			return Gfo_thread_cmd_.Init_ok;
-//		}
-//		public override void Async_run() {
-//			ProcessAdp process = new ProcessAdp().Exe_url_(exec_url).Args_str_(exec_args).Prog_dlg_(usr_dlg);
-//			process.Run_mode_(ProcessAdp.Run_mode_sync_block);
-//			process.Run();
-//		}
-//		public static final String KEY = "exec.sync";
-//		static final String GRP_KEY = "exec.sync";
-//	}
-class Xoi_cmd_wiki_zip implements Gfo_thread_cmd {
-	public Xoi_cmd_wiki_zip(Xoi_setup_mgr install_mgr, String wiki_key, String wiki_date, String dump_type) {this.install_mgr = install_mgr; this.Owner_(install_mgr); this.wiki_key = wiki_key; this.wiki_date = wiki_date; this.dump_type = dump_type;} private Xoi_setup_mgr install_mgr; String wiki_key, wiki_date, dump_type;
-	public static final String KEY = "wiki.zip";
-	public void Cmd_ctor() {}
-	public String Async_key() {return KEY;}
-	public int Async_sleep_interval()	{return Gfo_thread_cmd_.Async_sleep_interval_1_second;}
-	public boolean Async_prog_enabled()	{return false;}
-	public void Async_prog_run(int async_sleep_sum) {}
-	public byte Async_init() {return Gfo_thread_cmd_.Init_ok;}
-	public boolean Async_term() {
-		wiki.Tdb_fsys_mgr().Scan_dirs();
-		install_mgr.App().Usr_dlg().Log_many(GRP_KEY, "zip.end", "zip.end ~{0}", wiki_key);
-		install_mgr.App().Usr_dlg().Prog_many(GRP_KEY, "zip.done", "zip done");
-		return true;
-	}
-	public GfoInvkAble Owner() {return owner;} public Xoi_cmd_wiki_zip Owner_(GfoInvkAble v) {owner = v; return this;} GfoInvkAble owner;
-	public Gfo_thread_cmd Async_next_cmd() {return next_cmd;} public void Async_next_cmd_(Gfo_thread_cmd v) {next_cmd = v;} Gfo_thread_cmd next_cmd;
-	public void Async_run() {
-		running = true;
-		install_mgr.App().Usr_dlg().Log_many(GRP_KEY, "zip.bgn", "zip.bgn ~{0}", wiki_key);
-		Thread_adp_.invk_(this.Async_key(), this, Invk_process_async).Start();
-	}
-	public boolean Async_running() {
-		return running;
-	}
-	boolean running, delete_dirs_page = true, notify_done = true;
-	private void Process_async() {
-		Xoae_app app = install_mgr.App();
-		Xob_bldr bldr = app.Bldr();
-		wiki = app.Wiki_mgr().Get_by_key_or_make(Bry_.new_a7(wiki_key));
-		wiki.Init_assert();
-		bldr.Cmd_mgr().Clear();
-		bldr.Pause_at_end_(false);
-		((Xob_deploy_zip_cmd)bldr.Cmd_mgr().Add_cmd(wiki, Xob_cmd_keys.Key_deploy_zip)).Delete_dirs_page_(delete_dirs_page);
-		bldr.Run();
-		app.Usr_dlg().Prog_none(GRP_KEY, "clear", "");
-		app.Usr_dlg().Note_none(GRP_KEY, "clear", "");
-		running = false;
-	}	private Xowe_wiki wiki;
-	public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) {
-		if		(ctx.Match(k, Invk_process_async))			Process_async();
-		else if	(ctx.Match(k, Invk_owner))					return owner;
-		else if	(ctx.Match(k, Invk_delete_dirs_page_))		delete_dirs_page = m.ReadYn("v");
-		else if	(ctx.Match(k, Invk_notify_done_))			notify_done = m.ReadYn("v");
-		else	return GfoInvkAble_.Rv_unhandled;
-		return this;
-	}	private static final String Invk_process_async = "run_async", Invk_owner = "owner", Invk_delete_dirs_page_ = "delete_dirs_page_", Invk_notify_done_ = "notify_done_";
-	private static final String GRP_KEY = "xowa.thread.op.wiki.zip";
-}
diff --git a/400_xowa/src_240_install/gplx/xowa/Xoi_cmd_wiki_download.java b/400_xowa/src_240_install/gplx/xowa/Xoi_cmd_wiki_download.java
new file mode 100644
index 000000000..6fd4f50e4
--- /dev/null
+++ b/400_xowa/src_240_install/gplx/xowa/Xoi_cmd_wiki_download.java
@@ -0,0 +1,53 @@
+/*
+XOWA: the XOWA Offline Wiki Application
+Copyright (C) 2012 gnosygnu@gmail.com
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU Affero General Public License as
+published by the Free Software Foundation, either version 3 of the
+License, or (at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU Affero General Public License for more details.
+
+You should have received a copy of the GNU Affero General Public License
+along with this program.  If not, see .
+*/
+package gplx.xowa; import gplx.*;
+import gplx.gfui.*;
+import gplx.core.threads.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.cmds.utils.*;
+class Xoi_cmd_wiki_download extends Gfo_thread_cmd_download implements Gfo_thread_cmd {	private Xoi_setup_mgr install_mgr; private String wiki_key, dump_date, dump_type;
+	public Xoi_cmd_wiki_download Ctor_download_(Xoi_setup_mgr install_mgr, String wiki_key, String dump_date, String dump_type) {
+		this.install_mgr = install_mgr;
+		this.wiki_key = wiki_key;
+		this.dump_date = dump_date;
+		this.dump_type = dump_type;
+		this.Owner_(install_mgr);
+		return this;
+	}
+	@gplx.Virtual public String Download_file_ext() {return ".xml.bz2";}	// wiki.download is primarily used for dump files; default to .xml.bz2; NOTE: changed from ".xml"; DATE:2013-11-07
+	@Override public String Async_key() {return Key_wiki_download;}  public static final String Key_wiki_download = "wiki.download";
+	@Override public byte Async_init() {
+		Xoae_app app = install_mgr.App();
+		Xob_dump_file dump_file = Xob_dump_file.new_(wiki_key, dump_date, dump_type);
+		boolean connected = Xob_dump_file_.Connect_first(dump_file, install_mgr.Dump_mgr().Server_urls());
+		if (connected)
+			app.Usr_dlg().Note_many("", "", "url: ~{0}", dump_file.File_url());
+		else {
+			if (!Dump_servers_offline_msg_shown) {
+				app.Gui_mgr().Kit().Ask_ok("", "", "all dump servers are offline: ~{0}", String_.AryXtoStr(install_mgr.Dump_mgr().Server_urls()));
+				Dump_servers_offline_msg_shown = true;
+			}
+		}
+		Xowe_wiki wiki = app.Wiki_mgr().Get_by_key_or_make(dump_file.Wiki_type().Domain_bry());
+		Io_url root_dir = wiki.Fsys_mgr().Root_dir();
+		Io_url[] trg_fil_ary = Io_mgr.I.QueryDir_args(root_dir).FilPath_("*." + dump_type + Download_file_ext() + "*").ExecAsUrlAry();
+		Io_url trg = trg_fil_ary.length == 0 ? root_dir.GenSubFil(dump_file.File_name()) : trg_fil_ary[0];
+		this.Ctor(app.Usr_dlg(), app.Gui_mgr().Kit());
+		this.Init("download", dump_file.File_url(), trg);
+		return super.Async_init();
+	}
+	private static boolean Dump_servers_offline_msg_shown = false;
+}
diff --git a/400_xowa/src_240_install/gplx/xowa/Xoi_cmd_wiki_goto_page.java b/400_xowa/src_240_install/gplx/xowa/Xoi_cmd_wiki_goto_page.java
new file mode 100644
index 000000000..3af1a1ab6
--- /dev/null
+++ b/400_xowa/src_240_install/gplx/xowa/Xoi_cmd_wiki_goto_page.java
@@ -0,0 +1,30 @@
+/*
+XOWA: the XOWA Offline Wiki Application
+Copyright (C) 2012 gnosygnu@gmail.com
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU Affero General Public License as
+published by the Free Software Foundation, either version 3 of the
+License, or (at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU Affero General Public License for more details.
+
+You should have received a copy of the GNU Affero General Public License
+along with this program.  If not, see .
+*/
+package gplx.xowa; import gplx.*;
+import gplx.core.threads.*;
+class Xoi_cmd_wiki_goto_page extends Gfo_thread_cmd_base implements Gfo_thread_cmd {
+	public Xoi_cmd_wiki_goto_page(Xoae_app app, String page) {this.app = app; this.page = page; this.Ctor(app.Usr_dlg(), app.Gui_mgr().Kit());} private Xoae_app app; String page;
+	@Override public void Async_run()	{kit.New_cmd_sync(this).Invk(GfsCtx.new_(), 0, Invk_goto_page, GfoMsg_.Null);}
+	private void Goto_page(String page)			{app.Gui_mgr().Browser_win().Page__navigate_by_url_bar(page);}
+	@Override public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) {
+		if		(ctx.Match(k, Invk_goto_page))				Goto_page(page);
+		else	return super.Invk(ctx, ikey, k, m);
+		return this;
+	}	private static final String Invk_goto_page = "goto_page";
+	public static final String KEY = "wiki.goto_page";
+}
diff --git a/400_xowa/src_240_install/gplx/xowa/Xoi_cmd_wiki_image_cfg.java b/400_xowa/src_240_install/gplx/xowa/Xoi_cmd_wiki_image_cfg.java
new file mode 100644
index 000000000..688e4182e
--- /dev/null
+++ b/400_xowa/src_240_install/gplx/xowa/Xoi_cmd_wiki_image_cfg.java
@@ -0,0 +1,28 @@
+/*
+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; import gplx.*;
+import gplx.core.threads.*;
+class Xoi_cmd_wiki_image_cfg extends Gfo_thread_cmd_replace implements Gfo_thread_cmd {	public Xoi_cmd_wiki_image_cfg(Xoae_app app, Io_url url) {this.app = app; super.Init(app.Usr_dlg(), app.Gui_mgr().Kit(), url);} private Xoae_app app;
+	@Override public void Async_run() {
+		super.Async_run();
+		app.Cfg_mgr().Set_by_app("app.files.download.enabled", "y");
+		app.Cfg_mgr().Db_save_txt();
+	}
+	static final String GRP_KEY = "xowa.thread.dump.image_cfg";
+	public static final String KEY_dump = "wiki.image_cfg";
+}
diff --git a/400_xowa/src_240_install/gplx/xowa/Xoi_cmd_wiki_tst.java b/400_xowa/src_240_install/gplx/xowa/Xoi_cmd_wiki_tst.java
index 04aef4dcf..40bbd5532 100644
--- a/400_xowa/src_240_install/gplx/xowa/Xoi_cmd_wiki_tst.java
+++ b/400_xowa/src_240_install/gplx/xowa/Xoi_cmd_wiki_tst.java
@@ -99,7 +99,7 @@ public class Xoi_cmd_wiki_tst {
 		bfr.Add_byte_pipe();
 		bfr.Add_str(dump_file.File_modified().XtoStr_fmt_yyyy_MM_dd_HH_mm());
 		bfr.Add_byte_pipe();
-//			bfr.Add_str(String_.ConcatWith_any(",", (Object[])dump_file.Dump_available_dates()));
+//			bfr.Add_str(String_.Concat_with_obj(",", (Object[])dump_file.Dump_available_dates()));
 //			bfr.Add_byte_pipe();
 		bfr.Add_str(dump_file.Dump_date());
 		bfr.Add_byte_nl();
diff --git a/400_xowa/src_240_install/gplx/xowa/Xoi_cmd_wiki_unzip.java b/400_xowa/src_240_install/gplx/xowa/Xoi_cmd_wiki_unzip.java
new file mode 100644
index 000000000..dbb4235fa
--- /dev/null
+++ b/400_xowa/src_240_install/gplx/xowa/Xoi_cmd_wiki_unzip.java
@@ -0,0 +1,50 @@
+/*
+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; import gplx.*;
+import gplx.gfui.*;
+import gplx.core.threads.*;
+class Xoi_cmd_wiki_unzip extends Gfo_thread_cmd_unzip implements Gfo_thread_cmd {	public static final String KEY_dump = "wiki.unzip";
+	public Xoi_cmd_wiki_unzip(Xoi_setup_mgr install_mgr, String wiki_key, String dump_date, String dump_type) {this.install_mgr = install_mgr; this.Owner_(install_mgr); this.wiki_key = wiki_key; this.dump_date = dump_date; this.dump_type = dump_type;} private Xoi_setup_mgr install_mgr; String wiki_key, dump_date, dump_type;
+	@Override public String Async_key() {return KEY_dump;}
+	@Override public byte Async_init() {
+		Xoae_app app = install_mgr.App(); Gfui_kit kit = app.Gui_mgr().Kit();
+		Xowe_wiki wiki = app.Wiki_mgr().Get_by_key_or_make(Bry_.new_u8(wiki_key));
+		Io_url wiki_dir = wiki.Import_cfg().Src_dir();
+		Io_url[] urls = Io_mgr.I.QueryDir_args(wiki_dir).Recur_(false).FilPath_("*.xml.bz2").ExecAsUrlAry();
+		if (urls.length == 0) {
+			kit.Ask_ok(GRP_KEY, "dump.unzip_latest.file_missing", "Could not find a dump file for ~{0} in ~{1}", wiki_key, wiki_dir.Raw());
+			return Gfo_thread_cmd_.Init_cancel_step;
+		}
+		Io_url src = urls[urls.length - 1];
+		Io_url trg = app.Fsys_mgr().Wiki_dir().GenSubFil_nest(wiki_key, src.NameOnly());	// NOTE: NameOnly() will strip trailing .bz2; EX: a.xml.bz2 -> a.xml
+		super.Init(app.Usr_dlg(), app.Gui_mgr().Kit(), app.Prog_mgr().App_decompress_bz2(), app.Prog_mgr().App_decompress_zip(), app.Prog_mgr().App_decompress_gz(), src, trg);
+		this.Term_cmd_for_src_(Term_cmd_for_src_move);
+		this.Term_cmd_for_src_url_(app.Fsys_mgr().Wiki_dir().GenSubFil_nest("#dump", "done", src.NameAndExt()));
+		if (Io_mgr.I.ExistsFil(trg)) {
+			int rslt = kit.Ask_yes_no_cancel(GRP_KEY, "target_exists", "Target file already exists: '~{0}'.\nDo you want to delete it?", trg.Raw());
+			switch (rslt) {
+				case Gfui_dlg_msg_.Btn_yes:		Io_mgr.I.DeleteFil(trg); break;
+				case Gfui_dlg_msg_.Btn_no:		return Gfo_thread_cmd_.Init_cancel_step;
+				case Gfui_dlg_msg_.Btn_cancel:	return Gfo_thread_cmd_.Init_cancel_all;
+				default:						throw Err_.new_unhandled(rslt);
+			}
+		}
+		return Gfo_thread_cmd_.Init_ok;
+	}
+	static final String GRP_KEY = "xowa.thread.dump.unzip";
+}
diff --git a/400_xowa/src_240_install/gplx/xowa/Xoi_cmd_wiki_zip.java b/400_xowa/src_240_install/gplx/xowa/Xoi_cmd_wiki_zip.java
new file mode 100644
index 000000000..56ce6515f
--- /dev/null
+++ b/400_xowa/src_240_install/gplx/xowa/Xoi_cmd_wiki_zip.java
@@ -0,0 +1,69 @@
+/*
+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; import gplx.*;
+import gplx.core.threads.*;
+import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.cmds.utils.*;
+class Xoi_cmd_wiki_zip implements Gfo_thread_cmd {
+	public Xoi_cmd_wiki_zip(Xoi_setup_mgr install_mgr, String wiki_key, String wiki_date, String dump_type) {this.install_mgr = install_mgr; this.Owner_(install_mgr); this.wiki_key = wiki_key; this.wiki_date = wiki_date; this.dump_type = dump_type;} private Xoi_setup_mgr install_mgr; String wiki_key, wiki_date, dump_type;
+	public static final String KEY = "wiki.zip";
+	public void Cmd_ctor() {}
+	public String Async_key() {return KEY;}
+	public int Async_sleep_interval()	{return Gfo_thread_cmd_.Async_sleep_interval_1_second;}
+	public boolean Async_prog_enabled()	{return false;}
+	public void Async_prog_run(int async_sleep_sum) {}
+	public byte Async_init() {return Gfo_thread_cmd_.Init_ok;}
+	public boolean Async_term() {
+		wiki.Tdb_fsys_mgr().Scan_dirs();
+		install_mgr.App().Usr_dlg().Log_many(GRP_KEY, "zip.end", "zip.end ~{0}", wiki_key);
+		install_mgr.App().Usr_dlg().Prog_many(GRP_KEY, "zip.done", "zip done");
+		return true;
+	}
+	public GfoInvkAble Owner() {return owner;} public Xoi_cmd_wiki_zip Owner_(GfoInvkAble v) {owner = v; return this;} GfoInvkAble owner;
+	public Gfo_thread_cmd Async_next_cmd() {return next_cmd;} public void Async_next_cmd_(Gfo_thread_cmd v) {next_cmd = v;} Gfo_thread_cmd next_cmd;
+	public void Async_run() {
+		running = true;
+		install_mgr.App().Usr_dlg().Log_many(GRP_KEY, "zip.bgn", "zip.bgn ~{0}", wiki_key);
+		Thread_adp_.invk_(this.Async_key(), this, Invk_process_async).Start();
+	}
+	public boolean Async_running() {
+		return running;
+	}
+	boolean running, delete_dirs_page = true, notify_done = true;
+	private void Process_async() {
+		Xoae_app app = install_mgr.App();
+		Xob_bldr bldr = app.Bldr();
+		wiki = app.Wiki_mgr().Get_by_key_or_make(Bry_.new_a7(wiki_key));
+		wiki.Init_assert();
+		bldr.Cmd_mgr().Clear();
+		bldr.Pause_at_end_(false);
+		((Xob_deploy_zip_cmd)bldr.Cmd_mgr().Add_cmd(wiki, Xob_cmd_keys.Key_deploy_zip)).Delete_dirs_page_(delete_dirs_page);
+		bldr.Run();
+		app.Usr_dlg().Prog_none(GRP_KEY, "clear", "");
+		app.Usr_dlg().Note_none(GRP_KEY, "clear", "");
+		running = false;
+	}	private Xowe_wiki wiki;
+	public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) {
+		if		(ctx.Match(k, Invk_process_async))			Process_async();
+		else if	(ctx.Match(k, Invk_owner))					return owner;
+		else if	(ctx.Match(k, Invk_delete_dirs_page_))		delete_dirs_page = m.ReadYn("v");
+		else if	(ctx.Match(k, Invk_notify_done_))			notify_done = m.ReadYn("v");
+		else	return GfoInvkAble_.Rv_unhandled;
+		return this;
+	}	private static final String Invk_process_async = "run_async", Invk_owner = "owner", Invk_delete_dirs_page_ = "delete_dirs_page_", Invk_notify_done_ = "notify_done_";
+	private static final String GRP_KEY = "xowa.thread.op.wiki.zip";
+}
diff --git a/400_xowa/src_400_parser/gplx/xowa/TstObj_tst.java b/400_xowa/src_400_parser/gplx/xowa/TstObj_tst.java
index 4245b9e3e..a6b484698 100644
--- a/400_xowa/src_400_parser/gplx/xowa/TstObj_tst.java
+++ b/400_xowa/src_400_parser/gplx/xowa/TstObj_tst.java
@@ -105,7 +105,7 @@ public class TstObj_tst {
 			}
 		}
 		if (pass) return;
-		throw Err_.new_wo_type(Op_sys.Lnx.Nl_str() + sb.XtoStr());
+		throw Err_.new_wo_type(Op_sys.Lnx.Nl_str() + sb.To_str());
 	}
 	private static void Eval(List_adp rslts, TstRuleMgr ruleMgr, Ordered_hash props, String idx, TstObj expd, TstObj actl) {
 		int expdLen = expd.Atrs().Count();
diff --git a/400_xowa/src_400_parser/gplx/xowa/Xoa_ttl.java b/400_xowa/src_400_parser/gplx/xowa/Xoa_ttl.java
index ea90d8820..704f8d940 100644
--- a/400_xowa/src_400_parser/gplx/xowa/Xoa_ttl.java
+++ b/400_xowa/src_400_parser/gplx/xowa/Xoa_ttl.java
@@ -400,7 +400,7 @@ class Xoa_url_encoder {
 }
 class Xoa_ttl_trie {
 	public static Btrie_fast_mgr new_() {
-		Btrie_fast_mgr rv = Btrie_fast_mgr.cs_();
+		Btrie_fast_mgr rv = Btrie_fast_mgr.cs();
 		rv.Add(Byte_ascii.Colon				, Byte_obj_val.new_(Id_colon));
 		rv.Add(Byte_ascii.Hash				, Byte_obj_val.new_(Id_hash));
 		rv.Add(Byte_ascii.Slash				, Byte_obj_val.new_(Id_slash));
diff --git a/400_xowa/src_400_parser/gplx/xowa/Xop_lxr_mgr.java b/400_xowa/src_400_parser/gplx/xowa/Xop_lxr_mgr.java
index f98e482ca..6f4d52616 100644
--- a/400_xowa/src_400_parser/gplx/xowa/Xop_lxr_mgr.java
+++ b/400_xowa/src_400_parser/gplx/xowa/Xop_lxr_mgr.java
@@ -21,7 +21,7 @@ import gplx.xowa.parsers.apos.*; import gplx.xowa.parsers.amps.*; import gplx.xo
 public class Xop_lxr_mgr {
 	private Xop_lxr[] ary;
 	public Xop_lxr_mgr(Xop_lxr[] ary) {this.ary = ary;}
-	public Btrie_fast_mgr Trie() {return trie;} private Btrie_fast_mgr trie = Btrie_fast_mgr.cs_();
+	public Btrie_fast_mgr Trie() {return trie;} private Btrie_fast_mgr trie = Btrie_fast_mgr.cs();
 	public void Init_by_wiki(Xowe_wiki wiki) {
 		int ary_len = ary.length;
 		for (int i = 0; i < ary_len; i++) {
diff --git a/400_xowa/src_409_tkn_misc/gplx/xowa/Xop_under_lxr.java b/400_xowa/src_409_tkn_misc/gplx/xowa/Xop_under_lxr.java
index 427ab5127..beb91161e 100644
--- a/400_xowa/src_409_tkn_misc/gplx/xowa/Xop_under_lxr.java
+++ b/400_xowa/src_409_tkn_misc/gplx/xowa/Xop_under_lxr.java
@@ -71,7 +71,7 @@ class Xop_under_lxr implements Xop_lxr {
 	, Xol_kwd_grp_.Id_hiddencat, Xol_kwd_grp_.Id_index, Xol_kwd_grp_.Id_noindex, Xol_kwd_grp_.Id_staticredirect
 	, Xol_kwd_grp_.Id_disambig
 	};
-	private static final Btrie_fast_mgr Hook_trie = Btrie_fast_mgr.cs_()
+	private static final Btrie_fast_mgr Hook_trie = Btrie_fast_mgr.cs()
 	.Add(Xop_under_hook.Key_std, Xop_under_hook.Itm_std)
 	.Add(Xop_under_hook.Key_alt, Xop_under_hook.Itm_alt)
 	;
diff --git a/400_xowa/src_440_lnki/gplx/xowa/Xop_lnki_arg_parser.java b/400_xowa/src_440_lnki/gplx/xowa/Xop_lnki_arg_parser.java
index 0cbf0b067..e643c0085 100644
--- a/400_xowa/src_440_lnki/gplx/xowa/Xop_lnki_arg_parser.java
+++ b/400_xowa/src_440_lnki/gplx/xowa/Xop_lnki_arg_parser.java
@@ -19,9 +19,9 @@ package gplx.xowa; import gplx.*;
 import gplx.core.primitives.*; import gplx.core.btries.*;
 import gplx.xowa.langs.numbers.*;
 public class Xop_lnki_arg_parser {
-	private final Btrie_fast_mgr key_trie = Btrie_fast_mgr.cs_();
+	private final Btrie_fast_mgr key_trie = Btrie_fast_mgr.cs();
 	private final Bry_bfr int_bfr = Bry_bfr.reset_(16);
-	private final Btrie_bwd_mgr px_trie = Btrie_bwd_mgr.cs_(); private final Btrie_fast_mgr size_trie = Btrie_fast_mgr.cs_();
+	private final Btrie_bwd_mgr px_trie = Btrie_bwd_mgr.cs_(); private final Btrie_fast_mgr size_trie = Btrie_fast_mgr.cs();
 	private int lnki_w, lnki_h;
 	public void Evt_lang_changed(Xol_lang lang) {
 		Bry_bfr tmp_bfr = int_bfr;
@@ -75,8 +75,8 @@ public class Xop_lnki_arg_parser {
 				byte b = src[i];
 				Object o = size_trie.Match_bgn_w_byte(b, src, i, itm_end);
 				if (o == null) {
-					this.lnki_w = 0;		// NOTE: must null out width; EX: "123xTextpx"; PAGE:es.b:Alimentación_infantil; DATE:2015-07-10
-					return Tid_caption;		// letter or other invalid character; return caption
+					this.lnki_w = Xop_lnki_tkn.Width_null;	// NOTE: must null out width; EX: "123xTextpx"; PAGE:es.b:Alimentación_infantil; DATE:2015-07-10; NOTE: must be -1, not 0; DATE:2015-08-05
+					return Tid_caption;						// letter or other invalid character; return caption
 				}
 				Byte_obj_val v = (Byte_obj_val)o;
 				switch (v.Val()) {	// NOTE: d0 - d9 handle non-english numbers; EX:fa.w and ۲۰۰px; DATE:2015-07-18
diff --git a/400_xowa/src_440_lnki/gplx/xowa/Xop_lnki_type.java b/400_xowa/src_440_lnki/gplx/xowa/Xop_lnki_type.java
index 5a31889d8..f1ac58fae 100644
--- a/400_xowa/src_440_lnki/gplx/xowa/Xop_lnki_type.java
+++ b/400_xowa/src_440_lnki/gplx/xowa/Xop_lnki_type.java
@@ -30,7 +30,7 @@ public class Xop_lnki_type {
 			return true;
 		else if (	Enm_.HasInt(id, Id_frame)		// [[File:A.png|frame]]     -> 400,200 (frame is always default size)
 				||	id == Id_null					// [[File:A.png]]           -> 400,200 (default to original size)
-				||	Enm_.HasInt(id, Id_none)		// TODO: deprecate
+				||	Enm_.HasInt(id, Id_none)		// TODO: deprecate; NOTE: still used by one test; DATE:2015-08-03
 				)
 			return false;
 		else										// should not happen
@@ -43,7 +43,7 @@ public class Xop_lnki_type {
 				)
 			return true;
 		else if (	id == Id_null					// [[File:A.png|600px]]            -> 600,400; uses orig file of 400,200, but  tag src_width / src_height set to 600,400
-				||	Enm_.HasInt(id, Id_none)		// TODO: deprecate
+				||	Enm_.HasInt(id, Id_none)		// TODO: deprecate; NOTE: leaving in b/c of above failed-deprecate; DATE:2015-08-03
 				)
 			return false;
 		else										// should not happen;
diff --git a/400_xowa/src_440_lnki/gplx/xowa/Xop_lnki_wkr__basic_tst.java b/400_xowa/src_440_lnki/gplx/xowa/Xop_lnki_wkr__basic_tst.java
index 6e6af0777..50cba54a4 100644
--- a/400_xowa/src_440_lnki/gplx/xowa/Xop_lnki_wkr__basic_tst.java
+++ b/400_xowa/src_440_lnki/gplx/xowa/Xop_lnki_wkr__basic_tst.java
@@ -65,45 +65,6 @@ public class Xop_lnki_wkr__basic_tst {
 			.Caption_tkn_(fxt.tkn_arg_nde_(22, 25).Val_tkn_(fxt.tkn_arg_itm_(fxt.tkn_txt_(22, 23), fxt.tkn_space_(23, 24), fxt.tkn_txt_(24, 25)))))
 			;
 	}
-	@Test  public void Thumbtime() {
-		fxt.Test_parse_page_wiki("[[File:A.ogv|thumbtime=123]]", fxt.tkn_lnki_().Thumbtime_(123));
-		fxt.Test_parse_page_wiki("[[File:A.ogv|thumbtime=1:23]]", fxt.tkn_lnki_().Thumbtime_(83));
-		fxt.Test_parse_page_wiki("[[File:A.ogv|thumbtime=1:01:01]]", fxt.tkn_lnki_().Thumbtime_(3661));
-		fxt.Init_log_(Xop_lnki_log.Upright_val_is_invalid).Test_parse_page_wiki("[[File:A.ogv|thumbtime=a]]", fxt.tkn_lnki_().Thumbtime_(-1));
-	}
-	@Test  public void Width_ws() {
-		fxt.Test_parse_page_wiki("[[Image:a| 123 px]]"		, fxt.tkn_lnki_().Width_(123));
-	}
-	@Test  public void Height() {
-		fxt.Test_parse_page_wiki("[[Image:a|x40px]]"			, fxt.tkn_lnki_().Height_(40).Width_(-1));
-	}
-	@Test  public void Size_double_px_ignored() {
-		fxt.Test_parse_page_wiki("[[Image:a|40pxpx]]"		, fxt.tkn_lnki_().Width_(40).Height_(-1));
-	}
-	@Test  public void Size_px_px_ignored() {
-		fxt.Test_parse_page_wiki("[[Image:a|40px20px]]"		, fxt.tkn_lnki_().Width_(-1).Height_(-1));
-	}
-	@Test  public void Size_double_px_ws_allowed() {
-		fxt.Test_parse_page_wiki("[[Image:a|40pxpx  ]]"		, fxt.tkn_lnki_().Width_(40).Height_(-1));
-	}
-	@Test  public void Size_double_px_ws_allowed_2() {	// PURPOSE: handle ws between px's; EX:sv.w:Drottningholms_slott; DATE:2014-03-01
-		fxt.Test_parse_page_wiki("[[Image:a|40px px]]"		, fxt.tkn_lnki_().Width_(40).Height_(-1));
-	}
-	@Test  public void Size_large_numbers() {	// PURPOSE: perf code identified large sizes as caption; DATE:2014-02-15
-		fxt.Test_parse_page_wiki("[[Image:a|1234567890x1234567890px]]"		, fxt.tkn_lnki_().Width_(1234567890).Height_(1234567890));
-	}
-	@Test  public void Size_dangling_xnde() {	// PURPOSE: dangling xnde should not eat rest of lnki; PAGE:sr.w:Сићевачка_клисура DATE:2014-07-03
-		fxt.Init_log_(Xop_xnde_log.Dangling_xnde).Test_parse_page_wiki("[[Image:a.png|c|40px]]"	, fxt.tkn_lnki_().Width_(40).Height_(-1));
-	}
-	@Test   public void Size_ws_para() {	// PURPOSE: 

in arg_bldr causes parse to fail; EX: w:Supreme_Court_of_the_United_States; DATE:2014-04-05; updated test; DATE:2015-03-31 - fxt.Init_para_y_(); - fxt.Test_parse_page_all("[[File:A.png| \n 40px]]" - , fxt.tkn_para_bgn_para_(0) - , fxt.tkn_lnki_().Width_(40).Height_(-1) - , fxt.tkn_para_end_para_(22)); - fxt.Init_para_n_(); - } - @Test public void Image_upright() { fxt.Test_parse_page_wiki("[[Image:a|upright=.123]]" , fxt.tkn_lnki_().Upright_(.123)); fxt.Test_parse_page_wiki("[[Image:a|upright]]" , fxt.tkn_lnki_().Upright_(gplx.xowa.files.Xof_img_size.Upright_default_marker)); // no eq tokn diff --git a/400_xowa/src_440_lnki/gplx/xowa/Xop_lnki_wkr__size_tst.java b/400_xowa/src_440_lnki/gplx/xowa/Xop_lnki_wkr__size_tst.java new file mode 100644 index 000000000..0574319d9 --- /dev/null +++ b/400_xowa/src_440_lnki/gplx/xowa/Xop_lnki_wkr__size_tst.java @@ -0,0 +1,63 @@ +/* +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; import gplx.*; +import org.junit.*; +public class Xop_lnki_wkr__size_tst { + @Before public void init() {fxt.Reset(); fxt.Init_para_n_();} private final Xop_fxt fxt = new Xop_fxt(); + @Test public void Width__w__ws() { + fxt.Test_parse_page_wiki("[[Image:a| 123 px]]" , fxt.tkn_lnki_().Width_(123)); + } + @Test public void Height() { + fxt.Test_parse_page_wiki("[[Image:a|x40px]]" , fxt.tkn_lnki_().Height_(40).Width_(-1)); + } + @Test public void Invalid_px__accept_double() { + fxt.Test_parse_page_wiki("[[Image:a|40pxpx]]" , fxt.tkn_lnki_().Width_(40).Height_(-1)); + } + @Test public void Invalid_px__accept_double__w_ws() { + fxt.Test_parse_page_wiki("[[Image:a|40pxpx ]]" , fxt.tkn_lnki_().Width_(40).Height_(-1)); + } + @Test public void Invalid_px__accept_double__w_ws_2() {// PURPOSE: handle ws between px's; EX:sv.w:Drottningholms_slott; DATE:2014-03-01 + fxt.Test_parse_page_wiki("[[Image:a|40px px]]" , fxt.tkn_lnki_().Width_(40).Height_(-1)); + } + @Test public void Invalid_px__ignore_if_w() { + fxt.Test_parse_page_wiki("[[Image:a|40px20px]]" , fxt.tkn_lnki_().Width_(-1).Height_(-1)); // -1 b/c "40px" + } + @Test public void Large_number() { // PURPOSE: perf code identified large sizes as caption; DATE:2014-02-15 + fxt.Test_parse_page_wiki("[[Image:a|1234567890x1234567890px]]" , fxt.tkn_lnki_().Width_(1234567890).Height_(1234567890)); + } + @Test public void Large_number__discard_if_gt_int() { // PURPOSE: size larger than int should be discarded, not be Int_.MaxValue: PAGE:id.w:Baho; DATE:2014-06-10 + fxt.Test_html_wiki_frag("[[File:A.png|9999999999x30px]]", " width=\"0\" height=\"30\""); // width should not be Int_.MaxValue + } + @Test public void Dangling_xnde() { // PURPOSE: dangling xnde should not eat rest of lnki; PAGE:sr.w:Сићевачка_клисура DATE:2014-07-03 + fxt.Init_log_(Xop_xnde_log.Dangling_xnde).Test_parse_page_wiki("[[Image:a.png|c|40px]]" , fxt.tkn_lnki_().Width_(40).Height_(-1)); + } + @Test public void Ws_para() { // PURPOSE:

in arg_bldr causes parse to fail; EX: w:Supreme_Court_of_the_United_States; DATE:2014-04-05; updated test; DATE:2015-03-31 + fxt.Init_para_y_(); + fxt.Test_parse_page_all("[[File:A.png| \n 40px]]" + , fxt.tkn_para_bgn_para_(0) + , fxt.tkn_lnki_().Width_(40).Height_(-1) + , fxt.tkn_para_end_para_(22)); + fxt.Init_para_n_(); + } + @Test public void Invalid_size() { // PURPOSE: handle invalid sizes + fxt.Test_parse_page_wiki("[[File:A.png|1234xSomeTextpx]]" , fxt.tkn_lnki_().Width_(-1).Height_(-1)); // PAGE:es.b:Alimentación_infantil; DATE:2015-07-10 + fxt.Test_parse_page_wiki("[[File:A.png|100 KBpx]]" , fxt.tkn_lnki_().Width_(-1).Height_(-1)); // PAGE:en.w:Bahamas; DATE:2015-08-05 + fxt.Test_parse_page_wiki("[[File:A.png|size100px]]" , fxt.tkn_lnki_().Width_(-1).Height_(-1)); // PAGE:en.w:Data_compression; DATE:2015-08-05 + fxt.Test_parse_page_wiki("[[File:A.png|20\n0px]]" , fxt.tkn_lnki_().Width_(-1).Height_(-1)); // PAGE:en.w:Double_bass; DATE:2015-08-05 + } +} diff --git a/400_xowa/src_440_lnki/gplx/xowa/Xop_lnki_wkr__uncommon_tst.java b/400_xowa/src_440_lnki/gplx/xowa/Xop_lnki_wkr__uncommon_tst.java index 5a8763788..ef16f0adb 100644 --- a/400_xowa/src_440_lnki/gplx/xowa/Xop_lnki_wkr__uncommon_tst.java +++ b/400_xowa/src_440_lnki/gplx/xowa/Xop_lnki_wkr__uncommon_tst.java @@ -47,15 +47,9 @@ public class Xop_lnki_wkr__uncommon_tst { @Test public void Toc_fails() { // PURPOSE: null ref when writing hdr with lnki inside xnde; EX:pl.d:head_sth_off;DATE:2014-05-07 fxt.Test_parse_page_all_str("== [[A]] ==", "

A

\n"); } - @Test public void Large_size() { // PURPOSE: size larger than int should be discard, not be Int_.MaxValue: PAGE:id.w:Baho; DATE:2014-06-10 - fxt.Test_html_wiki_frag("[[File:A.png|9999999999x30px]]", " width=\"0\" height=\"30\""); // width should not be Int_.MaxValue - } @Test public void Upright_is_large() { // PURPOSE: handle large upright which overflows int; PAGE:de.w:Feuerland DATE:2015-02-03 fxt.Test_html_wiki_frag("[[File:A.png|upright=1.333333333333333333333333333333333333333333333333333333333333333333333]]", " width=\"0\" height=\"0\""); // failure would print out original lnki } - @Test public void Mistaken_x_px() { // PURPOSE: 1234xTextpx interpreted as size; PAGE:es.b:Alimentación_infantil; DATE:2015-07-10 - fxt.Test_html_wiki_frag("[[File:A.png|1234xSomeTextpx]]", " width=\"0\" height=\"0\""); // width should be 0 - } @Test public void Persian() { // PURPOSE: handle il8n nums; EX:[[پرونده:Shahbazi 3.jpg|۲۰۰px]] -> 200px; PAGE:fa.w:فهرست_آثار_علیرضا_شاپور_شهبازی; DATE:2015-07-18 Xol_lang lang = fxt.Wiki().Lang(); fxt.App().Gfs_mgr().Run_str_for(lang, gplx.xowa.xtns.pfuncs.numbers.Pf_formatnum_fa_tst.Persian_numbers_gfs); diff --git a/400_xowa/src_440_lnki/gplx/xowa/Xop_lnki_wkr__video_tst.java b/400_xowa/src_440_lnki/gplx/xowa/Xop_lnki_wkr__video_tst.java new file mode 100644 index 000000000..f9fca27dd --- /dev/null +++ b/400_xowa/src_440_lnki/gplx/xowa/Xop_lnki_wkr__video_tst.java @@ -0,0 +1,31 @@ +/* +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; import gplx.*; +import org.junit.*; import gplx.xowa.files.*; +public class Xop_lnki_wkr__video_tst { + @Before public void init() {fxt.Reset(); fxt.Init_para_n_();} private Xop_fxt fxt = new Xop_fxt(); + @Test public void Thumbtime() { + fxt.Test_parse_page_wiki("[[File:A.ogv|thumbtime=123]]" , fxt.tkn_lnki_().Thumbtime_(123)); + fxt.Test_parse_page_wiki("[[File:A.ogv|thumbtime=1:23]]" , fxt.tkn_lnki_().Thumbtime_(83)); + fxt.Test_parse_page_wiki("[[File:A.ogv|thumbtime=1:01:01]]" , fxt.tkn_lnki_().Thumbtime_(3661)); + fxt.Init_log_(Xop_lnki_log.Upright_val_is_invalid).Test_parse_page_wiki("[[File:A.ogv|thumbtime=a]]", fxt.tkn_lnki_().Thumbtime_(-1)); + } + @Test public void Size__null() { // NOTE: make sure that no size defaults to -1; needed for Xof_img_size logic of defaulting -1 to orig_w; DATE:2015-08-07 + fxt.Test_parse_page_wiki("[[File:A.ogv]]" , fxt.tkn_lnki_().Width_(Xof_img_size.Size__neg1)); + } +} diff --git a/400_xowa/src_490_xnde/gplx/xowa/Xop_xnde_wkr__nowiki_tst.java b/400_xowa/src_490_xnde/gplx/xowa/Xop_xnde_wkr__nowiki_tst.java index 49e80f687..b683b6a8a 100644 --- a/400_xowa/src_490_xnde/gplx/xowa/Xop_xnde_wkr__nowiki_tst.java +++ b/400_xowa/src_490_xnde/gplx/xowa/Xop_xnde_wkr__nowiki_tst.java @@ -46,7 +46,7 @@ public class Xop_xnde_wkr__nowiki_tst { )); } @Test public void Lnke() { // PAGE:en.w:Doomsday_argument; [0, 1] - fxt.Test_parse_page_wiki_str("a [0, 1] b", "a [0, 1] b"); // NOTE: not "0" + Byte_.XtoStr(160) + "1"; depend on browser to translate   + fxt.Test_parse_page_wiki_str("a [0, 1] b", "a [0, 1] b"); // NOTE: not "0" + Byte_.To_str(160) + "1"; depend on browser to translate   } @Test public void Xatrs_val_text() { fxt.Test_parse_page_all_str diff --git a/400_xowa/src_500_tmpl/gplx/xowa/Xop_curly_bgn_lxr.java b/400_xowa/src_500_tmpl/gplx/xowa/Xop_curly_bgn_lxr.java index 2c3123325..18530e723 100644 --- a/400_xowa/src_500_tmpl/gplx/xowa/Xop_curly_bgn_lxr.java +++ b/400_xowa/src_500_tmpl/gplx/xowa/Xop_curly_bgn_lxr.java @@ -24,7 +24,7 @@ public class Xop_curly_bgn_lxr implements Xop_lxr { public int Make_tkn(Xop_ctx ctx, Xop_tkn_mkr tkn_mkr, Xop_root_tkn root, byte[] src, int src_len, int bgn_pos, int cur_pos) {return ctx.Curly().MakeTkn_bgn(ctx, tkn_mkr, root, src, src_len, bgn_pos, cur_pos);} public static final Xop_curly_bgn_lxr _ = new Xop_curly_bgn_lxr(); Xop_curly_bgn_lxr() {} public static Btrie_fast_mgr tmpl_bgn_trie_() { // hook sequences for adding new_line to tmpl return; "{|" "|-" ":" ";" "#" "*"; EX: "{{a}}" returns "*"; convert to "\n*" - Btrie_fast_mgr rv = Btrie_fast_mgr.cs_(); + Btrie_fast_mgr rv = Btrie_fast_mgr.cs(); rv.Add(Xop_tblw_lxr_ws.Hook_tb, Bry_.Empty); rv.Add(Bry_.new_a7("|-"), Bry_.Empty); rv.Add(Byte_ascii.Colon, Bry_.Empty); diff --git a/400_xowa/src_500_tmpl/gplx/xowa/Xot_defn_trace_brief_tst.java b/400_xowa/src_500_tmpl/gplx/xowa/Xot_defn_trace_brief_tst.java index 8d73e8f11..56d53ef97 100644 --- a/400_xowa/src_500_tmpl/gplx/xowa/Xot_defn_trace_brief_tst.java +++ b/400_xowa/src_500_tmpl/gplx/xowa/Xot_defn_trace_brief_tst.java @@ -45,7 +45,7 @@ class Xot_defn_trace_fxt { String[] actl_ary = String_.Split(tmp.Xto_str_and_clear(), (char)Byte_ascii.Nl); Tfds.Eq_ary(expd_ary, actl_ary); } private Bry_bfr tmp = Bry_bfr.new_(); - String[] XtoStr(Xot_defn_trace_itm_brief[] ary) { + String[] To_str(Xot_defn_trace_itm_brief[] ary) { String[] rv = new String[ary.length]; for (int i = 0; i < rv.length; i++) { Xot_defn_trace_itm_brief itm = ary[i]; diff --git a/400_xowa/xtn/gplx/xowa/Xowa_main.java b/400_xowa/xtn/gplx/xowa/Xowa_main.java index d05f927fc..6b40995ad 100644 --- a/400_xowa/xtn/gplx/xowa/Xowa_main.java +++ b/400_xowa/xtn/gplx/xowa/Xowa_main.java @@ -16,8 +16,9 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa; + public class Xowa_main { - public static void main(String[] args) { - gplx.xowa.Xoa_app_.Run(args); + public static void main(String[] args) { + gplx.xowa.Xoa_app_.Run(args); } } diff --git a/tst/400_xowa/root/wiki/en.wikipedia.org/en.wikipedia.org-file-user.xowa b/tst/400_xowa/root/wiki/en.wikipedia.org/en.wikipedia.org-file-user.xowa deleted file mode 100644 index 8f994b9e36b8f16b8874bbfb72bcb3db63e2b7fc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 57344 zcmeI)&2QW09S3kJCjCy)NuxNa;hIV6R$5HOQlwPr7Ia?c0YOq{O=I*0!vs=%BoWbD zNjkRL4ujL}AJ}E50mJ$y?6Bj8T{fV=PCM){U|0`56zHY9Y^Uw_@I~T_*6m`kLj8JC`3eG)Jo) zSZ(F8X4PAol`B;$`S>|_BSmlb^id#xEH2NjURzHe-#5DkJ94Msv^q6!^uey=&vSq8 z&g=WT%ALLM@4n?tchpw7zc)OjYqI>4`jQL%^GhRW z>Ju8AtlF;2fSMf-|K2TyL`(u@=xAe@N%0T<(5KjZs~n7nOlA|=XXyq#%>>ek>KKq zwj|2qM^1NwH;=NTNw*e{o|rD)fX{X49l!5*g9-WMp{M1Ow>cr7kLKrA^K|pBkMe1l zR?Quf%S(F;K5yuz9kv;!k&Y-ie%MPK-wI5(6uw7kJYJh~)A(dzltu~#*O^bIk)o7F zuX`dju{82l!6g%IDUCdSf^`1$QV1w_<#ByxGK$ z*Zlk9n2T%v#kJXS7uVd2(}(tHE`HKyd;Xy?%NN1B?i%P>X0v9oX06uI%xaYV zJDPJ~PYl!jI&OuyUB`ZkyOFUU=GaK4z*gn;S&dYGd@V< zugD-ck`9h2Ievzw)!$P1#v?ZHHXdv3{BbtzEvKKj^g);4{Y->DI7;;X8Hdw|e-`-{ zIx$YyAI4*u%k$biyZn!o{7?DM@^9py${qO)`P=ep=8Mc9GC#|_lUd7%(x=j2q~A&d z=`HCwYKj*GAOHafKmY;|fB*y_0D-Tg!0oKCnZL{Hse;}%tb(Dt)ge8CVeXR$)-4>G zkIX(ZOs&wfnktW|2R5?`yi@f&b>9hhulFogJGr~tbK@E6DTjO7^%m=Bwa3h|&0e=u zJtu5t_rndE^w^+Yz1gUiOAXa1->9f%y;xDJ^;;#iRKBsT*SB9P-)fXDofS6M&W3yX z50cg5g%x4*k`xYgZFFQgR4X@cm2}2#7Ar56bIa8I+US~ocm9C2w7p&AziQjX zB5l9CBwXLvO|&!)I(;-e&gpqHz7Hn&`_r)Qlc~UJ_67 z)dk`D+FGJVke5QWP%IR$%+ugQVE*7ame%cc2c6!5ePK?>z9{nr(bt@MtI+kHISww) z3fXJ!aWCZsdVpKtqaLh?LUzrK_-%`q1tELeT_#>K`t+!$<4lU;bG7Ncw^Fx6FGPIdflL$$Xai-PiFp$Cw}h0SG_< z0uX=z1Rwx`|1*JCL@M>uqr&b>*816(ssB!-|7nZ;^Ovcs9O)XX_Mf4XXZIs5PFwDu zTNA0=k8~Z@`)4nTRPRS(UctYzLD$=e1R@o`d_km&KN9C9f94gDO8(H{FIn?T-=hB4 zlKsaN{mb7GspwBOJyq4eR1&G`Pj)_`>|fjzsq9a7iPrrK&(j3LZsQ97`HLbI{^?}p zKliLimA@N^m;SToL@NE=P*D4eS4FD*-4RVJ{)HDrD*lsgV%7i5C6TIsw^>l-`{n&8<1Rwwb z2tWV=5P$##AOHafKwt_5@c;j(FsYal1Rwwb2tWV=5P$##AOHafKp-Z7pZ^~N!7c(P=j9LmBIS689-@5} z#3JA4efhrpJd})wO7!+y4-JPYjjq*E9pzr^Vk{nyeM?bdu~?k`rs;3+kZ3~)cIcVM zpZAEz@_%`W50nzSF}aogLi)S(^VAoq_gDV2qAq`){4jYt@iB$)fB*y_009WR00O6? zl*ry$kDop=Or4!HY+b84txm1hJvNyY?55v%yubHkUpYK@@YdnJ^5Edx``=fBpx;+{ zbTDjEw)ipJL(~j?Tj6`b^Rc(<7#-$q_0%TIJ*%e@+4c4KPp>~e# zAMOvQS>E!GtQe-ln#@uT9z9VG4j(>LzWeyWn|qJnQNFYP&ayX6u$oX`KYlzb(3%zC zr=aNFKCO2+v41drPP2w-hFK$JL!Z^bHh#zy&1lj|O&_<@)s2S1bmggP)my5yRocl- z_i3qiYZ%`tj>U7%ikIyCDA^68J)UgZP0dX9sP8b@)TC_j_JDU=;d`dav&**(J@@Q; z%U*8dquf%+%`H8zgmX)+lv{6jNNFm!yjL)Js4u01$4?w{hBuG06X%TRnd#!g`MD0g z%azI)xHtQZeDbl+%O~%1Mm~>{iENHuyz8TU>V{Qwm*n!&-m=d-_M#p38K#k1lr7%u zC5~?errQeNqconbU2xO*EICReg@SpK;WSc|(&!BjrDiIPyjL(~s4u0F$IpftJjBLp+SqX32$hqBG+(|1dt4xg4*}v#F0_@@Mkz@;Bt0>3^sH zl>SZnD7}|nkp3q9QTna)q4ciwnk1(FK;7|x00bZa0SG_<0uX=z1R(I`2`E`1ck2qT zj0##?w+g&aZ>xiD->K2<9@b#T)m33Lw>RpcYi=dTqi!wE%)+s8Wb~MBsD-Z8%=1Wr z_pfHAN7lO*bC3I+ksDWOq&z;SU2n0DT6@YY+vu9*>J?!#b2#3iNjFYjt~c&i?rX(- zv0AR@cZ$0#uT~rP^Tm6+s#+@E)Ab$g`ek8r?b7(jo@()X5BbvSC1LZrG#)Z-3fSux zX|j#+c4yFI?rGZHcK50*Y+jl;B0t!xY2ohp3TM8ofl=Jbd2yS(LMvBdw>ilq{5zmgK}ZtRD8>itg7SLW%- zw^fJPPM+Tjw)1qxM!n7K;)-zhRz5VA52)!~ep_TZySJ8wyK8Hq5kX!G)k3LIx|yWK zkAeA%@7v5$&8|715<3gq~5g0qTJy@n!Y&P{lOkR@> zxgsCP@5{fWdjX%M{vjPmf0llo`knMMX7VIJ`d{f!)4%xgUgkJ51Rwwb z2tWV=5P$##An<=Ba8sm0KR&A5!j*pZ6_G0au`cH?^;g3~&s*zfZqTgq#H>@r{#817 z=5V6Nd8_>^Ya&(q6GMmP{^e^TmHQJhuin43LGx`)1SSgpi>o3P{1b6r@yoA?RPm2B z|Boeq`s+0QPI!Do%`bgZq?$k6^;|`Nsw`5`A0B*0)xWYSQq> z009U<00Izz00bZa0SG_<0#O3%vBlWl^p_)!zWNgX|33;1Z4iI}1Rwwb2tWV=5P$## zAOL~+519X#D8)8HEW}8bWJR}sbsA?Cr+BQfauSHnACQqWCCf7U?-=;)Qv-G zv>_zg328UnFs$7mB&JPV>&1 z9Ng@pwOSiD>^81@SzF}$QzSsqGc5;u_<|SQQfMq!)avxiTty9#|EF~9P_U>qOwUv; z$F6m2Y%%J?G_8F%`{}jPv%2J!Us;uhn*2Yh$Z! z!(O&=qvn_%Ui0#L&d~I6O*hnBe$psR>bn2q;a`pzh5C5DT(>lA8F{TxE-h zY3b&&VK#~-%ikIt?9CPRa&EkqH*%#yaZ-*R&s2OE8}}E}RmSi?Nq>E$u9xzqeBIRY zR>2}tg`8%V%?ZuIxkBDF@Wiri`X6Rq=Th<&Bwy(W>U(mz6eH1@|D8SM|2}%yzc+ek ze;c@~r4#?yfG>>sB=$#R-;eAkcI>g((E(umtC_ye&Eq3IFYjk4IQa(^7s0RaEqn!E zKnJeDWq2E0cm?L61jBFuIOV?bvvNoIQu$Q5u6&@ptGJz{UQ*VRm!9U(kSGZAZsSb{ z*F4i%kuN>Pp+kENRymX*PcyE&64oV$L#bVm#B_YoZIe+t-k{SI^#X^6N%Jf@ALrcm zTVac$aA+`q>$?;Z)Z;nqw5W$nJp#}hrxI1X+6s;tm5``J7xsx9$`Z+W@-CP!l0zDH zfk1WlDDV_KYloX%cUB~hIt8RJMn!`8Rv<)0qI71DLWF|TYq(9*vQ#4g5<}Nj@=NlF zLkUq}*u+lv;?Mv|`9cfVZPSUTyZA2-^>@<;|0n|w5IpE4r+$Mzj)@_W5!isUa2vsG z*d&$D;h8iOM*@ghh7lNMCV2Vuaoxz}je@QNyR$RM26Z9JkPOUpx2}^0UFUXoKAVd6 zT#rum2rO(O*o6B;^*b0jz(mlop{2@+lS`G^s(R+k^x3l_8$k!d4~8j)F}4tF!xkC% q0Uj555`q!M8Hkfr5N4X?SlYLZ;2~^xl8g5s9u*jojYS2KVgCl%@|8gV delta 594 zcma)4Jxc>Y5Z%2?%-(v*UN9=C`A{MvX5-%8M>cjM_9^T`!X1iL1bfq22%;=DVi5#; z^(y~?ji3lt2E;OT#@iba!l^F(x;ql(%G0mphY$mKp$t~ z;R$INkhMf75sM3b1K(+yx=ua^2;S^ zI#!+9o>!)|5KBv(+rHzmx@!x0m|c&g^eYhH+>XBAT99vr3HegE?$1b@X5xR0NK}-e z{8904t{?g6Saf=vK-tQsg0uNKqc6|rjfgP-Ne7TlkZin>;V6s(gwR*qDmeh8O)khm z80j|Ino