Have the AttributeMap call the getId/setId. The contract for the Map
returned by getAttributes is supposed to call the getter/setter method on
the component anyway, from
http://java.sun.com/javaee/5/docs/api/javax/faces/component/UIComponent.html#getAttributes%28%29
:


>    - get() - If the property is readable, call the getter method and
>    return the returned value (wrapping primitive values in their corresponding
>    wrapper classes); otherwise throw IllegalArgumentException.
>    - put() - If the property is writeable, call the setter method to set
>    the corresponding value (unwrapping primitive values in their corresponding
>    wrapper classes). If the property is not writeable, or an attempt is made 
> to
>    set a property of primitive type to null, throw
>    IllegalArgumentException.
>
>

Regards,

~ Simon


On Tue, Jan 5, 2010 at 2:50 PM, Blake Sullivan <blake.sulli...@oracle.com>wrote:

>  The reason is that we need to support AttributeMap/component accessor
> equivalence--get/set of the id attribute through the Map is supposed to work
> correctly.  The ValueExpression only exists to make this work.
>
> -- Blake Sullivan
>
> Simon Lessard said the following On 1/5/2010 10:57 AM PT:
>
> Hi,
>
> Why not simply NOT support a PropertyKey for the id attribute? I know it
> isn't consistent with the other properties, but id is a very special case
> not supporting EL anyway. In all the project I ever did, I never used
> FacesBean.getProperty(ID_PROPERTY_KEY). The only drawback I would see is if
> the component's id actually need to be read in a property getter method in a
> renderer which receive only the FacesBean instance and not the component
> itself. That would be much faster than a custom ValueExpression and the
> memory footprint would also be better.
>
> Regards,
>
> ~ Simon
>
> On Tue, Jan 5, 2010 at 1:49 PM, Matthias Wessendorf <mat...@apache.org> 
> <mat...@apache.org>wrote:
>
>
>
>  On Thu, Dec 31, 2009 at 11:12 PM, Blake Sullivan<blake.sulli...@oracle.com> 
> <blake.sulli...@oracle.com> wrote:
>
>
>  UIComponent.getId() is by far the most requested component attribute.
>
>
>   There
>
>
>  are a number of reasons for this:
> 1) The JSF RI has an issue in the JSP-JSF integration which causes
>
>
>  getId()
>
>
>  to be called n^2 times where n is the number of children a component has
>
>
>  I guess this is true for MyFaces as well, right?
>
>
>
>  2) getClientId() calls getId()
> 3) FindComponent calls getId()
> 4) The tree visiting code trades off calls to getClientId() for calls to
> getId()
>
> FacesBean optimizes attribute Map access at the expense of access
>
>
>  directly
>
>
>  through the component.  The the extent that Renderers are Components are
> accessing the attributes through the attribute Map, this is fine, however
> even the Renderers access attributes common to all UIComponents such as
>
>
>  id()
>
>
>  through the component directly.  Considering the huge number of times
>
>
>  that
>
>
>  the the id is accessed (for some renders, this was 8% of the rendering
> time), it makes sense to optimize this path.
>
> The proposal is to:
> 1) Store the id an an instance variable on the UIXComponent
> 2) Add a new capability flag to PropertyKey indicating that the property
>
>
>  is
>
>
>  actually stored elsewhere using a ValueExpression will be stored as the
> property's value in the PropertyMap.  For access through the FacesBean,
>
>
>  the
>
>
>  ValueExpression will be evaluated to get/set the actual value
> 3) For state saving the ValueExpression is used to retrieve the actual
>
>
>  value
>
>
>  and for state restoration the ValueExpression (which has been
>
>
>  rebootstrapped
>
>
>  by the UIXComponent) is used to write the value back
> 4) Instead of setting the id attribute in the FacesBean, UIXComponent
>
>
>  stores
>
>
>  it locally and sets an ValueExpression implementation into the FacesBean
> that retrieves the value from the UIXComponent
>
>
>  +1 on api/patch
>
>
>
>  API Changes:
>
> PropertyKey:
>
> add
>
>  /**
>  * Capability indicating that values for this property should be
>  * be stored and retrieved through a ValueExpression rather than on the
>  * FacesBean itself
>  */
>  static public final int CAP_VALUE_EXPRESSION_IMPLEMENTATION = 16;
>
>  /**
>  * Returns <code>true</code> if property values for this key are set and
>
>
>  get
>
>
>   * using a ValueExpression rather than storing the value in the
>
>
>  FacesBean.
>
>
>   * @return <code>true</code> if properties values for this key are
>
>
>  retrieved
>
>
>   * with a ValueExpression.
>  */
>  public boolean usesValueExpressionAsImplementation()
>
> After this change id retrieval doesn't make the 1% YourKit profiler hot
>
>
>  spot
>
>
>  cut off
>
>
>
>
>
>  --
> Matthias Wessendorf
>
> blog: http://matthiaswessendorf.wordpress.com/
> sessions: http://www.slideshare.net/mwessendorf
> twitter: http://twitter.com/mwessendorf
>
>
>

Reply via email to