private URL getSharedFileURL(Properties properties, String ref) {
		if (properties == null) {
			return null;
		}
		String serverName = properties.getProperty(DefaultProjectData.SERVER_NAME);
		String repoName = properties.getProperty(DefaultProjectData.REPOSITORY_NAME);
		if (serverName == null || repoName == null) {
			return null;
		}
		int port = Integer.parseInt(properties.getProperty(DefaultProjectData.PORT_NUMBER, "0"));

		if (!ClientUtil.isConnected(serverName, port)) {
			return null; // avoid initiating a server connection. 
		}

		RepositoryAdapter repository = null;
		try {
			RepositoryServerAdapter repositoryServer =
				ClientUtil.getRepositoryServer(serverName, port);
			Set<String> repoNames = Set.of(repositoryServer.getRepositoryNames());
			if (!repoNames.contains(repoName)) {
				return null; // only consider repos which user has access to
			}
			repository = repositoryServer.getRepository(repoName);
			if (repository == null) {
				return null;
			}
			repository.connect();
			RepositoryItem item = repository.getItem(parentPath, name);
			if (item == null || !Objects.equals(item.getFileID(), fileID)) {
				return null;
			}
			ServerInfo serverInfo = repository.getServerInfo();
			return GhidraURL.makeURL(serverInfo.getServerName(), serverInfo.getPortNumber(),
				repository.getName(), item.getPathName(), ref);
		}
		catch (IOException e) {
			// ignore
		}
		finally {
			if (repository != null) {
				repository.disconnect();
			}
		}
		return null;
	}
Implements the DomainFile interface for DomainObjects that are not currently
associated with any real DomainFile. This class enforces the sharing of
objects between tools.  After the first tool gets the implementation, all
other gets() just get the same instance.  This class also keeps track of
which tools are using a its domain object.
Ghidra/Framework/Project/src/main/java/ghidra/framework/data/DomainFileProxy.java