Hi,

 

I'm developing an application to parse EL expressions from a file and
evaluate them. I am using Java Unified EL for the same. The value
expressions are resolving fine however the  functions are not. I'm using
Tomcat 6.0.10 which is bundled with JBoss 4.2.3. I've posted this query
to the Tomcat user mailing list earlier but it is related to the Tomcat
source so I'm it posting here as I didn't receive any response from the
user forums.

 

The way I am evaluating the expression is:

 

final MethodExpression methodExpr =

exprFactory.createMethodExpression(jspContext.getELContext(), el,
expectedType, paramTypes);

Object result = methodExpr.invoke(jspContext.getELContext(), params);

 

 

However, the function is not being invoked and I get a stack trace like
such:

 

2009-02-12 22:35:13,629 [http-0.0.0.0-8080-5] ERROR STDERR () -
javax.el.ELException: Function 'testtld:escapeJava' not found

2009-02-12 22:35:13,630 [http-0.0.0.0-8080-5] ERROR STDERR () -     at
org.apache.el.lang.ExpressionBuilder.visit(ExpressionBuilder.java:171)

2009-02-12 22:35:13,630 [http-0.0.0.0-8080-5] ERROR STDERR () -     at
org.apache.el.parser.SimpleNode.accept(SimpleNode.java:129)

2009-02-12 22:35:13,630 [http-0.0.0.0-8080-5] ERROR STDERR () -     at
org.apache.el.lang.ExpressionBuilder.prepare(ExpressionBuilder.java:133)

2009-02-12 22:35:13,630 [http-0.0.0.0-8080-5] ERROR STDERR () -     at
org.apache.el.lang.ExpressionBuilder.build(ExpressionBuilder.java:147)

2009-02-12 22:35:13,630 [http-0.0.0.0-8080-5] ERROR STDERR () -     at
org.apache.el.lang.ExpressionBuilder.createMethodExpression(ExpressionBu
ilder.java:197)

2009-02-12 22:35:13,630 [http-0.0.0.0-8080-5] ERROR STDERR () -     at
org.apache.el.ExpressionFactoryImpl.createMethodExpression(ExpressionFac
toryImpl.java:57)

2009-02-12 22:35:13,630 [http-0.0.0.0-8080-5] ERROR STDERR () -     at
test.util.ELExpressionEvaluator.evaluate(ELExpressionEvaluator.java:120)

 

 

The jsp page that I am using to obtain the ELContext has the taglib
directive to include that particular tld. If I invoke that JSP function
from a JSP page(using EL), it works fine. However, when I try to resolve
the function programmatically as above, I get the above error.

 

 

When I checked the Tomcat source code, I noticed in
org.apache.jasper.el.ELContextImpl :

 

private final static FunctionMapper NullFunctionMapper = new
FunctionMapper() {

        public Method resolveFunction(String prefix, String localName) {

            return null;

        }

    };

 

 

And a few lines below that,

 

private FunctionMapper functionMapper = NullFunctionMapper; // immutable

 

Although there is a 

 

    public void setFunctionMapper(FunctionMapper functionMapper) {

        this.functionMapper = functionMapper;

    }

 

 

I am not sure whether that is invoked or how to have it invoked.

 

This could be the problem for me as the
ELContext.getFunctionMapper().resolveFunction(...) would return null and
I receive a message which corresponds to the Method object resolving to
null. From org.apache.el.lang.ExpressionBuilder.visit, the code
generating the exception:

 

Method m = fnMapper.resolveFunction(funcNode.getPrefix(), funcNode

                    .getLocalName());

if (m == null) {

        throw new ELException(MessageFactory.get(

               "error.fnMapper.method", funcNode.getOutputName()));

}

 

 

When I check the generated servlet for the jsp that contains the same
EL, I see:

 

static private org.apache.jasper.runtime.ProtectedFunctionMapper
_jspx_fnmap_0;

 

static {

  _jspx_fnmap_0=
org.apache.jasper.runtime.ProtectedFunctionMapper.getMapForFunction("tes
ttld:escapeJava", org.apache.commons.lang.StringEscapeUtils.class,
"escapeJava", new Class[] {java.lang.String.class});

}

 

And

 

_jspx_th_c_005fset_005f0.setValue(new
org.apache.jasper.el.JspValueExpression("/test/scratchPad.jsp(7,0)
'${testtld:escapeJava(\"Test
String\")}'",_el_expressionfactory.createValueExpression(new
org.apache.jasper.el.ELContextWrapper(_jspx_page_context.getELContext(),
_jspx_fnmap_0),"${testtld:escapeJava(\"Test
String\")}",java.lang.Object.class)).getValue(_jspx_page_context.getELCo
ntext()));

 

But if I put the following test code within the same jsp in a scriptlet,
I see the exception above(javax.el.ELException: Function
'testtld:escapeJava' not found):

 

<%

    JspApplicationContext jspAppCtx =
JspFactory.getDefaultFactory().getJspApplicationContext(pageContext.getS
ervletContext());

    ExpressionFactory exprFactory = jspAppCtx.getExpressionFactory();

    ELContext elCtx = pageContext.getELContext();

    Class[] klass = {String.class};

    String[] param = {"Test String"};

    MethodExpression methodExpr =

        exprFactory.createMethodExpression(elCtx,
"${testtld:escapeJava('Test String')}", String.class, klass);

    String result = methodExpr.invoke(elCtx, param).toString();

    out.println(result);

%>

 

I searched over the internet and did not come up with anything
related/conclusive that could point me towards a configuration or
programmatic step that I could've missed.

 

I'd appreciate it if you could give me some pointers as to what might be
the problem here and how to fix it. Also, I do not understand why the
org.apache.jasper.el package is being used for the ELContext and other
implementations instead of the org.apache.el package which has the newer
implementation.

 

Thanks,

Najeed.

 

 

 

 

 

Reply via email to