/* * CDDL HEADER START * * The contents of this file are subject to the terms of the * Common Development and Distribution License, Version 1.0 only * (the "License"). You may not use this file except in compliance * with the License. * * You can obtain a copy of the license at * trunk/opends/resource/legal-notices/OpenDS.LICENSE * or https://OpenDS.dev.java.net/OpenDS.LICENSE. * See the License for the specific language governing permissions * and limitations under the License. * * When distributing Covered Code, include this CDDL HEADER in each * file and include the License file at * trunk/opends/resource/legal-notices/OpenDS.LICENSE. If applicable, * add the following below this CDDL HEADER, with the fields enclosed * by brackets "[]" replaced with your own identifying information: * Portions Copyright [yyyy] [name of copyright owner] * * CDDL HEADER END * * * Copyright 2008 Sun Microsystems, Inc. */ package org.opends.server.extensions; import java.io.Serializable; import java.util.Map; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.concurrent.ConcurrentHashMap; /** * This class represents serializable entry cache index structures * and supporting data types used for the entry cache persistence. * Structurally it should be an inner class of FileSystemEntryCache * however due to serialization constraints it has been separated. */ class FileSystemEntryCacheIndex implements Serializable { static final long serialVersionUID = 4537634108673038611L; /** * The file system entry cache instance this index belongs to. */ transient private FileSystemEntryCache fsEntryCacheInstance; /** * Backend to checksum/id map for offline state. */ public Map<String, Long> offlineState; /** * The mapping between backends and ID to DN maps. */ public Map<String, Map<Long, String>> backendMap; /** * The mapping between DNs and IDs. */ public Map<String, Long> dnMap; /** * Index constructor. * @param fsEntryCacheInstance The File System Entry Cache instance * this index is associated with. * @param accessOrder The ordering mode for the index map * {@code true} for access-order, * {@code false} for insertion-order. */ protected FileSystemEntryCacheIndex( FileSystemEntryCache fsEntryCacheInstance, boolean accessOrder) { this.fsEntryCacheInstance = fsEntryCacheInstance; offlineState = new ConcurrentHashMap<String, Long>(); backendMap = new HashMap<String, Map<Long, String>>(); dnMap = new LinkedHashMapRotator<String,Long>( 16, (float) 0.75, accessOrder); } /** * This inner class exist solely to override <CODE>removeEldestEntry()</CODE> * method of the LinkedHashMap. * * @see java.util.LinkedHashMap */ private class LinkedHashMapRotator<K,V> extends LinkedHashMap<K,V> { static final long serialVersionUID = 5271482121415968435L; /** * Linked Hash Map Rotator constructor. * @param initialCapacity The initial capacity. * @param loadFactor The load factor. * @param accessOrder The ordering mode - {@code true} for * access-order, {@code false} for * insertion-order. */ public LinkedHashMapRotator(int initialCapacity, float loadFactor, boolean accessOrder) { super(initialCapacity, loadFactor, accessOrder); } /** * This method will get called each time we add a new key/value * pair to the map. The eldest entry will be selected by the * underlying LinkedHashMap implementation based on the access * order configured and will follow either FIFO implementation * by default or LRU implementation if configured so explicitly. * @param eldest The least recently inserted entry in the map, * or if this is an access-ordered map, the least * recently accessed entry. * @return boolean {@code true} if the eldest entry should be * removed from the map; {@code false} if it * should be retained. */ @Override protected boolean removeEldestEntry(Map.Entry eldest) { return fsEntryCacheInstance.removeEldestEntry(eldest); } } }