[ 
https://issues.apache.org/jira/browse/JEXL-256?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Dmitri Blinov updated JEXL-256:
-------------------------------
    Description: 
I have bumped into the problem when my {{Context.get()}} sometimes reports 
access to variables that are reported by the {{Context.has()}} method as not 
existent, and are not supposed to be in the context, mainly parts of ant-ish 
variable paths. I assume that once {{Context.has()}} have reported {{false}} no 
attempt from the Jexl to call {{Context.get()}} with the same parameter should 
be made.

I think the problem lies in {{Interpreter.java}} which first calls 
{{Context.get()}} and only if it returns null, which should not necceserily 
mean the variable does not exist, checks {{Context.has()}}. 

{code}
    @Override
    protected Object visit(ASTIdentifier node, Object data) {
        cancelCheck(node);
        String name = node.getName();
        if (data == null) {
            int symbol = node.getSymbol();
            if (symbol >= 0) {
                return frame.get(symbol);
            }
            Object value = context.get(name);
            if (value == null
                    && !(node.jjtGetParent() instanceof ASTReference)
                    && !context.has(name)
                    && !node.isTernaryProtected()) {
                return unsolvableVariable(node, name, true);
            }
            return value;
        } else {
            return getAttribute(data, name, node);
        }
    }
{code}

So I suggest to change the code to something like this

{code}
    @Override
    protected Object visit(ASTIdentifier node, Object data) {
        cancelCheck(node);
        String name = node.getName();
        if (data == null) {
            int symbol = node.getSymbol();
            if (symbol >= 0) {
                return frame.get(symbol);
            }
            if (!context.has(name)
                    && !(node.jjtGetParent() instanceof ASTReference)
                    && !node.isTernaryProtected()) {
                return unsolvableVariable(node, name, true);
            }
            return context.get(name);
        } else {
            return getAttribute(data, name, node);
        }
    }
{code}


  was:
I have bumped into the problem when my {{Context.get()}} sometimes reports 
access to variables that are reported by the {{Context.has()}} method as not 
existent, and are not supposed to be in the context, mainly parts of ant-ish 
variable paths. I assume that once {{Context.has()}} have reported {{false}} no 
attempt from the Jexl to call {{Context.get()}} with the same parameter should 
be made.

I think the problem lies in {{Interpreter.java}} which first calls 
{{Context.get()}} and only if it returns null, which should not necceserily 
mean the variable does not exist, checks {{Context.get()}}. 

{code}
    @Override
    protected Object visit(ASTIdentifier node, Object data) {
        cancelCheck(node);
        String name = node.getName();
        if (data == null) {
            int symbol = node.getSymbol();
            if (symbol >= 0) {
                return frame.get(symbol);
            }
            Object value = context.get(name);
            if (value == null
                    && !(node.jjtGetParent() instanceof ASTReference)
                    && !context.has(name)
                    && !node.isTernaryProtected()) {
                return unsolvableVariable(node, name, true);
            }
            return value;
        } else {
            return getAttribute(data, name, node);
        }
    }
{code}

So I suggest to change the code to something like this

{code}
    @Override
    protected Object visit(ASTIdentifier node, Object data) {
        cancelCheck(node);
        String name = node.getName();
        if (data == null) {
            int symbol = node.getSymbol();
            if (symbol >= 0) {
                return frame.get(symbol);
            }
            if (!context.has(name)
                    && !(node.jjtGetParent() instanceof ASTReference)
                    && !node.isTernaryProtected()) {
                return unsolvableVariable(node, name, true);
            }
            return context.get(name);
        } else {
            return getAttribute(data, name, node);
        }
    }
{code}



> Jexl should not try to resolve a variable from Context when Context.has() 
> returns false
> ---------------------------------------------------------------------------------------
>
>                 Key: JEXL-256
>                 URL: https://issues.apache.org/jira/browse/JEXL-256
>             Project: Commons JEXL
>          Issue Type: Improvement
>    Affects Versions: 3.1
>            Reporter: Dmitri Blinov
>            Priority: Major
>
> I have bumped into the problem when my {{Context.get()}} sometimes reports 
> access to variables that are reported by the {{Context.has()}} method as not 
> existent, and are not supposed to be in the context, mainly parts of ant-ish 
> variable paths. I assume that once {{Context.has()}} have reported {{false}} 
> no attempt from the Jexl to call {{Context.get()}} with the same parameter 
> should be made.
> I think the problem lies in {{Interpreter.java}} which first calls 
> {{Context.get()}} and only if it returns null, which should not necceserily 
> mean the variable does not exist, checks {{Context.has()}}. 
> {code}
>     @Override
>     protected Object visit(ASTIdentifier node, Object data) {
>         cancelCheck(node);
>         String name = node.getName();
>         if (data == null) {
>             int symbol = node.getSymbol();
>             if (symbol >= 0) {
>                 return frame.get(symbol);
>             }
>             Object value = context.get(name);
>             if (value == null
>                     && !(node.jjtGetParent() instanceof ASTReference)
>                     && !context.has(name)
>                     && !node.isTernaryProtected()) {
>                 return unsolvableVariable(node, name, true);
>             }
>             return value;
>         } else {
>             return getAttribute(data, name, node);
>         }
>     }
> {code}
> So I suggest to change the code to something like this
> {code}
>     @Override
>     protected Object visit(ASTIdentifier node, Object data) {
>         cancelCheck(node);
>         String name = node.getName();
>         if (data == null) {
>             int symbol = node.getSymbol();
>             if (symbol >= 0) {
>                 return frame.get(symbol);
>             }
>             if (!context.has(name)
>                     && !(node.jjtGetParent() instanceof ASTReference)
>                     && !node.isTernaryProtected()) {
>                 return unsolvableVariable(node, name, true);
>             }
>             return context.get(name);
>         } else {
>             return getAttribute(data, name, node);
>         }
>     }
> {code}



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

Reply via email to