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; /** * 금용결제원 SFTP * 빅데이터 기반의 금융의심거래정보 분석 공유 서비스[FAS] * * 이름은 KS(Kftc Sftp)가 사용 중이라 FAS에 따옴 * * 거래일자 확인: 전일자 YYYYMMDD 파일 * 파일명 : FS0001 * * 오류 * 1. 거래일자 파일이 없는 경우에 오류 발생 */ public class FTPFA 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"; /** sftp 사용 여부 */ private static final String SFTP_YN = "sftp"; public void sendFile(BatchDoc batchDoc) throws Exception { throw new Exception("해당 Component 에 의한 FTP 송신이 구현되지 않았습니다."); } public void recvFile(BatchDoc batchDoc) throws Exception { logger.info("[FTPFA] ■ 대외기관→FEP 파일 수신 시작...... "); firstActivity = System.currentTimeMillis(); setLastActivity(); BatchRunningJobManager.getInstance().addRunningJobInfo( batchDoc.getBatchMsg().getHeader().getUUID(), this, batchDoc); 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().getProcessCode() + "_" + batchDoc.getBatchMsg().getHeader().getBizCode() + "}"; PropManager pmanager = PropManager.getInstance(); String remotePath = pmanager.getProperties(propName).getProperty(REMOTE_PATH); String sftpYn = pmanager.getProperties(propName).getProperty(SFTP_YN); boolean isSftp = "Y".equalsIgnoreCase(sftpYn); String postfix = null; try{ postfix = pmanager.getProperties(jobName).getProperty(POSTFIX); if (logger.isDebugEnabled()) { logger.debug( "[FTPFA]postfix:" + 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); if (logger.isDebugEnabled()) { logger.debug( "[FTPFA]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 ); } } // 전일자 baseDate = DatetimeUtil.getDayAddedDate(baseDate, -1); batchDoc.getBatchMsg().getHeader().setBaseDate(baseDate); reqFileName = batchDoc.getBatchMsg().getHeader().getBizCode(); if ( postfix != null && !postfix.equals("")) { reqFileName = reqFileName + postfix; } logger.debug( "[FTPFA]reqFileName:" + reqFileName ); try { FTPFile[] list = FTPUtil.listFiles(ipaddress, port, userid, passwd, remotePath, null, isSftp, batchDoc.getLogger(Logger.LOGGER_ADAPTER), authType); // 전일자 파일 확인 boolean dateFileExist = false; FTPFile remoteFile = null; for (FTPFile file : list){ if (file.getName().equals(baseDate)) { dateFileExist = true; } if (file.getName().equals(reqFileName)) { remoteFile = file; } } if (dateFileExist == false) { throw new Exception("거래일자 파일(" + baseDate + ")이 없습니다."); } if (remoteFile != null) { batchDoc.getBatchMsg().getHeader().setFileSize(remoteFile.getSize()); batchDoc.getBatchMsg().getBody().setRecCnt(1); batchDoc.getBatchMsg().getBody().setPhaseStartTime(CalendarUtil.getCurrentTimeNoDash()); batchDoc.getBatchMsg().getHeader().setFileName(remoteFile.getName()); LogUtil.setLogFileStart(batchDoc); //FTPUtil.retrieve(ipaddress, port, userid, passwd, remotePath + "/" + remoteFile.getName(), batchDoc.getBatchMsg().getHeader().getFilePath(), isSftp, batchDoc.getLogger(ElinkLogger.LOGGER_ADAPTER)); FTPUtil.retrieve(batchDoc, ipaddress, port, userid, passwd, remotePath, remoteFile.getName(), batchDoc.getBatchMsg().getHeader().getFilePath(), connTimeout, setTimeout, isSftp, 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 + remoteFile.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("[FTPFA] ■ 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; } }