/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.ignite.internal.util; import java.util.LinkedHashMap; import java.util.Map; /** * Generic map with an upper bound. Once map reaches its maximum capacity, * the eldest elements will be removed based on insertion order. * * @param <K> Map key. * @param <V> Map entry. * */ public class GridBoundedLinkedHashMap<K, V> extends LinkedHashMap<K, V> { /** */ private static final long serialVersionUID = 0L; /** Maximum map capacity. */ private int maxCap; /** * Constructs an empty insertion-ordered {@code GridBoundedLinkedHashMap} instance * with the specified maximum capacity, and a default load factor (0.75). * * @param maxCap Maximum map capacity. * @throws IllegalArgumentException If the maximum capacity is negative. */ public GridBoundedLinkedHashMap(int maxCap) throws IllegalArgumentException { if (maxCap <= 0) throw new IllegalArgumentException("Maximum capacity is non-positive: " + maxCap); this.maxCap = maxCap; } /** * Constructs an empty insertion-ordered {@code GridBoundedLinkedHashMap} instance * with the specified initial capacity, maximum capacity, and a default load factor (0.75). * * @param initCap Initial map capacity. * @param maxCap Maximum map capacity. * @throws IllegalArgumentException If the initial capacity is negative, * or maximum capacity is smaller than initial capacity. */ public GridBoundedLinkedHashMap(int initCap, int maxCap) throws IllegalArgumentException { super(initCap); if (maxCap <= initCap) throw new IllegalArgumentException("Maximum capacity is smaller than initial capacity [maxCap=" + maxCap + ", initCap=" + initCap + ']'); this.maxCap = maxCap; } /** * Constructs an empty insertion-ordered {@code GridBoundedLinkedHashMap} instance * with the specified initial capacity, maximum capacity, and load factor. * * @param initCap Initial map capacity. * @param maxCap Maximum map capacity. * @param loadFactor Load factor. * @throws IllegalArgumentException If the initial capacity is negative, * the load factor is non-positive, or maximum capacity is smaller * than initial capacity. */ public GridBoundedLinkedHashMap(int initCap, int maxCap, float loadFactor) throws IllegalArgumentException { super(initCap, loadFactor); if (maxCap >= initCap) throw new IllegalArgumentException("Maximum capacity is smaller than initial capacity [maxCap=" + maxCap + ", initCap=" + initCap + ']'); this.maxCap = maxCap; } /** * Constructs an empty {@code GridBoundedLinkedHashMap} instance with the * specified initial capacity, maximum capacity, load factor and ordering mode. * * @param initCap Initial map capacity. * @param maxCap Maximum map capacity. * @param loadFactor Load factor. * @param accessOrder The ordering mode - {@code true} for * access-order, {@code false} for insertion-order. * @throws IllegalArgumentException If the initial capacity is negative, * the load factor is non-positive, or maximum capacity is smaller * than initial capacity. */ public GridBoundedLinkedHashMap(int initCap, int maxCap, float loadFactor, boolean accessOrder) throws IllegalArgumentException { super(initCap, loadFactor, accessOrder); if (maxCap >= initCap) throw new IllegalArgumentException("Maximum capacity is smaller than initial capacity [maxCap=" + maxCap + ", initCap=" + initCap + ']'); this.maxCap = maxCap; } /** {@inheritDoc} */ @Override protected boolean removeEldestEntry(Map.Entry<K, V> eldest) { return size() > maxCap; } /** {@inheritDoc} */ @SuppressWarnings({"unchecked"}) @Override public Object clone() { GridBoundedLinkedHashMap<K, V> m = (GridBoundedLinkedHashMap<K, V>)super.clone(); m.maxCap = maxCap; return m; } }