void uninstallGroup ( WABInstaller installer ) { //call for each of them to be removed //in practice this will only mean one web container removal for the group //but we need all the removes to update the WAB states. if ( wabs != null ) { //iterating over a concurrentlinkedqueue without a lock, means we'll see everything in the list //thats present when we get the iterator. it will NOT throw concurrentmodification if the list is //modified during iteration, but also does not guarantee to reflect all external modifications List < WAB > toRemove = new ArrayList < WAB > ( ) ; for ( WAB wab : wabs ) { //remove the wab from the webcontainer, if needed. wab . terminateWAB ( ) ; wab . removeWAB ( ) ; toRemove . add ( wab ) ; } wabs . removeAll ( toRemove ) ; if ( wabs . size ( ) != 0 ) { installer . wabLifecycleDebug ( "First pass wab group uninstall detected outstanding WABs" , wabs ) ; toRemove . clear ( ) ; for ( WAB wab : wabs ) { //remove the wab from the webcontainer, if needed. wab . terminateWAB ( ) ; wab . removeWAB ( ) ; toRemove . add ( wab ) ; } wabs . removeAll ( toRemove ) ; //any left in the 2nd pass just don't get removed. if ( wabs . size ( ) != 0 ) { installer . wabLifecycleDebug ( "Second pass wab group uninstall detected outstanding WABs" , wabs ) ; } } } }
server - stop and in response to the removal of the wab feature from the server config .