package org.apereo.cas.util; import org.apache.commons.lang3.StringUtils; import org.apereo.cas.ticket.UniqueTicketIdGenerator; import org.apereo.cas.util.gen.DefaultLongNumericGenerator; import org.apereo.cas.util.gen.DefaultRandomStringGenerator; import org.apereo.cas.util.gen.NumericGenerator; import org.apereo.cas.util.gen.RandomStringGenerator; /** * Default implementation of {@link UniqueTicketIdGenerator}. Implementation * utilizes a DefaultLongNumericGeneraor and a DefaultRandomStringGenerator to * construct the ticket id. * <p> * Tickets are of the form [PREFIX]-[SEQUENCE NUMBER]-[RANDOM STRING]-[SUFFIX] * </p> * * @author Scott Battaglia * @since 3.0.0 */ public class DefaultUniqueTicketIdGenerator implements UniqueTicketIdGenerator { /** * The numeric generator to generate the static part of the id. */ private NumericGenerator numericGenerator; /** * The RandomStringGenerator to generate the secure random part of the id. */ private RandomStringGenerator randomStringGenerator; /** * Optional suffix to ensure uniqueness across JVMs by specifying unique * values. */ private String suffix; private int initialCapacity; /** * Creates an instance of DefaultUniqueTicketIdGenerator with default values * including a {@link DefaultLongNumericGenerator} with a starting value of * 1. */ public DefaultUniqueTicketIdGenerator() { this(DefaultRandomStringGenerator.DEFAULT_MAX_RANDOM_LENGTH); } /** * Creates an instance of DefaultUniqueTicketIdGenerator with a specified * maximum length for the random portion. * * @param maxLength the maximum length of the random string used to generate * the id. */ public DefaultUniqueTicketIdGenerator(final int maxLength) { this(maxLength, null); } /** * Creates an instance of DefaultUniqueTicketIdGenerator with a specified * maximum length for the random portion. * * @param maxLength the maximum length of the random string used to generate * the id. * @param suffix the value to append at the end of the unique id to ensure * uniqueness across JVMs. */ public DefaultUniqueTicketIdGenerator(final int maxLength, final String suffix) { setMaxLength(maxLength); setSuffix(suffix); } /** * Creates an instance of DefaultUniqueTicketIdGenerator with a specified * maximum length for the random portion. * * @param numericGenerator the numeric generator * @param randomStringGenerator the random string generator * @param suffix the value to append at the end of the unique id to ensure * uniqueness across JVMs. * @since 4.1.0 */ public DefaultUniqueTicketIdGenerator(final NumericGenerator numericGenerator, final RandomStringGenerator randomStringGenerator, final String suffix) { this.randomStringGenerator = randomStringGenerator; this.numericGenerator = numericGenerator; setSuffix(suffix); } @Override public String getNewTicketId(final String prefix) { final String number = this.numericGenerator.getNextNumberAsString(); final int capacity = prefix.length() + initialCapacity + number.length(); return new StringBuilder(capacity) .append(prefix) .append('-') .append(number) .append('-') .append(this.randomStringGenerator.getNewString()) .append(this.suffix) .toString(); } /** * Sets suffix. * * @param suffix the suffix */ public void setSuffix(final String suffix) { this.suffix = StringUtils.isNoneBlank(suffix) ? '-' + suffix : StringUtils.EMPTY; initialCapacity = 2 + this.suffix.length() + this.randomStringGenerator.getMaxLength(); } /** * Sets max length of id generation. * * @param maxLength the max length */ public void setMaxLength(final int maxLength) { this.randomStringGenerator = new DefaultRandomStringGenerator(maxLength); this.numericGenerator = new DefaultLongNumericGenerator(1); } }