docs: private void notifyAllListeners(boolean isUpdate, String filter) {
          // Can't reuse the registered paths collection across the loop
          // because the listener notification can do processing in a new
          // thread.  Reusing the registered paths could cause a collision
          // between the listener thread with this notification processing
          // thread.
  
          // TODO: Should the notification step be separated from the listener detection step?
          //       That might create large data structures, but would prevent the listeners
          //       from being locked during a possibly extensive steps of the listeners handling
          //       their notifications.
  
          // TODO: See the comment, below.  The notification step has been separated from the
          //       listener collection step.
  
          List<QueuedNotification> notifications = null;
  
          synchronized( listenersLock ) {
              for ( Map.Entry<String, Collection<ArtifactListenerSelector>> listenersEntry : listeners.entrySet() ) {
                  
                  List<String> a_registeredPaths = new ArrayList<String>();
                  collectRegisteredPaths( listenersEntry.getKey(), a_registeredPaths );
                  if ( a_registeredPaths.isEmpty() ) {
                      continue;
                  }
  
                  ArtifactNotification registeredPaths =
                      new DefaultArtifactNotification(rootContainer, a_registeredPaths);
  
                  for ( ArtifactListenerSelector listener : listenersEntry.getValue() ) {
                      if ( notifications == null ) {
                          notifications = new ArrayList<QueuedNotification>( listenersEntry.getValue().size() );
                      }
  
                      QueuedNotification notification = new QueuedNotification(isUpdate, registeredPaths, listener, filter);
                      notifications.add(notification);
  
                      // parm1: additions, parm2: removals, parm3: updates
                      // if ( isUpdate ) {
                      //     listener.notifyEntryChange(emptyNotification, emptyNotification, registeredPaths);
                      // } else {
                      //     listener.notifyEntryChange(emptyNotification, registeredPaths, emptyNotification);
                      // }
                  }
              }
          }
  
          if ( notifications != null ) {
              for ( QueuedNotification notification : notifications ) {
                  notification.fire();
              }
          }
      }