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