932 lines
27 KiB
Java
932 lines
27 KiB
Java
package kr.gmtc.filter.controller;
|
|
|
|
import java.io.File;
|
|
import java.io.UnsupportedEncodingException;
|
|
import java.net.InetAddress;
|
|
import java.net.UnknownHostException;
|
|
import java.time.LocalDateTime;
|
|
import java.time.format.DateTimeFormatter;
|
|
import java.util.ArrayList;
|
|
import java.util.List;
|
|
import java.util.concurrent.ConcurrentHashMap;
|
|
|
|
import javax.annotation.Resource;
|
|
import javax.xml.parsers.DocumentBuilder;
|
|
import javax.xml.parsers.DocumentBuilderFactory;
|
|
|
|
import org.json.simple.JSONArray;
|
|
import org.json.simple.JSONObject;
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
import org.springframework.beans.factory.annotation.Value;
|
|
import org.springframework.stereotype.Component;
|
|
import org.springframework.web.bind.annotation.GetMapping;
|
|
import org.w3c.dom.Document;
|
|
import org.w3c.dom.Element;
|
|
import org.w3c.dom.Node;
|
|
import org.w3c.dom.NodeList;
|
|
|
|
import gmt.common.type.LogLevelType;
|
|
import gmt.common.util.GmtUtils;
|
|
import gmt.common.vo.MonitorInfoVO;
|
|
import gmt.common.vo.MsgObjVO;
|
|
import gmt.common.vo.SystemInfoVO;
|
|
import gmt.controller.GmtController;
|
|
import gmt.io.client.event.GmtClientEventListener;
|
|
import gmt.io.client.vo.ClientInfoVO;
|
|
import gmt.io.server.event.GmtServerEventListener;
|
|
import gmt.io.server.vo.ServerInfoVO;
|
|
import gmt.io.server.vo.ServiceClientVO;
|
|
import gmt.logger.GmtLogManager;
|
|
import gmt.logger.event.IGmtLogSendHandler;
|
|
import gmt.proj.gw_filter.analysis.TargetAnalysis;
|
|
import gmt.proj.gw_filter.analysis.point.PointInPolygon.Point;
|
|
import gmt.proj.gw_filter.rest.vo.InOutVO;
|
|
import gmt.proj.gw_filter.thread.ThreadManager;
|
|
import gmt.proj.gw_filter.vo.OptionVO;
|
|
import gmt.status.GmtSTAManager;
|
|
import gmt.status.event.IGmtHeartBeatHandler;
|
|
import gmt.status.event.IGmtServicesStatusHandler;
|
|
import gmt.status.event.IGmtSysStatusHandler;
|
|
import kr.gmtc.filter.controller.vo.AreaVO;
|
|
import kr.gmtc.filter.fso.GeofenceFilter;
|
|
import kr.gmtc.filter.rest.RestManager;
|
|
import kr.gmtc.filter.scheduler.vo.CountVO;
|
|
import kr.gmtc.filter.scheduler.vo.ResourceVO;
|
|
|
|
@Component("controller")
|
|
public class MainController extends GmtController{
|
|
private String startTime;
|
|
private String delimiter;
|
|
private SystemInfoVO systemInfo;
|
|
private GmtSTAManager statusManager;
|
|
private IGmtSysStatusHandler statusHandler;
|
|
private IGmtHeartBeatHandler gmsHandler;
|
|
private IGmtServicesStatusHandler serviceHandler;
|
|
private IGmtLogSendHandler logHandler;
|
|
private TargetAnalysis targetAnalysis = new TargetAnalysis();
|
|
private ThreadManager thrManager = new ThreadManager();
|
|
|
|
private boolean isRunning;
|
|
private Thread SendPakcetThread;
|
|
|
|
@Resource(name = "rvo")
|
|
ResourceVO rvo;
|
|
@Resource(name = "countVO")
|
|
CountVO countVO;
|
|
|
|
@Autowired
|
|
private RestManager restManager;
|
|
|
|
@Autowired
|
|
private GeofenceFilter geofenceFilter;
|
|
|
|
private String rootPath = "";
|
|
|
|
@Value("${dmfhf.port}")
|
|
private int dmfhfPort;
|
|
|
|
@Value("${fso.port}")
|
|
private int fsoPort;
|
|
|
|
@Value("${fso.relay.port}")
|
|
private int fsoRelayPort;
|
|
|
|
@Value("${tgw.ip}")
|
|
private String tgwIp;
|
|
|
|
@Value("${tgw.serverPort}")
|
|
private int tgwPort;
|
|
|
|
private LocalDateTime sosSendDT = LocalDateTime.now();
|
|
private LocalDateTime posSendDT = LocalDateTime.now();
|
|
|
|
public List<AreaVO> AreaList = new ArrayList<AreaVO>();
|
|
|
|
private List<String> TGWConnectList = new ArrayList<String>();
|
|
|
|
public List<MsgObjVO> FsoRelayList = new ArrayList<MsgObjVO>();
|
|
public List<MsgObjVO> DmfhfList = new ArrayList<MsgObjVO>();
|
|
public List<MsgObjVO> FSOList = new ArrayList<MsgObjVO>();
|
|
|
|
protected MainController(@Value("${root}") String path) {
|
|
super(path);
|
|
GmtLogManager.setpath(path);
|
|
startTime = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
|
|
delimiter = ",";
|
|
systemInfo = new SystemInfoVO();
|
|
|
|
rootPath = path;
|
|
logger = GmtLogManager.getInstance();
|
|
logger.writeLevelLog("[GmtLogManager] PATH : " + path, LogLevelType.LOG_INFO, "AllLog");
|
|
|
|
logHandler = new IGmtLogSendHandler() {
|
|
@Override
|
|
public void sendlLog(String msg, String name, LogLevelType loglevel) {
|
|
sendLog(msg, name, loglevel);
|
|
}
|
|
};
|
|
|
|
logger.setLogSendHandler(logHandler);
|
|
|
|
statusHandler = new IGmtSysStatusHandler() {
|
|
@Override
|
|
public void sendStatus() {
|
|
String systemMsg = getSystemStatus();
|
|
rvo.setSystem(systemMsg);
|
|
sendSTA(systemMsg);
|
|
// logger.writeLevelLog("[SEND STATUS] " + systemMsg, LogLevelType.LOG_INFO, "FileLog", false);
|
|
|
|
String clientMsg = getClientStatus();
|
|
rvo.setClient(clientMsg);
|
|
|
|
sendSTA(clientMsg);
|
|
// logger.writeLevelLog("[SEND STATUS] " + clientMsg, LogLevelType.LOG_INFO, "FileLog", false);
|
|
|
|
String serverMsg = getServerStatus();
|
|
rvo.setServer(serverMsg);
|
|
sendSTA(serverMsg);
|
|
// logger.writeLevelLog("[SEND STATUS] " + serverMsg, LogLevelType.LOG_INFO, "FileLog", false);
|
|
|
|
if(!systemInfo.getStatSend()) {
|
|
return;
|
|
}
|
|
}
|
|
};
|
|
|
|
statusManager = new GmtSTAManager(statusHandler, gmsHandler, serviceHandler);
|
|
|
|
initSystemFromXml(path);
|
|
initAreaFromXml(path);
|
|
|
|
SendPakcetThread = new Thread(new Runnable() {
|
|
@Override
|
|
public void run() {
|
|
while (isRunning) {
|
|
try {
|
|
SendFsoRelayPacket();
|
|
SendFsoPacket();
|
|
SendDmfhfPacket();
|
|
} finally {
|
|
try {
|
|
Thread.sleep(1000);
|
|
} catch (InterruptedException e) {
|
|
// TODO Auto-generated catch block
|
|
e.printStackTrace();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
});
|
|
}
|
|
|
|
public void start() {
|
|
super.start();
|
|
thrManager.optionThread(rootPath);
|
|
thrManager.xmlThread(rootPath);
|
|
thrManager.start();
|
|
statusManager.start();
|
|
restManager.start();
|
|
|
|
isRunning = true;
|
|
SendPakcetThread.start();
|
|
}
|
|
|
|
private void SendFsoRelayPacket() {
|
|
try {
|
|
List<MsgObjVO> tempList = new ArrayList<MsgObjVO>();
|
|
|
|
tempList.addAll(FsoRelayList);
|
|
FsoRelayList.clear();
|
|
|
|
for (int i=0;i<tempList.size();i++) {
|
|
broadcastServer(fsoRelayPort, tempList.get(i));
|
|
}
|
|
} catch (Exception e) {
|
|
logger.writeLevelLog("[SendFsoRelayPacket] " + e.getMessage(), LogLevelType.LOG_ERROR, "AllLog", false);
|
|
}
|
|
}
|
|
|
|
private void SendFsoPacket() {
|
|
try {
|
|
List<MsgObjVO> tempList = new ArrayList<MsgObjVO>();
|
|
|
|
tempList.addAll(FSOList);
|
|
FSOList.clear();
|
|
|
|
for (int i=0;i<tempList.size();i++) {
|
|
broadcastServer(fsoPort, tempList.get(i));
|
|
}
|
|
} catch (Exception e) {
|
|
logger.writeLevelLog("[SendFsoPacket] " + e.getMessage(), LogLevelType.LOG_ERROR, "AllLog", false);
|
|
}
|
|
}
|
|
|
|
private void SendDmfhfPacket() {
|
|
try {
|
|
List<MsgObjVO> tempList = new ArrayList<MsgObjVO>();
|
|
|
|
tempList.addAll(DmfhfList);
|
|
DmfhfList.clear();
|
|
|
|
for (int i=0;i<tempList.size();i++) {
|
|
broadcastServer(dmfhfPort, tempList.get(i));
|
|
}
|
|
} catch (Exception e) {
|
|
logger.writeLevelLog("[SendDmfhfPacket] " + e.getMessage(), LogLevelType.LOG_ERROR, "AllLog", false);
|
|
}
|
|
}
|
|
|
|
@Override
|
|
protected void clientDataIn(MsgObjVO vo) {
|
|
|
|
int count = 0;
|
|
|
|
MsgObjVO encVO = vo.getClone();
|
|
String msgs = new String(vo.getMsg());
|
|
|
|
if(msgs.substring(0,3).equals("$92") && (encVO.getRecvPort() == 8031)) { //DMFHF
|
|
logger.writeLevelLog(msgs, LogLevelType.LOG_INFO, "PacketLog", false);
|
|
|
|
if ( (restManager.getShipVO_SlotNO(msgs.substring(4,16).trim()) == null) ) {
|
|
logger.writeLevelLog("[clientDataIn] 존재하지 않는 SLOT : " + msgs, LogLevelType.LOG_INFO, "PacketLog_Filter", false);
|
|
return;
|
|
}
|
|
|
|
//SOS bypass
|
|
if (msgs.substring(3,4).equals("4")) {
|
|
logger.writeLevelLog("[Send SOS] " + msgs, LogLevelType.LOG_INFO, "SendLog", false);
|
|
//연계상태 갱신
|
|
if (TGWConnectList.size() > 0) {
|
|
sosSendDT = LocalDateTime.now();
|
|
}
|
|
|
|
//D-MFHF -> FSO 연계
|
|
broadcastServer(fsoRelayPort, encVO);
|
|
FsoRelayList.add(encVO);
|
|
|
|
} else if (msgs.substring(3,4).equals("5")) {
|
|
//D-MFHF -> FSO 연계
|
|
count = countVO.getFso();
|
|
countVO.setFso(++count);
|
|
|
|
logger.writeLevelLog("[Send Packet (D-MFHF -> FSO)] " + msgs, LogLevelType.LOG_INFO, "SendLog", false);
|
|
|
|
// broadcastServer(fsoRelayPort, encVO);
|
|
FsoRelayList.add(encVO);
|
|
|
|
//연계상태 갱신
|
|
if (TGWConnectList.size() > 0) {
|
|
posSendDT = LocalDateTime.now();
|
|
}
|
|
|
|
OptionVO option = thrManager.getOptions();
|
|
|
|
if (option == null) {
|
|
logger.writeLevelLog("[Send Packet] Area is null" + msgs, LogLevelType.LOG_INFO, "AllLog", false);
|
|
return;
|
|
}
|
|
|
|
if(!targetAnalysis.AreaAnalysis(msgs, option.getArea())) {
|
|
MsgObjVO mvo = encVO.getClone();
|
|
|
|
byte[] header = "!1".getBytes();
|
|
count = countVO.getFilter1();
|
|
countVO.setFilter1(++count);
|
|
|
|
mvo.setMsg(addArray(header, encVO.getMsg()));
|
|
|
|
logger.writeLevelLog("[Send Packet] 위경도 입력범위 초과 : " + msgs, LogLevelType.LOG_INFO, "SendLog", false);
|
|
|
|
DmfhfList.add(mvo);
|
|
// broadcastServer(dmfhfPort, encVO);
|
|
} else {
|
|
ConcurrentHashMap<String, List<Point>> districtMap = restManager.getDistrictList();
|
|
|
|
if (districtMap == null) {
|
|
logger.writeLevelLog("[Send Packet] DistrictMap is null" + msgs, LogLevelType.LOG_INFO, "AllLog", false);
|
|
return;
|
|
}
|
|
|
|
if(!targetAnalysis.DistrictAnalysis(msgs, districtMap)) {
|
|
MsgObjVO mvo = encVO.getClone();
|
|
|
|
byte[] header = "!2".getBytes();
|
|
count = countVO.getFilter2();
|
|
countVO.setFilter2(++count);
|
|
|
|
mvo.setMsg(addArray(header, encVO.getMsg()));
|
|
|
|
logger.writeLevelLog("[Send Packet] 조업자제구역 : " + msgs, LogLevelType.LOG_INFO, "SendLog", false);
|
|
|
|
DmfhfList.add(mvo);
|
|
// broadcastServer(dmfhfPort, mvo);
|
|
} else {
|
|
String slot = msgs.substring(4, 16);
|
|
InOutVO inout = restManager.getInOutList().get(slot.trim());
|
|
|
|
if (inout == null) {
|
|
logger.writeLevelLog("[Send Packet] InOut is null" + msgs, LogLevelType.LOG_INFO, "AllLog", false);
|
|
return;
|
|
}
|
|
|
|
if(!targetAnalysis.InOutAnalysis(msgs, inout.getInout_part())) {
|
|
MsgObjVO mvo = encVO.getClone();
|
|
|
|
byte[] header = "!3".getBytes();
|
|
count = countVO.getFilter3();
|
|
countVO.setFilter3(++count);
|
|
|
|
mvo.setMsg(addArray(header, encVO.getMsg()));
|
|
logger.writeLevelLog("[Send Packet] 입항상태 : " + msgs, LogLevelType.LOG_INFO, "SendLog", false);
|
|
|
|
DmfhfList.add(mvo);
|
|
// broadcastServer(dmfhfPort, encVO);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
} else if(msgs.substring(0,3).equals("$11")) { //AIS
|
|
if ( (restManager.getShipVO_MMSI(msgs.substring(4,16).trim()) == null) ) {
|
|
return;
|
|
}
|
|
|
|
FSOList.add(encVO);
|
|
// broadcastServer(fsoPort, encVO);
|
|
} else if(msgs.substring(0,3).equals("$90")) { //VPASS
|
|
if ( (restManager.getShipVO_RFID(msgs.substring(4,16).trim()) == null) ) {
|
|
return;
|
|
}
|
|
FSOList.add(encVO);
|
|
// broadcastServer(fsoPort, encVO);
|
|
} else if(msgs.substring(0,3).equals("$19")) { //VHF-DSC
|
|
if ( (restManager.getShipVO_MMSI(msgs.substring(4,16).trim()) == null) ) {
|
|
return;
|
|
}
|
|
FSOList.add(encVO);
|
|
// broadcastServer(fsoPort, encVO);
|
|
} else if(msgs.substring(0,4).equals("$FSO")) { //Geofence 알람
|
|
try {
|
|
if (geofenceFilter.CheckGeofence(msgs) ) {
|
|
FSOList.add(encVO);
|
|
// broadcastServer(fsoPort, encVO);
|
|
}
|
|
} catch (Exception e) {
|
|
logger.writeLevelLog("[Geofence 알람 패킷 분석 실패] " + msgs, LogLevelType.LOG_ERROR, "AllLog", false);
|
|
}
|
|
}
|
|
}
|
|
|
|
private byte[] addArray(byte[] tmp, byte[] tmp2) {
|
|
byte[] resultArray = new byte[tmp.length + tmp2.length];
|
|
|
|
System.arraycopy(tmp, 0, resultArray, 0, tmp.length);
|
|
System.arraycopy(tmp2, 0, resultArray, tmp.length, tmp2.length);
|
|
|
|
return resultArray;
|
|
}
|
|
|
|
@Override
|
|
protected GmtClientEventListener createClientEventListener() {
|
|
GmtClientEventListener listener = new GmtClientEventListener() {
|
|
@Override
|
|
public void readyToSend() {
|
|
|
|
}
|
|
|
|
@Override
|
|
public void error(String ip, int port, int errorCode, String description) {
|
|
|
|
}
|
|
|
|
@Override
|
|
public void disconnected(String ip, int port, int statusCode, String description) {
|
|
String msg = "[Client Disconnect : IP[" + ip + "] / PORT [" + String.valueOf(port) + "] ";
|
|
logger.writeLevelLog(msg, LogLevelType.LOG_INFO, "AllLog");
|
|
}
|
|
|
|
@Override
|
|
public void dataIn() {
|
|
|
|
}
|
|
|
|
@Override
|
|
public void connectionStatus(String ip, int port, String connEvent, int statusCode, String description) {
|
|
|
|
}
|
|
|
|
@Override
|
|
public void connected(String ip, int port, int statusCode, String description) {
|
|
String msg = "[Client Connect : IP[" + ip + "] / PORT [" + String.valueOf(port) + "] ";
|
|
logger.writeLevelLog(msg, LogLevelType.LOG_INFO, "AllLog");
|
|
|
|
}
|
|
|
|
@Override
|
|
public void SSLStatus() {
|
|
|
|
}
|
|
|
|
@Override
|
|
public void SSLServerAuthentication() {
|
|
|
|
}
|
|
};
|
|
return listener;
|
|
}
|
|
|
|
@Override
|
|
protected GmtServerEventListener createServerEventListener() {
|
|
GmtServerEventListener listener = new GmtServerEventListener() {
|
|
@Override
|
|
public void readyToSend(int port) {
|
|
|
|
}
|
|
|
|
@Override
|
|
public void error(int serverPort, String remoteHost, int remotePort, int errorCode, String description) {
|
|
|
|
}
|
|
|
|
@Override
|
|
public void disconnected(int serverPort, String remoteHost, int remotePort) {
|
|
String msg = "[SERVER " + String.valueOf(serverPort) + "] SC Disconnected.. IP : " + remoteHost
|
|
+ " PORT : " + String.valueOf(remotePort);
|
|
logger.writeLevelLog(msg, LogLevelType.LOG_INFO, "AllLog");
|
|
|
|
if ( (serverPort == tgwPort) && remoteHost.equals(tgwIp) ) {
|
|
TGWConnectList.remove(remoteHost);
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void dataIn(int serverPort, String remoteHost, int remotePort, String msg) {
|
|
|
|
}
|
|
|
|
@Override
|
|
public void connected(int serverPort, String remoteHost, int remotePort) {
|
|
String msg = "[SERVER " + String.valueOf(serverPort) + "] SC Connected.. IP : " + remoteHost
|
|
+ " PORT : " + String.valueOf(remotePort);
|
|
logger.writeLevelLog(msg, LogLevelType.LOG_INFO, "AllLog");
|
|
|
|
if ((serverPort == tgwPort) && remoteHost.equals(tgwIp) ) {
|
|
TGWConnectList.add(remoteHost);
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void SSLClientAuthentication(int serverPort) {
|
|
|
|
}
|
|
};
|
|
return listener;
|
|
}
|
|
|
|
@Override
|
|
protected void serialDataIn(MsgObjVO vo) {
|
|
|
|
}
|
|
|
|
@Override
|
|
protected void serverDataIn(MsgObjVO vo) {
|
|
|
|
}
|
|
|
|
private void sendLog(String msg, String name, LogLevelType Loglevel) {
|
|
|
|
LocalDateTime dt = LocalDateTime.now();
|
|
String currentTime = dt.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
|
|
|
|
MsgObjVO vo = new MsgObjVO();
|
|
|
|
switch (Loglevel.ordinal()) {
|
|
case 0:
|
|
msg = "[" + currentTime + "] " + ":" + " TRACE " + ": " + msg;
|
|
break;
|
|
case 1:
|
|
msg = "[" + currentTime + "] " + ":" + " DEBUG " + ": " + msg;
|
|
break;
|
|
case 2:
|
|
msg = "[" + currentTime + "] " + ":" + " INFO " + ": " + msg;
|
|
break;
|
|
case 3:
|
|
msg = "[" + currentTime + "] " + ":" + " WARN " + ": " + msg;
|
|
break;
|
|
case 4:
|
|
msg = "[" + currentTime + "] " + ":" + " ERROR " + ": " + msg;
|
|
break;
|
|
case 5:
|
|
msg = "[" + currentTime + "] " + ":" + " FATAL " + ": " + msg;
|
|
break;
|
|
}
|
|
|
|
try {
|
|
vo.setMsg(msg.getBytes("EUC-KR"));
|
|
} catch (UnsupportedEncodingException e) {
|
|
logger.writeLevelLog(GmtUtils.getStatckTrace(e), LogLevelType.LOG_ERROR, "fileLog");
|
|
e.printStackTrace();
|
|
}
|
|
|
|
|
|
broadcastServer(systemInfo.getLogPort(), vo);
|
|
}
|
|
|
|
@SuppressWarnings("unchecked")
|
|
public String getSystemStatus() {
|
|
JSONObject data = new JSONObject();
|
|
data.put("RecvBuffer", getRcvBuffer());
|
|
data.put("SendBuffer", getSndBuffer());
|
|
data.put("Start", startTime);
|
|
|
|
return makeSTA(0, 1, data);
|
|
}
|
|
|
|
@SuppressWarnings("unchecked")
|
|
public String getClientStatus() {
|
|
JSONArray data = new JSONArray();
|
|
for (int i = 0; i < clientInfoList.size(); i++) {
|
|
ClientInfoVO civo = clientInfoList.get(i);
|
|
MonitorInfoVO cimvo = civo.getMonitorInfo();
|
|
if (!civo.isiSUse()) {
|
|
continue;
|
|
}
|
|
JSONObject jo1 = new JSONObject();
|
|
jo1.put("ID", civo.getId());
|
|
jo1.put("ClientName", civo.getName());
|
|
switch (civo.getActive().getName()) {
|
|
case "PRIMARY":
|
|
jo1.put("Active", 0);
|
|
jo1.put("IP", civo.getIp());
|
|
break;
|
|
|
|
case "SECONDARY":
|
|
jo1.put("Active", 1);
|
|
jo1.put("IP", civo.getsIp());
|
|
break;
|
|
}
|
|
|
|
jo1.put("Port", civo.getPort());
|
|
jo1.put("SendBuffer", cimvo.getSendQCount());
|
|
jo1.put("Connect", cimvo.isConnected());
|
|
data.add(jo1);
|
|
}
|
|
|
|
return makeSTA(0, 4, data);
|
|
}
|
|
|
|
@SuppressWarnings("unchecked")
|
|
public String getServerStatus() {
|
|
|
|
JSONArray data = new JSONArray();
|
|
for (int i = 0; i < serverInfoList.size(); i++) {
|
|
ServerInfoVO sivo = serverInfoList.get(i);
|
|
MonitorInfoVO mvo = sivo.getMonitorInfo();
|
|
|
|
JSONObject jo2 = new JSONObject();
|
|
jo2.put("ID", sivo.getId());
|
|
jo2.put("ServerName", sivo.getName());
|
|
jo2.put("ServerPort", sivo.getPort());
|
|
jo2.put("SCCount", sivo.getServiceClientCount());
|
|
jo2.put("SendBuffer", mvo.getSendQCount());
|
|
jo2.put("Use", sivo.isUseFlag());
|
|
|
|
int sport = sivo.getPort();
|
|
JSONArray ja1 = new JSONArray();
|
|
|
|
if (sivo.getServiceClientCount() != 0) {
|
|
Object[] keys = serverScInfoList.keySet().toArray();
|
|
|
|
for (int j = 0; j < keys.length; j++) {
|
|
ServiceClientVO scvo = serverScInfoList.get(keys[j]);
|
|
MonitorInfoVO mvo2 = scvo.getMonitorInfoVO();
|
|
JSONObject jo1 = new JSONObject();
|
|
|
|
int scport = scvo.getServerPort();
|
|
if (sport == scport) {
|
|
jo1.put("ID", scvo.getId());
|
|
jo1.put("ServiceName", scvo.getName());
|
|
jo1.put("ServiceIP", scvo.getIp());
|
|
jo1.put("ServicePort", scvo.getServicePort());
|
|
jo1.put("SendBuffer", scvo.getReSendQ().size());
|
|
jo1.put("Connect", mvo2.isConnected());
|
|
|
|
ja1.add(jo1);
|
|
}
|
|
}
|
|
}
|
|
|
|
jo2.put("SC", ja1);
|
|
data.add(jo2);
|
|
}
|
|
|
|
return makeSTA(0, 3, data);
|
|
}
|
|
|
|
@SuppressWarnings("unchecked")
|
|
private String makeSTA(int msgGroup, int msgId, JSONObject data) {
|
|
JSONObject header = new JSONObject();
|
|
String sendDT = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
|
|
header.put("SendDT", sendDT);
|
|
header.put("MsgGroup", msgGroup);
|
|
header.put("MsgID", msgId);
|
|
|
|
JSONObject response = new JSONObject();
|
|
response.put("Header", header);
|
|
response.put("Data", data);
|
|
|
|
JSONArray array = new JSONArray();
|
|
array.add(response);
|
|
|
|
JSONObject result = new JSONObject();
|
|
result.put("result", array);
|
|
|
|
return result.toString();
|
|
}
|
|
|
|
@SuppressWarnings("unchecked")
|
|
private String makeSTA(int msgGroup, int msgId, JSONArray data) {
|
|
JSONObject header = new JSONObject();
|
|
String sendDT = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
|
|
header.put("SendDT", sendDT);
|
|
header.put("MsgGroup", msgGroup);
|
|
header.put("MsgID", msgId);
|
|
|
|
JSONObject response = new JSONObject();
|
|
response.put("Header", header);
|
|
response.put("Data", data);
|
|
|
|
JSONArray array = new JSONArray();
|
|
array.add(response);
|
|
|
|
JSONObject result = new JSONObject();
|
|
result.put("result", array);
|
|
|
|
return result.toString();
|
|
}
|
|
|
|
public String makeHeader() {
|
|
String headers = "";
|
|
|
|
String packetId = "$STA01"+delimiter;
|
|
String sendTime = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))+delimiter;
|
|
String sourceProcessNm = "TGW"+delimiter; // 패킷생성 Process
|
|
String sourceIp = "";
|
|
try {
|
|
sourceIp = InetAddress.getLocalHost().getHostAddress()+delimiter;//출발지 IP (자기 IP)
|
|
} catch (UnknownHostException e) {
|
|
e.printStackTrace();
|
|
}
|
|
String destProcessNm = ""+delimiter; //수신 Process 명
|
|
String destIP = ""+delimiter; //목적지 IP
|
|
|
|
headers = packetId
|
|
+sendTime
|
|
+sourceProcessNm
|
|
+sourceIp
|
|
+destProcessNm
|
|
+destIP;
|
|
|
|
return headers;
|
|
}
|
|
|
|
/*gicoms add*/
|
|
|
|
private void sendSTA(String msg) {
|
|
try {
|
|
if (msg.equals("") || msg == null) {
|
|
return;
|
|
}
|
|
MsgObjVO vo = new MsgObjVO();
|
|
|
|
vo.setMsg(msg.getBytes("EUC-KR"));
|
|
|
|
int port = systemInfo.getStatPort();
|
|
|
|
broadcastServer(port, vo);
|
|
} catch (Exception e) {
|
|
logger.writeLevelLog("[SEND STATUS] " + GmtUtils.getStatckTrace(e), LogLevelType.LOG_INFO, "FileLog", false);
|
|
}
|
|
}
|
|
|
|
|
|
private void initAreaFromXml(String dirpath) {
|
|
try {
|
|
String rpath = "";
|
|
|
|
if (dirpath.equals("")) {
|
|
String root = System.getProperty("user.dir");
|
|
rpath = root + "/cfg/Area.xml";
|
|
} else {
|
|
rpath = dirpath + "/cfg/Area.xml";
|
|
}
|
|
|
|
File file = new File(rpath);
|
|
|
|
boolean isExists = file.exists();
|
|
if (!isExists) {
|
|
logger.writeLevelLog("The file does not exist in the directory. [" + rpath + "]",
|
|
LogLevelType.LOG_ERROR, "AllLog");
|
|
return;
|
|
}
|
|
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
|
|
DocumentBuilder builder = factory.newDocumentBuilder();
|
|
Document doc = builder.parse(file);
|
|
|
|
NodeList nodes = doc.getElementsByTagName("AREA");
|
|
|
|
for (int i = 0; i < nodes.getLength(); i++) {
|
|
Node clientNode = nodes.item(i);
|
|
|
|
for (Node child = clientNode.getFirstChild(); child != null; child = child.getNextSibling()) {
|
|
if (child.getNodeType() != Node.ELEMENT_NODE) {
|
|
continue;
|
|
}
|
|
|
|
AreaVO avo = new AreaVO();
|
|
|
|
Element childElement = (Element) child;
|
|
|
|
if (childElement.getNodeName().equals("Zone")) {
|
|
avo.setZone_id(childElement.getAttribute("Id"));
|
|
avo.setZone_nm(childElement.getAttribute("Name"));
|
|
avo.setZone_cd(childElement.getAttribute("Code"));
|
|
}
|
|
AreaList.add(avo);
|
|
}
|
|
}
|
|
} catch (Exception e) {
|
|
e.printStackTrace();
|
|
}
|
|
}
|
|
|
|
private void initSystemFromXml(String dirpath) {
|
|
try {
|
|
String rpath = "";
|
|
|
|
if (dirpath.equals("")) {
|
|
String root = System.getProperty("user.dir");
|
|
rpath = root + "/cfg/system.xml";
|
|
} else {
|
|
rpath = dirpath + "/cfg/system.xml";
|
|
}
|
|
|
|
File file = new File(rpath);
|
|
|
|
boolean isExists = file.exists();
|
|
if (!isExists) {
|
|
logger.writeLevelLog("The file does not exist in the directory. [" + rpath + "]",
|
|
LogLevelType.LOG_ERROR, "AllLog");
|
|
return;
|
|
}
|
|
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
|
|
DocumentBuilder builder = factory.newDocumentBuilder();
|
|
Document doc = builder.parse(file);
|
|
|
|
NodeList nodes = doc.getElementsByTagName("System");
|
|
|
|
for (int i = 0; i < nodes.getLength(); i++) {
|
|
Node clientNode = nodes.item(i);
|
|
|
|
for (Node child = clientNode.getFirstChild(); child != null; child = child.getNextSibling()) {
|
|
if (child.getNodeType() != Node.ELEMENT_NODE) {
|
|
continue;
|
|
}
|
|
|
|
Element childElement = (Element) child;
|
|
|
|
if (childElement.getNodeName().equals("Info")) {
|
|
systemInfo.setName(childElement.getAttribute("Name"));
|
|
systemInfo.setIp(childElement.getAttribute("IP"));
|
|
systemInfo.setHa(GmtUtils.strToIntDef(childElement.getAttribute("HA"), -1));
|
|
} else if (child.getNodeName().equals("Option")) {
|
|
systemInfo.setBufSize(GmtUtils.strToIntDef(childElement.getAttribute("BufSize"), -1));
|
|
} else if (child.getNodeName().equals("Log")) {
|
|
systemInfo.setLogLevel(GmtUtils.strToIntDef(childElement.getAttribute("Level"), -1));
|
|
systemInfo.setLogPort(GmtUtils.strToIntDef(childElement.getAttribute("Port"), -1));
|
|
} else if (child.getNodeName().equals("Stat")) {
|
|
systemInfo.setStatChktime(GmtUtils.strToIntDef(childElement.getAttribute("CheckTime"), -1));
|
|
systemInfo.setUpdateTime(GmtUtils.strToIntDef(childElement.getAttribute("UpdateTime"), -1));
|
|
systemInfo.setStatSendTime(GmtUtils.strToIntDef(childElement.getAttribute("SndTime"), -1));
|
|
systemInfo.setStatSend(Boolean.parseBoolean(childElement.getAttribute("IsSend")));
|
|
systemInfo.setStatPort(GmtUtils.strToIntDef(childElement.getAttribute("Port"), -1));
|
|
}
|
|
}
|
|
}
|
|
|
|
} catch (Exception e) {
|
|
e.printStackTrace();
|
|
}
|
|
}
|
|
|
|
public SystemInfoVO getSystemInfo() {
|
|
return systemInfo;
|
|
}
|
|
|
|
public void setSystemInfo(SystemInfoVO systemInfo) {
|
|
this.systemInfo = systemInfo;
|
|
}
|
|
|
|
//Monitoring
|
|
@SuppressWarnings("unchecked")
|
|
@GetMapping(value = "/rest/serverStatus")
|
|
public JSONArray loadServerStatusInfo() throws Exception{
|
|
JSONArray data = new JSONArray();
|
|
for (int i = 0; i < serverInfoList.size(); i++) {
|
|
ServerInfoVO sivo = serverInfoList.get(i);
|
|
MonitorInfoVO mvo = sivo.getMonitorInfo();
|
|
|
|
JSONObject jo2 = new JSONObject();
|
|
jo2.put("ID", sivo.getId());
|
|
jo2.put("ServerName", sivo.getName());
|
|
jo2.put("ServerPort", sivo.getPort());
|
|
jo2.put("SCCount", sivo.getServiceClientCount());
|
|
jo2.put("SendBuffer", mvo.getSendQCount());
|
|
jo2.put("Use", sivo.isUseFlag());
|
|
|
|
int sport = sivo.getPort();
|
|
JSONArray ja1 = new JSONArray();
|
|
|
|
if (sivo.getServiceClientCount() != 0) {
|
|
Object[] keys = serverScInfoList.keySet().toArray();
|
|
|
|
for (int j = 0; j < keys.length; j++) {
|
|
ServiceClientVO scvo = serverScInfoList.get(keys[j]);
|
|
MonitorInfoVO mvo2 = scvo.getMonitorInfoVO();
|
|
JSONObject jo1 = new JSONObject();
|
|
|
|
int scport = scvo.getServerPort();
|
|
if (sport == scport) {
|
|
jo1.put("ID", scvo.getId());
|
|
jo1.put("ServiceName", scvo.getName());
|
|
jo1.put("ServiceIP", scvo.getIp());
|
|
jo1.put("ServicePort", scvo.getServicePort());
|
|
jo1.put("SendBuffer", scvo.getReSendQ().size());
|
|
jo1.put("Connect", mvo2.isConnected());
|
|
|
|
ja1.add(jo1);
|
|
}
|
|
}
|
|
}
|
|
|
|
jo2.put("SC", ja1);
|
|
data.add(jo2);
|
|
}
|
|
|
|
return data;
|
|
}
|
|
|
|
@SuppressWarnings("unchecked")
|
|
@GetMapping(value = "/rest/clientStatus")
|
|
public JSONArray loadClientStatusInfo() throws Exception{
|
|
JSONArray data = new JSONArray();
|
|
for (int i = 0; i < clientInfoList.size(); i++) {
|
|
ClientInfoVO civo = clientInfoList.get(i);
|
|
MonitorInfoVO cimvo = civo.getMonitorInfo();
|
|
if (!civo.isiSUse()) {
|
|
continue;
|
|
}
|
|
JSONObject jo1 = new JSONObject();
|
|
jo1.put("ID", civo.getId());
|
|
jo1.put("ClientName", civo.getName());
|
|
switch (civo.getActive().getName()) {
|
|
case "PRIMARY":
|
|
jo1.put("Active", 0);
|
|
jo1.put("IP", civo.getIp());
|
|
break;
|
|
|
|
case "SECONDARY":
|
|
jo1.put("Active", 1);
|
|
jo1.put("IP", civo.getsIp());
|
|
break;
|
|
}
|
|
|
|
jo1.put("Port", civo.getPort());
|
|
jo1.put("SendBuffer", cimvo.getSendQCount());
|
|
jo1.put("RecvBuffer", cimvo.getRecvQCount());
|
|
jo1.put("Connect", cimvo.isConnected());
|
|
data.add(jo1);
|
|
}
|
|
|
|
return data;
|
|
}
|
|
|
|
@SuppressWarnings("unchecked")
|
|
@GetMapping(value = "/rest/systemStatus")
|
|
public JSONObject loadSystemStatusInfo() throws Exception{
|
|
JSONObject data = new JSONObject();
|
|
data.put("RecvBuffer", getRcvBuffer());
|
|
data.put("SendBuffer", getSndBuffer());
|
|
data.put("Start", startTime);
|
|
|
|
return data;
|
|
}
|
|
|
|
public LocalDateTime getSosSendDT() {
|
|
return this.sosSendDT;
|
|
}
|
|
|
|
public LocalDateTime getPosSendDT() {
|
|
return this.posSendDT;
|
|
}
|
|
}
|