package org.broadleafcommerce.core.web.processor;
import java.math.BigDecimal;
import java.util.List;
import org.broadleafcommerce.core.catalog.RelatedProductDTOEx;
import org.broadleafcommerce.core.catalog.domain.PromotableProduct;
import org.broadleafcommerce.core.catalog.domain.RelatedProductDTO;
import org.broadleafcommerce.core.catalog.domain.RelatedProductTypeEnum;
import org.thymeleaf.Arguments;
import org.thymeleaf.dom.Element;
import org.thymeleaf.standard.expression.StandardExpressionProcessor;
/**
* 新增了 start 分页属性. 若catId, prodId都没指定,则啥也不做, 不设值!
*
* @author Ju
*/
public class RelatedProductProcessorEx extends RelatedProductProcessor {
@Override
protected void modifyModelAttributes(Arguments arguments, Element element) {
RelatedProductDTO dto = buildDTO(arguments, element);
if (dto.getCategoryId() == null && dto.getProductId() == null)
return; // 不往model里放值
List<? extends PromotableProduct> relatedProducts = relatedProductsService
.findRelatedProducts(dto);
addToModel(arguments, getRelatedProductsResultVar(element),
relatedProducts);
addToModel(arguments, getProductsResultVar(element),
convertRelatedProductsToProducts(relatedProducts));
}
private RelatedProductDTO buildDTO(Arguments args, Element element) {
RelatedProductDTOEx relatedProductDTO = new RelatedProductDTOEx();
String productIdStr = element.getAttributeValue("productId");
String categoryIdStr = element.getAttributeValue("categoryId");
String quantityStr = element.getAttributeValue("quantity");
String startStr = element.getAttributeValue("start");
String typeStr = element.getAttributeValue("type");
if (productIdStr != null) {
Object productId = StandardExpressionProcessor.processExpression(
args, productIdStr);
if (productId instanceof BigDecimal) {
productId = new Long(((BigDecimal) productId).toPlainString());
}
relatedProductDTO.setProductId((Long) productId);
}
if (categoryIdStr != null) {
Object categoryId = StandardExpressionProcessor.processExpression(
args, categoryIdStr);
if (categoryId instanceof BigDecimal) {
categoryId = new Long(((BigDecimal) categoryId).toPlainString());
}
relatedProductDTO.setCategoryId((Long) categoryId);
}
if (quantityStr != null) {
relatedProductDTO
.setQuantity(((BigDecimal) StandardExpressionProcessor
.processExpression(args, quantityStr)).intValue());
}
if (startStr != null) {
BigDecimal s = (BigDecimal) StandardExpressionProcessor
.processExpression(args, startStr);
if (s != null)
relatedProductDTO.setStart(s.intValue());
}
if (typeStr != null) {
typeStr = (String) StandardExpressionProcessor
.processExpression(args, typeStr);
RelatedProductTypeEnum type = RelatedProductTypeEnum.getInstance(typeStr);
if (type != null)
relatedProductDTO.setType(type);
}
if ("false".equalsIgnoreCase(element
.getAttributeValue("cumulativeResults"))) {
relatedProductDTO.setCumulativeResults(false);
}
return relatedProductDTO;
}
private String getRelatedProductsResultVar(Element element) {
String resultVar = element
.getAttributeValue("relatedProductsResultVar");
if (resultVar == null) {
resultVar = "relatedProducts";
}
return resultVar;
}
private String getProductsResultVar(Element element) {
String resultVar = element.getAttributeValue("productsResultVar");
if (resultVar == null) {
resultVar = "products";
}
return resultVar;
}
}