11d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert/*
21d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Copyright (C) 2011 The Guava Authors
31d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
41d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Licensed under the Apache License, Version 2.0 (the "License");
51d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * you may not use this file except in compliance with the License.
61d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * You may obtain a copy of the License at
71d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
81d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * http://www.apache.org/licenses/LICENSE-2.0
91d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Unless required by applicable law or agreed to in writing, software
111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * distributed under the License is distributed on an "AS IS" BASIS,
121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * See the License for the specific language governing permissions and
141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * limitations under the License.
151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */
161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertpackage com.google.common.cache;
181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.annotations.Beta;
201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.base.Preconditions;
211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.ForwardingObject;
221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.ImmutableMap;
231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.concurrent.Callable;
251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.concurrent.ConcurrentMap;
261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.concurrent.ExecutionException;
271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport javax.annotation.Nullable;
291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert/**
311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * A cache which forwards all its method calls to another cache. Subclasses should override one or
321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * more methods to modify the behavior of the backing cache as desired per the
331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <a href="http://en.wikipedia.org/wiki/Decorator_pattern">decorator pattern</a>.
341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @author Charles Fry
361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @since 10.0
371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */
381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert@Beta
391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertpublic abstract class ForwardingCache<K, V> extends ForwardingObject implements Cache<K, V> {
401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /** Constructor for use by subclasses. */
421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  protected ForwardingCache() {}
431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @Override
451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  protected abstract Cache<K, V> delegate();
461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * @since 11.0
491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @Override
511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @Nullable
521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public V getIfPresent(K key) {
531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return delegate().getIfPresent(key);
541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * @since 11.0
581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @Override
601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public V get(K key, Callable<? extends V> valueLoader) throws ExecutionException {
611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return delegate().get(key, valueLoader);
621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * @since 11.0
661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @Override
681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public ImmutableMap<K, V> getAllPresent(Iterable<? extends K> keys) {
691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return delegate().getAllPresent(keys);
701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * @since 11.0
741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @Override
761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void put(K key, V value) {
771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    delegate().put(key, value);
781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @Override
811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void invalidate(Object key) {
821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    delegate().invalidate(key);
831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * @since 11.0
871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @Override
891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void invalidateAll(Iterable<?> keys) {
901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    delegate().invalidateAll(keys);
911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @Override
941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void invalidateAll() {
951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    delegate().invalidateAll();
961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @Override
991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public long size() {
1001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return delegate().size();
1011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @Override
1041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public CacheStats stats() {
1051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return delegate().stats();
1061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @Override
1091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public ConcurrentMap<K, V> asMap() {
1101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return delegate().asMap();
1111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @Override
1141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void cleanUp() {
1151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    delegate().cleanUp();
1161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @Deprecated
1191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @Override
1201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public V get(K key) throws ExecutionException {
1211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return delegate().get(key);
1221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @Deprecated
1251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @Override
1261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public V getUnchecked(K key) {
1271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return delegate().getUnchecked(key);
1281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @Deprecated
1311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @Override
1321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public V apply(K key) {
1331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return delegate().apply(key);
1341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
1371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * A simplified version of {@link ForwardingCache} where subclasses can pass in an already
1381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * constructed {@link Cache} as the delegete.
1391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
1401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * @since 10.0
1411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
1421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @Beta
1431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public abstract static class SimpleForwardingCache<K, V> extends ForwardingCache<K, V> {
1441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    private final Cache<K, V> delegate;
1451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    protected SimpleForwardingCache(Cache<K, V> delegate) {
1471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      this.delegate = Preconditions.checkNotNull(delegate);
1481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
1491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override
1511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    protected final Cache<K, V> delegate() {
1521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return delegate;
1531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
1541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert}
156