David Ostrovsky
2014-03-15 282b8fd82c46ba6874fb24c8715af103645f3406
src/main/java/com/gitblit/transport/ssh/IKeyManager.java
@@ -16,24 +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());
   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);
}