Complex EL Expressions in JPDL decisions aren't being evalua
dheggie Sep 19, 2007 11:47 AMSince upgrading to 2.0.0 CR1 (from BETA1) some of the el expressions in my jpdl decisions are causing exceptions. Example:
org.jbpm.JbpmException: couldn't evaluate expression '#{simpleStateMachine.addressValid and empty simpleStateMachine.addressList}'
org.jbpm.jpdl.el.impl.JbpmExpressionEvaluator.evaluate(JbpmExpressionEvaluator.java:43)
org.jbpm.jpdl.el.impl.JbpmExpressionEvaluator.evaluate(JbpmExpressionEvaluator.java:30)
org.jbpm.graph.node.Decision.execute(Decision.java:95)
org.jbpm.graph.def.Node.enter(Node.java:318)
org.jbpm.graph.def.Transition.take(Transition.java:151)
org.jbpm.graph.def.Node.leave(Node.java:393)
org.jbpm.graph.exe.Token.signal(Token.java:194)
org.jbpm.graph.exe.Token.signal(Token.java:157)
org.jbpm.graph.exe.ProcessInstance.signal(ProcessInstance.java:282)
org.jboss.seam.pageflow.Pageflow.signal(Pageflow.java:477)
org.jboss.seam.pageflow.Pageflow.navigate(Pageflow.java:336)
org.jboss.seam.jsf.SeamNavigationHandler.handleNavigation(SeamNavigationHandler.java:40)
org.test.navigation.BackNavigationHandler.handleNavigation(BackNavigationHandler.java:30)
com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:119)
javax.faces.component.UICommand.broadcast(UICommand.java:383)
org.ajax4jsf.component.AjaxViewRoot.processEvents(AjaxViewRoot.java:186)
org.ajax4jsf.component.AjaxViewRoot.broadcastEvents(AjaxViewRoot.java:164)
org.ajax4jsf.component.AjaxViewRoot.processApplication(AjaxViewRoot.java:352)
com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:97)
com.sun.faces.lifecycle.LifecycleImpl.phase(LifecycleImpl.java:251)
com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:117)
javax.faces.webapp.FacesServlet.service(FacesServlet.java:244)
org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:307)
org.apache.myfaces.webapp.filter.ExtensionsFilter.doFilter(ExtensionsFilter.java:100)
org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:83)
org.jboss.seam.web.MultipartFilter.doFilter(MultipartFilter.java:85)
org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69)
org.jboss.seam.web.ExceptionFilter.doFilter(ExceptionFilter.java:64)
org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69)
org.jboss.seam.web.RedirectFilter.doFilter(RedirectFilter.java:44)
org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69)
org.ajax4jsf.webapp.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:141)
org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:281)
org.jboss.seam.web.Ajax4jsfFilter.doFilter(Ajax4jsfFilter.java:60)
org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69)
org.jboss.seam.web.LoggingFilter.doFilter(LoggingFilter.java:58)
org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69)
org.jboss.seam.servlet.SeamFilter.doFilter(SeamFilter.java:150)
org.apache.myfaces.webapp.filter.ExtensionsFilter.doFilter(ExtensionsFilter.java:147)
root cause
javax.el.ELException: Not a Valid Method Expression: ${simpleStateMachine.addressValid and empty simpleStateMachine.addressList}
org.jboss.el.lang.ExpressionBuilder.createMethodExpression(ExpressionBuilder.java:210)
org.jboss.el.ExpressionFactoryImpl.createMethodExpression(ExpressionFactoryImpl.java:57)
org.jboss.seam.bpm.SeamExpressionEvaluator$1.initMethodExpression(SeamExpressionEvaluator.java:54)
org.jboss.seam.bpm.SeamExpressionEvaluator$1.evaluate(SeamExpressionEvaluator.java:69)
org.jboss.seam.bpm.SeamExpressionEvaluator.evaluate(SeamExpressionEvaluator.java:35)
org.jbpm.jpdl.el.impl.JbpmExpressionEvaluator.evaluate(JbpmExpressionEvaluator.java:39)
org.jbpm.jpdl.el.impl.JbpmExpressionEvaluator.evaluate(JbpmExpressionEvaluator.java:30)
org.jbpm.graph.node.Decision.execute(Decision.java:95)
org.jbpm.graph.def.Node.enter(Node.java:318)
org.jbpm.graph.def.Transition.take(Transition.java:151)
org.jbpm.graph.def.Node.leave(Node.java:393)
org.jbpm.graph.exe.Token.signal(Token.java:194)
org.jbpm.graph.exe.Token.signal(Token.java:157)
org.jbpm.graph.exe.ProcessInstance.signal(ProcessInstance.java:282)
org.jboss.seam.pageflow.Pageflow.signal(Pageflow.java:477)
org.jboss.seam.pageflow.Pageflow.navigate(Pageflow.java:336)
org.jboss.seam.jsf.SeamNavigationHandler.handleNavigation(SeamNavigationHandler.java:40)
org.test.navigation.BackNavigationHandler.handleNavigation(BackNavigationHandler.java:30)
com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:119)
javax.faces.component.UICommand.broadcast(UICommand.java:383)
org.ajax4jsf.component.AjaxViewRoot.processEvents(AjaxViewRoot.java:186)
org.ajax4jsf.component.AjaxViewRoot.broadcastEvents(AjaxViewRoot.java:164)
org.ajax4jsf.component.AjaxViewRoot.processApplication(AjaxViewRoot.java:352)
com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:97)
com.sun.faces.lifecycle.LifecycleImpl.phase(LifecycleImpl.java:251)
com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:117)
javax.faces.webapp.FacesServlet.service(FacesServlet.java:244)
org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:307)
org.apache.myfaces.webapp.filter.ExtensionsFilter.doFilter(ExtensionsFilter.java:100)
org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:83)
org.jboss.seam.web.MultipartFilter.doFilter(MultipartFilter.java:85)
org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69)
org.jboss.seam.web.ExceptionFilter.doFilter(ExceptionFilter.java:64)
org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69)
org.jboss.seam.web.RedirectFilter.doFilter(RedirectFilter.java:44)
org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69)
org.ajax4jsf.webapp.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:141)
org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:281)
org.jboss.seam.web.Ajax4jsfFilter.doFilter(Ajax4jsfFilter.java:60)
org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69)
org.jboss.seam.web.LoggingFilter.doFilter(LoggingFilter.java:58)
org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69)
org.jboss.seam.servlet.SeamFilter.doFilter(SeamFilter.java:150)
org.apache.myfaces.webapp.filter.ExtensionsFilter.doFilter(ExtensionsFilter.java:147)
Looking into this further I noticed that the culprit is this method in the org.jboss.seam.bpm.SeamExpressionResolver
public Object evaluate(VariableResolver resolver) throws ELException
{
try
{
try
{
if (me==null && ve==null) initMethodExpression();
if (me!=null && ve==null) return me.invoke( createELContext(resolver, mapper), new Object[0] );
}
catch (javax.el.MethodNotFoundException mnfe)
{
if (ve==null) initValueExpression();
if (ve!=null) return ve.getValue( createELContext(resolver, mapper) );
}
throw new ELException();
}
catch (javax.el.ELException vele)
{
throw new ELException(vele);
}
}
The initMethodExpression() method call tries to create a method expression and fails, throwing a ELException which causes us to miss trying to create a value expression. What I think should be changed is rather than catching the javax.el.MethodNotFoundException we should just catch a javax.el.ELException so we have 2 goes at evaluating the expression.
What do people think?