public boolean addFile(FSRL fsrl, TaskMonitor taskMonitor)
			throws IOException, CancelledException {

		fsrl = fsService.getFullyQualifiedFSRL(fsrl, taskMonitor);
		if (userAddedFSRLs.contains(fsrl)) {
			throw new IOException("Batch already contains file " + fsrl);
		}

		currentUASI = new UserAddedSourceInfo(fsrl);
		userAddedSources.add(currentUASI);
		userAddedFSRLs.add(currentUASI.getFSRL());

		int startCount = getTotalCount();
		boolean result = doAddFile(fsrl, taskMonitor);
		int endCount = getTotalCount();

		currentUASI.setFileCount(endCount - startCount);

		return result;
	}
Adds a file to this batch as the direct result of a user action.
<p>
If the file is a container for other files, this method will iterate through those
child files and recursively try to add them using this method.

@param fsrl {@link FSRL} of the file to add.
@param taskMonitor {@link TaskMonitor} to watch and update with progress.
@return boolean true if something in the file produced something to import.
@throws IOException if io error when reading files.
@throws CancelledException if user cancels.
Ghidra/Features/Base/src/main/java/ghidra/plugins/importer/batch/BatchInfo.java