code: public final synchronized void findFiles(File directory, FileFilter filter, Map<? super File, File> fileOut,
  			FindFileListener listener) {
  		if (directory != null && filter != null) {
  			File candidate;
  			final List<File> candidates = new ArrayList<>();
  
  			final String relativePath = removePathPrefix(getBaseDirectory(), directory);
  
  			getLog().debug("Retreiving " //$NON-NLS-1$
  					+ filter.toString() + " files from " //$NON-NLS-1$
  					+ relativePath);
  
  			candidates.add(directory);
  			int nbFiles = 0;
  
  			while (!candidates.isEmpty()) {
  				candidate = candidates.remove(0);
  				if (candidate.isDirectory()) {
  					final File[] children = candidate.listFiles();
  					if (children != null) {
  						for (final File child : children) {
  							if (child != null && child.isDirectory()) {
  								candidates.add(child);
  							} else if (filter.accept(child)) {
  								fileOut.put(child, directory);
  								++nbFiles;
  							} else if (listener != null) {
  								listener.findFile(child, directory);
  							}
  						}
  					}
  				}
  			}
  
  			getLog().debug("Found " //$NON-NLS-1$
  					+ nbFiles + " file(s)"); //$NON-NLS-1$
  		}
  	}
docs: Replies a map of files which are found on the file system. The map has the
  found files as keys and the search directory as values.
  
  @param directory
  is the directory to search in.
  @param filter
  is the file selector
  @param fileOut
  is the list of files to fill.
  @param listener on the files that are not matching the file filter.