/** * Try to obtain the value that is cached for the given key in the given resource. * If no value is cached, the provider is used to compute it and store it afterwards. * @param resource the resource. If it is <code>null</code>, the provider will be used to compute the value. * @param key the cache key. May not be <code>null</code>. * @param provider the strategy to compute the value if necessary. May not be <code>null</code>. */ @Override public <T> T get(Object key, Resource resource, Provider<T> provider) { if(resource == null) { return provider.get(); } CacheAdapter adapter = getOrCreate(resource); T element = adapter.<T>internalGet(key); if (element==null) { element = provider.get(); cacheMiss(adapter); adapter.set(key, element); } else { cacheHit(adapter); } if (element == CacheAdapter.NULL) { return null; } return element; }
/** * Try to obtain the value that is cached for the given key in the given resource. * If no value is cached, the provider is used to compute it and store it afterwards. * @param resource the resource. If it is <code>null</code>, the provider will be used to compute the value. * @param key the cache key. May not be <code>null</code>. * @param provider the strategy to compute the value if necessary. May not be <code>null</code>. */ public <T> T get(Object key, Resource resource, Provider<T> provider) { if(resource == null) { return provider.get(); } CacheAdapter adapter = getOrCreate(resource); T element = adapter.<T>internalGet(key); if (element==null) { element = provider.get(); cacheMiss(adapter); adapter.set(key, element); } else { cacheHit(adapter); } if (element == CacheAdapter.NULL) { return null; } return element; }
protected List<IContainer> getVisibleContainers(Resource resource) { IResourceDescription description = descriptionManager.getResourceDescription(resource); IResourceDescriptions resourceDescriptions = getResourceDescriptions(resource); String cacheKey = getCacheKey("VisibleContainers", resource.getResourceSet()); OnChangeEvictingCache.CacheAdapter cache = new OnChangeEvictingCache().getOrCreate(resource); List<IContainer> result = null; result = cache.get(cacheKey); if (result == null) { result = containerManager.getVisibleContainers(description, resourceDescriptions); // SZ: I'ld like this dependency to be moved to the implementation of the // container manager, but it is not aware of a CacheAdapter if (resourceDescriptions instanceof IResourceDescription.Event.Source) { IResourceDescription.Event.Source eventSource = (Source) resourceDescriptions; DelegatingEventSource delegatingEventSource = new DelegatingEventSource(eventSource); delegatingEventSource.addListeners(Lists.newArrayList(Iterables.filter(result, IResourceDescription.Event.Listener.class))); delegatingEventSource.initialize(); cache.addCacheListener(delegatingEventSource); } cache.set(cacheKey, result); } return result; }