From 56720278fec553e3f5dc3c8c7ab09ebbaae00c5e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matthias=20M=C3=BCller?= Date: Fri, 22 Jul 2022 13:19:47 +0200 Subject: [PATCH] MGR-140 --- .../application/manager/business/Cache.java | 174 ++++++++++-------- .../manager/business/CacheTest.java | 9 + .../xml/CacheTest-testCacheNoSite.xml | 68 +++++++ 3 files changed, 171 insertions(+), 80 deletions(-) create mode 100644 src/test/resources/xml/CacheTest-testCacheNoSite.xml diff --git a/src/main/java/org/appng/application/manager/business/Cache.java b/src/main/java/org/appng/application/manager/business/Cache.java index 77148a5..89cc99a 100644 --- a/src/main/java/org/appng/application/manager/business/Cache.java +++ b/src/main/java/org/appng/application/manager/business/Cache.java @@ -52,6 +52,7 @@ import org.appng.xml.platform.SortOrder; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; +import org.springframework.data.domain.Page; import org.springframework.data.domain.PageImpl; import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Component; @@ -87,98 +88,111 @@ public DataContainer getData(Site site, Application application, Environment env Map siteMap = env.getAttribute(Scope.PLATFORM, Platform.Environment.SITES); Optional cacheSite = siteMap.values().stream().filter(s -> s.getId().equals(siteId)).findFirst(); + if (STATISTICS.equals(mode)) { + List> cacheStats = getCacheStats(request, cacheSite); + dataContainer.setItems(cacheStats); + } else if (ENTRIES.equals(mode)) { + Page cacheEntries = getCacheEntries(request, fp, cacheSite, dataContainer); + dataContainer.setPage(cacheEntries); + } + + return dataContainer; + } + + public List> getCacheStats(Request request, Optional cacheSite) { + List> result = new ArrayList<>(); if (cacheSite.isPresent()) { - if (STATISTICS.equals(mode)) { - List> result = new ArrayList<>(); - Map stats = CacheService.getCacheStatistics(cacheSite.get()); - if (!stats.isEmpty()) { - result.add(getStatEntry(request, stats, CacheService.STATS_NAME)); - result.add(getStatEntry(request, stats, CacheService.STATS_SIZE)); - result.add(getStatEntry(request, stats, CacheService.STATS_HITS)); - result.add(getStatEntry(request, stats, CacheService.STATS_HITS_PERCENT)); - result.add(getStatEntry(request, stats, CacheService.STATS_MISSES)); - result.add(getStatEntry(request, stats, CacheService.STATS_MISSES_PERCENT)); - result.add(getStatEntry(request, stats, CacheService.STATS_PUTS)); - result.add(getStatEntry(request, stats, CacheService.STATS_AVG_PUT_TIME)); - result.add(getStatEntry(request, stats, CacheService.STATS_GETS)); - result.add(getStatEntry(request, stats, CacheService.STATS_AVG_GET_TIME)); - result.add(getStatEntry(request, stats, CacheService.STATS_REMOVALS)); - result.add(getStatEntry(request, stats, CacheService.STATS_AVG_REMOVAL_TIME)); - } - dataContainer.setItems(result); - } else if (ENTRIES.equals(mode)) { - Pageable pageable = fp.getPageable(); - List cacheEntries = new ArrayList<>(); - - javax.cache.Cache cache = CacheService.getCache(cacheSite.get()); - int cacheSize = 0; - if (null != cache) { - cacheSize = cache.unwrap(ICache.class).size(); - - if (cacheSize > maxCacheEntries) { - Iterator> elements = cache.iterator(); - int idx = 0; - int startIdx = pageable.getOffset(); - int endIdx = pageable.getOffset() + pageable.getPageSize(); - while (elements.hasNext()) { - javax.cache.Cache.Entry entry = elements.next(); - CachedResponse cachedResponse = entry.getValue(); - // entry may have been removed meanwhile - if (null != cachedResponse) { - if (idx >= startIdx && idx < endIdx) { - cacheEntries.add(new CacheEntry(cachedResponse)); - } - if (idx++ >= endIdx) { - break; - } - } else { - endIdx++; + Map stats = CacheService.getCacheStatistics(cacheSite.get()); + if (!stats.isEmpty()) { + result.add(getStatEntry(request, stats, CacheService.STATS_NAME)); + result.add(getStatEntry(request, stats, CacheService.STATS_SIZE)); + result.add(getStatEntry(request, stats, CacheService.STATS_HITS)); + result.add(getStatEntry(request, stats, CacheService.STATS_HITS_PERCENT)); + result.add(getStatEntry(request, stats, CacheService.STATS_MISSES)); + result.add(getStatEntry(request, stats, CacheService.STATS_MISSES_PERCENT)); + result.add(getStatEntry(request, stats, CacheService.STATS_PUTS)); + result.add(getStatEntry(request, stats, CacheService.STATS_AVG_PUT_TIME)); + result.add(getStatEntry(request, stats, CacheService.STATS_GETS)); + result.add(getStatEntry(request, stats, CacheService.STATS_AVG_GET_TIME)); + result.add(getStatEntry(request, stats, CacheService.STATS_REMOVALS)); + result.add(getStatEntry(request, stats, CacheService.STATS_AVG_REMOVAL_TIME)); + } + } + return result; + } + + public Page getCacheEntries(Request request, FieldProcessor fp, Optional cacheSite, + DataContainer dataContainer) { + Pageable pageable = fp.getPageable(); + List cacheEntries = new ArrayList<>(); + int cacheSize = 0; + if (cacheSite.isPresent()) { + javax.cache.Cache cache = CacheService.getCache(cacheSite.get()); + if (null != cache) { + cacheSize = cache.unwrap(ICache.class).size(); + + if (cacheSize > maxCacheEntries) { + Iterator> elements = cache.iterator(); + int idx = 0; + int startIdx = pageable.getOffset(); + int endIdx = pageable.getOffset() + pageable.getPageSize(); + while (elements.hasNext()) { + javax.cache.Cache.Entry entry = elements.next(); + CachedResponse cachedResponse = entry.getValue(); + // entry may have been removed meanwhile + if (null != cachedResponse) { + if (idx >= startIdx && idx < endIdx) { + cacheEntries.add(new CacheEntry(cachedResponse)); + } + if (idx++ >= endIdx) { + break; } + } else { + endIdx++; } + } - fp.getFields().stream().filter(f -> !"id".equals(f.getBinding())).forEach(f -> f.setSort(null)); - SortOrder idOrder = fp.getField("id").getSort().getOrder(); - if (null != idOrder) { - Collections.sort(cacheEntries, (e1, e2) -> StringUtils.compare(e1.getId(), e2.getId())); - if (SortOrder.DESC.equals(idOrder)) { - Collections.reverse(cacheEntries); - } + fp.getFields().stream().filter(f -> !"id".equals(f.getBinding())).forEach(f -> f.setSort(null)); + SortOrder idOrder = fp.getField("id").getSort().getOrder(); + if (null != idOrder) { + Collections.sort(cacheEntries, (e1, e2) -> StringUtils.compare(e1.getId(), e2.getId())); + if (SortOrder.DESC.equals(idOrder)) { + Collections.reverse(cacheEntries); } + } - } else { - String entryName = request.getParameter(F_ETR); - String entryType = request.getParameter(F_CTYPE); - boolean filterName = StringUtils.isNotBlank(entryName); - boolean filterType = StringUtils.isNotBlank(entryType); - for (javax.cache.Cache.Entry entry : cache) { - String entryId = entry.getKey(); - CachedResponse cachedResponse = entry.getValue(); - // entry may have been removed meanwhile - if (null != cachedResponse) { - boolean nameMatches = !filterName || FilenameUtils.wildcardMatch( - entryId.substring(entryId.indexOf('/')), entryName, IOCase.INSENSITIVE); - boolean typeMatches = !filterType || FilenameUtils - .wildcardMatch(cachedResponse.getContentType(), entryType, IOCase.INSENSITIVE); - if (nameMatches && typeMatches) { - cacheEntries.add(new CacheEntry(cachedResponse)); - } + } else { + String entryName = request.getParameter(F_ETR); + String entryType = request.getParameter(F_CTYPE); + boolean filterName = StringUtils.isNotBlank(entryName); + boolean filterType = StringUtils.isNotBlank(entryType); + for (javax.cache.Cache.Entry entry : cache) { + String entryId = entry.getKey(); + CachedResponse cachedResponse = entry.getValue(); + // entry may have been removed meanwhile + if (null != cachedResponse) { + boolean nameMatches = !filterName || FilenameUtils.wildcardMatch( + entryId.substring(entryId.indexOf('/')), entryName, IOCase.INSENSITIVE); + boolean typeMatches = !filterType || FilenameUtils + .wildcardMatch(cachedResponse.getContentType(), entryType, IOCase.INSENSITIVE); + if (nameMatches && typeMatches) { + cacheEntries.add(new CacheEntry(cachedResponse)); } } - - Selection nameSelection = selectionFactory.getTextSelection(F_ETR, MessageConstants.NAME, - entryName); - Selection typeSelection = selectionFactory.getTextSelection(F_CTYPE, MessageConstants.TYPE, - entryType); - SelectionGroup selectionGroup = new SelectionGroup(); - selectionGroup.getSelections().add(nameSelection); - selectionGroup.getSelections().add(typeSelection); - dataContainer.getSelectionGroups().add(selectionGroup); } + + Selection nameSelection = selectionFactory.getTextSelection(F_ETR, MessageConstants.NAME, + entryName); + Selection typeSelection = selectionFactory.getTextSelection(F_CTYPE, MessageConstants.TYPE, + entryType); + SelectionGroup selectionGroup = new SelectionGroup(); + selectionGroup.getSelections().add(nameSelection); + selectionGroup.getSelections().add(typeSelection); + dataContainer.getSelectionGroups().add(selectionGroup); } - dataContainer.setPage(new PageImpl<>(cacheEntries, pageable, cacheSize)); } } - return dataContainer; + return new PageImpl<>(cacheEntries, pageable, cacheSize); } private Entry getStatEntry(Request request, Map statistics, String statKey) { diff --git a/src/test/java/org/appng/application/manager/business/CacheTest.java b/src/test/java/org/appng/application/manager/business/CacheTest.java index 14aa9fa..f894268 100644 --- a/src/test/java/org/appng/application/manager/business/CacheTest.java +++ b/src/test/java/org/appng/application/manager/business/CacheTest.java @@ -70,6 +70,15 @@ public void testCache() throws Exception { validate(datasource, new DateFieldDifferenceHandler()); } + @Test + public void testCacheNoSite() throws Exception { + addParameter("sortCacheElements", "pageSize:25;page:0"); + initParameters(); + CallableDataSource ds = getDataSource("cacheElements").withParam("siteid", "42").getCallableDataSource(); + ds.perform(""); + validate(ds.getDatasource()); + } + @Test public void testCacheStatistics() throws Exception { CallableDataSource ds = getDataSource("cacheStatistics").withParam("siteid", "1").getCallableDataSource(); diff --git a/src/test/resources/xml/CacheTest-testCacheNoSite.xml b/src/test/resources/xml/CacheTest-testCacheNoSite.xml new file mode 100644 index 0000000..b42fa70 --- /dev/null +++ b/src/test/resources/xml/CacheTest-testCacheNoSite.xml @@ -0,0 +1,68 @@ + + + + Cache elements + + + + + 42 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + delete + + + + preview + + + + + + + + + delete + + + + + + +