CacheMap.java Source code

Java tutorial

Introduction

Here is the source code for CacheMap.java

Source

/*******************************************************************************
 * 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);
    }
}