package com.mossle.disk.web;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.annotation.Resource;
import javax.servlet.http.Cookie;
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.api.user.UserConnector;
import com.mossle.api.user.UserDTO;
import com.mossle.core.page.Page;
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 org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.CookieValue;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
@Controller
@RequestMapping("disk")
public class DiskController {
private static Logger logger = LoggerFactory
.getLogger(DiskController.class);
private DiskShareManager diskShareManager;
private DiskInfoManager diskInfoManager;
private StoreConnector storeConnector;
private TenantHolder tenantHolder;
private UserConnector userConnector;
/**
* 首页.
*/
@RequestMapping("disk-home")
public String home(
@RequestParam(value = "username", required = false) String username,
Model model) {
if (username == null) {
Page page = diskInfoManager.pagedQuery("from DiskInfo", 1, 10);
List<DiskInfo> diskInfos = (List<DiskInfo>) page.getResult();
List<String> userIds = new ArrayList<String>();
List<UserDTO> userDtos = new ArrayList<UserDTO>();
for (DiskInfo diskInfo : diskInfos) {
String userId = diskInfo.getCreator();
if (userIds.contains(userId)) {
continue;
}
UserDTO userDto = userConnector.findById(userId);
userDtos.add(userDto);
}
model.addAttribute("userDtos", userDtos);
} else {
Map<String, Object> parameters = new HashMap<String, Object>();
parameters.put("filter_LIKES_username", username);
Page page = userConnector.pagedQuery(tenantHolder.getTenantId(),
new Page(), parameters);
model.addAttribute("userDtos", page.getResult());
}
return "disk/disk-home";
}
/**
* 列表.
*/
@RequestMapping("disk-list")
public String list(@RequestParam("u") String u,
@RequestParam(value = "path", required = false) String path,
Model model) {
if (path == null) {
path = "";
}
String userId = u;
List<DiskShare> diskShares = diskShareManager.findBy("creator", userId);
model.addAttribute("diskShares", diskShares);
model.addAttribute("path", path);
return "disk/disk-list";
}
/**
* 详情.
*/
@RequestMapping("disk-view")
public String view(
@RequestParam("id") Long id,
@CookieValue(value = "share", required = false) String sharePassword,
Model model) {
DiskShare diskShare = diskShareManager.get(id);
if ("private".equals(diskShare.getShareType())) {
if (!diskShare.getSharePassword().equals(sharePassword)) {
return "disk/disk-code";
}
}
model.addAttribute("diskShare", diskShare);
return "disk/disk-view";
}
/**
* 下载.
*/
@RequestMapping("disk-download")
public void download(@RequestParam("id") Long id,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
String tenantId = tenantHolder.getTenantId();
DiskShare diskShare = diskShareManager.get(id);
DiskInfo diskInfo = diskShare.getDiskInfo();
InputStream is = null;
try {
ServletUtils.setFileDownloadHeader(request, response,
diskInfo.getName());
String modelName = "disk/user/" + diskInfo.getCreator();
String keyName = diskInfo.getRef();
is = storeConnector.getStore(modelName, keyName, tenantId)
.getDataSource().getInputStream();
IoUtils.copyStream(is, response.getOutputStream());
} finally {
if (is != null) {
is.close();
}
}
}
@RequestMapping("disk-code")
public String diskCode(@RequestParam("id") Long id,
@RequestParam("code") String code, HttpServletResponse response) {
response.addCookie(new Cookie("share", code));
return "redirect:/disk/disk-view.do?id=" + id;
}
// ~ ======================================================================
@Resource
public void setDiskShareManager(DiskShareManager diskShareManager) {
this.diskShareManager = diskShareManager;
}
@Resource
public void setDiskInfoManager(DiskInfoManager diskInfoManager) {
this.diskInfoManager = diskInfoManager;
}
@Resource
public void setStoreConnector(StoreConnector storeConnector) {
this.storeConnector = storeConnector;
}
@Resource
public void setTenantHolder(TenantHolder tenantHolder) {
this.tenantHolder = tenantHolder;
}
@Resource
public void setUserConnector(UserConnector userConnector) {
this.userConnector = userConnector;
}
}