You are viewing a plain text version of this content. The canonical link for it is here.
Posted to adffaces-issues@incubator.apache.org by "Adam Winer (JIRA)" <ad...@incubator.apache.org> on 2006/09/15 21:49:23 UTC

[jira] Resolved: (ADFFACES-176) UIXCollection token cache - Intenal Oracle Bugfix Needs to be backported to Trinidad

     [ http://issues.apache.org/jira/browse/ADFFACES-176?page=all ]

Adam Winer resolved ADFFACES-176.
---------------------------------

    Resolution: Fixed
      Assignee: Adam Winer

Checked in the patch.  Thanks!

FYI, the bug would show itself if you had a PPR request that updated something *other* than the table, but then model state changed out from under you.  So the token cache is blown away, but the content of the table is still using IDs pointing to the old token cache.  The fix will only result in the token cache being cleared when a RowChangeEvent is delivered in part of a request.  Not perfect, but much better.

> UIXCollection token cache - Intenal Oracle Bugfix Needs to be backported to Trinidad
> ------------------------------------------------------------------------------------
>
>                 Key: ADFFACES-176
>                 URL: http://issues.apache.org/jira/browse/ADFFACES-176
>             Project: MyFaces ADF-Faces
>          Issue Type: Bug
>            Reporter: Max Starets
>         Assigned To: Adam Winer
>            Priority: Critical
>         Attachments: patch.176
>
>
> In UIXCollection.java:
> Replace the following code:
>   /**
>    * Clears all the currency strings.
>    */
>   @Override
>   public final void encodeBegin(FacesContext context) throws IOException
>   {
>     _init();
>     _getCurrencyCache().clear();
>     _flushCachedModel();
>     Object assertKey = null;
>     assert ((assertKey = getRowKey()) != null) || true;
>     __encodeBegin(context);
>     // make sure that the rendering code preserves the currency:
>     assert _assertKeyPreserved(assertKey) : "CurrencyKey not preserved";
>   }
> with:
> /**
>    * Clear the rowKey-to-currencyString cache.
>    * The cache is not cleared immediately; instead it will be cleared 
>    * when {@link #encodeBegin} is called.
>    */
>   protected void clearCurrencyStringCache()
>   {
>     _getInternalState(true)._clearTokenCache = true;
>   }
>     /**
>    * Clears all the currency strings.
>    */
>   @Override
>   public final void encodeBegin(FacesContext context) throws IOException
>   {
>     _init();
>     InternalState istate = _getInternalState(true);
>     // we must not clear the currency cache everytime. only clear
>     // it in response to specific events: bug 4773659
>     if (istate._clearTokenCache)
>     {
>       istate._clearTokenCache = false;
>       _getCurrencyCache().clear();
>     }
>     _flushCachedModel();
>     Object assertKey = null;
>     assert ((assertKey = getRowKey()) != null) || true;
>     __encodeBegin(context);
>     // make sure that the rendering code preserves the currency:
>     assert _assertKeyPreserved(assertKey) : "CurrencyKey not preserved";
>   }
> In the inner InternalState class add the following member variable:
> private transient boolean _clearTokenCache = false;
> In UIXTableTemplate.java replace the following method:
> /**
>    * Delivers an event to the appropriate listeners.
>    * @param event
>    * @throws javax.faces.event.AbortProcessingException
>    */
> 	@Override
>   public void broadcast(FacesEvent event)
>     throws AbortProcessingException
>   {
>     // the order of processing is
>     // 1. do any default action handling
>     // 2. invoke any actionListener method binding
>     // 3. call all the registered ActionListener instances.
>     // Deliver to the default RangeChangeListener
>     if (event instanceof RangeChangeEvent)
>     {
>       RangeChangeEvent rEvent = (RangeChangeEvent) event;
>       int first = rEvent.getNewStart();
>       setFirst(first);
>       //pu: Implicitly record a Change for 'first' attribute
>       addAttributeChange("first", new Integer(first));
>       
>       if ((first == 0) && (rEvent.getNewEnd() == getRowCount()))
>       {
>         setShowAll(true);
>         //pu: Implicitly record a Change for 'showAll' attribute
>         addAttributeChange("showAll", Boolean.TRUE);
>       }
>       else if (isShowAll())
>       {
>         setShowAll(false);
>         //pu: Implicitly record a Change for 'showAll' attribute
>         addAttributeChange("showAll", Boolean.FALSE);
>       }
>       __broadcast(event, getRangeChangeListener());
>     }
>     else if (event instanceof RowDisclosureEvent)
>     {
>       RowDisclosureEvent eEvent = (RowDisclosureEvent) event;
>       RowKeySet set = getDisclosedRowKeys();
>       set.addAll(eEvent.getAddedSet());
>       set.removeAll(eEvent.getRemovedSet());
>       __broadcast(event, getRowDisclosureListener());
>     }
>     else if (event instanceof SortEvent)
>     {
>       SortEvent sEvent = (SortEvent) event;
>       setSortCriteria(sEvent.getSortCriteria());
>       __broadcast(event, getSortListener());
>     }
>     else if (event instanceof SelectionEvent)
>     {
>       //pu: Implicitly record a Change for 'selectionState' attribute
>       addAttributeChange("selectedRowKeys",
>                          getSelectedRowKeys());
>       __broadcast(event, getSelectionListener());
>     }
>     super.broadcast(event);
>   }
> with:
> /**
>    * Delivers an event to the appropriate listeners.
>    * @param event
>    * @throws javax.faces.event.AbortProcessingException
>    */
> 	@Override
>   public void broadcast(FacesEvent event)
>     throws AbortProcessingException
>   {
>     // the order of processing is
>     // 1. do any default action handling
>     // 2. invoke any actionListener method binding
>     // 3. call all the registered ActionListener instances.
>     // Deliver to the default RangeChangeListener
>     if (event instanceof RangeChangeEvent)
>     {
>       RangeChangeEvent rEvent = (RangeChangeEvent) event;
>       int first = rEvent.getNewStart();
>       setFirst(first);
>       //pu: Implicitly record a Change for 'first' attribute
>       addAttributeChange("first", new Integer(first));
>       
>       if ((first == 0) && (rEvent.getNewEnd() == getRowCount()))
>       {
>         setShowAll(true);
>         //pu: Implicitly record a Change for 'showAll' attribute
>         addAttributeChange("showAll", Boolean.TRUE);
>       }
>       else if (isShowAll())
>       {
>         setShowAll(false);
>         //pu: Implicitly record a Change for 'showAll' attribute
>         addAttributeChange("showAll", Boolean.FALSE);
>       }
>       // since the range is now different we can clear the currency cache:
>       clearCurrencyStringCache();
>       __broadcast(event, getRangeChangeListener());
>     }
>     else if (event instanceof RowDisclosureEvent)
>     {
>       RowDisclosureEvent eEvent = (RowDisclosureEvent) event;
>       RowKeySet set = getDisclosedRowKeys();
>       set.addAll(eEvent.getAddedSet());
>       set.removeAll(eEvent.getRemovedSet());
>       __broadcast(event, getRowDisclosureListener());
>     }
>     else if (event instanceof SortEvent)
>     {
>       SortEvent sEvent = (SortEvent) event;
>       setSortCriteria(sEvent.getSortCriteria());
>       __broadcast(event, getSortListener());
>     }
>     else if (event instanceof SelectionEvent)
>     {
>       //pu: Implicitly record a Change for 'selectionState' attribute
>       addAttributeChange("selectedRowKeys",
>                          getSelectedRowKeys());
>       __broadcast(event, getSelectionListener());
>     }
>     super.broadcast(event);
>   }

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: http://issues.apache.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira