in src/main/java/org/apache/geronimo/jcache/simple/cdi/CacheResultInterceptor.java [45:111]
public Object cache(final InvocationContext ic) throws Throwable {
final CDIJCacheHelper.MethodMeta methodMeta = helper.findMeta(ic);
final String cacheName = methodMeta.getCacheResultCacheName();
final CacheResult cacheResult = methodMeta.getCacheResult();
final CacheKeyInvocationContext<CacheResult> context = new CacheKeyInvocationContextImpl<CacheResult>(ic, cacheResult,
cacheName, methodMeta);
final CacheResolverFactory cacheResolverFactory = methodMeta.getCacheResultResolverFactory();
final CacheResolver cacheResolver = cacheResolverFactory.getCacheResolver(context);
final Cache<Object, Object> cache = cacheResolver.resolveCache(context);
final GeneratedCacheKey cacheKey = methodMeta.getCacheResultKeyGenerator().generateCacheKey(context);
Cache<Object, Object> exceptionCache = null; // lazily created
Object result;
if (!cacheResult.skipGet()) {
result = cache.get(cacheKey);
if (result != null) {
return result;
}
if (!cacheResult.exceptionCacheName().isEmpty()) {
exceptionCache = cacheResolverFactory.getExceptionCacheResolver(context).resolveCache(context);
final Object exception = exceptionCache.get(cacheKey);
if (exception != null) {
if (methodMeta.isCompletionStage()) {
return exception;
}
throw Throwable.class.cast(exception);
}
}
}
try {
result = ic.proceed();
if (result != null) {
cache.put(cacheKey, result);
if (CompletionStage.class.isInstance(result)) {
final CompletionStage<?> completionStage = CompletionStage.class.cast(result);
completionStage.exceptionally(t -> {
if (helper.isIncluded(t.getClass(), cacheResult.cachedExceptions(), cacheResult.nonCachedExceptions())) {
cacheResolverFactory.getExceptionCacheResolver(context).resolveCache(context).put(cacheKey, completionStage);
} else {
cache.remove(cacheKey);
}
if (RuntimeException.class.isInstance(t)) {
throw RuntimeException.class.cast(t);
}
throw new IllegalStateException(t);
});
}
}
return result;
} catch (final Throwable t) {
if (helper.isIncluded(t.getClass(), cacheResult.cachedExceptions(), cacheResult.nonCachedExceptions())) {
if (exceptionCache == null) {
exceptionCache = cacheResolverFactory.getExceptionCacheResolver(context).resolveCache(context);
}
exceptionCache.put(cacheKey, t);
}
throw t;
}
}