code: @Override
  	public Collection<Attack> findAttacks(final SearchCriteria criteria) {
  		Preconditions.checkNotNull(criteria, "criteria must be non-null");
  
  		final Collection<Attack> matches = new ArrayList<>();
  
  		Collection<Bson> filters = new ArrayList<>();
  
  		User user = criteria.getUser();
  		DetectionPoint detectionPoint = criteria.getDetectionPoint();
  		Collection<String> detectionSystemIds = criteria.getDetectionSystemIds();
  
  
  		if (user != null) {
  			filters.add(Filters.eq("user.username", user.getUsername()));
  		}
  
  		if (detectionSystemIds != null && detectionSystemIds.size() > 0) {
  			filters.add(Filters.in("detectionSystem.detectionSystemId", detectionSystemIds));
  		}
  
  		if(detectionPoint != null) {
  			if(detectionPoint.getCategory() != null) {
  				filters.add(Filters.eq("detectionPoint.category", detectionPoint.getCategory()));
  			}
  
  			if(detectionPoint.getLabel() != null) {
  				filters.add(Filters.eq("detectionPoint.label", detectionPoint.getLabel()));
  			}
  		}
  
  		FindIterable<Document> iterable = attacks.find(Filters.and(filters));
  
  		iterable.forEach(new Block<Document>() {
  			@Override
  			public void apply(final Document document) {
  
  				String json = document.toJson();
  				Attack attack = gson.fromJson(json, Attack.class);
  
  				if (isMatchingAttack(criteria, attack)) {
  					matches.add(attack);
  				}
  			}
  		});
  
  		return matches;
  	}
docs: {@inheritDoc}