/* 
 * dbXML - Native XML Database 
 * Copyright (C) 1999-2004  The dbXML Group, L.L.C. 
 * 
 * This program is free software; you can redistribute it and/or 
 * modify it under the terms of the GNU General Public License 
 * as published by the Free Software Foundation; either version 2 
 * of the License, or (at your option) any later version. 
 * 
 * This program is distributed in the hope that it will be useful, 
 * but WITHOUT ANY WARRANTY; without even the implied warranty of 
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
 * GNU General Public License for more details. 
 * 
 * You should have received a copy of the GNU General Public License 
 * along with this program; if not, write to the Free Software 
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA. 
 * 
 * $Id: SoftHashMap.java,v 1.2 2004/02/12 00:17:58 bradford Exp $ 
 */ 
 
import java.lang.ref.ReferenceQueue; 
import java.lang.ref.SoftReference; 
import java.util.AbstractMap; 
import java.util.HashMap; 
import java.util.Map; 
import java.util.Set; 
 
/** 
 * SoftHashMap 
 */ 
 
public final class SoftHashMap extends AbstractMap { 
   private Map hash = new HashMap(); 
   private final ReferenceQueue queue = new ReferenceQueue(); 
 
   public SoftHashMap() { 
   } 
 
   public Object get(Object key) { 
      Object res = null; 
      SoftReference sr = (SoftReference)hash.get(key); 
      if ( sr != null ) { 
         res = sr.get(); 
         if ( res == null ) 
            hash.remove(key); 
      } 
      return res; 
   } 
 
   private void processQueue() { 
      for ( ;; ) { 
         SoftValue sv = (SoftValue)queue.poll(); 
         if ( sv != null ) 
            hash.remove(sv.key); 
         else 
            return; 
      } 
   } 
 
   public Object put(Object key, Object value) { 
      processQueue(); 
      return hash.put(key, new SoftValue(value, key, queue)); 
   } 
 
   public Object remove(Object key) { 
      processQueue(); 
      return hash.remove(key); 
   } 
 
   public void clear() { 
      processQueue(); 
      hash.clear(); 
   } 
 
   public int size() { 
      processQueue(); 
      return hash.size(); 
   } 
 
   public Set entrySet() { 
      /** @todo Figure this out */ 
      throw new UnsupportedOperationException(); 
   } 
 
 
   /** 
    * SoftValue 
    */ 
 
   private static class SoftValue extends SoftReference { 
      private final Object key; 
 
      private SoftValue(Object k, Object key, ReferenceQueue q) { 
         super(k, q); 
         this.key = key; 
      } 
   } 
} 
 
    
  
  |