public List<CrawlableDataset> listDatasets(CrawlableDatasetFilter filter) throws IOException {
    if (filter == null) return this.listDatasets();

    if (!this.isCollection) throw new IllegalStateException("Dataset not a collection.");
    if (this.childrenList == null || this.childrenList.isEmpty()) return Collections.emptyList();

    List<CrawlableDataset> matchingChildren = new ArrayList<CrawlableDataset>();
    for (CrawlableDataset curCrDs : this.childrenList) {
      if (filter.accept(curCrDs)) matchingChildren.add(curCrDs);
    }
    return matchingChildren;
  }
  /** Test ... */
  public void testOne() {
    createFiles();

    // ******** DO TEST STUFF **********
    /*
     <filter logicalComp="OR">
       <!-- Only grib1 files that are older than 60 seconds -->
       <filter logicalComp="AND">
         <filter>
           <include wildcard="*.grib1"/>
         </filter>
         <filter lastModifiedLimit="60000"  />
       </filter>
       <!-- Only nc files that are less then 60 seconds old -->
       <filter logicalComp="AND">
         <filter>
           <include wildcard="*.nc"/>
         </filter>
         <filter logicalComp="NOT">
           <filter lastModifiedLimit="60000"/>
         </filter>
       </filter>
     </filter>
    */
    CrawlableDatasetFilter includeGribFilter =
        new MultiSelectorFilter(
            new MultiSelectorFilter.Selector(
                new WildcardMatchOnNameFilter("*.grib1"), true, true, false));
    CrawlableDatasetFilter lastModAtLeast4MinPastFilter = new LastModifiedLimitFilter(240000);
    CrawlableDatasetFilter oldGribFilter =
        LogicalFilterComposer.getAndFilter(includeGribFilter, lastModAtLeast4MinPastFilter);

    CrawlableDatasetFilter includeNcFilter =
        new MultiSelectorFilter(
            new MultiSelectorFilter.Selector(
                new WildcardMatchOnNameFilter("*.nc"), true, true, false));
    CrawlableDatasetFilter newNcFilter =
        LogicalFilterComposer.getAndFilter(
            includeNcFilter, LogicalFilterComposer.getNotFilter(lastModAtLeast4MinPastFilter));

    CrawlableDatasetFilter oldGribOrNewNcFilter =
        LogicalFilterComposer.getOrFilter(oldGribFilter, newNcFilter);

    CrawlableDataset tmpDirCrDs = new CrawlableDatasetFile(tmpDir);
    List crDsList = null;
    try {
      crDsList = tmpDirCrDs.listDatasets();
    } catch (IOException e) {
      assertTrue("I/O problem getting contained dataset list.", false);
      deleteFiles();
      return;
    }
    for (Iterator it = crDsList.iterator(); it.hasNext(); ) {
      CrawlableDataset curCrDs = (CrawlableDataset) it.next();
      if (oldGribOrNewNcFilter.accept(curCrDs)) {
        if (!curCrDs.getName().equals("old.grib1") && !curCrDs.getName().equals("new.nc")) {
          assertTrue("Matched wrong file <" + curCrDs.getPath() + ">.", false);
          deleteFiles();
          return;
        }
      }
    }

    // ******** DO TEST STUFF - END **********
    deleteFiles();
  }