package com.mossle.disk.web;
import java.io.InputStream;
import java.util.Date;
import java.util.List;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.mossle.api.store.StoreConnector;
import com.mossle.api.tenant.TenantHolder;
import com.mossle.core.auth.CurrentUserHolder;
import com.mossle.core.store.MultipartFileDataSource;
import com.mossle.core.util.IoUtils;
import com.mossle.core.util.ServletUtils;
import com.mossle.disk.persistence.domain.DiskInfo;
import com.mossle.disk.persistence.domain.DiskShare;
import com.mossle.disk.persistence.manager.DiskInfoManager;
import com.mossle.disk.persistence.manager.DiskShareManager;
import com.mossle.disk.service.DiskService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;
@Controller
@RequestMapping("disk")
public class DiskInfoController {
private static Logger logger = LoggerFactory
.getLogger(DiskInfoController.class);
private DiskInfoManager diskInfoManager;
private DiskShareManager diskShareManager;
private CurrentUserHolder currentUserHolder;
private StoreConnector storeConnector;
private DiskService diskService;
private TenantHolder tenantHolder;
/**
* 列表显示.
*/
@RequestMapping("disk-info-list")
public String list(
@RequestParam(value = "path", required = false) String path,
Model model) {
if (path == null) {
path = "";
}
String userId = currentUserHolder.getUserId();
List<DiskInfo> diskInfos = diskService.listFiles(userId, path);
model.addAttribute("diskInfos", diskInfos);
model.addAttribute("path", path);
return "disk/disk-info-list";
}
/**
* 平铺显示.
*/
@RequestMapping("disk-info-grid")
public String grid(
@RequestParam(value = "path", required = false) String path,
Model model) {
if (path == null) {
path = "";
}
String userId = currentUserHolder.getUserId();
List<DiskInfo> diskInfos = diskService.listFiles(userId, path);
model.addAttribute("diskInfos", diskInfos);
model.addAttribute("path", path);
return "disk/disk-info-grid";
}
/**
* 上传文件.
*/
@RequestMapping("disk-info-upload")
@ResponseBody
public String upload(@RequestParam("file") MultipartFile file,
@RequestParam("path") String path) throws Exception {
String userId = currentUserHolder.getUserId();
String tenantId = tenantHolder.getTenantId();
diskService.createFile(userId, new MultipartFileDataSource(file),
file.getOriginalFilename(), file.getSize(), path, tenantId);
return "{\"success\":true}";
}
/**
* 创建目录.
*/
@RequestMapping("disk-info-createDir")
public String createDir(@RequestParam("path") String path,
@RequestParam("name") String name) {
String userId = currentUserHolder.getUserId();
diskService.createDir(userId, name, path);
return "redirect:/disk/disk-info-list.do?path=" + path;
}
/**
* 删除文件.
*/
@RequestMapping("disk-info-remove")
public String remove(@RequestParam("id") Long id) {
String parentPath = diskService.remove(id);
return "redirect:/disk/disk-info-list.do?path=" + parentPath;
}
/**
* 上一级目录.
*/
@RequestMapping("disk-info-parentDir")
public String parentDir(@RequestParam("path") String path) throws Exception {
if (path == null) {
return "redirect:/disk/disk-info-list.do";
}
if ("".equals(path)) {
return "redirect:/disk/disk-info-list.do";
}
String parentPath = path.substring(0, path.lastIndexOf("/"));
return "redirect:/disk/disk-info-list.do?path=" + parentPath;
}
/**
* 下载.
*/
@RequestMapping("disk-info-download")
public void download(@RequestParam("id") Long id,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
String userId = currentUserHolder.getUserId();
String tenantId = tenantHolder.getTenantId();
DiskInfo diskInfo = diskInfoManager.get(id);
InputStream is = null;
try {
ServletUtils.setFileDownloadHeader(request, response,
diskInfo.getName());
is = storeConnector
.getStore("default/user/" + userId, diskInfo.getRef(),
tenantId).getDataSource().getInputStream();
IoUtils.copyStream(is, response.getOutputStream());
} finally {
if (is != null) {
is.close();
}
}
}
/**
* 详情.
*/
@RequestMapping("disk-info-view")
public String view(@RequestParam("id") Long id, Model model) {
DiskInfo diskInfo = diskInfoManager.get(id);
model.addAttribute("diskInfo", diskInfo);
return "disk/disk-info-view";
}
/**
* 重命名.
*/
@RequestMapping("disk-info-rename")
public String rename(@RequestParam("id") Long id,
@RequestParam("name") String name) {
String userId = currentUserHolder.getUserId();
String parentPath = diskService.rename(userId, id, name);
return "redirect:/disk/disk-info-list.do?path=" + parentPath;
}
/**
* 移动.
*/
@RequestMapping("disk-info-move")
public String move(@RequestParam("id") Long id,
@RequestParam("parentId") Long parentId) {
String userId = currentUserHolder.getUserId();
String parentPath = diskService.move(userId, id, parentId);
return "redirect:/disk/disk-info-list.do?path=" + parentPath;
}
/**
* 判断名称是否重复.
*/
@RequestMapping("disk-info-checkName")
@ResponseBody
public String checkName(@RequestParam("name") String name,
@RequestParam("path") String path) throws Exception {
String userId = currentUserHolder.getUserId();
boolean dumplicated = diskService.isDumplicated(userId, name, path);
return "{\"success\":" + dumplicated + "}";
}
/**
* 目录树.
*/
@RequestMapping("disk-info-tree")
@ResponseBody
public String tree() throws Exception {
String userId = currentUserHolder.getUserId();
StringBuilder buff = new StringBuilder();
buff.append("[{\"id\":0,\"name\":\"根目录\",\"open\":true,\"iconSkin\":\"ico_open\",\"children\":");
buff.append(this.convertJson(diskService.listFiles(userId, ""), userId));
buff.append("}]");
return buff.toString();
}
public String convertJson(List<DiskInfo> diskInfos, String userId) {
if (diskInfos.isEmpty()) {
return null;
}
StringBuilder buff = new StringBuilder();
buff.append("[");
for (DiskInfo diskInfo : diskInfos) {
if (!"dir".equals(diskInfo.getType())) {
continue;
}
buff.append(this.convertJson(diskInfo, userId)).append(",");
}
if (buff.length() > 1) {
buff.deleteCharAt(buff.length() - 1);
}
buff.append("]");
return buff.toString();
}
public String convertJson(DiskInfo diskInfo, String userId) {
if (!"dir".equals(diskInfo.getType())) {
return null;
}
StringBuilder buff = new StringBuilder();
buff.append("{\"id\":").append(diskInfo.getId()).append(",\"name\":\"")
.append(diskInfo.getName())
.append("\",\"iconSkin\":\"ico_open\"");
String hql = "from DiskInfo where creator=? and type='dir' and parentPath=?";
String parentPath = diskInfo.getParentPath() + "/" + diskInfo.getName();
String children = this.convertJson(
diskInfoManager.find(hql, userId, parentPath), userId);
if (children != null) {
buff.append(",\"open\":true,\"children\":").append(children);
} else {
buff.append(",\"open\":false");
}
buff.append("}");
return buff.toString();
}
/**
* 分享.
*/
@RequestMapping("disk-info-share")
public String share(@RequestParam("id") Long id,
@RequestParam("type") String type) {
DiskInfo diskInfo = diskInfoManager.get(id);
DiskShare diskShare = diskShareManager.findUniqueBy("diskInfo",
diskInfo);
if (diskShare != null) {
return "redirect:/disk/disk-share-list.do";
}
diskShare = new DiskShare();
diskShare.setShareType(type);
diskShare.setShareTime(new Date());
diskShare.setDiskInfo(diskInfo);
diskShare.setName(diskInfo.getName());
diskShare.setCreator(diskInfo.getCreator());
diskShare.setType(diskInfo.getType());
diskShare.setDirType(diskInfo.getDirType());
diskShare.setCountView(0);
diskShare.setCountSave(0);
diskShare.setCountDownload(0);
if ("private".equals(type)) {
diskShare.setSharePassword(this.generatePassword());
}
diskShareManager.save(diskShare);
return "redirect:/disk/disk-share-list.do";
}
public String generatePassword() {
int value = (int) (((Math.random() * 9) + 1) * 1679616);
char[] c = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0',
'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l',
'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x',
'y', 'z' };
StringBuilder buff = new StringBuilder();
buff.append(c[(value / 36 / 36 / 36) % 36]);
buff.append(c[(value / 36 / 36) % 36]);
buff.append(c[(value / 36) % 36]);
buff.append(c[value % 36]);
return buff.toString();
}
// ~ ======================================================================
@Resource
public void setDiskInfoManager(DiskInfoManager diskInfoManager) {
this.diskInfoManager = diskInfoManager;
}
@Resource
public void setDiskShareManager(DiskShareManager diskShareManager) {
this.diskShareManager = diskShareManager;
}
@Resource
public void setCurrentUserHolder(CurrentUserHolder currentUserHolder) {
this.currentUserHolder = currentUserHolder;
}
@Resource
public void setStoreConnector(StoreConnector storeConnector) {
this.storeConnector = storeConnector;
}
@Resource
public void setDiskService(DiskService diskService) {
this.diskService = diskService;
}
@Resource
public void setTenantHolder(TenantHolder tenantHolder) {
this.tenantHolder = tenantHolder;
}
}