@Override
 public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException {
   DcFile file = folderStack.removeLast();
   if (filter.searchFolders()) {
     if (filter.matcher.matches(dir)) {
       accept(file);
     }
   }
   return FileVisitResult.CONTINUE;
 }
 @Override
 public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs)
     throws IOException {
   DcFile file = (DcFile) attrs;
   // Groups can only contain other groups. If we are searching groups, accept the group,
   // otherwise, continue
   if (file.getType() instanceof GroupType) {
     if (filter.searchGroups() && filter.matcher.matches(dir)) {
       accept(file);
     }
     return FileVisitResult.SKIP_SUBTREE;
   }
   folderStack.add(file);
   return FileVisitResult.CONTINUE;
 }
  // here we define filters, which define layout of what can be seen in 'Solution View' of MSVC
  // Basically there are two types of entities - container filters and real filters
  //   - container filter just provides a container to group together real filters
  //   - real filter can select elements from the set according to some rule, put it into XML
  //     and remove from the list
  Vector makeFilters(TreeSet files) {
    Vector rv = new Vector();
    String sbase = Util.normalize(BuildConfig.getFieldString(null, "SourceBase") + "/src/");

    ContainerFilter rt = new ContainerFilter("Runtime");
    rt.add(new DirectoryFilter("share/vm/prims", sbase));
    rt.add(new DirectoryFilter("share/vm/runtime", sbase));
    rt.add(new DirectoryFilter("share/vm/oops", sbase));
    rv.add(rt);

    ContainerFilter gc = new ContainerFilter("GC");
    gc.add(new DirectoryFilter("share/vm/memory", sbase));
    gc.add(new DirectoryFilter("share/vm/gc_interface", sbase));

    ContainerFilter gc_impl = new ContainerFilter("Implementations");
    gc_impl.add(
        new DirectoryFilter("CMS", "share/vm/gc_implementation/concurrentMarkSweep", sbase));
    gc_impl.add(
        new DirectoryFilter(
            "Parallel Scavenge", "share/vm/gc_implementation/parallelScavenge", sbase));
    gc_impl.add(new DirectoryFilter("Shared", "share/vm/gc_implementation/shared", sbase));
    // for all leftovers
    gc_impl.add(new DirectoryFilter("Misc", "share/vm/gc_implementation", sbase));

    gc.add(gc_impl);
    rv.add(gc);

    rv.add(new DirectoryFilter("C1", "share/vm/c1", sbase));

    ContainerFilter c2 = new ContainerFilter("C2");
    // c2.add(new DirectoryFilter("share/vm/adlc", sbase));
    c2.add(new DirectoryFilter("share/vm/opto", sbase));
    c2.add(new SpecificNameFilter("Generated", new String[] {"^ad_.+", "^dfa_.+", "^adGlobals.+"}));
    rv.add(c2);

    ContainerFilter comp = new ContainerFilter("Compiler Common");
    comp.add(new DirectoryFilter("share/vm/asm", sbase));
    comp.add(new DirectoryFilter("share/vm/ci", sbase));
    comp.add(new DirectoryFilter("share/vm/code", sbase));
    comp.add(new DirectoryFilter("share/vm/compiler", sbase));
    rv.add(comp);

    rv.add(new DirectoryFilter("Interpreter", "share/vm/interpreter", sbase));

    ContainerFilter misc = new ContainerFilter("Misc");
    // misc.add(new DirectoryFilter("share/vm/launch", sbase));
    misc.add(new DirectoryFilter("share/vm/libadt", sbase));
    misc.add(new DirectoryFilter("share/vm/services", sbase));
    misc.add(new DirectoryFilter("share/vm/utilities", sbase));
    rv.add(misc);

    rv.add(new DirectoryFilter("os_cpu", sbase));

    rv.add(new DirectoryFilter("cpu", sbase));

    rv.add(new DirectoryFilter("os", sbase));

    rv.add(new SpecificNameFilter("JVMTI Generated", new String[] {"^jvmti.+"}));

    rv.add(
        new SpecificNameFilter(
            "C++ Interpreter Generated", new String[] {"^bytecodeInterpreterWithChecks.+"}));

    rv.add(new SpecificNameFilter("Include DBs", new String[] {"^includeDB_.+"}));

    // this one is to catch files not caught by other filters
    // rv.add(new TypeFilter("Header Files", new String[] {"h", "hpp", "hxx", "hm", "inl", "fi",
    // "fd"}));
    rv.add(new TerminatorFilter("Source Files"));

    return rv;
  }