/**
 * ********************************************************************************
 * 프로그램명 : HttpFileCheck.java 작 성 자 : wonseok Lee 작 성 일 : 2017. 8.29 최신변경일 :
 * 설명:  제출자료 > 제출자료보기시 DB에 첨부파일이 있고 첨부파일 경로에 해당 파일이 없으면  첨부파일을 복사하고
 *       TABLE에 첨부파일 정보를 업데이트 한다.
 * 1.0
 **********************************************************************************
 */
package kr.co.kihyun.beans.totsys.report;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.PrintWriter;
import java.net.URLEncoder;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.List;
import java.util.Set;
import java.sql.SQLException;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import kr.co.kihyun.beans.entity.MDept;
import kr.co.kihyun.beans.entity.MoumiEntity;
import kr.co.kihyun.beans.user.HttpSSOLogin;
import kr.co.kihyun.io.MultipartRequest;
import kr.co.kihyun.lang.MString;
import kr.co.kihyun.moumi.MoumiConfig;
import kr.co.kihyun.text.html.ServletUtil;
import kr.co.kihyun.db.CommonDBManager;
import kr.co.kihyun.db.DBManager;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.lang.StringUtils;
import org.bouncycastle.asn1.ocsp.Request;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@WebServlet("/servlet/kr.co.kihyun.beans.totsys.report.HttpFileCheck")
public class HttpFileCheck extends HttpServlet {

    /**
     *
     */
    private static final long serialVersionUID = 1L;
    private static final Logger LOG = LoggerFactory.getLogger(HttpFileCheck.class);

	private ResultSet rs = null;
	private String id = "";

    @Override
    public void doPost (HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {

        res.setContentType("text/html;charset=UTF-8");

        String usID = HttpSSOLogin.getLoginID(req);
        String dtID = HttpSSOLogin.getDeptID(req);
        String reportID = "";
        String docID = "";
        String svrFilenames = "";
        String usrFilenames = "";
        String fileSizes = "";
        long sumFileSize = 0;
        int fileCount = 0;
        String fileInfos = "";
        String connURL = "";
        String attacheFileDir = "";

        docID = MString.checkNull(req.getParameter("docID"));
       	reportID = MString.checkNull(req.getParameter("reportID"));

       	//1. 페이지 로딩시 ATTACHMENTS 컬럼에 파일이 있고 해당 첨부파일 경로에 파일이 존재하지 않으면 DB에서 읽은 파일을 실제 경로에 입력한다.
       	//2. attachements_path 컬럼도 update한다.
       	StringBuilder sql1 = new StringBuilder(250);
       	StringBuilder sql2 = new StringBuilder(250);
    	String attachementsPath = null;

		CommonDBManager acdbm=new CommonDBManager();
		ResultSet ars = null;
		try {

			sql1.append("SELECT attachments FROM MOUMI_TOT_REPORT WHERE id= ?");
			ars= acdbm.execQuery(sql1,reportID);
			if(ars.next()){
				InputStream is=ars.getBinaryStream(1);
				if(is!=null){
					ObjectInputStream ois=new ObjectInputStream(is);
					//1.첨부파일 컬럼이 not null 이면 첨부파일 경로에 동일한 이름의 파일이 있는지 비교한다.
					//2.동일한 파일이 없으면 파일을 복사한다.
					//3.파일의 경로를 db에 저장한다.(MOUMI_TOT_REPORT, MOUMI_TOT_REPORT_VERSION)
					ArrayList<String> rslt=new ArrayList<String>();
			       	attacheFileDir = MoumiConfig.getFileDirectory()+"/"+docID+"/"+reportID+"/"+dtID;

    				Map<String, List<Byte>> map= (Map<String, List<Byte>>)ois.readObject();

    	    		Set<String> filenames=map.keySet();

    		    	File attacheDir=new File(attacheFileDir);

    	    		if(!attacheDir.exists()) attacheDir.mkdirs();
    	    		boolean setFilePath = false;
    	    		for (String fn : filenames) {
    	    			rslt.add(fn);
    	    			try {
    	    				File fnFile=new File(attacheDir+"/"+fn);
    	    				attachementsPath += fnFile.getPath()+";";
    	    				if(!fnFile.exists()) {
	    	    				List<Byte> flist=map.get(fn);
	    	    				if(flist==null)continue;
	    	        			FileOutputStream fos=new FileOutputStream(fnFile);
	    	        			for(int b:flist)fos.write(b);
	    	        			fos.flush();
	    	        			fos.close();
	    	        			setFilePath = true;
    	    				}
    	    			} catch (Exception e) {
    	    				e.printStackTrace();
    	    			}
    				}
    	    		//db에는 있고 directory에는 없는 첨부파일이 하나라도 존재할때  attachments_path를 update하게 수정함 by wonseok Lee 20170913
    	    		if(filenames.size()>0 && setFilePath==true) {
    	    			sql2.delete(0,sql2.length());
    	                sql2.append("UPDATE MOUMI_TOT_REPORT SET ATTACHMENTS_PATH = '"+attachementsPath+"' WHERE ID = '"+reportID+"'");
    	                acdbm.execUpdate(sql2.toString());

    	                sql2.delete(0,sql2.length());
    	                sql2.append("UPDATE MOUMI_TOT_REPORT_VERSION SET ATTACHMENTS_PATH = '"+attachementsPath+"' WHERE REPORT_ID = '"+reportID+"' AND ID=(SELECT MAX(ID) FROM MOUMI_TOT_REPORT_VERSION WHERE DEL_TYPE = 'N' AND REPORT_ID = '"+reportID+"')");
    	                acdbm.execUpdate(sql2.toString());
    	    			LOG.debug("ATTACHMENTS_PATH 업데이트 함. DB에 있는 첨부파일 갯수>>>>>>["+filenames.size()+"]   디렉토리에 없는 파일의 존재유무 >>>>> ["+setFilePath+"]");
    	    		}
				}
			}

			acdbm.commit();
		} catch (Exception ex) {
			acdbm.rollback();
		} finally {
			try{
				if(null != ars) ars.close();
			}catch(Exception e){}
			acdbm.execClose();
		}
    }
}
