@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);
		}
			
	}