public static String generateResourceIdentifier()

in src/main/java/software/amazon/cloudformation/resource/IdentifierUtils.java [79:128]


    public static String generateResourceIdentifier(final String stackId,
                                                    final String logicalResourceId,
                                                    final String clientRequestToken,
                                                    final int maxLength) {

        if (maxLength < MIN_PHYSICAL_RESOURCE_ID_LENGTH) {
            throw new IllegalArgumentException("Cannot generate resource IDs shorter than " + MIN_PHYSICAL_RESOURCE_ID_LENGTH
                + " characters.");
        }

        String stackName = stackId;

        if (isStackArn(stackId)) {
            stackName = STACKID_SPLITTER.splitToList(stackId).get(1);
        }

        if (!isValidStackName(stackName)) {
            throw new IllegalArgumentException(String.format("%s is not a valid Stack name", stackName));
        }

        // some services don't allow leading dashes. Since stack name is first, clean
        // off any + no consecutive dashes

        final String cleanStackName = stackName.replaceFirst("^-+", "").replaceAll("-{2,}", "-");

        final boolean separate = maxLength > MIN_PREFERRED_LENGTH;
        // 13 char length is reserved for the hashed value and one
        // for each dash separator (if needed). the rest if the characters
        // will get allocated evenly between the stack and resource names

        final int freeCharacters = maxLength - 13 - (separate ? 1 : 0);
        final int[] requestedLengths = new int[2];

        requestedLengths[0] = cleanStackName.length();
        requestedLengths[1] = logicalResourceId.length();

        final int[] availableLengths = fairSplit(freeCharacters, requestedLengths);
        final int charsForStackName = availableLengths[0];
        final int charsForResrcName = availableLengths[1];

        final StringBuilder prefix = new StringBuilder();

        prefix.append(cleanStackName, 0, charsForStackName);
        if (separate) {
            prefix.append("-");
        }
        prefix.append(logicalResourceId, 0, charsForResrcName);

        return IdentifierUtils.generateResourceIdentifier(prefix.toString(), clientRequestToken, maxLength);
    }