One issue however: setting some property in the component tree is not
currently _meant_ to update the backing beans. So this will also need
to be considered in the context of the lifecycle (when and how to do
it - validation?). Generally, models are only updated from an
EditableValueHolder component, and there it is only the value
attribute which changes stuff in the model.

regards,

Martin

On Wed, Apr 9, 2008 at 4:14 AM, Martin Marinschek
<[EMAIL PROTECTED]> wrote:
> I would slightly lean to this solution:
>
>
>  Solution two:
>
>  Check if EL is set and ValueExpression.isReadOnly(ELContext context)
>  returns false
>   set EL
>  else set local
>
>  and fix the el-implementation if it doesn't do what it is expected to do.
>
>  Second problem (resetting) is nothing we can do generally; we'd have
>  to do it case-by-case.
>
>  regards,
>
>  Martin
>
>
>
>  On Mon, Mar 24, 2008 at 7:04 PM, Andrew Robinson
>  <[EMAIL PROTECTED]> wrote:
>  > The bug https://issues.apache.org/jira/browse/TOMAHAWK-858 has made me
>  >  want to bring this up for discussion of the entire team. I really
>  >  don't like the solution they are posing as it will cause backward
>  >  compatibility problems and is not a full solution. This problem is not
>  >  unique to the Tomahawk tabbed pane, so I would love to see a MyFaces
>  >  wide (and maybe a JSF 2.0) fix (or approach) to the problem.
>  >
>  >  The issue is that several components use a "setXxx(...)" method to
>  >  update components. This typically is done in renderer code. Here is a
>  >  short list of components that I know are affected:
>  >
>  >  Tomahawk data scroller / data table and the first attribute
>  >  Tomahawk tabbed pane
>  >  Trinidad UIXShowDetail (I checked in a one component fix for this one,
>  >  but I am not 100% happy with it)
>  >
>  >  I am sure there are more. The problem is that if I have this code (I
>  >  am picking on the data table it is the easiest example):
>  >
>  >  <t:dataTable first="#{bean.firstRowIndex}"...>
>  >   <t:dataScroller ...>
>  >  ...
>  >
>  >  The data scroller has the code UIData.setFirst(...) when the event is 
> broadcast.
>  >
>  >  Typically all MyFaces getter code is written as:
>  >
>  >  if there is a local value
>  >   return it
>  >  if not, get the value binding / value expression
>  >   if set, evaluate it
>  >  if the value is null or there was no EL, then return a default value
>  >  if available, or else null
>  >
>  >  The setter code is:
>  >
>  >  set the local value
>  >
>  >  Even with Trinidad using a FacesBean, it still suffers from the local
>  >  vs. EL problem. What ends up being the major issue is that the local
>  >  value always takes precedence over the EL value. This is very rarely
>  >  the desired behavior. The local value is only really useful when
>  >  component binding is being used and the page author is not using EL to
>  >  set attributes.
>  >
>  >  The solution is more complex. In issue TOMAHAWK-858, someone has
>  >  proposed to use EL if it is set, but they did not examine the problem
>  >  domain. For example:
>  >
>  >  <t:dataTable first="#{bean.condition ? 0 : bean.firstRowIndex}" ...
>  >
>  >  In this crude example, perhaps the hard-coded 0 is to reset the table
>  >  to the first record on another link (please do not over analyze the
>  >  example, I know it is far from perfect). The problem with this is that
>  >  in using a conditional EL expression, this is no longer set-able! So
>  >  if the data scroller code attempts to assign 20 (the next page lets
>  >  say) to the first EL, it will throw an exception, because a
>  >  conditional statement cannot be set.
>  >
>  >  One solution to this is:
>  >  if EL is set,
>  >  try to set the EL
>  >  if that throws an exception, set the local value
>  >
>  >  This would technically work, but I hate the code. It is unpredictable
>  >  and bad for performance (exceptions are expensive and should be
>  >  avoided).
>  >
>  >  Solution two:
>  >
>  >  Check if EL is set and ValueExpression.isReadOnly(ELContext context)
>  >  returns false
>  >   set EL
>  >  else set local
>  >
>  >  Problem is that I do not think that this is always accurate.
>  >
>  >  The other problem is that once the local value is set, it cannot
>  >  always be cleared:
>  >
>  >  private Integer _first;
>  >  public int getFirst() {
>  >   if (_first != null) return _first.intValue();
>  >   ValueBinding ...
>  >  }
>  >  public int setFirst(int first) { _first = new Integer(first); }
>  >
>  >  Here, there is no way to set _first back to null. We could change the
>  >  APIs drastically of Tomahawk and Trinidad so that the generation
>  >  plugin always has to use objects and not primitives, but that would
>  >  break a lot of code and is not a nice API when null is never returned
>  >  for a getter when a default value is used.
>  >
>  >  Another option is a case-by-case fix where the property can be made
>  >  "transient". Meaning that the set method does nothing and the get
>  >  method is always used. This is a partial fix, but is ugly and requires
>  >  that the component users always update the values behind the EL
>  >  manually based on events
>  >
>  >  If EL allowed for different get & set that may work better:
>  >
>  >  <t:dataTable first="#{get: bean.condition ? 0 : bean.firstRowIndex,
>  >  set: bean.firstRowIndex}" ...
>  >
>  >  In this case the value expression would evaluate different expressions
>  >  for get vs. set. The problem here is that it is harder to write,
>  >  understand and would require an EL change that should be part of the
>  >  J2EE spec. which would be ugly.
>  >
>  >  Another option is for the user to be able to specify which values
>  >  should be local and which should set via EL, but I don't see a clean
>  >  way of doing this without making an ugly API (way to many
>  >  attribute-metadata attributes).
>  >
>  >  Before TOMAHAWK-858 is fixed, I would like to see a common approach
>  >  that we can take for all of the MyFaces projects so that it is easiest
>  >  for users to be familiar with.
>  >
>  >  Opinions, solutions?
>  >
>  >  Thanks,
>  >  Andrew
>  >
>
>
>
>  --
>
>  http://www.irian.at
>
>  Your JSF powerhouse -
>  JSF Consulting, Development and
>  Courses in English and German
>
>  Professional Support for Apache MyFaces
>



-- 

http://www.irian.at

Your JSF powerhouse -
JSF Consulting, Development and
Courses in English and German

Professional Support for Apache MyFaces

Reply via email to