/* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ package kr.co.kihyun.service.servlet; import java.io.IOException; import java.io.PrintWriter; import java.net.URLEncoder; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; import java.util.Map; import javax.jdo.PersistenceManager; import javax.jdo.Transaction; 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.TotReport; import kr.co.kihyun.beans.entity.util.MPersistenceManager; import kr.co.kihyun.beans.entity.util.PMF; import kr.co.kihyun.db.CommonDBManager; import kr.co.kihyun.io.FileUtil; import kr.co.kihyun.io.IUploadable; import kr.co.kihyun.lang.MLong; import kr.co.kihyun.lang.MString; import kr.co.kihyun.service.DeptService; import kr.co.kihyun.service.TotReportService; import kr.co.kihyun.service.vo.CodeVO; import org.apache.commons.lang.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * * @author Kts */ @WebServlet("/servlet/kr.co.kihyun.service.servlet.AjaxProcessServlet") public class AjaxProcessServlet extends HttpServlet { private static final Logger LOG = LoggerFactory.getLogger(AjaxProcessServlet.class); /** * Processes requests for both HTTP GET and POST * methods. * * @param request servlet request * @param response servlet response * @throws ServletException if a servlet-specific error occurs * @throws IOException if an I/O error occurs * @throws SQLException */ protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException, SQLException { response.setContentType("application/x-json;charset=UTF-8"); PrintWriter out = response.getWriter(); try { //업무처리구분자 String procType = MString.checkNull(request.getParameter("proc_type")); if( LOG.isDebugEnabled() ) { LOG.debug("procType={}", procType); } if( procType.equals("dept_lov")) { //부서에 대한 List of Value(코드와 값)를 구함 processListOfValueForDept(request, response); } else if( procType.equals("attatch_file")) { //첨부파일의 리스트를 구한다. attachmentsMapByReportID(request, response); } else if( procType.equals("board_attatch_file")) { //첨부파일의 리스트를 구한다. attachmentsMapByBoardID(request, response); } else if( procType.equals("send_neis_recog")) { //결재진행상태를 확인한다. sendNeisRecogByReportID(request, response); } } finally { out.close(); } } /** * 부서에 대한 List of Value를 Json형태로 변환하여 응답하는 메소드 * @param request - 요청객체 * @param response - 응답객체 * @throws ServletException * @throws IOException */ private void processListOfValueForDept(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { PrintWriter out = response.getWriter(); String deptId = MString.checkNull(request.getParameter("deptId")); int lovType = Integer.parseInt(request.getParameter("lov_type")); if( LOG.isDebugEnabled() ) { LOG.debug("lovType={}, deptId={}", lovType, deptId); } DeptService.TYPE type = null; if( lovType == DeptService.TYPE.DEPT_OF_SAME_ORGAN.ordinal() ) { //기관이 같은 모든 부서 목록 type = DeptService.TYPE.DEPT_OF_SAME_ORGAN; }else if( lovType == DeptService.TYPE.SCHOOL_OF_SAME_ORGAN.ordinal() ) { //기관이 같은 학교 목록 type = DeptService.TYPE.SCHOOL_OF_SAME_ORGAN; }else if( lovType == DeptService.TYPE.SAME_ROOT_DEPT.ordinal() ) { //Root Dept가 같은 부서 목록 type = DeptService.TYPE.SAME_ROOT_DEPT; } PersistenceManager pm = new MPersistenceManager(PMF.get().getPersistenceManager()); Transaction tx = pm.currentTransaction(); tx.begin(); DeptService deptService = new DeptService(pm); List deptList = deptService.getLOVFromDept(type, deptId); //Json형태로 변환하는 메소드 호출 String jsonOutput = makeCodeListToJson(deptList); //v2. 9.크로스사이트 스크립트 (PrintWrier) : Update by KWON,HAN // if( jsonOutput != null ) out.print(jsonOutput); if( jsonOutput != null ) { // 수정 : 외부 입력값 필터링 String filtered_jsonOutput = jsonOutput.replaceAll("<","").replaceAll(">","").replaceAll("&",""); LOG.debug("v2 9.크로스사이트 스크립트 (PrintWrier) : AjaxProcessServlet.processListOfValueForDept() filtered_jsonOutput={}, Not Test", filtered_jsonOutput); out.print(filtered_jsonOutput); } //======================================== tx.commit(); } /** * 결과목록을 Json형태로 변환하는 메소드 * @param list - 결과목록 * @return String - Json형태의 문자열 */ private String makeCodeListToJson(List list) { int size = list.size(); if( size > 0 ) { StringBuilder sb = new StringBuilder(); sb.append("["); for( int i = 0; i < size; i++ ) { CodeVO codeVO = (CodeVO)list.get(i); if( i >= 1 ) sb.append(","); sb.append("{"); sb.append("\"value\":\""); sb.append(codeVO.getValue()); sb.append("\",\"code\":\""); sb.append(codeVO.getCode()); sb.append("\"}"); } sb.append("]"); // if( LOG.isDebugEnabled() ) { // LOG.debug("result={}", sb.toString()); // } return sb.toString(); } return null; } /** * 첨부파일명을 Json형태로 변환하여 응답하는 메소드 * @param request - 요청객체 * @param response - 응답객체 * @throws ServletException * @throws IOException */ private void attachmentsMapByReportID(HttpServletRequest request, HttpServletResponse response) throws ServletException, SQLException, IOException { int index = Integer.parseInt(request.getParameter("index")); String fileIndex = MString.checkNull(request.getParameter("file_index")); Long reportID = MLong.parseLong(request.getParameter("report_id")); PrintWriter out = response.getWriter(); Map> attachmentsMap; CommonDBManager cdb = new CommonDBManager(); ResultSet rs = null; PersistenceManager pm = new MPersistenceManager(PMF.get().getPersistenceManager()); Transaction tx = pm.currentTransaction(); try{ rs = cdb.execQuery("SELECT ATTACHMENTS_PATH AS FILES_NM, DOC_ID AS DOCID, DEPT_ID AS DEPTID FROM MOUMI_TOT_REPORT WHERE ID = ?", reportID); StringBuilder sb = new StringBuilder(); String fileNameEncode = ""; if( rs.next()) { sb.delete(0,sb.length()); if(null != rs.getObject("FILES_NM")){ sb.append("["); String [] files_nm = rs.getString(1).split(";"); String docID = rs.getString(2); String deptID = rs.getString(3); for (int i=0; i < files_nm.length; i++) { fileNameEncode = URLEncoder.encode(files_nm[i], "UTF-8"); if( i >= 1 ) sb.append(","); sb.append("{"); sb.append("\"index\":\""); sb.append(index); sb.append("\",\"fileIndex\":\""); sb.append(fileIndex); sb.append("\",\"reportID\":\""); sb.append(reportID); sb.append("\",\"docID\":\""); sb.append(docID); sb.append("\",\"deptID\":\""); sb.append(deptID); sb.append("\",\"fileName\":\""); sb.append(files_nm[i]); sb.append("\",\"fileNameEncode\":\""); sb.append(fileNameEncode); sb.append("\"}"); } sb.append("]"); }else{ tx.begin(); IUploadable uploadable = pm.getObjectById(TotReport.class, reportID); attachmentsMap = uploadable.getAttachments(); int i = 0; if (attachmentsMap == null || attachmentsMap.isEmpty()) { sb = null; } else { if( sb != null ) { //v2. 2.널 포인터 역참조 (변수) : Add by KWN.HAN //Json형태로 변환하는 메소드 호출 sb.append("["); for (String fileName : attachmentsMap.keySet()) { fileNameEncode = URLEncoder.encode(fileName, "UTF-8"); if( i >= 1 ) sb.append(","); sb.append("{"); sb.append("\"index\":\""); sb.append(index); sb.append("\",\"fileIndex\":\""); sb.append(fileIndex); sb.append("\",\"reportID\":\""); sb.append(reportID); sb.append("\",\"fileName\":\""); sb.append(fileName); sb.append("\",\"fileNameEncode\":\""); sb.append(fileNameEncode); sb.append("\"}"); i=1+1; } sb.append("]"); } //+++++++++++++++++++++++++++++++++++++++++++++ } tx.commit(); } if( sb != null ) out.print(sb); sb = null; } }catch(Exception e){ e.printStackTrace(); if(tx.isActive() ) tx.rollback(); }finally{ if(null != rs) rs.close(); cdb.execClose(); pm.close(); } } /** * 첨부파일명을 Json형태로 변환하여 응답하는 메소드 * @param request - 요청객체 * @param response - 응답객체 * @throws ServletException * @throws IOException */ private void attachmentsMapByBoardID(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { PrintWriter out = response.getWriter(); Long boardID = MLong.parseLong(request.getParameter("board_id")); ArrayList fns= FileUtil.getBoardAttachmentsFileNames(boardID, request,false); if(fns==null||fns.size()==0){ out.print("File is Empty"); return; } ArrayList list=new ArrayList(); for(String fileName:fns){ String fileNameEncode = URLEncoder.encode(fileName, "UTF-8"); StringBuilder sb=new StringBuilder(); sb.append("{"); sb.append("\"boardID\":\""); sb.append(boardID); sb.append("\",\"fileName\":\""); sb.append(fileName); sb.append("\",\"fileNameEncode\":\""); sb.append(fileNameEncode); sb.append("\"}"); list.add(sb.toString()); } String rslt="["+StringUtils.join(list.toArray(),",")+"]"; out.print(rslt); } /** * 제출자료에서 결재대기중(진행), 결재완료된 제출자료의 갯수를 Json형태로 변환하여 응답하는 메소드 * @param request - 요청객체 * @param response - 응답객체 * @throws ServletException * @throws IOException */ private void sendNeisRecogByReportID(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { PrintWriter out = response.getWriter(); Long reportID = MLong.parseLong(request.getParameter("report_id")); //if( LOG.isDebugEnabled() ) { // LOG.debug("reportID={}", reportID.toString()); //} PersistenceManager pm = new MPersistenceManager(PMF.get().getPersistenceManager()); Transaction tx = pm.currentTransaction(); tx.begin(); // 결재대기중(진행), 결재완료된 제출자료의 갯수를 조회한다. // 1건이라도 있으면 서식을 수정해선 안된다. TotReportService totReportService = new TotReportService(pm); int unModifiableCount = totReportService.getUnModifiableCountByReportId(reportID); //LOG.info("AjaxProcessServlet.sendNeisRecogByReportID() reportID : {}, report count(prss = 5 or 6) : {}", new Object[] {reportID, unModifiableCount}); StringBuilder sb = new StringBuilder(); if( sb != null ) { //v2. 2.널 포인터 역참조 (변수) : Add by KWN.HAN //Json형태로 변환하는 메소드 호출 sb.append("["); sb.append("{"); sb.append("\"reportID\":\""); sb.append(reportID); sb.append("\",\"unModifiableCount\":\""); sb.append(unModifiableCount); sb.append("\"}"); sb.append("]"); } //+++++++++++++++++++++++++++++++++++++++++++++ if( sb != null ) out.print(sb); tx.commit(); } // /** * Handles the HTTP GET method. * * @param request servlet request * @param response servlet response * @throws ServletException if a servlet-specific error occurs * @throws IOException if an I/O error occurs */ @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { try { processRequest(request, response); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } /** * Handles the HTTP POST method. * * @param request servlet request * @param response servlet response * @throws ServletException if a servlet-specific error occurs * @throws IOException if an I/O error occurs */ @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { try { processRequest(request, response); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } /** * Returns a short description of the servlet. * * @return a String containing servlet description */ @Override public String getServletInfo() { return "AjaxProcessServlet"; }// }