private static Set<String> listAllFiles(Collection<String> paths) {
		Set<String> set = new TreeSet<String>();
		for (String path : paths) {
			File file = new File(path);
			if (!file.exists()) {
				log.warn("File or directory does not exist: " + path);
				continue;
			}

			if (!file.canRead()) {
				log.warn("Cannot read file or directory: " + path);
				continue;
			}

			if (file.isDirectory()) {
				List<String> subPaths = new ArrayList<String>();
				for (File f : file.listFiles())
					subPaths.add(f.getAbsolutePath());
				set.addAll(listAllFiles(subPaths));
				continue;
			}

			if (!file.isFile()) {
				log.warn("Neither file nor directory: " + path);
				continue;
			}

			if (file.getName().endsWith(".fasta") || file.getName().endsWith(".fa")) {
				set.add(file.getAbsolutePath());
			}
		}
		return set;
	}