@Override @Cacheable(value = "sitemaps", key = "{ #root.methodName, #requestDto }") public Optional<TaxonomyNodeModelData> getNavigationModel(@NotNull SitemapRequestDto requestDto) { Assert.notNull(requestDto.getLocalizationId(), "Localization ID is required to load dynamic navigation"); List<Keyword> roots = getTaxonomyRoots(requestDto, keyword -> keyword.getKeywordName().contains(taxonomyNavigationMarker)); if (roots.isEmpty()) { log.error("No Navigation Taxonomy Found in Localization [{}]. Ensure a Taxonomy with '{}' in its title is published", requestDto.getLocalizationId(), taxonomyNavigationMarker); return Optional.empty(); } Keyword rootTaxonomy = roots.get(0); log.debug("Resolved Navigation Taxonomy {} for request {}", rootTaxonomy, requestDto); return Optional.of(createTaxonomyNode(rootTaxonomy, requestDto)); }
@Override public Optional<TaxonomyNodeModelData> getNavigationModel(@NotNull SitemapRequestDto requestDto) { try { return Optional.of(modelServiceClient.getForType(configuration.getNavigationApiUrl(), TaxonomyNodeModelData.class, requestDto.getLocalizationId())); } catch (DxaItemNotFoundException e) { log.warn("Cannot find a dynamic navigation in the MS for the request {}", requestDto, e); return Optional.empty(); } }
private List<SitemapItemModelData> getChildrenPages(@NotNull Keyword keyword, @NotNull String taxonomyId, @NotNull SitemapRequestDto requestDto) { log.trace("Getting SitemapItems for all classified Pages (ordered by Page Title, including sequence prefix if any), " + "keyword {}, taxonomyId {}, localization {}", keyword, taxonomyId, requestDto.getLocalizationId()); List<SitemapItemModelData> items = new ArrayList<>(); try { PageMetaFactory pageMetaFactory = new PageMetaFactory(requestDto.getLocalizationId()); PageMeta[] taxonomyPages = pageMetaFactory.getTaxonomyPages(keyword, false); items = Arrays.stream(taxonomyPages) .map(page -> createSitemapItemFromPage(page, taxonomyId)) .collect(Collectors.toList()); } catch (StorageException e) { log.error("Error loading taxonomy pages for taxonomyId = {}, localizationId = {} and keyword {}", taxonomyId, requestDto.getLocalizationId(), keyword, e); } return items; }
@Override public Optional<TaxonomyNodeModelData> getNavigationModel(@NotNull SitemapRequestDto requestDto) { try { return Optional.of(modelServiceClient.getForType(configuration.getNavigationApiUrl(), TaxonomyNodeModelData.class, requestDto.getLocalizationId())); } catch (ItemNotFoundInModelServiceException e) { log.warn("Cannot find a dynamic navigation in the MS for the request {}", requestDto, e); return Optional.empty(); } }
private void addDescendantsToTaxonomy(@NonNull SitemapItemModelData taxonomy, @NotNull SitemapRequestDto requestDto) { taxonomy.getItems().stream() .filter(TaxonomyNodeModelData.class::isInstance) .forEach(child -> addDescendantsToTaxonomy(child, requestDto)); TaxonomyUrisHolder uris = parse(taxonomy.getId(), requestDto.getLocalizationId()); Set<SitemapItemModelData> children = new LinkedHashSet<>(expandDescendants(uris, requestDto).orElse(Collections.emptyList())); for (SitemapItemModelData child : difference(children, newHashSet(taxonomy.getItems()))) { taxonomy.addItem(child); } }
/** * 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()); }
@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(); } } }
@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(); } } }
TaxonomyUrisHolder info = parse(request.getSitemapId(), request.getLocalizationId()); if (info == null) { throw new BadRequestException(String.format("SitemapID %s is wrong for Taxonomy navigation", request.getSitemapId()));