CometTreeMap

HashMap → CometHashMap なら、当然、TreeMap に対するものも。。。
しかし、残念ながら、コンストラクタが2個あるので、CpmetHashMapのように、
Google guice インジェクトには対応はできない。

import java.util.Calendar;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Map;
import java.util.SortedMap;
import java.util.Timer;
import java.util.TimerTask;
import java.util.TreeMap;
import java.util.Map.Entry;
/**
 * CometTreeMap.
 */

public class CometTreeMap<K,V> extends TreeMap<K,V>{
   private static final long serialVersionUID = 1L;
   private Timer timer;
   private CometMapper ticket;
   long checkTime;
   Map<String,Long> hmap;
   /**
    * コンストラクタ.
    * 自然順序付に従う
    * @param checkTime 削除する時間間隔 msec
    * @param ticket 任意の処理
    */

   public CometTreeMap(long checkTime,CometMapper ticket){
      super();
      this.ticket = ticket;
      this.hmap = new HashMap<String,Long>();
      this.timer = new Timer("CometTreeMap");
      Calendar cal = Calendar.getInstance();
      cal.add(Calendar.SECOND,1);
      cal.clear(Calendar.MILLISECOND);
      this.timer.scheduleAtFixedRate(new _Reseter(),cal.getTime(),checkTime);
   }

   /**
    * コンストラクタ.
    * @param c Comparator
    * @param checkTime 削除する時間間隔 msec
    * @param ticket 任意の処理
    */

   public CometTreeMap(Comparator<? super K> c,long checkTime,CometMapper ticket){
      super(c);
      this.ticket = ticket;
      this.timer = new Timer("CometHashMap");
      Calendar cal = Calendar.getInstance();
      cal.add(Calendar.SECOND,1);
      cal.clear(Calendar.MILLISECOND);
      this.timer.scheduleAtFixedRate(new _Reseter(),cal.getTime(),checkTime);
   }

   /*
    * @see java.util.HashMap#put(java.lang.Object, java.lang.Object)
    */

   @Override
   public V put(K key,V value){
      return this._put(key,value);
   }
   @SuppressWarnings("unchecked")
   private synchronized V _put(K key,V value){
      this.hmap.put(key.toString(),System.currentTimeMillis());
      boolean b = super.containsKey(key) ? false : true;
      V v = super.put(key,value);
      if (b) this.mapper.checkIn(key,value);
      return v;
   }

   class _Reseter extends TimerTask{
      private SortedMap<Long,String> smap;
      _Reseter(){
         this.smap = new TreeMap<Long,String>(
            new Comparator<Long>(){
               @Override
               public int compare(Long l1,Long l2){
                  return l1.compareTo(l2) >= 0 ? 1 : -1;
               }
            }
         );
      }
      /*
       * @see java.util.TimerTask#run()
       */

      @Override
      public void run(){
         if (CometTreeMap.this.hmap.size()==0) return;
         this.smap.clear();
         for(Entry<String,Long> e : CometTreeMap.this.hmap.entrySet()){
            this.smap.put(e.getValue(),e.getKey());
         }
         for(String key : this.smap.headMap(System.currentTimeMillis() - CometTreeMap.this.checkTime).values()){
            CometTreeMap.this.hmap.remove(key);
            CometTreeMap.this.remove(key);
         }
      }
   }
   public void close(){
      try{
      this.finalize();
      }catch(Throwable e){
      }finally{
         this.timer.cancel();
      }
   }
   /*
    * @see java.lang.Object#finalize()
    */

   @Override
   protected void finalize() throws Throwable{
      this.timer.cancel();
      super.finalize();
   }
}