@SuppressWarnings("unchecked")
 private static Object doGenerate(
     KeyGenerator keyGenerator, CacheKeyInvocationContext<?> context) {
   List<Object> parameters = new ArrayList<>();
   for (CacheInvocationParameter param : context.getKeyParameters()) {
     Object value = param.getValue();
     if (param.getParameterPosition() == context.getAllParameters().length - 1
         && context.getMethod().isVarArgs()) {
       parameters.addAll((List<Object>) CollectionUtils.arrayToList(value));
     } else {
       parameters.add(value);
     }
   }
   return keyGenerator.generate(
       context.getTarget(),
       context.getMethod(),
       parameters.toArray(new Object[parameters.size()]));
 }
  @AroundInvoke
  public Object cacheResult(InvocationContext invocationContext) throws Exception {
    if (log.isTraceEnabled()) {
      log.tracef("Interception of method named '%s'", invocationContext.getMethod().getName());
    }

    final CacheKeyInvocationContext<CacheResult> cacheKeyInvocationContext =
        contextFactory.getCacheKeyInvocationContext(invocationContext);
    final CacheKeyGenerator cacheKeyGenerator =
        cacheKeyInvocationContext
            .unwrap(CacheKeyInvocationContextImpl.class)
            .getCacheKeyGenerator();
    final CacheResult cacheResult = cacheKeyInvocationContext.getCacheAnnotation();
    final CacheKey cacheKey = cacheKeyGenerator.generateCacheKey(cacheKeyInvocationContext);
    final Cache<CacheKey, Object> cache = cacheResolver.resolveCache(cacheKeyInvocationContext);

    Object result = null;

    if (!cacheResult.skipGet()) {
      result = cache.get(cacheKey);
      if (log.isTraceEnabled()) {
        log.tracef(
            "Entry with value '%s' has been found in cache '%s' with key '%s'",
            result, cache.getName(), cacheKey);
      }
    }

    if (result == null) {
      result = invocationContext.proceed();
      if (result != null) {
        cache.put(cacheKey, result);
        if (log.isTraceEnabled()) {
          log.tracef(
              "Value '%s' cached in cache '%s' with key '%s'", result, cache.getName(), cacheKey);
        }
      }
    }

    return result;
  }
 @Override
 public GeneratedCacheKey generateCacheKey(CacheKeyInvocationContext<? extends Annotation> ckic) {
   return new PayaraGeneratedCacheKey(ckic.getKeyParameters());
 }