package org.apereo.cas.ticket.registry; import org.apereo.cas.CipherExecutor; import org.apereo.cas.ticket.Ticket; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.util.Assert; import java.util.Collection; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; /** * Implementation of the TicketRegistry that is backed by a ConcurrentHashMap. * * @author Scott Battaglia * @since 3.0.0 */ public class DefaultTicketRegistry extends AbstractTicketRegistry { private static final Logger LOGGER = LoggerFactory.getLogger(DefaultTicketRegistry.class); /** * A HashMap to contain the tickets. */ private final Map<String, Ticket> cache; /** * Instantiates a new default ticket registry. */ public DefaultTicketRegistry() { this.cache = new ConcurrentHashMap<>(); } /** * Creates a new, empty registry with the specified initial capacity, load * factor, and concurrency level. * * @param initialCapacity - the initial capacity. The implementation * performs internal sizing to accommodate this many elements. * @param loadFactor - the load factor threshold, used to control resizing. * Resizing may be performed when the average number of elements per bin exceeds this threshold. * @param concurrencyLevel - the estimated number of concurrently updating * threads. The implementation performs internal sizing to try to * accommodate this many threads. * @param cipherExecutor the cipher executor */ public DefaultTicketRegistry(final int initialCapacity, final float loadFactor, final int concurrencyLevel, final CipherExecutor cipherExecutor) { this.cache = new ConcurrentHashMap<>(initialCapacity, loadFactor, concurrencyLevel); setCipherExecutor(cipherExecutor); } @Override public void addTicket(final Ticket ticket) { Assert.notNull(ticket, "ticket cannot be null"); final Ticket encTicket = encodeTicket(ticket); LOGGER.debug("Added ticket [{}] to registry.", ticket.getId()); this.cache.put(encTicket.getId(), encTicket); } @Override public Ticket getTicket(final String ticketId) { final String encTicketId = encodeTicketId(ticketId); if (ticketId == null) { return null; } return decodeTicket(this.cache.get(encTicketId)); } @Override public boolean deleteSingleTicket(final String ticketId) { final String encTicketId = encodeTicketId(ticketId); if (encTicketId == null) { return false; } return this.cache.remove(encTicketId) != null; } @Override public long deleteAll() { final int size = this.cache.size(); this.cache.clear(); return size; } @Override public Collection<Ticket> getTickets() { return decodeTickets(this.cache.values()); } @Override public Ticket updateTicket(final Ticket ticket) { addTicket(ticket); return ticket; } }