code: private void copyRecursive(File source, File destination, FileFilter filter) {
  
      if (source.isDirectory()) {
        boolean okay = destination.mkdir();
        if (!okay) {
          throw new FileCreationFailedException(destination.getAbsolutePath(), true);
        }
        File[] children;
        if (filter == null) {
          children = source.listFiles();
        } else {
          children = source.listFiles(filter);
        }
        for (File file : children) {
          copyRecursive(file, new File(destination, file.getName()), filter);
        }
      } else {
        copyFile(source, destination);
      }
    }
docs: This method copies the file or directory given by {@code source} into the given {@code destination}. <br>
  <b>ATTENTION:</b><br>
  In order to allow giving the copy of {@code source} a new {@link File#getName() name}, the {@code destination} has
  to point to the final place where the copy should appear rather than the directory where the copy will be located
  in. <br>
  <br>
  E.g. the following code copies the folder "foo" located in "/usr/local" recursively to the directory "/tmp". The
  copy will have the same name "foo".
  
  <pre>
  {@link File} source = new {@link File}("/usr/local/foo");
  {@link File} destination = new {@link File}("/tmp", source.getName()); // file: "/tmp/foo"
  {@link FileUtilImpl}.copyRecursive(source, destination, true);
  </pre>
  
  @param source is the file or directory to copy.
  @param destination is the final place where the copy should appear.
  @param filter is a {@link FileFilter} that {@link FileFilter#accept(File) decides} which files should be copied.
  Only {@link FileFilter#accept(File) accepted} files and directories are copied, others will be ignored.