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