HistoryMap.java Source code

Java tutorial

Introduction

Here is the source code for HistoryMap.java

Source

// $Id: HistoryMap.java,v 1.11 2003/09/11 12:33:06 larsga Exp $

//package net.ontopia.utils;

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;

//import org.slf4j.Logger;
//import org.slf4j.LoggerFactory;

/**
 * INTERNAL: Helper class for storing elements up to a certain amount, lower
 * most elements will be removed to ensure a fixed size of the collection.
 * 
 * @since 1.2.5
 */
public class HistoryMap<T> extends HashMap<Integer, T> {
    protected int maxEntries;
    protected boolean suppressDuplicates;
    private int counter;

    // initialization of logging facility
    // private static Logger log =
    // LoggerFactory.getLogger(HistoryMap.class.getName());

    /**
     * Default constructor which uses 20 entries as the default history size and
     * does suppress duplicates.
     */
    public HistoryMap() {
        this(20, true);
    }

    /**
     * Constructor which allows to specify number of entries to store and
     * duplicate suppression behaviour.
     * 
     * @param maxEntries
     *            Maxium number of entries to store in the history.
     * @param suppressDuplicates
     *            Should suppress duplicate entries in map.
     */
    public HistoryMap(int maxEntries, boolean suppressDuplicates) {
        super();
        this.maxEntries = maxEntries;
        this.counter = 0;
        this.suppressDuplicates = suppressDuplicates;
    }

    public int getMaxEntries() {
        return maxEntries;
    }

    public boolean doesSuppressDuplicates() {
        return suppressDuplicates;
    }

    public void add(T obj) {
        // do not add if object already exists
        if (suppressDuplicates && containsValue(obj))
            return;
        counter++;
        put(new Integer(counter), obj);
        if (size() >= maxEntries)
            try {
                remove(new Integer(counter - maxEntries));
            } catch (Exception e) {
                // log.error("Remove of entry from historymap without success."
                // +
                // e.getMessage());
            }
    }

    public void removeEntry(T obj) {
        Iterator<Integer> it = keySet().iterator();
        // log.info("A removing from history");
        while (it.hasNext()) {
            Integer key = it.next();
            T val = get(key);
            if (val.equals(obj)) {
                // log.info("removing from history " + key);
                remove(key);
                break;
            }
        } // while it
    }

    public T getEntry(int index) {
        return get(new Integer(counter - size() + index));
    }

    public Collection<T> getEntries() {
        Collection<T> result = new ArrayList<T>();
        for (int i = 1; i <= size(); i++) {
            if (getEntry(i) != null)
                result.add(getEntry(i));
        }

        return result;
    }

    public Collection getEntriesReverse() {
        Collection result = new ArrayList();
        for (int i = size(); i >= 1; i--) {
            if (getEntry(i) != null)
                result.add(getEntry(i));
        }

        return result;
    }

}