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 @@
-
[<%= localeMessage.getString("socketStat.fileDown") %>]
-
[<%= localeMessage.getString("socketStat.socketMoniPop") %>]
+<%--
[<%= localeMessage.getString("socketStat.fileDown") %>] --%>
+<%--
[<%= localeMessage.getString("socketStat.socketMoniPop") %>] --%>
<%--

" 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();