TestingRemovalListeners.java revision 1d580d0f6ee4f21eb309ba7b509d2c6d671c4044
1/*
2 * Copyright (C) 2011 The Guava Authors
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
5 * in compliance with the License. You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software distributed under the License
10 * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
11 * or implied. See the License for the specific language governing permissions and limitations under
12 * the License.
13 */
14
15package com.google.common.cache;
16
17import java.util.concurrent.ConcurrentLinkedQueue;
18import java.util.concurrent.atomic.AtomicInteger;
19
20/**
21 * Utility {@link RemovalListener} implementations intended for use in testing.
22 *
23 * @author mike nonemacher
24 */
25class TestingRemovalListeners {
26
27  /**
28   * Returns a new no-op {@code RemovalListener}.
29   */
30  static <K, V> NullRemovalListener<K, V> nullRemovalListener() {
31    return new NullRemovalListener<K, V>();
32  }
33
34  /**
35   * Type-inferring factory method for creating a {@link QueuingRemovalListener}.
36   */
37  static <K, V> QueuingRemovalListener<K, V> queuingRemovalListener() {
38    return new QueuingRemovalListener<K,V>();
39  }
40
41  /**
42   * Type-inferring factory method for creating a {@link CountingRemovalListener}.
43   */
44  static <K, V> CountingRemovalListener<K, V> countingRemovalListener() {
45    return new CountingRemovalListener<K,V>();
46  }
47
48  /**
49   * {@link RemovalListener} that adds all {@link RemovalNotification} objects to a queue.
50   */
51  static class QueuingRemovalListener<K, V>
52      extends ConcurrentLinkedQueue<RemovalNotification<K, V>> implements RemovalListener<K, V> {
53
54    @Override
55    public void onRemoval(RemovalNotification<K, V> notification) {
56      add(notification);
57    }
58  }
59
60  /**
61   * {@link RemovalListener} that counts each {@link RemovalNotification} it receives, and provides
62   * access to the most-recently received one.
63   */
64  static class CountingRemovalListener<K, V> implements RemovalListener<K, V> {
65    private final AtomicInteger count = new AtomicInteger();
66    private volatile RemovalNotification<K, V> lastNotification;
67
68    @Override
69    public void onRemoval(RemovalNotification<K, V> notification) {
70      count.incrementAndGet();
71      lastNotification = notification;
72    }
73
74    public int getCount() {
75      return count.get();
76    }
77
78    public K getLastEvictedKey() {
79      return lastNotification.getKey();
80    }
81
82    public V getLastEvictedValue() {
83      return lastNotification.getValue();
84    }
85
86    public RemovalNotification<K, V> getLastNotification() {
87      return lastNotification;
88    }
89  }
90
91  /**
92   * No-op {@link RemovalListener}.
93   */
94  static class NullRemovalListener<K, V> implements RemovalListener<K, V> {
95    @Override
96    public void onRemoval(RemovalNotification<K, V> notification) {}
97  }
98}
99