@Override protected Object invoke( CacheOperationInvocationContext<CachePutOperation> context, CacheOperationInvoker invoker) { CachePutOperation operation = context.getOperation(); CacheKeyInvocationContext<CachePut> invocationContext = createCacheKeyInvocationContext(context); boolean earlyPut = operation.isEarlyPut(); Object value = invocationContext.getValueParameter().getValue(); if (earlyPut) { cacheValue(context, value); } try { Object result = invoker.invoke(); if (!earlyPut) { cacheValue(context, value); } return result; } catch (CacheOperationInvoker.ThrowableWrapper ex) { Throwable original = ex.getOriginal(); if (!earlyPut && operation.getExceptionTypeFilter().match(original.getClass())) { cacheValue(context, value); } throw ex; } }
@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()); }
@Test public void annotatedGet() { CacheMethodDetails<CacheResult> methodDetails = create(CacheResult.class, SampleObject.class, "annotatedGet", Long.class, String.class); CacheResultOperation operation = createDefaultOperation(methodDetails); CacheInvocationParameter[] parameters = operation.getAllParameters(2L, "foo"); Set<Annotation> firstParameterAnnotations = parameters[0].getAnnotations(); assertEquals(1, firstParameterAnnotations.size()); assertEquals(CacheKey.class, firstParameterAnnotations.iterator().next().annotationType()); Set<Annotation> secondParameterAnnotations = parameters[1].getAnnotations(); assertEquals(1, secondParameterAnnotations.size()); assertEquals(Value.class, secondParameterAnnotations.iterator().next().annotationType()); }
protected void assertCacheInvocationParameter(CacheInvocationParameter actual, Class<?> targetType, Object value, int position) { assertEquals("wrong parameter type for " + actual, targetType, actual.getRawType()); assertEquals("wrong parameter value for " + actual, value, actual.getValue()); assertEquals("wrong parameter position for " + actual, position, actual.getParameterPosition()); }
private Object toValue(final CacheInvocationParameter it) { final Object value = it.getValue(); // placeholder provider, replace it by actual values to keep the cache consistent (lang etc) if (it.getRawType() == Function.class) { return fnToKey(Function.class.cast(it.getValue())); } if (RequestContext.class.isInstance(value)) { final RequestContext ctx = RequestContext.class.cast(value); return Stream .concat(Stream.of(ofNullable(fnToKey(ctx::findPlaceholder)).orElse(EMPTY_ARRAY)), Stream.of(ctx.language())) .toArray(); } return value; }
@Override protected Object invoke( CacheOperationInvocationContext<CachePutOperation> context, CacheOperationInvoker invoker) { CachePutOperation operation = context.getOperation(); CacheKeyInvocationContext<CachePut> invocationContext = createCacheKeyInvocationContext(context); boolean earlyPut = operation.isEarlyPut(); Object value = invocationContext.getValueParameter().getValue(); if (earlyPut) { cacheValue(context, value); } try { Object result = invoker.invoke(); if (!earlyPut) { cacheValue(context, value); } return result; } catch (CacheOperationInvoker.ThrowableWrapper ex) { Throwable original = ex.getOriginal(); if (!earlyPut && operation.getExceptionTypeFilter().match(original.getClass())) { cacheValue(context, value); } throw ex; } }
@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()); }
@Override public CacheInvocationParameter getValueParameter() { if (valueParam == null) { for (final CacheInvocationParameter param : getAllParameters()) { for (final Annotation a : param.getAnnotations()) { if (a.annotationType().equals(CacheValue.class)) { valueParam = param; return valueParam; } } } } return valueParam; } }
@Override public GeneratedCacheKey generateCacheKey(CacheKeyInvocationContext<? extends Annotation> cacheKeyInvocationContext) { final CacheInvocationParameter[] keyParameters = cacheKeyInvocationContext.getKeyParameters(); final Object[] parameters = new Object[keyParameters.length]; for (int index = 0; index < keyParameters.length; index++) { parameters[index] = keyParameters[index].getValue(); } return new DefaultGeneratedCacheKey(parameters); } }
@SuppressWarnings("unchecked") private static Object doGenerate(KeyGenerator keyGenerator, CacheKeyInvocationContext<?> context) { List<Object> parameters = new ArrayList<Object>(); 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()); }
@Override public CacheInvocationParameter[] getKeyParameters() { if (keyParams == null) { final Collection<CacheInvocationParameter> keys = new LinkedList<CacheInvocationParameter>(); for (final CacheInvocationParameter param : getAllParameters()) { for (final Annotation a : param.getAnnotations()) { if (a.annotationType().equals(CacheKey.class)) { keys.add(param); } } } if (keys.isEmpty()) { keyParams = doGetAllParameters(keyIndexes); } else { keyParams = keys.toArray(new CacheInvocationParameter[keys.size()]); } } return keyParams; }
@Override public GeneratedCacheKey generateCacheKey(final CacheKeyInvocationContext<? extends Annotation> cacheKeyInvocationContext) { final CacheInvocationParameter[] keyParameters = cacheKeyInvocationContext.getKeyParameters(); final Object[] parameters = new Object[keyParameters.length]; for (int index = 0; index < keyParameters.length; index++) { parameters[index] = keyParameters[index].getValue(); } return new GeneratedCacheKeyImpl(parameters); } }
@Override public GeneratedCacheKey generateCacheKey(final CacheKeyInvocationContext<? extends Annotation> cacheKeyInvocationContext) { final CacheInvocationParameter[] keyParameters = cacheKeyInvocationContext.getKeyParameters(); final Object[] parameters = new Object[keyParameters.length]; for (int index = 0; index < keyParameters.length; index++) { parameters[index] = keyParameters[index].getValue(); } return new GeneratedCacheKeyImpl(parameters); } }
@Override public GeneratedCacheKey generateCacheKey(final CacheKeyInvocationContext<? extends Annotation> cacheKeyInvocationContext) { final CacheInvocationParameter[] keyParameters = cacheKeyInvocationContext.getKeyParameters(); final Object[] parameters = new Object[keyParameters.length]; for (int index = 0; index < keyParameters.length; index++) { parameters[index] = keyParameters[index].getValue(); } return new GeneratedCacheKeyImpl(parameters); } }
private void doCache(final CacheKeyInvocationContext<CachePut> context, final CacheDefaults defaults, final CachePut cachePut) { final Cache<Object, Object> cache = helper.cacheResolverFactoryFor(defaults, cachePut.cacheResolverFactory()).getCacheResolver(context).resolveCache(context); final GeneratedCacheKey key = helper.cacheKeyGeneratorFor(defaults, cachePut.cacheKeyGenerator()).generateCacheKey(context); cache.put(key, context.getValueParameter().getValue()); } }
@Override protected Object invoke(CacheOperationInvocationContext<CachePutOperation> context, CacheOperationInvoker invoker) { CacheKeyInvocationContext<CachePut> invocationContext = createCacheKeyInvocationContext(context); CachePutOperation operation = context.getOperation(); boolean earlyPut = operation.isEarlyPut(); Object value = invocationContext.getValueParameter().getValue(); if (earlyPut) { cacheValue(context, value); } try { Object result = invoker.invoke(); if (!earlyPut) { cacheValue(context, value); } return result; } catch (CacheOperationInvoker.ThrowableWrapper ex) { Throwable original = ex.getOriginal(); if (!earlyPut && operation.getExceptionTypeFilter().match(original.getClass())) { cacheValue(context, value); } throw ex; } }
final Object value = valueParameter.getValue();