private void openSourceAndDestinationPrograms(ProjectData projectData) throws IOException {
		String sourceProgramID = getSourceProgramID();
		String destinationProgramID = getDestinationProgramID();
		DomainFile sourceFile = projectData.getFileByID(sourceProgramID);
		DomainFile destinationFile = projectData.getFileByID(destinationProgramID);
		if (sourceFile == null) {
			throw new IOException("Source program is missing for this Version Tracking Session!");
		}
		if (destinationFile == null) {
			throw new IOException(
				"Destination program is missing for this Version Tracking Session!");
		}

		// Must ensure that destination program file can be updated
		VTSessionFileUtil.validateDestinationProgramFile(destinationFile, true,
			SystemUtilities.isInHeadlessMode());

		VTSessionFileUtil.validateSourceProgramFile(sourceFile, true);

		sourceProgram = openProgram(sourceFile, true);

		if (sourceProgram != null) {
			destinationProgram = openProgram(destinationFile, false);
		}

		if (sourceProgram == null || destinationProgram == null) {
			StringBuilder buffer = new StringBuilder(
				"Session not opened because one or both programs did not open.\n");
			if (sourceProgram != null) {
				sourceProgram.release(this);
				sourceProgram = null;
			}
			else {
				buffer.append("\tUnable to open source program \"" + sourceFile + "\"\n");
			}

			if (destinationProgram != null) {
				destinationProgram.release(this);
				destinationProgram = null;
			}
			else {
				buffer.append("\tUnable to open destination program \"" + destinationFile + "\"\n");
			}

			throw new IOException(buffer.toString());
		}

		associationManager.sessionInitialized();

		try {
			addSynchronizedDomainObject(destinationProgram);
		}
		catch (Exception e) {
			sourceProgram.release(this);
			sourceProgram = null;
			destinationProgram.release(this);
			destinationProgram = null;
			throw new IOException(e.getMessage());
		}
	}
Open associated source and destination program files and complete session initialization.
@param projectData active project data
@throws IOException if source or destination program not found within specified project
or an error occured while opening them (e.g., upgrade required).
Ghidra/Features/VersionTracking/src/main/java/ghidra/feature/vt/api/db/VTSessionDB.java