code: public void filterPaths(PathImpl path, String prefix, PathCallback cb)
    {
      if (! path.exists() || ! path.canRead()) {
        return;
      }
      
      if (! isValidPrefix(path, prefix)) {
        return;
      }
      
      if (path.isDirectory()) {
        try {
          String []list = path.list();
  
          for (int i = 0; i < list.length; i++) {
            String name = list[i];
            
            if (".".equals(name) || "..".equals(name))
              continue;
            
            // jsp/187j
            PathImpl subpath = path.lookup("./" + name);
            
            filterPaths(subpath, prefix, cb);
          }
        } catch (IOException e) {
          log.log(Level.WARNING, e.toString(), e);
        }
      }
      
      if (path.exists()) {
        // server/2438 - logging on unreadable
        //  if (path.canRead()) {
        if (isMatch(path, prefix)) {
          String suffix = "";
          String fullPath = path.getPath();
  
          if (prefix.length() < fullPath.length())
            suffix = path.getPath().substring(prefix.length());
  
          path.setUserPath(_userPathPrefix + suffix);
  
          cb.onMatch(path);
        }
      }
    }
docs: Returns the set of files.