All Downloads are FREE. Search and download functionalities are using the official Maven repository.

graphql.kickstart.spring.cache.SpringValueCache Maven / Gradle / Ivy

package graphql.kickstart.spring.cache;

import static java.util.concurrent.CompletableFuture.runAsync;
import static java.util.concurrent.CompletableFuture.supplyAsync;

import java.util.concurrent.CompletableFuture;
import java.util.function.Function;
import lombok.RequiredArgsConstructor;
import org.dataloader.ValueCache;
import org.springframework.cache.Cache;
import org.springframework.cache.Cache.ValueWrapper;

/**
 * A {@link ValueCache} which uses a Spring {@link Cache} for caching.
 *
 * @see GraphQL Java
 * docs
 */
@RequiredArgsConstructor
public class SpringValueCache implements ValueCache {

  private final Cache cache;
  private Function keyTransformer;

  @Override
  public CompletableFuture get(K key) {
    return supplyAsync(() -> {
      Object finalKey = this.getKey(key);
      ValueWrapper valueWrapper = this.cache.get(finalKey);

      if (valueWrapper == null) {
        throw new CacheEntryNotFoundException(this.cache.getName(), finalKey);
      }

      return (V) valueWrapper.get();
    });
  }

  @Override
  public CompletableFuture set(K key, V value) {
    return supplyAsync(() -> {
      this.cache.put(this.getKey(key), value);
      return value;
    });
  }

  @Override
  public CompletableFuture delete(K key) {
    return runAsync(() -> this.cache.evictIfPresent(this.getKey(key)));
  }

  @Override
  public CompletableFuture clear() {
    return runAsync(this.cache::invalidate);
  }

  public  SpringValueCache setKeyTransformer(Function transformer) {
    this.keyTransformer = transformer;
    return this;
  }

  private Object getKey(K key) {
    return (
      this.keyTransformer == null
        ? key
        : this.keyTransformer.apply(key)
    );
  }

  public static class CacheEntryNotFoundException extends RuntimeException {
    public CacheEntryNotFoundException(String cacheName, Object key) {
      super("Entry could not be found in cache named \"" + cacheName + "\" for key: " + key);
    }
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy