package com.idega.content.business; import java.io.InputStream; import org.apache.webdav.lib.WebdavResource; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Repository; import com.idega.business.IBOLookup; import com.idega.core.business.DefaultSpringBean; import com.idega.core.file.util.MimeTypeUtil; import com.idega.graphics.image.business.ImageResizer; import com.idega.presentation.IWContext; import com.idega.slide.business.IWSlideService; import com.idega.util.CoreConstants; import com.idega.util.CoreUtil; import com.idega.util.StringUtil; import com.idega.util.expression.ELUtil; @Repository(ThumbnailService.BEAN_NAME) @Scope(BeanDefinition.SCOPE_SINGLETON) public class ThumbnailService extends DefaultSpringBean { public static final String BEAN_NAME = "thumbnailService"; public static final int THUMBNAIL_SMALL = 50; public static final int THUMBNAIL_MEDIUM = 100; private static final String THUMBNAILS_FOLDER_NAME = "idega_thumbnails"; private int getSize(int size){ if(size > 0){ return size; } return THUMBNAIL_MEDIUM; } /** * Method that gets thumbnail uri if it exists or creates if it does not exists. * @param filePath - path to file which thumbnail will be displayed * @param thumbnailSize - height in pixels * @param iwc - {@link com.idega.presentation.IWContext} * @return uri to thunbnail or empty string if file does not exists * @throws Exception if something goes wrong */ public String getThumbnail(String filePath,int thumbnailSize,IWContext iwc) throws Exception{ if(StringUtil.isEmpty(filePath)){ return CoreConstants.EMPTY; } thumbnailSize = getSize(thumbnailSize); String mimeType = MimeTypeUtil.resolveMimeTypeFromFileName(filePath); if(StringUtil.isEmpty(mimeType)){ return getUnknownThumbnailUri(thumbnailSize,iwc); } if(mimeType.toLowerCase().contains("image")){ String thumbnailPath = getImageThumbnailUri(filePath, thumbnailSize, iwc, mimeType); if(!thumbnailPath.startsWith(CoreConstants.SLASH)){ thumbnailPath = CoreConstants.SLASH + thumbnailPath; } if(!thumbnailPath.startsWith("/content")){ thumbnailPath = CoreConstants.WEBDAV_SERVLET_URI + thumbnailPath; } return thumbnailPath; } return getUnknownThumbnailUri(thumbnailSize,iwc); } private String getUnknownThumbnailUri(int thumbnailSize,IWContext iwc){ //TODO: not implemented return ""; } private String getImageThumbnailUri(String filePath,int thumbnailSize,IWContext iwc,String mimeType) throws Exception{ if(iwc == null){ iwc = CoreUtil.getIWContext(); } String thumbnailPath = getThumBnailPath(filePath, thumbnailSize); IWSlideService iwSlideService = IBOLookup.getServiceInstance(iwc, IWSlideService.class); boolean exists = iwSlideService.getExistence(thumbnailPath); if(exists){ return thumbnailPath; } return generateImageThumbnail(filePath, thumbnailPath, thumbnailSize, iwc, iwSlideService, mimeType); } private String generateImageThumbnail(String filePath, String thumbnailPath, int thumbnailSize,IWContext iwc,IWSlideService iwSlideService,String mimeType) throws Exception{ WebdavResource file = iwSlideService.getWebdavResourceAuthenticatedAsRoot(filePath); InputStream input = file.getMethodData(); InputStream image = ELUtil.getInstance().getBean(ImageResizer.class).getScaledImageIfBigger(thumbnailSize, input, getImageType(mimeType)); iwSlideService.uploadFile(thumbnailPath.substring(0,thumbnailPath.lastIndexOf(CoreConstants.SLASH)+1), getFileName(thumbnailPath), mimeType, image); return thumbnailPath; } private String getImageType(String mimeType){ return mimeType.substring(mimeType.indexOf(CoreConstants.SLASH)+1, mimeType.length() ); } private String getThumbnailsFolder(String filePath){ return filePath.substring(0,filePath.lastIndexOf(CoreConstants.SLASH)) + CoreConstants.SLASH + THUMBNAILS_FOLDER_NAME; } private String getThumBnailPath(String filePath,int thumbnailSize){ return new StringBuilder(getThumbnailsFolder(filePath)).append(CoreConstants.SLASH) .append(thumbnailSize).append(CoreConstants.UNDER).append(getFileName(filePath)).toString(); } private String getFileName(String filePath){ if(!filePath.contains(CoreConstants.SLASH)){ return filePath; } return filePath.substring(filePath.lastIndexOf(CoreConstants.SLASH) + 1, filePath.length()); } }