package org.infinispan.jcache;
import java.lang.annotation.Annotation;
import java.util.Objects;
import javax.cache.annotation.CacheKeyGenerator;
import javax.cache.annotation.CacheKeyInvocationContext;
import javax.cache.annotation.GeneratedCacheKey;
import org.infinispan.marshall.core.ExternalPojo;
/**
* Custom implementation of {@link javax.cache.annotation.CacheKeyGenerator}. Compatible with methods providing one key parameter.
*
* @author Matej Cimbora
*/
public class JCacheCustomKeyGenerator implements CacheKeyGenerator {
@Override
public GeneratedCacheKey generateCacheKey(CacheKeyInvocationContext<? extends Annotation> cacheKeyInvocationContext) {
if (cacheKeyInvocationContext.getKeyParameters().length != 1) {
throw new IllegalArgumentException("Composed keys are not supported.");
}
return new CustomGeneratedCacheKey(cacheKeyInvocationContext.getKeyParameters()[0].getValue());
}
public static class CustomGeneratedCacheKey implements GeneratedCacheKey, ExternalPojo {
private Object value;
public CustomGeneratedCacheKey(Object value) {
if (value == null) {
throw new IllegalArgumentException("Value needs to be specified.");
}
this.value = value;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
CustomGeneratedCacheKey that = (CustomGeneratedCacheKey) o;
return Objects.equals(this.value, that.value);
}
@Override
public int hashCode() {
return value.hashCode();
}
@Override
public String toString() {
return "CustomGeneratedCacheKey{" +
"value=" + value +
'}';
}
}
}