package com.salesmanager.shop.populator.catalog;
import com.salesmanager.core.business.exception.ConversionException;
import com.salesmanager.core.business.services.catalog.category.CategoryService;
import com.salesmanager.core.business.services.reference.language.LanguageService;
import com.salesmanager.core.business.utils.AbstractDataPopulator;
import com.salesmanager.core.model.catalog.category.Category;
import com.salesmanager.core.model.merchant.MerchantStore;
import com.salesmanager.core.model.reference.language.Language;
import com.salesmanager.shop.model.catalog.category.CategoryDescription;
import com.salesmanager.shop.model.catalog.category.PersistableCategory;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang.Validate;
import org.apache.commons.lang3.StringUtils;
import java.util.ArrayList;
import java.util.List;
public class PersistableCategoryPopulator extends
AbstractDataPopulator<PersistableCategory, Category> {
private CategoryService categoryService;
private LanguageService languageService;
public void setCategoryService(CategoryService categoryService) {
this.categoryService = categoryService;
}
public CategoryService getCategoryService() {
return categoryService;
}
public void setLanguageService(LanguageService languageService) {
this.languageService = languageService;
}
public LanguageService getLanguageService() {
return languageService;
}
@Override
public Category populate(PersistableCategory source, Category target,
MerchantStore store, Language language)
throws ConversionException {
try {
Validate.notNull(categoryService, "Requires to set CategoryService");
Validate.notNull(languageService, "Requires to set LanguageService");
target.setMerchantStore(store);
target.setCode(source.getCode());
target.setSortOrder(source.getSortOrder());
target.setVisible(source.isVisible());
//get parent
if(source.getParent()==null) {
target.setParent(null);
target.setLineage("/");
target.setDepth(0);
} else {
Category parent = null;
if(!StringUtils.isBlank(source.getParent().getCode())) {
parent = categoryService.getByCode(store.getCode(), source.getParent().getCode());
} else if(source.getParent().getId()!=null) {
parent = categoryService.getById(source.getParent().getId());
} else {
throw new ConversionException("Category parent needs at least an id or a code for reference");
}
if(parent !=null && parent.getMerchantStore().getId().intValue()!=store.getId().intValue()) {
throw new ConversionException("Store id does not belong to specified parent id");
}
if(parent!=null) {
target.setParent(parent);
String lineage = parent.getLineage();
int depth = parent.getDepth();
target.setDepth(depth+1);
target.setLineage(new StringBuilder().append(lineage).append(parent.getId()).append("/").toString());
}
}
if(!CollectionUtils.isEmpty(source.getChildren())) {
for(PersistableCategory cat : source.getChildren()) {
Category persistCategory = this.populate(cat, new Category(), store, language);
target.getCategories().add(persistCategory);
}
}
if(!CollectionUtils.isEmpty(source.getDescriptions())) {
List<com.salesmanager.core.model.catalog.category.CategoryDescription> descriptions = new ArrayList<com.salesmanager.core.model.catalog.category.CategoryDescription>();
for(CategoryDescription description : source.getDescriptions()) {
com.salesmanager.core.model.catalog.category.CategoryDescription desc = new com.salesmanager.core.model.catalog.category.CategoryDescription();
desc.setCategory(target);
desc.setCategoryHighlight(description.getHighlights());
desc.setDescription(description.getDescription());
desc.setName(description.getName());
desc.setMetatagDescription(description.getMetaDescription());
desc.setMetatagTitle(description.getTitle());
desc.setSeUrl(description.getFriendlyUrl());
Language lang = languageService.getByCode(description.getLanguage());
if(lang==null) {
throw new ConversionException("Language is null for code " + description.getLanguage() + " use language ISO code [en, fr ...]");
}
desc.setLanguage(lang);
descriptions.add(desc);
}
target.setDescriptions(descriptions);
}
return target;
} catch(Exception e) {
throw new ConversionException(e);
}
}
@Override
protected Category createTarget() {
// TODO Auto-generated method stub
return null;
}
}