/* * Copyright (C) 2011 The Guava Authors * * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except * in compliance with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software distributed under the License * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express * or implied. See the License for the specific language governing permissions and limitations under * the License. */ package com.google.common.cache; import com.google.common.annotations.GwtCompatible; import com.google.common.annotations.GwtIncompatible; import java.util.concurrent.ConcurrentLinkedQueue; import java.util.concurrent.atomic.AtomicInteger; /** * Utility {@link RemovalListener} implementations intended for use in testing. * * @author mike nonemacher */ @GwtCompatible(emulated = true) class TestingRemovalListeners { /** * Returns a new no-op {@code RemovalListener}. */ static <K, V> NullRemovalListener<K, V> nullRemovalListener() { return new NullRemovalListener<K, V>(); } /** * Type-inferring factory method for creating a {@link QueuingRemovalListener}. */ @GwtIncompatible("ConcurrentLinkedQueue") static <K, V> QueuingRemovalListener<K, V> queuingRemovalListener() { return new QueuingRemovalListener<K,V>(); } /** * Type-inferring factory method for creating a {@link CountingRemovalListener}. */ static <K, V> CountingRemovalListener<K, V> countingRemovalListener() { return new CountingRemovalListener<K,V>(); } /** * {@link RemovalListener} that adds all {@link RemovalNotification} objects to a queue. */ @GwtIncompatible("ConcurrentLinkedQueue") static class QueuingRemovalListener<K, V> extends ConcurrentLinkedQueue<RemovalNotification<K, V>> implements RemovalListener<K, V> { @Override public void onRemoval(RemovalNotification<K, V> notification) { add(notification); } } /** * {@link RemovalListener} that counts each {@link RemovalNotification} it receives, and provides * access to the most-recently received one. */ static class CountingRemovalListener<K, V> implements RemovalListener<K, V> { private final AtomicInteger count = new AtomicInteger(); private volatile RemovalNotification<K, V> lastNotification; @Override public void onRemoval(RemovalNotification<K, V> notification) { count.incrementAndGet(); lastNotification = notification; } public int getCount() { return count.get(); } public K getLastEvictedKey() { return lastNotification.getKey(); } public V getLastEvictedValue() { return lastNotification.getValue(); } public RemovalNotification<K, V> getLastNotification() { return lastNotification; } } /** * No-op {@link RemovalListener}. */ static class NullRemovalListener<K, V> implements RemovalListener<K, V> { @Override public void onRemoval(RemovalNotification<K, V> notification) {} } }