code: static public Set<String> getDescendantPathNames(File dir, boolean includeDirectories) {
  		Set<String> paths = new HashSet<String>();
  		if( dir.exists() && dir.isDirectory() ) {
  			String[] names = dir.list();
  			for(String name : names){
  				File child = new File(dir,name);
  				getPathNames(child, paths, null, includeDirectories);
  			}
  		}
  		return paths;
  	}
docs: Given a directory, returns a set of strings which are the paths to all elements
  within the directory. This process recurses through all sub-directories.
  @param dir The directory to be traversed
  @param includeDirectories If set, the name of the paths to directories are included
  in the result.
  @return A set of paths to all elements in the given directory