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"/> --%> 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); }, diff --git a/WebContent/jsp/onl/kjb/statistics/apiStatsDayMan.jsp b/WebContent/jsp/onl/kjb/statistics/apiStatsDayMan.jsp index ee499a4..fafa922 100644 --- a/WebContent/jsp/onl/kjb/statistics/apiStatsDayMan.jsp +++ b/WebContent/jsp/onl/kjb/statistics/apiStatsDayMan.jsp @@ -575,14 +575,31 @@ $("input[name=searchStartDateTime]").inputmask("9999-99-99", { 'autoUnmask': true }); $("input[name=searchEndDateTime]").inputmask("9999-99-99", { 'autoUnmask': true }); - // 기본값 설정 (이번달 1일 ~ 오늘) + // 기본값 설정 (어제 기준 해당 월 1일 ~ 어제) var today = getToday(); + var todayStr = today.replace(/-/g, ''); + + // 오늘 날짜를 Date 객체로 변환 + var year = parseInt(todayStr.substring(0, 4)); + var month = parseInt(todayStr.substring(4, 6)); + var day = parseInt(todayStr.substring(6, 8)); + var todayDate = new Date(year, month - 1, day); + + // 어제 날짜 계산 + todayDate.setDate(todayDate.getDate() - 1); + var yesterday = todayDate.getFullYear() + '-' + + ('0' + (todayDate.getMonth() + 1)).slice(-2) + '-' + + ('0' + todayDate.getDate()).slice(-2); + + // 어제가 속한 달의 1일 계산 + var firstDayOfMonth = todayDate.getFullYear() + '-' + + ('0' + (todayDate.getMonth() + 1)).slice(-2) + '-01'; + if (!$("input[name=searchStartDateTime]").val()) { - var firstDay = today.substring(0, 8) + "01"; - $("input[name=searchStartDateTime]").val(firstDay.substring(0, 4) + '-' + firstDay.substring(4, 6) + '-' + firstDay.substring(6, 8)); + $("input[name=searchStartDateTime]").val(firstDayOfMonth); } if (!$("input[name=searchEndDateTime]").val()) { - $("input[name=searchEndDateTime]").val(today); + $("input[name=searchEndDateTime]").val(yesterday); } initCharts(); 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/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 75c4f22..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 @@ -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,133 @@ 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 함. + 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); + + } 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); + } + + } + } + + } public void delete(AdapterGroupUI adapterGroupUI) { adapterGroupService.deleteById(adapterGroupUI.getAdptrbzwkgroupname()); @@ -407,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<>(); @@ -419,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 { diff --git a/src/main/java/com/eactive/eai/rms/onl/manage/rule/layoutsync/LayoutSyncController.java b/src/main/java/com/eactive/eai/rms/onl/manage/rule/layoutsync/LayoutSyncController.java index 0a74a02..fc28118 100644 --- a/src/main/java/com/eactive/eai/rms/onl/manage/rule/layoutsync/LayoutSyncController.java +++ b/src/main/java/com/eactive/eai/rms/onl/manage/rule/layoutsync/LayoutSyncController.java @@ -2,6 +2,7 @@ package com.eactive.eai.rms.onl.manage.rule.layoutsync; import java.io.ByteArrayInputStream; import java.io.File; +import java.io.InputStream; import java.io.Reader; import java.io.StringReader; import java.text.SimpleDateFormat; @@ -212,11 +213,18 @@ public class LayoutSyncController extends OnlBaseAnnotationController implements try { SAXBuilder builder = new SAXBuilder(); - + // 응답 전문 - File res = new File( request.getSession().getServletContext().getRealPath("/WEB-INF/") + "/layout-messagesync-res.xml" ); - rDoc = builder.build(res); - results = rDoc.getRootElement(); + InputStream resStream = request.getSession().getServletContext().getResourceAsStream("/WEB-INF/layout-messagesync-res.xml"); + if (resStream == null) { + throw new Exception("layout-messagesync-res.xml 파일을 찾을 수 없습니다."); + } + try { + rDoc = builder.build(resStream); + results = rDoc.getRootElement(); + } finally { + resStream.close(); + } // 요청 전문 sis = request.getInputStream();