mirror of
https://github.com/gnosygnu/xowa.git
synced 2026-03-02 03:49:30 +00:00
v2.7.3.1
This commit is contained in:
@@ -82,7 +82,7 @@ public class Bit_ {
|
||||
public static int Shift_lhs(int val, int shift) {return val << shift;}
|
||||
public static int Shift_rhs(int val, int shift) {return val >> shift;}
|
||||
public static int Shift_lhs_to_int(int[] shift_ary, int... val_ary) {
|
||||
int val_len = val_ary.length; if (val_len > shift_ary.length) throw Exc_.new_("vals must be less than shifts", "vals", val_len, "shifts", shift_ary.length);
|
||||
int val_len = val_ary.length; if (val_len > shift_ary.length) throw Err_.new_wo_type("vals must be less than shifts", "vals", val_len, "shifts", shift_ary.length);
|
||||
int rv = 0;
|
||||
for (int i = 0; i < val_len; ++i) {
|
||||
int val = val_ary[i];
|
||||
|
||||
@@ -20,29 +20,29 @@ public class Gfo_fld_base {
|
||||
public byte Row_dlm() {return row_dlm;} public Gfo_fld_base Row_dlm_(byte v) {row_dlm = v; return this;} protected byte row_dlm = Byte_ascii.Nl;
|
||||
public byte Fld_dlm() {return fld_dlm;} public Gfo_fld_base Fld_dlm_(byte v) {fld_dlm = v; return this;} protected byte fld_dlm = Byte_ascii.Pipe;
|
||||
public byte Escape_dlm() {return escape_dlm;} public Gfo_fld_base Escape_dlm_(byte v) {escape_dlm = v; return this;} protected byte escape_dlm = Byte_ascii.Tilde;
|
||||
public byte Quote_dlm() {return quote_dlm;} public Gfo_fld_base Quote_dlm_(byte v) {quote_dlm = v; return this;} protected byte quote_dlm = Byte_ascii.Nil;
|
||||
public byte Quote_dlm() {return quote_dlm;} public Gfo_fld_base Quote_dlm_(byte v) {quote_dlm = v; return this;} protected byte quote_dlm = Byte_ascii.Null;
|
||||
public Gfo_fld_base Escape_reg(byte b) {return Escape_reg(b, b);}
|
||||
public byte[] Escape_decode() {return decode_regy;}
|
||||
public Gfo_fld_base Escape_reg(byte key, byte val) {encode_regy[key] = val; decode_regy[val] = key; return this;} protected byte[] decode_regy = new byte[256]; protected byte[] encode_regy = new byte[256];
|
||||
public Gfo_fld_base Escape_clear() {
|
||||
for (int i = 0; i < 256; i++)
|
||||
decode_regy[i] = Byte_ascii.Nil;
|
||||
decode_regy[i] = Byte_ascii.Null;
|
||||
for (int i = 0; i < 256; i++)
|
||||
encode_regy[i] = Byte_ascii.Nil;
|
||||
encode_regy[i] = Byte_ascii.Null;
|
||||
return this;
|
||||
}
|
||||
Gfo_fld_base Ini_common() {
|
||||
return Escape_reg(Byte_ascii.Nl, Byte_ascii.Ltr_n).Escape_reg(Byte_ascii.Tab, Byte_ascii.Ltr_t).Escape_reg(Byte_ascii.Cr, Byte_ascii.Ltr_r)
|
||||
.Escape_reg(Byte_ascii.Backfeed, Byte_ascii.Ltr_b); // .Escape_reg(Byte_ascii.Nil, Byte_ascii.Num_0)
|
||||
.Escape_reg(Byte_ascii.Backfeed, Byte_ascii.Ltr_b); // .Escape_reg(Byte_ascii.Null, Byte_ascii.Num_0)
|
||||
}
|
||||
protected Gfo_fld_base Ctor_xdat_base() {
|
||||
return Escape_clear().Ini_common()
|
||||
.Fld_dlm_(Byte_ascii.Pipe).Row_dlm_(Byte_ascii.Nl).Escape_dlm_(Byte_ascii.Tilde).Quote_dlm_(Byte_ascii.Nil)
|
||||
.Fld_dlm_(Byte_ascii.Pipe).Row_dlm_(Byte_ascii.Nl).Escape_dlm_(Byte_ascii.Tilde).Quote_dlm_(Byte_ascii.Null)
|
||||
.Escape_reg(Byte_ascii.Pipe, Byte_ascii.Ltr_p).Escape_reg(Byte_ascii.Tilde);
|
||||
}
|
||||
protected Gfo_fld_base Ctor_sql_base() {
|
||||
return Escape_clear().Ini_common()
|
||||
.Fld_dlm_(Byte_ascii.Comma).Row_dlm_(Byte_ascii.Paren_end).Escape_dlm_(Byte_ascii.Backslash).Quote_dlm_(Byte_ascii.Apos)
|
||||
.Escape_reg(Byte_ascii.Backslash).Escape_reg(Byte_ascii.Quote).Escape_reg(Byte_ascii.Apos); // , Escape_eof = Bry_.new_u8("\\Z")
|
||||
.Escape_reg(Byte_ascii.Backslash).Escape_reg(Byte_ascii.Quote).Escape_reg(Byte_ascii.Apos); // , Escape_eof = Bry_.new_a7("\\Z")
|
||||
}
|
||||
}
|
||||
|
||||
@@ -54,7 +54,7 @@ public class Gfo_fld_rdr extends Gfo_fld_base {
|
||||
f += (data[fld_bgn + 16] - Byte_ascii.Num_0) * 100;
|
||||
f += (data[fld_bgn + 17] - Byte_ascii.Num_0) * 10;
|
||||
f += (data[fld_bgn + 18] - Byte_ascii.Num_0);
|
||||
if (data[fld_bgn + 19] != fld_dlm) throw Exc_.new_("csv date is invalid", "txt", String_.new_u8_by_len(data, fld_bgn, 20));
|
||||
if (data[fld_bgn + 19] != fld_dlm) throw Err_.new_wo_type("csv date is invalid", "txt", String_.new_u8_by_len(data, fld_bgn, 20));
|
||||
fld_end = pos + 20;
|
||||
pos = fld_end + 1; ++fld_idx;
|
||||
return DateAdp_.new_(y, M, d, H, m, s, f);
|
||||
@@ -78,7 +78,7 @@ public class Gfo_fld_rdr extends Gfo_fld_base {
|
||||
return;
|
||||
}
|
||||
}
|
||||
throw Exc_.new_("fld_dlm failed", "fld_dlm", (char)fld_dlm, "bgn", fld_bgn);
|
||||
throw Err_.new_wo_type("fld_dlm failed", "fld_dlm", (char)fld_dlm, "bgn", fld_bgn);
|
||||
}
|
||||
public String Read_str_escape() {Move_next_escaped(bfr); return String_.new_u8(bfr.Xto_bry_and_clear());}
|
||||
public byte[] Read_bry_escape() {Move_next_escaped(bfr); return bfr.Xto_bry_and_clear();}
|
||||
@@ -100,13 +100,13 @@ public class Gfo_fld_rdr extends Gfo_fld_base {
|
||||
}
|
||||
else if (b == escape_dlm) {
|
||||
++i;
|
||||
// if (i == data_len) throw Err_.new_("escape char at end of String");
|
||||
// if (i == data_len) throw Err_.new_wo_type("escape char at end of String");
|
||||
b = data[i];
|
||||
byte escape_val = decode_regy[b];
|
||||
if (escape_val == Byte_ascii.Nil) {trg.Add_byte(escape_dlm).Add_byte(b);} //throw Err_.new_fmt_("unknown escape key: key={0}", data[i]);
|
||||
if (escape_val == Byte_ascii.Null) {trg.Add_byte(escape_dlm).Add_byte(b);} //throw Err_.new_fmt_("unknown escape key: key={0}", data[i]);
|
||||
else trg.Add_byte(escape_val);
|
||||
}
|
||||
else if (b == Byte_ascii.Nil) {
|
||||
else if (b == Byte_ascii.Null) {
|
||||
trg.Add(Bry_nil);
|
||||
}
|
||||
else if (b == quote_dlm) {
|
||||
|
||||
@@ -39,7 +39,7 @@ public class Gfo_fld_wtr extends Gfo_fld_base {
|
||||
for (int i = bgn; i < end; i++) {
|
||||
byte b = val[i];
|
||||
byte escape_val = encode_regy[b & 0xFF]; // PATCH.JAVA:need to convert to unsigned byte
|
||||
if (escape_val == Byte_ascii.Nil) bfr.Add_byte(b);
|
||||
if (escape_val == Byte_ascii.Null) bfr.Add_byte(b);
|
||||
else {bfr.Add_byte(escape_dlm); bfr.Add_byte(escape_val);}
|
||||
}
|
||||
return this;
|
||||
|
||||
@@ -15,14 +15,14 @@ GNU Affero General Public License for more details.
|
||||
You should have received a copy of the GNU Affero General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package gplx.json; import gplx.*;
|
||||
package gplx.core.json; import gplx.*; import gplx.core.*;
|
||||
public class Json_doc {
|
||||
public void Ctor(byte[] src, Json_itm_nde root) {this.src = src; this.root = root;}
|
||||
public void Ctor(byte[] src, Json_nde root) {this.src = src; this.root = root;}
|
||||
public Bry_bfr Bfr() {return bfr;} Bry_bfr bfr = Bry_bfr.new_();
|
||||
public Number_parser Utl_num_parser() {return utl_num_parser;} Number_parser utl_num_parser = new Number_parser();
|
||||
public byte[] Str_utf8_bry() {return str_utf8_bry;} private byte[] str_utf8_bry = new byte[6];
|
||||
public byte[] Src() {return src;} private byte[] src;
|
||||
public Json_itm_nde Root() {return root;} Json_itm_nde root;
|
||||
public Json_nde Root() {return root;} Json_nde root;
|
||||
public byte[] Get_val_as_bry_or(byte[] qry_bry, byte[] or) {tmp_qry_bry[0] = qry_bry; return Get_val_as_bry_or(tmp_qry_bry, or);}
|
||||
public byte[] Get_val_as_bry_or(byte[][] qry_bry, byte[] or) {
|
||||
Json_itm nde = Find_nde(root, qry_bry, qry_bry.length - 1, 0);
|
||||
@@ -46,14 +46,14 @@ public class Json_doc {
|
||||
tmp_qry_bry[0] = key;
|
||||
return Find_nde(root, tmp_qry_bry, 0, 0);
|
||||
}
|
||||
private Json_itm Find_nde(Json_itm_nde owner, byte[][] paths, int paths_last, int paths_idx) {
|
||||
private Json_itm Find_nde(Json_nde owner, byte[][] paths, int paths_last, int paths_idx) {
|
||||
byte[] path = paths[paths_idx];
|
||||
int subs_len = owner.Subs_len();
|
||||
int subs_len = owner.Len();
|
||||
for (int i = 0; i < subs_len; i++) {
|
||||
Json_itm_kv itm = Json_itm_kv.cast_(owner.Subs_get_at(i)); if (itm == null) continue; // ignore simple props, arrays, ndes
|
||||
Json_itm_kv itm = Json_itm_kv.cast_(owner.Get_at(i)); if (itm == null) continue; // ignore simple props, arrays, ndes
|
||||
if (!itm.Key_eq(path)) continue;
|
||||
if (paths_idx == paths_last) return itm.Val();
|
||||
Json_itm_nde sub_nde = Json_itm_nde.cast_(itm.Val()); if (sub_nde == null) return null; // match, but has not a nde; exit
|
||||
Json_nde sub_nde = Json_nde.cast_(itm.Val()); if (sub_nde == null) return null; // match, but has not a nde; exit
|
||||
return Find_nde(sub_nde, paths, paths_last, paths_idx + 1);
|
||||
}
|
||||
return null;
|
||||
@@ -64,4 +64,4 @@ public class Json_doc {
|
||||
public static Json_doc new_(byte[] v) {
|
||||
synchronized (parser) {return parser.Parse(v);}
|
||||
} private static final Json_parser parser = new Json_parser();
|
||||
}
|
||||
}
|
||||
@@ -15,27 +15,27 @@ GNU Affero General Public License for more details.
|
||||
You should have received a copy of the GNU Affero General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package gplx.json; import gplx.*;
|
||||
package gplx.core.json; import gplx.*; import gplx.core.*;
|
||||
public class Json_doc_bldr {
|
||||
public Json_itm_nde Nde() {return factory.Nde(-1);}
|
||||
public Json_itm_nde Nde(Json_grp owner) {
|
||||
Json_itm_nde rv = factory.Nde(-1);
|
||||
owner.Subs_add(rv);
|
||||
public Json_nde Nde() {return factory.Nde(-1);}
|
||||
public Json_nde Nde(Json_grp owner) {
|
||||
Json_nde rv = factory.Nde(-1);
|
||||
owner.Add(rv);
|
||||
return rv;
|
||||
}
|
||||
public Json_itm Str(byte[] v) {return Str(String_.new_u8(v));}
|
||||
public Json_itm Str(String v) {return Json_itm_tmp.new_str_(v);}
|
||||
public Json_itm Int(int v) {return Json_itm_tmp.new_int_(v);}
|
||||
public Json_itm_kv Kv_int(Json_grp owner, String key, int val) {Json_itm_kv rv = factory.Kv(Json_itm_tmp.new_str_(key), Json_itm_tmp.new_int_(val)); owner.Subs_add(rv); return rv;}
|
||||
public Json_itm_kv Kv_str(Json_grp owner, String key, String val) {Json_itm_kv rv = factory.Kv(Json_itm_tmp.new_str_(key), Json_itm_tmp.new_str_(val)); owner.Subs_add(rv); return rv;}
|
||||
public Json_itm_kv Kv_int(Json_grp owner, String key, int val) {Json_itm_kv rv = factory.Kv(Json_itm_tmp.new_str_(key), Json_itm_tmp.new_int_(val)); owner.Add(rv); return rv;}
|
||||
public Json_itm_kv Kv_str(Json_grp owner, String key, String val) {Json_itm_kv rv = factory.Kv(Json_itm_tmp.new_str_(key), Json_itm_tmp.new_str_(val)); owner.Add(rv); return rv;}
|
||||
public Json_itm_ary Kv_ary(Json_grp owner, String key, Json_itm... subs) {
|
||||
Json_itm key_itm = Json_itm_tmp.new_str_(key);
|
||||
Json_itm_ary val_ary = factory.Ary(-1, -1);
|
||||
Json_itm_kv kv = factory.Kv(key_itm, val_ary);
|
||||
owner.Subs_add(kv);
|
||||
owner.Add(kv);
|
||||
int len = subs.length;
|
||||
for (int i = 0; i < len; i++)
|
||||
val_ary.Subs_add(subs[i]);
|
||||
val_ary.Add(subs[i]);
|
||||
return val_ary;
|
||||
}
|
||||
Json_doc doc = new Json_doc(); Json_factory factory = new Json_factory();
|
||||
@@ -15,7 +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 <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package gplx.json; import gplx.*;
|
||||
package gplx.core.json; import gplx.*; import gplx.core.*;
|
||||
public class Json_doc_srl {
|
||||
private int indent = -1;
|
||||
private Bry_bfr bfr = Bry_bfr.reset_(255);
|
||||
@@ -15,7 +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 <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package gplx.json; import gplx.*;
|
||||
package gplx.core.json; import gplx.*; import gplx.core.*;
|
||||
import org.junit.*;
|
||||
public class Json_doc_tst {
|
||||
Json_qry_mgr_fxt fxt = new Json_qry_mgr_fxt();
|
||||
@@ -15,7 +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 <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package gplx.json; import gplx.*;
|
||||
package gplx.core.json; import gplx.*; import gplx.core.*;
|
||||
public class Json_doc_wtr {
|
||||
private int indent = -2;
|
||||
private Bry_bfr bfr = Bry_bfr.reset_(255);
|
||||
@@ -15,7 +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 <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package gplx.json; import gplx.*;
|
||||
package gplx.core.json; import gplx.*; import gplx.core.*;
|
||||
public class Json_factory {
|
||||
public Json_itm Null() {return Json_itm_null.Null;}
|
||||
public Json_itm Bool_n() {return Json_itm_bool.Bool_n;}
|
||||
@@ -25,5 +25,5 @@ public class Json_factory {
|
||||
public Json_itm Str(Json_doc doc, int bgn, int end, boolean exact) {return new Json_itm_str(doc, bgn, end, exact);}
|
||||
public Json_itm_kv Kv(Json_itm key, Json_itm val) {return new Json_itm_kv(key, val);}
|
||||
public Json_itm_ary Ary(int bgn, int end) {return new Json_itm_ary(bgn, end);}
|
||||
public Json_itm_nde Nde(int bgn) {return new Json_itm_nde(bgn);}
|
||||
public Json_nde Nde(int bgn) {return new Json_nde(bgn);}
|
||||
}
|
||||
@@ -15,12 +15,12 @@ GNU Affero General Public License for more details.
|
||||
You should have received a copy of the GNU Affero General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package gplx.json; import gplx.*;
|
||||
package gplx.core.json; import gplx.*; import gplx.core.*;
|
||||
public interface Json_grp extends Json_itm {
|
||||
void Src_end_(int v);
|
||||
int Subs_len();
|
||||
Json_itm Subs_get_at(int i);
|
||||
void Subs_add(Json_itm itm);
|
||||
int Len();
|
||||
Json_itm Get_at(int i);
|
||||
void Add(Json_itm itm);
|
||||
}
|
||||
class Json_grp_ {
|
||||
public static final Json_grp[] Ary_empty = new Json_grp[0];
|
||||
@@ -15,7 +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 <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package gplx.json; import gplx.*;
|
||||
package gplx.core.json; import gplx.*; import gplx.core.*;
|
||||
public interface Json_itm {
|
||||
byte Tid();
|
||||
int Src_bgn();
|
||||
@@ -15,7 +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 <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package gplx.json; import gplx.*;
|
||||
package gplx.core.json; import gplx.*; import gplx.core.*;
|
||||
public class Json_itm_ {
|
||||
public static final Json_itm[] Ary_empty = new Json_itm[0];
|
||||
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;
|
||||
@@ -15,22 +15,22 @@ GNU Affero General Public License for more details.
|
||||
You should have received a copy of the GNU Affero General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package gplx.json; import gplx.*;
|
||||
package gplx.core.json; import gplx.*; import gplx.core.*;
|
||||
public class Json_itm_ary extends Json_itm_base implements Json_grp {
|
||||
public Json_itm_ary(int src_bgn, int src_end) {this.Ctor(src_bgn, src_end);}
|
||||
@Override public byte Tid() {return Json_itm_.Tid_array;}
|
||||
public void Src_end_(int v) {this.src_end = v;}
|
||||
@Override public Object Data() {return null;}
|
||||
@Override public byte[] Data_bry() {return null;}
|
||||
public int Subs_len() {return subs_len;} private int subs_len = 0, subs_max = 0;
|
||||
public Json_itm Subs_get_at(int i) {return subs[i];}
|
||||
public Json_itm_ary Subs_add_many(Json_itm... ary) {
|
||||
public int Len() {return subs_len;} private int subs_len = 0, subs_max = 0;
|
||||
public Json_itm Get_at(int i) {return subs[i];}
|
||||
public Json_itm_ary Add_many(Json_itm... ary) {
|
||||
int len = ary.length;
|
||||
for (int i = 0; i < len; i++)
|
||||
Subs_add(ary[i]);
|
||||
Add(ary[i]);
|
||||
return this;
|
||||
}
|
||||
public void Subs_add(Json_itm itm) {
|
||||
public void Add(Json_itm itm) {
|
||||
int new_len = subs_len + 1;
|
||||
if (new_len > subs_max) { // ary too small >>> expand
|
||||
subs_max = new_len * 2;
|
||||
@@ -15,7 +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 <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package gplx.json; import gplx.*;
|
||||
package gplx.core.json; import gplx.*; import gplx.core.*;
|
||||
public abstract class Json_itm_base implements Json_itm {
|
||||
public abstract byte Tid();
|
||||
public void Ctor(int src_bgn, int src_end) {this.src_bgn = src_bgn; this.src_end = src_end;}
|
||||
@@ -15,7 +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 <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package gplx.json; import gplx.*;
|
||||
package gplx.core.json; import gplx.*; import gplx.core.*;
|
||||
public class Json_itm_int extends Json_itm_base {
|
||||
public Json_itm_int(Json_doc doc, int src_bgn, int src_end) {this.Ctor(src_bgn, src_end); this.doc = doc;} Json_doc doc;
|
||||
@Override public byte Tid() {return Json_itm_.Tid_int;}
|
||||
@@ -15,7 +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 <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package gplx.json; import gplx.*;
|
||||
package gplx.core.json; import gplx.*; import gplx.core.*;
|
||||
public class Json_itm_kv extends Json_itm_base {
|
||||
public Json_itm_kv(Json_itm key, Json_itm val) {this.key = key; this.val = val;}
|
||||
@Override public byte Tid() {return Json_itm_.Tid_kv;}
|
||||
@@ -15,7 +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 <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package gplx.json; import gplx.*;
|
||||
package gplx.core.json; import gplx.*; import gplx.core.*;
|
||||
public class Json_itm_tmp implements Json_itm {
|
||||
public Json_itm_tmp(byte tid, String data) {this.tid = tid; this.data = data;}
|
||||
public byte Tid() {return tid;} private byte tid;
|
||||
@@ -15,7 +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 <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package gplx.json; import gplx.*;
|
||||
package gplx.core.json; import gplx.*; import gplx.core.*;
|
||||
public class Json_kv_ary_srl {
|
||||
public static KeyVal Kv_by_itm(Json_itm itm) {
|
||||
switch (itm.Tid()) {
|
||||
@@ -23,7 +23,7 @@ public class Json_kv_ary_srl {
|
||||
Json_itm_kv kv = (Json_itm_kv)itm;
|
||||
return KeyVal_.new_(kv.Key_as_str(), Val_by_itm(kv.Val()));
|
||||
default:
|
||||
throw Exc_.new_unhandled(itm.Tid());
|
||||
throw Err_.new_unhandled(itm.Tid());
|
||||
}
|
||||
}
|
||||
private static Object Val_by_itm(Json_itm itm) {
|
||||
@@ -34,26 +34,26 @@ public class Json_kv_ary_srl {
|
||||
case Json_itm_.Tid_string:
|
||||
case Json_itm_.Tid_decimal: return itm.Data();
|
||||
case Json_itm_.Tid_array: return Val_by_itm_ary((Json_itm_ary)itm);
|
||||
case Json_itm_.Tid_nde: return Val_by_itm_nde((Json_itm_nde)itm);
|
||||
case Json_itm_.Tid_nde: return Val_by_itm_nde((Json_nde)itm);
|
||||
case Json_itm_.Tid_kv: // kv should never be val; EX: "a":"b":c; not possible
|
||||
default: throw Exc_.new_unhandled(itm.Tid());
|
||||
default: throw Err_.new_unhandled(itm.Tid());
|
||||
}
|
||||
}
|
||||
private static KeyVal[] Val_by_itm_ary(Json_itm_ary itm) {
|
||||
int subs_len = itm.Subs_len();
|
||||
int subs_len = itm.Len();
|
||||
KeyVal[] rv = new KeyVal[subs_len];
|
||||
for (int i = 0; i < subs_len; i++) {
|
||||
Json_itm sub = itm.Subs_get_at(i);
|
||||
Json_itm sub = itm.Get_at(i);
|
||||
KeyVal kv = KeyVal_.new_(Int_.Xto_str(i + Int_.Base1), Val_by_itm(sub));
|
||||
rv[i] = kv;
|
||||
}
|
||||
return rv;
|
||||
}
|
||||
public static KeyVal[] Val_by_itm_nde(Json_itm_nde itm) {
|
||||
int subs_len = itm.Subs_len();
|
||||
public static KeyVal[] Val_by_itm_nde(Json_nde itm) {
|
||||
int subs_len = itm.Len();
|
||||
KeyVal[] rv = new KeyVal[subs_len];
|
||||
for (int i = 0; i < subs_len; i++) {
|
||||
Json_itm sub = itm.Subs_get_at(i);
|
||||
Json_itm sub = itm.Get_at(i);
|
||||
rv[i] = Kv_by_itm(sub);
|
||||
}
|
||||
return rv;
|
||||
@@ -15,7 +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 <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package gplx.json; import gplx.*;
|
||||
package gplx.core.json; import gplx.*; import gplx.core.*;
|
||||
import org.junit.*;
|
||||
public class Json_kv_ary_srl_tst {
|
||||
@Before public void init() {fxt.Clear();} private Json_kv_ary_srl_fxt fxt = new Json_kv_ary_srl_fxt();
|
||||
@@ -15,16 +15,23 @@ GNU Affero General Public License for more details.
|
||||
You should have received a copy of the GNU Affero General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package gplx.json; import gplx.*;
|
||||
public class Json_itm_nde extends Json_itm_base implements Json_grp {
|
||||
public Json_itm_nde(int src_bgn) {this.Ctor(src_bgn, -1);}
|
||||
package gplx.core.json; import gplx.*; import gplx.core.*;
|
||||
public class Json_nde extends Json_itm_base implements Json_grp {
|
||||
private Json_itm[] subs = Json_itm_.Ary_empty; private int subs_len = 0, subs_max = 0;
|
||||
public Json_nde(int src_bgn) {this.Ctor(src_bgn, -1);}
|
||||
@Override public byte Tid() {return Json_itm_.Tid_nde;}
|
||||
public void Src_end_(int v) {this.src_end = v;}
|
||||
@Override public Object Data() {return null;}
|
||||
@Override public byte[] Data_bry() {return null;}
|
||||
public int Subs_len() {return subs_len;} private int subs_len = 0, subs_max = 0;
|
||||
public Json_itm Subs_get_at(int i) {return subs[i];}
|
||||
public Json_itm Subs_get_by_key(byte[] key) {
|
||||
public int Len() {return subs_len;}
|
||||
public Json_itm Get_at(int i) {return subs[i];}
|
||||
public Json_nde Get(String key) {return Get(Bry_.new_u8(key));}
|
||||
public Json_nde Get(byte[] key) {
|
||||
Json_itm_kv kv = Json_itm_kv.cast_(this.Get_itm(key)); if (kv == null) throw Err_.new_("json", "kv not found", "key", key);
|
||||
Json_nde rv = Json_nde.cast_(kv.Val()); if (rv == null) throw Err_.new_("json", "nde not found", "key", key);
|
||||
return rv;
|
||||
}
|
||||
public Json_itm Get_itm(byte[] key) {
|
||||
for (int i = 0; i < subs_len; i++) {
|
||||
Json_itm itm = subs[i];
|
||||
if (itm.Tid() == Json_itm_.Tid_kv) {
|
||||
@@ -35,8 +42,14 @@ public class Json_itm_nde extends Json_itm_base implements Json_grp {
|
||||
}
|
||||
return null;
|
||||
}
|
||||
public byte[] Subs_get_val_by_key_as_bry(byte[] key, byte[] or) {
|
||||
Json_itm kv_obj = Subs_get_by_key(key);
|
||||
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;
|
||||
}
|
||||
public byte[] Get_bry_or_null(String key) {return Get_bry(Bry_.new_u8(key), null);}
|
||||
public byte[] Get_bry_or_null(byte[] key) {return Get_bry(key, null);}
|
||||
public byte[] Get_bry(byte[] key, byte[] or) {
|
||||
Json_itm kv_obj = Get_itm(key);
|
||||
if (kv_obj == null) return or; // key not found;
|
||||
if (kv_obj.Tid() != Json_itm_.Tid_kv) return or; // key is not a key_val
|
||||
Json_itm_kv kv = (Json_itm_kv)kv_obj;
|
||||
@@ -44,13 +57,13 @@ public class Json_itm_nde extends Json_itm_base implements Json_grp {
|
||||
if (val == null) return or;
|
||||
return val.Data_bry();
|
||||
}
|
||||
public Json_itm_nde Subs_add_many(Json_itm... ary) {
|
||||
public Json_nde Add_many(Json_itm... ary) {
|
||||
int len = ary.length;
|
||||
for (int i = 0; i < len; i++)
|
||||
Subs_add(ary[i]);
|
||||
Add(ary[i]);
|
||||
return this;
|
||||
}
|
||||
public void Subs_add(Json_itm itm) {
|
||||
public void Add(Json_itm itm) {
|
||||
int new_len = subs_len + 1;
|
||||
if (new_len > subs_max) { // ary too small >>> expand
|
||||
subs_max = new_len * 2;
|
||||
@@ -76,6 +89,5 @@ public class Json_itm_nde extends Json_itm_base implements Json_grp {
|
||||
Json_grp_.Print_nl(bfr); Json_grp_.Print_indent(bfr, depth);
|
||||
bfr.Add_byte(Byte_ascii.Curly_end).Add_byte_nl();
|
||||
}
|
||||
private Json_itm[] subs = Json_itm_.Ary_empty;
|
||||
public static Json_itm_nde cast_(Json_itm v) {return v == null || v.Tid() != Json_itm_.Tid_nde ? null : (Json_itm_nde)v;}
|
||||
public static Json_nde cast_(Json_itm v) {return v == null || v.Tid() != Json_itm_.Tid_nde ? null : (Json_nde)v;}
|
||||
}
|
||||
@@ -15,7 +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 <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package gplx.json; import gplx.*;
|
||||
package gplx.core.json; import gplx.*; import gplx.core.*;
|
||||
public class Json_parser {
|
||||
public Json_factory Factory() {return factory;} private Json_factory factory = new Json_factory();
|
||||
private byte[] src; private int src_len, pos; private Number_parser num_parser = new Number_parser();
|
||||
@@ -28,26 +28,26 @@ public class Json_parser {
|
||||
if (src[pos] != Byte_ascii.Curly_bgn) return null;
|
||||
Skip_ws();
|
||||
// if (src[pos + 1] != Byte_ascii.Quote) return null;
|
||||
// throw Err_.new_("doc must start with {");
|
||||
Json_itm_nde root = Make_nde(doc);
|
||||
// throw Err_.new_wo_type("doc must start with {");
|
||||
Json_nde root = Make_nde(doc);
|
||||
doc.Ctor(src, root);
|
||||
return doc;
|
||||
}
|
||||
Json_itm_nde Make_nde(Json_doc doc) {
|
||||
Json_nde Make_nde(Json_doc doc) {
|
||||
++pos; // brack_bgn
|
||||
Json_itm_nde nde = new Json_itm_nde(pos);
|
||||
Json_nde nde = new Json_nde(pos);
|
||||
while (pos < src_len) {
|
||||
Skip_ws();
|
||||
if (src[pos] == Byte_ascii.Curly_end) {++pos; return nde;}
|
||||
else nde.Subs_add(Make_kv(doc));
|
||||
else nde.Add(Make_kv(doc));
|
||||
Skip_ws();
|
||||
switch (src[pos++]) {
|
||||
case Byte_ascii.Comma: break;
|
||||
case Byte_ascii.Curly_end: return nde;
|
||||
default: throw Exc_.new_unhandled(src[pos - 1]);
|
||||
default: throw Err_.new_unhandled(src[pos - 1]);
|
||||
}
|
||||
}
|
||||
throw Exc_.new_("eos inside nde");
|
||||
throw Err_.new_wo_type("eos inside nde");
|
||||
}
|
||||
Json_itm Make_kv(Json_doc doc) {
|
||||
Json_itm key = Make_string(doc);
|
||||
@@ -71,9 +71,9 @@ public class Json_parser {
|
||||
case Byte_ascii.Brack_bgn: return Make_ary(doc);
|
||||
case Byte_ascii.Curly_bgn: return Make_nde(doc);
|
||||
}
|
||||
throw Exc_.new_unhandled(Char_.XtoStr(b));
|
||||
throw Err_.new_unhandled(Char_.XtoStr(b));
|
||||
}
|
||||
throw Exc_.new_("eos reached in val");
|
||||
throw Err_.new_wo_type("eos reached in val");
|
||||
}
|
||||
Json_itm Make_literal(byte[] remainder, int remainder_len, Json_itm singleton) {
|
||||
++pos; // 1st char
|
||||
@@ -82,7 +82,7 @@ public class Json_parser {
|
||||
pos = literal_end;
|
||||
return singleton;
|
||||
}
|
||||
throw Exc_.new_("invalid literal");
|
||||
throw Err_.new_wo_type("invalid literal");
|
||||
}
|
||||
Json_itm Make_string(Json_doc doc) {
|
||||
int bgn = pos++; // ++: quote_bgn
|
||||
@@ -104,13 +104,13 @@ public class Json_parser {
|
||||
break;
|
||||
}
|
||||
}
|
||||
throw Exc_.new_("eos reached inside quote");
|
||||
throw Err_.new_wo_type("eos reached inside quote");
|
||||
}
|
||||
Json_itm Make_num(Json_doc doc) {
|
||||
int num_bgn = pos;
|
||||
boolean loop = true;
|
||||
while (loop) {
|
||||
if (pos == src_len) throw Exc_.new_("eos reached inside num");
|
||||
if (pos == src_len) throw Err_.new_wo_type("eos reached inside num");
|
||||
switch (src[pos]) {
|
||||
case Byte_ascii.Num_0: case Byte_ascii.Num_1: case Byte_ascii.Num_2: case Byte_ascii.Num_3: case Byte_ascii.Num_4:
|
||||
case Byte_ascii.Num_5: case Byte_ascii.Num_6: case Byte_ascii.Num_7: case Byte_ascii.Num_8: case Byte_ascii.Num_9:
|
||||
@@ -136,14 +136,14 @@ public class Json_parser {
|
||||
while (pos < src_len) {
|
||||
Skip_ws();
|
||||
if (src[pos] == Byte_ascii.Brack_end) {++pos; return rv;}
|
||||
else rv.Subs_add(Make_val(doc));
|
||||
else rv.Add(Make_val(doc));
|
||||
Skip_ws();
|
||||
switch (src[pos]) {
|
||||
case Byte_ascii.Comma: ++pos; break;
|
||||
case Byte_ascii.Brack_end: ++pos; return rv;
|
||||
}
|
||||
}
|
||||
throw Exc_.new_("eos inside ary");
|
||||
throw Err_.new_wo_type("eos inside ary");
|
||||
}
|
||||
private void Skip_ws() {
|
||||
while (pos < src_len) {
|
||||
@@ -159,9 +159,9 @@ public class Json_parser {
|
||||
else
|
||||
throw err_(src, pos, "expected '{0}' but got '{1}'", Char_.XtoStr(expd), Char_.XtoStr(src[pos]));
|
||||
}
|
||||
Exc err_(byte[] src, int bgn, String fmt, Object... args) {return err_(src, bgn, src.length, fmt, args);}
|
||||
Exc err_(byte[] src, int bgn, int src_len, String fmt, Object... args) {
|
||||
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) {
|
||||
String msg = String_.Format(fmt, args) + " " + Int_.Xto_str(bgn) + " " + String_.new_u8_by_len(src, bgn, 20);
|
||||
return Exc_.new_(msg);
|
||||
return Err_.new_wo_type(msg);
|
||||
}
|
||||
}
|
||||
@@ -15,10 +15,10 @@ GNU Affero General Public License for more details.
|
||||
You should have received a copy of the GNU Affero General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package gplx.json; import gplx.*;
|
||||
package gplx.core.json; import gplx.*; import gplx.core.*;
|
||||
import org.junit.*;
|
||||
public class Json_parser_tst {
|
||||
Json_parser_fxt fxt = new Json_parser_fxt();
|
||||
private final Json_parser_fxt fxt = new Json_parser_fxt();
|
||||
@Before public void init() {fxt.Clear();}
|
||||
@Test public void Null() {fxt.Test_parse_val0("{'k0':null}" , null);}
|
||||
@Test public void Bool_n() {fxt.Test_parse_val0("{'k0':false}" , false);}
|
||||
@@ -28,18 +28,18 @@ public class Json_parser_tst {
|
||||
@Test public void Str() {fxt.Test_parse_val0("{'k0':'v0'}" , "v0");}
|
||||
@Test public void Str_esc_quote() {fxt.Test_parse_val0("{'k0':'a\\\"b'}" , "a\"b");}
|
||||
@Test public void Str_esc_hex4() {fxt.Test_parse_val0("{'k0':'a\\u0021b'}" , "a!b");}
|
||||
@Test public void Num_dec() {fxt.Test_parse("{'k0':1.23}" , fxt.itm_nde_().Subs_add_many(fxt.itm_kv_dec_("k0", "1.23")));}
|
||||
@Test public void Num_exp() {fxt.Test_parse("{'k0':1e+2}" , fxt.itm_nde_().Subs_add_many(fxt.itm_kv_dec_("k0", "1e+2")));}
|
||||
@Test public void Num_mix() {fxt.Test_parse("{'k0':-1.23e-1}" , fxt.itm_nde_().Subs_add_many(fxt.itm_kv_dec_("k0", "-1.23e-1")));}
|
||||
@Test public void Str_many() {fxt.Test_parse("{'k0':'v0','k1':'v1','k2':'v2'}", fxt.itm_nde_().Subs_add_many(fxt.itm_kv_("k0", "v0"), fxt.itm_kv_("k1", "v1"), fxt.itm_kv_("k2", "v2")));}
|
||||
@Test public void Ary_empty() {fxt.Test_parse("{'k0':[]}", fxt.itm_nde_().Subs_add_many(fxt.itm_kv_ary_int_("k0")));}
|
||||
@Test public void Ary_int() {fxt.Test_parse("{'k0':[1,2,3]}", fxt.itm_nde_().Subs_add_many(fxt.itm_kv_ary_int_("k0", 1, 2, 3)));}
|
||||
@Test public void Ary_str() {fxt.Test_parse("{'k0':['a','b','c']}", fxt.itm_nde_().Subs_add_many(fxt.itm_kv_ary_str_("k0", "a", "b", "c")));}
|
||||
@Test public void Ary_ws() {fxt.Test_parse("{'k0': [ 1 , 2 , 3 ] }", fxt.itm_nde_().Subs_add_many(fxt.itm_kv_ary_int_("k0", 1, 2, 3)));}
|
||||
@Test public void Subs_int() {fxt.Test_parse("{'k0':{'k00':1}}", fxt.itm_nde_().Subs_add_many(fxt.itm_kv_("k0", fxt.itm_nde_().Subs_add_many(fxt.itm_kv_("k00", 1)))));}
|
||||
@Test public void Subs_empty() {fxt.Test_parse("{'k0':{}}", fxt.itm_nde_().Subs_add_many(fxt.itm_kv_("k0", fxt.itm_nde_())));}
|
||||
@Test public void Subs_ws() {fxt.Test_parse("{'k0': { 'k00' : 1 } }", fxt.itm_nde_().Subs_add_many(fxt.itm_kv_("k0", fxt.itm_nde_().Subs_add_many(fxt.itm_kv_("k00", 1)))));}
|
||||
@Test public void Ws() {fxt.Test_parse(" { 'k0' : 'v0' } ", fxt.itm_nde_().Subs_add_many(fxt.itm_kv_("k0", "v0")));}
|
||||
@Test public void Num_dec() {fxt.Test_parse("{'k0':1.23}" , fxt.itm_nde_().Add_many(fxt.itm_kv_dec_("k0", "1.23")));}
|
||||
@Test public void Num_exp() {fxt.Test_parse("{'k0':1e+2}" , fxt.itm_nde_().Add_many(fxt.itm_kv_dec_("k0", "1e+2")));}
|
||||
@Test public void Num_mix() {fxt.Test_parse("{'k0':-1.23e-1}" , fxt.itm_nde_().Add_many(fxt.itm_kv_dec_("k0", "-1.23e-1")));}
|
||||
@Test public void Str_many() {fxt.Test_parse("{'k0':'v0','k1':'v1','k2':'v2'}", fxt.itm_nde_().Add_many(fxt.itm_kv_("k0", "v0"), fxt.itm_kv_("k1", "v1"), fxt.itm_kv_("k2", "v2")));}
|
||||
@Test public void Ary_empty() {fxt.Test_parse("{'k0':[]}", fxt.itm_nde_().Add_many(fxt.itm_kv_ary_int_("k0")));}
|
||||
@Test public void Ary_int() {fxt.Test_parse("{'k0':[1,2,3]}", fxt.itm_nde_().Add_many(fxt.itm_kv_ary_int_("k0", 1, 2, 3)));}
|
||||
@Test public void Ary_str() {fxt.Test_parse("{'k0':['a','b','c']}", fxt.itm_nde_().Add_many(fxt.itm_kv_ary_str_("k0", "a", "b", "c")));}
|
||||
@Test public void Ary_ws() {fxt.Test_parse("{'k0': [ 1 , 2 , 3 ] }", fxt.itm_nde_().Add_many(fxt.itm_kv_ary_int_("k0", 1, 2, 3)));}
|
||||
@Test public void Subs_int() {fxt.Test_parse("{'k0':{'k00':1}}", fxt.itm_nde_().Add_many(fxt.itm_kv_("k0", fxt.itm_nde_().Add_many(fxt.itm_kv_("k00", 1)))));}
|
||||
@Test public void Subs_empty() {fxt.Test_parse("{'k0':{}}", fxt.itm_nde_().Add_many(fxt.itm_kv_("k0", fxt.itm_nde_())));}
|
||||
@Test public void Subs_ws() {fxt.Test_parse("{'k0': { 'k00' : 1 } }", fxt.itm_nde_().Add_many(fxt.itm_kv_("k0", fxt.itm_nde_().Add_many(fxt.itm_kv_("k00", 1)))));}
|
||||
@Test public void Ws() {fxt.Test_parse(" { 'k0' : 'v0' } ", fxt.itm_nde_().Add_many(fxt.itm_kv_("k0", "v0")));}
|
||||
public static String Replace_apos_as_str(String v) {return String_.new_u8(Replace_apos(Bry_.new_u8(v)));}
|
||||
public static byte[] Replace_apos(byte[] v) {return Bry_.Replace(v, Byte_ascii.Apos, Byte_ascii.Quote);}
|
||||
}
|
||||
@@ -53,25 +53,25 @@ class Json_parser_fxt {
|
||||
Json_itm itm_int_(int v) {return Json_itm_tmp.new_int_(v);}
|
||||
Json_itm itm_str_(String v) {return Json_itm_tmp.new_str_(v);}
|
||||
public Json_itm_ary itm_ary_() {return factory.Ary(-1, -1);}
|
||||
public Json_itm_nde itm_nde_() {return factory.Nde(-1);}
|
||||
public Json_nde itm_nde_() {return factory.Nde(-1);}
|
||||
public Json_itm_kv itm_kv_null_(String k) {return factory.Kv(itm_str_(k), factory.Null());}
|
||||
public Json_itm_kv itm_kv_(String k, String v) {return factory.Kv(itm_str_(k), itm_str_(v));}
|
||||
public Json_itm_kv itm_kv_(String k, int v) {return factory.Kv(itm_str_(k), itm_int_(v));}
|
||||
public Json_itm_kv itm_kv_(String k, boolean v) {return factory.Kv(itm_str_(k), v ? factory.Bool_y() : factory.Bool_n());}
|
||||
public Json_itm_kv itm_kv_dec_(String k, String v) {return factory.Kv(itm_str_(k), new Json_itm_tmp(Json_itm_.Tid_decimal, v));}
|
||||
public Json_itm_kv itm_kv_(String k, Json_itm_nde v) {return factory.Kv(itm_str_(k), v);}
|
||||
public Json_itm_kv itm_kv_(String k, Json_nde v) {return factory.Kv(itm_str_(k), v);}
|
||||
public Json_itm_kv itm_kv_ary_int_(String k, int... v) {
|
||||
Json_itm_ary ary = factory.Ary(-1, -1);
|
||||
int len = v.length;
|
||||
for (int i = 0; i < len; i++)
|
||||
ary.Subs_add(itm_int_(v[i]));
|
||||
ary.Add(itm_int_(v[i]));
|
||||
return factory.Kv(itm_str_(k), ary);
|
||||
}
|
||||
public Json_itm_kv itm_kv_ary_str_(String k, String... v) {
|
||||
Json_itm_ary ary = factory.Ary(-1, -1);
|
||||
int len = v.length;
|
||||
for (int i = 0; i < len; i++)
|
||||
ary.Subs_add(itm_str_(v[i]));
|
||||
ary.Add(itm_str_(v[i]));
|
||||
return factory.Kv(itm_str_(k), ary);
|
||||
}
|
||||
public void Test_parse(String raw_str, Json_itm... expd_ary) {
|
||||
@@ -85,7 +85,7 @@ class Json_parser_fxt {
|
||||
public void Test_parse_val0(String raw_str, Object expd) {
|
||||
byte[] raw = Json_parser_tst.Replace_apos(Bry_.new_u8(raw_str));
|
||||
Json_doc doc = parser.Parse(raw);
|
||||
Json_itm_kv kv = Json_itm_kv.cast_(doc.Root().Subs_get_at(0)); // assume root has kv as first sub; EX: {"a":"b"}
|
||||
Json_itm_kv kv = Json_itm_kv.cast_(doc.Root().Get_at(0)); // assume root has kv as first sub; EX: {"a":"b"}
|
||||
Object actl = kv.Val().Data(); // NOTE: Data_bry is escaped val; EX: a\"b has DataBry of a"b
|
||||
Tfds.Eq(expd, actl);
|
||||
}
|
||||
@@ -15,51 +15,67 @@ GNU Affero General Public License for more details.
|
||||
You should have received a copy of the GNU Affero General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package gplx.json; import gplx.*;
|
||||
package gplx.core.json; import gplx.*; import gplx.core.*;
|
||||
public class Json_wtr {
|
||||
private final Bry_bfr bfr = Bry_bfr.new_(255);
|
||||
private int indent;
|
||||
private boolean nde_itm_is_first;
|
||||
private boolean ary_itm_is_first;
|
||||
public byte Quote_byte() {return quote_byte;} public Json_wtr Quote_byte_(byte v) {quote_byte = v; return this;} private byte quote_byte = Byte_ascii.Quote;
|
||||
public byte Opt_quote_byte() {return opt_quote_byte;} public Json_wtr Opt_quote_byte_(byte v) {opt_quote_byte = v; return this;} private byte opt_quote_byte = Byte_ascii.Quote;
|
||||
public boolean Opt_ws() {return opt_ws;} public Json_wtr Opt_ws_(boolean v) {opt_ws = v; return this;} private boolean opt_ws = true;
|
||||
public byte[] To_bry_and_clear() {return bfr.Xto_bry_and_clear();}
|
||||
public String To_str_and_clear() {return bfr.Xto_str_and_clear();}
|
||||
public Bry_bfr Bfr() {return bfr;}
|
||||
public Json_wtr Clear() {
|
||||
indent = 0;
|
||||
nde_itm_is_first = ary_itm_is_first = false;
|
||||
nde_itm_is_first = ary_itm_is_first = true;
|
||||
return this;
|
||||
}
|
||||
public Json_wtr Doc_bgn() {return Add_grp_bgn(Sym_nde_bgn);}
|
||||
public Json_wtr Doc_end() {return Add_grp_end(Sym_nde_end);}
|
||||
public Json_wtr Nde_bgn(String nde) {
|
||||
public Json_wtr Doc_end() {Add_grp_end(Bool_.Y, Sym_nde_end); return Add_nl();}
|
||||
public void Indent_(int v) {this.indent = v;}
|
||||
public Json_wtr Nde_bgn(String nde) {return Nde_bgn(Bry_.new_u8(nde));}
|
||||
public Json_wtr Nde_bgn(byte[] nde) {
|
||||
Add_indent_itm(nde_itm_is_first);
|
||||
Add_key(Bry_.new_u8(nde));
|
||||
bfr.Add_byte_nl();
|
||||
Add_key(nde);
|
||||
Add_nl();
|
||||
return Add_grp_bgn(Sym_nde_bgn);
|
||||
}
|
||||
public Json_wtr Nde_end() {return Add_grp_end(Sym_nde_end);}
|
||||
public Json_wtr Nde_end() {Add_grp_end(Bool_.Y, Sym_nde_end); return Add_nl();}
|
||||
public Json_wtr Ary_bgn(String nde) {
|
||||
Add_indent_itm(nde_itm_is_first);
|
||||
Add_key(Bry_.new_u8(nde));
|
||||
bfr.Add_byte_nl();
|
||||
Add_nl();
|
||||
ary_itm_is_first = true;
|
||||
return Add_grp_bgn(Sym_ary_bgn);
|
||||
}
|
||||
public Json_wtr Ary_itm_str(String itm) {
|
||||
Add_indent_itm(ary_itm_is_first);
|
||||
Add_itm_bry(Bry_.new_u8(itm));
|
||||
bfr.Add_byte_nl();
|
||||
Add_nl();
|
||||
ary_itm_is_first = false;
|
||||
return this;
|
||||
}
|
||||
public Json_wtr Ary_end() {
|
||||
return Add_grp_end(Sym_ary_end);
|
||||
}
|
||||
public Json_wtr Kv_str(String key, String val) {
|
||||
public Json_wtr Ary_end() {Add_grp_end(Bool_.N, Sym_ary_end); return Add_nl();}
|
||||
public Json_wtr Kv_bool(String key, boolean val) {return Kv_bool(Bry_.new_u8(key), val);}
|
||||
public Json_wtr Kv_bool(byte[] key, boolean val) {return Kv_raw(key, val ? Bool_.True_bry : Bool_.False_bry);}
|
||||
public Json_wtr Kv_int(String key, int val) {return Kv_raw(Bry_.new_u8(key), Int_.Xto_bry(val));}
|
||||
private Json_wtr Kv_raw(byte[] key, byte[] val) {
|
||||
Add_indent_itm(nde_itm_is_first);
|
||||
Add_key(Bry_.new_u8(key));
|
||||
Add_itm_bry(Bry_.new_u8(val));
|
||||
bfr.Add_byte_nl();
|
||||
Add_key(key);
|
||||
bfr.Add(val);
|
||||
Add_nl();
|
||||
nde_itm_is_first = false;
|
||||
return this;
|
||||
}
|
||||
public Json_wtr Kv_str(String key, String val) {return Kv_bry(Bry_.new_u8(key), Bry_.new_u8(val));}
|
||||
public Json_wtr Kv_str(byte[] key, String val) {return Kv_bry(key, Bry_.new_u8(val));}
|
||||
public Json_wtr Kv_bry(String key, byte[] val) {return Kv_bry(Bry_.new_u8(key), val);}
|
||||
public Json_wtr Kv_bry(byte[] key, byte[] val) {
|
||||
Add_indent_itm(nde_itm_is_first);
|
||||
Add_key(key);
|
||||
Add_itm_bry(val);
|
||||
Add_nl();
|
||||
nde_itm_is_first = false;
|
||||
return this;
|
||||
}
|
||||
@@ -67,7 +83,7 @@ public class Json_wtr {
|
||||
Add_indent_itm(nde_itm_is_first);
|
||||
Add_key(Bry_.new_u8(key));
|
||||
Add_itm_bry(val.Bfr(), 0, val.Len());
|
||||
bfr.Add_byte_nl();
|
||||
Add_nl();
|
||||
nde_itm_is_first = false;
|
||||
val.Clear();
|
||||
return this;
|
||||
@@ -79,10 +95,12 @@ public class Json_wtr {
|
||||
nde_itm_is_first = true;
|
||||
return this;
|
||||
}
|
||||
private Json_wtr Add_grp_end(byte[] grp_sym) {
|
||||
private Json_wtr Add_grp_end(boolean grp_is_nde, byte[] grp_sym) {
|
||||
--indent;
|
||||
nde_itm_is_first = false;
|
||||
if ((grp_is_nde && nde_itm_is_first) || (!grp_is_nde && ary_itm_is_first))
|
||||
Add_nl();
|
||||
Add_indent(0);
|
||||
nde_itm_is_first = false;
|
||||
bfr.Add(grp_sym);
|
||||
return this;
|
||||
}
|
||||
@@ -93,7 +111,7 @@ public class Json_wtr {
|
||||
}
|
||||
private void Add_itm_bry(byte[] bry) {Add_itm_bry(bry, 0, bry.length);}
|
||||
private void Add_itm_bry(byte[] bry, int bgn, int end) {
|
||||
bfr.Add_byte(quote_byte);
|
||||
bfr.Add_byte(opt_quote_byte);
|
||||
for (int i = bgn; i < end; i++) {
|
||||
byte b = bry[i];
|
||||
switch (b) {
|
||||
@@ -105,25 +123,32 @@ public class Json_wtr {
|
||||
default: bfr.Add_byte(b); break;
|
||||
}
|
||||
}
|
||||
bfr.Add_byte(quote_byte);
|
||||
bfr.Add_byte(opt_quote_byte);
|
||||
}
|
||||
private void Add_indent_itm(boolean v) {
|
||||
if (v)
|
||||
Add_indent(0);
|
||||
if (v) {
|
||||
bfr.Add_byte_space();
|
||||
}
|
||||
else {
|
||||
Add_indent(-1);
|
||||
bfr.Add(Sym_itm_spr);
|
||||
}
|
||||
}
|
||||
private Json_wtr Add_nl() {
|
||||
if (opt_ws)
|
||||
bfr.Add_byte_nl();
|
||||
return this;
|
||||
}
|
||||
private void Add_indent(int adj) {
|
||||
int level = indent + adj;
|
||||
if (level > 0) bfr.Add_byte_repeat(Byte_ascii.Space, level * 2);
|
||||
if (opt_ws && level > 0)
|
||||
bfr.Add_byte_repeat(Byte_ascii.Space, level * 2);
|
||||
}
|
||||
private static final byte[]
|
||||
Sym_nde_bgn = Bry_.new_a7("{\n")
|
||||
, Sym_nde_end = Bry_.new_a7("}\n")
|
||||
, Sym_ary_bgn = Bry_.new_a7("[\n")
|
||||
, Sym_ary_end = Bry_.new_a7("]\n")
|
||||
, Sym_itm_spr = Bry_.new_a7(", ")
|
||||
Sym_nde_bgn = Bry_.new_a7("{")
|
||||
, Sym_nde_end = Bry_.new_a7("}")
|
||||
, Sym_ary_bgn = Bry_.new_a7("[")
|
||||
, Sym_ary_end = Bry_.new_a7("]")
|
||||
, Sym_itm_spr = Bry_.new_a7(", ")
|
||||
;
|
||||
}
|
||||
@@ -15,9 +15,9 @@ GNU Affero General Public License for more details.
|
||||
You should have received a copy of the GNU Affero General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package gplx.json; import gplx.*;
|
||||
package gplx.core.json; import gplx.*; import gplx.core.*;
|
||||
import org.junit.*;
|
||||
public class Json_wtr_tst {
|
||||
public class Json_wtr_tst {
|
||||
@Before public void init() {fxt.Clear();} private final Json_wtr_fxt fxt = new Json_wtr_fxt();
|
||||
@Test public void Root() {
|
||||
fxt.Wtr().Doc_bgn().Doc_end();
|
||||
@@ -33,8 +33,7 @@ public class Json_wtr_tst {
|
||||
.Kv_str("k1", "v1")
|
||||
.Doc_end();
|
||||
fxt.Test
|
||||
( "{"
|
||||
, " 'k0':'v0'"
|
||||
( "{ 'k0':'v0'"
|
||||
, ", 'k1':'v1'"
|
||||
, "}"
|
||||
);
|
||||
@@ -52,16 +51,13 @@ public class Json_wtr_tst {
|
||||
.Nde_end()
|
||||
.Doc_end();
|
||||
fxt.Test
|
||||
( "{"
|
||||
, " 's0':"
|
||||
, " {"
|
||||
, " 's00':"
|
||||
( "{ 's0':"
|
||||
, " { 's00':"
|
||||
, " {"
|
||||
, " }"
|
||||
, " }"
|
||||
, ", 's1':"
|
||||
, " {"
|
||||
, " 's10':"
|
||||
, " { 's10':"
|
||||
, " {"
|
||||
, " }"
|
||||
, " }"
|
||||
@@ -77,10 +73,8 @@ public class Json_wtr_tst {
|
||||
.Ary_end()
|
||||
.Doc_end();
|
||||
fxt.Test
|
||||
( "{"
|
||||
, " 'a0':"
|
||||
, " ["
|
||||
, " 'v0'"
|
||||
( "{ 'a0':"
|
||||
, " [ 'v0'"
|
||||
, " , 'v1'"
|
||||
, " ]"
|
||||
, "}"
|
||||
@@ -88,8 +82,8 @@ public class Json_wtr_tst {
|
||||
}
|
||||
}
|
||||
class Json_wtr_fxt {
|
||||
private final Json_wtr wtr = new Json_wtr().Quote_byte_(Byte_ascii.Apos);
|
||||
public void Clear() {}
|
||||
private final Json_wtr wtr = new Json_wtr().Opt_quote_byte_(Byte_ascii.Apos);
|
||||
public void Clear() {wtr.Clear();}
|
||||
public Json_wtr Wtr() {return wtr;}
|
||||
public void Test(String... expd) {
|
||||
Tfds.Eq_ary_str
|
||||
@@ -24,11 +24,11 @@ class Http_client_rdr__stream implements Http_client_rdr {
|
||||
}
|
||||
public String Read_line() {
|
||||
try {return br.readLine();}
|
||||
catch (IOException e) {throw Exc_.new_exc(e, "net", "Read_line failed");}
|
||||
catch (IOException e) {throw Err_.new_exc(e, "net", "Read_line failed");}
|
||||
}
|
||||
public byte[] Read_line_as_bry() {return Bry_.new_u8(Read_line());}
|
||||
public void Rls() {
|
||||
try {br.close();}
|
||||
catch (IOException e) {throw Exc_.new_exc(e, "net", "Rls failed");}
|
||||
catch (IOException e) {throw Err_.new_exc(e, "net", "Rls failed");}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -26,15 +26,15 @@ class Http_client_wtr__stream implements Http_client_wtr {
|
||||
}
|
||||
public void Write_bry(byte[] bry) {
|
||||
try {stream.write(bry);}
|
||||
catch (IOException e) {throw Exc_.new_exc(e, "net", "Write_bry failed");}
|
||||
catch (IOException e) {throw Err_.new_exc(e, "net", "Write_bry failed");}
|
||||
}
|
||||
public void Write_str(String s) {
|
||||
try {stream.writeBytes(s);}
|
||||
catch (Exception e) {throw Exc_.new_exc(e, "net", "Write_str failed");}
|
||||
catch (Exception e) {throw Err_.new_exc(e, "net", "Write_str failed");}
|
||||
}
|
||||
public void Write_mid(byte[] bry, int bgn, int end) {
|
||||
try {stream.write(bry, bgn, end - bgn);}
|
||||
catch (IOException e) {throw Exc_.new_exc(e, "net", "Write_mid failed");}
|
||||
catch (IOException e) {throw Err_.new_exc(e, "net", "Write_mid failed");}
|
||||
}
|
||||
public void Write_stream(Io_stream_rdr stream_rdr) {
|
||||
synchronized (tmp_stream_bry) {
|
||||
@@ -48,6 +48,6 @@ class Http_client_wtr__stream implements Http_client_wtr {
|
||||
}
|
||||
public void Rls() {
|
||||
try {stream.close();}
|
||||
catch (IOException e) {throw Exc_.new_exc(e, "net", "Rls failed");}
|
||||
catch (IOException e) {throw Err_.new_exc(e, "net", "Rls failed");}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -20,13 +20,13 @@ public class Http_request_itm {
|
||||
public Http_request_itm(int type, byte[] url, byte[] protocol, byte[] host, byte[] user_agent
|
||||
, byte[] accept, byte[] accept_language, byte[] accept_encoding, boolean dnt, byte[] x_requested_with, byte[] cookie, byte[] referer
|
||||
, int content_length, byte[] content_type, byte[] content_type_boundary
|
||||
, byte[] connection, byte[] pragma, byte[] cache_control
|
||||
, byte[] connection, byte[] pragma, byte[] cache_control, byte[] origin
|
||||
, Http_post_data_hash post_data_hash
|
||||
) {
|
||||
this.type = type; this.url = url; this.protocol = protocol; this.host = host; this.user_agent = user_agent;
|
||||
this.accept = accept; this.accept_language = accept_language; this.accept_encoding = accept_encoding; this.dnt = dnt; this.x_requested_with = x_requested_with; this.cookie = cookie; this.referer = referer;
|
||||
this.content_length = content_length; this.content_type = content_type; this.content_type_boundary = content_type_boundary;
|
||||
this.connection = connection; this.pragma = pragma; this.cache_control = cache_control;
|
||||
this.connection = connection; this.pragma = pragma; this.cache_control = cache_control; this.origin = origin;
|
||||
this.post_data_hash = post_data_hash;
|
||||
}
|
||||
public int Type() {return type;} private final int type;
|
||||
@@ -47,32 +47,33 @@ public class Http_request_itm {
|
||||
public byte[] Connection() {return connection;} private final byte[] connection;
|
||||
public byte[] Pragma() {return pragma;} private final byte[] pragma;
|
||||
public byte[] Cache_control() {return cache_control;} private final byte[] cache_control;
|
||||
public byte[] Origin() {return origin;} private final byte[] origin;
|
||||
public Http_post_data_hash Post_data_hash() {return post_data_hash;} private final Http_post_data_hash post_data_hash;
|
||||
public String To_str(Bry_bfr bfr) {
|
||||
bfr .Add_kv_line("type" , type == Type_get ? "GET" : "POST")
|
||||
.Add_kv_line("url" , url)
|
||||
.Add_kv_line("protocol" , protocol)
|
||||
.Add_kv_line("host" , host)
|
||||
.Add_kv_line("user_agent" , user_agent)
|
||||
.Add_kv_line("accept" , accept)
|
||||
.Add_kv_line("accept_encoding" , accept_encoding)
|
||||
.Add_kv_line("dnt" , dnt)
|
||||
.Add_kv_line("x_requested_with" , x_requested_with)
|
||||
.Add_kv_line("cookie" , cookie)
|
||||
.Add_kv_line("referer" , referer)
|
||||
.Add_kv_line("content_length" , content_length)
|
||||
.Add_kv_line("content_type" , content_type)
|
||||
.Add_kv_line("content_type_boundary" , content_type_boundary)
|
||||
.Add_kv_line("connection" , connection)
|
||||
.Add_kv_line("pragma" , pragma)
|
||||
.Add_kv_line("cache_control" , cache_control)
|
||||
public String To_str(Bry_bfr bfr, boolean line) {
|
||||
bfr .Add_kv_dlm(line, "type" , type == Type_get ? "GET" : "POST")
|
||||
.Add_kv_dlm(line, "url" , url)
|
||||
.Add_kv_dlm(line, "protocol" , protocol)
|
||||
.Add_kv_dlm(line, "host" , host)
|
||||
.Add_kv_dlm(line, "user_agent" , user_agent)
|
||||
.Add_kv_dlm(line, "accept" , accept)
|
||||
.Add_kv_dlm(line, "accept_encoding" , accept_encoding)
|
||||
.Add_kv_dlm(line, "dnt" , dnt)
|
||||
.Add_kv_dlm(line, "x_requested_with" , x_requested_with)
|
||||
.Add_kv_dlm(line, "cookie" , cookie)
|
||||
.Add_kv_dlm(line, "referer" , referer)
|
||||
.Add_kv_dlm(line, "content_length" , content_length)
|
||||
.Add_kv_dlm(line, "content_type" , content_type)
|
||||
.Add_kv_dlm(line, "content_type_boundary" , content_type_boundary)
|
||||
.Add_kv_dlm(line, "connection" , connection)
|
||||
.Add_kv_dlm(line, "pragma" , pragma)
|
||||
.Add_kv_dlm(line, "cache_control" , cache_control)
|
||||
;
|
||||
if (post_data_hash != null) {
|
||||
int len = post_data_hash.Len();
|
||||
for (int i = 0; i < len; ++i) {
|
||||
Http_post_data_itm itm = post_data_hash.Get_at(i);
|
||||
bfr.Add_byte_repeat(Byte_ascii.Space, 2);
|
||||
bfr.Add_kv_line(String_.new_u8(itm.Key()), itm.Val());
|
||||
bfr.Add_kv_dlm(line, String_.new_u8(itm.Key()), itm.Val());
|
||||
}
|
||||
}
|
||||
return bfr.Xto_str_and_clear();
|
||||
|
||||
@@ -20,7 +20,7 @@ import gplx.core.primitives.*; import gplx.core.btries.*;
|
||||
public class Http_request_parser {
|
||||
private boolean dnt;
|
||||
private int type, content_length;
|
||||
private byte[] url, protocol, host, user_agent, accept, accept_language, accept_encoding, x_requested_with, cookie, referer, content_type, content_type_boundary, connection, pragma, cache_control;
|
||||
private byte[] url, protocol, host, user_agent, accept, accept_language, accept_encoding, x_requested_with, cookie, referer, content_type, content_type_boundary, connection, pragma, cache_control, origin;
|
||||
private Http_post_data_hash post_data_hash;
|
||||
private final Bry_bfr tmp_bfr = Bry_bfr.new_(255);
|
||||
private final Http_server_wtr server_wtr; private final boolean log;
|
||||
@@ -29,89 +29,92 @@ public class Http_request_parser {
|
||||
this.dnt = false;
|
||||
this.type = this.content_length = 0;
|
||||
this.url = this.protocol = this.host = this.user_agent = this.accept = this.accept_language = this.accept_encoding = this.x_requested_with = this.cookie
|
||||
= this.referer = this.content_type = this.content_type_boundary = this.connection = this.pragma = this.cache_control = null;
|
||||
= this.referer = this.content_type = this.content_type_boundary = this.connection = this.pragma = this.cache_control = this.origin = null;
|
||||
this.post_data_hash = null;
|
||||
}
|
||||
public Http_request_itm Parse(Http_client_rdr rdr) {
|
||||
this.Clear();
|
||||
boolean reading_post_data = false; boolean post_nl_seen = false;
|
||||
while (true) {
|
||||
String line_str = rdr.Read_line(); if (line_str == null) break; // needed for TEST
|
||||
if (log) server_wtr.Write_str_w_nl(line_str);
|
||||
byte[] line = Bry_.new_u8(line_str);
|
||||
int line_len = line.length;
|
||||
if (line_len == 0) {
|
||||
switch (type) {
|
||||
case Http_request_itm.Type_get: break;
|
||||
case Http_request_itm.Type_post:
|
||||
if (reading_post_data || post_nl_seen) throw Exc_.new_("http.request.parser;invalid new line during post", "request", To_str());
|
||||
post_nl_seen = true; // only allow one \n per POST
|
||||
continue; // ignore line and get next
|
||||
default: throw Exc_.new_unimplemented();
|
||||
synchronized (tmp_bfr) {
|
||||
this.Clear();
|
||||
boolean reading_post_data = false; boolean post_nl_seen = false;
|
||||
while (true) {
|
||||
String line_str = rdr.Read_line(); if (line_str == null) break; // needed for TEST
|
||||
if (log) server_wtr.Write_str_w_nl(line_str);
|
||||
byte[] line = Bry_.new_u8(line_str);
|
||||
int line_len = line.length;
|
||||
if (line_len == 0) {
|
||||
switch (type) {
|
||||
case Http_request_itm.Type_get: break;
|
||||
case Http_request_itm.Type_post:
|
||||
if (reading_post_data || post_nl_seen) throw Err_.new_wo_type("http.request.parser;invalid new line during post", "request", To_str());
|
||||
post_nl_seen = true; // only allow one \n per POST
|
||||
continue; // ignore line and get next
|
||||
default: throw Err_.new_unimplemented();
|
||||
}
|
||||
break; // only GET will reach this line; GET requests always end with blank line; stop;
|
||||
}
|
||||
break; // only GET will reach this line; GET requests always end with blank line; stop;
|
||||
}
|
||||
if (content_type_boundary != null && Bry_.Has_at_bgn(line, content_type_boundary)) {
|
||||
while (true) {
|
||||
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);
|
||||
if (content_type_boundary != null && Bry_.Has_at_bgn(line, content_type_boundary)) {
|
||||
while (true) {
|
||||
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
|
||||
}
|
||||
Object o = trie.Match_bgn(line, 0, line_len);
|
||||
if (o == null) {
|
||||
server_wtr.Write_str_w_nl(String_.Format("http.request.parser; unknown line; line={0} request={1}", line_str, To_str()));
|
||||
continue;
|
||||
}
|
||||
int val_bgn = Bry_finder.Find_fwd_while_ws(line, trie.Match_pos(), line_len); // skip ws after key; EX: "Host: "
|
||||
int tid = ((Int_obj_val)o).Val();
|
||||
switch (tid) {
|
||||
case Tid_get:
|
||||
case Tid_post: Parse_type(tid, val_bgn, line, line_len); break;
|
||||
case Tid_host: this.host = Bry_.Mid(line, val_bgn, line_len); break;
|
||||
case Tid_user_agent: this.user_agent = Bry_.Mid(line, val_bgn, line_len); break;
|
||||
case Tid_accept: this.accept = Bry_.Mid(line, val_bgn, line_len); break;
|
||||
case Tid_accept_language: this.accept_language = Bry_.Mid(line, val_bgn, line_len); break;
|
||||
case Tid_accept_encoding: this.accept_encoding = Bry_.Mid(line, val_bgn, line_len); break;
|
||||
case Tid_dnt: this.dnt = line[val_bgn] == Byte_ascii.Num_1; break;
|
||||
case Tid_x_requested_with: this.x_requested_with = Bry_.Mid(line, val_bgn, line_len); break;
|
||||
case Tid_cookie: this.cookie = Bry_.Mid(line, val_bgn, line_len); break;
|
||||
case Tid_referer: this.referer = Bry_.Mid(line, val_bgn, line_len); break;
|
||||
case Tid_content_length: this.content_length = Bry_.Xto_int_or(line, val_bgn, line_len, -1); break;
|
||||
case Tid_content_type: Parse_content_type(val_bgn, line, line_len); break;
|
||||
case Tid_connection: this.connection = Bry_.Mid(line, val_bgn, line_len); break;
|
||||
case Tid_pragma: this.pragma = Bry_.Mid(line, val_bgn, line_len); break;
|
||||
case Tid_cache_control: this.cache_control = Bry_.Mid(line, val_bgn, line_len); break;
|
||||
case Tid_origin: this.origin = Bry_.Mid(line, val_bgn, line_len); break;
|
||||
default: throw Err_.new_unhandled(tid);
|
||||
}
|
||||
break; // assume form_data ends POST request
|
||||
}
|
||||
Object o = trie.Match_bgn(line, 0, line_len);
|
||||
if (o == null) {
|
||||
server_wtr.Write_str_w_nl(String_.Format("http.request.parser; unknown line; line={0} request={1}", line_str, To_str()));
|
||||
continue;
|
||||
}
|
||||
int val_bgn = Bry_finder.Find_fwd_while_ws(line, trie.Match_pos(), line_len); // skip ws after key; EX: "Host: "
|
||||
int tid = ((Int_obj_val)o).Val();
|
||||
switch (tid) {
|
||||
case Tid_get:
|
||||
case Tid_post: Parse_type(tid, val_bgn, line, line_len); break;
|
||||
case Tid_host: this.host = Bry_.Mid(line, val_bgn, line_len); break;
|
||||
case Tid_user_agent: this.user_agent = Bry_.Mid(line, val_bgn, line_len); break;
|
||||
case Tid_accept: this.accept = Bry_.Mid(line, val_bgn, line_len); break;
|
||||
case Tid_accept_language: this.accept_language = Bry_.Mid(line, val_bgn, line_len); break;
|
||||
case Tid_accept_encoding: this.accept_encoding = Bry_.Mid(line, val_bgn, line_len); break;
|
||||
case Tid_dnt: this.dnt = line[val_bgn] == Byte_ascii.Num_1; break;
|
||||
case Tid_x_requested_with: this.x_requested_with = Bry_.Mid(line, val_bgn, line_len); break;
|
||||
case Tid_cookie: this.cookie = Bry_.Mid(line, val_bgn, line_len); break;
|
||||
case Tid_referer: this.referer = Bry_.Mid(line, val_bgn, line_len); break;
|
||||
case Tid_content_length: this.content_length = Bry_.Xto_int_or(line, val_bgn, line_len, -1); break;
|
||||
case Tid_content_type: Parse_content_type(val_bgn, line, line_len); break;
|
||||
case Tid_connection: this.connection = Bry_.Mid(line, val_bgn, line_len); break;
|
||||
case Tid_pragma: this.pragma = Bry_.Mid(line, val_bgn, line_len); break;
|
||||
case Tid_cache_control: this.cache_control = Bry_.Mid(line, val_bgn, line_len); break;
|
||||
default: throw Exc_.new_unhandled(tid);
|
||||
}
|
||||
return Make_request_itm();
|
||||
}
|
||||
return Make_request_itm();
|
||||
}
|
||||
private void Parse_type(int tid, int val_bgn, byte[] line, int line_len) { // EX: "POST /xowa-cmd:exec_as_json HTTP/1.1"
|
||||
int url_end = Bry_finder.Find_bwd(line, Byte_ascii.Space, line_len); if (url_end == Bry_finder.Not_found) throw Exc_.new_("invalid protocol", "line", line, "request", To_str());
|
||||
int url_end = Bry_finder.Find_bwd(line, Byte_ascii.Space, line_len); if (url_end == Bry_finder.Not_found) throw Err_.new_wo_type("invalid protocol", "line", line, "request", To_str());
|
||||
switch (tid) {
|
||||
case Tid_get : this.type = Http_request_itm.Type_get; break;
|
||||
case Tid_post : this.type = Http_request_itm.Type_post; break;
|
||||
default : throw Exc_.new_unimplemented();
|
||||
default : throw Err_.new_unimplemented();
|
||||
}
|
||||
this.url = Bry_.Mid(line, val_bgn, url_end);
|
||||
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 Exc_.new_("invalid content_type", "line", line, "request", To_str());
|
||||
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());
|
||||
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));
|
||||
}
|
||||
private Http_request_itm Make_request_itm() {
|
||||
return new Http_request_itm(type, url, protocol, host, user_agent, accept, accept_language, accept_encoding, dnt, x_requested_with, cookie, referer, content_length, content_type, content_type_boundary, connection, pragma, cache_control, post_data_hash);
|
||||
return new Http_request_itm(type, url, protocol, host, user_agent, accept, accept_language, accept_encoding, dnt, x_requested_with, cookie, referer, content_length, content_type, content_type_boundary, connection, pragma, cache_control, origin, post_data_hash);
|
||||
}
|
||||
private byte[] Parse_content_type_boundary(Http_client_rdr rdr) {
|
||||
if (post_data_hash == null) post_data_hash = new Http_post_data_hash();
|
||||
byte[] line = Bry_.new_u8(rdr.Read_line()); // cur line is already known to be content_type_boundary; skip it
|
||||
byte[] key = Parse_post_data_name(line);
|
||||
String line_str = rdr.Read_line(); // blank-line
|
||||
if (String_.Len_gt_0(line_str)) {throw Exc_.new_("http.request.parser; blank_line should follow content_type_boundary", "request", To_str());}
|
||||
if (String_.Len_gt_0(line_str)) {throw Err_.new_wo_type("http.request.parser; blank_line should follow content_type_boundary", "request", To_str());}
|
||||
while (true) {
|
||||
line = Bry_.new_u8(rdr.Read_line());
|
||||
if (Bry_.Has_at_bgn(line, content_type_boundary)) break;
|
||||
@@ -128,7 +131,7 @@ public class Http_request_parser {
|
||||
pos = Assert_tkn(line, pos, line_len, Tkn_name);
|
||||
int name_end = line_len;
|
||||
if (line[pos] == Byte_ascii.Quote) {
|
||||
if (line[name_end - 1] != Byte_ascii.Quote) throw Exc_.new_("http.request.parser; invalid form at end", "line", line, "request", To_str());
|
||||
if (line[name_end - 1] != Byte_ascii.Quote) throw Err_.new_wo_type("http.request.parser; invalid form at end", "line", line, "request", To_str());
|
||||
++pos;
|
||||
--name_end;
|
||||
}
|
||||
@@ -136,13 +139,13 @@ public class Http_request_parser {
|
||||
}
|
||||
private int Assert_tkn(byte[] src, int src_pos, int src_len, byte[] tkn) {
|
||||
int tkn_len = tkn.length;
|
||||
if (!Bry_.Match(src, src_pos, src_pos + tkn_len, tkn)) throw Exc_.new_("http.request.parser; invalid form_data line", "tkn", tkn, "line", src, "request", To_str());
|
||||
if (!Bry_.Match(src, src_pos, src_pos + tkn_len, tkn)) throw Err_.new_wo_type("http.request.parser; invalid form_data line", "tkn", tkn, "line", src, "request", To_str());
|
||||
int rv = src_pos += tkn_len;
|
||||
return Bry_finder.Find_fwd_while_ws(src, rv, src_len);
|
||||
}
|
||||
private String To_str() {return Make_request_itm().To_str(tmp_bfr);}
|
||||
private String To_str() {return Make_request_itm().To_str(tmp_bfr, Bool_.N);}
|
||||
private static final int Tid_get = 1, Tid_post = 2, Tid_host = 3, Tid_user_agent = 4, Tid_accept = 5, Tid_accept_language = 6, Tid_accept_encoding = 7, Tid_dnt = 8
|
||||
, Tid_x_requested_with = 9, Tid_cookie = 10, Tid_referer = 11, Tid_content_length = 12, Tid_content_type = 13, Tid_connection = 14, Tid_pragma = 15, Tid_cache_control = 16;
|
||||
, Tid_x_requested_with = 9, Tid_cookie = 10, Tid_referer = 11, Tid_content_length = 12, Tid_content_type = 13, Tid_connection = 14, Tid_pragma = 15, Tid_cache_control = 16, Tid_origin = 17;
|
||||
private static final Btrie_slim_mgr trie = Btrie_slim_mgr.ci_ascii_()
|
||||
.Add_str_int("GET" , Tid_get)
|
||||
.Add_str_int("POST" , Tid_post)
|
||||
@@ -160,6 +163,7 @@ public class Http_request_parser {
|
||||
.Add_str_int("Connection:" , Tid_connection)
|
||||
.Add_str_int("Pragma:" , Tid_pragma)
|
||||
.Add_str_int("Cache-Control:" , Tid_cache_control)
|
||||
.Add_str_int("Origin:" , Tid_origin)
|
||||
;
|
||||
private static final byte[] Tkn_boundary = Bry_.new_a7("boundary="), Tkn_content_type_boundary_end = Bry_.new_a7("--")
|
||||
, Tkn_content_disposition = Bry_.new_a7("Content-Disposition:"), Tkn_form_data = Bry_.new_a7("form-data;")
|
||||
|
||||
@@ -16,6 +16,7 @@ You should have received a copy of the GNU Affero General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package gplx.core.net; import gplx.*; import gplx.core.*;
|
||||
import gplx.core.consoles.*;
|
||||
class Http_server_wtr__console implements Http_server_wtr {
|
||||
public void Write_str_w_nl(String s) {ConsoleAdp._.WriteLine(s);}
|
||||
public void Write_str_w_nl(String s) {Console_adp__sys.I.Write_str_w_nl(s);}
|
||||
}
|
||||
|
||||
@@ -15,8 +15,10 @@ GNU Affero General Public License for more details.
|
||||
You should have received a copy of the GNU Affero General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package gplx.xowa.html.xouis.fmtrs; import gplx.*; import gplx.xowa.*; import gplx.xowa.html.*; import gplx.xowa.html.xouis.*;
|
||||
public class Xoui_val_fmtr_ {
|
||||
public static Xoui_val_fmtr new_view() {return new Xoui_val_fmtr__view();}
|
||||
public static Xoui_val_fmtr new_edit() {return new Xoui_val_fmtr__edit();}
|
||||
package gplx.core.net; import gplx.*; import gplx.core.*;
|
||||
public class Local_host_ {
|
||||
public static String Ip_address() {
|
||||
try {return java.net.InetAddress.getLocalHost().getHostAddress();}
|
||||
catch (Exception e) {throw Err_.new_exc(e, "net", "ip_address failed");}
|
||||
}
|
||||
}
|
||||
23
400_xowa/src/gplx/core/net/Server_socket_adp.java
Normal file
23
400_xowa/src/gplx/core/net/Server_socket_adp.java
Normal file
@@ -0,0 +1,23 @@
|
||||
/*
|
||||
XOWA: the XOWA Offline Wiki Application
|
||||
Copyright (C) 2012 gnosygnu@gmail.com
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Affero General Public License as
|
||||
published by the Free Software Foundation, either version 3 of the
|
||||
License, or (at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU Affero General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Affero General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package gplx.core.net; import gplx.*; import gplx.core.*;
|
||||
public interface Server_socket_adp {
|
||||
Server_socket_adp Ctor(int port);
|
||||
Socket_adp Accept();
|
||||
void Rls();
|
||||
}
|
||||
39
400_xowa/src/gplx/core/net/Server_socket_adp__base.java
Normal file
39
400_xowa/src/gplx/core/net/Server_socket_adp__base.java
Normal file
@@ -0,0 +1,39 @@
|
||||
/*
|
||||
XOWA: the XOWA Offline Wiki Application
|
||||
Copyright (C) 2012 gnosygnu@gmail.com
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Affero General Public License as
|
||||
published by the Free Software Foundation, either version 3 of the
|
||||
License, or (at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU Affero General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Affero General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package gplx.core.net; import gplx.*; import gplx.core.*;
|
||||
import java.io.IOException;
|
||||
import java.net.ServerSocket;
|
||||
import java.net.Socket;
|
||||
public class Server_socket_adp__base implements Server_socket_adp {
|
||||
private ServerSocket server_socket;
|
||||
public Server_socket_adp Ctor(int port) {
|
||||
try {this.server_socket = new ServerSocket(port);}
|
||||
catch (IOException e) {throw Err_.new_exc(e, "net", "Get_input_stream failed");}
|
||||
return this;
|
||||
}
|
||||
public Socket_adp Accept() {
|
||||
Socket client_socket = null;
|
||||
try {client_socket = server_socket.accept();}
|
||||
catch (IOException e) {throw Err_.new_exc(e, "net", "Get_input_stream failed");}
|
||||
return new Socket_adp__base(client_socket);
|
||||
}
|
||||
public void Rls() {
|
||||
try {server_socket.close();}
|
||||
catch (IOException e) {throw Err_.new_exc(e, "net", "Rls failed");}
|
||||
}
|
||||
}
|
||||
@@ -17,6 +17,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package gplx.core.net; import gplx.*; import gplx.core.*;
|
||||
public interface Socket_adp {
|
||||
String Ip_address();
|
||||
Object Get_input_stream();
|
||||
Object Get_output_stream();
|
||||
void Rls();
|
||||
|
||||
@@ -21,16 +21,19 @@ import java.net.*;
|
||||
public class Socket_adp__base implements Socket_adp {
|
||||
private final Socket socket;
|
||||
public Socket_adp__base(Socket socket) {this.socket = socket;}
|
||||
public Object Get_input_stream() {
|
||||
public String Ip_address() {
|
||||
return socket.getRemoteSocketAddress().toString();
|
||||
}
|
||||
public Object Get_input_stream() {
|
||||
try {return socket.getInputStream();}
|
||||
catch (IOException e) {throw Exc_.new_exc(e, "net", "Get_input_stream failed");}
|
||||
catch (IOException e) {throw Err_.new_exc(e, "net", "Get_input_stream failed");}
|
||||
}
|
||||
public Object Get_output_stream() {
|
||||
try {return socket.getOutputStream();}
|
||||
catch (IOException e) {throw Exc_.new_exc(e, "net", "Get_output_stream failed");}
|
||||
catch (IOException e) {throw Err_.new_exc(e, "net", "Get_output_stream failed");}
|
||||
}
|
||||
public void Rls() {
|
||||
try {socket.close();}
|
||||
catch (IOException e) {throw Exc_.new_exc(e, "net", "Rls failed");}
|
||||
catch (IOException e) {throw Err_.new_exc(e, "net", "Rls failed");}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -26,9 +26,9 @@ public class Gfo_pattern_itm_ {
|
||||
int pos = 0;
|
||||
while (true) {
|
||||
boolean last = pos == raw_len;
|
||||
byte b = last ? Byte_ascii.Nil : raw[pos];
|
||||
byte b = last ? Byte_ascii.Null : raw[pos];
|
||||
switch (b) {
|
||||
case Byte_ascii.Nil:
|
||||
case Byte_ascii.Null:
|
||||
if (itm != null) {itm.Compile(raw, itm_bgn, pos); itm = null; itm_bgn = -1;}
|
||||
break;
|
||||
case Byte_ascii.Star:
|
||||
|
||||
@@ -38,7 +38,7 @@ public class Gfo_thread_cmd_download implements Gfo_thread_cmd {
|
||||
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 Exc_.new_unhandled(rslt);
|
||||
default: throw Err_.new_unhandled(rslt);
|
||||
}
|
||||
}
|
||||
usr_dlg.Prog_many(GRP_KEY, "download.bgn", "contacting web server: '~{0}'", src); // update progress; some servers (like WMF dump servers) are slow to respond
|
||||
|
||||
@@ -82,10 +82,10 @@ public class Gfo_thread_cmd_unzip implements Gfo_thread_cmd {
|
||||
case Term_cmd_for_src_noop: break;
|
||||
case Term_cmd_for_src_delete: Io_mgr.I.DeleteFil(src); break;
|
||||
case Term_cmd_for_src_move:
|
||||
if (term_cmd_for_src_url == Io_url_.Empty) throw Exc_.new_("move specified, but no url");
|
||||
if (term_cmd_for_src_url == Io_url_.Empty) throw Err_.new_wo_type("move specified, but no url");
|
||||
Io_mgr.I.MoveFil_args(src, term_cmd_for_src_url, true).Exec();
|
||||
break;
|
||||
default: throw Exc_.new_unhandled(term_cmd_for_src);
|
||||
default: throw Err_.new_unhandled(term_cmd_for_src);
|
||||
}
|
||||
usr_dlg.Prog_many(GRP_KEY, "done", "");
|
||||
return true;
|
||||
@@ -108,7 +108,7 @@ public class Gfo_thread_cmd_unzip implements Gfo_thread_cmd {
|
||||
if (String_.Eq(s, "noop")) return Term_cmd_for_src_noop;
|
||||
else if (String_.Eq(s, "delete")) return Term_cmd_for_src_delete;
|
||||
else if (String_.Eq(s, "move")) return Term_cmd_for_src_move;
|
||||
else throw Exc_.new_unhandled(s);
|
||||
else throw Err_.new_unhandled(s);
|
||||
}
|
||||
static final String GRP_KEY = "xowa.thread.file.unzip";
|
||||
public static final String KEY = "file.unzip";
|
||||
|
||||
@@ -46,7 +46,7 @@ public class Gfo_thread_pool implements GfoInvkAble {
|
||||
private void Run_wkr(Gfo_thread_wkr wkr) {
|
||||
try {wkr.Exec();}
|
||||
catch (Exception e) {
|
||||
usr_dlg.Warn_many("", "", "uncaught exception while running thread; name=~{0} err=~{1}", wkr.Name(), Err_.Message_gplx_brief(e));
|
||||
usr_dlg.Warn_many("", "", "uncaught exception while running thread; name=~{0} err=~{1}", wkr.Name(), Err_.Message_gplx_full(e));
|
||||
}
|
||||
finally {
|
||||
if (wkr.Resume())
|
||||
|
||||
@@ -28,7 +28,7 @@ public class Db_attach_rdr {
|
||||
public void Attach() {
|
||||
try {
|
||||
if (diff_db) conn.Env_db_attach(attach_name, attach_url);
|
||||
} catch (Exception e) {Exc_.Noop(e); Gfo_usr_dlg_.I.Warn_many("", "", "db:failed to attach db; name=~{0} url=~{1}", attach_name, attach_url.Raw());}
|
||||
} catch (Exception e) {Err_.Noop(e); Gfo_usr_dlg_.I.Warn_many("", "", "db:failed to attach db; name=~{0} url=~{1}", attach_name, attach_url.Raw());}
|
||||
}
|
||||
public Db_rdr Exec_as_rdr(String sql) {
|
||||
sql = String_.Replace(sql, "<attach_db>", diff_db ? attach_name + "." : ""); // replace <attach> with either "attach_db." or "";
|
||||
|
||||
@@ -27,7 +27,7 @@ public class Db_cfg_hash {
|
||||
}
|
||||
public void Set(String key, String val) {hash.Del(key); Add(key, val);}
|
||||
public void Add(String key, String val) {
|
||||
if (hash.Has(key)) throw Exc_.new_("itm exists", "grp", grp, "key", key);
|
||||
if (hash.Has(key)) throw Err_.new_wo_type("itm exists", "grp", grp, "key", key);
|
||||
Db_cfg_itm itm = new Db_cfg_itm(grp, key, val);
|
||||
hash.Add(key, itm);
|
||||
}
|
||||
|
||||
@@ -34,8 +34,8 @@ public class Db_cfg_itm {
|
||||
public byte To_byte() {Fail_if_null(); try {return Byte_.parse_(val) ;} catch (Exception e) {throw err_parse(e, Byte_.Cls_val_name);}}
|
||||
public int To_int() {Fail_if_null(); try {return Int_.parse_(val) ;} catch (Exception e) {throw err_parse(e, Int_.Cls_val_name);}}
|
||||
public String To_str() {Fail_if_null(); return val;}
|
||||
private void Fail_if_null() {if (val == null) throw Exc_.new_("cfg.val is empty", "grp", grp, "key", key); }
|
||||
private Exc err_parse(Exception e, String type) {return Exc_.new_("cfg.val is not parseable", "grp", grp, "key", key, "val", val, "type", type).Stack_erase_1_();}
|
||||
private void Fail_if_null() {if (val == null) throw Err_.new_wo_type("cfg.val is empty", "grp", grp, "key", key); }
|
||||
private Err err_parse(Exception e, String type) {return Err_.new_wo_type("cfg.val is not parseable", "grp", grp, "key", key, "val", val, "type", type).Trace_ignore_add_1_();}
|
||||
|
||||
private static final String Grp_none = "";
|
||||
public static Db_cfg_itm new_str (String key, String val) {return new Db_cfg_itm(Grp_none , key, val);}
|
||||
|
||||
@@ -49,7 +49,7 @@ public class Db_cfg_tbl implements RlsAble {
|
||||
if (stmt_insert == null) stmt_insert = conn.Stmt_insert(tbl_name, flds);
|
||||
try {
|
||||
stmt_insert.Clear().Val_str(fld_grp, grp).Val_str(fld_key, key).Val_str(fld_val, val).Exec_insert();
|
||||
} catch (Exception e) {throw Exc_.new_exc(e, "db", "db_cfg.insert failed", "grp", grp, "key", key, "val", val, "db", conn.Conn_info().Xto_api());}
|
||||
} catch (Exception e) {throw Err_.new_exc(e, "db", "db_cfg.insert failed", "grp", grp, "key", key, "val", val, "db", conn.Conn_info().Xto_api());}
|
||||
}
|
||||
public void Update_yn (String grp, String key, boolean val) {Update_str(grp, key, val ? "y" : "n");}
|
||||
public void Update_byte (String grp, String key, byte val) {Update_str(grp, key, Byte_.Xto_str(val));}
|
||||
@@ -84,7 +84,7 @@ public class Db_cfg_tbl implements RlsAble {
|
||||
public DateAdp Select_date_or (String grp, String key, DateAdp or) {String val = Select_str_or(grp, key, null) ; return val == null ? or : Parse_date (grp, key, val);}
|
||||
public Guid_adp Select_guid_or (String grp, String key, Guid_adp or) {String val = Select_str_or(grp, key, null) ; return val == null ? or : Parse_guid (grp, key, val);}
|
||||
public String Select_str (String grp, String key) {
|
||||
String rv = Select_str_or(grp, key, null); if (rv == null) throw Exc_.new_("cfg.missing", "grp", grp, "key", key);
|
||||
String rv = Select_str_or(grp, key, null); if (rv == null) throw Err_.new_wo_type("cfg.missing", "grp", grp, "key", key);
|
||||
return rv;
|
||||
}
|
||||
public String Select_str_or (String grp, String key, String or) {
|
||||
@@ -119,5 +119,5 @@ public class Db_cfg_tbl implements RlsAble {
|
||||
private byte[] Parse_bry (String grp, String key, String val) {try {return Bry_.new_u8(val) ;} catch (Exception e) {throw err_parse(e, grp, key, val, Bry_.Cls_val_name);}}
|
||||
private DateAdp Parse_date (String grp, String key, String val) {try {return DateAdp_.parse_gplx(val) ;} catch (Exception e) {throw err_parse(e, grp, key, val, DateAdp_.Cls_ref_name);}}
|
||||
private Guid_adp Parse_guid (String grp, String key, String val) {try {return Guid_adp_.parse_(val) ;} catch (Exception e) {throw err_parse(e, grp, key, val, Guid_adp_.Cls_ref_name);}}
|
||||
private Exc err_parse(Exception e, String grp, String key, String val, String type) {return Exc_.new_exc(e, "db", "cfg.val is not parseable", "grp", grp, "key", key, "val", val, "type", type);}
|
||||
private Err err_parse(Exception e, String grp, String key, String val, String type) {return Err_.new_exc(e, "db", "cfg.val is not parseable", "grp", grp, "key", key, "val", val, "type", type);}
|
||||
}
|
||||
|
||||
@@ -42,7 +42,7 @@ class Schema_loader_mgr__sqlite implements Schema_loader_mgr {
|
||||
tbl_mgr.Add(tbl_itm);
|
||||
break;
|
||||
case Meta_itm_tid.Tid_index: break; // noop for now
|
||||
default: throw Exc_.new_unhandled(type_str);
|
||||
default: throw Err_.new_unhandled(type_str);
|
||||
}
|
||||
}
|
||||
} finally {rdr.Rls();}
|
||||
|
||||
@@ -25,7 +25,7 @@ public class Schema_update_mgr {
|
||||
Schema_update_cmd cmd = (Schema_update_cmd)cmds.Get_at(i);
|
||||
try {cmd.Exec(schema_mgr, conn);}
|
||||
catch (Exception e) {
|
||||
Gfo_usr_dlg_.I.Warn_many("", "", "failed to run update cmd; name=~{0} err=~{1}", cmd.Name(), Err_.Message_gplx_brief(e));
|
||||
Gfo_usr_dlg_.I.Warn_many("", "", "failed to run update cmd; name=~{0} err=~{1}", cmd.Name(), Err_.Message_gplx_full(e));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -72,7 +72,7 @@ public class Fsdb_db_mgr__v1 implements Fsdb_db_mgr {
|
||||
return rv;
|
||||
}
|
||||
rv = file_dir.GenSubFil_nest(mnt_name, Atr_name_v1b); if (Io_mgr.I.ExistsFil(rv)) return rv;
|
||||
throw Exc_.new_("could not find atr file", "dir", file_dir.Raw(), "mnt", mnt_name);
|
||||
throw Err_.new_wo_type("could not find atr file", "dir", file_dir.Raw(), "mnt", mnt_name);
|
||||
}
|
||||
public static final String Orig_name = "wiki.orig#00.sqlite3", Mnt_name = "wiki.mnt.sqlite3", Abc_name = "fsdb.abc.sqlite3"
|
||||
, Atr_name_v1a = "fsdb.atr#00.sqlite3", Atr_name_v1b = "fsdb.atr.00.sqlite3";
|
||||
|
||||
@@ -86,7 +86,7 @@ public class Fsdb_db_mgr__v2_bldr {
|
||||
case Xowd_db_layout.Const_all: return Main_core_name_all(wiki_domain);
|
||||
case Xowd_db_layout.Const_few: return Main_core_name_few(wiki_domain);
|
||||
case Xowd_db_layout.Const_lot: return Main_core_name_lot(wiki_domain);
|
||||
default: throw Exc_.new_unimplemented();
|
||||
default: throw Err_.new_unimplemented();
|
||||
}
|
||||
}
|
||||
private static byte Main_core_tid(Xowd_db_layout layout) {
|
||||
@@ -94,7 +94,7 @@ public class Fsdb_db_mgr__v2_bldr {
|
||||
case Xowd_db_layout.Const_all: return Xowd_db_file_.Tid_core;
|
||||
case Xowd_db_layout.Const_few: return Xowd_db_file_.Tid_file_solo;
|
||||
case Xowd_db_layout.Const_lot: return Xowd_db_file_.Tid_file_core;
|
||||
default: throw Exc_.new_unimplemented();
|
||||
default: throw Err_.new_unimplemented();
|
||||
}
|
||||
}
|
||||
public static void Make_cfg_data(Xow_wiki wiki, String file_core_name, Fsdb_db_file file, byte file_tid, int part_id) {
|
||||
|
||||
@@ -47,7 +47,7 @@ public class Fsm_atr_tbl {
|
||||
}
|
||||
}
|
||||
finally {rdr.Rls();}
|
||||
throw Exc_.new_("missing atr db", "conn", conn.Conn_info().Xto_api());
|
||||
throw Err_.new_wo_type("missing atr db", "conn", conn.Conn_info().Xto_api());
|
||||
}
|
||||
public void Insert(int id, String url_rel) {
|
||||
conn.Stmt_insert(tbl_name, flds).Val_int(fld_uid, id).Val_str(fld_url, url_rel).Exec_insert();
|
||||
|
||||
@@ -24,7 +24,7 @@ public class Fsm_cfg_mgr {
|
||||
}
|
||||
public void Ctor_by_load() {
|
||||
Db_cfg_hash hash = Grps_get_or_load(Grp_core);
|
||||
this.next_id = hash.Get(Key_next_id).To_int_or(-1); if (next_id == -1) throw Exc_.new_("next_id not found in cfg", "url", tbl.Conn().Conn_info().Xto_api());
|
||||
this.next_id = hash.Get(Key_next_id).To_int_or(-1); if (next_id == -1) throw Err_.new_wo_type("next_id not found in cfg", "url", tbl.Conn().Conn_info().Xto_api());
|
||||
this.schema_thm_page = hash.Get(Key_schema_thm_page).To_yn_or_n();
|
||||
this.patch__next_id = hash.Get(Key_patch__next_id).To_yn_or_n();
|
||||
this.patch__page_gt_1 = hash.Get(Key_patch__page_gt_1).To_yn_or_n();
|
||||
|
||||
@@ -150,7 +150,7 @@ class Gfs_lxr_quote implements Gfs_lxr {
|
||||
public int Process(Gfs_parser_ctx ctx, int lxr_bgn, int lxr_end) {
|
||||
byte[] src = ctx.Src(); int src_len = ctx.Src_len();
|
||||
int end_pos = Bry_finder.Find_fwd(src, end_bry, lxr_end, src_len);
|
||||
if (end_pos == Bry_.NotFound) throw Exc_.new_("quote is not closed", "end", String_.new_u8(end_bry));
|
||||
if (end_pos == Bry_.NotFound) throw Err_.new_wo_type("quote is not closed", "end", String_.new_u8(end_bry));
|
||||
Bry_bfr bfr = ctx.Tmp_bfr().Clear();
|
||||
int prv_pos = lxr_end;
|
||||
int nxt_pos = end_pos + end_bry_len;
|
||||
@@ -160,7 +160,7 @@ class Gfs_lxr_quote implements Gfs_lxr {
|
||||
bfr.Add(end_bry); // add end_bry
|
||||
prv_pos = nxt_pos + end_bry_len; // set prv_pos to after doubled end_bry
|
||||
end_pos = Bry_finder.Find_fwd(src, end_bry, prv_pos, src_len);
|
||||
if (end_pos == Bry_.NotFound) throw Exc_.new_("quote is not closed", "end", String_.new_u8(end_bry));
|
||||
if (end_pos == Bry_.NotFound) throw Err_.new_wo_type("quote is not closed", "end", String_.new_u8(end_bry));
|
||||
nxt_pos = end_pos + end_bry_len;
|
||||
if (!Bry_.Match(src, nxt_pos, nxt_pos + end_bry_len, end_bry)) {
|
||||
bfr.Add_mid(src, prv_pos, end_pos);
|
||||
|
||||
@@ -33,7 +33,7 @@ class Gfs_lxr_ {
|
||||
case Tid_whitespace: return "whitespace";
|
||||
case Tid_comment: return "comment";
|
||||
case Tid_eq: return "eq";
|
||||
default: throw Exc_.new_unhandled(tid);
|
||||
default: throw Err_.new_unhandled(tid);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -79,7 +79,7 @@ class Gfs_err_mgr {
|
||||
KeyVal arg = args[i];
|
||||
tmp_fail_args.Add(arg.Key(), arg.Val_to_str_or_empty());
|
||||
}
|
||||
throw Exc_.new_(Fail_msg(msg, tmp_fail_args));
|
||||
throw Err_.new_wo_type(Fail_msg(msg, tmp_fail_args));
|
||||
}
|
||||
private void Fail_args_standard(byte[] src, int src_len, int pos) {
|
||||
tmp_fail_args.Add("excerpt_bgn", Fail_excerpt_bgn(src, src_len, pos));
|
||||
|
||||
@@ -145,7 +145,7 @@ class Gfs_parser_fxt {
|
||||
byte[] src_bry = Bry_.new_u8(src_str);
|
||||
try {parser.Parse(src_bry);}
|
||||
catch (Exception e) {
|
||||
String actl_err = Err_.Message_gplx_brief(e);
|
||||
String actl_err = Err_.Message_gplx_full(e);
|
||||
actl_err = String_.GetStrBefore(actl_err, ":");
|
||||
boolean match = String_.Has(actl_err, expd_err);
|
||||
if (!match) Tfds.Fail("expecting '" + expd_err + "' got '" + actl_err + "'");
|
||||
|
||||
@@ -69,7 +69,7 @@ public class Gfui_bnd_parser {
|
||||
++pos;
|
||||
continue;
|
||||
case Byte_ascii.Hash:
|
||||
if (is_numeric) throw Exc_.new_("multiple numeric symbols in keycode");
|
||||
if (is_numeric) throw Err_.new_wo_type("multiple numeric symbols in keycode");
|
||||
is_numeric = true;
|
||||
++pos;
|
||||
continue;
|
||||
@@ -103,10 +103,10 @@ public class Gfui_bnd_parser {
|
||||
int tkn_bgn = itm_bgn;
|
||||
if (src_is_gfui) { // remove "key." in "key.#10"
|
||||
tkn_bgn = Bry_finder.Move_fwd(src, Byte_ascii.Dot, itm_bgn, itm_end);
|
||||
if (tkn_bgn == -1) throw Exc_.new_("invalid keycode.dot", "keycode", Bry_.Mid(src, tkn_bgn, itm_end));
|
||||
if (tkn_bgn == -1) throw Err_.new_wo_type("invalid keycode.dot", "keycode", Bry_.Mid(src, tkn_bgn, itm_end));
|
||||
++tkn_bgn; // skip #
|
||||
}
|
||||
int keycode = Bry_.Xto_int_or(src, tkn_bgn, itm_end, -1); if (keycode == -1) throw Exc_.new_("invalid keycode", "keycode", Bry_.Mid(src, tkn_bgn, itm_end));
|
||||
int keycode = Bry_.Xto_int_or(src, tkn_bgn, itm_end, -1); if (keycode == -1) throw Err_.new_wo_type("invalid keycode", "keycode", Bry_.Mid(src, tkn_bgn, itm_end));
|
||||
tkn = new Gfui_bnd_tkn(Gfui_bnd_tkn.Tid_key, keycode, Bry_.Empty, Bry_.Empty);
|
||||
}
|
||||
else
|
||||
@@ -122,7 +122,7 @@ public class Gfui_bnd_parser {
|
||||
case Gfui_bnd_tkn.Tid_mod_ca: mod_adj = Gfui_bnd_tkn.Tid_mod_ca; break;
|
||||
case Gfui_bnd_tkn.Tid_mod_cas: mod_adj = Gfui_bnd_tkn.Tid_mod_cas; break;
|
||||
case Gfui_bnd_tkn.Tid_key: break;
|
||||
default: throw Exc_.new_unhandled(tkn.Tid());
|
||||
default: throw Err_.new_unhandled(tkn.Tid());
|
||||
}
|
||||
switch (sym_tkn.Tid()) {
|
||||
case Gfui_bnd_tkn.Tid_sym_plus: // EX: Ctrl + A
|
||||
|
||||
@@ -46,7 +46,7 @@ public class Html_utl {
|
||||
switch (quote_byte) {
|
||||
case Byte_ascii.Apos: bfr.Add(Html_entity_.Apos_num_bry); break;
|
||||
case Byte_ascii.Quote: bfr.Add(Html_entity_.Quote_bry); break;
|
||||
default: throw Exc_.new_unhandled(quote_byte);
|
||||
default: throw Err_.new_unhandled(quote_byte);
|
||||
}
|
||||
}
|
||||
else {
|
||||
|
||||
@@ -31,12 +31,12 @@ public class Io_stream_rdr_process implements Io_stream_rdr {
|
||||
ProcessBuilder pb = new ProcessBuilder(process_args);
|
||||
pb.redirectErrorStream(false);
|
||||
try {process = pb.start();}
|
||||
catch (Exception e) {throw Exc_.new_exc(e, "core", "process init failed", "args", String_.AryXtoStr(process_args));}
|
||||
catch (Exception e) {throw Err_.new_exc(e, "core", "process init failed", "args", String_.AryXtoStr(process_args));}
|
||||
stream_read = process.getInputStream();
|
||||
return this;
|
||||
}
|
||||
public void Open_mem(byte[] v) {throw Exc_.new_unimplemented();}
|
||||
public Object Under() {throw Exc_.new_unimplemented();}
|
||||
public void Open_mem(byte[] v) {throw Err_.new_unimplemented();}
|
||||
public Object Under() {throw Err_.new_unimplemented();}
|
||||
|
||||
public int Read(byte[] bry, int bgn, int len) {
|
||||
try {
|
||||
@@ -52,15 +52,15 @@ public class Io_stream_rdr_process implements Io_stream_rdr {
|
||||
if (rv >= len) break;
|
||||
}
|
||||
return rv;
|
||||
} catch (Exception e) {throw Exc_.new_exc(e, "io", "process read failed", "bgn", bgn, "len", len);}
|
||||
} catch (Exception e) {throw Err_.new_exc(e, "io", "process read failed", "bgn", bgn, "len", len);}
|
||||
}
|
||||
public long Skip(long len) {
|
||||
try {return stream_read.skip(len);}
|
||||
catch (Exception e) {throw Exc_.new_exc(e, "io", "process skip failed", "len", len);}
|
||||
catch (Exception e) {throw Err_.new_exc(e, "io", "process skip failed", "len", len);}
|
||||
}
|
||||
public void Rls() {
|
||||
try {stream_read.close();}
|
||||
catch (Exception e) {throw Exc_.new_exc(e, "io", "process rls failed");}
|
||||
catch (Exception e) {throw Err_.new_exc(e, "io", "process rls failed");}
|
||||
process.destroy();
|
||||
}
|
||||
public static Io_stream_rdr_process new_(Io_url process_exe, Io_url stream_url, String... process_args) {return new Io_stream_rdr_process(process_exe, stream_url, process_args);}
|
||||
|
||||
@@ -39,7 +39,7 @@ public class Io_stream_zip_mgr {
|
||||
case Io_stream_.Tid_zip : if (wtr_zip == null) wtr_zip = Io_stream_wtr_.new_by_mem(bfr, Io_stream_.Tid_zip) ; return wtr_zip.Open();
|
||||
case Io_stream_.Tid_bzip2 : if (wtr_bzip2 == null) wtr_bzip2 = Io_stream_wtr_.new_by_mem(bfr, Io_stream_.Tid_bzip2) ; return wtr_bzip2.Open();
|
||||
case Io_stream_.Tid_raw :
|
||||
default : throw Exc_.new_unhandled(type);
|
||||
default : throw Err_.new_unhandled(type);
|
||||
}
|
||||
}
|
||||
private Io_stream_rdr Rdr(byte type) {
|
||||
@@ -48,7 +48,7 @@ public class Io_stream_zip_mgr {
|
||||
case Io_stream_.Tid_zip : if (rdr_zip == null) rdr_zip = Io_stream_rdr_.new_by_tid_(Io_stream_.Tid_zip) ; return rdr_zip;
|
||||
case Io_stream_.Tid_bzip2 : if (rdr_bzip2 == null) rdr_bzip2 = Io_stream_rdr_.new_by_tid_(Io_stream_.Tid_bzip2) ; return rdr_bzip2;
|
||||
case Io_stream_.Tid_raw :
|
||||
default : throw Exc_.new_unhandled(type);
|
||||
default : throw Err_.new_unhandled(type);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -36,7 +36,7 @@ public class Php_itm_ {
|
||||
switch (itm.Itm_tid()) {
|
||||
case Php_itm_.Tid_kv:
|
||||
case Php_itm_.Tid_ary:
|
||||
throw Exc_.new_unhandled(itm.Itm_tid());
|
||||
throw Err_.new_unhandled(itm.Itm_tid());
|
||||
default:
|
||||
return itm.Val_obj_bry();
|
||||
}
|
||||
|
||||
@@ -225,11 +225,11 @@ class Php_tkn_quote_chkr extends Php_tkn_chkr_base {
|
||||
public Php_tkn_quote_chkr(int src_bgn, int src_end) {this.Src_rng_(src_bgn, src_end);}
|
||||
@Override public Class<?> TypeOf() {return Php_tkn_quote.class;}
|
||||
@Override public byte Tkn_tid() {return Php_tkn_.Tid_quote;}
|
||||
public Php_tkn_quote_chkr Quote_tid_(byte v) {this.quote_tid = v; return this;} private byte quote_tid = Byte_ascii.Nil;
|
||||
public Php_tkn_quote_chkr Quote_tid_(byte v) {this.quote_tid = v; return this;} private byte quote_tid = Byte_ascii.Null;
|
||||
@Override public int Chk_tkn(Tst_mgr mgr, String path, Php_tkn actl_obj) {
|
||||
Php_tkn_quote actl = (Php_tkn_quote)actl_obj;
|
||||
int rv = 0;
|
||||
rv += mgr.Tst_val(quote_tid == Byte_ascii.Nil, path, "quote_tid", quote_tid, actl.Quote_tid());
|
||||
rv += mgr.Tst_val(quote_tid == Byte_ascii.Null, path, "quote_tid", quote_tid, actl.Quote_tid());
|
||||
return rv;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -188,10 +188,10 @@ public class Php_srl_parser {
|
||||
}
|
||||
throw err_(raw, raw_len, raw_len, "skip_ws found eos");
|
||||
}
|
||||
Exc err_(byte[] raw, int bgn, String fmt, Object... args) {return err_(raw, bgn, raw.length, fmt, args);}
|
||||
Exc err_(byte[] raw, int bgn, int raw_len, String fmt, Object... args) {
|
||||
Err err_(byte[] raw, int bgn, String fmt, Object... args) {return err_(raw, bgn, raw.length, fmt, args);}
|
||||
Err err_(byte[] raw, int bgn, int raw_len, String fmt, Object... args) {
|
||||
String msg = String_.Format(fmt, args) + " " + Int_.Xto_str(bgn) + " " + String_.new_u8_by_len(raw, bgn, 20);
|
||||
return Exc_.new_(msg);
|
||||
return Err_.new_wo_type(msg);
|
||||
}
|
||||
}
|
||||
class Php_srl_factory {
|
||||
|
||||
@@ -53,16 +53,16 @@ public class Php_text_itm_parser {
|
||||
if (txt_bgn != -1) {tmp_list.Add(new Php_text_itm_text(txt_bgn, i)); txt_bgn = -1; rslt_val = Rslt_dirty;}
|
||||
boolean pos_is_last = i == raw_last;
|
||||
int next_pos = i + 1;
|
||||
byte next_char = pos_is_last ? Byte_ascii.Nil : raw[next_pos];
|
||||
byte next_char = pos_is_last ? Byte_ascii.Null : raw[next_pos];
|
||||
if (quote_is_single) { // NOTE: q1 is simpler than q2; REF.MW:http://php.net/manual/en/language.types.String.php; DATE:2014-08-06
|
||||
switch (next_char) {
|
||||
case Byte_ascii.Apos: next_char = Byte_ascii.Apos; break;
|
||||
case Byte_ascii.Backslash: next_char = Byte_ascii.Backslash; break;
|
||||
default: next_char = Byte_ascii.Nil; break;
|
||||
default: next_char = Byte_ascii.Null; break;
|
||||
}
|
||||
}
|
||||
else {
|
||||
if (pos_is_last) throw Exc_.new_("backslash_is_last_char", "raw", String_.new_u8(raw));
|
||||
if (pos_is_last) throw Err_.new_wo_type("backslash_is_last_char", "raw", String_.new_u8(raw));
|
||||
switch (next_char) {
|
||||
case Byte_ascii.Backslash: next_char = Byte_ascii.Backslash; break;
|
||||
case Byte_ascii.Quote: next_char = Byte_ascii.Quote; break;
|
||||
@@ -87,10 +87,10 @@ public class Php_text_itm_parser {
|
||||
i = next_pos + 2; // +2 to skip rest; EX: \xc2; +2 for c2
|
||||
continue;
|
||||
}
|
||||
default: next_char = Byte_ascii.Nil; break;
|
||||
default: next_char = Byte_ascii.Null; break;
|
||||
}
|
||||
}
|
||||
if (next_char == Byte_ascii.Nil) {
|
||||
if (next_char == Byte_ascii.Null) {
|
||||
if (txt_bgn == -1) txt_bgn = i;
|
||||
}
|
||||
else {
|
||||
@@ -124,7 +124,7 @@ public class Php_text_itm_parser {
|
||||
} private static final byte[] CONST_utf_prefix = Bry_.new_a7("\\u00");
|
||||
private void Parse_utf16(List_adp rv, byte[] src, int bgn, int src_len) {
|
||||
int end = bgn + 4;
|
||||
if (end >= src_len) throw Exc_.new_("utf16_parse", "src", String_.new_u8(src));
|
||||
if (end >= src_len) throw Err_.new_wo_type("utf16_parse", "src", String_.new_u8(src));
|
||||
int v = Int_.Xto_int_hex(src, bgn, end); // +2; skip "\" + "u"
|
||||
byte[] literal = gplx.intl.Utf16_.Encode_int_to_bry(v);
|
||||
rv.Add(new Php_text_itm_utf16(bgn, end, literal));
|
||||
|
||||
@@ -20,8 +20,8 @@ public class Dsv_fld_parser_ {
|
||||
public static final Dsv_fld_parser Bry_parser = Dsv_fld_parser_bry._;
|
||||
public static final Dsv_fld_parser Int_parser = Dsv_fld_parser_int._;
|
||||
public static final Dsv_fld_parser Line_parser__comment_is_pipe = new Dsv_fld_parser_line(Byte_ascii.Pipe);
|
||||
public static Exc err_fld_unhandled(Dsv_fld_parser parser, Dsv_wkr_base wkr, int fld_idx, byte[] src, int bgn, int end) {
|
||||
throw Exc_.new_("fld unhandled", "parser", ClassAdp_.NameOf_obj(parser), "wkr", ClassAdp_.NameOf_obj(wkr), "fld_idx", fld_idx, "val", String_.new_u8(src, bgn, end)).Stack_erase_1_();
|
||||
public static Err err_fld_unhandled(Dsv_fld_parser parser, Dsv_wkr_base wkr, int fld_idx, byte[] src, int bgn, int end) {
|
||||
throw Err_.new_wo_type("fld unhandled", "parser", ClassAdp_.NameOf_obj(parser), "wkr", ClassAdp_.NameOf_obj(wkr), "fld_idx", fld_idx, "val", String_.new_u8(src, bgn, end)).Trace_ignore_add_1_();
|
||||
}
|
||||
}
|
||||
class Dsv_fld_parser_line implements Dsv_fld_parser {
|
||||
|
||||
@@ -37,8 +37,8 @@ public class Dsv_tbl_parser implements GfoInvkAble, RlsAble {
|
||||
public void Clear() {
|
||||
fld_bgn = fld_idx = row_bgn = row_idx = 0;
|
||||
}
|
||||
public Exc Err_row_bgn(String fmt, int pos) {
|
||||
return Exc_.new_(fmt, "line", String_.new_u8(src, row_bgn, pos)).Stack_erase_1_();
|
||||
public Err Err_row_bgn(String fmt, int pos) {
|
||||
return Err_.new_wo_type(fmt, "line", String_.new_u8(src, row_bgn, pos)).Trace_ignore_add_1_();
|
||||
}
|
||||
public void Update_by_fld(int pos) {
|
||||
fld_bgn = pos;
|
||||
|
||||
@@ -17,16 +17,17 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package gplx.xowa; import gplx.*;
|
||||
import gplx.ios.*;
|
||||
import gplx.xowa.apps.*; import gplx.xowa.apps.fsys.*;
|
||||
import gplx.xowa.apps.*; import gplx.xowa.apps.fsys.*; import gplx.xowa.apis.*;
|
||||
import gplx.xowa.bldrs.css.*;
|
||||
import gplx.xowa.files.caches.*; import gplx.xowa.files.imgs.*;
|
||||
import gplx.xowa.urls.encoders.*;
|
||||
import gplx.xowa.wikis.*;
|
||||
import gplx.xowa.wmfs.*;
|
||||
import gplx.xowa.html.hrefs.*; import gplx.xowa.html.wtrs.*; import gplx.xowa.html.js.*;
|
||||
import gplx.xowa.html.hrefs.*; import gplx.xowa.html.wtrs.*; import gplx.xowa.html.js.*; import gplx.xowa.html.bridges.*;
|
||||
import gplx.xowa.users.*;
|
||||
public interface Xoa_app {
|
||||
Xoa_app_type App_type();
|
||||
Xoapi_root Api_root();
|
||||
Xoa_fsys_mgr Fsys_mgr();
|
||||
Xoa_wiki_mgr Wiki_mgri();
|
||||
Xof_cache_mgr File__cache_mgr();
|
||||
@@ -35,12 +36,13 @@ public interface Xoa_app {
|
||||
Xoh_href_parser Html__href_parser();
|
||||
Xoh_lnki_bldr Html__lnki_bldr();
|
||||
Xoa_css_extractor Html__css_installer();
|
||||
Xoh_json_exec Html__json_exec();
|
||||
Xoh_bridge_mgr Html__bridge_mgr();
|
||||
Xou_user User();
|
||||
Xowmf_mgr Wmf_mgr();
|
||||
boolean Xwiki_mgr__missing(byte[] domain);
|
||||
boolean Bldr__running(); void Bldr__running_(boolean v);
|
||||
Gfo_usr_dlg Usr_dlg();
|
||||
Bry_bfr_mkr Utl__bfr_mkr();
|
||||
Url_encoder_mgr Utl__encoder_mgr();
|
||||
Xoa_url_parser Utl__url_parser();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -16,7 +16,7 @@ You should have received a copy of the GNU Affero General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package gplx.xowa; import gplx.*;
|
||||
import gplx.dbs.*; import gplx.ios.*; import gplx.gfui.*;
|
||||
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.urls.encoders.*;
|
||||
@@ -26,7 +26,7 @@ public class Xoa_app_ {
|
||||
boot_mgr.Run(args);
|
||||
}
|
||||
public static final String Name = "xowa";
|
||||
public static final String Version = "2.7.1.2";
|
||||
public static final String Version = "2.7.3.1";
|
||||
public static String Build_date = "2012-12-30 00:00:00";
|
||||
public static String Op_sys;
|
||||
public static String User_agent = "";
|
||||
@@ -51,9 +51,9 @@ class Xoa_app_boot_mgr {
|
||||
Run_app(args_mgr);
|
||||
}
|
||||
catch (Exception e) {
|
||||
String err_str = Err_.Message_gplx(e);
|
||||
String err_str = Err_.Message_gplx_full(e);
|
||||
log_wtr.Log_to_err(err_str);
|
||||
ConsoleAdp._.WriteLine(err_str);
|
||||
Console_adp__sys.I.Write_str_w_nl(err_str);
|
||||
if (log_wtr.Log_dir() == null) log_wtr.Log_dir_(Env_.AppUrl().OwnerDir().GenSubFil("xowa.log"));
|
||||
log_wtr.Queue_enabled_(false);
|
||||
}
|
||||
@@ -112,7 +112,7 @@ class Xoa_app_boot_mgr {
|
||||
}
|
||||
if (rv.Args_get("show_args").Val_as_bool())
|
||||
rv.Print_args(usr_dlg);
|
||||
} catch (Exception e) {usr_dlg.Warn_many("", "", "args failed: ~{0} ~{1}", chkpoint, Err_.Message_gplx(e)); return null;}
|
||||
} catch (Exception e) {usr_dlg.Warn_many("", "", "args failed: ~{0} ~{1}", chkpoint, Err_.Message_gplx_full(e)); return null;}
|
||||
return rv;
|
||||
}
|
||||
private void Run_app(App_cmd_mgr args_mgr) {
|
||||
@@ -150,16 +150,16 @@ class Xoa_app_boot_mgr {
|
||||
app.Http_server().Home_(http_server_home);
|
||||
app.Init_by_app(); chkpoint = "init_gfs";
|
||||
}
|
||||
catch (Exception e) {usr_dlg.Warn_many("", "", "app init failed: ~{0} ~{1}", chkpoint, Err_.Message_gplx(e));}
|
||||
catch (Exception e) {usr_dlg.Warn_many("", "", "app init failed: ~{0} ~{1}", chkpoint, Err_.Message_gplx_full(e));}
|
||||
app.Usr_dlg().Log_wkr_(app.Log_wtr()); // NOTE: log_wtr must be set for cmd-line (else process will fail);
|
||||
|
||||
// run gfs
|
||||
gplx.xowa.users.prefs.Prefs_rename_mgr._.Check(app.Usere().Fsys_mgr().App_data_cfg_user_fil());
|
||||
try {app.Gfs_mgr().Run_url(cmd_file); chkpoint = "run_url";}
|
||||
catch (Exception e) {
|
||||
usr_dlg.Warn_many("", "", "script file failed: ~{0} ~{1} ~{2}", chkpoint, cmd_file.Raw(), Err_.Message_gplx(e));
|
||||
usr_dlg.Warn_many("", "", "script file failed: ~{0} ~{1} ~{2}", chkpoint, cmd_file.Raw(), Err_.Message_gplx_full(e));
|
||||
if (app_type_is_gui)
|
||||
GfuiEnv_.ShowMsg(Err_.Message_gplx(e));
|
||||
GfuiEnv_.ShowMsg(Err_.Message_gplx_full(e));
|
||||
}
|
||||
gplx.xowa.apps.setups.Xoa_setup_mgr.Delete_old_files(app);
|
||||
|
||||
@@ -172,7 +172,7 @@ class Xoa_app_boot_mgr {
|
||||
else {
|
||||
if (cmd_text != null) {
|
||||
gplx.xowa.servers.Gxw_html_server.Init_gui_for_server(app, null); // NOTE: must init kit else "app.shell.fetch_page" will fail; DATE:2015-04-30
|
||||
ConsoleAdp._.WriteLine_utf8(Object_.Xto_str_strict_or_empty(app.Gfs_mgr().Run_str(cmd_text)));
|
||||
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";
|
||||
@@ -181,7 +181,7 @@ class Xoa_app_boot_mgr {
|
||||
if (gplx.xowa.xtns.scribunto.Scrib_core.Core() != null) gplx.xowa.xtns.scribunto.Scrib_core.Core().Term();
|
||||
}
|
||||
}
|
||||
catch (Exception e) {usr_dlg.Warn_many("", "", "app launch failed: ~{0} ~{1}", chkpoint, Err_.Message_gplx(e));}
|
||||
catch (Exception e) {usr_dlg.Warn_many("", "", "app launch failed: ~{0} ~{1}", chkpoint, Err_.Message_gplx_full(e));}
|
||||
finally {
|
||||
if (app != null && app_type_is_gui) // only cancel if app_type_is_gui is true; (force cmd_line to end process)
|
||||
app.Setup_mgr().Cmd_mgr().Canceled_y_();
|
||||
@@ -194,7 +194,7 @@ class Xoa_app_boot_mgr {
|
||||
case Op_sys.Tid_lnx: rv = "linux"; break;
|
||||
case Op_sys.Tid_wnt: rv = "windows"; break;
|
||||
case Op_sys.Tid_osx: rv = "macosx"; break;
|
||||
default: throw Exc_.new_unhandled("unknown platform " + Op_sys.Cur());
|
||||
default: throw Err_.new_unhandled("unknown platform " + Op_sys.Cur());
|
||||
}
|
||||
if (op_sys.Bitness() == Op_sys.Bitness_64) rv += "_64";
|
||||
return rv;
|
||||
|
||||
@@ -54,10 +54,10 @@ public class Xoa_app_fxt {
|
||||
public static void repo_(Xoae_app app, Xowe_wiki wiki) {
|
||||
app.File_mgr().Repo_mgr().Set("src:wiki", "mem/wiki/repo/src/", wiki.Domain_str()).Ext_rules_(Xof_rule_grp.Grp_app_default).Dir_depth_(2);
|
||||
app.File_mgr().Repo_mgr().Set("trg:wiki", "mem/wiki/repo/trg/", 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_u8("src:wiki"), Bry_.new_u8("trg:wiki"));
|
||||
wiki.File_mgr().Repo_mgr().Add_repo(Bry_.new_a7("src:wiki"), Bry_.new_a7("trg:wiki"));
|
||||
app.File_mgr().Repo_mgr().Set("src:c", "mem/wiki/repo/src/", "commons.wikimedia.org").Ext_rules_(Xof_rule_grp.Grp_app_default).Dir_depth_(2);
|
||||
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_u8("src:c"), Bry_.new_u8("trg:c"));
|
||||
wiki.File_mgr().Repo_mgr().Add_repo(Bry_.new_a7("src:c"), Bry_.new_a7("trg:c"));
|
||||
}
|
||||
public static void Init_gui(Xoae_app app, Xowe_wiki wiki) {
|
||||
app.Gui_mgr().Browser_win().Init_by_kit(gplx.gfui.Mem_kit._);
|
||||
|
||||
@@ -22,7 +22,7 @@ import gplx.xowa.langs.*; import gplx.xowa.specials.*; import gplx.xowa.cfgs2.*;
|
||||
import gplx.xowa.bldrs.css.*;
|
||||
import gplx.xowa.files.caches.*; import gplx.xowa.files.imgs.*;
|
||||
import gplx.xowa.wikis.*; import gplx.xowa.users.*; import gplx.xowa.gui.*; import gplx.xowa.cfgs.*; import gplx.xowa.ctgs.*; import gplx.xowa.html.tocs.*; import gplx.xowa.fmtrs.*; import gplx.xowa.html.*;
|
||||
import gplx.xowa.html.hrefs.*; import gplx.xowa.html.wtrs.*; import gplx.xowa.html.ns_files.*; import gplx.xowa.html.js.*;
|
||||
import gplx.xowa.html.hrefs.*; import gplx.xowa.html.wtrs.*; import gplx.xowa.html.ns_files.*; import gplx.xowa.html.bridges.*;
|
||||
import gplx.xowa.parsers.*; import gplx.xowa.parsers.amps.*; import gplx.xowa.parsers.tblws.*;
|
||||
import gplx.xowa.xtns.*; import gplx.xowa.xtns.scribunto.*; import gplx.xowa.xtns.math.*;
|
||||
import gplx.xowa.parsers.logs.*; import gplx.xowa.servers.tcp.*; import gplx.xowa.servers.http.*;
|
||||
@@ -62,7 +62,6 @@ public class Xoae_app implements Xoa_app, GfoInvkAble {
|
||||
cfg_regy = new Xocfg_regy(this);
|
||||
html_mgr = new Xoh_html_mgr(this);
|
||||
this.html__lnki_bldr = new Xoh_lnki_bldr(this, href_parser);
|
||||
this.html__json_exec = new Xoh_json_exec(this);
|
||||
}
|
||||
public Xoa_app_type App_type() {return app_type;} private final Xoa_app_type app_type;
|
||||
public Xoa_fsys_mgr Fsys_mgr() {return fsys_mgr;} private final Xoa_fsys_mgr fsys_mgr;
|
||||
@@ -72,11 +71,12 @@ public class Xoae_app implements Xoa_app, GfoInvkAble {
|
||||
public Xoh_href_parser Html__href_parser() {return href_parser;} private Xoh_href_parser href_parser;
|
||||
public Xoh_lnki_bldr Html__lnki_bldr() {return html__lnki_bldr;} private final Xoh_lnki_bldr html__lnki_bldr;
|
||||
public Xoa_css_extractor Html__css_installer() {return html__css_installer;} private final Xoa_css_extractor html__css_installer = new Xoa_css_extractor();
|
||||
public Xoh_json_exec Html__json_exec() {return html__json_exec;} private final Xoh_json_exec html__json_exec;
|
||||
public Xoh_bridge_mgr Html__bridge_mgr() {return html__bridge_mgr;} private final Xoh_bridge_mgr html__bridge_mgr = new Xoh_bridge_mgr();
|
||||
public Xowmf_mgr Wmf_mgr() {return wmf_mgr;} private final Xowmf_mgr wmf_mgr = new Xowmf_mgr();
|
||||
public Bry_bfr_mkr Utl__bfr_mkr() {return Xoa_app_.Utl__bfr_mkr();}
|
||||
public Url_encoder_mgr Utl__encoder_mgr() {return Xoa_app_.Utl__encoder_mgr();}
|
||||
public Xoa_url_parser Utl__url_parser() {return utl_url_parser;} private final Xoa_url_parser utl_url_parser = new Xoa_url_parser();
|
||||
public boolean Bldr__running() {return bldr__running;} public void Bldr__running_(boolean v) {this.bldr__running = v;} private boolean bldr__running;
|
||||
|
||||
public Xoae_wiki_mgr Wiki_mgr() {return wiki_mgr;} private Xoae_wiki_mgr wiki_mgr;
|
||||
public Xoa_wiki_mgr Wiki_mgri() {return wiki_mgr;}
|
||||
|
||||
@@ -66,6 +66,7 @@ public class Xoapi_import implements GfoInvkAble {
|
||||
else if (ctx.Match(k, Invk_ns_file_map_)) ns_file_map = m.ReadBry("v");
|
||||
else if (ctx.Match(k, Invk_zip_tid_text)) return Io_stream_.To_str(zip_tid_text);
|
||||
else if (ctx.Match(k, Invk_zip_tid_text_)) zip_tid_text = Io_stream_.To_tid(m.ReadStr("v"));
|
||||
else if (ctx.Match(k, Invk_zip_tid_list)) return Options_zip_tid__list;
|
||||
else if (ctx.Match(k, Invk_zip_tid_html)) return Io_stream_.To_str(zip_tid_html);
|
||||
else if (ctx.Match(k, Invk_zip_tid_html_)) zip_tid_html = Io_stream_.To_tid(m.ReadStr("v"));
|
||||
else if (ctx.Match(k, Invk_user_name)) return user_name;
|
||||
@@ -73,6 +74,7 @@ public class Xoapi_import implements GfoInvkAble {
|
||||
else return GfoInvkAble_.Rv_unhandled;
|
||||
return this;
|
||||
}
|
||||
private static KeyVal[] Options_zip_tid__list = KeyVal_.Ary(KeyVal_.new_("raw", "text"), KeyVal_.new_("gzip"), KeyVal_.new_("bzip2"));
|
||||
private static final String
|
||||
Invk_layout_all_max = "layout_all_max" , Invk_layout_all_max_ = "layout_all_max_"
|
||||
, Invk_layout_text_max = "layout_text_max" , Invk_layout_text_max_ = "layout_text_max_"
|
||||
@@ -83,7 +85,7 @@ public class Xoapi_import implements GfoInvkAble {
|
||||
, Invk_html_db_max = "html_db_max" , Invk_html_db_max_ = "html_db_max_"
|
||||
, Invk_file_db_max = "file_db_max" , Invk_file_db_max_ = "file_db_max_"
|
||||
, Invk_ns_file_map = "ns_file_map" , Invk_ns_file_map_ = "ns_file_map_"
|
||||
, Invk_zip_tid_text = "zip_tid_text" , Invk_zip_tid_text_ = "zip_tid_text_"
|
||||
, Invk_zip_tid_text = "zip_tid_text" , Invk_zip_tid_text_ = "zip_tid_text_", Invk_zip_tid_list = "zip_tid_list"
|
||||
, Invk_zip_tid_html = "zip_tid_html" , Invk_zip_tid_html_ = "zip_tid_html_"
|
||||
, Invk_user_name = "user_name" , Invk_user_name_ = "user_name_"
|
||||
;
|
||||
|
||||
@@ -53,11 +53,11 @@ public class Xoapi_popups implements GfoInvkAble, GfoEvMgrOwner {
|
||||
public byte[] Html_fmtr_next_sect_fmt_dflt() {return html_fmtr_next_sect_dflt;} private byte[] html_fmtr_next_sect_dflt = Dflt_html_fmtr_next_sect;
|
||||
public void Show_more(String popup_id) {
|
||||
Xowe_wiki wiki = app.Gui_mgr().Browser_win().Active_tab().Wiki();
|
||||
wiki.Html_mgr().Module_mgr().Popup_mgr().Show_more(popup_id);
|
||||
wiki.Html_mgr().Head_mgr().Popup_mgr().Show_more(popup_id);
|
||||
}
|
||||
public void Show_all(String popup_id) {
|
||||
Xowe_wiki wiki = app.Gui_mgr().Browser_win().Active_tab().Wiki();
|
||||
wiki.Html_mgr().Module_mgr().Popup_mgr().Show_all(popup_id);
|
||||
wiki.Html_mgr().Head_mgr().Popup_mgr().Show_all(popup_id);
|
||||
}
|
||||
public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) {
|
||||
if (ctx.Match(k, Invk_enabled)) return Yn.Xto_str(enabled);
|
||||
|
||||
@@ -51,7 +51,7 @@ public class Xoapi_startup_tabs implements GfoInvkAble {
|
||||
case Xoapi_startup_tabs_tid_.Tid_xowa: rv.Add(xowa_home); break;
|
||||
case Xoapi_startup_tabs_tid_.Tid_custom: Add_ary(rv, custom); break;
|
||||
case Xoapi_startup_tabs_tid_.Tid_previous: Add_ary(rv, previous); break;
|
||||
default: throw Exc_.new_unhandled(type);
|
||||
default: throw Err_.new_unhandled(type);
|
||||
}
|
||||
}
|
||||
else
|
||||
|
||||
@@ -25,7 +25,7 @@ public class Xoapi_startup_tabs_tid_ {
|
||||
case Tid_xowa: return Key_xowa;
|
||||
case Tid_previous: return Key_previous;
|
||||
case Tid_custom: return Key_custom;
|
||||
default: throw Exc_.new_unimplemented();
|
||||
default: throw Err_.new_unimplemented();
|
||||
}
|
||||
}
|
||||
public static byte Xto_tid(String s) {
|
||||
@@ -33,7 +33,7 @@ public class Xoapi_startup_tabs_tid_ {
|
||||
else if (String_.Eq(s, Key_xowa)) return Tid_xowa;
|
||||
else if (String_.Eq(s, Key_previous)) return Tid_previous;
|
||||
else if (String_.Eq(s, Key_custom)) return Tid_custom;
|
||||
else throw Exc_.new_unimplemented();
|
||||
else throw Err_.new_unimplemented();
|
||||
}
|
||||
public static KeyVal[] Options__list = KeyVal_.Ary(KeyVal_.new_(Key_blank), KeyVal_.new_(Key_xowa), KeyVal_.new_(Key_previous), KeyVal_.new_(Key_custom));
|
||||
}
|
||||
|
||||
@@ -24,42 +24,44 @@ public class Xoapi_bookmarks implements GfoInvkAble {
|
||||
public void Init_by_kit(Xoae_app app) {this.win = app.Gui_mgr().Browser_win();}
|
||||
public boolean Enabled() {return enabled;} private boolean enabled = true;
|
||||
public void Enabled_(boolean v) {enabled = v;}
|
||||
public void Add(String url_str) {
|
||||
if (!enabled) return;
|
||||
Xog_tab_itm tab = win.Active_tab(); if (tab == Xog_tab_itm_.Null) return;
|
||||
Xowe_wiki wiki = tab.Wiki(); Xoae_page page = tab.Page();
|
||||
byte[] wiki_domain = null, ttl_full_txt = null;
|
||||
public boolean Delete_confirm() {return delete_confirm;} private boolean delete_confirm = true;
|
||||
public void Show() {win.Page__navigate_by_url_bar("home/wiki/Special:XowaBookmarks");}
|
||||
public String Add(String url_str) {
|
||||
if (!enabled) return app.Html__bridge_mgr().Msg_bldr().To_json_str__empty();
|
||||
Xoa_url url = null;
|
||||
if (url_str == null) {
|
||||
wiki_domain = wiki.Domain_bry();
|
||||
ttl_full_txt = page.Ttl().Full_txt();
|
||||
Xog_tab_itm tab = win.Active_tab(); if (tab == Xog_tab_itm_.Null) return app.Html__bridge_mgr().Msg_bldr().Clear().Notify_pass_("bookmark added").To_json_str();
|
||||
url = tab.Page().Url();
|
||||
if (url.Wiki_bry() == null) {
|
||||
url_str = "home/wiki/" + String_.new_u8(url.Page_bry());
|
||||
}
|
||||
else if (url.Page_bry() == null) {
|
||||
url_str = tab.Wiki().Domain_str() + "/wiki/" + String_.new_u8(url.Wiki_bry());
|
||||
}
|
||||
else
|
||||
url_str = String_.new_u8(url.Raw());
|
||||
url = app.Utl__url_parser().Parse(Bry_.new_u8(url_str));
|
||||
}
|
||||
else {
|
||||
Xoa_url url = Xoa_url_parser.Parse_from_url_bar(app, wiki, url_str);
|
||||
wiki_domain = url.Wiki_bry();
|
||||
ttl_full_txt = url.Page_bry();
|
||||
}
|
||||
app.Usere().Bookmarks_add(wiki_domain, ttl_full_txt);
|
||||
app.Usr_dlg().Prog_many("", "", "bookmark added: ~{0}", String_.new_u8(ttl_full_txt));
|
||||
else
|
||||
url = app.Utl__url_parser().Parse(Bry_.new_u8(url_str));
|
||||
app.User().User_db_mgr().Bmk_mgr().Itms__add(Xoud_bmk_mgr.Owner_root, url);
|
||||
String msg = "bookmark added: " + String_.new_u8(url.Page_bry());
|
||||
String rv = app.Html__bridge_mgr().Msg_bldr().Clear().Notify_pass_(msg).To_json_str();
|
||||
win.Active_tab().Html_box().Html_js_eval_proc_as_str("xowa.cmds.exec_by_str", "xowa.notify", "{\"text\":\"" + msg + "\",\"status\":\"success\"}");
|
||||
return rv;
|
||||
}
|
||||
public void Show() {win.Page__navigate_by_url_bar("home/wiki/Data:Bookmarks");}
|
||||
// public void Add(String url_str) {// bmk_v2
|
||||
// Xoa_url url = null;
|
||||
// if (url_str == null) {
|
||||
// Xog_tab_itm tab = win.Active_tab(); if (tab == Xog_tab_itm_.Null) return;
|
||||
// url = tab.Page().Url();
|
||||
// }
|
||||
// else
|
||||
// url = app.Utl__url_parser().Parse(Bry_.new_u8(url_str));
|
||||
// app.User().User_db_mgr().Bmk_mgr().Itms__add(Xoud_bmk_mgr.Owner_root, url);
|
||||
// }
|
||||
// public void Show() {win.Page__navigate_by_url_bar("home/wiki/Special:XowaBookmarks");}
|
||||
public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) {
|
||||
if (ctx.Match(k, Invk_enabled)) return Yn.Xto_str(this.Enabled());
|
||||
else if (ctx.Match(k, Invk_enabled_)) Enabled_(m.ReadYn("v"));
|
||||
else if (ctx.Match(k, Invk_add)) this.Add(m.ReadStrOr("v", null));
|
||||
if (ctx.Match(k, Invk_enabled)) return Yn.Xto_str(enabled);
|
||||
else if (ctx.Match(k, Invk_enabled_)) enabled = m.ReadYn("v");
|
||||
else if (ctx.Match(k, Invk_delete_confirm)) return Yn.Xto_str(delete_confirm);
|
||||
else if (ctx.Match(k, Invk_delete_confirm_)) delete_confirm = m.ReadYn("v");
|
||||
else if (ctx.Match(k, Invk_add)) return this.Add(m.ReadStrOr("v", null));
|
||||
else if (ctx.Match(k, Invk_show)) this.Show();
|
||||
else return GfoInvkAble_.Rv_unhandled;
|
||||
return this;
|
||||
}
|
||||
private static final String Invk_enabled = "enabled", Invk_enabled_ = "enabled_", Invk_add = "add", Invk_show = "show";
|
||||
private static final String
|
||||
Invk_enabled = "enabled", Invk_enabled_ = "enabled_"
|
||||
, Invk_delete_confirm = "delete_confirm", Invk_delete_confirm_ = "delete_confirm_"
|
||||
, Invk_add = "add", Invk_show = "show";
|
||||
}
|
||||
|
||||
@@ -16,20 +16,43 @@ You should have received a copy of the GNU Affero General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package gplx.xowa.apps; import gplx.*; import gplx.xowa.*;
|
||||
import gplx.core.primitives.*;
|
||||
public class Xoa_app_type {
|
||||
Xoa_app_type(int uid) {this.uid = uid;}
|
||||
public int Uid() {return uid;} private final int uid;
|
||||
public boolean Uid_is_gui() {return uid == Uid_gui;}
|
||||
public boolean Uid_is_tcp() {return uid == Uid_tcp;}
|
||||
public boolean Uid_is_http() {return uid == Uid_http;}
|
||||
private static final int Uid_cmd = 1, Uid_gui = 2, Uid_tcp = 3, Uid_http = 4;
|
||||
private static final String Key_cmd = "cmd", Key_gui = "gui", Key_tcp = "server", Key_http = "http_server";
|
||||
public static final Xoa_app_type Itm_cmd = new Xoa_app_type(Uid_cmd), Itm_gui = new Xoa_app_type(Uid_gui), Itm_tcp = new Xoa_app_type(Uid_tcp), Itm_http = new Xoa_app_type(Uid_http);
|
||||
public byte[] Name() {
|
||||
switch (uid) {
|
||||
case Uid_cmd: return Key_cmd;
|
||||
case Uid_gui: return Key_gui;
|
||||
case Uid_http: return Key_http;
|
||||
case Uid_tcp: return Key_tcp;
|
||||
case Uid_file: return Key_file;
|
||||
default: return Key_cmd; // see parse
|
||||
}
|
||||
}
|
||||
private static final int Uid_cmd = 1, Uid_gui = 2, Uid_tcp = 3, Uid_http = 4, Uid_file = 5;
|
||||
private static final byte[] Key_cmd = Bry_.new_a7("cmd"), Key_gui = Bry_.new_a7("gui"), Key_tcp = Bry_.new_a7("server"), Key_http = Bry_.new_a7("http_server"), Key_file = Bry_.new_a7("file");
|
||||
private static final Hash_adp_bry type_hash = Hash_adp_bry.cs_()
|
||||
.Add_bry_int(Key_cmd , Uid_cmd)
|
||||
.Add_bry_int(Key_gui , Uid_gui)
|
||||
.Add_bry_int(Key_http , Uid_http)
|
||||
.Add_bry_int(Key_tcp , Uid_tcp)
|
||||
.Add_bry_int(Key_file , Uid_file)
|
||||
;
|
||||
public static final Xoa_app_type Itm_cmd = new Xoa_app_type(Uid_cmd), Itm_gui = new Xoa_app_type(Uid_gui), Itm_tcp = new Xoa_app_type(Uid_tcp), Itm_http = new Xoa_app_type(Uid_http), Itm_file = new Xoa_app_type(Uid_file);
|
||||
public static Xoa_app_type parse(String s) {
|
||||
if (String_.Eq(s, Key_cmd)) return Itm_cmd;
|
||||
else if (String_.Eq(s, Key_gui)) return Itm_gui;
|
||||
else if (String_.Eq(s, Key_tcp)) return Itm_tcp;
|
||||
else if (String_.Eq(s, Key_http)) return Itm_http;
|
||||
else return Itm_cmd; // default to cmd as per early behaviour; handles mistaken "--app_mode wrong"
|
||||
Object o = type_hash.Get_by(Bry_.new_u8(s)); if (o == null) return Itm_cmd; // default to cmd as per early behaviour; handles mistaken "--app_mode wrong"
|
||||
int uid = ((Int_obj_val)o).Val();
|
||||
switch (uid) {
|
||||
case Uid_cmd: return Itm_cmd;
|
||||
case Uid_gui: return Itm_gui;
|
||||
case Uid_http: return Itm_http;
|
||||
case Uid_tcp: return Itm_tcp;
|
||||
case Uid_file: return Itm_file;
|
||||
default: throw Err_.new_unhandled(uid);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -36,12 +36,12 @@ public class Xoa_gfs_mgr implements GfoInvkAble, GfoInvkRootWkr {
|
||||
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 throw Exc_.new_("invalid gfs type", "type", type);
|
||||
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
|
||||
if (!String_.Eq(type, "xowa")) // check if user.gfs
|
||||
Io_mgr.I.MoveFil(url, url.GenNewNameOnly(url.NameOnly() + "-" + DateAdp_.Now().XtoStr_fmt_yyyyMMdd_HHmmss())); // move file
|
||||
Gfo_usr_dlg_.I.Warn_many("", "", "invalid gfs; obsoleting: src=~{0} err=~{1}", url.Raw(), Err_.Message_gplx(e));
|
||||
Gfo_usr_dlg_.I.Warn_many("", "", "invalid gfs; obsoleting: src=~{0} err=~{1}", url.Raw(), Err_.Message_gplx_full(e));
|
||||
}
|
||||
}
|
||||
public GfoMsg Parse_root_msg(String v) {return gplx.gfs.Gfs_msg_bldr._.ParseToMsg(v);}
|
||||
@@ -67,7 +67,7 @@ public class Xoa_gfs_mgr implements GfoInvkAble, GfoInvkRootWkr {
|
||||
}
|
||||
return rv;
|
||||
} catch (Exception e) {
|
||||
Gfo_usr_dlg_.I.Warn_many("", "", "error while executing script: err=~{0}", Err_.Message_gplx(e));
|
||||
Gfo_usr_dlg_.I.Warn_many("", "", "error while executing script: err=~{0}", Err_.Message_gplx_full(e));
|
||||
return GfoInvkAble_.Rv_error;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -58,7 +58,7 @@ public class Xoa_gfs_php_mgr {
|
||||
return dirty ? bfr.Xto_bry_and_clear() : src;
|
||||
}
|
||||
private static int Xto_php_swap(Bry_bfr bfr, byte[] src, int len, int pos) {
|
||||
if (pos >= len) throw Exc_.new_("invalid gfs: tilde is last char", "src", String_.new_u8(src));
|
||||
if (pos >= len) throw Err_.new_wo_type("invalid gfs: tilde is last char", "src", String_.new_u8(src));
|
||||
byte b = src[pos];
|
||||
switch (b) {
|
||||
case Byte_ascii.Tilde: { // ~~ -> ~
|
||||
@@ -72,17 +72,17 @@ public class Xoa_gfs_php_mgr {
|
||||
|| num_end == len
|
||||
|| src[num_end] != Byte_ascii.Curly_end
|
||||
)
|
||||
throw Exc_.new_("invalid gfs; num_end not found", "src", String_.new_u8(src));
|
||||
throw Err_.new_wo_type("invalid gfs; num_end not found", "src", String_.new_u8(src));
|
||||
bfr.Add_byte(Byte_ascii.Dollar);
|
||||
int arg_idx = Bry_.Xto_int_or(src, num_bgn, num_end, -1);
|
||||
if (arg_idx == -1) {
|
||||
throw Exc_.new_("invalid int");
|
||||
throw Err_.new_wo_type("invalid int");
|
||||
}
|
||||
bfr.Add_int_variable(arg_idx + 1);
|
||||
return num_end + 1;
|
||||
}
|
||||
default: {
|
||||
throw Exc_.new_("invalid gfs; next char after tilde must be either tilde or open brace", "src", String_.new_u8(src));
|
||||
throw Err_.new_wo_type("invalid gfs; next char after tilde must be either tilde or open brace", "src", String_.new_u8(src));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -16,13 +16,14 @@ You should have received a copy of the GNU Affero General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package gplx.xowa.apps; import gplx.*; import gplx.xowa.*;
|
||||
import gplx.core.consoles.*;
|
||||
public class Xoa_shell implements GfoInvkAble {
|
||||
public Xoa_shell(Xoae_app app) {this.app = app;} private Xoae_app app;
|
||||
public boolean Fetch_page_exec_async() {return fetch_page_exec_async;} private boolean fetch_page_exec_async = true;
|
||||
public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) {
|
||||
if (ctx.Match(k, Invk_fetch_page)) return Fetch_page(m);
|
||||
else if (ctx.Match(k, Invk_chars_per_line_max_)) ConsoleAdp._.CharsPerLineMax_set(m.ReadInt("v"));
|
||||
else if (ctx.Match(k, Invk_backspace_by_bytes_)) ConsoleAdp._.Backspace_by_bytes_(m.ReadYn("v"));
|
||||
else if (ctx.Match(k, Invk_chars_per_line_max_)) Console_adp__sys.I.Chars_per_line_max_(m.ReadInt("v"));
|
||||
else if (ctx.Match(k, Invk_backspace_by_bytes_)) Console_adp__sys.I.Backspace_by_bytes_(m.ReadYn("v"));
|
||||
else return GfoInvkAble_.Rv_unhandled;
|
||||
return this;
|
||||
}
|
||||
|
||||
@@ -29,7 +29,7 @@ public class Xoa_fsys_eval implements Bry_fmtr_eval_mgr {
|
||||
case Tid_bin_plat_dir: return app_fsys_mgr.Bin_plat_dir().RawBry();
|
||||
case Tid_user_temp_dir: return usr_fsys_mgr.App_temp_dir().RawBry();
|
||||
case Tid_user_cfg_dir: return usr_fsys_mgr.App_data_cfg_dir().RawBry();
|
||||
default: throw Exc_.new_unhandled(val);
|
||||
default: throw Err_.new_unhandled(val);
|
||||
}
|
||||
}
|
||||
private static final byte Tid_bin_plat_dir = 0, Tid_user_temp_dir = 1, Tid_xowa_root_dir = 2, Tid_user_cfg_dir = 3;
|
||||
|
||||
@@ -33,6 +33,6 @@ public class Db_idx_mode {
|
||||
if (String_.Eq(key, Key_skip)) return Itm_skip;
|
||||
else if (String_.Eq(key, Key_bgn)) return Itm_bgn;
|
||||
else if (String_.Eq(key, Key_end)) return Itm_end;
|
||||
else throw Exc_.new_unhandled(key);
|
||||
else throw Err_.new_unhandled(key);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -80,7 +80,7 @@ public class Xob_cmd_mgr implements GfoInvkAble {
|
||||
else if (String_.Eq(cmd_key, Xob_cmd_keys.Key_decompress_bz2)) return Add(new Xob_decompress_bz2_cmd(bldr, wiki));
|
||||
else if (String_.Eq(cmd_key, Xob_cmd_keys.Key_deploy_zip)) return Add(new Xob_deploy_zip_cmd(bldr, wiki));
|
||||
else if (String_.Eq(cmd_key, Xob_cmd_keys.Key_deploy_copy)) return Add(new Xob_deploy_copy_cmd(bldr, wiki));
|
||||
else throw Exc_.new_unhandled(cmd_key);
|
||||
else throw Err_.new_unhandled(cmd_key);
|
||||
}
|
||||
private Xobd_wkr Xml_rdr_direct_add(Xowe_wiki wiki, Xobd_wkr wkr) {
|
||||
Xobd_rdr dump_rdr = Xml_rdr_get(wiki);
|
||||
@@ -118,7 +118,7 @@ public class Xob_cmd_mgr implements GfoInvkAble {
|
||||
Xob_cmd cmd = (Xob_cmd)list.Get_at(i);
|
||||
if (String_.Eq(cmd.Cmd_key(), cmd_key)) return cmd;
|
||||
}
|
||||
throw Exc_.new_("cmd not found", "key", cmd_key);
|
||||
throw Err_.new_wo_type("cmd not found", "key", cmd_key);
|
||||
}
|
||||
private Object Add_many(GfoMsg m) {
|
||||
Xowe_wiki wiki = Wiki_get_or_make(m);
|
||||
@@ -132,7 +132,7 @@ public class Xob_cmd_mgr implements GfoInvkAble {
|
||||
return Add_many(wiki, cmds);
|
||||
}
|
||||
public Object Add_many(Xowe_wiki wiki, String... cmds) {
|
||||
int len = cmds.length; if (len == 0) throw Exc_.new_("add_many cannot have 0 cmds");
|
||||
int len = cmds.length; if (len == 0) throw Err_.new_wo_type("add_many cannot have 0 cmds");
|
||||
Object rv = null;
|
||||
for (int i = 0; i < len; i++)
|
||||
rv = Add_cmd(wiki, cmds[i]);
|
||||
|
||||
@@ -62,7 +62,7 @@ public class Xob_fxt {
|
||||
public Xob_fxt Run_ctg() {
|
||||
Xobd_parser parser = new Xobd_parser();
|
||||
gplx.xowa.bldrs.cmds.ctgs.Xob_ctg_v1_base ctg_wkr = new gplx.xowa.bldrs.cmds.ctgs.Xob_ctg_v1_txt().Ctor(bldr, wiki);
|
||||
byte[] bry = Bry_.new_u8("[[Category:");
|
||||
byte[] bry = Bry_.new_a7("[[Category:");
|
||||
ctg_wkr.Wkr_hooks().Add(bry, bry);
|
||||
parser.Wkr_add(ctg_wkr);
|
||||
return Run(parser);
|
||||
|
||||
@@ -142,7 +142,7 @@ public class Xob_wiki_cfg_bldr_tst {
|
||||
}
|
||||
sb.Add("\");');\n");
|
||||
}
|
||||
catch(Exception e) {sb.Add("// fail: " + wiki + " " + Err_.Message_gplx_brief(e)).Add_char_nl();}
|
||||
catch(Exception e) {sb.Add("// fail: " + wiki + " " + Err_.Message_gplx_full(e)).Add_char_nl();}
|
||||
}
|
||||
return sb.Xto_str_and_clear();
|
||||
}
|
||||
|
||||
@@ -54,7 +54,7 @@ public class Xob_ns_file_itm_parser extends Dsv_wkr_base {
|
||||
}
|
||||
else
|
||||
ns_ids = Int_.Ary_parse(String_.new_u8(ns_ids_bry), ",");
|
||||
if (ns_ids.length == 0) throw Exc_.new_("map.invalid.ns_missing", "src", this.Src());
|
||||
if (ns_ids.length == 0) throw Err_.new_wo_type("map.invalid.ns_missing", "src", this.Src());
|
||||
if (String_.Len_eq_0(name)) { // no name; auto-generate
|
||||
int ns_id_1st = ns_ids[0]; // take 1st ns_id
|
||||
name = "ns." + Int_.Xto_str_pad_bgn_zero(ns_id_1st, 3); // EX: ns.000
|
||||
|
||||
@@ -71,7 +71,7 @@ class Xob_dump_src_id {
|
||||
case Bool_.Y_byte: return Sql_select__redirect_y;
|
||||
case Bool_.N_byte: return Sql_select__redirect_n;
|
||||
case Bool_.__byte: return Sql_select__redirect__;
|
||||
default: throw Exc_.new_unhandled(redirect);
|
||||
default: throw Err_.new_unhandled(redirect);
|
||||
}
|
||||
}
|
||||
private static final String Sql_select = String_.Concat_lines_nl
|
||||
|
||||
@@ -47,7 +47,7 @@ public abstract class Xob_categorylinks_base extends Xob_sql_dump_base implement
|
||||
case Byte_ascii.Ltr_f:
|
||||
case Byte_ascii.Ltr_p: cur_tid = char_0; break;
|
||||
case Byte_ascii.Ltr_s: cur_tid = Byte_ascii.Ltr_c; break;
|
||||
default: throw Exc_.new_unhandled(char_0);
|
||||
default: throw Err_.new_unhandled(char_0);
|
||||
}
|
||||
if (cur_collation_is_uca) {
|
||||
if (trie == null) {
|
||||
@@ -70,7 +70,7 @@ public abstract class Xob_categorylinks_base extends Xob_sql_dump_base implement
|
||||
wiki.Html_mgr().Importing_ctgs_(Bool_.N);
|
||||
}
|
||||
private static final byte[] Fld_cl_from = Bry_.new_a7("cl_from"), Fld_cl_to = Bry_.new_a7("cl_to"), Fld_cl_timestamp = Bry_.new_a7("cl_timestamp"), Fld_cl_collation = Bry_.new_a7("cl_collation"), Fld_cl_sortkey = Bry_.new_a7("cl_sortkey"), Fld_cl_type = Bry_.new_a7("cl_type");
|
||||
private static final byte[] Collation_uca = Bry_.new_u8("uca"), Sortkey_space = new byte[] {Byte_ascii.Space};
|
||||
private static final byte[] Collation_uca = Bry_.new_a7("uca"), Sortkey_space = new byte[] {Byte_ascii.Space};
|
||||
}
|
||||
class Xoctg_link_sql_sorter implements gplx.lists.ComparerAble {
|
||||
public int compare(Object lhsObj, Object rhsObj) {
|
||||
|
||||
@@ -59,7 +59,7 @@ public class Xob_categorylinks_sql_make implements Io_make_cmd {
|
||||
++cur_row_count;
|
||||
if (cur_row_count % 100000 == 0) usr_dlg.Prog_one("", "", "inserting category row: ~{0}", cur_row_count);
|
||||
if (cur_row_count % 1000000 == 0) {cat_core_tbl.Conn().Txn_sav(); cat_link_tbl.Conn().Txn_sav();}
|
||||
} catch (Exception e) {usr_dlg.Warn_many("", "", "ctg_links.insert failed: name=~{0} err=~{1}", String_.new_u8(new_cat_ttl), Err_.Message_gplx_brief(e));}
|
||||
} catch (Exception e) {usr_dlg.Warn_many("", "", "ctg_links.insert failed: name=~{0} err=~{1}", String_.new_u8(new_cat_ttl), Err_.Message_gplx_full(e));}
|
||||
}
|
||||
public void Sort_end() {
|
||||
Save_ctg(Ttl_last);
|
||||
@@ -110,7 +110,7 @@ public class Xob_categorylinks_sql_make implements Io_make_cmd {
|
||||
case Byte_ascii.Ltr_f: return Xoa_ctg_mgr.Tid_file;
|
||||
case Byte_ascii.Ltr_p: return Xoa_ctg_mgr.Tid_page;
|
||||
case Byte_ascii.Ltr_c: return Xoa_ctg_mgr.Tid_subc;
|
||||
default: throw Exc_.new_unhandled(ltr);
|
||||
default: throw Err_.new_unhandled(ltr);
|
||||
}
|
||||
}
|
||||
public Io_sort_cmd Make_dir_(Io_url v) {return this;}
|
||||
|
||||
@@ -71,7 +71,7 @@ class Db_tst_row {
|
||||
public static Db_tst_row kvs_(String[] cols, Object[] vals) {
|
||||
int cols_len = cols.length;
|
||||
int vals_len = vals.length;
|
||||
if (cols_len != vals_len) throw Exc_.new_("mismatch in cols / vals");
|
||||
if (cols_len != vals_len) throw Err_.new_wo_type("mismatch in cols / vals");
|
||||
Db_tst_row rv = new Db_tst_row();
|
||||
Db_tst_val[] vals_ary = new Db_tst_val[cols_len];
|
||||
for (int i = 0; i < cols_len; i++) {
|
||||
@@ -128,7 +128,7 @@ class Db_tst_qry {
|
||||
if (!pass) {
|
||||
bfr.Add(Lbl_row_hdr).Add_int_variable(expd_row_idx).Add_byte_nl();
|
||||
bfr.Add_str(qry.Xto_sql()).Add_byte(Byte_ascii.Semic);
|
||||
throw Exc_.new_(bfr.Xto_str_and_clear());
|
||||
throw Err_.new_wo_type(bfr.Xto_str_and_clear());
|
||||
}
|
||||
} static final byte[] Lbl_row_hdr = Bry_.new_a7("row: "), Lbl_eq_y = Bry_.new_a7(" == "), Lbl_eq_n = Bry_.new_a7(" != ");
|
||||
public static Db_tst_qry tbl_(String tbl_name, String order_by) {return new_(Db_qry_.select_tbl_(tbl_name).OrderBy_asc_(order_by));}
|
||||
|
||||
@@ -37,10 +37,10 @@ class Xowd_page_wkr_ctg_fxt {
|
||||
Xowe_wiki wiki = Xoa_app_fxt.wiki_tst_(app);
|
||||
Xob_bldr bldr = Xoa_app_fxt.bldr_(app);
|
||||
Xobd_parser_wkr_ctg_tstr wkr = (Xobd_parser_wkr_ctg_tstr)new Xobd_parser_wkr_ctg_tstr().Ctor(bldr, wiki);
|
||||
byte[] bry = Bry_.new_u8("[[Category:");
|
||||
byte[] bry = Bry_.new_a7("[[Category:");
|
||||
wkr.Wkr_hooks().Add(bry, bry);
|
||||
mgr.Wkr_add(wkr);
|
||||
Xowd_page_itm page = new Xowd_page_itm().Text_(src);//.Ttl_(Bry_.new_u8("Test"), new Xow_ns_mgr());
|
||||
Xowd_page_itm page = new Xowd_page_itm().Text_(src);//.Ttl_(Bry_.new_a7("Test"), new Xow_ns_mgr());
|
||||
mgr.Wkr_bgn(bldr);
|
||||
mgr.Wkr_run(page);
|
||||
byte[][] ttl = (byte[][])wkr.Found().To_ary(byte[].class);
|
||||
|
||||
@@ -58,7 +58,7 @@ class Xob_sql_join_wkr_ctg_hidden implements Xob_sql_join_wkr {
|
||||
byte[] src = join.Bfr();
|
||||
int itm_end = join.Itm_pos_end();
|
||||
int pipe_pos = Bry_finder.Find_bwd(src, Byte_ascii.Pipe, itm_end);
|
||||
if (pipe_pos == Bry_.NotFound) throw Exc_.new_("failed to find pipe for name", "excerpt", String_.new_u8(src, join.Itm_pos_bgn(), join.Itm_pos_end()));
|
||||
if (pipe_pos == Bry_.NotFound) throw Err_.new_wo_type("failed to find pipe for name", "excerpt", String_.new_u8(src, join.Itm_pos_bgn(), join.Itm_pos_end()));
|
||||
file_bfr.Add_mid(src, pipe_pos + 1, itm_end - 1).Add_byte_pipe();
|
||||
file_bfr.Add(key_bry).Add_byte_nl();
|
||||
} private Bry_bfr file_bfr = Bry_bfr.new_();
|
||||
|
||||
@@ -91,7 +91,7 @@ class Xoctg_make_link_mgr {
|
||||
case Byte_ascii.Ltr_c: return subc_grp;
|
||||
case Byte_ascii.Ltr_f: return file_grp;
|
||||
case Byte_ascii.Ltr_p: return page_grp;
|
||||
default: throw Exc_.new_unhandled(tid);
|
||||
default: throw Err_.new_unhandled(tid);
|
||||
}
|
||||
}
|
||||
public int Grps_bfr_len() {return subc_grp.Bfr_len() + file_grp.Bfr_len() + page_grp.Bfr_len();}
|
||||
|
||||
@@ -38,20 +38,20 @@ class Xob_bin_db_itm {
|
||||
public static Xob_bin_db_itm new_v1(Fsm_bin_fil fil) {
|
||||
byte[] name = Bry_.new_u8(fil.Url_rel()); // EX: "fsdb.bin.0000.sqlite3"
|
||||
int ns_id = 0; // assume v1 dbs are all in main ns
|
||||
int pt_id = Bry_.Xto_int_or(name, 9 , 13, Int_.MinValue); if (pt_id == Int_.MinValue) throw Exc_.new_("bin_db_itm.parse: invalid pt_id", "name", fil.Url_rel(), "conn", fil.Conn().Conn_info().Xto_raw());
|
||||
int pt_id = Bry_.Xto_int_or(name, 9 , 13, Int_.MinValue); if (pt_id == Int_.MinValue) throw Err_.new_wo_type("bin_db_itm.parse: invalid pt_id", "name", fil.Url_rel(), "conn", fil.Conn().Conn_info().Xto_raw());
|
||||
return new Xob_bin_db_itm(fil.Id(), fil.Url(), ns_id, pt_id);
|
||||
}
|
||||
public static Xob_bin_db_itm new_v2(Fsm_bin_fil fil) {
|
||||
byte[] ns_bgn_tkn = Bry_.new_a7("file-ns."), ns_end_tkn = Bry_.new_a7("-db."), pt_end_tkn = Bry_.new_a7(".xowa");
|
||||
int ns_bgn_tkn_len = ns_bgn_tkn.length, ns_end_tkn_len = ns_end_tkn.length;
|
||||
byte[] name = Bry_.new_u8(fil.Url_rel()); // EX: en.wikipedia.org-file-ns.000-db.001.xowa
|
||||
int ns_bgn = Bry_finder.Find_fwd(name, ns_bgn_tkn, 0); if (ns_bgn == Bry_finder.Not_found) throw Exc_.new_("bin_db_itm.parse: invalid ns_bgn", "name", fil.Url_rel(), "conn", fil.Conn().Conn_info().Xto_raw());
|
||||
int ns_bgn = Bry_finder.Find_fwd(name, ns_bgn_tkn, 0); if (ns_bgn == Bry_finder.Not_found) throw Err_.new_wo_type("bin_db_itm.parse: invalid ns_bgn", "name", fil.Url_rel(), "conn", fil.Conn().Conn_info().Xto_raw());
|
||||
ns_bgn += ns_bgn_tkn_len;
|
||||
int ns_end = Bry_finder.Find_fwd(name, ns_end_tkn, ns_bgn); if (ns_end == Bry_finder.Not_found) throw Exc_.new_("bin_db_itm.parse: invalid ns_end", "name", fil.Url_rel(), "conn", fil.Conn().Conn_info().Xto_raw());
|
||||
int ns_end = Bry_finder.Find_fwd(name, ns_end_tkn, ns_bgn); if (ns_end == Bry_finder.Not_found) throw Err_.new_wo_type("bin_db_itm.parse: invalid ns_end", "name", fil.Url_rel(), "conn", fil.Conn().Conn_info().Xto_raw());
|
||||
int pt_bgn = ns_end + ns_end_tkn_len;
|
||||
int pt_end = Bry_finder.Find_fwd(name, pt_end_tkn, pt_bgn); if (pt_end == Bry_finder.Not_found) throw Exc_.new_("bin_db_itm.parse: invalid pt_end", "name", fil.Url_rel(), "conn", fil.Conn().Conn_info().Xto_raw());
|
||||
int ns_id = Bry_.Xto_int_or(name, ns_bgn, ns_end, Int_.MinValue); if (ns_id == Int_.MinValue) throw Exc_.new_("bin_db_itm.parse: invalid ns_id", "name", fil.Url_rel(), "conn", fil.Conn().Conn_info().Xto_raw());
|
||||
int pt_id = Bry_.Xto_int_or(name, pt_bgn, pt_end, Int_.MinValue); if (pt_id == Int_.MinValue) throw Exc_.new_("bin_db_itm.parse: invalid pt_id", "name", fil.Url_rel(), "conn", fil.Conn().Conn_info().Xto_raw());
|
||||
int pt_end = Bry_finder.Find_fwd(name, pt_end_tkn, pt_bgn); if (pt_end == Bry_finder.Not_found) throw Err_.new_wo_type("bin_db_itm.parse: invalid pt_end", "name", fil.Url_rel(), "conn", fil.Conn().Conn_info().Xto_raw());
|
||||
int ns_id = Bry_.Xto_int_or(name, ns_bgn, ns_end, Int_.MinValue); if (ns_id == Int_.MinValue) throw Err_.new_wo_type("bin_db_itm.parse: invalid ns_id", "name", fil.Url_rel(), "conn", fil.Conn().Conn_info().Xto_raw());
|
||||
int pt_id = Bry_.Xto_int_or(name, pt_bgn, pt_end, Int_.MinValue); if (pt_id == Int_.MinValue) throw Err_.new_wo_type("bin_db_itm.parse: invalid pt_id", "name", fil.Url_rel(), "conn", fil.Conn().Conn_info().Xto_raw());
|
||||
return new Xob_bin_db_itm(fil.Id(), fil.Url(), ns_id, pt_id);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -64,7 +64,7 @@ class Xob_bin_db_mgr {
|
||||
}
|
||||
public Xob_bin_db_itm Get_nth_by_tier(int tier_id) {
|
||||
if (schema_is_1) return (Xob_bin_db_itm)nth_hash.Get_by(tier_key.Val_(0)); // v1 is always in ns_0
|
||||
if (tier_id >= ns_ids_len) throw Exc_.new_("tier out of range", "tier_id", tier_id, "len", ns_ids_len);
|
||||
if (tier_id >= ns_ids_len) throw Err_.new_wo_type("tier out of range", "tier_id", tier_id, "len", ns_ids_len);
|
||||
int ns_id = ns_ids[tier_id];
|
||||
return (Xob_bin_db_itm)nth_hash.Get_by(tier_key.Val_(ns_id));
|
||||
}
|
||||
|
||||
@@ -75,7 +75,7 @@ class Xob_diff_regy_sql_runner {
|
||||
else if (fsdb_db_tid == Fsdb_db_tid_.Tid_atr)
|
||||
return abc_mgr.Atr_mgr().Db__core().Conn();
|
||||
else
|
||||
throw Exc_.new_unhandled(fsdb_db_tid);
|
||||
throw Err_.new_unhandled(fsdb_db_tid);
|
||||
}
|
||||
public static String Build_url(String wiki_domain, int fsdb_db_id, String fsdb_db_type) {
|
||||
return String_.Format("{0}-{1}-{2}.sql", wiki_domain, Int_.Xto_str_pad_bgn_zero(fsdb_db_id, 3), fsdb_db_type);
|
||||
@@ -88,14 +88,14 @@ class Fsdb_db_tid_ {
|
||||
if (String_.Eq(s, Key_cfg)) return Tid_cfg;
|
||||
else if (String_.Eq(s, Key_atr)) return Tid_atr;
|
||||
else if (String_.Eq(s, Key_bin)) return Tid_bin;
|
||||
else throw Exc_.new_unhandled(s);
|
||||
else throw Err_.new_unhandled(s);
|
||||
}
|
||||
public static String Xto_key(byte v) {
|
||||
switch (v) {
|
||||
case Tid_cfg: return Key_cfg;
|
||||
case Tid_atr: return Key_atr;
|
||||
case Tid_bin: return Key_bin;
|
||||
default: throw Exc_.new_unhandled(v);
|
||||
default: throw Err_.new_unhandled(v);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -37,7 +37,7 @@ public class Xob_diff_regy_make_cmd extends Xob_itm_basic_base implements Xob_cm
|
||||
Sqlite_engine_.Idx_create(make_db_provider, Xob_diff_regy_tbl.Idx_xfer_regy__join);
|
||||
}
|
||||
catch (Exception exc) {
|
||||
app.Usr_dlg().Warn_many("", "", "error while making indexes: err=~{0}", Err_.Message_gplx(exc));
|
||||
app.Usr_dlg().Warn_many("", "", "error while making indexes: err=~{0}", Err_.Message_gplx_full(exc));
|
||||
}
|
||||
}
|
||||
private void Make_diff_regy(Db_conn make_db_provider) {
|
||||
|
||||
@@ -191,7 +191,7 @@ public class Xob_fsdb_make_cmd extends Xob_itm_basic_base implements Xob_cmd {
|
||||
}
|
||||
catch (Exception exc) {
|
||||
++exec_fail;
|
||||
usr_dlg.Warn_many("", "", "download error; ttl=~{0} w=~{1} err=~{2}", fsdb.Orig_ttl(), fsdb.Lnki_w(), Err_.Message_gplx(exc));
|
||||
usr_dlg.Warn_many("", "", "download error; ttl=~{0} w=~{1} err=~{2}", fsdb.Orig_ttl(), fsdb.Lnki_w(), Err_.Message_gplx_full(exc));
|
||||
}
|
||||
}
|
||||
private void Download_exec(Xodb_tbl_oimg_xfer_itm fsdb) {
|
||||
@@ -345,8 +345,8 @@ public class Xob_fsdb_make_cmd extends Xob_itm_basic_base implements Xob_cmd {
|
||||
url = wiki.Fsys_mgr().Root_dir().GenSubDir("prv"); // v2: EX: /xowa/wiki/en.wikipedia.org/prv/
|
||||
rv = Fsdb_db_mgr_.new_detect(wiki, url, url); // note that v2 is prioritized over v1
|
||||
}
|
||||
else throw Exc_.new_("fsdb.make:unknown fsdb_type", "version", version);
|
||||
if (rv == null) throw Exc_.new_("fsdb.make:source fsdb not found", "version", version, "url", url.Raw());
|
||||
else throw Err_.new_wo_type("fsdb.make:unknown fsdb_type", "version", version);
|
||||
if (rv == null) throw Err_.new_wo_type("fsdb.make:source fsdb not found", "version", version, "url", url.Raw());
|
||||
return rv;
|
||||
}
|
||||
private static final byte Select_rv_stop = 0, Select_rv_process = 1, Select_rv_next_page = 2;
|
||||
|
||||
@@ -192,7 +192,7 @@ class Xob_lnki_temp_wkr_ {
|
||||
int id = i < ids_len ? rv[i] : -1;
|
||||
wiki.Appe().Usr_dlg().Note_many("", "", "ns: ~{0} <- ~{1}", Int_.Xto_str_fmt(id, "0000"), alias);
|
||||
}
|
||||
if (aliases_len != ids_len) throw Exc_.new_("mismatch in aliases and ids", "aliases", aliases_len, "ids", ids_len);
|
||||
if (aliases_len != ids_len) throw Err_.new_wo_type("mismatch in aliases and ids", "aliases", aliases_len, "ids", ids_len);
|
||||
return rv;
|
||||
}
|
||||
private static int[] Ids_by_aliases(Xow_ns_mgr ns_mgr, String[] aliases) {
|
||||
|
||||
@@ -51,7 +51,7 @@ public abstract class Xob_search_base extends Xob_itm_dump_base implements Xobd_
|
||||
.Add_base85_len_5(page.Id()) .Add_byte(Byte_ascii.Semic)
|
||||
.Add_base85_len_5(page.Text().length) .Add_byte(Byte_ascii.Nl);
|
||||
}
|
||||
} catch (Exception e) {bldr.Usr_dlg().Warn_many("", "", "search_index:fatal error: err=~{0}", Err_.Message_gplx_brief(e));} // never let single page crash entire import
|
||||
} catch (Exception e) {bldr.Usr_dlg().Warn_many("", "", "search_index:fatal error: err=~{0}", Err_.Message_gplx_full(e));} // never let single page crash entire import
|
||||
}
|
||||
public void Wkr_end() {
|
||||
tmp_wtr_mgr.Flush_all(bldr.Usr_dlg());
|
||||
|
||||
@@ -61,7 +61,7 @@ public class Xob_page_cmd extends Xob_itm_basic_base implements Xobd_wkr, GfoInv
|
||||
Xowd_db_file text_db = ns_to_db_mgr.Get_by_ns(ns.Bldr_data(), text_zip.length);
|
||||
try {page_mgr.Create(page_core_tbl, text_db.Tbl__text(), id, page.Ns_id(), page.Ttl_page_db(), redirect, modified, text_zip, text_raw_len, random_int, text_db.Id(), -1);}
|
||||
catch (Exception e) {
|
||||
throw Exc_.new_exc(e, "bldr", "create page in db failed", "id", id, "ns", page.Ns_id(), "name", page.Ttl_page_db(), "redirect", redirect, "modified", modified, "text_len", text_raw_len, "text_db_id", text_db.Id());
|
||||
throw Err_.new_exc(e, "bldr", "create page in db failed; skipping page", "id", id, "ns", page.Ns_id(), "name", page.Ttl_page_db(), "redirect", redirect, "modified", modified, "text_len", text_raw_len, "text_db_id", text_db.Id());
|
||||
}
|
||||
if (redirect && redirect_id_enabled)
|
||||
redirect_tbl.Insert(id, page.Ttl_page_db(), redirect_ttl);
|
||||
|
||||
@@ -78,7 +78,7 @@ class Xob_search_wkr extends Xob_itm_basic_base implements Xobd_wkr {
|
||||
byte[] word = words[i];
|
||||
search_temp_tbl.Insert_cmd_by_batch(page_id, word);
|
||||
}
|
||||
} catch (Exception e) {bldr.Usr_dlg().Warn_many("", "", "search_index:fatal error: err=~{0}", Err_.Message_gplx_brief(e));} // never let single page crash entire import
|
||||
} catch (Exception e) {bldr.Usr_dlg().Warn_many("", "", "search_index:fatal error: err=~{0}", Err_.Message_gplx_full(e));} // never let single page crash entire import
|
||||
}
|
||||
public void Wkr_end() {
|
||||
search_temp_tbl.Make_data(usr_dlg, search_db.Tbl__search_link(), search_db.Tbl__search_word());
|
||||
|
||||
@@ -23,7 +23,7 @@ public class Xob_term_cmd extends Xob_term_base {
|
||||
@Override public void Cmd_end_hook() {
|
||||
Io_mgr.I.DeleteDirDeep(wiki.Fsys_mgr().Tmp_dir());
|
||||
Db_cfg_tbl cfg_tbl = wiki.Data__core_mgr().Tbl__cfg();
|
||||
cfg_tbl.Insert_bry(Xow_cfg_consts.Grp__wiki_init, "props.bldr_version", wiki.Props().Bldr_version());
|
||||
cfg_tbl.Insert_bry(Xow_cfg_consts.Grp__wiki_init, Xow_cfg_consts.Key__init__bldr_version, wiki.Props().Bldr_version());
|
||||
cfg_tbl.Insert_bry(Xow_cfg_consts.Grp__wiki_init, Xow_cfg_consts.Key__init__main_page, wiki.Props().Main_page());
|
||||
cfg_tbl.Insert_bry(Xow_cfg_consts.Grp__wiki_init, "props.siteinfo_misc", wiki.Props().Siteinfo_misc());
|
||||
cfg_tbl.Insert_bry(Xow_cfg_consts.Grp__wiki_init, "props.siteinfo_mainpage", wiki.Props().Siteinfo_mainpage());
|
||||
|
||||
@@ -174,7 +174,7 @@ public class Xob_tst {
|
||||
Io_mgr.I.SaveFilStr(url, raw);
|
||||
Xotdb_page_raw_parser parser = new Xotdb_page_raw_parser();
|
||||
Xowe_wiki wiki = Xoa_app_fxt.wiki_tst_(app);
|
||||
parser.Load(Gfo_usr_dlg_.Test(), wiki, new Xow_ns(Xow_ns_.Id_template, Xow_ns_case_.Id_1st, Bry_.new_u8("Template"), false), new Io_url[] {url}, 1 * Io_mgr.Len_kb);
|
||||
parser.Load(Gfo_usr_dlg_.Test(), wiki, new Xow_ns(Xow_ns_.Id_template, Xow_ns_case_.Id_1st, Bry_.new_a7("Template"), false), new Io_url[] {url}, 1 * Io_mgr.Len_kb);
|
||||
List_adp actl = List_adp_.new_();
|
||||
Xowd_page_itm page = new Xowd_page_itm();
|
||||
while (parser.Read(page)) {
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user