mirror of https://github.com/gnosygnu/xowa
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
71 lines
3.3 KiB
71 lines
3.3 KiB
/*
|
|
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.criterias; import gplx.*; import gplx.core.*;
|
|
public class Criteria_fld implements Criteria {
|
|
Criteria_fld(String pre, String key, Criteria crt) {this.pre = pre; this.key = key; this.crt = crt;}
|
|
public byte Tid() {return Criteria_.Tid_wrapper;}
|
|
public String Pre() {return pre;} private final String pre;
|
|
public String Key() {return key;} private final String key;
|
|
public Criteria Crt() {return crt;} private final Criteria crt;
|
|
public void Val_as_obj_(Object v) {throw Err_.new_unimplemented();}
|
|
public void Val_from_args(Hash_adp args) {
|
|
List_adp list = (List_adp)args.Get_by(key); if (list == null) throw Err_.new_wo_type("criteria.fld key not found", "key", key);
|
|
Object o = Fill_val(key, crt.Tid(), list);
|
|
crt.Val_as_obj_(o);
|
|
}
|
|
public boolean Matches(Object invkObj) {
|
|
GfoInvkAble invk = (GfoInvkAble)invkObj;
|
|
if (key == Criteria_fld.Key_null) return crt.Matches(invkObj);
|
|
Object comp = GfoInvkAble_.InvkCmd(invk, key);
|
|
return crt.Matches(comp);
|
|
}
|
|
public String To_str() {return String_.Concat(key, " ", crt.To_str());}
|
|
|
|
public static final String Key_null = null, Pre_null = null;
|
|
public static Criteria_fld as_(Object obj) {return obj instanceof Criteria_fld ? (Criteria_fld)obj : null;}
|
|
public static Criteria_fld new_(String pre, String key, Criteria crt) {return new Criteria_fld(pre, key, crt);}
|
|
public static Criteria_fld new_(String key, Criteria crt) {return new Criteria_fld(Pre_null, key, crt);}
|
|
public static Object Fill_val(String key, byte tid, List_adp list) {
|
|
int len = list.Count();
|
|
switch (tid) {
|
|
case Criteria_.Tid_eq:
|
|
case Criteria_.Tid_comp:
|
|
case Criteria_.Tid_like:
|
|
case Criteria_.Tid_iomatch:
|
|
if (len != 1) throw Err_.new_wo_type("list.len should be 1", "key", key, "tid", tid, "len", len);
|
|
return list.Get_at(0);
|
|
case Criteria_.Tid_between:
|
|
if (len != 2) throw Err_.new_wo_type("list.len should be 2", "key", key, "tid", tid, "len", len);
|
|
return new Object[] {list.Get_at(0), list.Get_at(1)};
|
|
case Criteria_.Tid_in:
|
|
if (len == 0) throw Err_.new_wo_type("list.len should be > 0", "key", key, "tid", tid, "len", len);
|
|
return list.To_obj_ary();
|
|
case Criteria_.Tid_const:
|
|
case Criteria_.Tid_not:
|
|
case Criteria_.Tid_and:
|
|
case Criteria_.Tid_or:
|
|
if (len != 0) throw Err_.new_wo_type("list.len should be 0", "key", key, "tid", tid, "len", len);
|
|
return key; // no values to fill in; return back key
|
|
case Criteria_.Tid_wrapper: // not recursive
|
|
case Criteria_.Tid_db_obj_ary: // unsupported
|
|
case Criteria_.Tid_custom:
|
|
default: throw Err_.new_unhandled(tid);
|
|
}
|
|
}
|
|
}
|