private Program openCachedProgram(ProgramLocator locator, Object consumer) {
		Program program = programCache.get(locator);
		if (program != null) {
			program.addConsumer(consumer);
			return program;
		}

		program = programMgr.getOpenProgram(locator);
		if (program != null) {
			program.addConsumer(consumer);
			if (!program.isChanged() || ProgramUtilities.isChangedWithUpgradeOnly(program)) {
				// Don't put modified programs into the cache unless the only change
				// corresponds to an upgrade during its instantiation.
				programCache.put(locator, program);
			}
			return program;
		}

		OpenProgramTask task = new OpenProgramTask(locator, consumer);
		new TaskLauncher(task, tool.getToolFrame());
		OpenProgramRequest result = task.getOpenProgram();
		if (result == null) {
			return null;
		}
		program = result.getProgram();
		programCache.put(locator, program);
		return program;
	}
Method called if the plugin supports this domain file.

@param data the data to be used by the running tool
@return false if data is not a Program object.
Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/progmgr/ProgramManagerPlugin.java