public Object cache()

in commons-jcs3-jcache/src/main/java/org/apache/commons/jcs3/jcache/cdi/CacheResultInterceptor.java [47:108]


    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<>(
                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)
                {
                    throw Throwable.class.cast(exception);
                }
            }
        }

        try
        {
            result = ic.proceed();
            if (result != null)
            {
                cache.put(cacheKey, result);
            }

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