Search in sources :

Example 6 with ListItem

use of com.adobe.cq.wcm.core.components.models.ListItem in project aem-core-wcm-components by Adobe-Marketing-Cloud.

the class SearchResultServlet method getResults.

/**
 * Gets the search results.
 *
 * @param request The search request.
 * @param searchComponent The search component.
 * @param pageManager A PageManager.
 * @return List of search results.
 */
@NotNull
private List<ListItem> getResults(@NotNull final SlingHttpServletRequest request, @NotNull final Search searchComponent, @NotNull final PageManager pageManager) {
    List<ListItem> results = new ArrayList<>();
    String fulltext = request.getParameter(PARAM_FULLTEXT);
    if (fulltext == null || fulltext.length() < searchComponent.getSearchTermMinimumLength()) {
        return results;
    }
    long resultsOffset = Optional.ofNullable(request.getParameter(PARAM_RESULTS_OFFSET)).map(Long::parseLong).orElse(0L);
    Map<String, String> predicatesMap = new HashMap<>();
    predicatesMap.put(FulltextPredicateEvaluator.FULLTEXT, fulltext);
    predicatesMap.put(PathPredicateEvaluator.PATH, searchComponent.getSearchRootPagePath());
    predicatesMap.put(TypePredicateEvaluator.TYPE, NameConstants.NT_PAGE);
    PredicateGroup predicates = PredicateConverter.createPredicates(predicatesMap);
    ResourceResolver resourceResolver = request.getResource().getResourceResolver();
    Query query = queryBuilder.createQuery(predicates, resourceResolver.adaptTo(Session.class));
    if (searchComponent.getResultsSize() != 0) {
        query.setHitsPerPage(searchComponent.getResultsSize());
    }
    if (resultsOffset != 0) {
        query.setStart(resultsOffset);
    }
    SearchResult searchResult = query.getResult();
    LinkHandler linkHandler = request.adaptTo(LinkHandler.class);
    // Query builder has a leaking resource resolver, so the following work around is required.
    ResourceResolver leakingResourceResolver = null;
    try {
        Iterator<Resource> resourceIterator = searchResult.getResources();
        while (resourceIterator.hasNext()) {
            Resource resource = resourceIterator.next();
            // Get a reference to QB's leaking resource resolver
            if (leakingResourceResolver == null) {
                leakingResourceResolver = resource.getResourceResolver();
            }
            Optional.of(resource).map(res -> resourceResolver.getResource(res.getPath())).map(pageManager::getContainingPage).map(page -> new PageListItemImpl(linkHandler, page, searchComponent.getId(), null)).ifPresent(results::add);
        }
    } finally {
        if (leakingResourceResolver != null) {
            leakingResourceResolver.close();
        }
    }
    return results;
}
Also used : ResourceResolver(org.apache.sling.api.resource.ResourceResolver) ScriptHelper(org.apache.sling.scripting.core.ScriptHelper) TypePredicateEvaluator(com.day.cq.search.eval.TypePredicateEvaluator) StringUtils(org.apache.commons.lang3.StringUtils) Page(com.day.cq.wcm.api.Page) SlingBindings(org.apache.sling.api.scripting.SlingBindings) SlingHttpServletRequest(org.apache.sling.api.SlingHttpServletRequest) SearchResult(com.day.cq.search.result.SearchResult) PredicateConverter(com.day.cq.search.PredicateConverter) Map(java.util.Map) PageListItemImpl(com.adobe.cq.wcm.core.components.internal.models.v1.PageListItemImpl) Search(com.adobe.cq.wcm.core.components.models.Search) PN_FRAGMENT_VARIATION_PATH(com.adobe.cq.wcm.core.components.models.ExperienceFragment.PN_FRAGMENT_VARIATION_PATH) PathPredicateEvaluator(com.day.cq.search.eval.PathPredicateEvaluator) Session(javax.jcr.Session) Servlet(javax.servlet.Servlet) SlingHttpServletResponse(org.apache.sling.api.SlingHttpServletResponse) StandardCharsets(java.nio.charset.StandardCharsets) BundleContext(org.osgi.framework.BundleContext) Objects(java.util.Objects) PageManager(com.day.cq.wcm.api.PageManager) Nullable(org.jetbrains.annotations.Nullable) List(java.util.List) Query(com.day.cq.search.Query) Optional(java.util.Optional) SlingSafeMethodsServlet(org.apache.sling.api.servlets.SlingSafeMethodsServlet) NotNull(org.jetbrains.annotations.NotNull) FulltextPredicateEvaluator(com.day.cq.search.eval.FulltextPredicateEvaluator) ModelFactory(org.apache.sling.models.factory.ModelFactory) LinkHandler(com.adobe.cq.wcm.core.components.internal.link.LinkHandler) HashMap(java.util.HashMap) LanguageManager(com.day.cq.wcm.api.LanguageManager) ArrayList(java.util.ArrayList) Component(org.osgi.service.component.annotations.Component) StreamSupport(java.util.stream.StreamSupport) Activate(org.osgi.service.component.annotations.Activate) SearchImpl(com.adobe.cq.wcm.core.components.internal.models.v1.SearchImpl) QueryBuilder(com.day.cq.search.QueryBuilder) Iterator(java.util.Iterator) ListItem(com.adobe.cq.wcm.core.components.models.ListItem) HttpServletResponse(javax.servlet.http.HttpServletResponse) ObjectMapper(com.fasterxml.jackson.databind.ObjectMapper) Resource(org.apache.sling.api.resource.Resource) IOException(java.io.IOException) LiveRelationshipManager(com.day.cq.wcm.msm.api.LiveRelationshipManager) LocalizationUtils(com.adobe.cq.wcm.core.components.internal.LocalizationUtils) PredicateGroup(com.day.cq.search.PredicateGroup) Template(com.day.cq.wcm.api.Template) NameConstants(com.day.cq.wcm.api.NameConstants) Reference(org.osgi.service.component.annotations.Reference) Query(com.day.cq.search.Query) HashMap(java.util.HashMap) ArrayList(java.util.ArrayList) Resource(org.apache.sling.api.resource.Resource) SearchResult(com.day.cq.search.result.SearchResult) PredicateGroup(com.day.cq.search.PredicateGroup) PageListItemImpl(com.adobe.cq.wcm.core.components.internal.models.v1.PageListItemImpl) ResourceResolver(org.apache.sling.api.resource.ResourceResolver) ListItem(com.adobe.cq.wcm.core.components.models.ListItem) LinkHandler(com.adobe.cq.wcm.core.components.internal.link.LinkHandler) Session(javax.jcr.Session) NotNull(org.jetbrains.annotations.NotNull)

Example 7 with ListItem

use of com.adobe.cq.wcm.core.components.models.ListItem in project aem-core-wcm-components by Adobe-Marketing-Cloud.

the class CarouselImpl method getDataLayerShownItems.

/*
     * DataLayerProvider implementation of field getters
     */
@Override
public String[] getDataLayerShownItems() {
    String[] shownItems = new String[0];
    List<ListItem> items = getItems();
    if (!items.isEmpty()) {
        ComponentData componentData = items.get(0).getData();
        if (componentData != null) {
            shownItems = new String[] { componentData.getId() };
        }
    }
    return shownItems;
}
Also used : ComponentData(com.adobe.cq.wcm.core.components.models.datalayer.ComponentData) ListItem(com.adobe.cq.wcm.core.components.models.ListItem)

Example 8 with ListItem

use of com.adobe.cq.wcm.core.components.models.ListItem in project aem-core-wcm-components by Adobe-Marketing-Cloud.

the class AbstractContainerImplTest method verifyContainerItems.

private void verifyContainerItems(Object[][] expectedItems, List<ListItem> items) {
    assertEquals(expectedItems.length, items.size(), "The container has a different number of items than expected.");
    int index = 0;
    for (ListItem item : items) {
        assertEquals(expectedItems[index][0], item.getDescription(), "The container item's description is not what was expected: " + item.getDescription());
        assertEquals(expectedItems[index][1], item.getName(), "The container item's name is not what was expected: " + item.getName());
        assertEquals(expectedItems[index][2], item.getPath(), "The container item's path is not what was expected: " + item.getPath());
        assertEquals(expectedItems[index][3], item.getTitle(), "The container item's title is not what was expected: " + item.getTitle());
        index++;
    }
}
Also used : ListItem(com.adobe.cq.wcm.core.components.models.ListItem)

Example 9 with ListItem

use of com.adobe.cq.wcm.core.components.models.ListItem in project aem-core-wcm-components by Adobe-Marketing-Cloud.

the class AbstractContainerImplTest method testEmptyContainer.

@Test
public void testEmptyContainer() {
    Container container = new ContainerImpl();
    List<ListItem> items = container.getItems();
    assertEquals(0, items.size());
}
Also used : LayoutContainer(com.adobe.cq.wcm.core.components.models.LayoutContainer) Container(com.adobe.cq.wcm.core.components.models.Container) ListItem(com.adobe.cq.wcm.core.components.models.ListItem) Test(org.junit.jupiter.api.Test)

Example 10 with ListItem

use of com.adobe.cq.wcm.core.components.models.ListItem in project aem-core-wcm-components by Adobe-Marketing-Cloud.

the class SearchResultServletTest method validateResponse.

@SuppressWarnings("deprecation")
private void validateResponse(MockSlingHttpServletResponse response, List<Map<String, String>> expected) throws IOException {
    ObjectMapper mapper = new ObjectMapper();
    SimpleAbstractTypeResolver resolver = new SimpleAbstractTypeResolver();
    resolver.addMapping(ListItem.class, Item.class);
    SimpleModule module = new SimpleModule();
    module.setAbstractTypes(resolver);
    mapper.registerModule(module);
    ListItem[] listItems = mapper.readValue(response.getOutputAsString(), ListItem[].class);
    List<Map<String, String>> actual = new LinkedList<>();
    for (ListItem item : listItems) {
        actual.add(ImmutableMap.of("url", item.getURL(), "title", item.getTitle(), "id", item.getId()));
    }
    assertEquals(expected, actual);
}
Also used : ListItem(com.adobe.cq.wcm.core.components.models.ListItem) Map(java.util.Map) ImmutableMap(com.google.common.collect.ImmutableMap) ObjectMapper(com.fasterxml.jackson.databind.ObjectMapper) SimpleAbstractTypeResolver(com.fasterxml.jackson.databind.module.SimpleAbstractTypeResolver) SimpleModule(com.fasterxml.jackson.databind.module.SimpleModule) LinkedList(java.util.LinkedList)

Aggregations

ListItem (com.adobe.cq.wcm.core.components.models.ListItem)15 Test (org.junit.jupiter.api.Test)5 Teaser (com.adobe.cq.wcm.core.components.models.Teaser)4 ObjectMapper (com.fasterxml.jackson.databind.ObjectMapper)3 Map (java.util.Map)3 LocalizationUtils (com.adobe.cq.wcm.core.components.internal.LocalizationUtils)2 LinkHandler (com.adobe.cq.wcm.core.components.internal.link.LinkHandler)2 PageListItemImpl (com.adobe.cq.wcm.core.components.internal.models.v1.PageListItemImpl)2 SearchImpl (com.adobe.cq.wcm.core.components.internal.models.v1.SearchImpl)2 PN_FRAGMENT_VARIATION_PATH (com.adobe.cq.wcm.core.components.models.ExperienceFragment.PN_FRAGMENT_VARIATION_PATH)2 Search (com.adobe.cq.wcm.core.components.models.Search)2 PredicateConverter (com.day.cq.search.PredicateConverter)2 PredicateGroup (com.day.cq.search.PredicateGroup)2 Query (com.day.cq.search.Query)2 QueryBuilder (com.day.cq.search.QueryBuilder)2 FulltextPredicateEvaluator (com.day.cq.search.eval.FulltextPredicateEvaluator)2 PathPredicateEvaluator (com.day.cq.search.eval.PathPredicateEvaluator)2 TypePredicateEvaluator (com.day.cq.search.eval.TypePredicateEvaluator)2 SearchResult (com.day.cq.search.result.SearchResult)2 LanguageManager (com.day.cq.wcm.api.LanguageManager)2