From 35bb7ba51bcbea566e7253c8821565a5ed4b028b Mon Sep 17 00:00:00 2001 From: Christophe Jelger Date: Wed, 24 Feb 2021 08:40:16 +0100 Subject: [PATCH] CIF-1955 - Venia ITs fail for productlist (#491) - re-fetch resource from request - temporary fix to set proper resource types and paths to product items --- .../models/v1/product/ProductImpl.java | 2 + .../v1/productlist/ProductListImpl.java | 49 ++++++++++++++++++- 2 files changed, 50 insertions(+), 1 deletion(-) diff --git a/bundles/core/src/main/java/com/adobe/cq/commerce/core/components/internal/models/v1/product/ProductImpl.java b/bundles/core/src/main/java/com/adobe/cq/commerce/core/components/internal/models/v1/product/ProductImpl.java index f2e78275c2..50cb5d6b09 100644 --- a/bundles/core/src/main/java/com/adobe/cq/commerce/core/components/internal/models/v1/product/ProductImpl.java +++ b/bundles/core/src/main/java/com/adobe/cq/commerce/core/components/internal/models/v1/product/ProductImpl.java @@ -430,11 +430,13 @@ public String getCanonicalUrl() { @Override public ComponentData getComponentData() { + resource = request.getResource(); return new ProductDataImpl(this, resource); } @Override protected String generateId() { + resource = request.getResource(); return StringUtils.join("product", ID_SEPARATOR, StringUtils.substring(DigestUtils.sha256Hex(getSku()), 0, 10)); } diff --git a/bundles/core/src/main/java/com/adobe/cq/commerce/core/components/internal/models/v1/productlist/ProductListImpl.java b/bundles/core/src/main/java/com/adobe/cq/commerce/core/components/internal/models/v1/productlist/ProductListImpl.java index a8adbe2b47..e3e0112acc 100644 --- a/bundles/core/src/main/java/com/adobe/cq/commerce/core/components/internal/models/v1/productlist/ProductListImpl.java +++ b/bundles/core/src/main/java/com/adobe/cq/commerce/core/components/internal/models/v1/productlist/ProductListImpl.java @@ -15,7 +15,9 @@ package com.adobe.cq.commerce.core.components.internal.models.v1.productlist; import java.io.IOException; +import java.util.ArrayList; import java.util.Collection; +import java.util.Collections; import java.util.Map; import java.util.Objects; import java.util.function.Consumer; @@ -25,6 +27,7 @@ import javax.annotation.Nullable; import javax.annotation.PostConstruct; +import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.tuple.Pair; import org.apache.sling.api.SlingHttpServletRequest; @@ -35,6 +38,7 @@ import org.slf4j.LoggerFactory; import com.adobe.cq.commerce.core.components.client.MagentoGraphqlClient; +import com.adobe.cq.commerce.core.components.internal.models.v1.common.ProductListItemImpl; import com.adobe.cq.commerce.core.components.internal.models.v1.productcollection.ProductCollectionImpl; import com.adobe.cq.commerce.core.components.models.common.ProductListItem; import com.adobe.cq.commerce.core.components.models.productlist.ProductList; @@ -49,6 +53,7 @@ import com.adobe.cq.commerce.magento.graphql.CategoryProducts; import com.adobe.cq.commerce.magento.graphql.ProductInterfaceQuery; import com.adobe.cq.sightly.SightlyWCMMode; +import com.adobe.cq.wcm.core.components.models.datalayer.ComponentData; @Model( adaptables = SlingHttpServletRequest.class, @@ -183,7 +188,7 @@ public Collection getProducts() { .filter(Objects::nonNull) // the converter returns null if the conversion fails .collect(Collectors.toList()); } else { - return getSearchResultsSet().getProductListItems(); + return fixProducts(getSearchResultsSet().getProductListItems()); } } @@ -242,4 +247,46 @@ public String getMetaTitle() { public String getCanonicalUrl() { return canonicalUrl; } + + // TODO: This a temporary fix to solve an issue caused by SlingModel caching + private Collection fixedProducts; + + private Collection fixProducts(Collection products) { + if (fixedProducts != null) { + return fixedProducts; + } else if (CollectionUtils.isEmpty(products)) { + fixedProducts = Collections.emptyList(); + return fixedProducts; + } + + resource = request.getResource(); + + fixedProducts = new ArrayList<>(); + for (ProductListItem product : products) { + ProductListItem productListItem = new ProductListItemImpl(product.getSKU(), + product.getSlug(), + product.getTitle(), + product.getPriceRange(), + product.getImageURL(), + productPage, + null, // search results aren't targeting specific variant + request, + urlProvider, + this.getId()); + fixedProducts.add(productListItem); + } + return fixedProducts; + } + + @Override + protected String generateId() { + resource = request.getResource(); + return super.generateId(); + } + + @Override + protected ComponentData getComponentData() { + resource = request.getResource(); + return super.getComponentData(); + } }