Mega Code Archive

 
Categories / Java / Collections Data Structure
 

Cache Map

/*******************************************************************************  * Copyright (c) 2007, 2008 IBM Corporation and Others  * All rights reserved. This program and the accompanying materials  * are made available under the terms of the Eclipse Public License v1.0  * which accompanies this distribution, and is available at  * http://www.eclipse.org/legal/epl-v10.html  *  * Contributors:  *    Hisashi MIYASHITA - initial API and implementation  *    Kentarou FUKUDA - initial API and implementation  *******************************************************************************/ import java.util.Iterator; import java.util.LinkedList; import java.util.NoSuchElementException; import java.util.SortedMap; import java.util.TreeMap; /**  * Utility class for cache map.  */ public class CacheMap extends TreeMap<String, Object> {   private static final long serialVersionUID = 6681131647931821052L;   private final int maxSize;   private final int evictSize;   private final LinkedList<Object> accessList = new LinkedList<Object>();   /**    * Constructor of cache map. If the map exceed the maximum size, the    * key/value sets will be removed from map based on specified evict size.    *     * @param maxSize    *            maximum size of the map    * @param evictSize    *            number of evict object    */   public CacheMap(int maxSize, int evictSize) {     this.maxSize = maxSize;     this.evictSize = evictSize;   }   private void evict() {     Iterator<Object> it = accessList.iterator();     for (int i = 0; i < evictSize; i++) {       if (!it.hasNext())         return;       Object key = it.next();       this.remove(key);       it.remove();     }   }   private int searchAccessList(Object key) {     return accessList.indexOf(key);   }   private void accessEntry(Object key) {     int idx = searchAccessList(key);     if (idx >= 0) {       accessList.remove(idx);     }     accessList.add(key);   }   public Object put(String key, Object val) {     if (size() >= maxSize)       evict();     accessEntry(key);     return super.put(key, val);   }   public Object get(Object key) {     accessEntry(key);     return super.get(key);   }   /**    * Search a key that starts with the specified prefix from the map, and    * return the value corresponding to the key.    *     * @param prefix    *            target prefix    * @return the value whose key starts with prefix, or null if not available    */   public Object matchStartsWith(String prefix) {     SortedMap<String, Object> smap = super.tailMap(prefix);     Object okey;     try {       okey = smap.firstKey();     } catch (NoSuchElementException e) {       return null;     }     if (!(okey instanceof String))       return null;     String key = (String) okey;     // System.err.println("MSW:" + key + " / " + prefix);     if (!key.startsWith(prefix))       return null;     return super.get(key);   } }