package com.salesmanager.shop.tags; import java.util.ArrayList; import java.util.List; import javax.inject.Inject; import javax.servlet.http.HttpServletRequest; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.config.AutowireCapableBeanFactory; import org.springframework.web.context.WebApplicationContext; import org.springframework.web.servlet.tags.RequestContextAwareTag; import com.salesmanager.core.business.services.catalog.product.PricingService; import com.salesmanager.core.business.services.catalog.product.relationship.ProductRelationshipService; import com.salesmanager.core.business.utils.CacheUtils; import com.salesmanager.core.model.catalog.product.Product; import com.salesmanager.core.model.catalog.product.relationship.ProductRelationship; import com.salesmanager.core.model.merchant.MerchantStore; import com.salesmanager.core.model.reference.language.Language; import com.salesmanager.shop.constants.Constants; import com.salesmanager.shop.model.catalog.product.ReadableProduct; import com.salesmanager.shop.populator.catalog.ReadableProductPopulator; import com.salesmanager.shop.utils.ImageFilePath; public class ShopProductRelationshipTag extends RequestContextAwareTag { /** * */ private static final long serialVersionUID = 1L; private static final Logger LOGGER = LoggerFactory.getLogger(ShopProductRelationshipTag.class); @Inject private ProductRelationshipService productRelationshipService; @Inject private PricingService pricingService; @Inject private CacheUtils cache; @Inject @Qualifier("img") private ImageFilePath imageUtils; private String groupName; public String getGroupName() { return groupName; } public void setGroupName(String groupName) { this.groupName = groupName; } @SuppressWarnings("unchecked") @Override protected int doStartTagInternal() throws Exception { if (productRelationshipService == null || pricingService==null || imageUtils==null) { LOGGER.debug("Autowiring ProductRelationshipService"); WebApplicationContext wac = getRequestContext().getWebApplicationContext(); AutowireCapableBeanFactory factory = wac.getAutowireCapableBeanFactory(); factory.autowireBean(this); } HttpServletRequest request = (HttpServletRequest) pageContext .getRequest(); MerchantStore store = (MerchantStore)request.getAttribute(Constants.MERCHANT_STORE); Language language = (Language)request.getAttribute(Constants.LANGUAGE); StringBuilder groupKey = new StringBuilder(); groupKey .append(store.getId()) .append("_") .append(Constants.PRODUCTS_GROUP_CACHE_KEY) .append("-") .append(this.getGroupName()) .append("_") .append(language.getCode()); StringBuilder groupKeyMissed = new StringBuilder(); groupKeyMissed .append(groupKey.toString()) .append(Constants.MISSED_CACHE_KEY); List<ReadableProduct> objects = null; if(store.isUseCache()) { //get from the cache objects = (List<ReadableProduct>) cache.getFromCache(groupKey.toString()); Boolean missedContent = null; if(objects==null && missedContent==null) { objects = getProducts(request); //put in cache cache.putInCache(objects, groupKey.toString()); } else { //put in missed cache //cache.putInCache(new Boolean(true), groupKeyMissed.toString()); } } else { objects = getProducts(request); } if(objects!=null && objects.size()>0) { request.setAttribute(this.getGroupName(), objects); } return SKIP_BODY; } public int doEndTag() { return EVAL_PAGE; } private List<ReadableProduct> getProducts(HttpServletRequest request) throws Exception { MerchantStore store = (MerchantStore)request.getAttribute(Constants.MERCHANT_STORE); Language language = (Language)request.getAttribute(Constants.LANGUAGE); List<ProductRelationship> relationships = productRelationshipService.getByGroup(store, this.getGroupName(), language); ReadableProductPopulator populator = new ReadableProductPopulator(); populator.setPricingService(pricingService); populator.setimageUtils(imageUtils); List<ReadableProduct> products = new ArrayList<ReadableProduct>(); for(ProductRelationship relationship : relationships) { Product product = relationship.getRelatedProduct(); ReadableProduct proxyProduct = populator.populate(product, new ReadableProduct(), store, language); products.add(proxyProduct); } return products; } }