public Object cache()

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;
        }
    }