synchronized ItemCheckoutStatus newCheckout(CheckoutType checkoutType, String user, int version,
			String projectPath) throws IOException {
		validate();
		if (checkoutType == null) {
			throw new IllegalArgumentException("checkoutType must be specified");
		}
		ItemCheckoutStatus[] coList = getAllCheckouts();
		if (coList.length != 0) {
			if (checkoutType != CheckoutType.NORMAL) {
				return null;
			}
			if (coList[0].getCheckoutType() == CheckoutType.TRANSIENT) {
				throw new ExclusiveCheckoutException(
					"File temporarily checked out exclusively by: " + coList[0].getUser());
			}
			if (coList[0].getCheckoutType() == CheckoutType.EXCLUSIVE) {
				throw new ExclusiveCheckoutException(
					"File checked out exclusively to another project by: " + coList[0].getUser());
			}
		}
		ItemCheckoutStatus coStatus = new ItemCheckoutStatus(nextCheckoutId++, checkoutType, user,
			version, (new Date()).getTime(), projectPath);
		checkouts.put(coStatus.getCheckoutId(), coStatus);
		if (checkoutType != CheckoutType.TRANSIENT) {
			writeCheckoutsFile();
		}
		item.log("checkout (" + coStatus.getCheckoutId() + ") granted", user);
		return coStatus;
	}
Requests a new checkout for the associated item.

@param checkoutType type of checkout
@param user name of user requesting checkout
@param version item version to be checked-out
@return checkout data or null if exclusive checkout denied due to
        existing checkouts.
@throws IOException if checkout fails
Ghidra/Framework/FileSystem/src/main/java/ghidra/framework/store/local/CheckoutManager.java