public boolean isDefined( String symbol ) { symbol = EvalHelper.normalizeVariableName( symbol ); return functions.containsKey( symbol ); }
@Override public void setValue(String symbol, Object value) { this.variables.put( EvalHelper.normalizeVariableName( symbol ), value ); }
public Object getValue(String symbol) { symbol = EvalHelper.normalizeVariableName( symbol ); if ( functions.containsKey( symbol ) ) { return functions.get( symbol ); } return null; }
public Symbol resolve(String id) { Symbol s = symbols.get( EvalHelper.normalizeVariableName( id ) ); if ( s == null && parentScope != null ) { return parentScope.resolve( id ); } return s; }
@Override public String evaluate(EvaluationContext ctx) { return EvalHelper.normalizeVariableName( getText() ); }
private RootExecutionFrame() { Map<String, Object> builtIn = new ConcurrentHashMap<>( ); for( FEELFunction f : BuiltInFunctions.getFunctions() ) { builtIn.put( EvalHelper.normalizeVariableName( f.getName() ), f ); } functions = Collections.unmodifiableMap( builtIn ); }
public Symbol resolve(String[] qualifiedName) { Symbol root = symbols.get( EvalHelper.normalizeVariableName( qualifiedName[0] ) ); if ( root == null && parentScope != null ) { return parentScope.resolve( qualifiedName ); } else if( root != null ) { Symbol currentSymbol = root; for( int i = 1; i < qualifiedName.length && currentSymbol != null; i++ ) { currentSymbol = currentSymbol.getScope().resolve( EvalHelper.normalizeVariableName( qualifiedName[i] ) ); } return currentSymbol; } return null; }
@Override public DirectCompilerResult visit(NameDefNode n) { StringLiteralExpr expr = Expressions.stringLiteral(EvalHelper.normalizeVariableName(n.getText())); return DirectCompilerResult.of(expr, BuiltInType.STRING); }
@Override public DirectCompilerResult visit(NameRefNode n) { String nameRef = EvalHelper.normalizeVariableName(n.getText()); Type type = scopeHelper.resolveType(nameRef).orElse(BuiltInType.UNKNOWN); return DirectCompilerResult.of(FeelCtx.getValue(nameRef), type); }
@Override public DirectCompilerResult visitNameDefinition(FEEL_1_1Parser.NameDefinitionContext ctx) { // this is used by the For loop for the variable name of the iteration contexts. StringLiteralExpr expr = new StringLiteralExpr(EvalHelper.normalizeVariableName(ParserHelper.getOriginalText(ctx))); return DirectCompilerResult.of(expr, BuiltInType.STRING); }
@Override public DirectCompilerResult visitKeyName(KeyNameContext ctx) { StringLiteralExpr expr = new StringLiteralExpr(EvalHelper.normalizeVariableName(ParserHelper.getOriginalText(ctx))); return DirectCompilerResult.of(expr, BuiltInType.STRING); }
public boolean define(Symbol symbol) { if ( symbols.containsKey( symbol.getId() ) ) { // duplicate symbol definition return false; } symbols.put( EvalHelper.normalizeVariableName( symbol.getId() ), symbol ); if( tokenTree != null ) { // also load the symbol into the token tree tokenTree.addName( tokenize( symbol.getId() ) ); } return true; }
@Override public boolean isDefined(String symbol) { symbol = EvalHelper.normalizeVariableName( symbol ); if (rootObject != null) { if (EvalHelper.getDefinedValue(rootObject, symbol).isDefined()) { return true; } else { // do nothing! it might be shaded at this level for "item" or being in the parent frame. } } if ( variables.containsKey( symbol ) ) { return true; } if ( parentFrame != null ) { return parentFrame.isDefined( symbol ); } return false; }
@Override public Object evaluate(EvaluationContext ctx) { Object current = parts.get( 0 ).evaluate( ctx ); try { if ( current != null ) { for ( int i = 1; i < parts.size(); i++ ) { String n = parts.get( i ).getText(); if ( current instanceof Collection ) { // e.g.: FEEL: MyList.property1 // can't use Stream API as from EvalHelper.getValue I need to listen for checked exception Collection<Object> result = new ArrayList<>(); for ( Object e : (Collection<?>) current ) { result.add( EvalHelper.getValue( e, EvalHelper.normalizeVariableName( n ) ) ); } current = result; } else { current = EvalHelper.getValue( current, EvalHelper.normalizeVariableName( n ) ); } } return current; } } catch ( Exception e ) { ctx.notifyEvt( astEvent(Severity.ERROR, Msg.createMessage(Msg.ERROR_ACCESSING_QUALIFIED_NAME, getText()), e) ); return null; } return null; }
@Override public Object getValue(String symbol) { symbol = EvalHelper.normalizeVariableName( symbol ); if (rootObject != null) { PropertyValueResult dv = EvalHelper.getDefinedValue(rootObject, symbol); if (dv.isDefined()) { return dv.getValueResult().getOrElse(null); } } if ( variables.containsKey( symbol ) ) { return variables.get( symbol ); } if ( parentFrame != null ) { return parentFrame.getValue( symbol ); } return null; }
@Test public void testNormalizeSpace() { assertNull(normalizeVariableName(null)); assertEquals("", normalizeVariableName("")); assertEquals("", normalizeVariableName(" ")); assertEquals("", normalizeVariableName("\t")); assertEquals("", normalizeVariableName("\n")); assertEquals("", normalizeVariableName("\u0009")); assertEquals("", normalizeVariableName("\u000B")); assertEquals("", normalizeVariableName("\u000C")); assertEquals("", normalizeVariableName("\u001C")); assertEquals("", normalizeVariableName("\u001D")); assertEquals("", normalizeVariableName("\u001E")); assertEquals("", normalizeVariableName("\u001F")); assertEquals("", normalizeVariableName("\f")); assertEquals("", normalizeVariableName("\r")); assertEquals("a", normalizeVariableName(" a ")); assertEquals("a b c", normalizeVariableName(" a b c ")); assertEquals("a b c", normalizeVariableName("a\t\f\r b\u000B c\n")); assertEquals("a b c", normalizeVariableName("a\t\f\r \u00A0\u00A0b\u000B c\n")); assertEquals("b", normalizeVariableName(" b")); assertEquals("b", normalizeVariableName("b ")); assertEquals("ab c", normalizeVariableName("ab c ")); assertEquals("a b", normalizeVariableName("a\u00A0b")); } }
@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(); } }
@Override public Object evaluate(EvaluationContext ctx) { String varName = EvalHelper.normalizeVariableName( getText() ); if( ! ctx.isDefined( varName ) ) { ctx.notifyEvt( astEvent( FEELEvent.Severity.ERROR, Msg.createMessage( Msg.UNKNOWN_VARIABLE_REFERENCE, getText()), null) ); return null; } return ctx.getValue( varName ); }