package com.eactive.ext.kjb.eai; import lombok.Getter; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import java.nio.ByteBuffer; @Slf4j public class EaiBatchMessage { @Getter private String interfaceId = ""; @Getter private String baseDate = ""; @Getter private String count = ""; @Getter private String resultCode = ""; @Getter private String filename = ""; private String rawMessage = ""; private boolean isReadOnly = false; private EaiBatchMessage() {} public static EaiBatchMessage createRequest(String interfaceId, String filename) { EaiBatchMessage message = new EaiBatchMessage(); message.interfaceId = interfaceId; message.filename = filename; return message; } public static EaiBatchMessage fromResponse(String rawMessage) { EaiBatchMessage message = new EaiBatchMessage(); message.rawMessage = rawMessage; message.isReadOnly = true; if (rawMessage.length() >= 40) { message.interfaceId = rawMessage.substring(0, 20).trim(); message.baseDate = rawMessage.substring(20, 28).trim(); message.count = rawMessage.substring(28, 38).trim(); message.resultCode = rawMessage.substring(38, 39).trim(); // filename 은 @@가 발견되면 이전 까지 trim / 발견되지 않으면 나머지 전체 그리고 trim int endIdx = rawMessage.indexOf("@@", 39); if (endIdx == -1) { message.filename = rawMessage.substring(39).trim(); } else { message.filename = rawMessage.substring(39, endIdx).trim(); } } if (StringUtils.isEmpty(message.interfaceId)) { log.error("Invalid EAI Batch response message: interfaceId is empty. rawMessage={}", rawMessage); throw new IllegalArgumentException("Invalid EAI Batch response message: interfaceId is empty"); } return message; } @Override public String toString() { if (isReadOnly) { return rawMessage; } else { ByteBuffer buffer = ByteBuffer.allocate(1024); // 0~19 : 인터페이스ID (20) buffer.put(fixedString(interfaceId, 20)); // 19-8: 기준일자 (8) buffer.put(fixedString(baseDate, 8)); // 27-10 : 건수 (10) buffer.put(fixedString(count, 10)); // 37-1 : 결과코드 (1) buffer.put(fixedString(resultCode, 1)); // 38-100 : 파일명 (100) buffer.put(fixedString(filename, 100)); // 종료 구분자 (2) buffer.put("@@".getBytes()); return new String(buffer.array()).trim(); } } private byte[] fixedString(String str, int length) { if (str == null) { str = ""; } byte[] strBytes = str.getBytes(); byte[] result = new byte[length]; int copyLength = Math.min(strBytes.length, length); System.arraycopy(strBytes, 0, result, 0, copyLength); for (int i = copyLength; i < length; i++) { result[i] = ' '; } return result; } }