diff --git a/kjb-errors/src/test/java/com/eactive/eai/kjb/errors/EAPIM_ErrorResponse_WorkHistory.md b/kjb-errors/src/test/java/com/eactive/eai/kjb/errors/EAPIM_ErrorResponse_WorkHistory.md index 0a31f5f..e55730c 100644 --- a/kjb-errors/src/test/java/com/eactive/eai/kjb/errors/EAPIM_ErrorResponse_WorkHistory.md +++ b/kjb-errors/src/test/java/com/eactive/eai/kjb/errors/EAPIM_ErrorResponse_WorkHistory.md @@ -5,7 +5,7 @@ ### 목표 모든 HTTP 에러 응답을 다음과 같은 표준 JSON 포맷으로 통일: ```json -{"error":{"code":"에러코드","message":"에러메시지"}} +{"error":"에러코드","error_description":"에러메시지"} ``` ## 변경 내역 @@ -15,7 +15,7 @@ - 표준 에러 응답 포맷 정의 ```java - public static final String ERROR_MESSAGE_DEFAULT_FORMAT = "{\"error\":{\"code\":\"%s\",\"message\":\"%s\"}}"; + public static final String ERROR_MESSAGE_DEFAULT_FORMAT = "{\"error\":\"%s\",\"error_description\":\"%s\"}"; ``` - 에러 코드 상수 추가 @@ -197,7 +197,7 @@ out.println(jsonErrorMessage); **검증 항목**: - HTTP 상태 코드 정확성 -- 응답 포맷이 `{"error":{"code":"...","message":"..."}}` 형식인지 확인 +- 응답 포맷이 `{"error":"...","error_description":"..."}` 형식인지 확인 - 에러 코드가 적절히 매핑되는지 확인 ## 에러 코드 매핑 diff --git a/kjb-errors/src/test/java/com/eactive/eai/kjb/errors/EAPIM_ExceptionHandler_Test.md b/kjb-errors/src/test/java/com/eactive/eai/kjb/errors/EAPIM_ExceptionHandler_Test.md index d0e7546..3d1cb0e 100644 --- a/kjb-errors/src/test/java/com/eactive/eai/kjb/errors/EAPIM_ExceptionHandler_Test.md +++ b/kjb-errors/src/test/java/com/eactive/eai/kjb/errors/EAPIM_ExceptionHandler_Test.md @@ -5,7 +5,7 @@ **에러 응답 포맷**: ```json -{"error":{"code":"에러코드","message":"에러메시지"}} +{"error":"에러코드","error_description":"에러메시지"} ``` ## 테스트 케이스 diff --git a/kjb-errors/src/test/java/com/eactive/eai/kjb/errors/ErrorResponseValidator.java b/kjb-errors/src/test/java/com/eactive/eai/kjb/errors/ErrorResponseValidator.java index e249dbe..032ea78 100644 --- a/kjb-errors/src/test/java/com/eactive/eai/kjb/errors/ErrorResponseValidator.java +++ b/kjb-errors/src/test/java/com/eactive/eai/kjb/errors/ErrorResponseValidator.java @@ -8,7 +8,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; /** * MessageUtil.makeJsonErrorMessage 기본 포맷 검증 유틸리티 - * 기본 포맷: { "error" : {"code":"%s","message":"%s"} } + * 기본 포맷: {"error":"에러코드","error_description":"에러메시지"} */ public class ErrorResponseValidator { @@ -24,15 +24,10 @@ public class ErrorResponseValidator { assertNotNull(jsonNode, "JSON 응답이 null입니다"); assertTrue(jsonNode.has("error"), "error 필드가 존재해야 합니다"); + assertTrue(jsonNode.has("error_description"), "error_description 필드가 존재해야 합니다"); - JsonNode errorNode = jsonNode.get("error"); - assertNotNull(errorNode, "error 객체가 null입니다"); - - assertTrue(errorNode.has("code"), "error.code 필드가 존재해야 합니다"); - assertTrue(errorNode.has("message"), "error.message 필드가 존재해야 합니다"); - - assertNotNull(errorNode.get("code").asText(), "error.code 값이 null입니다"); - assertNotNull(errorNode.get("message").asText(), "error.message 값이 null입니다"); + assertNotNull(jsonNode.get("error").asText(), "error 값이 null입니다"); + assertNotNull(jsonNode.get("error_description").asText(), "error_description 값이 null입니다"); // 검증 성공 시 Pretty Print String prettyJson = objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(jsonNode); diff --git a/src/main/java/com/eactive/eai/adapter/service/ApiAdapterService.java b/src/main/java/com/eactive/eai/adapter/service/ApiAdapterService.java index cc8da25..a70dbd5 100644 --- a/src/main/java/com/eactive/eai/adapter/service/ApiAdapterService.java +++ b/src/main/java/com/eactive/eai/adapter/service/ApiAdapterService.java @@ -115,8 +115,13 @@ public class ApiAdapterService extends HttpAdapterServiceSupport { transactionProp.put(HEADER_NAME_CLIENT_ID, getHeaders(request).get(HEADER_NAME_CLIENT_ID)); } transactionProp.put(ENCRYPT_BASE_TYPE, httpProp.getProperty(ENCRYPT_BASE_TYPE, "")); //jwhong - //transactionProp.put(INBOUND_TOKEN, getHeaders(request).get(INBOUND_TOKEN)); // jwhong - transactionProp.put(INBOUND_TOKEN, getHeaders(request).get(INBOUND_TOKEN) != null ? getHeaders(request).get(INBOUND_TOKEN) : ""); //jwhong , null 이면 default로 "" put +// //transactionProp.put(INBOUND_TOKEN, getHeaders(request).get(INBOUND_TOKEN)); // jwhong +// transactionProp.put(INBOUND_TOKEN, getHeaders(request).get(INBOUND_TOKEN) != null ? getHeaders(request).get(INBOUND_TOKEN) : ""); //jwhong , null 이면 default로 "" put + String inboundToken = getHeaders(request).getOrDefault(INBOUND_TOKEN, "").toString(); + if (StringUtils.isNotBlank(inboundToken) && StringUtils.startsWith(inboundToken, "Bearer ")) { + inboundToken = inboundToken.substring(7); + } + transactionProp.put(INBOUND_TOKEN, inboundToken); transactionProp.put(ENCRYPT_AES256_IV, httpProp.getProperty(ENCRYPT_AES256_IV, "")); //jwhong transactionProp.put(ENCRYPT_AES256_KEY, httpProp.getProperty(ENCRYPT_AES256_KEY, "")); //jwhong diff --git a/src/main/java/com/eactive/eai/authserver/custom/KjbMGOAuth2Controller.java b/src/main/java/com/eactive/eai/authserver/custom/KjbMGOAuth2Controller.java index 00781b8..9f376ea 100644 --- a/src/main/java/com/eactive/eai/authserver/custom/KjbMGOAuth2Controller.java +++ b/src/main/java/com/eactive/eai/authserver/custom/KjbMGOAuth2Controller.java @@ -92,7 +92,7 @@ public class KjbMGOAuth2Controller { } ClientDetails clientDetails = OAuth2Manager.getInstance().getClientDeatilsStore().get(clientId); - verifyClient(clientDetails, clientId, scopeSet); + verifyClient(clientDetails, clientId, clientSecret, scopeSet); String traceId = UUID.randomUUID().toString().replace("-", ""); response.setHeader(HEADER_TRACEID, traceId); @@ -139,7 +139,7 @@ public class KjbMGOAuth2Controller { } } - private void verifyClient(ClientDetails clientDetails, String clientId, Set scopeSet) + private void verifyClient(ClientDetails clientDetails, String clientId, String clientSecret, Set scopeSet) throws JwtAuthException { if (StringUtils.isBlank(clientId)) { @@ -148,13 +148,24 @@ public class KjbMGOAuth2Controller { "Invalid Mandatory Field {client_id}"); } - if (clientDetails == null) { throw new JwtAuthException( String.format("%d%s%s", HttpStatus.UNAUTHORIZED.value(), SERVICE_CODE_ACCESS_TOKEN, "00"), "Unauthorized. [client not found]"); } + if (StringUtils.isBlank(clientSecret)) { + throw new JwtAuthException( + String.format("%d%s%s", HttpStatus.BAD_REQUEST.value(), SERVICE_CODE_ACCESS_TOKEN, "02"), + "Invalid Mandatory Field {client_secret}"); + } + + if (StringUtils.equals(clientDetails.getClientSecret(), clientSecret)) { + throw new JwtAuthException( + String.format("%d%s%s", HttpStatus.UNAUTHORIZED.value(), SERVICE_CODE_ACCESS_TOKEN, "00"), + "Unauthorized. [Bad client credentials(Client Secret is not match)]"); + } + if (scopeSet.isEmpty()) { throw new JwtAuthException( String.format("%d%s%s", HttpStatus.BAD_REQUEST.value(), SERVICE_CODE_ACCESS_TOKEN, "02"), diff --git a/src/main/java/com/eactive/eai/custom/kjb/adapter/http/client/filter/AsyncReponseFilter.java b/src/main/java/com/eactive/eai/custom/kjb/adapter/http/client/filter/AsyncReponseFilter.java new file mode 100644 index 0000000..a381f31 --- /dev/null +++ b/src/main/java/com/eactive/eai/custom/kjb/adapter/http/client/filter/AsyncReponseFilter.java @@ -0,0 +1,65 @@ +package com.eactive.eai.custom.kjb.adapter.http.client.filter; + +import java.util.Map; +import java.util.Properties; +import java.util.TreeMap; + +import com.eactive.eai.adapter.http.dynamic.HttpAdapterServiceKey; +import com.eactive.eai.common.TransactionContextKeys; +import com.eactive.eai.common.property.PropGroupVO; +import com.eactive.eai.common.property.PropManager; +import com.eactive.eai.common.util.Logger; + + +public class AsyncReponseFilter implements HttpClientAdapterFilter, HttpAdapterServiceKey { + protected static Logger logger = Logger.getLogger(Logger.LOGGER_ADAPTER); + + public static final String X_TRACE_ID = "partnerTraceId"; + public static final String TRACE_ID = "traceId"; + + @Override + public Object doPreFilter(String adptGrpName, String adptName, Properties prop, Object message, Properties tempProp) + throws Exception { + + logger.debug("AsyncReponseFilter] PreFilter Processing Start!!"); + Object returnMessage = message; + String traceId = tempProp.getProperty(TransactionContextKeys.TRANSACTION_UUID, ""); + + Properties filterHeaders = (Properties) tempProp.get("FILTERHEADER"); + if (filterHeaders == null) { + filterHeaders = new Properties(); + tempProp.put("FILTERHEADER", filterHeaders); + } + try { + Properties inboundHeader = (Properties)tempProp.get(INBOUND_HEADER); + Map inboundHeaderMap = new TreeMap<>(String.CASE_INSENSITIVE_ORDER); + + // Properties 내용을 모두 복사 + for (String name : inboundHeader.stringPropertyNames()) { + inboundHeaderMap.put(name, inboundHeader.getProperty(name)); + } + + if (!inboundHeaderMap.isEmpty()) { + if (inboundHeaderMap.containsKey(X_TRACE_ID)) { + filterHeaders.put(X_TRACE_ID, inboundHeaderMap.get(X_TRACE_ID)); + logger.debug("AsyncReponseFilter] Processing Key ["+X_TRACE_ID+"], value ["+inboundHeaderMap.get(X_TRACE_ID)+"]"); + } + } + filterHeaders.setProperty(TRACE_ID, traceId); + logger.debug("AsyncReponseFilter] Processing Key ["+TRACE_ID+"], value ["+traceId+"]"); + + } catch (Exception e) { + logger.error(e.getMessage()); + } + + return returnMessage; + } + + @Override + public Object doPostFilter(String adptGrpName, String adptName, Properties prop, Object message, + Properties tempProp) throws Exception { + return message; + } + +} + diff --git a/src/main/java/com/eactive/eai/custom/kjb/adapter/http/client/filter/HttpClient5AdapterFilterFactory.java b/src/main/java/com/eactive/eai/custom/kjb/adapter/http/client/filter/HttpClient5AdapterFilterFactory.java new file mode 100644 index 0000000..72f99ec --- /dev/null +++ b/src/main/java/com/eactive/eai/custom/kjb/adapter/http/client/filter/HttpClient5AdapterFilterFactory.java @@ -0,0 +1,106 @@ +package com.eactive.eai.custom.kjb.adapter.http.client.filter; + +import java.util.concurrent.ConcurrentHashMap; + +import com.eactive.eai.common.util.Logger; + +public class HttpClient5AdapterFilterFactory { + static Logger logger = Logger.getLogger(Logger.LOGGER_ADAPTER); + static String basePackage = "com.eactive.eai.custom.kjb.adapter.http.client.filter"; + private static ConcurrentHashMap h = new ConcurrentHashMap<>(); + private static ConcurrentHashMap eh = new ConcurrentHashMap<>(); + + private HttpClient5AdapterFilterFactory() { + throw new IllegalStateException("Utility class"); + } + + public static HttpClientAdapterFilter createFilter(String type) { + if (h.containsKey(type)) { + return h.get(type); + } + + HttpClientAdapterFilter filter = null; + switch (HttpClient5AdapterFilterType.getValue(type)) { + case SIMPLEFRAMEWORK: + filter = new SimpleFrameworkFilter(); + break; + case JBOBP: + filter = new JBOBPFilter(); + break; + case KFTCFACE: + filter = new KFTCFaceFilter(); + break; + case KFTCP2P: + filter = new KFTCP2PFilter(); + break; + case KAKAOBANK: + filter = new KAKAOBankFilter(); + break; + case NAVERFIN: + filter = new NAVERFinFilter(); + break; + case NICECREDIT: + filter = new NICECreditFilter(); + break; + case TOSSBANK: + filter = new TOSSBankFilter(); + break; + case ASYNCRESPONSE: + filter = new AsyncReponseFilter(); + break; + default: + filter = classForName(type); + if (filter == null) { + filter = classForName(basePackage + "." + type); + } + break; + } + + if (filter != null) { + h.put(type, filter); + return filter; + } else { + return null; + } + } + + private static HttpClientAdapterFilter classForName(String type) { + try { + Class cl = Class.forName(type); + return (HttpClientAdapterFilter) cl.newInstance(); + } catch (ClassNotFoundException | IllegalAccessException | InstantiationException e) { + logger.error("Cannot create a HttpClientAdapterFilter. - {}", type); + return null; + } + } + + public static HttpClientAdapterExceptionFilter createExceptionFilter(String type) { + if (eh.containsKey(type)) { + return eh.get(type); + } + + HttpClientAdapterExceptionFilter filter = classForExceptionFilterName(type); + if (filter == null) { + filter = classForExceptionFilterName(basePackage + "." + type); + } + + if (filter != null) { + eh.put(type, filter); + return filter; + } else { + return null; + } + } + + private static HttpClientAdapterExceptionFilter classForExceptionFilterName(String type) { + try { + Class cl = Class.forName(type); + return (HttpClientAdapterExceptionFilter) cl.newInstance(); + } catch (ClassNotFoundException | IllegalAccessException | InstantiationException e) { + logger.error("Cannot create a HttpClientAdapterExceptionFilter. - {}", type); + return null; + } + } + + +} \ No newline at end of file diff --git a/src/main/java/com/eactive/eai/custom/kjb/adapter/http/client/filter/HttpClient5AdapterFilterType.java b/src/main/java/com/eactive/eai/custom/kjb/adapter/http/client/filter/HttpClient5AdapterFilterType.java new file mode 100644 index 0000000..c927220 --- /dev/null +++ b/src/main/java/com/eactive/eai/custom/kjb/adapter/http/client/filter/HttpClient5AdapterFilterType.java @@ -0,0 +1,24 @@ +package com.eactive.eai.custom.kjb.adapter.http.client.filter; + +public enum HttpClient5AdapterFilterType { + SIMPLEFRAMEWORK, + JBOBP, + KFTCFACE, + KFTCP2P, + KAKAOBANK, + NAVERFIN, + NICECREDIT, + TOSSBANK, + ASYNCRESPONSE, + UNKNOWN; + + public static HttpClient5AdapterFilterType getValue(String type) { + try { + return valueOf(type.toUpperCase()); + } catch (NullPointerException e) { + return UNKNOWN; + } catch (Exception e) { + return UNKNOWN; + } + } +} diff --git a/src/main/java/com/eactive/eai/custom/kjb/adapter/http/client/filter/HttpClientAdapterBaseFilter.java b/src/main/java/com/eactive/eai/custom/kjb/adapter/http/client/filter/HttpClientAdapterBaseFilter.java new file mode 100644 index 0000000..25f710a --- /dev/null +++ b/src/main/java/com/eactive/eai/custom/kjb/adapter/http/client/filter/HttpClientAdapterBaseFilter.java @@ -0,0 +1,62 @@ +package com.eactive.eai.custom.kjb.adapter.http.client.filter; + +import java.util.ArrayList; +import java.util.List; +import java.util.Properties; + +import com.eactive.eai.common.util.Logger; + +public abstract class HttpClientAdapterBaseFilter implements HttpClientAdapterFilter { + protected static Logger logger = Logger.getLogger(Logger.LOGGER_ADAPTER); + protected String filterName = ""; + protected List filters; + + protected HttpClientAdapterBaseFilter(String filterName) { + this.filterName = filterName; + filters = new ArrayList<>(); + logger.info("{}] filter created.", filterName); + } + + protected void addFilter(HttpClientAdapterFilter filter) { + filters.add(filter); + logger.info("{}] sub filter({}) added. filters= {}", filterName, filter, filters); + } + + @Override + public Object doPreFilter(String adptGrpName, String adptName, Properties prop, Object message, Properties tempProp) + throws Exception { + try { + Object filteredMessage = message; + for(HttpClientAdapterFilter subFilter : filters) { + logger.debug("{}] sub filter({}) doPreFilter start.", filterName, subFilter); + filteredMessage = subFilter.doPreFilter(adptGrpName, adptName, prop, filteredMessage, tempProp); + logger.debug("{}] sub filter({}) doPreFilter end.", filterName, subFilter); + } + + return filteredMessage; + } catch (Exception e) { + logger.error(this.filterName + "] doPreFilter error.", e); + throw e; + } + } + + @Override + public Object doPostFilter(String adptGrpName, String adptName, Properties prop, Object message, + Properties tempProp) throws Exception { + try { + Object filteredMessage = message; + for(HttpClientAdapterFilter subFilter : filters) { + logger.debug("{}] sub filter({}) doPostFilter start.", filterName, subFilter); + filteredMessage = subFilter.doPostFilter(adptGrpName, adptName, prop, filteredMessage, tempProp); + logger.debug("{}] sub filter({}) doPostFilter end.", filterName, subFilter); + } + return filteredMessage; + } catch (Exception e) { + logger.error(this.filterName + "] doPostFilter error.", e); + throw e; + } + } + + + +} diff --git a/src/main/java/com/eactive/eai/custom/kjb/adapter/http/client/filter/HttpClientAdapterExceptionFilter.java b/src/main/java/com/eactive/eai/custom/kjb/adapter/http/client/filter/HttpClientAdapterExceptionFilter.java new file mode 100644 index 0000000..6c809f3 --- /dev/null +++ b/src/main/java/com/eactive/eai/custom/kjb/adapter/http/client/filter/HttpClientAdapterExceptionFilter.java @@ -0,0 +1,10 @@ +package com.eactive.eai.custom.kjb.adapter.http.client.filter; + +import java.util.Properties; + +public interface HttpClientAdapterExceptionFilter { + + public Object doExceptionFilter(String adptGrpName, String adptName, Properties prop, Object message, + Properties tempProp, Exception e) throws Exception; + +} diff --git a/src/main/java/com/eactive/eai/custom/kjb/adapter/http/client/filter/HttpClientAdapterFilter.java b/src/main/java/com/eactive/eai/custom/kjb/adapter/http/client/filter/HttpClientAdapterFilter.java new file mode 100644 index 0000000..47c5682 --- /dev/null +++ b/src/main/java/com/eactive/eai/custom/kjb/adapter/http/client/filter/HttpClientAdapterFilter.java @@ -0,0 +1,12 @@ +package com.eactive.eai.custom.kjb.adapter.http.client.filter; + +import java.util.Properties; + +public interface HttpClientAdapterFilter { + + public Object doPreFilter(String adptGrpName, String adptName, Properties prop, Object message, Properties tempProp) + throws Exception; + + public Object doPostFilter(String adptGrpName, String adptName, Properties prop, Object message, + Properties tempProp) throws Exception; +} diff --git a/src/main/java/com/eactive/eai/custom/kjb/adapter/http/client/filter/HttpClientAdapterFilterException.java b/src/main/java/com/eactive/eai/custom/kjb/adapter/http/client/filter/HttpClientAdapterFilterException.java new file mode 100644 index 0000000..691f050 --- /dev/null +++ b/src/main/java/com/eactive/eai/custom/kjb/adapter/http/client/filter/HttpClientAdapterFilterException.java @@ -0,0 +1,35 @@ +package com.eactive.eai.custom.kjb.adapter.http.client.filter; + +import java.util.Properties; + +import lombok.Getter; + +public class HttpClientAdapterFilterException extends RuntimeException { + private static final long serialVersionUID = -1208983360831093751L; + @Getter + private final String code; + @Getter + private final Properties prop; + @Getter + private final Properties tempProp; + + public HttpClientAdapterFilterException(String code, String msg, Properties prop, Properties tmepProp) { + super(msg); + this.code = code; + this.prop = prop; + this.tempProp = tmepProp; + } + + public HttpClientAdapterFilterException(String code, String msg, Properties prop, Properties tempProp, Throwable cause) { + super(msg, cause); + this.code = code; + this.prop = prop; + this.tempProp = tempProp; + } + + @Override + public String toString() { + return "HttpClientAdapterFilterException [code=" + code + ", prop=" + prop + ", tempProp=" + tempProp + ", parent=" + super.toString() + "]"; + } + +} diff --git a/src/main/java/com/eactive/eai/custom/kjb/adapter/http/client/filter/JBOBPFilter.java b/src/main/java/com/eactive/eai/custom/kjb/adapter/http/client/filter/JBOBPFilter.java new file mode 100644 index 0000000..7f72d00 --- /dev/null +++ b/src/main/java/com/eactive/eai/custom/kjb/adapter/http/client/filter/JBOBPFilter.java @@ -0,0 +1,152 @@ +package com.eactive.eai.custom.kjb.adapter.http.client.filter; + +import java.util.Map.Entry; +import java.util.Map; +import java.util.Properties; +import java.util.TreeMap; + +import org.apache.commons.lang3.StringUtils; + +import com.eactive.eai.adapter.http.dynamic.HttpAdapterServiceKey; +import com.eactive.eai.common.TransactionContextKeys; +import com.eactive.eai.common.property.PropGroupVO; +import com.eactive.eai.common.property.PropManager; +import com.eactive.eai.common.util.Logger; + + +public class JBOBPFilter implements HttpClientAdapterFilter, HttpAdapterServiceKey { + protected static Logger logger = Logger.getLogger(Logger.LOGGER_ADAPTER); + + public static final String KJB_HEADER = "KJB_Header"; + public static final String X_OBP_PARTNERCODE = "x-obp-partnercode"; + public static final String X_OBP_TXID = "x-obp-txid"; + public static final String X_OBP_TRUST_SYSTEM = "x-obp-trust-system"; + String systemTrustKey = "APIMGW-0001-QVBJTUdXLTAwMDE="; + + @Override + public Object doPreFilter(String adptGrpName, String adptName, Properties prop, Object message, Properties tempProp) + throws Exception { + + logger.debug("JBOBPFilter] PreFilter Processing Start!!"); + Object returnMessage = message; + PropGroupVO propGroupVo = PropManager.getInstance().getPropGroupVO(KJB_HEADER); + if (propGroupVo != null) systemTrustKey = propGroupVo.getProperty(X_OBP_TRUST_SYSTEM, systemTrustKey); + +// Properties inboundHeaders; +// String obp_partnercode; +// try { +// Object headerObj = tempProp.get(HttpAdapterServiceKey.INBOUND_HEADER); +// if (headerObj instanceof Properties) { //tomcat +// inboundHeaders = (Properties) headerObj; +// for ( String key : inboundHeaders.stringPropertyNames()) { +// if(key.equalsIgnoreCase(X_OBP_PARTNERCODE)) { +// obp_partnercode = inboundHeaders.getProperty(key); +// break; +// } +// } +// } else if (headerObj instanceof String) { //weblogic +// String str = (String) headerObj; +// str = str.substring(1, str.length() - 1); +// // 2. key=value 쌍 분리 +// String[] entries = str.split(","); +// // map에 담기 +// Map map = new HashMap<>(); +// for (String entry : entries) { +// String[] kv = entry.split("=", 2); +// if (kv.length == 2) { +// map.put(kv[0].trim(), kv[1].trim()); +// } +// } +// for (String k : map.keySet()) { +// if (k.equalsIgnoreCase(X_OBP_PARTNERCODE)) { +// obp_partnercode = map.get(k); +// break; +// } +// } +// } +// } catch (Exception e) { +// e.printStackTrace(); +// } + + Properties filterHeaders = (Properties) tempProp.get("FILTERHEADER"); + if (filterHeaders == null) { + filterHeaders = new Properties(); + tempProp.put("FILTERHEADER", filterHeaders); + } + try { + String obpPartnerCode = "000000-00"; + Properties inboundHeader = (Properties)tempProp.get(INBOUND_HEADER); + Map inboundHeaderMap = new TreeMap<>(String.CASE_INSENSITIVE_ORDER); + + // Properties 내용을 모두 복사 + for (String name : inboundHeader.stringPropertyNames()) { + inboundHeaderMap.put(name, inboundHeader.getProperty(name)); + } + + if (!inboundHeaderMap.isEmpty()) { + if (inboundHeaderMap.containsKey(X_OBP_PARTNERCODE)) { + filterHeaders.put(X_OBP_PARTNERCODE, inboundHeaderMap.get(X_OBP_PARTNERCODE)); + logger.debug("JBOBPFilter] Processing Key ["+X_OBP_PARTNERCODE+"], value ["+inboundHeaderMap.get(X_OBP_PARTNERCODE)+"]"); + } else { + filterHeaders.put(X_OBP_PARTNERCODE, obpPartnerCode); + logger.debug("JBOBPFilter] Processing Key ["+X_OBP_PARTNERCODE+"], value ["+obpPartnerCode+"]"); + } + } else { + filterHeaders.put(X_OBP_PARTNERCODE, obpPartnerCode); + logger.debug("JBOBPFilter] Processing Key ["+X_OBP_PARTNERCODE+"], value ["+obpPartnerCode+"]"); +// if (inboundHeader != null){ +// for (Entry e : inboundHeader.entrySet()) { +// String key = (String) e.getKey(); +// String value = (String) e.getValue(); +// +// if (StringUtils.equalsIgnoreCase(key, X_OBP_PARTNERCODE)) { +// filterHeaders.setProperty(key, value); +// logger.debug("JBOBPFilter] Processing Key ["+X_OBP_PARTNERCODE+"], value ["+value+"]"); +// } +// if (logger.isDebugEnabled()) { +// logger.debug("Request Header :" + key + "=[" + value + "]"); +// } +// } + } + + String uuid = tempProp.getProperty(TransactionContextKeys.TRANSACTION_UUID, ""); + if (StringUtils.isNotBlank(uuid)) { + filterHeaders.setProperty(X_OBP_TXID, uuid); // JB OBP Framework용 + logger.debug("JBOBPFilter] Processing Key ["+X_OBP_TXID+"], value ["+uuid+"]"); + } + if (StringUtils.isNotBlank(systemTrustKey)) { + filterHeaders.setProperty(X_OBP_TRUST_SYSTEM, systemTrustKey); // JB OBP Framework용 + logger.debug("JBOBPFilter] Processing Key ["+X_OBP_TRUST_SYSTEM+"], value ["+systemTrustKey+"]"); + } + } catch (Exception e) { + logger.error(e.getMessage()); + } + +// Properties rquestHeaderProp = assignHeaderProp(tempProp, filterHeaders); +// tempProp.put("FILTERHEADER", filterHeaders); + + return returnMessage; + } + +// private Properties assignHeaderProp(Properties prop, HashMap filterHeaders) { +// Properties headerProp = new Properties(); +// if (filterHeaders.isEmpty()) { +// return headerProp; +// } +// +// for (String key : filterHeaders.keySet()) { +// String value = filterHeaders.get(key); +// headerProp.put(key, value); +// } +// +// return headerProp; +// } + + @Override + public Object doPostFilter(String adptGrpName, String adptName, Properties prop, Object message, + Properties tempProp) throws Exception { + return message; + } + +} + diff --git a/src/main/java/com/eactive/eai/custom/kjb/adapter/http/client/filter/KAKAOBankFilter.java b/src/main/java/com/eactive/eai/custom/kjb/adapter/http/client/filter/KAKAOBankFilter.java new file mode 100644 index 0000000..1228f34 --- /dev/null +++ b/src/main/java/com/eactive/eai/custom/kjb/adapter/http/client/filter/KAKAOBankFilter.java @@ -0,0 +1,113 @@ +package com.eactive.eai.custom.kjb.adapter.http.client.filter; + +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.Map; +import java.util.Properties; +import java.util.TreeMap; + +import com.eactive.eai.adapter.http.dynamic.HttpAdapterServiceKey; +import com.eactive.eai.common.property.PropGroupVO; +import com.eactive.eai.common.property.PropManager; +import com.eactive.eai.common.util.Logger; + + +public class KAKAOBankFilter implements HttpClientAdapterFilter, HttpAdapterServiceKey { + protected static Logger logger = Logger.getLogger(Logger.LOGGER_ADAPTER); + + public static final String KJB_HEADER = "KJB_Header"; + public static final String PROP_PREFIX = "kakaobank"; + public static final String X_KKB_PARTNER_CODE = "X-KKB-PARTNER-CODE"; + public static final String X_KKB_API_NAME = "X-KKB-API-NAME"; + public static final String X_KKB_API_TX_ID = "X-KKB-API-TX-ID"; + public static final String X_KKB_TX_TIME = "X-KKB-TX-TIME"; + public static final String X_KKB_CMPR_MGMT_NO = "X-KKB-CMPR-MGMT-NO"; + + @Override + public Object doPreFilter(String adptGrpName, String adptName, Properties prop, Object message, Properties tempProp) + throws Exception { + + logger.debug("KAKAOBankFilter] PreFilter Processing Start!!"); + Object returnMessage = message; + String partnerCode = "KJB"; + String apiName = "status_change"; + String apiTxId = "0"; + String txTime = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date()); + String cmprMgmtNo = "0"; + + PropGroupVO propGroupVo = PropManager.getInstance().getPropGroupVO(KJB_HEADER); + if (propGroupVo != null) { + partnerCode = propGroupVo.getProperty(PROP_PREFIX + "." + X_KKB_PARTNER_CODE); + apiName = propGroupVo.getProperty(PROP_PREFIX + "." + X_KKB_API_NAME); + apiTxId = propGroupVo.getProperty(PROP_PREFIX + "." + X_KKB_API_TX_ID); + cmprMgmtNo = propGroupVo.getProperty(PROP_PREFIX + "." + X_KKB_CMPR_MGMT_NO); + } + + Properties filterHeaders = (Properties) tempProp.get("FILTERHEADER"); + if (filterHeaders == null) { + filterHeaders = new Properties(); + tempProp.put("FILTERHEADER", filterHeaders); + } + try { + Properties inboundHeader = (Properties)tempProp.get(INBOUND_HEADER); + Map inboundHeaderMap = new TreeMap<>(String.CASE_INSENSITIVE_ORDER); + + // Properties 내용을 모두 복사 + for (String name : inboundHeader.stringPropertyNames()) { + inboundHeaderMap.put(name, inboundHeader.getProperty(name)); + } + + if (!inboundHeaderMap.isEmpty()) { + if (inboundHeaderMap.containsKey(X_KKB_PARTNER_CODE)) { + filterHeaders.put(X_KKB_PARTNER_CODE, inboundHeaderMap.get(X_KKB_PARTNER_CODE)); + } else { + filterHeaders.put(X_KKB_PARTNER_CODE, partnerCode); + } + if (inboundHeaderMap.containsKey(X_KKB_API_NAME)) { + filterHeaders.put(X_KKB_API_NAME, inboundHeaderMap.get(X_KKB_API_NAME)); + } else { + filterHeaders.put(X_KKB_API_NAME, apiName); + } + if (inboundHeaderMap.containsKey(X_KKB_API_TX_ID)) { + filterHeaders.put(X_KKB_API_TX_ID, inboundHeaderMap.get(X_KKB_API_TX_ID)); + } else { + filterHeaders.put(X_KKB_API_TX_ID, apiTxId); + } + if (inboundHeaderMap.containsKey(X_KKB_TX_TIME)) { + filterHeaders.put(X_KKB_TX_TIME, inboundHeaderMap.get(X_KKB_TX_TIME)); + } else { + filterHeaders.put(X_KKB_TX_TIME, txTime); + } + if (inboundHeaderMap.containsKey(X_KKB_CMPR_MGMT_NO)) { + filterHeaders.put(X_KKB_CMPR_MGMT_NO, inboundHeaderMap.get(X_KKB_CMPR_MGMT_NO)); + } else { + filterHeaders.put(X_KKB_CMPR_MGMT_NO, cmprMgmtNo); + } + } else { + filterHeaders.put(X_KKB_PARTNER_CODE, partnerCode); + filterHeaders.put(X_KKB_API_NAME, apiName); + filterHeaders.put(X_KKB_API_TX_ID, apiTxId); + filterHeaders.put(X_KKB_TX_TIME, txTime); + filterHeaders.put(X_KKB_CMPR_MGMT_NO, cmprMgmtNo); + } + logger.debug("KAKAOBankFilter] Processing Key ["+X_KKB_PARTNER_CODE+"], value ["+filterHeaders.getProperty(X_KKB_PARTNER_CODE)+"]"); + logger.debug("KAKAOBankFilter] Processing Key ["+X_KKB_API_NAME+"], value ["+filterHeaders.getProperty(X_KKB_API_NAME)+"]"); + logger.debug("KAKAOBankFilter] Processing Key ["+X_KKB_API_TX_ID+"], value ["+filterHeaders.getProperty(X_KKB_API_TX_ID)+"]"); + logger.debug("KAKAOBankFilter] Processing Key ["+X_KKB_TX_TIME+"], value ["+filterHeaders.getProperty(X_KKB_TX_TIME)+"]"); + logger.debug("KAKAOBankFilter] Processing Key ["+X_KKB_CMPR_MGMT_NO+"], value ["+filterHeaders.getProperty(X_KKB_CMPR_MGMT_NO)+"]"); + + } catch (Exception e) { + logger.error(e.getMessage()); + } + + return returnMessage; + } + + @Override + public Object doPostFilter(String adptGrpName, String adptName, Properties prop, Object message, + Properties tempProp) throws Exception { + return message; + } + +} + diff --git a/src/main/java/com/eactive/eai/custom/kjb/adapter/http/client/filter/KFTCFaceFilter.java b/src/main/java/com/eactive/eai/custom/kjb/adapter/http/client/filter/KFTCFaceFilter.java new file mode 100644 index 0000000..5ab6f2c --- /dev/null +++ b/src/main/java/com/eactive/eai/custom/kjb/adapter/http/client/filter/KFTCFaceFilter.java @@ -0,0 +1,144 @@ +package com.eactive.eai.custom.kjb.adapter.http.client.filter; + +import java.util.Map.Entry; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.Map; +import java.util.Properties; +import java.util.TreeMap; + +import org.apache.commons.lang3.RandomStringUtils; +import org.apache.commons.lang3.StringUtils; +import org.json.simple.JSONObject; +import org.json.simple.JSONValue; + +import com.eactive.eai.adapter.AdapterGroupVO; +import com.eactive.eai.adapter.AdapterManager; +import com.eactive.eai.adapter.http.dynamic.HttpAdapterServiceKey; +//import com.eactive.eai.authoutbound.OutboundOAuthCredentialDao; +import com.eactive.eai.common.property.PropGroupVO; +import com.eactive.eai.common.property.PropManager; +import com.eactive.eai.common.util.Logger; + + +public class KFTCFaceFilter implements HttpClientAdapterFilter, HttpAdapterServiceKey { + protected static Logger logger = Logger.getLogger(Logger.LOGGER_ADAPTER); + + public static final String KJB_HEADER = "KJB_Header"; + public static final String PROP_PREFIX = "kftcface"; + public static final String H_CLIENT_ID = "Client-Id"; + public static final String B_ORG_CODE = "org_code"; + public static final String B_TRANSACTION_ID = "transaction_id"; + public static final String B_REQUEST_DATETIME = "request_datetime"; +// private final OutboundOAuthCredentialDao credentialDao; + +// public KFTCFaceFilter() { +// this.credentialDao = new OutboundOAuthCredentialDao(); + // TODO Auto-generated constructor stub +// } + + @SuppressWarnings({ "null", "unchecked" }) + @Override + public Object doPreFilter(String adptGrpName, String adptName, Properties prop, Object message, Properties tempProp) + throws Exception { + + logger.debug("KFTCFaceFilter] PreFilter Processing Start!!"); + JSONObject returnMessage = null; + String clientId = ""; + String orgCode = "034"; // 광주은행 행코드 + +// OutboundOAuthCredentialVo outboundOAuthCredentialVo = credentialDao.getClientId(adptGrpName);//credentialDao.getOutboundOAuthCredential(adptGrpName); +// clientId = credentialDao.getClientId(adptGrpName);//outboundOAuthCredentialVo.getClientId(); + + PropGroupVO propGroupVo = PropManager.getInstance().getPropGroupVO(KJB_HEADER); + if (propGroupVo != null) { + if (StringUtils.isEmpty(clientId)) + clientId = propGroupVo.getProperty(PROP_PREFIX + "." + H_CLIENT_ID); + orgCode = propGroupVo.getProperty(PROP_PREFIX + "." + B_ORG_CODE); + } + + String request_datetime = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date()); + String transaction_id = orgCode + request_datetime + "1" + RandomStringUtils.random(4, true, true).toUpperCase(); + + Properties filterHeaders = (Properties) tempProp.get("FILTERHEADER"); + if (filterHeaders == null) { + filterHeaders = new Properties(); + tempProp.put("FILTERHEADER", filterHeaders); + } + try { + Properties inboundHeader = (Properties)tempProp.get(INBOUND_HEADER); + Map inboundHeaderMap = new TreeMap<>(String.CASE_INSENSITIVE_ORDER); + + // Properties 내용을 모두 복사 + for (String name : inboundHeader.stringPropertyNames()) { + inboundHeaderMap.put(name, inboundHeader.getProperty(name)); + } + + if (!inboundHeaderMap.isEmpty()) { + if (inboundHeaderMap.containsKey(H_CLIENT_ID)) { + filterHeaders.put(H_CLIENT_ID, inboundHeaderMap.get(H_CLIENT_ID)); + logger.debug("KFTCFaceFilter] Processing Key ["+H_CLIENT_ID+"], value ["+inboundHeaderMap.get(H_CLIENT_ID)+"]"); + } else { + filterHeaders.put(H_CLIENT_ID, clientId); + logger.debug("KFTCFaceFilter] Processing Key ["+H_CLIENT_ID+"], value ["+clientId+"]"); + } +// if (inboundHeader != null && inboundHeader.containsKey(H_CLIENT_ID)) { +// for (Entry e : inboundHeader.entrySet()) { +// String key = (String) e.getKey(); +// String value = (String) e.getValue(); +// +// if (StringUtils.equalsIgnoreCase(key, H_CLIENT_ID)) { +// filterHeaders.setProperty(key, value); +// logger.debug("KFTCFaceFilter] Processing Key ["+H_CLIENT_ID+"], value ["+value+"]"); +// } +// if (logger.isDebugEnabled()) { +// logger.debug("Request Header :" + key + "=[" + value + "]"); +// } +// } + } else { + filterHeaders.setProperty(H_CLIENT_ID, clientId); + logger.debug("KFTCFaceFilter] Processing Key ["+H_CLIENT_ID+"], value ["+clientId+"]"); + } + + } catch (Exception e) { + logger.error(e.getMessage()); + } + + AdapterManager adapterManager = AdapterManager.getInstance(); + AdapterGroupVO adptGrpVO = adapterManager.getAdapterGroupVO(adptGrpName); + String encode = adptGrpVO.getMessageEncode(); + if (message == null) { + returnMessage = new JSONObject(); + } else { + if (message instanceof JSONObject) { + returnMessage = (JSONObject) message; + } else if (message instanceof String) { + returnMessage = parseJson((String) message); + } else if (message instanceof byte[]) { + returnMessage = parseJson(new String((byte[]) message, encode)); + } + } + + returnMessage.put(B_ORG_CODE, orgCode); + returnMessage.put(B_TRANSACTION_ID, transaction_id); + returnMessage.put(B_REQUEST_DATETIME, request_datetime); + + return returnMessage.toJSONString(); + } + + private JSONObject parseJson(String message) throws Exception { + if (message == null) { + return null; + } + + return (JSONObject) JSONValue.parse(message); + } + + @Override + public Object doPostFilter(String adptGrpName, String adptName, Properties prop, Object message, + Properties tempProp) throws Exception { + return message; + } + +} + diff --git a/src/main/java/com/eactive/eai/custom/kjb/adapter/http/client/filter/KFTCP2PFilter.java b/src/main/java/com/eactive/eai/custom/kjb/adapter/http/client/filter/KFTCP2PFilter.java new file mode 100644 index 0000000..0434270 --- /dev/null +++ b/src/main/java/com/eactive/eai/custom/kjb/adapter/http/client/filter/KFTCP2PFilter.java @@ -0,0 +1,103 @@ +package com.eactive.eai.custom.kjb.adapter.http.client.filter; + +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.Map; +import java.util.Properties; +import java.util.TreeMap; + +import org.apache.commons.lang3.RandomStringUtils; + +import com.eactive.eai.adapter.http.dynamic.HttpAdapterServiceKey; +import com.eactive.eai.common.property.PropGroupVO; +import com.eactive.eai.common.property.PropManager; +import com.eactive.eai.common.util.Logger; + + +public class KFTCP2PFilter implements HttpClientAdapterFilter, HttpAdapterServiceKey { + protected static Logger logger = Logger.getLogger(Logger.LOGGER_ADAPTER); + + public static final String KJB_HEADER = "KJB_Header"; + public static final String PROP_PREFIX = "kftcp2p"; + public static final String H_ORG_CODE = "org_code"; + public static final String H_TRX_NO = "api_trx_no"; + public static final String H_TRX_DTM = "api_trx_dtm"; + + @Override + public Object doPreFilter(String adptGrpName, String adptName, Properties prop, Object message, Properties tempProp) + throws Exception { + + logger.debug("KFTCP2PFilter] PreFilter Processing Start!!"); + Object returnMessage = message; + String orgCode = "034"; // 광주은행 행코드 + + PropGroupVO propGroupVo = PropManager.getInstance().getPropGroupVO(KJB_HEADER); + if (propGroupVo != null) { + orgCode = propGroupVo.getProperty(PROP_PREFIX + "." + H_ORG_CODE); + } + + String apiTrxDtm = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date()); + String apiTrxNo = orgCode + apiTrxDtm + "1" + RandomStringUtils.random(5, true, true).toUpperCase(); + + Properties filterHeaders = (Properties) tempProp.get("FILTERHEADER"); + if (filterHeaders == null) { + filterHeaders = new Properties(); + tempProp.put("FILTERHEADER", filterHeaders); + } + try { + Properties inboundHeader = (Properties)tempProp.get(INBOUND_HEADER); + Map inboundHeaderMap = new TreeMap<>(String.CASE_INSENSITIVE_ORDER); + + // Properties 내용을 모두 복사 + for (String name : inboundHeader.stringPropertyNames()) { + inboundHeaderMap.put(name, inboundHeader.getProperty(name)); + } + + if (!inboundHeaderMap.isEmpty()) { + if (inboundHeaderMap.containsKey(H_TRX_NO)) { + filterHeaders.put(H_TRX_NO, inboundHeaderMap.get(H_TRX_NO)); + logger.debug("KFTCP2PFilter] Processing Key ["+H_TRX_NO+"], value ["+inboundHeaderMap.get(H_TRX_NO)+"]"); + } else { + filterHeaders.put(H_TRX_NO, apiTrxNo); + logger.debug("KFTCP2PFilter] Processing Key ["+H_TRX_NO+"], value ["+apiTrxNo+"]"); + } + if (inboundHeaderMap.containsKey(H_TRX_DTM)) { + filterHeaders.put(H_TRX_DTM, inboundHeaderMap.get(H_TRX_DTM)); + logger.debug("KFTCP2PFilter] Processing Key ["+H_TRX_DTM+"], value ["+inboundHeaderMap.get(H_TRX_DTM)+"]"); + } else { + filterHeaders.put(H_TRX_DTM, apiTrxDtm); + logger.debug("KFTCP2PFilter] Processing Key ["+H_TRX_DTM+"], value ["+apiTrxDtm+"]"); + } +// if (inboundHeader != null) { +// if (inboundHeader.containsKey(H_TRX_NO)) { +// filterHeaders.put(H_TRX_NO, inboundHeader.get(H_TRX_NO)); +// } else { +// filterHeaders.put(H_TRX_NO, apiTrxNo); +// } +// if (inboundHeader.containsKey(H_TRX_DTM)) { +// filterHeaders.put(H_TRX_DTM, inboundHeader.get(H_TRX_DTM)); +// } else { +// filterHeaders.put(H_TRX_DTM, apiTrxDtm); +// } + } else { + filterHeaders.put(H_TRX_NO, apiTrxNo); + filterHeaders.put(H_TRX_DTM, apiTrxDtm); + } + logger.debug("KFTCP2PFilter] Processing Key ["+H_TRX_NO+"], value ["+filterHeaders.getProperty(H_TRX_NO)+"]"); + logger.debug("KFTCP2PFilter] Processing Key ["+H_TRX_DTM+"], value ["+filterHeaders.getProperty(H_TRX_DTM)+"]"); + + } catch (Exception e) { + logger.error(e.getMessage()); + } + + return returnMessage; + } + + @Override + public Object doPostFilter(String adptGrpName, String adptName, Properties prop, Object message, + Properties tempProp) throws Exception { + return message; + } + +} + diff --git a/src/main/java/com/eactive/eai/custom/kjb/adapter/http/client/filter/NAVERFinFilter.java b/src/main/java/com/eactive/eai/custom/kjb/adapter/http/client/filter/NAVERFinFilter.java new file mode 100644 index 0000000..390426b --- /dev/null +++ b/src/main/java/com/eactive/eai/custom/kjb/adapter/http/client/filter/NAVERFinFilter.java @@ -0,0 +1,97 @@ +package com.eactive.eai.custom.kjb.adapter.http.client.filter; + +import java.util.Map; +import java.util.Properties; +import java.util.TreeMap; + +import com.eactive.eai.adapter.http.dynamic.HttpAdapterServiceKey; +import com.eactive.eai.common.property.PropGroupVO; +import com.eactive.eai.common.property.PropManager; +import com.eactive.eai.common.util.Logger; + + +public class NAVERFinFilter implements HttpClientAdapterFilter, HttpAdapterServiceKey { + protected static Logger logger = Logger.getLogger(Logger.LOGGER_ADAPTER); + + public static final String KJB_HEADER = "KJB_Header"; + public static final String PROP_PREFIX = "naverfin"; + public static final String X_PARTNER_ID = "X-Partner-Id"; + public static final String X_FINTECH_ID = "X-Fintech-Id"; + + @Override + public Object doPreFilter(String adptGrpName, String adptName, Properties prop, Object message, Properties tempProp) + throws Exception { + + logger.debug("NAVERFinFilter] PreFilter Processing Start!!"); + Object returnMessage = message; + String partnerID = "r0jtqwC9gAW5"; + String fintechId = "NF"; + + PropGroupVO propGroupVo = PropManager.getInstance().getPropGroupVO(KJB_HEADER); + if (propGroupVo != null) { + partnerID = propGroupVo.getProperty(PROP_PREFIX + "." + X_PARTNER_ID); + fintechId = propGroupVo.getProperty(PROP_PREFIX + "." + X_FINTECH_ID); + } + + Properties filterHeaders = (Properties) tempProp.get("FILTERHEADER"); + if (filterHeaders == null) { + filterHeaders = new Properties(); + tempProp.put("FILTERHEADER", filterHeaders); + } + try { + Properties inboundHeader = (Properties)tempProp.get(INBOUND_HEADER); + Map inboundHeaderMap = new TreeMap<>(String.CASE_INSENSITIVE_ORDER); + + // Properties 내용을 모두 복사 + for (String name : inboundHeader.stringPropertyNames()) { + inboundHeaderMap.put(name, inboundHeader.getProperty(name)); + } + + if (!inboundHeaderMap.isEmpty()) { + if (inboundHeaderMap.containsKey(X_PARTNER_ID)) { + filterHeaders.put(X_PARTNER_ID, inboundHeaderMap.get(X_PARTNER_ID)); + logger.debug("NAVERFinFilter] Processing Key ["+X_PARTNER_ID+"], value ["+inboundHeaderMap.get(X_PARTNER_ID)+"]"); + } else { + filterHeaders.put(X_PARTNER_ID, partnerID); + logger.debug("NAVERFinFilter] Processing Key ["+X_PARTNER_ID+"], value ["+partnerID+"]"); + } + if (inboundHeaderMap.containsKey(X_FINTECH_ID)) { + filterHeaders.put(X_FINTECH_ID, inboundHeaderMap.get(X_FINTECH_ID)); + logger.debug("NAVERFinFilter] Processing Key ["+X_FINTECH_ID+"], value ["+inboundHeaderMap.get(X_FINTECH_ID)+"]"); + } else { + filterHeaders.put(X_FINTECH_ID, fintechId); + logger.debug("NAVERFinFilter] Processing Key ["+X_FINTECH_ID+"], value ["+fintechId+"]"); + } +// if (inboundHeader != null) { +// if (inboundHeader.containsKey(X_PARTNER_ID)) { +// filterHeaders.put(X_PARTNER_ID, inboundHeader.get(X_PARTNER_ID)); +// } else { +// filterHeaders.put(X_PARTNER_ID, partnerID); +// } +// if (inboundHeader.containsKey(X_FINTECH_ID)) { +// filterHeaders.put(X_FINTECH_ID, inboundHeader.get(X_FINTECH_ID)); +// } else { +// filterHeaders.put(X_FINTECH_ID, fintechId); +// } + } else { + filterHeaders.put(X_PARTNER_ID, partnerID); + filterHeaders.put(X_FINTECH_ID, fintechId); + } + logger.debug("NAVERFinFilter] Processing Key ["+X_PARTNER_ID+"], value ["+filterHeaders.getProperty(X_PARTNER_ID)+"]"); + logger.debug("NAVERFinFilter] Processing Key ["+X_FINTECH_ID+"], value ["+filterHeaders.getProperty(X_FINTECH_ID)+"]"); + + } catch (Exception e) { + logger.error(e.getMessage()); + } + + return returnMessage; + } + + @Override + public Object doPostFilter(String adptGrpName, String adptName, Properties prop, Object message, + Properties tempProp) throws Exception { + return message; + } + +} + diff --git a/src/main/java/com/eactive/eai/custom/kjb/adapter/http/client/filter/NICECreditFilter.java b/src/main/java/com/eactive/eai/custom/kjb/adapter/http/client/filter/NICECreditFilter.java new file mode 100644 index 0000000..1d3802c --- /dev/null +++ b/src/main/java/com/eactive/eai/custom/kjb/adapter/http/client/filter/NICECreditFilter.java @@ -0,0 +1,108 @@ +package com.eactive.eai.custom.kjb.adapter.http.client.filter; + +import java.util.Map.Entry; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.Properties; + +import org.apache.commons.lang3.StringUtils; +import org.json.simple.JSONObject; +import org.json.simple.JSONValue; + +import com.eactive.eai.adapter.AdapterGroupVO; +import com.eactive.eai.adapter.AdapterManager; +import com.eactive.eai.adapter.http.dynamic.HttpAdapterServiceKey; +import com.eactive.eai.common.property.PropGroupVO; +import com.eactive.eai.common.property.PropManager; +import com.eactive.eai.common.util.Logger; + + +public class NICECreditFilter implements HttpClientAdapterFilter, HttpAdapterServiceKey { + protected static Logger logger = Logger.getLogger(Logger.LOGGER_ADAPTER); + + public static final String KJB_HEADER = "KJB_Header"; + public static final String PROP_PREFIX = "nicecredit"; + public static final String H_PRODUCTID = "ProductID"; + public static final String B_REQ_DTM = "req_dtm"; + public static final String B_GOODS_CLS = "goods_cls"; + + @SuppressWarnings({ "unchecked" }) + @Override + public Object doPreFilter(String adptGrpName, String adptName, Properties prop, Object message, Properties tempProp) + throws Exception { + + JSONObject returnMessage = null; + String productId = "2303102120"; + String reqDtm = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date()); + String goodsCls = "KJBAPI0001"; + + PropGroupVO propGroupVo = PropManager.getInstance().getPropGroupVO(KJB_HEADER); + if (propGroupVo != null) { + productId = propGroupVo.getProperty(PROP_PREFIX + "." + H_PRODUCTID); + goodsCls = propGroupVo.getProperty(PROP_PREFIX + "." + B_GOODS_CLS); + } + + Properties filterHeaders = (Properties) tempProp.get("FILTERHEADER"); + if (filterHeaders == null) { + filterHeaders = new Properties(); + tempProp.put("FILTERHEADER", filterHeaders); + } + try { + Properties inboundHeader = (Properties)tempProp.get(INBOUND_HEADER); + if (inboundHeader != null && inboundHeader.containsKey(H_PRODUCTID)) { + for (Entry e : inboundHeader.entrySet()) { + String key = (String) e.getKey(); + String value = (String) e.getValue(); + + if (StringUtils.equalsIgnoreCase(key, H_PRODUCTID)) { + filterHeaders.setProperty(key, value); + } + if (logger.isDebugEnabled()) { + logger.debug("Request Header :" + key + "=[" + value + "]"); + } + } + } else { + filterHeaders.setProperty(H_PRODUCTID, productId); + } + + } catch (Exception e) { + logger.error(e.getMessage()); + } + + AdapterManager adapterManager = AdapterManager.getInstance(); + AdapterGroupVO adptGrpVO = adapterManager.getAdapterGroupVO(adptGrpName); + String encode = adptGrpVO.getMessageEncode(); + if (message == null) { + returnMessage = new JSONObject(); + } else { + if (message instanceof JSONObject) { + returnMessage = (JSONObject) message; + } else if (message instanceof String) { + returnMessage = parseJson((String) message); + } else if (message instanceof byte[]) { + returnMessage = parseJson(new String((byte[]) message, encode)); + } + } + + returnMessage.put(B_REQ_DTM, reqDtm); + returnMessage.put(B_GOODS_CLS, goodsCls); + + return returnMessage.toJSONString(); + } + + private JSONObject parseJson(String message) throws Exception { + if (message == null) { + return null; + } + + return (JSONObject) JSONValue.parse(message); + } + + @Override + public Object doPostFilter(String adptGrpName, String adptName, Properties prop, Object message, + Properties tempProp) throws Exception { + return message; + } + +} + diff --git a/src/main/java/com/eactive/eai/custom/kjb/adapter/http/client/filter/SimpleFrameworkFilter.java b/src/main/java/com/eactive/eai/custom/kjb/adapter/http/client/filter/SimpleFrameworkFilter.java new file mode 100644 index 0000000..f4a6813 --- /dev/null +++ b/src/main/java/com/eactive/eai/custom/kjb/adapter/http/client/filter/SimpleFrameworkFilter.java @@ -0,0 +1,68 @@ +package com.eactive.eai.custom.kjb.adapter.http.client.filter; + +import java.util.Properties; + +import org.apache.commons.lang3.StringUtils; + +import com.eactive.eai.adapter.http.dynamic.HttpAdapterServiceKey; +import com.eactive.eai.adapter.http.dynamic.HttpAdapterServiceSupport; +import com.eactive.eai.common.TransactionContextKeys; +import com.eactive.eai.common.util.Logger; + +public class SimpleFrameworkFilter implements HttpClientAdapterFilter, HttpAdapterServiceKey { + protected static Logger logger = Logger.getLogger(Logger.LOGGER_ADAPTER); + + public static final String CLIENTID = "clientId"; + public static final String TRACEID = "traceId"; + public static final String GUID = "guid"; + public static final String RECEIVEDTIMESTAMP = "receivedTimestamp"; + + @Override + public Object doPreFilter(String adptGrpName, String adptName, Properties prop, Object message, Properties tempProp) + throws Exception { + + logger.debug("SimpleFrameworkFilter] PreFilter Processing Start!!"); + Object returnMessage = message; + + Properties filterHeaders = (Properties) tempProp.get("FILTERHEADER"); + if (filterHeaders == null) { + filterHeaders = new Properties(); + tempProp.put("FILTERHEADER", filterHeaders); + } + try { + /* 업체정보 */ + String clientId = tempProp.getProperty(HttpAdapterServiceSupport.PROPERTIES_NAME_CLIENT_ID); + if (StringUtils.isEmpty(clientId)) clientId = ""; + filterHeaders.put(CLIENTID, clientId); + logger.debug("SimpleFrameworkFilter] Processing Key ["+CLIENTID+"], value ["+clientId+"]"); + + /* APIM 거래추적자 */ + String uuid = tempProp.getProperty(TransactionContextKeys.TRANSACTION_UUID, ""); + filterHeaders.put(TRACEID, uuid); + logger.debug("SimpleFrameworkFilter] Processing Key ["+TRACEID+"], value ["+uuid+"]"); + + /* GUID */ + String guid = tempProp.getProperty(TransactionContextKeys.GUID, ""); + filterHeaders.put(GUID, guid); + logger.debug("SimpleFrameworkFilter] Processing Key ["+GUID+"], value ["+guid+"]"); + + /* 최초요청시간 */ + String receivedTimestamp = tempProp.getProperty(HttpAdapterServiceKey.INBOUND_REQUESTED_TIME, ""); + filterHeaders.put(RECEIVEDTIMESTAMP, receivedTimestamp); + logger.debug("SimpleFrameworkFilter] Processing Key ["+RECEIVEDTIMESTAMP+"], value ["+receivedTimestamp+"]"); + } catch (Exception e) { + logger.error(e.getMessage()); + } + +// tempProp.put("FILTERHEADER", filterHeaders); + + return returnMessage; + } + + @Override + public Object doPostFilter(String adptGrpName, String adptName, Properties prop, Object message, + Properties tempProp) throws Exception { + return message; + } + +} diff --git a/src/main/java/com/eactive/eai/custom/kjb/adapter/http/client/filter/TOSSBankFilter.java b/src/main/java/com/eactive/eai/custom/kjb/adapter/http/client/filter/TOSSBankFilter.java new file mode 100644 index 0000000..c052d09 --- /dev/null +++ b/src/main/java/com/eactive/eai/custom/kjb/adapter/http/client/filter/TOSSBankFilter.java @@ -0,0 +1,84 @@ +package com.eactive.eai.custom.kjb.adapter.http.client.filter; + +import java.util.Map; +import java.util.Properties; +import java.util.TreeMap; + +import com.eactive.eai.adapter.http.dynamic.HttpAdapterServiceKey; +import com.eactive.eai.common.TransactionContextKeys; +import com.eactive.eai.common.property.PropGroupVO; +import com.eactive.eai.common.property.PropManager; +import com.eactive.eai.common.util.Logger; + + +public class TOSSBankFilter implements HttpClientAdapterFilter, HttpAdapterServiceKey { + protected static Logger logger = Logger.getLogger(Logger.LOGGER_ADAPTER); + + public static final String KJB_HEADER = "KJB_Header"; + public static final String PROP_PREFIX = "tossbank"; + public static final String X_TOSSBANK_LOAN_TRACE_ID = "X-TOSSBANK-LOAN-TRACE-ID"; + + @Override + public Object doPreFilter(String adptGrpName, String adptName, Properties prop, Object message, Properties tempProp) + throws Exception { + + logger.debug("TOSSBankFilter] PreFilter Processing Start!!"); + Object returnMessage = message; + String traceId = tempProp.getProperty(TransactionContextKeys.TRANSACTION_UUID, ""); + + PropGroupVO propGroupVo = PropManager.getInstance().getPropGroupVO(KJB_HEADER); + if (propGroupVo != null) { +// partnerID = propGroupVo.getProperty(PROP_PREFIX + "." + X_PARTNER_ID); +// fintechId = propGroupVo.getProperty(PROP_PREFIX + "." + X_FINTECH_ID); + } + + Properties filterHeaders = (Properties) tempProp.get("FILTERHEADER"); + if (filterHeaders == null) { + filterHeaders = new Properties(); + tempProp.put("FILTERHEADER", filterHeaders); + } + try { + Properties inboundHeader = (Properties)tempProp.get(INBOUND_HEADER); + Map inboundHeaderMap = new TreeMap<>(String.CASE_INSENSITIVE_ORDER); + + // Properties 내용을 모두 복사 + for (String name : inboundHeader.stringPropertyNames()) { + inboundHeaderMap.put(name, inboundHeader.getProperty(name)); + } + + if (!inboundHeaderMap.isEmpty()) { + if (inboundHeaderMap.containsKey(X_TOSSBANK_LOAN_TRACE_ID)) { + filterHeaders.put(X_TOSSBANK_LOAN_TRACE_ID, inboundHeaderMap.get(X_TOSSBANK_LOAN_TRACE_ID)); + logger.debug("TOSSBankFilter] Processing Key ["+X_TOSSBANK_LOAN_TRACE_ID+"], value ["+inboundHeaderMap.get(X_TOSSBANK_LOAN_TRACE_ID)+"]"); + } else { + filterHeaders.put(X_TOSSBANK_LOAN_TRACE_ID, traceId); + logger.debug("TOSSBankFilter] Processing Key ["+X_TOSSBANK_LOAN_TRACE_ID+"], value ["+traceId+"]"); + } +// if (inboundHeader != null) { +// if (inboundHeader.containsKey(X_TOSSBANK_LOAN_TRACE_ID)) { +// filterHeaders.put(X_TOSSBANK_LOAN_TRACE_ID, inboundHeader.get(X_TOSSBANK_LOAN_TRACE_ID)); +// } else { +// filterHeaders.put(X_TOSSBANK_LOAN_TRACE_ID, traceId); +// } + } else { + /* APIM 거래추적자 */ + filterHeaders.setProperty(X_TOSSBANK_LOAN_TRACE_ID, traceId); + logger.debug("TOSSBankFilter] Processing Key ["+X_TOSSBANK_LOAN_TRACE_ID+"], value ["+traceId+"]"); + } + logger.debug("TOSSBankFilter] Processing Key ["+X_TOSSBANK_LOAN_TRACE_ID+"], value ["+filterHeaders.getProperty(X_TOSSBANK_LOAN_TRACE_ID)+"]"); + + } catch (Exception e) { + logger.error(e.getMessage()); + } + + return returnMessage; + } + + @Override + public Object doPostFilter(String adptGrpName, String adptName, Properties prop, Object message, + Properties tempProp) throws Exception { + return message; + } + +} + diff --git a/src/main/java/com/eactive/eai/custom/kjb/adapter/http/client/impl/HttpClient5AdapterServiceRestAddFilter.java b/src/main/java/com/eactive/eai/custom/kjb/adapter/http/client/impl/HttpClient5AdapterServiceRestAddFilter.java new file mode 100644 index 0000000..30fbca3 --- /dev/null +++ b/src/main/java/com/eactive/eai/custom/kjb/adapter/http/client/impl/HttpClient5AdapterServiceRestAddFilter.java @@ -0,0 +1,222 @@ +package com.eactive.eai.custom.kjb.adapter.http.client.impl; + +import java.util.Properties; +//import java.util.concurrent.Callable; + +import org.apache.commons.lang3.StringUtils; +import org.dom4j.Node; +import org.json.simple.JSONObject; + +import com.eactive.eai.adapter.http.client.HttpClientAdapterServiceKey; +import com.eactive.eai.adapter.http.client.impl.HttpClient5AdapterServiceRest; +import com.eactive.eai.custom.kjb.adapter.http.client.filter.HttpClient5AdapterFilterFactory; +//import com.eactive.eai.custom.kjb.adapter.http.client.filter.HttpClientAdapterExceptionFilter; +import com.eactive.eai.custom.kjb.adapter.http.client.filter.HttpClientAdapterFilter; +//import com.eactive.eai.custom.kjb.adapter.http.client.filter.IBKOutCommonFilter; +//import com.eactive.eai.custom.kjb.adapter.http.client.filter.IBKOutExceptionFilter; +//import com.fasterxml.jackson.databind.ObjectMapper; +//import com.fasterxml.jackson.databind.node.ObjectNode; +//import com.ibk.eai.common.circuitbreaker.url.UrlCircuitBreakerManager; + +//import io.github.resilience4j.circuitbreaker.CircuitBreaker; + +/** + * 1. 기능 : HttpClient5AdapterServiceRest 호출 전후 Filter 적용할 수 있는 기능을 제공한다.
+ * 2. 처리 개요 :
+ * 3. 주의사항
+ * + * @author : + * @version : v 1.0.0 + * @see : HttpClientAdapterServiceFactory.java, + * HttpClientAdapterServiceSupport.java, HttpClient5AdapterServiceRest.java + * @since : + * + */ +public class HttpClient5AdapterServiceRestAddFilter extends HttpClient5AdapterServiceRest + implements HttpClientAdapterServiceKey { + + // 요청전 수행할 필터(쉼표(,)로 구분) + static final String PRE_FILTERS = "PRE_FILTERS"; + + // 요청후 수행할 필터(쉼표(,)로 구분) + static final String POST_FILTERS = "POST_FILTERS"; + +// // Adapter에서 Exception이 발생한 경우, 처리할 필터 +// static final String EXCEPTION_FILTER = "EXCEPTION_FILTER"; + + /** + * 1. 기능 : HttpClient 호출 전후 Filter 적용용 2. 처리 개요 :
+ * 3. 주의사항
+ * + * @param prop Http Adapter 속성 정보 + * @return 반환 된 Object + * @exception Exception 수동 시스템 간 통신 중 발생 + */ + public Object execute(Properties prop, Object data, Properties tempProp) throws Exception { + + String adptGrpName = tempProp.getProperty(ADAPTER_GROUP_NAME); + String adptName = tempProp.getProperty(ADAPTER_NAME); + + data = doPreFilters(adptGrpName, adptName, prop, data, tempProp); + + Object adapterResponse = super.execute(prop, data, tempProp); + +// //원본 url를 찾아서 있으면, 그것을 사용한다. +// String url = tempProp.getProperty("URL_ORG"); +// if(StringUtils.isEmpty(url)) +// url = tempProp.getProperty(HttpClientAdapterServiceKey.URL); +// +// UrlCircuitBreakerManager cManager = UrlCircuitBreakerManager.getInstance(); +// CircuitBreaker circuitBreaker = cManager.getCircuitBreaker(url); +// try { +// if (circuitBreaker != null) { +// if (logger.isDebugEnabled()) { +// // ObjectMapper 인스턴스 생성 +// ObjectMapper objectMapper = new ObjectMapper(); +// // 서킷 브레이커의 메트릭 정보와 상태 정보를 직접 Node로 변환 +// ObjectNode combinedNode = objectMapper.createObjectNode(); +// combinedNode.put("state", circuitBreaker.getState().toString()); +// combinedNode.set("metrics", objectMapper.valueToTree(circuitBreaker.getMetrics())); +// logger.debug("CircuitBreaker state [" + circuitBreaker.getName() + "] - " + combinedNode.toString()); +// } +// adapterResponse = circuitBreaker.executeCallable(new HttpClientAdapterCallable(prop, data, tempProp, this)); +// } else { +// adapterResponse = super.execute(prop, data, tempProp); +// } +// } catch (Exception e) { +// adapterResponse = doExceptionFilters(adptGrpName, adptName, prop, adapterResponse, tempProp, e); +// +// if (adapterResponse instanceof JSONObject) +// adapterResponse = ((JSONObject) adapterResponse).toJSONString(); +// +// if (adapterResponse instanceof Node) +// adapterResponse = ((Node) adapterResponse).asXML(); +// +// return adapterResponse; +// } + + adapterResponse = doPostFilters(adptGrpName, adptName, prop, adapterResponse, tempProp); + if (adapterResponse instanceof JSONObject) + adapterResponse = ((JSONObject) adapterResponse).toJSONString(); + + if (adapterResponse instanceof Node) + adapterResponse = ((Node) adapterResponse).asXML(); + + return adapterResponse; + } + +// protected Object callSuper(Properties prop, Object data, Properties tempProp) throws Exception { +// return super.execute(prop, data, tempProp); +// } + +// private class HttpClientAdapterCallable implements Callable { +// Properties prop; +// Object data; +// Properties tempProp; +// HttpClient5AdapterServiceRestAddFilter clientService; +// +// public HttpClientAdapterCallable(Properties prop, Object data, Properties tempProp, +// HttpClient5AdapterServiceRestAddFilter clientService) { +// this.prop = prop; +// this.data = data; +// this.tempProp = tempProp; +// this.clientService = clientService; +// } +// +// @Override +// public Object call() throws Exception { +// return clientService.callSuper(prop, data, tempProp); +// } +// +// } + + protected Object doPreFilters(String adptGrpName, String adptName, Properties prop, Object message, + Properties tempProp) throws Exception { + +// boolean isSetCommonFilterInAdapterProp = false; + // 1. adapter에 설정된 필터 수행 + String preFiltersStr = prop.getProperty(PRE_FILTERS); + if (StringUtils.isNotEmpty(preFiltersStr)) { + String[] preFilters = StringUtils.split(preFiltersStr, ","); + for (String filterName : preFilters) { + if (StringUtils.isBlank(filterName)) { + continue; + } + + logger.debug("HttpClient5AdapterServiceRestAddFilter] Processing Start [" + filterName + "]"); + HttpClientAdapterFilter adapterFilter = HttpClient5AdapterFilterFactory.createFilter(filterName.trim()); + + if (adapterFilter != null) { +// if (adapterFilter instanceof IBKOutCommonFilter) +// isSetCommonFilterInAdapterProp = true; + + message = adapterFilter.doPreFilter(adptGrpName, adptName, prop, message, tempProp); + } else { + throw new Exception("Failed get Filter Class: " + filterName); + } + } + } + +// // 2. IBKOutCommonFilter 필터 수행(adapter 필터에서 수행하지 않을 때만) +// if (!isSetCommonFilterInAdapterProp) { +// HttpClientAdapterFilter ibkFilter = HttpClient5AdapterFilterFactory +// .createFilter(IBKOutCommonFilter.class.getName()); +// if (ibkFilter != null) { +// message = ibkFilter.doPreFilter(adptGrpName, adptName, prop, message, tempProp); +// } +// } else { +// logger.debug("IBKOutCommonFilter isSetCommonFilterInAdapterProp 'POST_FILTERS'. already in adapter filters"); +// } + + return message; + } + + protected Object doPostFilters(String adptGrpName, String adptName, Properties prop, Object message, + Properties tempProp) throws Exception { + +// boolean isSetCommonFilterInAdapterProp = false; + // 1. adapter에 설정된 필터 수행 + String postFiltersStr = prop.getProperty(POST_FILTERS); + if (StringUtils.isNotEmpty(postFiltersStr)) { + String[] postFilters = StringUtils.split(postFiltersStr, ","); + for (String filterName : postFilters) { + if (StringUtils.isBlank(filterName)) { + continue; + } + + HttpClientAdapterFilter adapterFilter = HttpClient5AdapterFilterFactory.createFilter(filterName.trim()); + if (adapterFilter != null) { +// if (adapterFilter instanceof IBKOutCommonFilter) +// isSetCommonFilterInAdapterProp = true; + message = adapterFilter.doPostFilter(adptGrpName, adptName, prop, message, tempProp); + } else { + throw new Exception("Failed get Filter Class: " + filterName); + } + } + } + +// // 2. IBKOutCommonFilter 필터 수행 +// if (!isSetCommonFilterInAdapterProp) { +// HttpClientAdapterFilter ibkFilter = HttpClient5AdapterFilterFactory +// .createFilter(IBKOutCommonFilter.class.getName()); +// if (ibkFilter != null) { +// message = ibkFilter.doPostFilter(adptGrpName, adptName, prop, message, tempProp); +// } +// } else { +// logger.debug("IBKOutCommonFilter isSetCommonFilterInAdapterProp 'PRE_FILTERS'. already in adapter filters"); +// } + return message; + } + +// protected Object doExceptionFilters(String adptGrpName, String adptName, Properties prop, Object message, +// Properties tempProp, Exception e) throws Exception { +// String exceptionFilterName = prop.getProperty(EXCEPTION_FILTER); +// if (StringUtils.isEmpty(exceptionFilterName)) +// exceptionFilterName = IBKOutExceptionFilter.class.getSimpleName(); +// +// HttpClientAdapterExceptionFilter exceptionFilter = HttpClient5AdapterFilterFactory.createExceptionFilter(exceptionFilterName.trim()); +// return exceptionFilter.doExceptionFilter(adptGrpName, adptName, prop, message, tempProp, e); +// +// } + +} \ No newline at end of file diff --git a/src/main/java/com/eactive/eai/custom/adapter/http/dynamic/filter/KjbHmacSha256VerifyFilter.java b/src/main/java/com/eactive/eai/custom/kjb/adapter/http/dynamic/filter/KjbHmacSha256VerifyFilter.java similarity index 97% rename from src/main/java/com/eactive/eai/custom/adapter/http/dynamic/filter/KjbHmacSha256VerifyFilter.java rename to src/main/java/com/eactive/eai/custom/kjb/adapter/http/dynamic/filter/KjbHmacSha256VerifyFilter.java index 2ef0367..9b911de 100644 --- a/src/main/java/com/eactive/eai/custom/adapter/http/dynamic/filter/KjbHmacSha256VerifyFilter.java +++ b/src/main/java/com/eactive/eai/custom/kjb/adapter/http/dynamic/filter/KjbHmacSha256VerifyFilter.java @@ -1,4 +1,4 @@ -package com.eactive.eai.custom.adapter.http.dynamic.filter; +package com.eactive.eai.custom.kjb.adapter.http.dynamic.filter; import java.io.UnsupportedEncodingException; import java.security.InvalidKeyException; @@ -27,6 +27,10 @@ public class KjbHmacSha256VerifyFilter implements HttpAdapterFilter, HttpAdapter static Logger logger = Logger.getLogger(Logger.LOGGER_ADAPTER); private static final String SERVICE_CODE_UNKNOWN = "00"; + + public KjbHmacSha256VerifyFilter() { + super(); + } @Override public Object doPreFilter(String adptGrpName, String adptName, Object message, Properties prop, diff --git a/src/main/java/com/eactive/eai/custom/message/StandardMessageCoordinatorKJB.java b/src/main/java/com/eactive/eai/custom/message/StandardMessageCoordinatorKJB.java index cfe435e..437fa14 100644 --- a/src/main/java/com/eactive/eai/custom/message/StandardMessageCoordinatorKJB.java +++ b/src/main/java/com/eactive/eai/custom/message/StandardMessageCoordinatorKJB.java @@ -19,12 +19,12 @@ import com.ext.eai.common.stdmessage.STDMessageKeys; import org.apache.commons.lang.StringUtils; import java.net.UnknownHostException; +import java.util.LinkedHashMap; import java.util.Properties; public class StandardMessageCoordinatorKJB extends DefaultStandardMessageCoordinator { private static Logger logger = Logger.getLogger(Logger.LOGGER_DEFAULT); - public static final String DEFAULT_LENGTH = "00000745"; private static final String MESSAGE_PART = "Message"; private static final String MESSAGE_PART_HEADER_PART = "Message.Msg_Header"; private static final String MESSAGE_PART_MSG_HEDR_KNCD = "Message.Msg_Header.MSG_HEDR_KNCD"; @@ -32,6 +32,7 @@ public class StandardMessageCoordinatorKJB extends DefaultStandardMessageCoordin private static final String MESSAGE_PART_BODY_PART = "Message.Msg_Body"; private static final String MESSAGE_PART_OUTPUT_MSG_CD = "Message.Msg_Body.OUTPUT_MSG_CD"; private static final String MESSAGE_PART_OUTPUT_MSG_CTNT = "Message.Msg_Body.OUTPUT_MSG_CTNT"; + private static final String MESSAGE_PART_OUTPUT_MSG_GRID = "Message.Msg_Body.Output_Msg_Grid"; private static final String COMMON_PART_GROUP_CMD_CD = "Common.Service_info.GROUP_CMP_CD"; private static final String COMMON_PART_OTSD_CHNL_INST_CD = "Common.Service_info.OTSD_CHNL_INST_CD"; private static final String DATA_HEADER_DATA_HEDR_LEN = "Data_Part.Data_Header.DATA_HEDR_LEN"; @@ -134,11 +135,17 @@ public class StandardMessageCoordinatorKJB extends DefaultStandardMessageCoordin mapper.setErrorCode(standardMessage, siteErrCode); standardMessage.setData(MESSAGE_PART_MSG_HEDR_KNCD, "EM"); - standardMessage.setData(MESSAGE_PART_MSG_HEDR_LEN, DEFAULT_LENGTH); standardMessage.setData(MESSAGE_PART_OUTPUT_MSG_CD, siteErrCode); + StandardItem msgGrid = standardMessage.findItem(MESSAGE_PART_OUTPUT_MSG_GRID); + LinkedHashMap msgGridFirstChilds = msgGrid.getArrayChilds(0, true); + msgGridFirstChilds.get("OUTPUT_MSG_CD").setValue(siteErrCode); + msgGridFirstChilds.get("OUTPUT_MSG_CTNT").setValue(siteErrMessage); //Message.Msg_Body.OUTPUT_MSG_CTNT mapper.setErrorMsg(standardMessage, siteErrMessage); - + int len = standardMessage.getBytesDataLengthForPath(MESSAGE_PART_BODY_PART); + String lenStr = StringUtils.leftPad(String.valueOf(len), 8, '0'); + standardMessage.setData(MESSAGE_PART_MSG_HEDR_LEN, lenStr); + return false; } @@ -155,9 +162,15 @@ public class StandardMessageCoordinatorKJB extends DefaultStandardMessageCoordin messageBodyPart.setSize(1); responseMessage.setData(MESSAGE_PART_MSG_HEDR_KNCD, "NM"); - responseMessage.setData(MESSAGE_PART_MSG_HEDR_LEN, DEFAULT_LENGTH); responseMessage.setData(MESSAGE_PART_OUTPUT_MSG_CD, "100000 "); - responseMessage.setData(MESSAGE_PART_OUTPUT_MSG_CTNT, "정상처리 되었습니다."); + responseMessage.setData(MESSAGE_PART_OUTPUT_MSG_CTNT, "정상처리"); + StandardItem msgGrid = responseMessage.findItem(MESSAGE_PART_OUTPUT_MSG_GRID); + LinkedHashMap msgGridFirstChilds = msgGrid.getArrayChilds(0, true); + msgGridFirstChilds.get("OUTPUT_MSG_CD").setValue("100000 "); + msgGridFirstChilds.get("OUTPUT_MSG_CTNT").setValue("정상처리"); + int len = responseMessage.getBytesDataLengthForPath(MESSAGE_PART_BODY_PART); + String lenStr = StringUtils.leftPad(String.valueOf(len), 8, '0'); + responseMessage.setData(MESSAGE_PART_MSG_HEDR_LEN, lenStr); } public String getSysOprtEnvDvcd(EAIServerManager eaiServerManager) { diff --git a/src/main/java/com/eactive/eai/custom/transformer/function/userdefined/BooleanToFlag.java b/src/main/java/com/eactive/eai/custom/transformer/function/userdefined/BooleanToFlag.java new file mode 100644 index 0000000..6c3a271 --- /dev/null +++ b/src/main/java/com/eactive/eai/custom/transformer/function/userdefined/BooleanToFlag.java @@ -0,0 +1,37 @@ +package com.eactive.eai.custom.transformer.function.userdefined; + +import java.util.Stack; + +import org.apache.commons.lang.StringUtils; +import org.nfunk.jep.ParseException; +import org.nfunk.jep.function.PostfixMathCommand; + + +public class BooleanToFlag extends PostfixMathCommand { + public BooleanToFlag() { + numberOfParameters = -1; + } + + public void run(Stack inStack) throws ParseException { + checkStack(inStack); + + Object p1 = inStack.pop(); + + String strInStack = ""; + String resultStr = ""; + if (p1 instanceof byte[]) { + strInStack = new String((byte[]) p1); + } else if (p1 instanceof String) { + strInStack = (String) p1; + } else { + throw new ParseException("Invalid parameter type, p1 is not string/bytes"); + } + + if (StringUtils.equalsIgnoreCase(strInStack, "TRUE")) { + resultStr = "Y"; + } else { + resultStr = "N"; + } + inStack.push(resultStr); + } +} diff --git a/src/main/java/com/eactive/eai/custom/transformer/function/userdefined/ContainsString.java b/src/main/java/com/eactive/eai/custom/transformer/function/userdefined/ContainsString.java new file mode 100644 index 0000000..0829b91 --- /dev/null +++ b/src/main/java/com/eactive/eai/custom/transformer/function/userdefined/ContainsString.java @@ -0,0 +1,59 @@ +package com.eactive.eai.custom.transformer.function.userdefined; + +import java.util.Stack; + +import org.apache.commons.lang.StringUtils; +import org.nfunk.jep.ParseException; +import org.nfunk.jep.function.PostfixMathCommand; + + +public class ContainsString extends PostfixMathCommand { + public ContainsString() { + numberOfParameters = -1; + } + + public void run(Stack inStack) throws ParseException { + checkStack(inStack); + + if (curNumberOfParameters == 4) { + Object p4 = inStack.pop(); + if (p4 instanceof String) { + String falseVal = (String) p4; + Object p3 = inStack.pop(); + if (p3 instanceof String) { + String trueVal = (String) p3; + Object p2 = inStack.pop(); + if (p2 instanceof String) { + String str = (String) p2; + Object p1 = inStack.pop(); + if (p1 instanceof String) { + String originStr = (String) p1; + if (StringUtils.contains(originStr, str)) { + inStack.push(trueVal); + } else { + inStack.push(falseVal); + } + } else if (p1 instanceof byte[]) { + String originStr = new String((byte[]) p1); + if (StringUtils.contains(originStr, str)) { + inStack.push(trueVal); + } else { + inStack.push(falseVal); + } + } else { + throw new ParseException("Invalid parameter type, p1 is not string/bytes"); + } + } else { + throw new ParseException("Invalid parameter type, p2 is not String"); + } + } else { + throw new ParseException("Invalid parameter type, p3 is not String"); + } + } else { + throw new ParseException("Invalid parameter type, p4 is String"); + } + } else { + throw new ParseException("invalid parameter count : " + curNumberOfParameters + " - parameter count must be 4"); + } + } +} diff --git a/src/main/java/com/eactive/eai/custom/transformer/function/userdefined/FlagToBoolean.java b/src/main/java/com/eactive/eai/custom/transformer/function/userdefined/FlagToBoolean.java new file mode 100644 index 0000000..e42460b --- /dev/null +++ b/src/main/java/com/eactive/eai/custom/transformer/function/userdefined/FlagToBoolean.java @@ -0,0 +1,37 @@ +package com.eactive.eai.custom.transformer.function.userdefined; + +import java.util.Stack; + +import org.apache.commons.lang.StringUtils; +import org.nfunk.jep.ParseException; +import org.nfunk.jep.function.PostfixMathCommand; + + +public class FlagToBoolean extends PostfixMathCommand { + public FlagToBoolean() { + numberOfParameters = -1; + } + + public void run(Stack inStack) throws ParseException { + checkStack(inStack); + + Object p1 = inStack.pop(); + + String strInStack = ""; + String resultStr = ""; + if (p1 instanceof byte[]) { + strInStack = new String((byte[]) p1); + } else if (p1 instanceof String) { + strInStack = (String) p1; + } else { + throw new ParseException("Invalid parameter type, p1 is not string/bytes"); + } + + if (StringUtils.equalsIgnoreCase(strInStack, "Y")) { + resultStr = "True"; + } else { + resultStr = "False"; + } + inStack.push(resultStr); + } +} diff --git a/src/main/resources/certificate/KJBank-oAuth-dev.jks b/src/main/resources/certificate/KJBank-oAuth-dev.jks new file mode 100644 index 0000000..ec007ca Binary files /dev/null and b/src/main/resources/certificate/KJBank-oAuth-dev.jks differ diff --git a/src/main/resources/certificate/KJBank-oAuth-dev.pub b/src/main/resources/certificate/KJBank-oAuth-dev.pub new file mode 100644 index 0000000..ef63b00 --- /dev/null +++ b/src/main/resources/certificate/KJBank-oAuth-dev.pub @@ -0,0 +1,9 @@ +-----BEGIN PUBLIC KEY----- +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAzY3zugQeOrTkol2fHIhD +/S8FqvNX6ijrU7v8wEnaIYVG1ay6ehAmlg6dc7J0Bvf1Ed5EvbDEI+4sa8n6egWa +zHSL4GXQXj9QFZGvRRah6nPhYiAvbLqHPwvG4QreIwx1Yt4tx63m8gFid6QjEsZP +DbWeX6bXW1scR+qtztkq2CGvOHlej5JHsdP350hH3Hq2sxdmTHurVwFJdfzBwDkU +MJlLwIEkkbACK1hrQhrEf1uKX8HtxrozSS8sso4wFrOPe8u/ykqYmSPlSfUsPvNr +cK/VroyX63RAE+giH84Y8mSHLr+mfEG3AhdJ1+ZqB9jBunTZDiGKn00mT4jJLwgr +BwIDAQAB +-----END PUBLIC KEY----- diff --git a/src/main/resources/certificate/product/KJBank-oAuth-prod.jks b/src/main/resources/certificate/product/KJBank-oAuth-prod.jks new file mode 100644 index 0000000..f8af8d5 Binary files /dev/null and b/src/main/resources/certificate/product/KJBank-oAuth-prod.jks differ diff --git a/src/main/resources/certificate/product/KJBank-oAuth-prod.pub b/src/main/resources/certificate/product/KJBank-oAuth-prod.pub new file mode 100644 index 0000000..837a236 --- /dev/null +++ b/src/main/resources/certificate/product/KJBank-oAuth-prod.pub @@ -0,0 +1,9 @@ +-----BEGIN PUBLIC KEY----- +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA8M6NO6KfKRTwwOfZ/slx +fT/4vPzr1zXvgTHoVq/dyoCk8OeVS0OOJXln7ZqDPkKSlfd1X1fdDaEOfLJXfvPC +Hz7AOTBdr1/Y+Ro4slflO8d9/HbNkUZQTsbS/JqnpD20isP+sSJXHVOq5zEa4bbC +tGcpDIwoOIWqoCAA++jUSKhMZEiag5hWKUBi3wpLLjHiKtk9NZxvfCJO6GMJpN1c +O37cnudSan+oDGn3Twb579pK+gG3UZejQABhrqkv63MhMLrl74tXbHL9HX9shJjQ +zq8SQn2k/RbwLVE+USuDmN8BZkVmtQZRirr3d8yT+BlpgodeqMX8PYcztV+4VTvl +swIDAQAB +-----END PUBLIC KEY-----