[ 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
