ProcessCatalogClient.java
- package no.nav.data.team.integration.process;
- import com.github.benmanes.caffeine.cache.Caffeine;
- import com.github.benmanes.caffeine.cache.LoadingCache;
- import no.nav.data.common.rest.RestResponsePage;
- import no.nav.data.common.utils.MetricUtils;
- import no.nav.data.common.web.TraceHeaderFilter;
- import no.nav.data.team.integration.process.dto.PcatProcess;
- import no.nav.data.team.integration.process.dto.ProcessResponse;
- import org.springframework.stereotype.Service;
- import org.springframework.web.reactive.function.client.WebClient;
- import java.time.Duration;
- import java.util.ArrayList;
- import java.util.List;
- import java.util.UUID;
- import static no.nav.data.common.utils.StreamUtils.convert;
- @Service
- public class ProcessCatalogClient {
- private final WebClient client;
- private final LoadingCache<UUID, List<PcatProcess>> processTeamCache;
- public ProcessCatalogClient(WebClient.Builder webClientBuilder, PcatProperties properties) {
- this.client = webClientBuilder
- .baseUrl(properties.getBaseUrl())
- .filter(new TraceHeaderFilter(true))
- .build();
- this.processTeamCache = MetricUtils.register("pcatProcessTeamCache",
- Caffeine.newBuilder().recordStats()
- .expireAfterWrite(Duration.ofMinutes(10))
- .maximumSize(100).build(this::findProcessesForTeam));
- }
- public List<ProcessResponse> getProcessesForTeam(UUID id) {
- return convert(processTeamCache.get(id), PcatProcess::convertToResponse);
- }
- // Internal
- private List<PcatProcess> findProcessesForTeam(UUID teamId) {
- return getAll("/process?productTeam={teamId}", teamId, ProcessPage.class);
- }
- private <T extends RestResponsePage<R>, R> List<R> getAll(String url, UUID id, Class<T> type) {
- List<R> items = new ArrayList<>();
- T page = null;
- while (page == null || (page.getPages() - 1 > page.getPageNumber())) {
- page = get(url, id, page == null ? 0 : page.getPageNumber() + 1, type);
- items.addAll(page.getContent());
- }
- return items;
- }
- private <T> T get(String url, UUID id, long page, Class<T> type) {
- return client.get()
- .uri(url + "&pageSize=250&pageNumber={pageNumber}", id, page)
- .retrieve()
- .bodyToMono(type).block();
- }
- private static class ProcessPage extends RestResponsePage<PcatProcess> {
- }
- }