docs: @Override
  	public void add(ITraceEvent event) {
  
  		if (this.m_requestStartFilter == null)
  			throw new RuntimeException("Must indicate which event marks the 'start' of each 'request'.  Use DefaultRequestSeparator.setRequestStartFilter(val).");
  		if (this.m_requestCompletionFilter == null)
  			throw new RuntimeException("Must indicate which event marks the 'end' of each 'request'.  Use DefaultRequestSeparator.setRequestCompletionFilter(val).");
  		
  		eventCounter.incrementAndGet();
  		
  		IRequest emptyRequest = DefaultFactory.getFactory().getRequest();
  		emptyRequest.setThreadId(event.getThreadId());
  		//If the request isn't there, add it.  If it is there, retrieve it.
  		IRequest storedRequest = (IRequest) getInFlightRequests().putIfAbsent(event.getThreadId(), emptyRequest);
  		if (storedRequest==null) { //This will happen for the first traced event of each request.
  			//System.out.println("##!# Starting new request.  Event is [" + event.getEventType() + "]");
  			storedRequest = emptyRequest;
  		}
  		boolean	ynStartEvent = this.m_requestStartFilter.matches(event); 
  		if (ynStartEvent)
  			storedRequest.setInitialized(true);
  		
  		if (m_requestCompletionFilter.matches(event)) {
  			//Now that the completion event has fired, we're removing it from the "in flight" list.
  			//Also note that the completion event itself does not get propagated.
  			IRequest completed = getInFlightRequests().remove(event.getThreadId());
  			if (completed !=null && completed.isInitialized()  )
  				fireRequestCompletion(completed);
  		} else {
  			
  			if (storedRequest.isInitialized() && !ynStartEvent)
  				storedRequest.getEvents().add(event);
  		}
  			
  	}