/*
* Password Management Servlets (PWM)
* http://www.pwm-project.org
*
* Copyright (c) 2006-2009 Novell, Inc.
* Copyright (c) 2009-2017 The PWM Project
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
package password.pwm.svc.cache;
import com.github.benmanes.caffeine.cache.Cache;
import com.github.benmanes.caffeine.cache.Caffeine;
import password.pwm.error.PwmUnrecoverableException;
import java.time.Instant;
class MemoryCacheStore implements CacheStore {
private final Cache<String,CacheValueWrapper> memoryStore;
private final CacheStoreInfo cacheStoreInfo = new CacheStoreInfo();
MemoryCacheStore(final int maxItems) {
memoryStore = Caffeine.newBuilder()
.maximumSize(maxItems)
.build();
}
@Override
public void store(final CacheKey cacheKey, final Instant expirationDate, final String data)
throws PwmUnrecoverableException {
cacheStoreInfo.getStoreCount();
memoryStore.put(cacheKey.getHash(), new CacheValueWrapper(cacheKey, expirationDate, data));
}
@Override
public String read(final CacheKey cacheKey)
throws PwmUnrecoverableException
{
cacheStoreInfo.getReadCount();
final CacheValueWrapper valueWrapper = memoryStore.getIfPresent(cacheKey.getHash());
if (valueWrapper != null) {
if (cacheKey.equals(valueWrapper.getCacheKey())) {
if (valueWrapper.getExpirationDate().isAfter(Instant.now())) {
cacheStoreInfo.incrementHitCount();
return valueWrapper.getPayload();
}
}
}
memoryStore.invalidate(cacheKey.getHash());
cacheStoreInfo.incrementMissCount();
return null;
}
@Override
public CacheStoreInfo getCacheStoreInfo() {
return cacheStoreInfo;
}
@Override
public int itemCount()
{
return (int)memoryStore.estimatedSize();
}
}