From b16a7ecc07f5cc677cc8b9a25223001b59e94a82 Mon Sep 17 00:00:00 2001 From: daekuk Date: Wed, 28 Jan 2026 10:49:08 +0900 Subject: [PATCH 01/12] =?UTF-8?q?-=20=EC=96=B4=EB=8C=91=ED=84=B0=20?= =?UTF-8?q?=ED=94=84=EB=9D=BC=ED=8D=BC=ED=8B=B0=20"API=5FPATH"=20=EC=9D=98?= =?UTF-8?q?=20=EA=B0=92=20=EB=B3=80=EA=B2=BD=EC=8B=9C=20HS04=20Table?= =?UTF-8?q?=EC=9D=98=20"APIFULLPATH"=20=EB=8F=84=20=EC=97=85=EB=8D=B0?= =?UTF-8?q?=EC=9D=B4=ED=8A=B8=20=EB=90=98=EB=8F=84=EB=A1=9D=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../onl/adapter/AdapterGroupService.java | 4 + .../StandardMessageInfoService.java | 14 ++ .../adapter/adapter/AdapterManService.java | 160 +++++++++++++++++- 3 files changed, 174 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/eactive/eai/rms/data/entity/onl/adapter/AdapterGroupService.java b/src/main/java/com/eactive/eai/rms/data/entity/onl/adapter/AdapterGroupService.java index 9d0ab0e..1ec9d3c 100644 --- a/src/main/java/com/eactive/eai/rms/data/entity/onl/adapter/AdapterGroupService.java +++ b/src/main/java/com/eactive/eai/rms/data/entity/onl/adapter/AdapterGroupService.java @@ -245,4 +245,8 @@ public class AdapterGroupService extends AbstractDataService findByBzwksvckeynameStartingWith(String adapterName) { + QStandardMessageInfo qStandardMessageInfo = QStandardMessageInfo.standardMessageInfo; + + return getJPAQueryFactory() + .selectFrom(qStandardMessageInfo) + .where(qStandardMessageInfo.bzwksvckeyname.startsWith(adapterName)) + .fetch(); + } + + public StandardMessageInfo saveAndFlush(StandardMessageInfo stdMsgInfo) { + return repository.saveAndFlush(stdMsgInfo); + } } diff --git a/src/main/java/com/eactive/eai/rms/onl/manage/adapter/adapter/AdapterManService.java b/src/main/java/com/eactive/eai/rms/onl/manage/adapter/adapter/AdapterManService.java index 75c4f22..9b782ce 100644 --- a/src/main/java/com/eactive/eai/rms/onl/manage/adapter/adapter/AdapterManService.java +++ b/src/main/java/com/eactive/eai/rms/onl/manage/adapter/adapter/AdapterManService.java @@ -23,10 +23,15 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; +import com.eactive.eai.agent.command.Command; import com.eactive.eai.agent.command.CommonCommand; +import com.eactive.eai.common.stdmessage.STDMessageManager; import com.eactive.eai.data.entity.onl.adapter.Adapter; import com.eactive.eai.data.entity.onl.adapter.AdapterGroup; +import com.eactive.eai.data.entity.onl.adapter.AdapterProp; import com.eactive.eai.data.entity.onl.adapter.AdapterPropGroup; +import com.eactive.eai.data.entity.onl.stdmessage.StandardMessageInfo; +import com.eactive.eai.data.jpa.BaseRepository; import com.eactive.eai.rms.common.acl.monitoringCode.MonitoringCodeManService; import com.eactive.eai.rms.common.base.OnlBaseService; import com.eactive.eai.rms.common.comDomain.CommonDomainManService; @@ -42,6 +47,7 @@ import com.eactive.eai.rms.data.entity.onl.adapter.AdapterTypePropertyService; import com.eactive.eai.rms.data.entity.onl.adapter.CommonDomain; import com.eactive.eai.rms.data.entity.onl.code.CodeService; import com.eactive.eai.rms.data.entity.onl.server.EAIServerService; +import com.eactive.eai.rms.data.entity.onl.stdmessage.StandardMessageInfoService; import com.eactive.eai.rms.onl.common.exception.BizException; import com.eactive.eai.rms.onl.common.service.AdapterChangeThreadPool; import com.eactive.eai.rms.onl.manage.adapter.adapter.mapper.AdapterGroupUIMapper; @@ -52,6 +58,7 @@ import com.eactive.eai.rms.onl.manage.adapter.adapter.ui.AdapterGroupUIMixIn; import com.eactive.eai.rms.onl.manage.adapter.adapter.ui.AdapterGroupUISearch; import com.eactive.eai.rms.onl.manage.adapter.adapter.ui.AdapterPropUI; import com.eactive.eai.rms.onl.manage.adapter.adapter.ui.AdapterUI; +import com.ext.eai.agent.stdmessage.ReloadSTDMessageCommand; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectWriter; @@ -106,7 +113,10 @@ public class AdapterManService extends OnlBaseService { @Autowired private EAIServerService eaiServerService; - + + @Autowired + private StandardMessageInfoService standardmessageinfoService; + public Page selectList(Pageable pageable, AdapterGroupUISearch adapterGroupUISearch) { Page page = adapterGroupService.findPage(pageable, adapterGroupUISearch); return page.map(adapterGroupUIMapper::toVoWithoutChildrenMapping); @@ -234,11 +244,153 @@ public class AdapterManService extends OnlBaseService { public void update(AdapterGroupUI adapterGroupUI) { - AdapterGroup adapterGroup = adapterGroupService.getById(adapterGroupUI.getAdptrbzwkgroupname()); - adapterGroupUIMapper.updateEntity(adapterGroupUI, adapterGroup); + AdapterGroup adapterGroup = adapterGroupService.getById(adapterGroupUI.getAdptrbzwkgroupname()); + + Map oldApiPathMap = extractApiPaths(adapterGroup); + + adapterGroupUIMapper.updateEntity(adapterGroupUI, adapterGroup); + + // NonUniqueObjectException 대응 + adapterGroupService.saveAndFlush(adapterGroup); - adapterGroupService.save(adapterGroup); + + // HS04 - API_FULL_PATH 동기화 + syncIfApiPathChanged(adapterGroup, oldApiPathMap); } + + private Map extractApiPaths(AdapterGroup adapterGroup) { + + Map pathMap = new HashMap<>(); + + if (adapterGroup == null || adapterGroup.getAdapters() == null) { + return pathMap; + } + for (Adapter adapter : adapterGroup.getAdapters()) { + + if (adapter.getAdapterPropGroup() == null + || adapter.getAdapterPropGroup().getAdapterProps() == null) { + continue; + } + + for (AdapterProp prop : adapter.getAdapterPropGroup().getAdapterProps()) { + String propName = prop.getId().getPrptyname(); + + if ("API_PATH".equals(propName)) { + String adapterName = adapter.getId().getAdptrbzwkgroupname(); + + String apiPathValue = prop.getPrpty2val(); + + pathMap.put(adapterName, apiPathValue); + + break; + + } + + } + } + + + return pathMap; + + } + + private void syncIfApiPathChanged(AdapterGroup newGroup, Map oldPathMap) { + + if (newGroup.getAdapters() == null) return; + + for (Adapter newAdapter : newGroup.getAdapters()) { // adapterData 분리 + String adapterName = newAdapter.getId().getAdptrbzwkgroupname(); // 업데이트할때 들어온 어댑터 이름 + String newPath = findApiPathValue(newAdapter); + + String oldPath = oldPathMap.get(adapterName); + + if (StringUtils.isNotBlank(oldPath) + && StringUtils.isNotBlank(newPath) + && !StringUtils.equals(oldPath, newPath)) { + + updateStdMessageInfoApiFullPath(adapterName, oldPath, newPath); + } + } + + + } + + private String findApiPathValue(Adapter adapter) { + if (adapter.getAdapterPropGroup() == null + || adapter.getAdapterPropGroup().getAdapterProps() == null) { + return null; + } + + return adapter.getAdapterPropGroup().getAdapterProps().stream() + .filter(prop -> prop.getId() != null && "API_PATH".equals(prop.getId().getPrptyname())) + .findFirst() + .map(AdapterProp::getPrpty2val) + .orElse(null); + } + + private void updateStdMessageInfoApiFullPath(String adapterName, String oldPath, String newPath) { + + List stdMsgInfoList = standardmessageinfoService.findByBzwksvckeynameStartingWith(adapterName); + + // 변경 사항이 있었는지 체크해서 HS04 Reload 함. + boolean isUpdated = false; + + for (StandardMessageInfo stdMsgInfo : stdMsgInfoList) { + String fullPath = stdMsgInfo.getApifullpath(); + + // 기존 경로(oldPath)를 포함하고 있을 때만 교체 + if (StringUtils.isNotBlank(fullPath) && fullPath.contains(oldPath)) { + + int pipeIndex = fullPath.indexOf("|"); + + if (pipeIndex != -1) { + String methodPart = fullPath.substring(0, pipeIndex + 1); + String uriPart = fullPath.substring(pipeIndex + 1); + + if (uriPart.startsWith(oldPath)) { + String newUriPart = newPath + uriPart.substring(oldPath.length()); + String updatedFullPath = methodPart + newUriPart; + + stdMsgInfo.setApifullpath(updatedFullPath); + + + try { + // DB에 즉시 반영 + standardmessageinfoService.saveAndFlush(stdMsgInfo); + + isUpdated = true; + + } catch (Exception e) { + + log.error("StandardMessageInfo APIFULLPATH SAVE FAIL key = {}", stdMsgInfo.getBzwksvckeyname()); + } + + } + } else { + // 파이프가 없는 경우 로그 생성 + log.warn("[StandardMessageInfo APIFULLPATH Sync Skip] Abnormal data format found. Adapter: {}, FullPath: {}", adapterName, fullPath); + } + + } + } + + if (isUpdated) { + + try { + + Command command = new ReloadSTDMessageCommand(); + command.setArgs("ALL"); + + agentUtilService.broadcast(command); + + log.debug("API 경로 변경 감지 -> 전체 표준 전문 리로드 명령 전송 완료 (ALL)"); + + } catch (Exception e) { + log.debug("브로드캐스트 전송 실패", e); + } + } + + } public void delete(AdapterGroupUI adapterGroupUI) { adapterGroupService.deleteById(adapterGroupUI.getAdptrbzwkgroupname()); From ec2dd395ee3fb5ebb95757743824a07831a0d72a Mon Sep 17 00:00:00 2001 From: daekuk Date: Wed, 28 Jan 2026 13:26:09 +0900 Subject: [PATCH 02/12] =?UTF-8?q?-=20=EC=82=AC=EC=9A=A9=ED=95=98=EC=A7=80?= =?UTF-8?q?=20=EC=95=8A=EB=8A=94=20=EB=B2=84=ED=8A=BC=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- WebContent/jsp/onl/adapter/socket/socketStatus.jsp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WebContent/jsp/onl/adapter/socket/socketStatus.jsp b/WebContent/jsp/onl/adapter/socket/socketStatus.jsp index 2c060a3..eabc18a 100644 --- a/WebContent/jsp/onl/adapter/socket/socketStatus.jsp +++ b/WebContent/jsp/onl/adapter/socket/socketStatus.jsp @@ -303,8 +303,8 @@
-     -    +<%--     --%> +<%--    --%> <%-- " id="btn_excel" level="W"/> --%> From 51bbd6678bc654b05c5c40a7f7e4c044ee1831f0 Mon Sep 17 00:00:00 2001 From: daekuk Date: Wed, 28 Jan 2026 18:31:38 +0900 Subject: [PATCH 03/12] =?UTF-8?q?-=20=EB=A9=94=EB=AA=A8=EB=A6=AC=20?= =?UTF-8?q?=EB=A6=AC=EB=A1=9C=EB=93=9C=20=EB=AC=B8=EC=A0=9C=20=EA=B0=9C?= =?UTF-8?q?=EC=84=A0=20(=EB=B3=80=EA=B2=BD=EB=90=9C=20=EC=96=B4=EB=8C=91?= =?UTF-8?q?=ED=84=B0=20=ED=94=84=EB=9D=BC=ED=8D=BC=ED=8B=B0=20=EA=B0=92?= =?UTF-8?q?=EC=9D=B4=20=EB=B0=98=EC=98=81=EB=90=98=EC=A7=80=EC=95=8A?= =?UTF-8?q?=EC=95=84=EC=84=9C=20=EC=88=98=EC=A0=95)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../adapter/adapter/AdapterController.java | 2 +- .../adapter/adapter/AdapterManService.java | 64 ++++++++++++------- 2 files changed, 41 insertions(+), 25 deletions(-) diff --git a/src/main/java/com/eactive/eai/rms/onl/manage/adapter/adapter/AdapterController.java b/src/main/java/com/eactive/eai/rms/onl/manage/adapter/adapter/AdapterController.java index 64129af..338f5d5 100644 --- a/src/main/java/com/eactive/eai/rms/onl/manage/adapter/adapter/AdapterController.java +++ b/src/main/java/com/eactive/eai/rms/onl/manage/adapter/adapter/AdapterController.java @@ -248,7 +248,7 @@ public class AdapterController extends OnlBaseAnnotationController { synchronized (obj) { service.update(adapterGroupUI); - Map resultMap = service.reloadSync(adapterGroupUI); + Map resultMap = service.reloadSyncStdMsgAndAdapter(adapterGroupUI.getAdptrbzwkgroupname()); return ResponseEntity.ok(resultMap); } diff --git a/src/main/java/com/eactive/eai/rms/onl/manage/adapter/adapter/AdapterManService.java b/src/main/java/com/eactive/eai/rms/onl/manage/adapter/adapter/AdapterManService.java index 9b782ce..7de3d7b 100644 --- a/src/main/java/com/eactive/eai/rms/onl/manage/adapter/adapter/AdapterManService.java +++ b/src/main/java/com/eactive/eai/rms/onl/manage/adapter/adapter/AdapterManService.java @@ -333,8 +333,6 @@ public class AdapterManService extends OnlBaseService { List stdMsgInfoList = standardmessageinfoService.findByBzwksvckeynameStartingWith(adapterName); // 변경 사항이 있었는지 체크해서 HS04 Reload 함. - boolean isUpdated = false; - for (StandardMessageInfo stdMsgInfo : stdMsgInfoList) { String fullPath = stdMsgInfo.getApifullpath(); @@ -358,8 +356,6 @@ public class AdapterManService extends OnlBaseService { // DB에 즉시 반영 standardmessageinfoService.saveAndFlush(stdMsgInfo); - isUpdated = true; - } catch (Exception e) { log.error("StandardMessageInfo APIFULLPATH SAVE FAIL key = {}", stdMsgInfo.getBzwksvckeyname()); @@ -374,22 +370,6 @@ public class AdapterManService extends OnlBaseService { } } - if (isUpdated) { - - try { - - Command command = new ReloadSTDMessageCommand(); - command.setArgs("ALL"); - - agentUtilService.broadcast(command); - - log.debug("API 경로 변경 감지 -> 전체 표준 전문 리로드 명령 전송 완료 (ALL)"); - - } catch (Exception e) { - log.debug("브로드캐스트 전송 실패", e); - } - } - } public void delete(AdapterGroupUI adapterGroupUI) { @@ -559,7 +539,43 @@ public class AdapterManService extends OnlBaseService { adapterGroup.setMoniuseyn(adapterGroupUI.getMoniuseyn()); } } + + public Map reloadSyncStdMsgAndAdapter(String adapterGroupName) throws Exception { + + Map result = new HashMap<>(); + + String status = "success"; + + try { + log.debug(">>>>>>>> [Reload Start] 어댑터 그룹명 {}", adapterGroupName); + + CommonCommand pcommand = new CommonCommand( + "com.eactive.eai.agent.adapter.ReloadAdapterPropGroupCommand", + adapterGroupName + ); + agentUtilService.broadcast(pcommand); + + CommonCommand acommand = new CommonCommand( + "com.eactive.eai.agent.adapter.ReloadAdapterGroupCommand", + adapterGroupName + ); + agentUtilService.broadcast(acommand); + + Command stdcommand = new ReloadSTDMessageCommand(); + stdcommand.setArgs("ALL"); + agentUtilService.broadcast(stdcommand); + + log.info(">>>>>> [Reload End] 모든 리로드 명령 전송 완료"); + } catch (Exception e) { + status = "error"; + log.error("리로드 실패", e); + } + + result.put("status", status); + return result; + } + public Map reloadSync(AdapterGroupUI adapterGroupUI) throws Exception { Map receive = null; Map result = new HashMap<>(); @@ -571,19 +587,19 @@ public class AdapterManService extends OnlBaseService { prptyGroupName); agentUtilService.broadcast(pcommand); } - + CommonCommand acommand = new CommonCommand("com.eactive.eai.agent.adapter.ReloadAdapterGroupCommand", adapterGroupUI.getAdptrbzwkgroupname()); receive = agentUtilService.broadcast(acommand); - + if (receive.values().stream().anyMatch(value -> value == null || !"success".equals(value))) { status = "error"; } - + result.put("status", status); result.put("message", receive.toString()); return result; - + } public Map deleteSync(AdapterGroupUI map, List list) throws Exception { From 71892f16f6d0336ba7ff89d9617b04dd69276746 Mon Sep 17 00:00:00 2001 From: daekuk Date: Thu, 29 Jan 2026 10:00:57 +0900 Subject: [PATCH 04/12] =?UTF-8?q?-=20target=20=EB=B3=80=ED=99=98=ED=95=A8?= =?UTF-8?q?=EC=88=98=EB=8F=84=20setSearchble=20=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80(=ED=82=A4=EC=9B=8C=EB=93=9C=20=EA=B2=80?= =?UTF-8?q?=EC=83=89)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../jsp/onl/admin/rule/transform2/transform2ManDetail.jsp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/WebContent/jsp/onl/admin/rule/transform2/transform2ManDetail.jsp b/WebContent/jsp/onl/admin/rule/transform2/transform2ManDetail.jsp index d37ab64..577526e 100644 --- a/WebContent/jsp/onl/admin/rule/transform2/transform2ManDetail.jsp +++ b/WebContent/jsp/onl/admin/rule/transform2/transform2ManDetail.jsp @@ -1313,6 +1313,8 @@ $('#functionComboDialog').val($('#functionCombo').val()); + setSearchable("functionComboDialog"); + mouseoverEndpoint(endpoint, 'click-endpoint'); moveDialogPosition(false); }, From ad07c7dcd5b453cc82363127412a2988b21b3fef Mon Sep 17 00:00:00 2001 From: cho Date: Thu, 29 Jan 2026 16:17:59 +0900 Subject: [PATCH 05/12] =?UTF-8?q?=EA=B1=B0=EB=9E=98=ED=86=B5=EC=A0=9C=20AP?= =?UTF-8?q?I=20=EC=A0=9C=EA=B3=B5=EC=9D=84=20=EC=9C=84=ED=95=9C=20login=20?= =?UTF-8?q?skip=20=ED=95=98=EB=8F=84=EB=A1=9D=20=EC=88=98=EC=A0=95.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 로그인 안하면 보안문제? 해당 거래통제 거래는 인터페이스 생성후, OAuth토큰 인증 하고 들어올 예정. --- .../rms/onl/manage/control/control/ControlManController.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/eactive/eai/rms/onl/manage/control/control/ControlManController.java b/src/main/java/com/eactive/eai/rms/onl/manage/control/control/ControlManController.java index 3522889..94f5cb3 100644 --- a/src/main/java/com/eactive/eai/rms/onl/manage/control/control/ControlManController.java +++ b/src/main/java/com/eactive/eai/rms/onl/manage/control/control/ControlManController.java @@ -17,11 +17,12 @@ import org.springframework.web.servlet.ModelAndView; import com.eactive.eai.agent.command.CommonCommand; import com.eactive.eai.rms.common.base.OnlBaseAnnotationController; +import com.eactive.eai.rms.common.interceptor.InterceptorSkipController; import com.eactive.eai.rms.common.login.SessionManager; import com.google.gson.Gson; @Controller -public class ControlManController extends OnlBaseAnnotationController { +public class ControlManController extends OnlBaseAnnotationController implements InterceptorSkipController { private static final String RELOAD_RESTRICT_INFO_COMMAND = "com.eactive.eai.agent.restrict.ReloadRestrictInfoCommand"; private static final String ERROR_RESULT_STATUS = "에러"; From 9943c44eb40985e27369c81af95893c4b3618d35 Mon Sep 17 00:00:00 2001 From: daekuk Date: Fri, 30 Jan 2026 10:45:21 +0900 Subject: [PATCH 06/12] =?UTF-8?q?-=20=EB=A9=94=EB=AA=A8=EB=A6=AC=20?= =?UTF-8?q?=EB=A6=AC=EB=A1=9C=EB=93=9C=20=EB=B9=84=EC=A0=95=EC=83=81=20?= =?UTF-8?q?=EB=8F=99=EC=9E=91=ED=95=98=EB=8A=94=20=EB=B6=80=EB=B6=84=20?= =?UTF-8?q?=EC=88=98=EC=A0=95,=20=EA=B8=B0=EC=A1=B4=20=EC=BD=94=EB=93=9C?= =?UTF-8?q?=20=EC=82=AC=EC=9A=A9.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../adapter/adapter/AdapterController.java | 2 +- .../adapter/adapter/AdapterManService.java | 74 +++++++++++-------- 2 files changed, 44 insertions(+), 32 deletions(-) diff --git a/src/main/java/com/eactive/eai/rms/onl/manage/adapter/adapter/AdapterController.java b/src/main/java/com/eactive/eai/rms/onl/manage/adapter/adapter/AdapterController.java index 338f5d5..77dd89d 100644 --- a/src/main/java/com/eactive/eai/rms/onl/manage/adapter/adapter/AdapterController.java +++ b/src/main/java/com/eactive/eai/rms/onl/manage/adapter/adapter/AdapterController.java @@ -248,7 +248,7 @@ public class AdapterController extends OnlBaseAnnotationController { synchronized (obj) { service.update(adapterGroupUI); - Map resultMap = service.reloadSyncStdMsgAndAdapter(adapterGroupUI.getAdptrbzwkgroupname()); + Map resultMap = service.reloadSyncStdMsgAndAdapter(adapterGroupUI); return ResponseEntity.ok(resultMap); } diff --git a/src/main/java/com/eactive/eai/rms/onl/manage/adapter/adapter/AdapterManService.java b/src/main/java/com/eactive/eai/rms/onl/manage/adapter/adapter/AdapterManService.java index 7de3d7b..d55875d 100644 --- a/src/main/java/com/eactive/eai/rms/onl/manage/adapter/adapter/AdapterManService.java +++ b/src/main/java/com/eactive/eai/rms/onl/manage/adapter/adapter/AdapterManService.java @@ -540,40 +540,52 @@ public class AdapterManService extends OnlBaseService { } } - public Map reloadSyncStdMsgAndAdapter(String adapterGroupName) throws Exception { - - Map result = new HashMap<>(); - - String status = "success"; - - try { - log.debug(">>>>>>>> [Reload Start] 어댑터 그룹명 {}", adapterGroupName); - - CommonCommand pcommand = new CommonCommand( - "com.eactive.eai.agent.adapter.ReloadAdapterPropGroupCommand", - adapterGroupName - ); - agentUtilService.broadcast(pcommand); - - CommonCommand acommand = new CommonCommand( - "com.eactive.eai.agent.adapter.ReloadAdapterGroupCommand", - adapterGroupName - ); - agentUtilService.broadcast(acommand); - - Command stdcommand = new ReloadSTDMessageCommand(); - stdcommand.setArgs("ALL"); + public Map reloadSyncStdMsgAndAdapter(AdapterGroupUI adapterGroupUI) throws Exception { + Map receive = null; + Map result = new HashMap<>(); + String status = "success"; + + try { + log.info(">>>>>> [Reload AdapterManService Start] 리로드 시작"); + + for (Entry entry : adapterGroupUI.getAdapterData().entrySet()) { + AdapterUI adapterUI = entry.getValue(); + String prptyGroupName = adapterUI.getPrptygroupname(); + + CommonCommand pcommand = new CommonCommand( + "com.eactive.eai.agent.adapter.ReloadAdapterPropGroupCommand", + prptyGroupName + ); + agentUtilService.broadcast(pcommand); + } + + // 어댑터 그룹 리로드 + CommonCommand acommand = new CommonCommand( + "com.eactive.eai.agent.adapter.ReloadAdapterGroupCommand", + adapterGroupUI.getAdptrbzwkgroupname() + ); + receive = agentUtilService.broadcast(acommand); + + // HS04 API_FULL_PATH + Command stdcommand = new ReloadSTDMessageCommand(); + stdcommand.setArgs("ALL"); agentUtilService.broadcast(stdcommand); - log.info(">>>>>> [Reload End] 모든 리로드 명령 전송 완료"); - } catch (Exception e) { - status = "error"; - log.error("리로드 실패", e); - } - - result.put("status", status); - return result; + log.info(">>>>>> [Reload AdapterManService End] 리로드 완료"); + } catch (Exception e) { + status = "error"; + log.error("리로드 실패", e); + } + + if (receive != null && receive.values().stream().anyMatch(value -> value == null || !"success".equals(value))) { + status = "error"; + } + + result.put("status", status); + if(receive != null) result.put("message", receive.toString()); + + return result; } public Map reloadSync(AdapterGroupUI adapterGroupUI) throws Exception { From ac8c018ad0e1c65400eaaacfb70859ecf9109740 Mon Sep 17 00:00:00 2001 From: Rinjae Date: Fri, 30 Jan 2026 11:39:32 +0900 Subject: [PATCH 07/12] =?UTF-8?q?OBP=20API=20=EB=AA=A9=EB=A1=9D=EC=A1=B0?= =?UTF-8?q?=ED=9A=8C=20API=20=EA=B5=AC=EC=A1=B0=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../eai/rms/onl/apim/obp/ObpApiDTO.java | 59 ++++++++++++++++-- .../eai/rms/onl/apim/obp/ObpApiService.java | 61 ++++++++++++++++++- 2 files changed, 112 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/eactive/eai/rms/onl/apim/obp/ObpApiDTO.java b/src/main/java/com/eactive/eai/rms/onl/apim/obp/ObpApiDTO.java index e978927..6a23e3f 100644 --- a/src/main/java/com/eactive/eai/rms/onl/apim/obp/ObpApiDTO.java +++ b/src/main/java/com/eactive/eai/rms/onl/apim/obp/ObpApiDTO.java @@ -12,10 +12,15 @@ import lombok.Getter; @Builder public class ObpApiDTO { + /** + * 고정 ID (항상 0) + */ + private final int id; + /** * API ID (TSEAIHE01.EAISVCNAME) */ - private final String id; + private final String apiId; /** * API 이름 (TSEAIHE01.EAISVCDESC) @@ -28,9 +33,9 @@ public class ObpApiDTO { private final boolean enabled; /** - * API URL (TSEAIHS04.APIFULLPATH에서 '|' 이후 부분) + * API URL 패턴 (TSEAIHS04.APIFULLPATH에서 '|' 이후 부분) */ - private final String url; + private final String urlPattern; /** * HTTP Method (TSEAIHS04.APIFULLPATH에서 '|' 이전 부분) @@ -38,7 +43,51 @@ public class ObpApiDTO { private final String method; /** - * 인증 타입 (TSEAIHE01.AUTHTYPE) + * 요구되는 인증 정보 */ - private final String authType; + private final RequiredAuthentication requiredAuthentication; + + /** + * API 상태 정보 + */ + private final Status status; + + /** + * 요구되는 인증 정보 DTO + */ + @Getter + @Builder + public static class RequiredAuthentication { + /** + * 인증 타입 코드 (API_KEY, OAUTH2, NONE) + */ + private final String key; + + /** + * 인증 타입 표시명 + */ + private final String name; + } + + /** + * API 상태 정보 DTO + */ + @Getter + @Builder + public static class Status { + /** + * 상태 코드 (RUNNING, SUSPEND) + */ + private final String key; + + /** + * 상태 표시명 + */ + private final String name; + + /** + * 배포 여부 (enabled와 동일) + */ + private final boolean deployed; + } } diff --git a/src/main/java/com/eactive/eai/rms/onl/apim/obp/ObpApiService.java b/src/main/java/com/eactive/eai/rms/onl/apim/obp/ObpApiService.java index e896067..e1e1069 100644 --- a/src/main/java/com/eactive/eai/rms/onl/apim/obp/ObpApiService.java +++ b/src/main/java/com/eactive/eai/rms/onl/apim/obp/ObpApiService.java @@ -95,16 +95,71 @@ public class ObpApiService { // USEYN이 "1"이면 enabled = true boolean enabled = "1".equals(useyn); + // RequiredAuthentication 매핑 + ObpApiDTO.RequiredAuthentication reqAuth = mapAuthType(authtype); + + // Status 매핑 + ObpApiDTO.Status status = mapStatus(enabled); + return ObpApiDTO.builder() - .id(eaisvcname) + .id(0) + .apiId(eaisvcname) .name(eaisvcdesc) .enabled(enabled) - .url(url) + .urlPattern(url) .method(method) - .authType(authtype) + .requiredAuthentication(reqAuth) + .status(status) .build(); } + /** + * 인증 타입을 RequiredAuthentication으로 매핑 + * + * @param authtype TSEAIHE01.AUTHTYPE 값 + * @return RequiredAuthentication 객체 + */ + private ObpApiDTO.RequiredAuthentication mapAuthType(String authtype) { + if ("api_key".equalsIgnoreCase(authtype)) { + return ObpApiDTO.RequiredAuthentication.builder() + .key("API_KEY") + .name("APP키를 이용한 인증") + .build(); + } else if ("oauth".equalsIgnoreCase(authtype) || "ca".equalsIgnoreCase(authtype)) { + return ObpApiDTO.RequiredAuthentication.builder() + .key("OAUTH2") + .name("OAuth Ver.2 인증") + .build(); + } else { + return ObpApiDTO.RequiredAuthentication.builder() + .key("NONE") + .name("인증없이 사용") + .build(); + } + } + + /** + * enabled 값을 Status로 매핑 + * + * @param enabled 활성화 여부 + * @return Status 객체 + */ + private ObpApiDTO.Status mapStatus(boolean enabled) { + if (enabled) { + return ObpApiDTO.Status.builder() + .key("RUNNING") + .name("서비스 중") + .deployed(true) + .build(); + } else { + return ObpApiDTO.Status.builder() + .key("SUSPEND") + .name("서비스 일시 중지") + .deployed(false) + .build(); + } + } + /** * 기관코드에 해당하는 법인이 이용하는 API 목록 조회 * From 17451eaabc219415f820433139149d7e608e2976 Mon Sep 17 00:00:00 2001 From: Rinjae Date: Fri, 30 Jan 2026 15:03:37 +0900 Subject: [PATCH 08/12] get /api/transaction/log --- .../ext/kjb/web/ApiTransactionLogController.java | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/eactive/ext/kjb/web/ApiTransactionLogController.java b/src/main/java/com/eactive/ext/kjb/web/ApiTransactionLogController.java index 431ac88..977838e 100644 --- a/src/main/java/com/eactive/ext/kjb/web/ApiTransactionLogController.java +++ b/src/main/java/com/eactive/ext/kjb/web/ApiTransactionLogController.java @@ -10,11 +10,11 @@ import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; import lombok.Data; import lombok.RequiredArgsConstructor; -import lombok.extern.java.Log; import lombok.extern.slf4j.Slf4j; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Controller; import org.springframework.util.StringUtils; +import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; @@ -33,9 +33,17 @@ public class ApiTransactionLogController extends BaseRestController { private final EAILogService eaiLogService; private final ObjectMapper objectMapper = new ObjectMapper(); + + @GetMapping("/transaction/log") + public ResponseEntity getApiLog(String txDate, String apiServiceNumber) { + return getApiLog(new LogRequestBody() {{ + setTxDate(txDate); + setApiServiceNumber(apiServiceNumber); + }}); + } + // 이중 매핑 문제를 해결하기 위해 (예: /api/transaction/log.do 와 /transaction/log.do) '.do' 확장자를 제거함. // 이제 이 엔드포인트는 /api/transaction/log 를 통해서만 접근 가능하며, API 컨벤션에 맞춰 단일하고 명확한 접근 지점을 보장함. -// @GetMapping("/transaction/log") @PostMapping("/transaction/log") public ResponseEntity getApiLog(@RequestBody LogRequestBody requestBody) { DataSourceContextHolder.setDataSourceType(DataSourceTypeManager.getDataSourceType(DataSourceTypeManager.APIGW)); From ea2cd7fd36fa270ff06be6db45a46ba77771cf85 Mon Sep 17 00:00:00 2001 From: Rinjae Date: Fri, 30 Jan 2026 16:57:51 +0900 Subject: [PATCH 09/12] =?UTF-8?q?ControlManController=20API=20=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../control/control/ControlApiController.java | 37 +++++++++++++++++++ .../control/control/ControlManController.java | 4 +- 2 files changed, 39 insertions(+), 2 deletions(-) create mode 100644 src/main/java/com/eactive/eai/rms/onl/manage/control/control/ControlApiController.java diff --git a/src/main/java/com/eactive/eai/rms/onl/manage/control/control/ControlApiController.java b/src/main/java/com/eactive/eai/rms/onl/manage/control/control/ControlApiController.java new file mode 100644 index 0000000..b00ed9c --- /dev/null +++ b/src/main/java/com/eactive/eai/rms/onl/manage/control/control/ControlApiController.java @@ -0,0 +1,37 @@ +package com.eactive.eai.rms.onl.manage.control.control; + +import com.eactive.eai.rms.onl.apim.common.BaseRestController; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.servlet.ModelAndView; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + + +@Controller +public class ControlApiController extends BaseRestController { + ControlManController controlManController; + + + public ControlManController getControlManController() { + return controlManController; + } + + @RequestMapping(value = "/onl/admin/control/controlMan.json", params = "cmd=LIST") + public ModelAndView selectList(HttpServletRequest request, ControlManUISearch uiSearch) { + return controlManController.selectList(request, uiSearch); + } + + @RequestMapping(value = "/onl/admin/control/controlMan.json", params = "cmd=INSERT") + private String insert(HttpServletRequest request, HttpServletResponse response, ControlManUIDetail uiDetail) + throws Exception { + return controlManController.insert(request, response, uiDetail); + } + + @RequestMapping(value = "/onl/admin/control/controlMan.json", params = "cmd=DELETE") + public String delete(HttpServletRequest request, HttpServletResponse response, ControlManUIDetail uiDetail) + throws Exception { + return controlManController.delete(request, response, uiDetail); + } +} diff --git a/src/main/java/com/eactive/eai/rms/onl/manage/control/control/ControlManController.java b/src/main/java/com/eactive/eai/rms/onl/manage/control/control/ControlManController.java index 94f5cb3..10a95ef 100644 --- a/src/main/java/com/eactive/eai/rms/onl/manage/control/control/ControlManController.java +++ b/src/main/java/com/eactive/eai/rms/onl/manage/control/control/ControlManController.java @@ -22,7 +22,7 @@ import com.eactive.eai.rms.common.login.SessionManager; import com.google.gson.Gson; @Controller -public class ControlManController extends OnlBaseAnnotationController implements InterceptorSkipController { +public class ControlManController extends OnlBaseAnnotationController { private static final String RELOAD_RESTRICT_INFO_COMMAND = "com.eactive.eai.agent.restrict.ReloadRestrictInfoCommand"; private static final String ERROR_RESULT_STATUS = "에러"; @@ -50,7 +50,7 @@ public class ControlManController extends OnlBaseAnnotationController implement // 통제 등록 @RequestMapping(value = "/onl/admin/control/controlMan.json", params = "cmd=INSERT") - private String insert(HttpServletRequest request, HttpServletResponse response, ControlManUIDetail uiDetail) + public String insert(HttpServletRequest request, HttpServletResponse response, ControlManUIDetail uiDetail) throws Exception { String userId = SessionManager.getUserId(request); service.insert(uiDetail, userId); From 2465ff8464325b8fa4ec58691189e835e2278acc Mon Sep 17 00:00:00 2001 From: Rinjae Date: Fri, 30 Jan 2026 16:57:51 +0900 Subject: [PATCH 10/12] =?UTF-8?q?ControlManController=20API=20=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../control/control/ControlApiController.java | 38 +++++++++++++++++++ .../control/control/ControlManController.java | 4 +- 2 files changed, 40 insertions(+), 2 deletions(-) create mode 100644 src/main/java/com/eactive/eai/rms/onl/manage/control/control/ControlApiController.java diff --git a/src/main/java/com/eactive/eai/rms/onl/manage/control/control/ControlApiController.java b/src/main/java/com/eactive/eai/rms/onl/manage/control/control/ControlApiController.java new file mode 100644 index 0000000..d562beb --- /dev/null +++ b/src/main/java/com/eactive/eai/rms/onl/manage/control/control/ControlApiController.java @@ -0,0 +1,38 @@ +package com.eactive.eai.rms.onl.manage.control.control; + +import com.eactive.eai.rms.onl.apim.common.BaseRestController; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.servlet.ModelAndView; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + + +@Controller +public class ControlApiController extends BaseRestController { + ControlManController controlManController; + + + public ControlApiController(ControlManController controlManController) { + this.controlManController = controlManController; + } + + + @RequestMapping(value = "/onl/admin/control/controlMan.json", params = "cmd=LIST") + public ModelAndView selectList(HttpServletRequest request, ControlManUISearch uiSearch) { + return controlManController.selectList(request, uiSearch); + } + + @RequestMapping(value = "/onl/admin/control/controlMan.json", params = "cmd=INSERT") + private String insert(HttpServletRequest request, HttpServletResponse response, ControlManUIDetail uiDetail) + throws Exception { + return controlManController.insert(request, response, uiDetail); + } + + @RequestMapping(value = "/onl/admin/control/controlMan.json", params = "cmd=DELETE") + public String delete(HttpServletRequest request, HttpServletResponse response, ControlManUIDetail uiDetail) + throws Exception { + return controlManController.delete(request, response, uiDetail); + } +} diff --git a/src/main/java/com/eactive/eai/rms/onl/manage/control/control/ControlManController.java b/src/main/java/com/eactive/eai/rms/onl/manage/control/control/ControlManController.java index 94f5cb3..10a95ef 100644 --- a/src/main/java/com/eactive/eai/rms/onl/manage/control/control/ControlManController.java +++ b/src/main/java/com/eactive/eai/rms/onl/manage/control/control/ControlManController.java @@ -22,7 +22,7 @@ import com.eactive.eai.rms.common.login.SessionManager; import com.google.gson.Gson; @Controller -public class ControlManController extends OnlBaseAnnotationController implements InterceptorSkipController { +public class ControlManController extends OnlBaseAnnotationController { private static final String RELOAD_RESTRICT_INFO_COMMAND = "com.eactive.eai.agent.restrict.ReloadRestrictInfoCommand"; private static final String ERROR_RESULT_STATUS = "에러"; @@ -50,7 +50,7 @@ public class ControlManController extends OnlBaseAnnotationController implement // 통제 등록 @RequestMapping(value = "/onl/admin/control/controlMan.json", params = "cmd=INSERT") - private String insert(HttpServletRequest request, HttpServletResponse response, ControlManUIDetail uiDetail) + public String insert(HttpServletRequest request, HttpServletResponse response, ControlManUIDetail uiDetail) throws Exception { String userId = SessionManager.getUserId(request); service.insert(uiDetail, userId); From 1092c86163c37b7a30d5d4563312a1042a0cd5eb Mon Sep 17 00:00:00 2001 From: Rinjae Date: Fri, 30 Jan 2026 17:00:45 +0900 Subject: [PATCH 11/12] =?UTF-8?q?ControlManController=20API=20=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../eai/rms/onl/manage/control/control/ControlApiController.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/com/eactive/eai/rms/onl/manage/control/control/ControlApiController.java b/src/main/java/com/eactive/eai/rms/onl/manage/control/control/ControlApiController.java index 6f4925f..d562beb 100644 --- a/src/main/java/com/eactive/eai/rms/onl/manage/control/control/ControlApiController.java +++ b/src/main/java/com/eactive/eai/rms/onl/manage/control/control/ControlApiController.java @@ -18,6 +18,7 @@ public class ControlApiController extends BaseRestController { this.controlManController = controlManController; } + @RequestMapping(value = "/onl/admin/control/controlMan.json", params = "cmd=LIST") public ModelAndView selectList(HttpServletRequest request, ControlManUISearch uiSearch) { return controlManController.selectList(request, uiSearch); From cd3e0f1dba1ebcc7ce2bc049ef9ea8bd6e6ba48b Mon Sep 17 00:00:00 2001 From: Rinjae Date: Fri, 30 Jan 2026 17:46:09 +0900 Subject: [PATCH 12/12] =?UTF-8?q?OBP=20=EC=97=B0=EB=8F=99=20API=20?= =?UTF-8?q?=EA=B0=9C=EC=84=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- http/obp.http | 7 ++++- .../eai/rms/onl/apim/obp/ObpApiDTO.java | 4 +-- .../eai/rms/onl/apim/obp/ObpApiService.java | 2 +- .../rms/onl/apim/obp/ObpGwMetricAfterDTO.java | 30 +++++++++++++++++++ .../control/control/ControlApiController.java | 6 ++-- 5 files changed, 42 insertions(+), 7 deletions(-) diff --git a/http/obp.http b/http/obp.http index 0b3e6fe..31c5dbc 100644 --- a/http/obp.http +++ b/http/obp.http @@ -17,7 +17,7 @@ GET {{emsUrl}}/api/apis/KJB GET {{emsUrl}}/api/apis/000002-02/KJB -### 트랜잭션 로그 조회 +### 트랜잭션 로그 조회 - POST POST {{emsUrl}}/api/transaction/log Content-Type: application/json; application/json; charset=UTF-8 @@ -27,3 +27,8 @@ Content-Type: application/json; application/json; charset=UTF-8 } + +### 트랜잭션 로그 조회 - GET +GET {{emsUrl}}/api/transaction/log?apiServiceNumber=asdasd&txDate=asdasdasd + + diff --git a/src/main/java/com/eactive/eai/rms/onl/apim/obp/ObpApiDTO.java b/src/main/java/com/eactive/eai/rms/onl/apim/obp/ObpApiDTO.java index 6a23e3f..e76bc19 100644 --- a/src/main/java/com/eactive/eai/rms/onl/apim/obp/ObpApiDTO.java +++ b/src/main/java/com/eactive/eai/rms/onl/apim/obp/ObpApiDTO.java @@ -13,9 +13,9 @@ import lombok.Getter; public class ObpApiDTO { /** - * 고정 ID (항상 0) + * 고정 ID (항상 null) */ - private final int id; + private final Integer id; /** * API ID (TSEAIHE01.EAISVCNAME) diff --git a/src/main/java/com/eactive/eai/rms/onl/apim/obp/ObpApiService.java b/src/main/java/com/eactive/eai/rms/onl/apim/obp/ObpApiService.java index e1e1069..83ed71e 100644 --- a/src/main/java/com/eactive/eai/rms/onl/apim/obp/ObpApiService.java +++ b/src/main/java/com/eactive/eai/rms/onl/apim/obp/ObpApiService.java @@ -102,7 +102,7 @@ public class ObpApiService { ObpApiDTO.Status status = mapStatus(enabled); return ObpApiDTO.builder() - .id(0) + .id(null) .apiId(eaisvcname) .name(eaisvcdesc) .enabled(enabled) diff --git a/src/main/java/com/eactive/eai/rms/onl/apim/obp/ObpGwMetricAfterDTO.java b/src/main/java/com/eactive/eai/rms/onl/apim/obp/ObpGwMetricAfterDTO.java index c7c2626..af7feb1 100644 --- a/src/main/java/com/eactive/eai/rms/onl/apim/obp/ObpGwMetricAfterDTO.java +++ b/src/main/java/com/eactive/eai/rms/onl/apim/obp/ObpGwMetricAfterDTO.java @@ -70,6 +70,36 @@ public class ObpGwMetricAfterDTO { @SerializedName("completedCount") private Long completedCount; + + // AS-IS 호환을 위한 필드 (null 값으로 리턴) + @SerializedName("clusterHostname") + private String clusterHostname = null; + + @SerializedName("apiDatabaseId") + private Integer apiDatabaseId = null; + + @SerializedName("unauthorizedCount") + private Integer authorizedCount = null; + + @SerializedName("backMinTime") + private Integer backMinTime = null; + + @SerializedName("backMaxTime") + private Integer backMaxTime = null; + + @SerializedName("backSumTime") + private Integer backSumTime = null; + + @SerializedName("frontMinTime") + private Integer frontMinTime = null; + + @SerializedName("frontMaxTime") + private Integer frontMaxTime = null; + + @SerializedName("frontSumTime") + private Integer frontSumTime = null; + + /** * Entity → DTO 변환 */ diff --git a/src/main/java/com/eactive/eai/rms/onl/manage/control/control/ControlApiController.java b/src/main/java/com/eactive/eai/rms/onl/manage/control/control/ControlApiController.java index d562beb..5355e18 100644 --- a/src/main/java/com/eactive/eai/rms/onl/manage/control/control/ControlApiController.java +++ b/src/main/java/com/eactive/eai/rms/onl/manage/control/control/ControlApiController.java @@ -19,18 +19,18 @@ public class ControlApiController extends BaseRestController { } - @RequestMapping(value = "/onl/admin/control/controlMan.json", params = "cmd=LIST") + @RequestMapping(value = "/control/controlMan.json", params = "cmd=LIST") public ModelAndView selectList(HttpServletRequest request, ControlManUISearch uiSearch) { return controlManController.selectList(request, uiSearch); } - @RequestMapping(value = "/onl/admin/control/controlMan.json", params = "cmd=INSERT") + @RequestMapping(value = "/control/controlMan.json", params = "cmd=INSERT") private String insert(HttpServletRequest request, HttpServletResponse response, ControlManUIDetail uiDetail) throws Exception { return controlManController.insert(request, response, uiDetail); } - @RequestMapping(value = "/onl/admin/control/controlMan.json", params = "cmd=DELETE") + @RequestMapping(value = "/control/controlMan.json", params = "cmd=DELETE") public String delete(HttpServletRequest request, HttpServletResponse response, ControlManUIDetail uiDetail) throws Exception { return controlManController.delete(request, response, uiDetail);