@NotNull @Override public Optional<Collection<SitemapItemModelData>> getNavigationSubtree(@NotNull SitemapRequestDto requestDto) { try { List<SitemapItemModelData> models = Arrays.asList(modelServiceClient.getForType(configuration.getOnDemandApiUrl(), SitemapItemModelData[].class, requestDto.getLocalizationId(), requestDto.getSitemapId(), requestDto.getNavigationFilter().isWithAncestors(), requestDto.getNavigationFilter().getDescendantLevels())); return Optional.of(models); } catch (DxaItemNotFoundException e) { log.warn("Cannot find items for on-demand dynamic navigation from the MS for the request {}", requestDto, e); return Optional.empty(); } } }
@NotNull @Override public Optional<Collection<SitemapItemModelData>> getNavigationSubtree(@NotNull SitemapRequestDto requestDto) { try { List<SitemapItemModelData> models = Arrays.asList(modelServiceClient.getForType(configuration.getOnDemandApiUrl(), SitemapItemModelData[].class, requestDto.getLocalizationId(), requestDto.getSitemapId(), requestDto.getNavigationFilter().isWithAncestors(), requestDto.getNavigationFilter().getDescendantLevels())); return Optional.of(models); } catch (ItemNotFoundInModelServiceException e) { log.warn("Cannot find items for on-demand dynamic navigation from the MS for the request {}", requestDto, e); return Optional.empty(); } } }
/** * Expands root Taxonomies. * * @param requestDto current request with mandatory localization ID and navigation filter * @param filter way to filter roots, pass empty predicate always returning true {@code () -> true} * @return a list of root Taxonomies */ @NotNull private List<Keyword> getTaxonomyRoots(@NotNull SitemapRequestDto requestDto, @NotNull() Predicate<Keyword> filter) { Assert.notNull(requestDto.getLocalizationId(), "Localization ID is required to load taxonomy roots"); Assert.notNull(requestDto.getNavigationFilter(), "Navigation Filter is required to load taxonomy roots"); NavigationFilter navigationFilter = requestDto.getNavigationFilter(); // since we load categories here, we have to decrease depth by one because the first level is categories level // and we want top-level keywords final int maximumDepth = navigationFilter.getDescendantLevels() > 0 ? navigationFilter.getDescendantLevels() - 1 : navigationFilter.getDescendantLevels(); TaxonomyFilter depthFilter = new DepthFilter(maximumDepth, DepthFilter.FILTER_DOWN); return Arrays.stream(taxonomyFactory.getTaxonomies(TcmUtils.buildPublicationTcmUri(requestDto.getLocalizationId()))) .distinct() .map(taxonomy -> taxonomyFactory.getTaxonomyKeywords(taxonomy, depthFilter)) .filter(filter) .collect(Collectors.toList()); }
if (requestDto.getNavigationFilter().getDescendantLevels() != 0) { addDescendantsToTaxonomy(taxonomy.get(), requestDto);
.expandLevels(new DepthCounter(requestDto.getNavigationFilter().getDescendantLevels())) .build(); if(request.getNavigationFilter().getDescendantLevels() != 0) { log.trace("Sitemap ID is empty, expanding all taxonomy roots"); if (request.getNavigationFilter().isWithAncestors()) { log.trace("Filter with ancestors, expanding ancestors"); Optional<SitemapItemModelData> taxonomy = taxonomyWithAncestors(info, request); if (request.getNavigationFilter().getDescendantLevels() != 0 && !info.isPage()) { log.trace("Filter with descendants, expanding descendants"); return expandDescendants(info, request);
private TaxonomyNodeModelData createTaxonomyNode(@NotNull Keyword keyword, @NotNull SitemapRequestDto requestDto) { log.debug("Creating taxonomy node for keyword {} and request {}", keyword.getTaxonomyURI(), requestDto); String taxonomyId = String.valueOf(TcmUtils.getItemId(keyword.getTaxonomyURI())); String taxonomyNodeUrl = null; List<SitemapItemModelData> children = new ArrayList<>(); if (requestDto.getExpandLevels().isNotTooDeep()) { keyword.getKeywordChildren().forEach(child -> children.add(createTaxonomyNode(child, requestDto.nextExpandLevel()))); if (keyword.getReferencedContentCount() > 0 && requestDto.getNavigationFilter().getDescendantLevels() != 0) { List<SitemapItemModelData> pageSitemapItems = getChildrenPages(keyword, taxonomyId, requestDto); taxonomyNodeUrl = findIndexPageUrl(pageSitemapItems).orElse(null); log.trace("taxonomyNodeUrl = {}", taxonomyNodeUrl); children.addAll(pageSitemapItems); } } children.forEach(child -> child.setTitle(removeSequenceFromPageTitle(child.getTitle()))); return createTaxonomyNodeFromKeyword(keyword, taxonomyId, taxonomyNodeUrl, new TreeSet<>(children)); }
/** * Loads taxonomy and expands descendants for a given taxonomy URI and basing on a current request. * * @param uris information about URI of current item * @param requestDto current request data * @return an optional collection of descendants of item with passed URI */ @NotNull private Optional<Collection<SitemapItemModelData>> expandDescendants(TaxonomyUrisHolder uris, @NotNull SitemapRequestDto requestDto) { if (uris.isPage()) { String message = "Page cannot have descendants, uris = " + uris; log.warn(message); throw new BadRequestException(message); } Keyword keyword = taxonomyFactory.getTaxonomyKeywords(uris.getTaxonomyUri(), new DepthFilter(requestDto.getNavigationFilter().getDescendantLevels(), DepthFilter.FILTER_DOWN), uris.getKeywordUri()); if (keyword == null) { log.warn("Keyword '{}' in Taxonomy '{}' was not found.", uris.getKeywordUri(), uris.getTaxonomyUri()); return Optional.empty(); } return Optional.of(createTaxonomyNode(keyword, requestDto).getItems()); }