package com.salesmanager.core.business.modules.cms.product.local; import java.io.IOException; import java.io.InputStream; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.nio.file.StandardCopyOption; import java.util.List; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.salesmanager.core.business.constants.Constants; import com.salesmanager.core.business.exception.ServiceException; import com.salesmanager.core.business.modules.cms.impl.LocalCacheManagerImpl; import com.salesmanager.core.business.modules.cms.product.ProductImageGet; import com.salesmanager.core.business.modules.cms.product.ProductImagePut; import com.salesmanager.core.business.modules.cms.product.ProductImageRemove; 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.content.FileContentType; import com.salesmanager.core.model.content.ImageContentFile; import com.salesmanager.core.model.content.OutputContentFile; import com.salesmanager.core.model.merchant.MerchantStore; /** * Manager for storing and deleting image files from the CMS which is a web server * * Manages * - Product images * @author Carl Samson */ public class CmsImageFileManagerImpl implements ProductImagePut, ProductImageGet, ProductImageRemove { private static final Logger LOGGER = LoggerFactory.getLogger( CmsImageFileManagerImpl.class ); private static CmsImageFileManagerImpl fileManager = null; private final static String ROOT_NAME = ""; private final static String SMALL = "SMALL"; private final static String LARGE = "LARGE"; private static final String ROOT_CONTAINER = "products"; private String rootName = ROOT_NAME; private LocalCacheManagerImpl cacheManager; public static CmsImageFileManagerImpl getInstance() { if ( fileManager == null ) { fileManager = new CmsImageFileManagerImpl(); } return fileManager; } private CmsImageFileManagerImpl() { } /** * root/products/<merchant id>/<product id>/1.jpg */ @Override public void addProductImage( ProductImage productImage, ImageContentFile contentImage ) throws ServiceException { try { //base path String rootPath = this.buildRootPath(); Path confDir = Paths.get(rootPath); this.createDirectoryIfNorExist(confDir); //node path StringBuilder nodePath = new StringBuilder(); nodePath .append(rootPath) .append(productImage.getProduct().getMerchantStore().getCode()); Path merchantPath = Paths.get(nodePath.toString()); this.createDirectoryIfNorExist(merchantPath); //product path nodePath.append(Constants.SLASH).append(productImage.getProduct().getSku()).append(Constants.SLASH); Path dirPath = Paths.get(nodePath.toString()); this.createDirectoryIfNorExist(dirPath); //small large if(contentImage.getFileContentType().name().equals(FileContentType.PRODUCT.name())) { nodePath.append(SMALL); } else if(contentImage.getFileContentType().name().equals(FileContentType.PRODUCTLG.name())) { nodePath.append(LARGE); } Path sizePath = Paths.get(nodePath.toString()); this.createDirectoryIfNorExist(sizePath); //file creation nodePath.append(Constants.SLASH).append(contentImage.getFileName()); Path path = Paths.get(nodePath.toString()); InputStream isFile = contentImage.getFile(); Files.copy(isFile, path, StandardCopyOption.REPLACE_EXISTING); } catch ( Exception e ) { throw new ServiceException( e ); } } @Override public OutputContentFile getProductImage( ProductImage productImage ) throws ServiceException { //the web server takes care of the images return null; } public List<OutputContentFile> getImages( MerchantStore store, FileContentType imageContentType ) throws ServiceException { //the web server takes care of the images return null; } @Override public List<OutputContentFile> getImages( Product product ) throws ServiceException { //the web server takes care of the images return null; } @Override public void removeImages( final String merchantStoreCode ) throws ServiceException { try { StringBuilder merchantPath = new StringBuilder(); merchantPath.append(buildRootPath()) .append(Constants.SLASH) .append(merchantStoreCode); Path path = Paths.get(merchantPath.toString()); Files.deleteIfExists(path); } catch ( Exception e ) { throw new ServiceException( e ); } } @Override public void removeProductImage( ProductImage productImage ) throws ServiceException { try { StringBuilder nodePath = new StringBuilder(); nodePath.append(buildRootPath()) .append(Constants.SLASH) .append(productImage.getProduct().getMerchantStore().getCode()).append(Constants.SLASH).append(productImage.getProduct().getSku()); //delete small StringBuilder smallPath = new StringBuilder(nodePath); smallPath.append(Constants.SLASH).append(SMALL).append(Constants.SLASH).append(productImage.getProductImage()); Path path = Paths.get(smallPath.toString()); Files.deleteIfExists(path); //delete large StringBuilder largePath = new StringBuilder(nodePath); largePath.append(Constants.SLASH).append(LARGE).append(Constants.SLASH).append(productImage.getProductImage()); path = Paths.get(largePath.toString()); Files.deleteIfExists(path); } catch ( Exception e ) { throw new ServiceException( e ); } } @Override public void removeProductImages( Product product ) throws ServiceException { try { StringBuilder nodePath = new StringBuilder(); nodePath.append(buildRootPath()) .append(Constants.SLASH) .append(product.getMerchantStore().getCode()).append(Constants.SLASH).append(product.getSku()); Path path = Paths.get(nodePath.toString()); Files.deleteIfExists(path); } catch ( Exception e ) { throw new ServiceException( e ); } } @Override public List<OutputContentFile> getImages(final String merchantStoreCode, FileContentType imageContentType) throws ServiceException { //the web server taks care of the images return null; } @Override public OutputContentFile getProductImage(String merchantStoreCode, String productCode, String imageName) throws ServiceException { return getProductImage(merchantStoreCode, productCode, imageName, ProductImageSize.SMALL.name()); } @Override public OutputContentFile getProductImage(String merchantStoreCode, String productCode, String imageName, ProductImageSize size) throws ServiceException { return getProductImage(merchantStoreCode, productCode, imageName, size.name()); } private OutputContentFile getProductImage(String merchantStoreCode, String productCode, String imageName, String size) throws ServiceException { return null; } private String buildRootPath() { return new StringBuilder().append(getRootName()).append(Constants.SLASH).append(ROOT_CONTAINER).append(Constants.SLASH).toString(); } private void createDirectoryIfNorExist(Path path) throws IOException { if (Files.notExists(path)) { Files.createDirectory(path); } } public void setRootName(String rootName) { this.rootName = rootName; } public String getRootName() { return rootName; } public LocalCacheManagerImpl getCacheManager() { return cacheManager; } public void setCacheManager(LocalCacheManagerImpl cacheManager) { this.cacheManager = cacheManager; } }