summaryrefslogtreecommitdiffstats
path: root/src/main/java/com/gitblit/transport/ssh/IKeyManager.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/com/gitblit/transport/ssh/IKeyManager.java')
-rw-r--r--src/main/java/com/gitblit/transport/ssh/IKeyManager.java69
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);
}