private ProgramUserDataDB getProgramUserData(ProgramDB program, FolderItem programItem,
			FileSystem userfs, TaskMonitor monitor)
			throws CancelledException, IOException, VersionException {
		if (userfs == null) {
			return null;
		}
		DBHandle userDbh =
			openAssociatedUserFile(programItem.getFileID(), PROGRAM_CONTENT_TYPE, userfs, monitor);
		if (userDbh != null) {
			boolean success = false;
			try {
				ProgramUserDataDB data = new ProgramUserDataDB(userDbh, program, monitor);
				success = true;
				return data;
			}
			catch (LanguageNotFoundException | IllegalStateException e) {
				// Ignore - delete to make way for new one
			}
			finally {
				if (!success) {
					userDbh.close();
					Msg.debug(this, "Removing incompatible program user data file for " +
						programItem.getPathName());
					removeUserDataFile(programItem, userfs);
				}
			}
		}
		return null; // will be created by ProgramDB when modified
	}
<code>ProgramContentHandler</code> converts between Program instantiations
and FolderItem storage.  This class also produces the appropriate Icon for 
Program files.
Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/database/ProgramContentHandler.java