/** * Get value for specified key. If not in cache, will call subclass's fetch method and load into * cache. * * @param key The key. * @return The associated value. */ public VALUE get(KEY key) { return isCached(key) ? map.get(key).getObject() : internalGet(key); }
/** * Refresh the cache. Any existing entries in the cache will be re-fetched after it is cleared. */ public void refresh() { synchronized (map) { Set<KEY> contents = new HashSet<>(map.keySet()); clear(); for (KEY key : contents) { internalGet(key); } } }
@Override public boolean isCached(String key) { key = normalizeKey(key); return key != null && super.isCached(key); }
@Override public PageDefinition get(String key) { String nkey = normalizeKey(key); return nkey == null ? fetch(key) : super.get(nkey); }
/** * Internal, thread-safe method for loading result into cache. * * @param key The key. * @return The associated value. */ private VALUE internalGet(KEY key) { CachedObject<VALUE> cachedObject; boolean needsFetch; synchronized (map) { needsFetch = !map.containsKey(key); if (needsFetch) { cachedObject = new CachedObject<VALUE>(); map.put(key, cachedObject); } else { cachedObject = map.get(key); } } if (needsFetch) { try { cachedObject.setObject(fetch(key)); } catch (Throwable e) { RuntimeException e2 = MiscUtil.toUnchecked(e); cachedObject.setException(e2); throw e2; } } return cachedObject.getObject(); }