From 5a33bbfce3e37a9ae836b882502869a21b05ff3b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pablo=20Hern=C3=A1n=20Carle?= Date: Mon, 13 Nov 2023 15:58:54 +0100 Subject: [PATCH 1/3] update bean definitions for noop cache mode MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Pablo Hernán Carle --- .../src/main/java/org/zowe/apiml/util/CacheUtils.java | 4 ++++ .../org/zowe/apiml/gateway/config/NoOpCacheConfig.java | 10 ++++++++++ 2 files changed, 14 insertions(+) diff --git a/common-service-core/src/main/java/org/zowe/apiml/util/CacheUtils.java b/common-service-core/src/main/java/org/zowe/apiml/util/CacheUtils.java index a1aaafb3e4..cc2d81d6f0 100644 --- a/common-service-core/src/main/java/org/zowe/apiml/util/CacheUtils.java +++ b/common-service-core/src/main/java/org/zowe/apiml/util/CacheUtils.java @@ -12,8 +12,10 @@ import org.springframework.cache.Cache; import org.springframework.cache.CacheManager; +import org.springframework.cache.support.NoOpCache; import org.zowe.apiml.cache.CompositeKey; +import java.util.Collections; import java.util.List; import java.util.Set; import java.util.Spliterator; @@ -95,6 +97,8 @@ public List getAllRecords(CacheManager cacheManager, String cacheName) { if (nativeCache instanceof javax.cache.Cache) { Spliterator> spliterator = ((javax.cache.Cache) nativeCache).spliterator(); return StreamSupport.stream(spliterator, true).map(javax.cache.Cache.Entry::getValue).collect(Collectors.toList()); + } else if (nativeCache instanceof NoOpCache) { + return Collections.emptyList(); } else { throw new IllegalArgumentException("Unsupported type of cache : " + nativeCache.getClass()); } diff --git a/gateway-service/src/main/java/org/zowe/apiml/gateway/config/NoOpCacheConfig.java b/gateway-service/src/main/java/org/zowe/apiml/gateway/config/NoOpCacheConfig.java index 7244a73391..1f800f7f83 100644 --- a/gateway-service/src/main/java/org/zowe/apiml/gateway/config/NoOpCacheConfig.java +++ b/gateway-service/src/main/java/org/zowe/apiml/gateway/config/NoOpCacheConfig.java @@ -10,6 +10,7 @@ package org.zowe.apiml.gateway.config; +import lombok.extern.slf4j.Slf4j; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.cache.CacheManager; import org.springframework.cache.annotation.EnableCaching; @@ -18,13 +19,22 @@ import org.springframework.context.annotation.Configuration; import org.zowe.apiml.util.CacheUtils; +import javax.annotation.PostConstruct; + /** * Spring configuration to disable EhCache usage. */ @EnableCaching @Configuration @ConditionalOnProperty(value = "apiml.caching.enabled", havingValue = "false") +@Slf4j public class NoOpCacheConfig { + + @PostConstruct + public void init() { + log.warn("Gateway Service is runnnig in NoOp Cache mode. Do not use in production."); + } + @Bean public CacheManager cacheManager() { return new NoOpCacheManager(); From 3df700e0f893fc9912da55c56f34c7360d8acfa7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pablo=20Hern=C3=A1n=20Carle?= Date: Mon, 13 Nov 2023 16:36:32 +0100 Subject: [PATCH 2/3] add missing beans in noop mode MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Pablo Hernán Carle --- .../zowe/apiml/gateway/config/NoOpCacheConfig.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/gateway-service/src/main/java/org/zowe/apiml/gateway/config/NoOpCacheConfig.java b/gateway-service/src/main/java/org/zowe/apiml/gateway/config/NoOpCacheConfig.java index 1f800f7f83..40794923db 100644 --- a/gateway-service/src/main/java/org/zowe/apiml/gateway/config/NoOpCacheConfig.java +++ b/gateway-service/src/main/java/org/zowe/apiml/gateway/config/NoOpCacheConfig.java @@ -14,9 +14,12 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.cache.CacheManager; import org.springframework.cache.annotation.EnableCaching; +import org.springframework.cache.interceptor.KeyGenerator; import org.springframework.cache.support.NoOpCacheManager; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.zowe.apiml.cache.CompositeKeyGenerator; +import org.zowe.apiml.cache.CompositeKeyGeneratorWithoutLast; import org.zowe.apiml.util.CacheUtils; import javax.annotation.PostConstruct; @@ -40,6 +43,16 @@ public CacheManager cacheManager() { return new NoOpCacheManager(); } + @Bean(CacheConfig.COMPOSITE_KEY_GENERATOR) + public KeyGenerator getCompositeKeyGenerator() { + return new CompositeKeyGenerator(); + } + + @Bean(CacheConfig.COMPOSITE_KEY_GENERATOR_WITHOUT_LAST) + public KeyGenerator getCompositeKeyGeneratorWithoutLast() { + return new CompositeKeyGeneratorWithoutLast(); + } + @Bean public CacheUtils cacheUtils() { return new CacheUtils(); From 1736f3303572461e3cfb3ec5eb9e52b264a3ce1c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pablo=20Hern=C3=A1n=20Carle?= Date: Mon, 13 Nov 2023 17:21:18 +0100 Subject: [PATCH 3/3] add test for noop MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Pablo Hernán Carle --- .../java/org/zowe/apiml/util/CacheUtilsTest.java | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/common-service-core/src/test/java/org/zowe/apiml/util/CacheUtilsTest.java b/common-service-core/src/test/java/org/zowe/apiml/util/CacheUtilsTest.java index 8cb40c3bd1..8dfb9e740d 100644 --- a/common-service-core/src/test/java/org/zowe/apiml/util/CacheUtilsTest.java +++ b/common-service-core/src/test/java/org/zowe/apiml/util/CacheUtilsTest.java @@ -14,6 +14,7 @@ import org.junit.jupiter.api.Test; import org.springframework.cache.Cache; import org.springframework.cache.CacheManager; +import org.springframework.cache.support.NoOpCache; import org.zowe.apiml.cache.CompositeKey; import java.util.*; @@ -24,7 +25,6 @@ class CacheUtilsTest { private CacheUtils underTest; - private int removeCounter; @BeforeEach void setUp() { @@ -113,6 +113,16 @@ void givenUnknownCacheName_whenGetAllRecords_thenThrowsException() { assertEquals("Unknown cache unknownCacheName", iae.getMessage()); } + @Test + void givenNoOpCache_whenGetAllRecords_thenEmpty() { + CacheManager cacheManager = mock(CacheManager.class); + Cache cache = mock(Cache.class); + when(cacheManager.getCache("knownCacheName")).thenReturn(cache); + when(cache.getNativeCache()).thenReturn(new NoOpCache("knownCacheName")); + + assertEquals(underTest.getAllRecords(cacheManager, "knownCacheName").size(), 0); + } + @Test void givenUnsupportedCacheManager_whenGetAllRecords_thenThrowsException() { CacheManager cacheManager = mock(CacheManager.class);