From aaecd8f2a36d2c0d780b42425aa57725fe708551 Mon Sep 17 00:00:00 2001
From: James Moger <james.moger@gitblit.com>
Date: Thu, 10 Apr 2014 18:58:08 -0400
Subject: [PATCH] Move cache to IKeyManager and implement isStale() in FileKeyManager
---
src/main/java/com/gitblit/transport/ssh/IKeyManager.java | 65 +++++++++++++++++++++++++-------
1 files changed, 51 insertions(+), 14 deletions(-)
diff --git a/src/main/java/com/gitblit/transport/ssh/IKeyManager.java b/src/main/java/com/gitblit/transport/ssh/IKeyManager.java
index cb32a02..12fce3d 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 {
+public abstract class IKeyManager {
- IKeyManager start();
-
- boolean isReady();
-
- IKeyManager stop();
-
- List<PublicKey> getKeys(String username);
-
- boolean addKey(String username, String data);
-
- boolean removeKey(String username, String data);
+ protected final Logger log = LoggerFactory.getLogger(getClass());
- boolean removeAllKeys(String username);
+ 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);
}
--
Gitblit v1.9.1