11d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert/* 21d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Copyright (C) 2011 The Guava Authors 31d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 41d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except 51d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * in compliance with the License. You may obtain a copy of the License at 61d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 71d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * http://www.apache.org/licenses/LICENSE-2.0 81d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 91d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Unless required by applicable law or agreed to in writing, software distributed under the License 101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express 111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * or implied. See the License for the specific language governing permissions and limitations under 121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * the License. 131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertpackage com.google.common.cache; 161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.concurrent.ConcurrentLinkedQueue; 181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.concurrent.atomic.AtomicInteger; 191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert/** 211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Utility {@link RemovalListener} implementations intended for use in testing. 221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @author mike nonemacher 241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertclass TestingRemovalListeners { 261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Returns a new no-op {@code RemovalListener}. 291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert static <K, V> NullRemovalListener<K, V> nullRemovalListener() { 311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return new NullRemovalListener<K, V>(); 321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Type-inferring factory method for creating a {@link QueuingRemovalListener}. 361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert static <K, V> QueuingRemovalListener<K, V> queuingRemovalListener() { 381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return new QueuingRemovalListener<K,V>(); 391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Type-inferring factory method for creating a {@link CountingRemovalListener}. 431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert static <K, V> CountingRemovalListener<K, V> countingRemovalListener() { 451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return new CountingRemovalListener<K,V>(); 461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * {@link RemovalListener} that adds all {@link RemovalNotification} objects to a queue. 501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert static class QueuingRemovalListener<K, V> 521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert extends ConcurrentLinkedQueue<RemovalNotification<K, V>> implements RemovalListener<K, V> { 531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override 551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void onRemoval(RemovalNotification<K, V> notification) { 561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert add(notification); 571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * {@link RemovalListener} that counts each {@link RemovalNotification} it receives, and provides 621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * access to the most-recently received one. 631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert static class CountingRemovalListener<K, V> implements RemovalListener<K, V> { 651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert private final AtomicInteger count = new AtomicInteger(); 661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert private volatile RemovalNotification<K, V> lastNotification; 671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override 691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void onRemoval(RemovalNotification<K, V> notification) { 701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert count.incrementAndGet(); 711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert lastNotification = notification; 721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public int getCount() { 751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return count.get(); 761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public K getLastEvictedKey() { 791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return lastNotification.getKey(); 801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public V getLastEvictedValue() { 831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return lastNotification.getValue(); 841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public RemovalNotification<K, V> getLastNotification() { 871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return lastNotification; 881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * No-op {@link RemovalListener}. 931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert static class NullRemovalListener<K, V> implements RemovalListener<K, V> { 951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override 961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void onRemoval(RemovalNotification<K, V> notification) {} 971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert} 99