/* * Licensed to Jasig under one or more contributor license * agreements. See the NOTICE file distributed with this work * for additional information regarding copyright ownership. * Jasig licenses this file to you under the Apache License, * Version 2.0 (the "License"); you may not use this file * except in compliance with the License. You may obtain a * copy of the License at the following location: * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ package org.jasig.cas.ticket.registry; import java.util.Collection; import net.sf.ehcache.Cache; import net.sf.ehcache.Element; import net.sf.ehcache.config.CacheConfiguration; import org.apache.commons.lang.BooleanUtils; import org.apache.commons.lang.StringUtils; import org.jasig.cas.monitor.SessionMonitor; import org.jasig.cas.ticket.ServiceTicket; import org.jasig.cas.ticket.Ticket; import org.jasig.cas.ticket.TicketGrantingTicket; import org.springframework.beans.BeanInstantiationException; import org.springframework.beans.factory.InitializingBean; import org.springframework.core.style.ToStringCreator; /** *
* Ehcache based distributed ticket registry. *
** Use distinct caches for ticket granting tickets (TGT) and service tickets (ST) for: *
true
.
* Based on the EhCache documentation,
* determining the number of service tickets and the total session count from the cache can be considered an expensive operation with the
* time taken as O(n), where n is the number of elements in the cache.
*
* Therefore, the flag provides a level of flexibility such that depending on the cache and environment settings, reporting statistics * can be set to false and disabled.
* * @see #sessionCount() * @see #serviceTicketCount() * @see SessionMonitor */ public void setSupportRegistryState(final boolean supportRegistryState) { this.supportRegistryState = supportRegistryState; } public void afterPropertiesSet() throws Exception { if (this.serviceTicketsCache == null || this.ticketGrantingTicketsCache == null) { throw new BeanInstantiationException(this.getClass(), "Both serviceTicketsCache and ticketGrantingTicketsCache are required properties."); } if (this.log.isDebugEnabled()) { CacheConfiguration config = this.serviceTicketsCache.getCacheConfiguration(); log.debug("serviceTicketsCache.maxElementsInMemory={}", config.getMaxEntriesLocalHeap()); log.debug("serviceTicketsCache.maxElementsOnDisk={}", config.getMaxElementsOnDisk()); log.debug("serviceTicketsCache.overflowToDisk={}", config.isOverflowToDisk()); log.debug("serviceTicketsCache.timeToLive={}", config.getTimeToLiveSeconds()); log.debug("serviceTicketsCache.timeToIdle={}", config.getTimeToIdleSeconds()); config = this.ticketGrantingTicketsCache.getCacheConfiguration(); log.debug("ticketGrantingTicketsCache.maxElementsInMemory={}", config.getMaxEntriesLocalHeap()); log.debug("ticketGrantingTicketsCache.maxElementsOnDisk={}", config.getMaxElementsOnDisk()); log.debug("ticketGrantingTicketsCache.overflowToDisk={}", config.isOverflowToDisk()); log.debug("ticketGrantingTicketsCache.timeToLive={}", config.getTimeToLiveSeconds()); log.debug("ticketGrantingTicketsCache.timeToIdle={}", config.getTimeToIdleSeconds()); } } /** * @see Cache#getKeysNoDuplicateCheck() */ public int sessionCount() { return BooleanUtils.toInteger(this.supportRegistryState, this.ticketGrantingTicketsCache.getKeysWithExpiryCheck().size() , super.sessionCount()); } /** * @see Cache#getKeysNoDuplicateCheck() */ public int serviceTicketCount() { return BooleanUtils.toInteger(this.supportRegistryState, this.serviceTicketsCache.getKeysWithExpiryCheck().size() , super.serviceTicketCount()); } }