|
@@ -0,0 +1,169 @@
|
|
|
+package com.icontrole.bridge.wallpad;
|
|
|
+
|
|
|
+import java.io.BufferedReader;
|
|
|
+import java.io.ByteArrayInputStream;
|
|
|
+import java.io.IOException;
|
|
|
+import java.io.InputStream;
|
|
|
+import java.io.InputStreamReader;
|
|
|
+import java.net.Socket;
|
|
|
+
|
|
|
+import javax.xml.parsers.DocumentBuilder;
|
|
|
+import javax.xml.parsers.DocumentBuilderFactory;
|
|
|
+import javax.xml.xpath.XPath;
|
|
|
+import javax.xml.xpath.XPathConstants;
|
|
|
+import javax.xml.xpath.XPathFactory;
|
|
|
+
|
|
|
+import org.slf4j.Logger;
|
|
|
+import org.slf4j.LoggerFactory;
|
|
|
+import org.w3c.dom.Document;
|
|
|
+import org.w3c.dom.Node;
|
|
|
+
|
|
|
+import com.google.gson.Gson;
|
|
|
+import com.google.gson.JsonArray;
|
|
|
+import com.google.gson.JsonObject;
|
|
|
+import com.icontrole.bridge.common.CommonUtil;
|
|
|
+import com.icontrole.bridge.dto.ServiceDetail;
|
|
|
+
|
|
|
+public class MsgServerHandler extends Thread {
|
|
|
+ private final Logger logger = LoggerFactory.getLogger(MsgServerHandler.class);
|
|
|
+
|
|
|
+ private Socket clientSocket;
|
|
|
+ private String rcvMsgStr; // 입력 받은 XML String
|
|
|
+
|
|
|
+
|
|
|
+ private long lSocketConnectionPeriod = 0;
|
|
|
+ private int TIMEOUT_iMAP_WAIT = 3000; // iMAP 타임아웃
|
|
|
+ private int SOCKET_BUFFER_SIZE_READ = 50;
|
|
|
+
|
|
|
+ public MsgServerHandler (Socket clientSocket) {
|
|
|
+ this.clientSocket = clientSocket;
|
|
|
+ }
|
|
|
+
|
|
|
+ public void run() {
|
|
|
+ try {
|
|
|
+ InputStream is = clientSocket.getInputStream();
|
|
|
+ clientSocket.setSoLinger(true, 3000);
|
|
|
+
|
|
|
+ BufferedReader br = new BufferedReader(new InputStreamReader(is, "euc-kr"));
|
|
|
+ rcvMsgStr = "";
|
|
|
+
|
|
|
+ StringBuffer sbRcvMSG = new StringBuffer();
|
|
|
+ StringBuffer sbInBuffer = null;
|
|
|
+
|
|
|
+ boolean rcvOK = false;
|
|
|
+ lSocketConnectionPeriod = System.currentTimeMillis() + TIMEOUT_iMAP_WAIT;
|
|
|
+
|
|
|
+ while(System.currentTimeMillis() < lSocketConnectionPeriod) {
|
|
|
+ try {
|
|
|
+ if(br.ready()) {
|
|
|
+ try {
|
|
|
+ char[] readData = new char[SOCKET_BUFFER_SIZE_READ * 1024];
|
|
|
+ sbInBuffer = new StringBuffer();
|
|
|
+
|
|
|
+ while(br.ready()) {
|
|
|
+ long charCnt = br.read(readData);
|
|
|
+ sbInBuffer.append(new String(readData, 0, (int)charCnt));
|
|
|
+ }
|
|
|
+
|
|
|
+ if(sbInBuffer != null || sbInBuffer.toString().trim().length() > 0)
|
|
|
+ sbRcvMSG.append(sbInBuffer.toString());
|
|
|
+
|
|
|
+ if(0 < sbInBuffer.toString().indexOf("</imap>")) {
|
|
|
+ rcvOK = true;
|
|
|
+ logger.info("Client Message Receive DONE!!!");
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }catch(Exception e) {
|
|
|
+ logger.error("Message Read ERROR --> " + e.getMessage());
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ }else {
|
|
|
+ Thread.sleep(100);
|
|
|
+ }
|
|
|
+ }catch(Exception e) {
|
|
|
+ logger.error("Message Read Error 2 ... --> " + e.getMessage());
|
|
|
+ clientSocket.close();
|
|
|
+ return;
|
|
|
+ }finally {
|
|
|
+ rcvMsgStr = sbRcvMSG.toString();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if(!rcvOK) {
|
|
|
+ logger.error("FAIL... iMap message is unacceptable!! : \n\r " + rcvMsgStr);
|
|
|
+ clientSocket.close();
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ logger.info(" :: >> " + rcvMsgStr);
|
|
|
+
|
|
|
+ rcvMsgStr = rcvMsgStr.substring(rcvMsgStr.indexOf("<")); // 이 부분에 대한 예시 데이터가 있으면 이해하기 좋을거 같다. 테스트 하면서 뽑아내고 주석으로 잘아보자.
|
|
|
+ // 내가 생각하기엔 앞에 공백이 있을 경우? 혹은 다른 문자가 있을경우를 대비하기 위함이지 않을까 생각한다.
|
|
|
+ // 이벤트명 가져오기
|
|
|
+ String eventName = "";
|
|
|
+ try {
|
|
|
+ DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); // XML 문서를 읽기 위한 Factory 객체 생성
|
|
|
+ DocumentBuilder builder = factory.newDocumentBuilder(); // Builder 객체 생성
|
|
|
+ InputStream istream = new ByteArrayInputStream(rcvMsgStr.getBytes("UTF-8"));
|
|
|
+ Document doc = builder.parse(istream);
|
|
|
+
|
|
|
+ XPath xpath = XPathFactory.newInstance().newXPath();
|
|
|
+ Node iMap = (Node)xpath.evaluate("//imap/service", doc, XPathConstants.NODE);
|
|
|
+
|
|
|
+ eventName = iMap.getAttributes().getNamedItem("name").getTextContent();
|
|
|
+ }catch(Exception e) {
|
|
|
+ logger.error("[ERROR] - XML 문서 읽는도중 에러 발생 -" + e.getMessage());
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ // 이벤트 명이 null 이거나 공란이면 종료.
|
|
|
+ if(eventName == null || eventName.trim().length() == 0) return;
|
|
|
+
|
|
|
+ boolean isContainCompany = true; // <req_company>UPLUS</req_company> Element가 있는지 확인한다.
|
|
|
+ // 없으면 설정파일에 등록된 모든 서비스에 이벤트를 전송하고 있으면 해당 Element에 정의된 서비스에만 전송한다.
|
|
|
+
|
|
|
+ String topStr = "";
|
|
|
+ String midStr = "";
|
|
|
+ String reqStr = "";
|
|
|
+ String bottomStr = "";
|
|
|
+
|
|
|
+ try {
|
|
|
+ topStr = rcvMsgStr.substring(0, rcvMsgStr.indexOf("<req_company>"));
|
|
|
+ midStr = rcvMsgStr.substring(rcvMsgStr.indexOf("<req_company>"), rcvMsgStr.indexOf("</req_company>"));
|
|
|
+ bottomStr = rcvMsgStr.substring(rcvMsgStr.indexOf("</req_company>"));
|
|
|
+
|
|
|
+ reqStr = midStr.substring(midStr.indexOf(">")+1);
|
|
|
+ topStr = rcvMsgStr.substring(0, rcvMsgStr.indexOf(reqStr));
|
|
|
+
|
|
|
+ }catch(Exception e) {
|
|
|
+ isContainCompany = false;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 서비스 목록 가져오기
|
|
|
+ String str = CommonUtil.readFile(CommonUtil.getPropFileDir());
|
|
|
+ JsonObject object = CommonUtil.getJsonObject(str);
|
|
|
+ JsonArray list = (JsonArray)object.get("services");
|
|
|
+
|
|
|
+ for(int i=0; i < list.size(); i++) {
|
|
|
+ ServiceDetail service = new Gson().fromJson(list.get(i).toString(), ServiceDetail.class);
|
|
|
+
|
|
|
+ if(isContainCompany && !reqStr.contains(service.getName()) ) continue; // reqCompany 엘리먼트에 해당 서비스가 등록 돼 있지 않으면 이벤트 전송 X
|
|
|
+
|
|
|
+ for(String tmpEvent:service.getEvents()) {
|
|
|
+ if(!eventName.equals(tmpEvent)) continue;
|
|
|
+ StringBuffer sb = new StringBuffer();
|
|
|
+
|
|
|
+ if(isContainCompany) rcvMsgStr = sb.append(topStr).append(service.getName()).append(bottomStr).toString();
|
|
|
+
|
|
|
+ logger.info("최종 - \r\n" + rcvMsgStr);
|
|
|
+ new MsgClientHandler(service.getAddress(), service.getPort()).doWork(rcvMsgStr);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } catch (IOException e) {
|
|
|
+ // TODO Auto-generated catch block
|
|
|
+ e.printStackTrace();
|
|
|
+ logger.error("[ERROR] -" + e.getMessage());
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|