package com.eactive.eai.adapter.ftp; import java.io.File; import java.io.IOException; import java.net.Socket; import org.apache.commons.lang3.StringUtils; import org.apache.commons.net.ftp.FTPFile; import com.eactive.eai.adapter.socket.config.ConfigurationContext; import com.eactive.eai.adapter.socket.service.SocketService; import com.eactive.eai.batch.common.CalendarUtil; import com.eactive.eai.batch.common.LogUtil; import com.eactive.eai.batch.common.StringUtil; import com.eactive.eai.batch.doc.BatchDoc; import com.eactive.eai.batch.ftp.FTPUtil; import com.eactive.eai.batch.running.BatchRunningJobManager; import com.eactive.eai.common.exception.ExceptionUtil; import com.eactive.eai.common.property.PropManager; import com.eactive.eai.common.util.DatetimeUtil; import com.eactive.eai.common.util.Logger; // NICE CB 자료 송수신 ( SFTP ) // IP : 10.94.50.207 PORT : 22 // ID : kjb01 PWD: kjb1111 // 파일명 // 송신: // F13_MXALINF 90 당행CB정보송신 // F13_CSALINB 90 당행CB정보송신 // 1A9_REWOINF 90 당행조기경보회원등록(부동산) // 수신: // NICE_MXALINF_F13 Y 90 나이스CB정보수신 // NICE_CSALINB_F13 Y 90 나이스CB정보수신 // NICE_MXALINF_F13_CARD N 90 나이스CB정보수신 // NICE_REWORLT_1A9 N 90 나이스부동산권리정보(정상분) // NICE_REWOERR_1A9 N 90 나이스부동산권리정보(오류분) // NICE_EWRECHG_1A9 N 90 나이스부동산권리정보(변경분) // TEST / PROD 구분이 없음, TEST파일의 경우 파일명 어딘가에 TEST라는 표시가 있으면 됨. // 김효희 과장. 02-2122-4033 public class FTPNC extends Transfer implements SocketService{ private static final String PROP_GROUP_NAME_PREFIX = "TelegramInfo"; private static final String REMOTE_PATH = "remote.path"; private static final String POSTFIX = "post.fix"; public void sendFile(BatchDoc batchDoc) throws Exception { logger.info("[FTPNC] ■ FEP → 대외기관파일 송신 시작...... [" + batchDoc.getBatchMsg().getHeader().getUUID()+ "]"); firstActivity = System.currentTimeMillis(); setLastActivity(); BatchRunningJobManager.getInstance().addRunningJobInfo( batchDoc.getBatchMsg().getHeader().getUUID(), this, batchDoc); //Shell 명령어를 Runtime 으로 실행 try { String ipaddress = batchDoc.getBatchMsg().getHeader().getRemoteIP(); int port = Integer.parseInt(batchDoc.getBatchMsg().getHeader().getPort()); String userid = batchDoc.getBatchMsg().getHeader().getUserID(); String passwd = batchDoc.getBatchMsg().getHeader().getUserPassword(); String propName = PROP_GROUP_NAME_PREFIX + "{" + batchDoc.getBatchMsg().getHeader().getProcessCode() + "_" + batchDoc.getBatchMsg().getHeader().getInstitutionCode() + "}"; PropManager pmanager = PropManager.getInstance(); String remotePath = pmanager.getProperties(propName).getProperty(REMOTE_PATH); if ( remotePath == null ){ throw new Exception("해당 기관에 전송 경로가 지정되어 있지 않습니다. -propName:" + propName + "," + REMOTE_PATH); } String authType = pmanager.getProperties(propName).getProperty(AUTH_TYPE); if (StringUtils.isBlank(authType)) { authType = AUTH_TYPE_ID; // id } //20220712 String connTimeoutStr = pmanager.getProperties(propName).getProperty(CONNECTION_TIMEOUT, "10"); int connTimeout = Integer.parseInt(connTimeoutStr); String setTimeoutStr = pmanager.getProperties(propName).getProperty(READ_TIMEOUT, "10"); int setTimeout = Integer.parseInt(setTimeoutStr); String bandWidthLimit = pmanager.getProperties(propName).getProperty(BADNWIDTH, "0"); bandWidthLimit = bandWidthLimit.replace("K", "000").replace("M", "000000").replaceAll(",", ""); int bandWidth = Integer.parseInt(bandWidthLimit); String sendFileName = batchDoc.getBatchMsg().getHeader().getFilePath() + "/" + batchDoc.getBatchMsg().getHeader().getRenamedFileName(); //String remoteFileName = remotePath + batchDoc.getBatchMsg().getHeader().getFileName(); String remoteFileName = batchDoc.getBatchMsg().getHeader().getFileName(); setFileHeaderAndTrailer(batchDoc, new File(sendFileName)); //나이스 테스트 파일명 "TEST_" 운영path는 반드시 "/"로 끝나야 한다. String fullPath = remotePath+remoteFileName; String [] arr = fullPath.split("/"); remoteFileName = arr[arr.length-1]; remotePath = fullPath.replace(remoteFileName, ""); batchDoc.getBatchMsg().getBody().setPhaseStartTime(CalendarUtil.getCurrentTimeNoDash()); LogUtil.setLogFileStart(batchDoc); //FTPUtil.store(ipaddress, port, userid, passwd, remoteFileName, sendFileName, true, batchDoc.getLogger(ElinkLogger.LOGGER_ADAPTER)); FTPUtil.store(batchDoc, ipaddress, port, userid, passwd, remotePath, remoteFileName, sendFileName, connTimeout, setTimeout, true, bandWidth, batchDoc.getLogger(Logger.LOGGER_ADAPTER), authType); //FTPUtil.store(batchDoc, ipaddress, port, userid, passwd, remoteFileName, sendFileName, // connTimeout, setTimeout, false, bandWidth, batchDoc.getLogger(ElinkLogger.LOGGER_ADAPTER)); logger.debug("guid ["+batchDoc.getBatchMsg().getHeader().getUUID()+"]"+"FTPUtil.store finish<<<<<<<<<<<<<<<<<<<<<<<"); batchDoc.getBatchMsg().getBody().setPhaseEndTime(CalendarUtil.getCurrentTimeNoDash()); LogUtil.setLogFileEnd(batchDoc); } catch(Exception ex) { String[] msgArgs = new String[1]; msgArgs[0] = batchDoc.getBatchMsg().getHeader().getProcessCode(); String errCode = "BECEAIFJI002"; String errMsg = ExceptionUtil.getErrorCode (ex, errCode, msgArgs); batchDoc.getBatchMsg().getBody().setErrorMsg(errMsg); batchDoc.getBatchMsg().getBody().setPhaseEndTime(CalendarUtil.getCurrentTimeNoDash()); LogUtil.setErrorLog(batchDoc, ex.getMessage()); logger.error( errMsg, ex ); throw ex; } finally { BatchRunningJobManager.getInstance().removeRunningJobInfo( batchDoc.getBatchMsg().getHeader().getUUID()); this.disconnect(); } logger.info("[FTPNC] ■ FEP → 대외기관 파일 송신 완료. [" + batchDoc.getBatchMsg().getHeader().getUUID()+ "]"); } public void recvFile(BatchDoc batchDoc) throws Exception { logger.info("[FTPNC] ■ 대외기관→FEP 파일 수신 시작...... "); firstActivity = System.currentTimeMillis(); setLastActivity(); BatchRunningJobManager.getInstance().addRunningJobInfo( batchDoc.getBatchMsg().getHeader().getUUID(), this, batchDoc); //2. System FTP Shell 명령어를 Runtime 으로 실행 try { String ipaddress = batchDoc.getBatchMsg().getHeader().getRemoteIP(); int port = Integer.parseInt(batchDoc.getBatchMsg().getHeader().getPort()); String userid = batchDoc.getBatchMsg().getHeader().getUserID(); String passwd = batchDoc.getBatchMsg().getHeader().getUserPassword(); String propName = PROP_GROUP_NAME_PREFIX + "{" + batchDoc.getBatchMsg().getHeader().getProcessCode() + "_" + batchDoc.getBatchMsg().getHeader().getInstitutionCode() + "}"; String jobName = PROP_GROUP_NAME_PREFIX + "{" + batchDoc.getBatchMsg().getHeader().getBizCode() + "_" + batchDoc.getBatchMsg().getHeader().getInstitutionCode() + "}"; PropManager pmanager = PropManager.getInstance(); String remotePath = pmanager.getProperties(propName).getProperty(REMOTE_PATH); String postfix = null; try{ postfix = pmanager.getProperties(jobName).getProperty(POSTFIX); }catch( Exception e ){} if ( remotePath == null ){ throw new Exception("해당 기관에 전송 경로가 지정되어 있지 않습니다. -propName:" + propName + "," + REMOTE_PATH); } if ( !remotePath.endsWith("/") ) remotePath = remotePath + "/"; String authType = pmanager.getProperties(propName).getProperty(AUTH_TYPE); if (StringUtils.isBlank(authType)) { authType = AUTH_TYPE_ID; // id } //20220712 String connTimeoutStr = pmanager.getProperties(propName).getProperty(CONNECTION_TIMEOUT, "10"); int connTimeout = Integer.parseInt(connTimeoutStr); String setTimeoutStr = pmanager.getProperties(propName).getProperty(READ_TIMEOUT, "10"); int setTimeout = Integer.parseInt(setTimeoutStr); String bandWidthLimit = pmanager.getProperties(propName).getProperty(BADNWIDTH, "0"); bandWidthLimit = bandWidthLimit.replace("K", "000").replace("M", "000000").replaceAll(",", ""); int bandWidth = Integer.parseInt(bandWidthLimit); logger.debug( "[FTPNC]FileName:" + batchDoc.getBatchMsg().getHeader().getFileName()); String reqFileName = batchDoc.getBatchMsg().getHeader().getFileName(); String baseDate = DatetimeUtil.getCurrentDate(); if ( reqFileName != null && reqFileName.length() > 8 ){ if ( DatetimeUtil.isRightDate(reqFileName.substring(reqFileName.length() - 8 )) ){ baseDate = reqFileName.substring(reqFileName.length() - 8 ); batchDoc.getBatchMsg().getHeader().setBaseDate(baseDate); } } reqFileName = "NICE_" + batchDoc.getBatchMsg().getHeader().getBizCode() + "." + baseDate.substring(2); if ( postfix != null && !!postfix.equals("")){ reqFileName = reqFileName + postfix; } logger.debug( "[FTPNC]reqFileName:" + reqFileName ); try { FTPFile[] list = FTPUtil.listFiles(ipaddress, port, userid, passwd, remotePath, null, true, batchDoc.getLogger(Logger.LOGGER_ADAPTER), authType); for ( int inx = 0 ; inx < list.length; inx++){ FTPFile file = list[inx]; if ( file.getName().equals(reqFileName) ){ batchDoc.getBatchMsg().getHeader().setFileSize(file.getSize()); batchDoc.getBatchMsg().getBody().setRecCnt(1); batchDoc.getBatchMsg().getBody().setPhaseStartTime(CalendarUtil.getCurrentTimeNoDash()); batchDoc.getBatchMsg().getHeader().setFileName(file.getName()); LogUtil.setLogFileStart(batchDoc); //FTPUtil.retrieve(ipaddress, port, userid, passwd, remotePath + "/" + file.getName(), batchDoc.getBatchMsg().getHeader().getFilePath(), true, batchDoc.getLogger(ElinkLogger.LOGGER_ADAPTER)); FTPUtil.retrieve(batchDoc, ipaddress, port, userid, passwd, remotePath, file.getName(), batchDoc.getBatchMsg().getHeader().getFilePath(), connTimeout, setTimeout, true, bandWidth, batchDoc.getLogger(Logger.LOGGER_ADAPTER), authType); //batchDoc.getBatchMsg().getHeader().setFileSize(fileSize); batchDoc.getBatchMsg().getHeader().setTotRecCnt(1); String recvFile = batchDoc.getBatchMsg().getHeader().getFilePath() + File.separator + file.getName(); File rcvRealFile = new File( recvFile ); File rcvChkFile = new File( StringUtil.realToRootDir(recvFile) ); try { File rcvArchFile = new File( StringUtil.realToArchDir(recvFile) ); if (rcvRealFile.exists() && rcvRealFile.length() == batchDoc.getBatchMsg().getHeader().getFileSize() ) { //setFileHeaderAndTrailer(batchDoc, rcvRealFile); rcvRealFile.renameTo(rcvArchFile); rcvChkFile.createNewFile(); }else{ throw new Exception("파일수신에 실패하였습니다."); } //File 종료시간 설정 batchDoc.getBatchMsg().getBody().setPhaseEndTime(CalendarUtil.getCurrentTimeNoDash()); LogUtil.setLogFileEnd(batchDoc); } catch (Exception e) { throw e; } } } }catch ( Exception e ){ if ( !e.getMessage().contains("No such file")) throw e; } } catch(Exception ex) { String[] msgArgs = new String[1]; msgArgs[0] = batchDoc.getBatchMsg().getHeader().getProcessCode(); String errCode = "BECEAIFJI002"; String errMsg = ExceptionUtil.getErrorCode (ex, errCode, msgArgs); batchDoc.getBatchMsg().getBody().setErrorMsg(errMsg); LogUtil.setErrorLog(batchDoc, ex.getMessage()); logger.error( errMsg, ex ); throw ex; } finally { this.disconnect(); } logger.info("[FTPNC] ■ VAN사 → FEP 파일 수신 완료."); } @Override public void shutdown() { } @Override public Socket getCurrentSocket() { return null; } @Override public boolean connect() { return false; } @Override public ConfigurationContext getContext() { return null; } @Override public void setControl(Object control) { } @Override public void notifyMessage() { } @Override public boolean idle(long timeout) { return false; } @Override public int getCurrentState() { return 0; } @Override public boolean isConnected() throws IOException { return false; } @Override public boolean isActive() { return false; } @Override public void checkActivity() { } @Override public String getRemoteIPAddress() { return null; } @Override public void setLastActivity() { lastActivity = System.currentTimeMillis(); } @Override public long getFirstActivity() { return firstActivity; } @Override public long getLastActivity() { return lastActivity; } }