/* * This file is part of the HyperGraphDB source distribution. This is copyrighted * software. For permitted uses, licensing options and redistribution, please see * the LicensingInformation file at the root level of the distribution. * * Copyright (c) 2005-2010 Kobrix Software, Inc. All rights reserved. */ package org.hypergraphdb.cache; import org.hypergraphdb.util.RefResolver; /** * * <p> * A simple generic, read-only caching interface. An implementation must be initialized * by providing the means to load data that is not in the cache - a * <code>RefResolver</code> instance. Therefore, there's no <code>put</code> * method, the cache makes the decision if and when to actually keep data in it. Consequently, * the cache is operational only when there is <code>RefResolver</code> currently in effect. * Otherwise, the <code>get</code> will simply throw a <code>NullPointerException</code> * when attempting to access it. * </p> * * <p> * Note, however, that there is a <code>remove</code> to explicitly remove an element from * the cache. This method should generally be called only when the item is being removed * from permanent storage as well. * </p> * * <p> * When and how element are purged from the cache is not mandated by the interface. * </p> * * <p> * <strong>NOTE</strong>: Implementation are expected to be thread-safe. * </p> * * @author Borislav Iordanov * */ public interface HGCache<Key, Value> { /** * <p>Set the <code>RefResolver</code> to be used to load data in the cache.</p> */ void setResolver(RefResolver<Key, Value> resolver); /** * <p>Return the <code>RefResolver</code> used to load data in the cache.</p> */ RefResolver<Key, Value> getResolver(); /** * <p>Retrieve an element from the cache. If the element is already in the cache, * it is simply returned. Otherwise, the <code>RefResolver</code> will be used to * obtain it automatically from permanent storage.</p> * * @param key The key of the element. * @return The element's value. */ Value get(Key key); /** * <p>Retrieve and return an element from the cache if it's already there or * return <code>null</code> otherwise. This method will not call the * <code>RefResolver</code> when the element is not found in the cache.</p> * * @param key The key of the element. * @return The element's value or <code>null</code> is it's not found in the cache. */ Value getIfLoaded(Key key); /** * <p>Return <code>true</code> if the element with the given key is currently in the * cache and <code>false</code> otherwise.</p> */ boolean isLoaded(Key key); /** * <p>Force removal of an element from the cache. This method is generally used * when the data has been (or is being) removed from the permanent storage as well. * </p> * * @param key The key of the element. */ void remove(Key key); /** * <p>Clear (i.e. force removal of) all elements from the cache.</p> */ void clear(); /** * <p>Return the number of elements currently in the cache.</p> */ int size(); }