FAISP/src/main/java/com/dbnt/faisp/config/FileController.java

394 lines
18 KiB
Java

package com.dbnt.faisp.config;
import com.dbnt.faisp.main.authMgt.service.AuthMgtService;
import com.dbnt.faisp.main.counterIntelligence.activityCase.service.ActivityCaseService;
import com.dbnt.faisp.main.counterIntelligence.model.CounterIntelligenceActivity;
import com.dbnt.faisp.main.counterIntelligence.model.CounterIntelligenceWork;
import com.dbnt.faisp.main.counterIntelligence.service.CounterIntelligenceService;
import com.dbnt.faisp.main.faRpt.model.FaRptBoard;
import com.dbnt.faisp.main.faRpt.model.Sri;
import com.dbnt.faisp.main.faRpt.service.FaRptService;
import com.dbnt.faisp.main.faStatistics.unlawfulFishing.model.sailor.Sailor;
import com.dbnt.faisp.main.faStatistics.unlawfulFishing.service.FishingBoatService;
import com.dbnt.faisp.main.faStatistics.unlawfulFishing.service.SailorService;
import com.dbnt.faisp.main.fpiMgt.affair.model.AffairBoard;
import com.dbnt.faisp.main.fpiMgt.affair.service.AffairService;
import com.dbnt.faisp.main.fpiMgt.affairPlan.model.PlanBoard;
import com.dbnt.faisp.main.fpiMgt.affairPlan.service.PlanService;
import com.dbnt.faisp.main.fpiMgt.affairResult.model.ResultBoard;
import com.dbnt.faisp.main.fpiMgt.affairResult.service.ResultService;
import com.dbnt.faisp.main.fpiMgt.intelligenceNetwork.model.OperationPlan;
import com.dbnt.faisp.main.fpiMgt.intelligenceNetwork.service.IntelligenceNetworkService;
import com.dbnt.faisp.main.fpiMgt.monitoring.model.MonitoringDesignation;
import com.dbnt.faisp.main.fpiMgt.monitoring.model.MonitoringResult;
import com.dbnt.faisp.main.fpiMgt.monitoring.service.MonitoringService;
import com.dbnt.faisp.main.faRpt.service.SriService;
import com.dbnt.faisp.main.ivsgtMgt.boardInvestigation.model.InvestigationBoard;
import com.dbnt.faisp.main.ivsgtMgt.boardInvestigation.service.IvsgtService;
import com.dbnt.faisp.main.ivsgtMgt.majorStatus.model.MajorStatus;
import com.dbnt.faisp.main.ivsgtMgt.majorStatus.service.MajorStatusService;
import com.dbnt.faisp.main.publicBoard.model.PublicBoard;
import com.dbnt.faisp.main.publicBoard.service.PublicBoardService;
import com.dbnt.faisp.main.userInfo.model.UserInfo;
import com.dbnt.faisp.util.Utils;
import lombok.RequiredArgsConstructor;
import ognl.Ognl;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.io.FileSystemResource;
import org.springframework.core.io.Resource;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.util.FileCopyUtils;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
@RestController
@RequiredArgsConstructor
@RequestMapping("/file")
public class FileController{
@Value("${spring.servlet.multipart.location}")
protected String locationPath;
@Value("${file.dir.editor}")
protected String editorPath;
@Value("${file.dir.affairTemp}")
protected String affairTempPath;
private final FaRptService faRptService;
private final PlanService planService;
private final PublicBoardService publicBoardService;
private final AffairService affairService;
private final ResultService resultService;
private final IvsgtService ivsgtService;
private final FishingBoatService fishingBoatService;
private final SailorService sailorService;
private final SriService sriService;
private final CounterIntelligenceService ciService;
private final MajorStatusService majorStatusService;
private final IntelligenceNetworkService inrelligenceNetworkService;
private final MonitoringService monitoringService;
private final AuthMgtService authMgtService;
private final ActivityCaseService activityCaseService;
@GetMapping("/editorFileDisplay")
public ResponseEntity<Resource> editorFileDisplay(HttpServletRequest request,
HttpServletResponse response,
String fileNm) {
String pathStr = locationPath+editorPath+File.separator+fileNm;
Resource resource = new FileSystemResource(pathStr);
if(!resource.exists()){
return new ResponseEntity<>(HttpStatus.NOT_FOUND);
}
HttpHeaders header = new HttpHeaders();
Path filePath = null;
try {
filePath = Paths.get(pathStr);
header.add("Content-type", Files.probeContentType(filePath));
}catch (IOException e){
e.printStackTrace();
}
return new ResponseEntity<Resource>(resource, header, HttpStatus.OK);
}
@GetMapping("/fileDisplay")
public ResponseEntity<Resource> fileDisplay(HttpServletRequest request,
HttpServletResponse response,
String board,
Integer parentKey,
Integer fileSeq) {
FileInfo fileInfo = getFileInfo(board, parentKey, fileSeq);
String pathStr = fileInfo.getSavePath()+File.separator+fileInfo.getConvNm();
Resource resource = new FileSystemResource(pathStr);
if(!resource.exists()){
return new ResponseEntity<>(HttpStatus.NOT_FOUND);
}
HttpHeaders header = new HttpHeaders();
Path filePath = null;
try {
filePath = Paths.get(pathStr);
header.add("Content-type", Files.probeContentType(filePath));
}catch (IOException e){
e.printStackTrace();
}
return new ResponseEntity<Resource>(resource, header, HttpStatus.OK);
}
@GetMapping("/fileDownload")
public void fileDownload(HttpServletRequest request,
HttpServletResponse response,
String board,
Integer menuKey,
Integer parentKey,
Integer fileSeq,
@AuthenticationPrincipal UserInfo loginUser) throws Exception {
FileInfo fileInfo = null;
if(Utils.isEmpty(menuKey)){
fileInfo = getFileInfo(board, parentKey, fileSeq);
}else{
if(menuKey!=0){
String accessAuth = authMgtService.selectAccessAuth(menuKey, loginUser.getUserSeq());
Map<String, Object> wrtInfo = getWrtInfo(menuKey, parentKey);
if(!Utils.isEmpty(accessAuth)){
if(wrtOrganCheck(loginUser.getUserSeq(), accessAuth, wrtInfo, loginUser.getDownOrganCdList())){
fileInfo = getFileInfoToMenuKey(menuKey, parentKey, fileSeq);
}else{
throw new Exception();
}
}else{
throw new Exception();
}
}else{
fileInfo = getFileInfoToMenuKey(menuKey, parentKey, fileSeq);
}
}
BufferedInputStream in;
BufferedOutputStream out;
try {
File file = new File(fileInfo.getSavePath(), fileInfo.getConvNm());
Utils.setDisposition(fileInfo.getFullName(), request, response);
in = new BufferedInputStream(new FileInputStream(file));
out = new BufferedOutputStream(response.getOutputStream());
FileCopyUtils.copy(in, out);
out.flush();
if(out!=null) out.close();
if(in!=null )in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
private boolean wrtOrganCheck(Integer userSeq, String accessAuth, Map<String, Object> wrtInfo, List<String> mgtOrganList) {
if (accessAuth.equals("ACC003")){
return mgtOrganList.contains(wrtInfo.get("wrtOrgan").toString());
}else if(accessAuth.equals("ACC002")||accessAuth.equals("ACC001")){
return userSeq.equals(wrtInfo.get("wrtUserSeq"));
}
return false;
}
@GetMapping("/downloadAffairFiles")
public void downloadAffairFiles(HttpServletRequest request,
HttpServletResponse response,
@RequestParam(value="fileNm", defaultValue = "견문보고서 첨부파일_") String fileNm,
@RequestParam(value="affairKeyList") List<Integer> affairKeyList){
List<FileInfo> fileList = affairService.selectAffairFileList(affairKeyList);
makeZipAndOut(request, response, fileNm, fileList);
}
@GetMapping("/downloadMajorStatusFiles")
public void downloadMajorStatusFiles(HttpServletRequest request,
HttpServletResponse response,
@RequestParam(value="majorKeyList") List<Integer> majorKeyList){
List<FileInfo> fileList = majorStatusService.selectMajorFileList(majorKeyList);
makeZipAndOut(request, response, "주요사건처리현황 첨부파일_", fileList);
}
private void makeZipAndOut(HttpServletRequest request,
HttpServletResponse response,
String fileName, List<FileInfo> fileList) {
List<Map<String, String>> fileInfoList = new ArrayList<>();
for(FileInfo file: fileList){
Map<String, String> fileInfoMap = new HashMap<>();
fileInfoMap.put("filePath", file.getSavePath()+File.separator+file.getConvNm());
fileInfoMap.put("originalName", file.getOrigNm()+"."+file.getFileExtn());
fileInfoList.add(fileInfoMap);
}
String zipFile = locationPath+affairTempPath;
File saveFolder = new File(zipFile);
if (!saveFolder.exists() || saveFolder.isFile()) {
saveFolder.mkdirs();
}
String downloadFileName = fileName+ LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))+".zip";
zipFile += File.separator+downloadFileName;
try{
// ZipOutputStream을 FileOutputStream 으로 감쌈
FileOutputStream fout = new FileOutputStream(zipFile);
ZipOutputStream zout = new ZipOutputStream(fout);
for(Map<String, String> fileMap: fileInfoList){
//본래 파일명 유지, 경로제외 파일압축을 위해 new File로
ZipEntry zipEntry = new ZipEntry(fileMap.get("originalName"));
zout.putNextEntry(zipEntry);
//경로포함 압축
//zout.putNextEntry(new ZipEntry(sourceFiles.get(i)));
FileInputStream fin = new FileInputStream(fileMap.get("filePath"));
byte[] buffer = new byte[1024];
int length;
// input file을 1024바이트로 읽음, zip stream에 읽은 바이트를 씀
while((length = fin.read(buffer)) > 0){
zout.write(buffer, 0, length);
}
zout.closeEntry();
fin.close();
}
zout.close();
Utils.setDisposition(downloadFileName, request, response);
BufferedInputStream in = new BufferedInputStream(new FileInputStream(zipFile));
BufferedOutputStream out = new BufferedOutputStream(response.getOutputStream());
FileCopyUtils.copy(in, out);
out.flush();
/*byte[] data=new byte[2048];
int input=0;
while((input=in.read(data))!=-1){
out.write(data,0,input);
out.flush();
}*/
if(out!=null) out.close();
if(in!=null) in.close();
} catch(IOException e){
e.printStackTrace();
}
}
private FileInfo getFileInfo(String board, Integer parentKey, Integer fileSeq){
FileInfo downloadFile = null;
switch (board){
case "faRpt": downloadFile = faRptService.selectFaRptFile(parentKey, fileSeq); break;
case "affairPlan": downloadFile = planService.selectPlanFile(parentKey, fileSeq); break;
case "publicFile": downloadFile = publicBoardService.selectPublicFile(parentKey, fileSeq); break;
case "affair": downloadFile = affairService.selectAffairFile(parentKey, fileSeq); break;
case "affairResult": downloadFile = resultService.selectResultFile(parentKey, fileSeq); break;
case "ivsgt": downloadFile = ivsgtService.selectIvsgtFile(parentKey, fileSeq); break;
case "sailor": downloadFile = sailorService.selectSailorFile(parentKey, fileSeq); break;
case "sri": downloadFile = sriService.selectFaSriFile(parentKey, fileSeq); break;
case "ciWork": downloadFile = ciService.selectCiWorkFile(parentKey, fileSeq); break;
case "majorFile" : downloadFile = majorStatusService.selectMajorFile(parentKey, fileSeq); break;
case "ciActivity": downloadFile = ciService.selectCiaForeignerFile(parentKey, fileSeq); break;
case "operationPlan": downloadFile = inrelligenceNetworkService.selectOperationPlanFile(parentKey, fileSeq); break;
case "designation": downloadFile = monitoringService.selectDesignationFile(parentKey, fileSeq); break;
case "monitoringResult": downloadFile = monitoringService.selectMonitoringResultFile(parentKey, fileSeq); break;
case "monitoringReport": downloadFile = monitoringService.selectMonitoringReportFile(parentKey, fileSeq); break;
case "activityCase": downloadFile = activityCaseService.selectActivityCaseFile(parentKey, fileSeq); break;
}
return downloadFile;
}
private FileInfo getFileInfoToMenuKey(Integer menuKey, Integer parentKey, Integer fileSeq){
FileInfo downloadFile = null;
switch (menuKey){
case 0: downloadFile = publicBoardService.selectPublicFile(parentKey, fileSeq); break;
case 1: downloadFile = faRptService.selectFaRptFile(parentKey, fileSeq); break;
case 29: downloadFile = planService.selectPlanFile(parentKey, fileSeq); break;
case 30:case 33: downloadFile = affairService.selectAffairFile(parentKey, fileSeq); break;
case 31: downloadFile = resultService.selectResultFile(parentKey, fileSeq); break;
case 2: downloadFile = ivsgtService.selectIvsgtFile(parentKey, fileSeq); break;
case 44: downloadFile = sailorService.selectSailorFile(parentKey, fileSeq); break;
case 40: downloadFile = sriService.selectFaSriFile(parentKey, fileSeq); break;
case 5: downloadFile = majorStatusService.selectMajorFile(parentKey, fileSeq); break;
case 6: downloadFile = ciService.selectCiWorkFile(parentKey, fileSeq); break;
case 7: case 8: case 9: case 10:downloadFile = ciService.selectCiaForeignerFile(parentKey, fileSeq); break;
case 32: downloadFile = inrelligenceNetworkService.selectOperationPlanFile(parentKey, fileSeq); break;
case 36: downloadFile = monitoringService.selectDesignationFile(parentKey, fileSeq); break;
case 37: downloadFile = monitoringService.selectMonitoringResultFile(parentKey, fileSeq); break;
case 370: downloadFile = monitoringService.selectMonitoringReportFile(parentKey, fileSeq); break;
}
return downloadFile;
}
private Map<String, Object> getWrtInfo(Integer menuKey, Integer parentKey){
Map<String, Object> wrtInfo = new HashMap<>();
switch (menuKey){
case 0:
PublicBoard board = publicBoardService.selectPublicBoard(parentKey);
wrtInfo.put("wrtOrgan", board.getWrtOrgan());
wrtInfo.put("wrtUserSeq", board.getWrtUserSeq());
break;
case 1:
FaRptBoard faRpt = faRptService.selectFaRptBoard(parentKey, null);
wrtInfo.put("wrtOrgan", faRpt.getWrtOrgan());
wrtInfo.put("wrtUserSeq", faRpt.getWrtUserSeq());
break;
case 2:
InvestigationBoard invest = ivsgtService.selectBoardInvestigation(parentKey);
wrtInfo.put("wrtOrgan", invest.getWrtOrgan());
wrtInfo.put("wrtUserSeq", invest.getWrtUserSeq());
break;
case 5:
MajorStatus major = majorStatusService.selectMajor(parentKey);
wrtInfo.put("wrtOrgan", major.getWrtOrgan());
wrtInfo.put("wrtUserSeq", major.getWrtUserSeq());
break;
case 6:
CounterIntelligenceWork ciw = ciService.selectCounterIntelligenceWork(parentKey);
wrtInfo.put("wrtOrgan", ciw.getWrtOrgan());
wrtInfo.put("wrtUserSeq", ciw.getWrtUserSeq());
break;
case 7: case 8: case 9: case 10:
CounterIntelligenceActivity cia = ciService.selectCia(parentKey);
wrtInfo.put("wrtOrgan", cia.getWrtOrgan());
wrtInfo.put("wrtUserSeq", cia.getWrtUserSeq());
break;
case 29:
PlanBoard plan = planService.selectPlanBoard(parentKey);
wrtInfo.put("wrtOrgan", plan.getWrtOrgan());
wrtInfo.put("wrtUserSeq", plan.getWrtUserSeq());
break;
case 30:case 33:
AffairBoard affair = affairService.selectAffairBoard(parentKey);
wrtInfo.put("wrtOrgan", affair.getWrtOrgan());
wrtInfo.put("wrtUserSeq", affair.getWrtUserSeq());
break;
case 31:
ResultBoard affairResult = resultService.selectResultBoard(parentKey);
wrtInfo.put("wrtOrgan", affairResult.getWrtOrgan());
wrtInfo.put("wrtUserSeq", affairResult.getWrtUserSeq());
break;
case 32:
OperationPlan operationPlan = inrelligenceNetworkService.selectOperationPlan(parentKey);
wrtInfo.put("wrtOrgan", operationPlan.getWrtOrgan());
wrtInfo.put("wrtUserSeq", operationPlan.getWrtUserSeq());
break;
case 36:
MonitoringDesignation designation = monitoringService.selectDesignation(parentKey);
wrtInfo.put("wrtOrgan", designation.getWrtOrgan());
wrtInfo.put("wrtUserSeq", designation.getWrtUserSeq());
break;
case 37:case 370:
MonitoringResult monitoringResult = monitoringService.selectResult(parentKey);
wrtInfo.put("wrtOrgan", monitoringResult.getWrtOrgan());
wrtInfo.put("wrtUserSeq", monitoringResult.getWrtUserSeq());
break;
case 40:
Sri sri = sriService.selectFaSriBoard(parentKey, null);
wrtInfo.put("wrtOrgan", sri.getWrtOrgan());
wrtInfo.put("wrtUserSeq", sri.getWrtUserSeq());
break;
case 44:
Sailor sailor = sailorService.selectSailor(parentKey);
wrtInfo.put("wrtOrgan", sailor.getWrtOrgan());
wrtInfo.put("wrtUserSeq", sailor.getWrtUserSeq());
break;
}
return wrtInfo;
}
}