/** * Copyright (c)2010-2011 Enterprise Website Content Management System(EWCMS), All rights reserved. * EWCMS PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. * http://www.ewcms.com */ package com.ewcms.content.resource.service; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.sql.Date; import java.util.ArrayList; import java.util.List; import java.util.Map; import org.apache.commons.io.FileUtils; import org.apache.commons.lang.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.util.Assert; import com.ewcms.common.io.ImageUtil; import com.ewcms.content.resource.dao.ResourceDAO; import com.ewcms.content.resource.dao.ResourceDAOable; import com.ewcms.content.resource.model.Resource; import com.ewcms.content.resource.model.Resource.Status; import com.ewcms.content.resource.model.Resource.Type; import com.ewcms.content.resource.service.operator.FileOperator; import com.ewcms.content.resource.service.operator.ResourceOperatorable; import com.ewcms.core.site.model.Site; import com.ewcms.publication.uri.UriRules; import com.ewcms.web.util.EwcmsContextUtil; /** * 实现资源管理 * * @author 吴智俊 王伟 */ @Service public class ResourceService implements ResourceServiceable { private static final Logger logger = LoggerFactory.getLogger(ResourceService.class); private static final String DEFAULT_RESOUCE_CONTEXT = "pub_res"; private static final String DEFAULT_THUMB_SUFFIX="_thumb"; @Autowired private ResourceDAOable resourceDao; private Site getCurrentSite() { Site site = EwcmsContextUtil.getCurrentSite(); logger.debug("Current site is {}",site); return site; } private String getResourceContext(){ //TODO Get resource context return DEFAULT_RESOUCE_CONTEXT; } private String getThumbSuffix(){ return DEFAULT_THUMB_SUFFIX; } /** * 通过路径得到文件名 * * @param path 文件路径 * @return */ String getFilename(String path) { String[] names = path.split("/"); return names[names.length - 1]; } /** * 得到引导图Uri * * @param uri 统一资源资源地址 * @return */ String getThumbUri(String uri){ int index = StringUtils.lastIndexOf(uri, '.'); if(index == -1){ return uri+getThumbSuffix(); }else{ return StringUtils.overlay(uri, getThumbSuffix(), index,index); } } /** * 上传图片压缩 * * @param site 站点 * @param uri 图片地址 * @param path 图片地址 * @return 压缩图片地址 */ private String imageCompression(Site site,String uri,String path){ String thumbUri = getThumbUri(uri); String imagePath = Resource.resourcePath(site, thumbUri); boolean success = ImageUtil.compression(path, imagePath, 128, 128); return success ? thumbUri : uri; } /** * 得到文件后缀名 * * @param name 文件名 * @return */ String getSuffix(String name) { if (StringUtils.contains(name, ".")) { return StringUtils.substringAfterLast(name, "."); }else{ return ""; } } @Override public Resource uplaod(File file, String path, Resource.Type type) throws IOException { Site site = getCurrentSite(); ResourceOperatorable operator = new FileOperator(site.getResourceDir()); String name = getFilename(path); String uri = operator.write(new FileInputStream(file), UriRules.newResource(getResourceContext()),getSuffix(name)); Resource resource = new Resource(); resource.setUri(uri); resource.setSize(file.length()); resource.setName(name); resource.setDescription(name); resource.setType(type); resource.setSite(site); if (type == Resource.Type.IMAGE) { resource.setThumbUri(imageCompression(site,uri,file.getPath())); } resourceDao.persist(resource); return resource; } @Override public Resource upload(Site site, File file, String path, Type type) throws IOException{ ResourceOperatorable operator = new FileOperator(site.getResourceDir()); String name = getFilename(path); String uri = operator.write(new FileInputStream(file), UriRules.newResource(getResourceContext()),getSuffix(name)); Resource resource = new Resource(); resource.setUri(uri); resource.setSize(file.length()); resource.setName(name); resource.setDescription(name); resource.setType(type); resource.setStatus(Status.NORMAL); resource.setSite(site); if (type == Resource.Type.IMAGE) { resource.setThumbUri(imageCompression(site,uri,file.getPath())); } resourceDao.persist(resource); return resource; } @Override public Resource update(Integer id, File file, String path, Resource.Type type)throws IOException { Resource resource = resourceDao.get(id); Assert.notNull(resource,"Resourc is not exist,id = " + id); FileUtils.copyFile(file, new File(resource.getPath())); if (type == Resource.Type.IMAGE) { if(resource.getPath().equals(resource.getThumbPath())){ String thumbUri = getThumbUri(resource.getUri()); String thumbPath = Resource.resourcePath(resource.getSite(), thumbUri); if(ImageUtil.compression(file.getPath(), thumbPath, 128, 128)){ resource.setThumbUri(thumbUri); } }else{ if(!ImageUtil.compression(file.getPath(), resource.getThumbPath(), 128, 128)){ FileUtils.forceDeleteOnExit(new File(resource.getThumbPath())); resource.setThumbUri(resource.getUri()); } } } resource.setStatus(Status.NORMAL); resource.setUpdateTime(new Date(System.currentTimeMillis())); resource.setName(getFilename(path)); resourceDao.persist(resource); return resource; } @Override public Resource updateThumb(Integer id,File file, String path) throws IOException { Resource resource = resourceDao.get(id); Assert.notNull(resource,"Resourc is not exist,id = " + id); String thumbPath = resource.getThumbPath(); Site site = getCurrentSite(); ResourceOperatorable operator = new FileOperator(site.getResourceDir()); if(StringUtils.isBlank(thumbPath)){ String name = getFilename(path); String uri = operator.write(new FileInputStream(file), UriRules.newResourceThumb(getResourceContext()),getSuffix(name)); resource.setThumbUri(uri); resource.setThumbPath(Resource.resourcePath(site, uri)); }else{ FileUtils.copyFile(file, new File(thumbPath)); } resource.setStatus(Status.NORMAL); resourceDao.persist(resource); return resource; } @Override public List<Resource> save(Map<Integer, String> descriptions) { List<Resource> resources = new ArrayList<Resource>(); for (Integer id : descriptions.keySet()) { Resource resource = resourceDao.get(id); if(resource == null || resource.getStatus() == Status.DELETE){ continue; } String desc = descriptions.get(id); resource.setStatus(Status.NORMAL); resource.setDescription(desc); resourceDao.persist(resource); resources.add(resource); } return resources; } /** * 删除属与资源的文件 * * @param resource */ private void deleteResourceFile(Resource resource){ File f = new File(resource.getPath()); f.deleteOnExit(); if(StringUtils.isNotBlank(resource.getThumbPath())){ f = new File(resource.getThumbPath()); f.deleteOnExit(); } } @Override public void delete(int[] ids) { for(int id : ids){ Resource resource = getResource(id); deleteResourceFile(resource); resourceDao.remove(resource); if(resource.getStatus() == Resource.Status.RELEASED){ //TODO 写入删除日志,下架该资源 } } } @Override public Resource getResource(Integer id) { return resourceDao.get(id); } @Override public Resource updateDescription(Integer id, String description) { Resource resource = getResource(id); resource.setDescription(description); resourceDao.persist(resource); return resource; } @Override public void softDelete(int[] ids) { for(int id : ids){ Resource resource = getResource(id); resource.setStatus(Resource.Status.DELETE); resourceDao.persist(resource); } } @Override public void clearSoftDelete() { Integer siteId = getCurrentSite().getId(); List<Resource> resources = resourceDao.findSoftDeleteResources(siteId); for(Resource res : resources){ deleteResourceFile(res); resourceDao.remove(res); } } @Override public void revert(int[] ids) { for(int id : ids){ Resource resource = getResource(id); if(resource.getStatus() == Resource.Status.DELETE){ resource.setStatus(Resource.Status.NORMAL); resourceDao.persist(resource); } } } @Override public List<Resource> findPublishResources(Integer siteId, Boolean forceAgain) { return resourceDao.findPublishResources(siteId,forceAgain); } @Override public void publishResourceSuccess(Integer id) { Resource resource = resourceDao.get(id); resource.setStatus(Resource.Status.RELEASED); resource.setPublishTime(new Date(System.currentTimeMillis())); resourceDao.persist(resource); } @Override public Resource getResourceByUri(String uri) { Site site = getCurrentSite(); Integer siteId = site.getId(); return resourceDao.getResourceByUri(siteId, uri); } public void setResourceDao(ResourceDAO dao) { this.resourceDao = dao; } }