/**
* 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());
}
}