https://issues.apache.org/bugzilla/show_bug.cgi?id=52440

             Bug #: 52440
           Summary: Wrong getValueReference behaviour with Facelets
                    parameter expressions
           Product: Tomcat 7
           Version: 7.0.22
          Platform: PC
            Status: NEW
          Severity: normal
          Priority: P2
         Component: Servlet & JSP API
        AssignedTo: dev@tomcat.apache.org
        ReportedBy: justas.ratkevic...@gmail.com
    Classification: Unclassified


ValueExpression method getValueReference should return base object and
property. But it returns null if ValueExpression is Facelets parameter.
Example:

someVar = #{concreteObject.property}

ValueExpression for #{someVar} return null from method getValueReference (guess
because it is simple expression #{someVar}), but logicaly it should return
parent expressions ValueReference (need hierachical ValueReference lookup).

I made workaround with Java Reflect API in my code and it illustrates problem:

ELContext elContext = FacesContext.getCurrentInstance().getELContext();
ValueReference reference = exp.getValueReference(elContext);

if (reference == null && exp instanceof TagValueExpressionUEL) {
    ValueExpressionImpl origExp = (ValueExpressionImpl)
((TagValueExpressionUEL) exp).getWrapped();

    // TODO: JR: find better way to get base and property. ! Code is not
portable because uses Tomcat EL implementation details. ! 
    Field field = ReflectionUtils.findField(origExp.getClass(),
EL_IMPL_VAR_PROPERTY);
    field.setAccessible(true);
    VariableMapper varMapper = (VariableMapper) ReflectionUtils.getField(field,
origExp);
    field = ReflectionUtils.findField(origExp.getClass(),
EL_IMPL_NODE_PROPERTY);
    field.setAccessible(true);
    SimpleNode node = (SimpleNode) ReflectionUtils.getField(field, origExp);

    if (varMapper != null && node != null) {
        ValueExpression parentExp = varMapper.resolveVariable(node.getImage());
        if (parentExp != null) {
            try {
                reference = parentExp.getValueReference(elContext);

                if (reference == null) {
                    reference = getValueReference(parentExp);
                }
            } catch (PropertyNotFoundException e) {
                LOG.warn("Property not found: " + e.getMessage());
            }
        }
    }
}

-- 
Configure bugmail: https://issues.apache.org/bugzilla/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are the assignee for the bug.

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org
For additional commands, e-mail: dev-h...@tomcat.apache.org

Reply via email to