diff options
author | James Moger <james.moger@gitblit.com> | 2014-03-14 14:53:26 -0400 |
---|---|---|
committer | James Moger <james.moger@gitblit.com> | 2014-04-10 18:58:08 -0400 |
commit | aaecd8f2a36d2c0d780b42425aa57725fe708551 (patch) | |
tree | 4803427a761a46290199295686df95d0501a94a7 /src/main/java/com/gitblit/transport/ssh/IKeyManager.java | |
parent | 22957a70fb7ba8a38564d6b6be15c661da0c3a20 (diff) | |
download | gitblit-aaecd8f2a36d2c0d780b42425aa57725fe708551.tar.gz gitblit-aaecd8f2a36d2c0d780b42425aa57725fe708551.zip |
Move cache to IKeyManager and implement isStale() in FileKeyManager
Diffstat (limited to 'src/main/java/com/gitblit/transport/ssh/IKeyManager.java')
-rw-r--r-- | src/main/java/com/gitblit/transport/ssh/IKeyManager.java | 69 |
1 files changed, 53 insertions, 16 deletions
diff --git a/src/main/java/com/gitblit/transport/ssh/IKeyManager.java b/src/main/java/com/gitblit/transport/ssh/IKeyManager.java index cb32a020..12fce3df 100644 --- a/src/main/java/com/gitblit/transport/ssh/IKeyManager.java +++ b/src/main/java/com/gitblit/transport/ssh/IKeyManager.java @@ -16,26 +16,63 @@ package com.gitblit.transport.ssh; import java.security.PublicKey; +import java.text.MessageFormat; import java.util.List; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.TimeUnit; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.google.common.cache.CacheBuilder; +import com.google.common.cache.CacheLoader; +import com.google.common.cache.LoadingCache; /** - * + * * @author James Moger * */ -public interface IKeyManager { - - IKeyManager start(); - - boolean isReady(); - - IKeyManager stop(); - - List<PublicKey> getKeys(String username); - - boolean addKey(String username, String data); - - boolean removeKey(String username, String data); - - boolean removeAllKeys(String username); +public abstract class IKeyManager { + + protected final Logger log = LoggerFactory.getLogger(getClass()); + + protected final LoadingCache<String, List<PublicKey>> keyCache = CacheBuilder + .newBuilder(). + expireAfterAccess(15, TimeUnit.MINUTES). + maximumSize(100) + .build(new CacheLoader<String, List<PublicKey>>() { + @Override + public List<PublicKey> load(String username) { + return getKeysImpl(username); + } + }); + + public abstract IKeyManager start(); + + public abstract boolean isReady(); + + public abstract IKeyManager stop(); + + public final List<PublicKey> getKeys(String username) { + try { + if (isStale(username)) { + keyCache.invalidate(username); + } + return keyCache.get(username); + } catch (ExecutionException e) { + log.error(MessageFormat.format("failed to retrieve keys for {0}", username), e); + } + return null; + } + + protected abstract boolean isStale(String username); + + protected abstract List<PublicKey> getKeysImpl(String username); + + public abstract boolean addKey(String username, String data); + + public abstract boolean removeKey(String username, String data); + + public abstract boolean removeAllKeys(String username); } |