[
https://issues.jboss.org/browse/GTNWSRP-218?page=com.atlassian.jira.plugi...
]
Remy Maucherat commented on GTNWSRP-218:
----------------------------------------
Your example did not work for me, but I tested with AS 7 the following:
<jsp:useBean id="bean" scope="request"
class="org.gatein.test.ELBug" />
${!bean.a and bean.b}
It prints "false".
Really, looking at the evaluation code in the EL impl (which did not change from AS 5), I
don't understand how it would evaluate bean.b.
AstAnd reads:
public final class AstAnd extends BooleanNode {
public AstAnd(int id) {
super(id);
}
public Object getValue(EvaluationContext ctx)
throws ELException {
Object obj = children[0].getValue(ctx);
Boolean b = coerceToBoolean(obj);
if (!b.booleanValue()) {
return b;
}
obj = children[1].getValue(ctx);
b = coerceToBoolean(obj);
return b;
}
}
So if the left statement evaluates to false, it will return that without calling getValue
on the right portion of the statement. There may be relevant tests for that in the TCK as
well.
Force use of JBoss EL on AS 6
-----------------------------
Key: GTNWSRP-218
URL:
https://issues.jboss.org/browse/GTNWSRP-218
Project: GateIn WSRP
Issue Type: Sub-task
Components: Admin GUI
Affects Versions: 2.1.0-Beta01
Reporter: Chris Laprun
Assignee: Chris Laprun
Fix For: 2.1.0-Beta02
Attachments: JSFRIPortlet.war
The EL evaluation engine seems to have changed between AS 5 and AS 6 and results in
improper evaluations of expressions leading to calls being made on objects that are not
ready to respond to them.
More specifically line 77 in /jsf/consumers/consumer.xhtml:
rendered=#{!cons.refreshNeeded and cons.active and
cons.producerInfo.registrationRequired}
Basically, it doesn't seem like the EL expression: !cons.refreshNeeded and
cons.active and cons.producerInfo.registrationRequired is properly interpreted (or at the
very least, not interpreted like it was on AS 5).
When the exception which causes the portlet to fail is thrown, the state is so that the
expression should not be completely evaluated:
cons.refreshNeeded is true so !cons.refreshNeeded is false, the evaluation of the
expression should stop because the result is already known to be false before looking at
the rest of the expression (which is the Java behavior, foo && bar results in bar
never being evaluated if foo is false).
Moreover, cons.active is also false (even though it should never be evaluated).
The exception is thrown because, despite the appropriate guards (the first two
expressions !cons.refreshNeeded and cons.active), the EL engine still evaluates the last
clause when the state of the underlying objects is not ready for such an evaluation as the
root exception clearly states (java.lang.IllegalStateException: Registration status not
yet known: call refresh first!). For me, this is a bug in the EL evaluation engine. At the
very least, this is a huge change in behavior which should be documented somewhere i.e.
the fact that you cannot rely on lazy evaluation of expressions in "and" clauses
but this seems to be too big a behavioral change (which would also go against how Java
works) for it to be proper behavior.
--
This message is automatically generated by JIRA.
For more information on JIRA, see:
http://www.atlassian.com/software/jira