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);
}