private String getSignature() { return getName() + "( " + parameters.stream().collect( Collectors.joining( ", " ) ) + " )"; }
@Override public String toString() { return "function " + getSignature(); } }
public FEELFnResult<Object> invoke(EvaluationContext ctx, Object[] params) { if( params.length != parameters.size() ) { return FEELFnResult.ofError(new InvalidInputEvent(Severity.ERROR, "Illegal invocation of function", getName(), getName() + "( " + Arrays.asList(params)+" )", getSignature())); } FEELEvent capturedException = null; try { ctx.enterFrame(); for ( int i = 0; i < parameters.size(); i++ ) { ctx.setValue( parameters.get( i ), params[i] ); } Object[] actualParams = prepareParams( params ); Object result = method.invoke( clazz, actualParams ); return FEELFnResult.ofResult( result ); } catch ( InvocationTargetException e ) { String message = e.getTargetException().getMessage(); capturedException = new FEELEventBase(Severity.ERROR, "Error invoking "+toString()+": "+message, new RuntimeException("Error invoking function " + getSignature() + ".", e)); } catch ( IllegalAccessException e ) { String message = e.getCause().getMessage(); capturedException = new FEELEventBase(Severity.ERROR, "Error invoking "+toString()+": "+message, new RuntimeException("Error invoking function " + getSignature() + ".", e)); } finally { ctx.exitFrame(); } return FEELFnResult.ofError( capturedException ); }
private Object[] prepareParams(Object[] params) { Object[] actual = new Object[ params.length ]; Class[] paramTypes = method.getParameterTypes(); params = adjustForVariableParameters( paramTypes, params ); for( int i = 0; i < paramTypes.length; i++ ) { if( paramTypes[i].isAssignableFrom( params[i].getClass() ) ) {
@Override public Object evaluate(EvaluationContext ctx) { try { ctx.enterFrame(); Map<String, Object> c = new LinkedHashMap<>(); for( ContextEntryNode cen : entries ) { String name = EvalHelper.normalizeVariableName( cen.evaluateName( ctx ) ); Object value = cen.evaluate( ctx ); if( value instanceof CustomFEELFunction ) { // helpful for debugging ((CustomFEELFunction) value).setName( name ); } else if( value instanceof JavaFunction ) { ((JavaFunction) value).setName( name ); } else if ( value instanceof DTInvokerFunction ) { ((DTInvokerFunction) value).setName(name); } ctx.setValue( name, value ); c.put( name, value ); } return c; } finally { ctx.exitFrame(); } }
return new JavaFunction( ANONYMOUS, params, clazz, method ); } else { ctx.notifyEvt( astEvent(Severity.ERROR, Msg.createMessage(Msg.PARAMETER_COUNT_MISMATCH_ON_FUNCTION_DEFINITION, getText()) ) );