void validateProxyArguments(IMethodSignature methodSignature, IRuntimeEnv env, Object[] args) { if (args == null || args.length == 0) { return; } for (int i = 0; i < args.length; i++) { Object arg = args[i]; if (arg == null) { continue; } IOpenClass generatedType = methodSignature.getParameterType(i); if (generatedType instanceof DomainOpenClass) { validateAliasValue(arg, generatedType); } else if (generatedType instanceof ComponentTypeArrayOpenClass) { doValidate(env, (Object[]) arg, generatedType.getComponentClass()); } else if (generatedType instanceof DatatypeOpenClass) { doValidate(env, arg, generatedType); } } }
private void validateAliasValue(Object value, IOpenClass openClass) { if (openClass.isArray()) { Object[] values = (Object[]) value; for (Object o : values) { testLookupValue(o, openClass); } } else { testLookupValue(value, openClass); } }
private void doValidate(IRuntimeEnv env, Object[] objs, IOpenClass openType) { for (Object obj : objs) { if (obj == null) { continue; } if (openType instanceof ComponentTypeArrayOpenClass) { doValidate(env, (Object[]) obj, openType.getComponentClass()); } else if (openType instanceof DatatypeOpenClass) { doValidate(env, obj, openType); } } }
@Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { if (IRulesRuntimeContextProvider.class.equals(method.getDeclaringClass())) { return method.invoke(this, args); } if (IEngineWrapper.class != method.getDeclaringClass()) { IOpenMember targetMethod = getMethodMap().get(method); if (targetMethod instanceof IOpenMethod) { validationHandler.validateProxyArguments(((IOpenMethod) targetMethod).getSignature(), getRuntimeEnv(), args); } } return super.invoke(proxy, method, args); } }
private void doValidate(IRuntimeEnv env, Object obj, IOpenClass openType) { if (!obj.getClass().equals(openType.getInstanceClass())) { return; } for (IOpenField openField : openType.getFields().values()) { IOpenClass openClass = openField.getType(); if (openClass instanceof ComponentTypeArrayOpenClass) { Object value = openField.get(obj, env); if (value == null) { continue; } doValidate(env, (Object[]) value, openClass.getComponentClass()); } else if (openClass instanceof DatatypeOpenClass) { Object value = openField.get(obj, env); if (value == null) { continue; } doValidate(env, value, openClass); } else if (openClass instanceof DomainOpenClass) { Object value = openField.get(obj, env); if (value == null) { continue; } validateAliasValue(value, openClass); } } }