package com.salesmanager.core.business.services.content; import java.util.List; import javax.inject.Inject; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service; import org.springframework.util.Assert; import com.salesmanager.core.business.exception.ServiceException; import com.salesmanager.core.business.modules.cms.content.StaticContentFileManager; import com.salesmanager.core.business.repositories.content.ContentRepository; import com.salesmanager.core.business.services.common.generic.SalesManagerEntityServiceImpl; import com.salesmanager.core.model.content.Content; import com.salesmanager.core.model.content.ContentDescription; import com.salesmanager.core.model.content.ContentType; import com.salesmanager.core.model.content.FileContentType; import com.salesmanager.core.model.content.InputContentFile; import com.salesmanager.core.model.content.OutputContentFile; import com.salesmanager.core.model.merchant.MerchantStore; import com.salesmanager.core.model.reference.language.Language; @Service( "contentService" ) public class ContentServiceImpl extends SalesManagerEntityServiceImpl<Long, Content> implements ContentService { private static final Logger LOG = LoggerFactory.getLogger( ContentServiceImpl.class ); private final ContentRepository contentRepository; @Inject StaticContentFileManager staticContentFileManager; @Inject StaticContentFileManager contentFileManager; @Inject public ContentServiceImpl( ContentRepository contentRepository ) { super( contentRepository ); this.contentRepository = contentRepository; } @Override public List<Content> listByType( ContentType contentType, MerchantStore store, Language language ) throws ServiceException { return contentRepository.findByType( contentType, store.getId(), language.getId() ); } @Override public void delete(Content content) throws ServiceException { Content c = this.getById(content.getId()); super.delete(c); } @Override public Content getByLanguage(Long id, Language language) throws ServiceException { return contentRepository.findByIdAndLanguage(id, language.getId()); } @Override public List<Content> listByType( List<ContentType> contentType, MerchantStore store, Language language ) throws ServiceException { /* List<String> contentTypes = new ArrayList<String>(); for (int i = 0; i < contentType.size(); i++) { contentTypes.add(contentType.get(i).name()); }*/ return contentRepository.findByTypes( contentType, store.getId(), language.getId() ); } @Override public List<ContentDescription> listNameByType( List<ContentType> contentType, MerchantStore store, Language language ) throws ServiceException { return contentRepository.listNameByType(contentType, store, language); } @Override public List<Content> listByType( List<ContentType> contentType, MerchantStore store ) throws ServiceException { /* List<String> contentTypes = new ArrayList<String>(); for (int i = 0; i < contentType.size(); i++) { contentTypes.add(contentType.get(i).name()); }*/ return contentRepository.findByTypes( contentType, store.getId() ); } @Override public Content getByCode( String code, MerchantStore store ) throws ServiceException { return contentRepository.findByCode( code, store.getId() ); } @Override public Content getById( Long id ) { return contentRepository.findOne(id); } @Override public void saveOrUpdate( final Content content ) throws ServiceException { // save or update (persist and attach entities if ( content.getId() != null && content.getId() > 0 ) { super.update( content ); } else { super.save( content ); } } @Override public Content getByCode( String code, MerchantStore store, Language language ) throws ServiceException { return contentRepository.findByCode( code, store.getId(), language.getId() ); } /** * Method responsible for adding content file for given merchant store in underlying Infinispan tree * cache. It will take {@link InputContentFile} and will store file for given merchant store according to its type. * it can save an image or any type of file (pdf, css, js ...) * @param merchantStoreCode Merchant store * @param contentFile {@link InputContentFile} being stored * @throws ServiceException service exception */ @Override public void addContentFile( String merchantStoreCode, InputContentFile contentFile ) throws ServiceException { Assert.notNull( merchantStoreCode, "Merchant store Id can not be null" ); Assert.notNull( contentFile, "InputContentFile image can not be null" ); Assert.notNull( contentFile.getFileContentType(), "InputContentFile.fileContentType can not be null" ); if(contentFile.getFileContentType().name().equals(FileContentType.IMAGE.name()) || contentFile.getFileContentType().name().equals(FileContentType.STATIC_FILE.name())) { addFile(merchantStoreCode,contentFile); } else { addImage(merchantStoreCode,contentFile); } } @Override public void addLogo( String merchantStoreCode, InputContentFile cmsContentImage ) throws ServiceException { Assert.notNull( merchantStoreCode, "Merchant store Id can not be null" ); Assert.notNull( cmsContentImage, "CMSContent image can not be null" ); cmsContentImage.setFileContentType(FileContentType.LOGO); addImage(merchantStoreCode,cmsContentImage); } @Override public void addOptionImage( String merchantStoreCode, InputContentFile cmsContentImage ) throws ServiceException { Assert.notNull( merchantStoreCode, "Merchant store Id can not be null" ); Assert.notNull( cmsContentImage, "CMSContent image can not be null" ); cmsContentImage.setFileContentType(FileContentType.PROPERTY); addImage(merchantStoreCode,cmsContentImage); } private void addImage( String merchantStoreCode, InputContentFile contentImage ) throws ServiceException { try { LOG.info( "Adding content image for merchant id {}", merchantStoreCode); contentFileManager.addFile( merchantStoreCode, contentImage ); } catch ( Exception e ) { LOG.error( "Error while trying to convert input stream to buffered image", e ); throw new ServiceException( e ); } finally { try { if(contentImage.getFile()!=null) { contentImage.getFile().close(); } } catch (Exception ignore) {} } } private void addFile(final String merchantStoreCode, InputContentFile contentImage ) throws ServiceException { try { LOG.info( "Adding content file for merchant id {}", merchantStoreCode); staticContentFileManager.addFile(merchantStoreCode, contentImage); } catch ( Exception e ) { LOG.error( "Error while trying to convert input stream to buffered image", e ); throw new ServiceException( e ); } finally { try { if(contentImage.getFile()!=null) { contentImage.getFile().close(); } } catch (Exception ignore) {} } } /** * Method responsible for adding list of content images for given merchant store in underlying Infinispan tree * cache. It will take list of {@link CMSContentImage} and will store them for given merchant store. * * @param merchantStoreCode Merchant store * @param contentImagesList list of {@link CMSContentImage} being stored * @throws ServiceException service exception */ @Override public void addContentFiles(String merchantStoreCode, List<InputContentFile> contentFilesList) throws ServiceException { Assert.notNull( merchantStoreCode, "Merchant store ID can not be null" ); Assert.notEmpty( contentFilesList, "File list can not be empty" ); LOG.info( "Adding total {} images for given merchant",contentFilesList.size() ); LOG.info( "Adding content images for merchant...." ); //contentFileManager.addImages( merchantStoreCode, contentImagesList ); staticContentFileManager.addFiles(merchantStoreCode, contentFilesList); try { for(InputContentFile file : contentFilesList) { if(file.getFile()!=null) { file.getFile().close(); } } } catch (Exception e) { throw new ServiceException(e); } } /** * Method to remove given content image.Images are stored in underlying system based on there name. * Name will be used to search given image for removal * @param contentImage * @param merchantStoreCode merchant store * @throws ServiceException */ @Override public void removeFile(String merchantStoreCode, FileContentType fileContentType, String fileName) throws ServiceException { Assert.notNull( merchantStoreCode, "Merchant Store Id can not be null" ); Assert.notNull( fileContentType, "Content file type can not be null" ); Assert.notNull( fileName, "Content Image type can not be null" ); //check where to remove the file if(fileContentType.name().equals(FileContentType.IMAGE.name()) || fileContentType.name().equals(FileContentType.STATIC_FILE.name())) { staticContentFileManager.removeFile(merchantStoreCode, fileContentType, fileName); } else { contentFileManager.removeFile( merchantStoreCode, fileContentType, fileName ); } } /** * Method to remove all images for a given merchant.It will take merchant store as an input and will * remove all images associated with given merchant store. * * @param merchantStoreCode * @throws ServiceException */ @Override public void removeFiles(String merchantStoreCode) throws ServiceException { Assert.notNull( merchantStoreCode, "Merchant Store Id can not be null" ); contentFileManager.removeFiles( merchantStoreCode ); staticContentFileManager.removeFiles(merchantStoreCode); } /** * Implementation for getContentImage method defined in {@link ContentService} interface. Methods will return * Content image with given image name for the Merchant store or will return null if no image with given name found * for requested Merchant Store in Infinispan tree cache. * * @param store Merchant merchantStoreCode * @param imageName name of requested image * @return {@link OutputContentImage} * @throws ServiceException */ @Override public OutputContentFile getContentFile(String merchantStoreCode, FileContentType fileContentType, String fileName) throws ServiceException { Assert.notNull( merchantStoreCode, "Merchant store ID can not be null" ); Assert.notNull( fileName, "File name can not be null" ); if(fileContentType.name().equals(FileContentType.IMAGE.name()) || fileContentType.name().equals(FileContentType.STATIC_FILE.name())) { return staticContentFileManager.getFile(merchantStoreCode, fileContentType, fileName); } else { return contentFileManager.getFile( merchantStoreCode, fileContentType, fileName ); } } /** * Implementation for getContentImages method defined in {@link ContentService} interface. Methods will return list of all * Content image associated with given Merchant store or will return empty list if no image is associated with * given Merchant Store in Infinispan tree cache. * * @param merchantStoreId Merchant store * @return list of {@link OutputContentImage} * @throws ServiceException */ @Override public List<OutputContentFile> getContentFiles(String merchantStoreCode, FileContentType fileContentType) throws ServiceException { Assert.notNull( merchantStoreCode, "Merchant store Id can not be null" ); return staticContentFileManager.getFiles(merchantStoreCode, fileContentType); } /** * Returns the image names for a given merchant and store * @param merchantStoreCode * @param imageContentType * @return images name list * @throws ServiceException */ @Override public List<String> getContentFilesNames(String merchantStoreCode, FileContentType fileContentType) throws ServiceException { Assert.notNull( merchantStoreCode, "Merchant store Id can not be null" ); if(fileContentType.name().equals(FileContentType.IMAGE.name()) || fileContentType.name().equals(FileContentType.STATIC_FILE.name())) { return staticContentFileManager.getFileNames(merchantStoreCode, fileContentType); } else { return contentFileManager.getFileNames(merchantStoreCode, fileContentType); } } @Override public ContentDescription getBySeUrl(MerchantStore store,String seUrl) { return contentRepository.getBySeUrl(store, seUrl); } }