Thanks. The patch iis atatched to the issue page.

Max

Adam Winer (JIRA) wrote:

[ http://issues.apache.org/jira/browse/ADFFACES-176?page=comments#action_12434736 ] Adam Winer commented on ADFFACES-176:
-------------------------------------

Max, can you create a patch - (svn diff) - and attach it to this issue?  That 
process is needed to get IP rights properly assigned to Apache, especially 
necessary for a bug described as an internal Oracle bugfix...

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
          Priority: Critical

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 [EMAIL PROTECTED] #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);
 }


Reply via email to