/** * Most of the code in the Qalingo project is copyrighted Hoteia and licensed * under the Apache License Version 2.0 (release version 0.8.0) * http://www.apache.org/licenses/LICENSE-2.0 * * Copyright (c) Hoteia, 2012-2014 * http://www.hoteia.com - http://twitter.com/hoteia - contact@hoteia.com * */ package org.hoteia.qalingo.core.jms.indexing.listener; import java.beans.ExceptionListener; import java.io.IOException; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import javax.jms.JMSException; import javax.jms.Message; import javax.jms.MessageListener; import javax.jms.TextMessage; import org.apache.commons.lang3.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.solr.client.solrj.SolrServerException; import org.hoteia.qalingo.core.domain.CatalogCategoryVirtual; import org.hoteia.qalingo.core.domain.CatalogCategoryVirtual_; import org.hoteia.qalingo.core.domain.ProductMarketing; import org.hoteia.qalingo.core.domain.ProductMarketing_; import org.hoteia.qalingo.core.domain.ProductSku; import org.hoteia.qalingo.core.domain.ProductSkuStorePrice_; import org.hoteia.qalingo.core.domain.ProductSku_; import org.hoteia.qalingo.core.domain.Store; import org.hoteia.qalingo.core.domain.Store_; import org.hoteia.qalingo.core.fetchplan.FetchPlan; import org.hoteia.qalingo.core.fetchplan.SpecificFetchMode; import org.hoteia.qalingo.core.fetchplan.catalog.FetchPlanGraphProduct; import org.hoteia.qalingo.core.jms.indexing.producer.IndexingObjectMessageJms; import org.hoteia.qalingo.core.mapper.XmlMapper; import org.hoteia.qalingo.core.service.CatalogCategoryService; import org.hoteia.qalingo.core.service.ProductService; import org.hoteia.qalingo.core.service.RetailerService; import org.hoteia.qalingo.core.solr.service.ProductMarketingSolrService; import org.hoteia.qalingo.core.solr.service.ProductSkuSolrService; import org.hoteia.qalingo.core.solr.service.StoreSolrService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @Component(value = "indexingObjectQueueListener") public class IndexingObjectQueueListener implements MessageListener, ExceptionListener { protected final Log logger = LogFactory.getLog(getClass()); @Autowired protected XmlMapper xmlMapper; @Autowired protected CatalogCategoryService catalogCategoryService; @Autowired protected ProductService productService; @Autowired protected RetailerService retailerService; @Autowired protected ProductMarketingSolrService productMarketingSolrService; @Autowired protected ProductSkuSolrService productSkuSolrService; @Autowired protected StoreSolrService storeSolrService; protected List<SpecificFetchMode> categoryFetchPlans = new ArrayList<SpecificFetchMode>(); protected List<SpecificFetchMode> storeFetchPlans = new ArrayList<SpecificFetchMode>(); public IndexingObjectQueueListener() { categoryFetchPlans.add(new SpecificFetchMode(CatalogCategoryVirtual_.catalog.getName())); categoryFetchPlans.add(new SpecificFetchMode(CatalogCategoryVirtual_.catalogCategories.getName())); categoryFetchPlans.add(new SpecificFetchMode(CatalogCategoryVirtual_.parentCatalogCategory.getName())); categoryFetchPlans.add(new SpecificFetchMode(CatalogCategoryVirtual_.attributes.getName())); storeFetchPlans.add(new SpecificFetchMode(Store_.retailer.getName())); storeFetchPlans.add(new SpecificFetchMode(Store_.attributes.getName())); storeFetchPlans.add(new SpecificFetchMode(Store_.businessHours.getName())); storeFetchPlans.add(new SpecificFetchMode(Store_.assets.getName())); } /** * Implementation of <code>MessageListener</code>. */ public void onMessage(Message message) { try { if (message instanceof TextMessage) { TextMessage tm = (TextMessage) message; String valueJMSMessage = tm.getText(); if(StringUtils.isNotEmpty(valueJMSMessage)){ final IndexingObjectMessageJms documentMessageJms = xmlMapper.getXmlMapper().readValue(valueJMSMessage, IndexingObjectMessageJms.class); Long objectId = documentMessageJms.getObjectId(); if("ProductMarketing".equals(documentMessageJms.getObjectType())){ final ProductMarketing productMarketing = productService.getProductMarketingById(objectId, FetchPlanGraphProduct.fullIndexedProductMarketingFetchPlan()); if(productMarketing != null){ ProductSku defaultProductSku = productMarketing.getDefaultProductSku(); if(defaultProductSku != null){ List<CatalogCategoryVirtual> catalogCategories = catalogCategoryService.findVirtualCategoriesByProductSkuId(defaultProductSku.getId(), new FetchPlan(categoryFetchPlans)); List<ProductSku> productSkus = new ArrayList<ProductSku>(); for (Iterator<ProductSku> iteratorProductSku = productMarketing.getProductSkus().iterator(); iteratorProductSku.hasNext();) { ProductSku productSkuIterator = (ProductSku) iteratorProductSku.next(); final ProductSku reloadedProductSku = productService.getProductSkuByCode(productSkuIterator.getCode(), FetchPlanGraphProduct.fullIndexedProductSkuFetchPlan()); productSkus.add(reloadedProductSku); } try { productMarketingSolrService.addOrUpdateProductMarketing(productMarketing, productSkus, catalogCategories, null, null); } catch (SolrServerException e) { logger.error("Processed message to indexing failed, value: " + valueJMSMessage); } } } } else if("ProductSku".equals(documentMessageJms.getObjectType())){ final ProductSku productSku = productService.getProductSkuById(objectId, FetchPlanGraphProduct.fullIndexedProductSkuFetchPlan()); if(productSku != null){ final ProductMarketing productMarketing = productService.getProductMarketingById(productSku.getProductMarketing().getId(), FetchPlanGraphProduct.fullIndexedProductMarketingFetchPlan()); List<CatalogCategoryVirtual> catalogCategories = catalogCategoryService.findVirtualCategoriesByProductSkuId(productSku.getId(), new FetchPlan(categoryFetchPlans)); try { productSkuSolrService.addOrUpdateProductSku(productMarketing, productSku, catalogCategories, null, null); } catch (SolrServerException e) { logger.error("Processed message to indexing failed, value: " + valueJMSMessage); } // AND UPDATE THE PRODUCT MARKETING - AGREGATE SKU OPTIONS ! if(productMarketing != null){ List<ProductSku> productSkus = new ArrayList<ProductSku>(); for (Iterator<ProductSku> iteratorProductSku = productMarketing.getProductSkus().iterator(); iteratorProductSku.hasNext();) { ProductSku productSkuIterator = (ProductSku) iteratorProductSku.next(); final ProductSku reloadedProductSku = productService.getProductSkuByCode(productSkuIterator.getCode(), FetchPlanGraphProduct.fullIndexedProductSkuFetchPlan()); productSkus.add(reloadedProductSku); } try { productMarketingSolrService.addOrUpdateProductMarketing(productMarketing, productSkus, catalogCategories, null, null); } catch (SolrServerException e) { logger.error("Processed message to indexing failed, value: " + valueJMSMessage); } } } } else if("Store".equals(documentMessageJms.getObjectType())){ final Store store = retailerService.getStoreById(objectId, new FetchPlan(storeFetchPlans)); if(store != null){ try { storeSolrService.addOrUpdateStore(store); } catch (SolrServerException e) { logger.error("Processed message to indexing failed, value: " + valueJMSMessage); } } } if (logger.isDebugEnabled()) { logger.debug("Processed message, value: " + valueJMSMessage); } } else { logger.warn("Document generation: Jms Message is empty"); } } } catch (JMSException e) { logger.error(e.getMessage(), e); } catch (IOException e) { logger.error(e.getMessage(), e); } } @Override public void exceptionThrown(Exception e) { logger.debug("Exception on queue listener: " + e.getCause() + ":" + e.getLocalizedMessage()); } }