<%@page language="java" contentType="text/html; charset=UTF-8"%>
<%@page import="com.namo.crossuploader.*"%>
<%@page import="java.io.*"%>
<%@page import="java.net.URLEncoder"%>
<%@page import="org.json.simple.JSONArray"%>
<%@page import="org.json.simple.JSONObject"%>
<%@page import="org.json.simple.parser.JSONParser"%>
<%@page import="org.json.simple.parser.ParseException"%>
<%@page import="java.util.List"%>
<%@page import="java.util.ArrayList"%>
<%@page import="java.io.BufferedInputStream"%>
<%@page import="java.io.BufferedOutputStream"%>
<%@page import="java.io.File"%>
<%@page import="java.io.FileInputStream"%>
<%@page import="java.io.FileOutputStream"%>
<%@page import="java.util.zip.ZipEntry"%>
<%@page import="java.util.zip.ZipInputStream"%>
<%@page import="java.util.zip.ZipOutputStream"%>
<%@page import="java.io.FileNotFoundException"%>
<%@page import="java.io.IOException"%>

<%
	out.clear(); 
	FileDownload fileDownload = new FileDownload(request, response);
    
	String tempZipFilePath = "";  
	
	try { 
		String downloadFormData = request.getParameter("CD_DOWNLOAD_FILE_INFO"); 
		if (downloadFormData == null)
			throw new Exception("다운로드 중 예외가 발생했습니다.");
				
		JSONParser jsonParser = new JSONParser();
		Object obj = jsonParser.parse(downloadFormData); 
		System.out.println("obj : " + obj); 
		
		JSONArray downloadFileInfoArray = (JSONArray)obj; 

		
		// JSONObject jsonObject = (JSONObject)downloadFileInfoArray.get(i); 
		// (String)jsonObject.get("fileId");
		// (String)jsonObject.get("fileName"); // 필요할 경우 사용합니다.
		// (String)jsonObject.get("fileSize"); // 필요할 경우 사용합니다.  
		// (String)jsonObject.get("fileUrl");  // 각 파일의 URL이 다르거나 SingleFileDownload일 때 사용됩니다
		
		String fileNameAlias = "";
		String filePath = request.getSession().getServletContext().getRealPath("NamoCrossUploaderH5Samples/DownloadFiles");
		if(downloadFileInfoArray.size() == 1)
		{
			JSONObject jsonObject = (JSONObject)downloadFileInfoArray.get(0);
			fileNameAlias = GetFileNameAlias((String)jsonObject.get("fileId")); 
            filePath += (File.separator + fileNameAlias);
		}
		else if(downloadFileInfoArray.size() > 1) 
		{
			 List filePathList = GetFilePathList(downloadFileInfoArray, filePath);
			 
			 tempZipFilePath = CompressFiles(filePathList);
			 
             filePath = tempZipFilePath;
             fileNameAlias = "download.zip"; 
		}

		// fileNameAlias는 웹서버 환경에 따라 적절히 인코딩 되어야 합니다.
		fileNameAlias = URLEncoder.encode(fileNameAlias, "UTF-8"); 
		
		// attachment 옵션에 따라 파일 종류에 관계 없이 항상 파일 저장 대화상자를 출력할 수 있습니다. 
		boolean attachment = true;  
		// resumable 옵션에 따라 파일 이어받기가 가능합니다.
		// 클라이언트에서 이어받기 요청이 있어야 하며, 이어받기 요청이 없을 경우 일반 다운로드와 동일하게 동작합니다.
		boolean resumable = true;  
		// filePath에 지정된 파일을 fileNameAlias 이름으로 다운로드 합니다. 
		fileDownload.startDownload(filePath, fileNameAlias, attachment, resumable); 
		
		
		// 다른 유형의 다운로드 함수들
		// startDownload(String filePath); 
		// startDownload(String filePath, boolean attachment); 
		// startDownload(String filePath, boolean attachment, boolean resumable); 
		// startDownload(String filePath, String fileNameAlias);
		
		 //startDownload(filePath, fileNameAlias, attachment); 
		// startStreamDownload(InputStream inputStream, String fileNameAlias, long fileSize, boolean attachment); 
	}
	catch(CrossUploaderException ex) { 
		out.println("다운로드 중 예외 발생 : " + ex.getMessage()); 
		response.setStatus(response.SC_INTERNAL_SERVER_ERROR);
		System.out.println("다운로드 중 예외 발생 : " + ex.getMessage()); 
	}
	catch(FileNotFoundException ex) { 
		out.println("다운로드 중 예외 발생 : " + ex.getMessage()); 
		response.setStatus(response.SC_INTERNAL_SERVER_ERROR);
		System.out.println("다운로드 중 예외 발생 : " + ex.getMessage()); 	
	}
	catch(IOException ex) { 
		out.println("다운로드 중 예외 발생 : " + ex.getMessage()); 
		response.setStatus(response.SC_INTERNAL_SERVER_ERROR);
		System.out.println("다운로드 중 예외 발생 : " + ex.getMessage()); 	
	}
	catch(Exception ex) { 
		out.println("다운로드 중 예외 발생 : " + ex.getMessage()); 
		response.setStatus(response.SC_INTERNAL_SERVER_ERROR);
		System.out.println("다운로드 중 예외 발생 : " + ex.getMessage()); 	
	}
%><%!
    private List GetFilePathList(JSONArray downloadFileInfoArray, String filePath) throws Exception
    {
        List filePathList = new ArrayList(); 

        /**
        * 다운로드 할 파일 설정
        * DB 등에 저장된 파일의 정보를 가져옵니다. 샘플에서는 filePath 경로에 아래 파일들이 존재하는 것을 가정합니다.
        */
        for (int i = 0; i < downloadFileInfoArray.size(); i++)
        {
			JSONObject downloadFileInfo = (JSONObject)downloadFileInfoArray.get(i);
			System.out.println("GetFilePathList_downloadFileInfo :" + downloadFileInfo); 
			String fileId = (String)downloadFileInfo.get("fileId");  
			System.out.println("GetFilePathList_fileId :" + fileId); 
			
            String fileName = ""; 
            if (fileId.compareTo("FILEID_0001") == 0)
                fileName = "나모크로스에디터3_제품소개서.pdf";
            else if (fileId.compareTo("FILEID_0002") == 0)
                fileName = "ActiveSquare 7_brochure.pdf";
            else if (fileId.compareTo("FILEID_0003") == 0)
                fileName = "130617_나모_펍트리_브로셔_130702.pdf";
			else
                throw new Exception("다운로드 할 파일이 없습니다.");

            filePathList.add(filePath + (File.separator + fileName)); 
			
			System.out.println("GetFilePathList_filePathList :" + filePathList); 
        }

        return filePathList; 
    }
    
    private String GetFileNameAlias(String fileId) throws Exception
    {
        /**
        * 다운로드 할 파일 설정
        * DB 등에 저장된 파일의 정보를 가져옵니다. 샘플에서는 아래 파일들이 존재하는 것을 가정합니다.
        */
        String fileNameAlias = "";
		if (fileId.compareTo("FILEID_0001") == 0)
			fileNameAlias = "나모크로스에디터3_제품소개서.pdf.pdf";
		else if (fileId.compareTo("FILEID_0002") == 0)
			fileNameAlias = "ActiveSquare 7_brochure.pdf";
		else if (fileId.compareTo("FILEID_0003") == 0)
			fileNameAlias = "130617_나모_펍트리_브로셔_130702.pdf";
		else
			throw new Exception("다운로드 할 파일이 업습니다.");

        return fileNameAlias; 
		
    }
	
	public String CompressFiles(List filePathList) throws IOException
	{
		final int BUFFER_SIZE = 1024 * 2;
		final int COMPRESSION_LEVEL = 9; 
		String tempZipFilePath = ""; 
		
		File tempZipFile= File.createTempFile("namo_download_", ".tmp");
		FileOutputStream fos = new FileOutputStream(tempZipFile); // FileOutputStream;
		BufferedOutputStream bos = new BufferedOutputStream(fos); // BufferedStream
		ZipOutputStream zos = new ZipOutputStream(bos); // ZipOutputStream
		zos.setLevel(COMPRESSION_LEVEL); // 압축 레벨 - 최대 압축률은 9, 디폴트 8
		
		for(int i=0; i<filePathList.size(); i++) {
			File sourceFile = new File((String)filePathList.get(i)); 
			BufferedInputStream bis = null;
			bis = new BufferedInputStream(new FileInputStream(sourceFile));
			ZipEntry zentry = new ZipEntry(sourceFile.getName());
			zentry.setTime(sourceFile.lastModified());
			zos.putNextEntry(zentry);

			byte[] buffer = new byte[BUFFER_SIZE];
			int cnt = 0;
			while ((cnt = bis.read(buffer, 0, BUFFER_SIZE)) != -1) {
				zos.write(buffer, 0, cnt);
			}
			zos.closeEntry();
			if (bis != null) 
				bis.close();
		}
		
		if (zos != null) {
			zos.finish();
			zos.close();
		}
		if (bos != null) {
			bos.close();
		}
		if (fos != null) {
			fos.close();
		}
		
		tempZipFilePath = tempZipFile.getPath(); 
					
		return tempZipFilePath; 
	 }
	
%>