[ 
http://issues.apache.org/jira/browse/MYFACES-739?page=comments#action_12356369 
] 

Martin Marinschek commented on MYFACES-739:
-------------------------------------------

Why do you call getDataModel on components you have detached from the ViewRoot?

regards,

Martin

> Null Pointer Exception
> ----------------------
>
>          Key: MYFACES-739
>          URL: http://issues.apache.org/jira/browse/MYFACES-739
>      Project: MyFaces
>         Type: Bug
>   Components: Implementation
>     Versions: Nightly
>  Environment: JBoss
>     Reporter: Darren Jensen

>
> I receive a null pointer exception in the UIViewRoot._broadcastForPhase 
> private method.
> This occurs after I manually remove components from the component tree.
> I appears the error is generate because a list iterator is being used for 
> removing events from the _events list.
> After I first modifed the code place a try catch around the for statement, 
> the events processing was aborted correctly.
> I have made the following changes as a workaround:
>    private void _broadcastForPhase(PhaseId phaseId)
>     {
>         if (_events == null) return;
>         boolean abort = false;
>         int phaseIdOrdinal = phaseId.getOrdinal();
>         
> // DWJ CHANGE BEGIN
>         //iterate until until no more events to broadcast
>         //we should not use an iterator because because of the
>         //ConcurrentModificationException, so use while{} as a workaround
>         //To handle possible infinite event queueing
>         //capture the original size of the _events list and 
>         //abort after 10000 iterations
>         int currIteration = 0;
>         int abortIteration = _events.size() + 10000;
>         int itemIdx = 0;
>         while (itemIdx < _events.size()){
>               FacesEvent event = (FacesEvent) _events.get(itemIdx);
>             int ordinal = event.getPhaseId().getOrdinal();
>             if (ordinal == ANY_PHASE_ORDINAL ||
>               ordinal == phaseIdOrdinal)
>             {
>                 UIComponent source = event.getComponent();
>                 try {
>                     source.broadcast(event);
>                 } catch (AbortProcessingException e) {
>                     // abort event processing
>                     // Page 3-30 of JSF 1.1 spec: "Throw an 
> AbortProcessingException, to tell the JSF implementation
>                     //  that no further broadcast of this event, or any 
> further events, should take place."
>                     abort = true;
>                     break;
>                 }
>             }
>             _events.remove(itemIdx);  //always stay at zero position
>             //check for infinite event queueing
>             if (currIteration > abortIteration){
>               abort = true;
>               break;
>             }
>             currIteration++;
>         }
> //DWJ CHANGE END
>         if (abort) {
>             // TODO: abort processing of any event of any phase or just of 
> any event of the current phase???
>             clearEvents();
>         }
>     }

-- 
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

Reply via email to