diff --git a/src/main/java/org/etsi/osl/tmf/metrics/reposervices/GeneralMetricsRepoService.java b/src/main/java/org/etsi/osl/tmf/metrics/reposervices/GeneralMetricsRepoService.java index 00276eff2fa9e824d4792b0f95b81ef49c9a2218..e1fa49a7b603b617b52f8e21cb6e9699f2cea51e 100644 --- a/src/main/java/org/etsi/osl/tmf/metrics/reposervices/GeneralMetricsRepoService.java +++ b/src/main/java/org/etsi/osl/tmf/metrics/reposervices/GeneralMetricsRepoService.java @@ -2,12 +2,14 @@ package org.etsi.osl.tmf.metrics.reposervices; import org.etsi.osl.tmf.pm632.repo.IndividualRepository; import org.etsi.osl.tmf.rcm634.repo.ResourceSpecificationRepository; -import org.etsi.osl.tmf.scm633.model.ServiceCandidate; +import org.etsi.osl.tmf.scm633.model.ServiceCategory; import org.etsi.osl.tmf.scm633.repo.CandidateRepository; import org.etsi.osl.tmf.scm633.repo.CategoriesRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import java.time.Duration; +import java.time.OffsetDateTime; import java.util.List; @Service @@ -25,22 +27,33 @@ public class GeneralMetricsRepoService { @Autowired CandidateRepository candidateRepository; + // Cached values for performance optimization + private static Integer cachedPublishedServiceSpecCount = null; + private static OffsetDateTime lastRetrieved = null; + private static final Duration CACHE_DURATION = Duration.ofMinutes(15); + public int countRegisteredIndividuals() { return individualRepository.countAll(); } public int countPublishedServiceSpecifications() { + OffsetDateTime now = OffsetDateTime.now(); + + if (cachedPublishedServiceSpecCount == null || lastRetrieved == null || + Duration.between(lastRetrieved, now).compareTo(CACHE_DURATION) > 0) { - List serviceCandidates = candidateRepository.findAll(); - int count = 0; + int count = 0; + List serviceCategories = categoriesRepository.findByOrderByName(); - for (ServiceCandidate serviceCandidate : serviceCandidates) { - System.out.println("ServiceCandidate Category: " + serviceCandidate.getCategoryObj()); - if (serviceCandidate.getCategory() != null) { - count += 1; + for (ServiceCategory serviceCategory : serviceCategories) { + count += serviceCategory.getServiceCandidateObj().size() + + serviceCategory.getServiceCandidateRefs().size(); } + + cachedPublishedServiceSpecCount = count; + lastRetrieved = now; } - return count; + return cachedPublishedServiceSpecCount; } public int countRegisteredResourceSpecifications() { diff --git a/src/test/java/org/etsi/osl/services/api/metrics/GeneralMetricsApiControllerTest.java b/src/test/java/org/etsi/osl/services/api/metrics/GeneralMetricsApiControllerTest.java index af13cb39e75dbd9453d995778398b0eb4285939f..3776c5c7ddd101c2f65c8244123cbbbe6c7a8db9 100644 --- a/src/test/java/org/etsi/osl/services/api/metrics/GeneralMetricsApiControllerTest.java +++ b/src/test/java/org/etsi/osl/services/api/metrics/GeneralMetricsApiControllerTest.java @@ -5,8 +5,9 @@ import org.etsi.osl.tmf.OpenAPISpringBoot; import org.etsi.osl.tmf.pm632.model.IndividualCreate; import org.etsi.osl.tmf.pm632.reposervices.IndividualRepoService; import org.etsi.osl.tmf.rcm634.reposervices.ResourceSpecificationRepoService; -import org.etsi.osl.tmf.scm633.model.ServiceCandidate; +import org.etsi.osl.tmf.scm633.model.ServiceCategory; import org.etsi.osl.tmf.scm633.reposervices.CandidateRepoService; +import org.etsi.osl.tmf.scm633.reposervices.CategoryRepoService; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -58,6 +59,9 @@ public class GeneralMetricsApiControllerTest { @Autowired CandidateRepoService candidateRepoService; + @Autowired + CategoryRepoService categoryRepoService; + @Before public void setup() throws Exception { @@ -96,13 +100,11 @@ public class GeneralMetricsApiControllerTest { int totalSpecs = JsonPath.read(response, "$.publishedServiceSpecifications"); - List serviceCandidates = candidateRepoService.findAll(); + List serviceCategories = categoryRepoService.findAll(); int count = 0; - for (ServiceCandidate serviceCandidate : serviceCandidates) { - if (serviceCandidate.getCategory() != null) { - count += 1; - } + for (ServiceCategory serviceCategory : serviceCategories) { + count += serviceCategory.getServiceCandidateObj().size() + serviceCategory.getServiceCandidateRefs().size(); } assertThat(totalSpecs).isEqualTo(count);