Allow overriding the config key used to configure a cache
This will allow us to tie the size of one cache to match the size of another cache. Change-Id: I6e2fa78db8aec209fdc71ace74c28778c8192675
This commit is contained in:
		@@ -37,8 +37,30 @@ public interface CacheBinding<K, V> {
 | 
				
			|||||||
  /** Algorithm to weigh an object with a method other than the unit weight 1. */
 | 
					  /** Algorithm to weigh an object with a method other than the unit weight 1. */
 | 
				
			||||||
  CacheBinding<K, V> weigher(Class<? extends Weigher<K, V>> clazz);
 | 
					  CacheBinding<K, V> weigher(Class<? extends Weigher<K, V>> clazz);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /**
 | 
				
			||||||
 | 
					   * Set the config name to something other than the cache name.
 | 
				
			||||||
 | 
					   *
 | 
				
			||||||
 | 
					   * @see #configKey()
 | 
				
			||||||
 | 
					   */
 | 
				
			||||||
 | 
					  CacheBinding<K, V> configKey(String configKey);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /**
 | 
				
			||||||
 | 
					   * Unique name for this cache.
 | 
				
			||||||
 | 
					   *
 | 
				
			||||||
 | 
					   * <p>The name can be used in a binding annotation {@code @Named(name)} to inject the cache
 | 
				
			||||||
 | 
					   * configured with this binding.
 | 
				
			||||||
 | 
					   */
 | 
				
			||||||
  String name();
 | 
					  String name();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /**
 | 
				
			||||||
 | 
					   * Key to use when looking up configuration for this cache.
 | 
				
			||||||
 | 
					   *
 | 
				
			||||||
 | 
					   * <p>Typically, this will match the result of {@link #name()}, so that configuration is keyed by
 | 
				
			||||||
 | 
					   * the actual cache name. However, it may be changed, for example to reuse the size limits of some
 | 
				
			||||||
 | 
					   * other cache.
 | 
				
			||||||
 | 
					   */
 | 
				
			||||||
 | 
					  String configKey();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  TypeLiteral<K> keyType();
 | 
					  TypeLiteral<K> keyType();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  TypeLiteral<V> valueType();
 | 
					  TypeLiteral<V> valueType();
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -33,6 +33,7 @@ class CacheProvider<K, V> implements Provider<Cache<K, V>>, CacheBinding<K, V> {
 | 
				
			|||||||
  final String name;
 | 
					  final String name;
 | 
				
			||||||
  private final TypeLiteral<K> keyType;
 | 
					  private final TypeLiteral<K> keyType;
 | 
				
			||||||
  private final TypeLiteral<V> valType;
 | 
					  private final TypeLiteral<V> valType;
 | 
				
			||||||
 | 
					  private String configKey;
 | 
				
			||||||
  private boolean persist;
 | 
					  private boolean persist;
 | 
				
			||||||
  private long maximumWeight;
 | 
					  private long maximumWeight;
 | 
				
			||||||
  private long diskLimit;
 | 
					  private long diskLimit;
 | 
				
			||||||
@@ -109,6 +110,13 @@ class CacheProvider<K, V> implements Provider<Cache<K, V>>, CacheBinding<K, V> {
 | 
				
			|||||||
    return this;
 | 
					    return this;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  @Override
 | 
				
			||||||
 | 
					  public CacheBinding<K, V> configKey(String name) {
 | 
				
			||||||
 | 
					    Preconditions.checkState(!frozen, "binding frozen, cannot be modified");
 | 
				
			||||||
 | 
					    configKey = Preconditions.checkNotNull(name);
 | 
				
			||||||
 | 
					    return this;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  @Override
 | 
					  @Override
 | 
				
			||||||
  public String name() {
 | 
					  public String name() {
 | 
				
			||||||
    if (!Strings.isNullOrEmpty(plugin)) {
 | 
					    if (!Strings.isNullOrEmpty(plugin)) {
 | 
				
			||||||
@@ -117,6 +125,11 @@ class CacheProvider<K, V> implements Provider<Cache<K, V>>, CacheBinding<K, V> {
 | 
				
			|||||||
    return name;
 | 
					    return name;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  @Override
 | 
				
			||||||
 | 
					  public String configKey() {
 | 
				
			||||||
 | 
					    return configKey != null ? configKey : name();
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  @Override
 | 
					  @Override
 | 
				
			||||||
  public TypeLiteral<K> keyType() {
 | 
					  public TypeLiteral<K> keyType() {
 | 
				
			||||||
    return keyType;
 | 
					    return keyType;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -60,6 +60,11 @@ class H2CacheBindingProxy<K, V> implements CacheBinding<K, V> {
 | 
				
			|||||||
    return source.name();
 | 
					    return source.name();
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  @Override
 | 
				
			||||||
 | 
					  public String configKey() {
 | 
				
			||||||
 | 
					    return source.configKey();
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  @Override
 | 
					  @Override
 | 
				
			||||||
  public TypeLiteral<K> keyType() {
 | 
					  public TypeLiteral<K> keyType() {
 | 
				
			||||||
    return source.keyType();
 | 
					    return source.keyType();
 | 
				
			||||||
@@ -85,6 +90,11 @@ class H2CacheBindingProxy<K, V> implements CacheBinding<K, V> {
 | 
				
			|||||||
    return source.loader();
 | 
					    return source.loader();
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  @Override
 | 
				
			||||||
 | 
					  public CacheBinding<K, V> configKey(String configKey) {
 | 
				
			||||||
 | 
					    throw new RuntimeException(MSG_NOT_SUPPORTED);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  @Override
 | 
					  @Override
 | 
				
			||||||
  public CacheBinding<K, V> maximumWeight(long weight) {
 | 
					  public CacheBinding<K, V> maximumWeight(long weight) {
 | 
				
			||||||
    throw new RuntimeException(MSG_NOT_SUPPORTED);
 | 
					    throw new RuntimeException(MSG_NOT_SUPPORTED);
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -155,7 +155,7 @@ class H2CacheFactory implements PersistentCacheFactory, LifecycleListener {
 | 
				
			|||||||
  @SuppressWarnings({"unchecked"})
 | 
					  @SuppressWarnings({"unchecked"})
 | 
				
			||||||
  @Override
 | 
					  @Override
 | 
				
			||||||
  public <K, V> Cache<K, V> build(CacheBinding<K, V> in) {
 | 
					  public <K, V> Cache<K, V> build(CacheBinding<K, V> in) {
 | 
				
			||||||
    long limit = config.getLong("cache", in.name(), "diskLimit", in.diskLimit());
 | 
					    long limit = config.getLong("cache", in.configKey(), "diskLimit", in.diskLimit());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (cacheDir == null || limit <= 0) {
 | 
					    if (cacheDir == null || limit <= 0) {
 | 
				
			||||||
      return memCacheFactory.build(in);
 | 
					      return memCacheFactory.build(in);
 | 
				
			||||||
@@ -176,7 +176,7 @@ class H2CacheFactory implements PersistentCacheFactory, LifecycleListener {
 | 
				
			|||||||
  @SuppressWarnings("unchecked")
 | 
					  @SuppressWarnings("unchecked")
 | 
				
			||||||
  @Override
 | 
					  @Override
 | 
				
			||||||
  public <K, V> LoadingCache<K, V> build(CacheBinding<K, V> in, CacheLoader<K, V> loader) {
 | 
					  public <K, V> LoadingCache<K, V> build(CacheBinding<K, V> in, CacheLoader<K, V> loader) {
 | 
				
			||||||
    long limit = config.getLong("cache", in.name(), "diskLimit", in.diskLimit());
 | 
					    long limit = config.getLong("cache", in.configKey(), "diskLimit", in.diskLimit());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (cacheDir == null || limit <= 0) {
 | 
					    if (cacheDir == null || limit <= 0) {
 | 
				
			||||||
      return memCacheFactory.build(in, loader);
 | 
					      return memCacheFactory.build(in, loader);
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -55,7 +55,8 @@ class DefaultMemoryCacheFactory implements MemoryCacheFactory {
 | 
				
			|||||||
  private <K, V> CacheBuilder<K, V> create(CacheBinding<K, V> def) {
 | 
					  private <K, V> CacheBuilder<K, V> create(CacheBinding<K, V> def) {
 | 
				
			||||||
    CacheBuilder<K, V> builder = newCacheBuilder();
 | 
					    CacheBuilder<K, V> builder = newCacheBuilder();
 | 
				
			||||||
    builder.recordStats();
 | 
					    builder.recordStats();
 | 
				
			||||||
    builder.maximumWeight(cfg.getLong("cache", def.name(), "memoryLimit", def.maximumWeight()));
 | 
					    builder.maximumWeight(
 | 
				
			||||||
 | 
					        cfg.getLong("cache", def.configKey(), "memoryLimit", def.maximumWeight()));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    builder = builder.removalListener(forwardingRemovalListenerFactory.create(def.name()));
 | 
					    builder = builder.removalListener(forwardingRemovalListenerFactory.create(def.name()));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -66,10 +67,10 @@ class DefaultMemoryCacheFactory implements MemoryCacheFactory {
 | 
				
			|||||||
    builder.weigher(weigher);
 | 
					    builder.weigher(weigher);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    Long age = def.expireAfterWrite(TimeUnit.SECONDS);
 | 
					    Long age = def.expireAfterWrite(TimeUnit.SECONDS);
 | 
				
			||||||
    if (has(def.name(), "maxAge")) {
 | 
					    if (has(def.configKey(), "maxAge")) {
 | 
				
			||||||
      builder.expireAfterWrite(
 | 
					      builder.expireAfterWrite(
 | 
				
			||||||
          ConfigUtil.getTimeUnit(
 | 
					          ConfigUtil.getTimeUnit(
 | 
				
			||||||
              cfg, "cache", def.name(), "maxAge", age != null ? age : 0, TimeUnit.SECONDS),
 | 
					              cfg, "cache", def.configKey(), "maxAge", age != null ? age : 0, TimeUnit.SECONDS),
 | 
				
			||||||
          TimeUnit.SECONDS);
 | 
					          TimeUnit.SECONDS);
 | 
				
			||||||
    } else if (age != null) {
 | 
					    } else if (age != null) {
 | 
				
			||||||
      builder.expireAfterWrite(age, TimeUnit.SECONDS);
 | 
					      builder.expireAfterWrite(age, TimeUnit.SECONDS);
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user