package com.salesmanager.core.business.services.catalog.product.image;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import javax.inject.Inject;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import org.springframework.util.Assert;
import com.salesmanager.core.business.exception.ServiceException;
import com.salesmanager.core.business.modules.cms.product.ProductFileManager;
import com.salesmanager.core.business.repositories.catalog.product.image.ProductImageRepository;
import com.salesmanager.core.business.services.common.generic.SalesManagerEntityServiceImpl;
import com.salesmanager.core.model.catalog.product.Product;
import com.salesmanager.core.model.catalog.product.file.ProductImageSize;
import com.salesmanager.core.model.catalog.product.image.ProductImage;
import com.salesmanager.core.model.catalog.product.image.ProductImageDescription;
import com.salesmanager.core.model.content.FileContentType;
import com.salesmanager.core.model.content.ImageContentFile;
import com.salesmanager.core.model.content.OutputContentFile;
@Service("productImage")
public class ProductImageServiceImpl extends SalesManagerEntityServiceImpl<Long, ProductImage>
implements ProductImageService {
private ProductImageRepository productImageRepository;
@Inject
public ProductImageServiceImpl(ProductImageRepository productImageRepository) {
super(productImageRepository);
this.productImageRepository = productImageRepository;
}
@Inject
private ProductFileManager productFileManager;
public ProductImage getById(Long id) {
return productImageRepository.findOne(id);
}
@Override
public void addProductImages(Product product, List<ProductImage> productImages) throws ServiceException {
try {
for(ProductImage productImage : productImages) {
Assert.notNull(productImage.getImage());
InputStream inputStream = productImage.getImage();
ImageContentFile cmsContentImage = new ImageContentFile();
cmsContentImage.setFileName( productImage.getProductImage() );
cmsContentImage.setFile( inputStream );
cmsContentImage.setFileContentType(FileContentType.PRODUCT);
addProductImage(product,productImage,cmsContentImage);
}
} catch (Exception e) {
throw new ServiceException(e);
}
}
@Override
public void addProductImage(Product product, ProductImage productImage, ImageContentFile inputImage) throws ServiceException {
productImage.setProduct(product);
try {
Assert.notNull(inputImage.getFile(),"ImageContentFile.file cannot be null");
productFileManager.addProductImage(productImage, inputImage);
//insert ProductImage
this.saveOrUpdate(productImage);
} catch (Exception e) {
throw new ServiceException(e);
} finally {
try {
if(inputImage.getFile()!=null) {
inputImage.getFile().close();
}
} catch(Exception ignore) {
}
}
}
@Override
public void saveOrUpdate(ProductImage productImage) throws ServiceException {
super.save(productImage);
}
public void addProductImageDescription(ProductImage productImage, ProductImageDescription description)
throws ServiceException {
if(productImage.getDescriptions()==null) {
productImage.setDescriptions(new ArrayList<ProductImageDescription>());
}
productImage.getDescriptions().add(description);
description.setProductImage(productImage);
update(productImage);
}
//TODO get default product image
@Override
public OutputContentFile getProductImage(ProductImage productImage, ProductImageSize size) throws ServiceException {
ProductImage pi = new ProductImage();
String imageName = productImage.getProductImage();
if(size == ProductImageSize.LARGE) {
imageName = "L-" + imageName;
}
if(size == ProductImageSize.SMALL) {
imageName = "S-" + imageName;
}
pi.setProductImage(imageName);
pi.setProduct(productImage.getProduct());
OutputContentFile outputImage = productFileManager.getProductImage(pi);
return outputImage;
}
@Override
public OutputContentFile getProductImage(final String storeCode, final String productCode, final String fileName, final ProductImageSize size) throws ServiceException {
OutputContentFile outputImage = productFileManager.getProductImage(storeCode, productCode, fileName, size);
return outputImage;
}
@Override
public List<OutputContentFile> getProductImages(Product product) throws ServiceException {
return productFileManager.getImages(product);
}
@Override
public void removeProductImage(ProductImage productImage) throws ServiceException {
if(!StringUtils.isBlank(productImage.getProductImage())) {
productFileManager.removeProductImage(productImage);//managed internally
}
ProductImage p = this.getById(productImage.getId());
this.delete(p);
}
}