use of org.beetl.core.exception.BeetlException in project beetl2.0 by javamonkey.
the class ObjectAA method setValue.
public void setValue(Object o, Object key, Object value) {
if (o instanceof Map) {
((Map) o).put(key, value);
} else if (o instanceof List) {
try {
((List) o).set(((Number) key).intValue(), value);
} catch (IndexOutOfBoundsException ex) {
BeetlException be = new BeetlException(BeetlException.ATTRIBUTE_INVALID, ex);
throw be;
} catch (ClassCastException ex) {
throw new ClassCastException("目标位为java.util.List,无法设置属性:" + key);
}
} else if (o.getClass().isArray()) {
try {
if (o.getClass().getComponentType().isPrimitive()) {
PrimitiveArrayUtil.setObject(o, (((Number) key).intValue()), value);
} else {
((Object[]) o)[(((Number) key).intValue())] = value;
}
} catch (ClassCastException ex) {
throw new ClassCastException("类型为数组,无此属性:" + key);
}
} else {
Class c = o.getClass();
MethodInvoker invoker = ObjectUtil.getInvokder(c, (String) key);
if (invoker != null) {
invoker.set(o, value);
} else {
BeetlException ex = new BeetlException(BeetlException.ATTRIBUTE_NOT_FOUND, (String) key);
throw ex;
}
}
}
use of org.beetl.core.exception.BeetlException in project beetl2.0 by javamonkey.
the class NativeCallExpression method evaluate.
public Object evaluate(Context ctx) {
Class targetCls = null;
Object targetObj = null;
NativeNode lastNode = null;
if (insNode != null) {
targetObj = insNode.ref.evaluate(ctx);
if (targetObj != null) {
targetCls = targetObj.getClass();
}
lastNode = insNode;
} else {
targetCls = ctx.gt.loadClassBySimpleName(this.clsNode.cls);
if (targetCls == null) {
BeetlException be = new BeetlException(BeetlException.NATIVE_CALL_EXCEPTION, "该类不存在");
be.pushToken(GrammarToken.createToken(clsNode.cls, token.line));
throw be;
}
lastNode = clsNode;
}
for (NativeNode node : chain) {
if (node instanceof NativeAtrributeNode) {
String attr = ((NativeAtrributeNode) node).attribute;
try {
checkNull(targetCls, lastNode);
Field f = targetCls.getField(attr);
if (!Modifier.isStatic(f.getModifiers())) {
checkNull(targetObj, lastNode);
}
targetObj = f.get(targetObj);
targetCls = f.getType();
} catch (SecurityException e) {
BeetlException be = new BeetlException(BeetlException.NATIVE_CALL_EXCEPTION, "不能调用属性", e);
be.pushToken(GrammarToken.createToken(attr, token.line));
throw be;
} catch (NoSuchFieldException e) {
BeetlException be = new BeetlException(BeetlException.NATIVE_CALL_EXCEPTION, "无此属性", e);
be.pushToken(GrammarToken.createToken(attr, token.line));
throw be;
} catch (IllegalArgumentException e) {
BeetlException be = new BeetlException(BeetlException.NATIVE_CALL_EXCEPTION, "访问属性出错", e);
be.pushToken(GrammarToken.createToken(attr, token.line));
throw be;
} catch (IllegalAccessException e) {
BeetlException be = new BeetlException(BeetlException.NATIVE_CALL_EXCEPTION, "访问属性出错", e);
be.pushToken(GrammarToken.createToken(attr, token.line));
throw be;
}
} else if (node instanceof NativeArrayNode) {
checkNull(targetCls, lastNode);
if (!targetCls.isArray()) {
BeetlException be = new BeetlException(BeetlException.ARRAY_TYPE_ERROR);
// 最好是把上一个字符显示出来
be.pushToken(GrammarToken.createToken("[]", token.line));
throw be;
}
Expression exp = ((NativeArrayNode) node).exp;
Object value = exp.evaluate(ctx);
if (value instanceof Number) {
int index = ((Number) value).intValue();
targetObj = ((Object[]) targetObj)[index];
if (targetObj != null) {
targetCls = targetObj.getClass();
} else {
// todo or component of array
targetCls = null;
}
} else {
BeetlException be = new BeetlException(BeetlException.ARRAY_INDEX_ERROR, "数组指针必须是Number类型");
be.pushToken(GrammarToken.createToken("[]", token.line));
throw be;
}
} else if (node instanceof NativeMethodNode) {
NativeMethodNode methodNode = (NativeMethodNode) node;
String method = methodNode.method;
Expression[] expList = methodNode.paras;
this.checkPermit(ctx, targetCls, targetObj, method);
Object[] args = expList.length == 0 ? ObjectUtil.EMPTY_OBJECT_ARRAY : new Object[expList.length];
Class[] parameterType = new Class[args.length];
for (int i = 0; i < expList.length; i++) {
args[i] = expList[i].evaluate(ctx);
parameterType[i] = args[i] == null ? null : args[i].getClass();
}
this.checkNull(targetCls, lastNode);
ObjectMethodMatchConf mf = ObjectUtil.findMethod(targetCls, method, parameterType);
if (mf == null) {
BeetlException ex = new BeetlException(BeetlParserException.NATIVE_CALL_INVALID, "根据参数未找到匹配的方法" + method + BeetlUtil.getParameterDescription(parameterType));
ex.pushToken(GrammarToken.createToken(lastNode.getName(), token.line));
throw ex;
}
if (targetObj == null && !Modifier.isStatic(mf.method.getModifiers())) {
BeetlException ex = new BeetlException(BeetlException.NULL);
ex.pushToken(GrammarToken.createToken(lastNode.getName(), token.line));
throw ex;
}
try {
targetObj = ObjectUtil.invoke(targetObj, mf, args);
if (targetObj != null) {
targetCls = targetObj.getClass();
} else {
targetCls = null;
}
} catch (SecurityException e) {
BeetlException be = new BeetlException(BeetlException.NATIVE_CALL_EXCEPTION, "不能调用方法", e);
be.pushToken(GrammarToken.createToken(method, token.line));
throw be;
} catch (IllegalArgumentException e) {
BeetlException be = new BeetlException(BeetlException.NATIVE_CALL_EXCEPTION, "错误的参数", e);
be.pushToken(GrammarToken.createToken(method, token.line));
throw be;
} catch (IllegalAccessException e) {
BeetlException be = new BeetlException(BeetlException.NATIVE_CALL_EXCEPTION, "无法访问方法", e);
be.pushToken(GrammarToken.createToken(method, token.line));
throw be;
} catch (InvocationTargetException e) {
BeetlException be = new BeetlException(BeetlException.NATIVE_CALL_EXCEPTION, "内部调用报错", e.getTargetException());
be.pushToken(GrammarToken.createToken(method, token.line));
throw be;
}
}
lastNode = node;
}
return targetObj;
}
use of org.beetl.core.exception.BeetlException in project beetl2.0 by javamonkey.
the class ProgramMetaData method getAjax.
public AjaxStatement getAjax(String anchor) {
if (ajaxs == null) {
BeetlException be = new BeetlException(BeetlException.AJAX_NOT_FOUND, "该模板文件没有发现任何ajax锚点");
be.pushToken(new GrammarToken(anchor, 0, 0));
throw be;
}
return ajaxs.get(anchor);
}
use of org.beetl.core.exception.BeetlException in project beetl2.0 by javamonkey.
the class BeetlAntlrErrorStrategy method reportUnwantedToken.
protected void reportUnwantedToken(@NotNull Parser recognizer) {
if (inErrorRecoveryMode(recognizer)) {
return;
}
beginErrorCondition(recognizer);
Token t = recognizer.getCurrentToken();
String tokenName = getTokenErrorDisplay(t);
IntervalSet expecting = getExpectedTokens(recognizer);
String msg = "多余输入 " + tokenName + " 期望 " + expecting.toString(recognizer.getTokenNames());
BeetlException exception = new BeetlParserException(BeetlException.PARSER_MISS_ERROR, msg);
// exception.token = this.getGrammarToken(t);
exception.pushToken(this.getGrammarToken(t));
throw exception;
}
use of org.beetl.core.exception.BeetlException in project beetl2.0 by javamonkey.
the class BeetlAntlrErrorStrategy method reportFailedPredicate.
protected void reportFailedPredicate(@NotNull Parser recognizer, @NotNull FailedPredicateException e) {
String ruleName = recognizer.getRuleNames()[recognizer.getContext().getRuleIndex()];
BeetlException exception = new BeetlParserException(BeetlException.PARSER_PREDICATE_ERROR, ruleName, e);
// exception.token = this.getGrammarToken(e.getOffendingToken());
exception.pushToken(this.getGrammarToken(e.getOffendingToken()));
throw exception;
}
Aggregations