ソースを参照

req_company별로 이벤트를 전송하기 위한 변경 작업

leeheejo 4 年 前
コミット
8b76e12a17

+ 46 - 46
bridge/src/com/icontrols/bridge/Main.java

@@ -1,7 +1,7 @@
 package com.icontrols.bridge;
 
-
 import java.util.ArrayList;
+import java.util.HashMap;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -17,53 +17,53 @@ import com.icontrols.bridge.wallpad.IMapMultiSocket;
 
 public class Main {
 	private static Logger logger = LoggerFactory.getLogger(Main.class);
-	
+
 	public static void main(String[] args) {
-		
+
 		logger.info("*************************************************************************");
-    	logger.info("*                                                                       *");
-    	logger.info("*  *****   *         *******   *          **       *      *    *    *   *");
-    	logger.info("*  *       *            *      *          **       *      *    *    *   *");
-    	logger.info("*  *       ***         * *     *         *  *   ****      ******    *   *");
-    	logger.info("*  *       *          *   *    *        *    *     *      *    *  ***   *");
-    	logger.info("*  *****   *         *     *   *       *      *    *      *    *    *   *");
-    	logger.info("*       *                      *      *        *   *      ******    *   *");
-    	logger.info("*       *                                                               *");
-    	logger.info("*       *******                                                         *");
-    	logger.info("*                                                       BRIDGE BY PANGS *");
-    	logger.info("*************************************************************************");
-    	
-    	// 초기 설정
-    	String str = CommonUtil.readFile(CommonUtil.getPropFileDir()); 
-    	JsonObject object = CommonUtil.getJsonObject(str);
-    	
-    	COMMON_INFO.propList = (JsonArray)object.get("services");
-    	
-    	if(COMMON_INFO.propList == null) {
-    		logger.error("설정정보를 가져올 수 없습니다......");
-    		return;
-    	}
-    	COMMON_INFO.serviceDtailList = new ArrayList<>();
-    	
-    	for(JsonElement jsonObj : COMMON_INFO.propList) {
-    		ServiceDetail service = new Gson().fromJson(jsonObj.toString(), ServiceDetail.class);
-    		COMMON_INFO.serviceDtailList.add(service);
-    	}
-    	
-    	if(COMMON_INFO.propList.size() == 0) {
-    		logger.error("설정정보가 존재하지 않습니다....");
-    		return; 
-    	}
-    	
-    	StringBuffer bufStr = new StringBuffer();
-    	bufStr.append("설정된 서비스 \n");
-    	for(ServiceDetail service:COMMON_INFO.serviceDtailList)
-    		bufStr.append(service.toString()).append("\n");
-    	
-    	logger.info(bufStr.toString());
-    	
-    	// 소켓 서버 시작
-    	new IMapMultiSocket();
+		logger.info("*                                                                       *");
+		logger.info("*  *****   *         *******   *          **       *      *    *    *   *");
+		logger.info("*  *       *            *      *          **       *      *    *    *   *");
+		logger.info("*  *       ***         * *     *         *  *   ****      ******    *   *");
+		logger.info("*  *       *          *   *    *        *    *     *      *    *  ***   *");
+		logger.info("*  *****   *         *     *   *       *      *    *      *    *    *   *");
+		logger.info("*       *                      *      *        *   *      ******    *   *");
+		logger.info("*       *                                                               *");
+		logger.info("*       *******                                                         *");
+		logger.info("*                                                       BRIDGE BY PANGS *");
+		logger.info("*************************************************************************");
+
+		// 초기 설정
+		String str = CommonUtil.readFile(CommonUtil.getPropFileDir());
+		JsonObject object = CommonUtil.getJsonObject(str);
+
+		COMMON_INFO.propList = (JsonArray) object.get("services");
+
+		if (COMMON_INFO.propList == null) {
+			logger.error("설정정보를 가져올 수 없습니다......");
+			return;
+		}
+		COMMON_INFO.serviceDtailList = new HashMap<String, ServiceDetail>();
+
+		for (JsonElement jsonObj : COMMON_INFO.propList) {
+			ServiceDetail service = new Gson().fromJson(jsonObj.toString(), ServiceDetail.class);
+			COMMON_INFO.serviceDtailList.put(service.getName(), service);
+		}
+
+		if (COMMON_INFO.propList.size() == 0) {
+			logger.error("설정정보가 존재하지 않습니다....");
+			return;
+		}
+
+		StringBuffer bufStr = new StringBuffer();
+		bufStr.append("설정된 서비스 \n");
+		for (String key : COMMON_INFO.serviceDtailList.keySet())
+			bufStr.append(COMMON_INFO.serviceDtailList.get(key).toString()).append("\n");
+
+		logger.info(bufStr.toString());
+
+		// 소켓 서버 시작
+		new IMapMultiSocket();
 	}
 
 }

+ 2 - 2
bridge/src/com/icontrols/bridge/common/COMMON_INFO.java

@@ -1,6 +1,6 @@
 package com.icontrols.bridge.common;
 
-import java.util.List;
+import java.util.HashMap;
 
 import com.google.gson.JsonArray;
 import com.icontrols.bridge.dto.ServiceDetail;
@@ -12,5 +12,5 @@ public class COMMON_INFO {
 	
 	public static String propJsonStr = "{}";
 	public static JsonArray propList = null;
-	public static List<ServiceDetail> serviceDtailList = null;
+	public static HashMap<String, ServiceDetail> serviceDtailList = null;
 }

+ 144 - 116
bridge/src/com/icontrols/bridge/wallpad/MsgServerHandler.java

@@ -31,22 +31,21 @@ import com.icontrols.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 String rcvMsgStr; // 입력 받은 XML String
+
 	private long lSocketConnectionPeriod = 0;
 	private int TIMEOUT_iMAP_WAIT = 3000; // iMAP 타임아웃
 	private int SOCKET_BUFFER_SIZE_READ = 50;
-	
-	private final int SOCKET_WAIT_TIME = 3000;	// 전송할 때
+
+	private final int SOCKET_WAIT_TIME = 3000; // 전송할 때
 	private final int SOCKET_BUFFER_SIZE = 100; // 전송할 때
-	
-	public MsgServerHandler (Socket clientSocket) {
+
+	public MsgServerHandler(Socket clientSocket) {
 		this.clientSocket = clientSocket;
 	}
-	
+
 	public void run() {
 		InputStream is = null;
 		InputStreamReader isr = null;
@@ -54,163 +53,192 @@ public class MsgServerHandler extends Thread {
 		try {
 			is = clientSocket.getInputStream();
 			isr = new InputStreamReader(is, "euc-kr");
-			
+
 			clientSocket.setSoLinger(true, 3000);
-			
+
 			br = new BufferedReader(isr);
 			rcvMsgStr = "";
-			
+
 			StringBuffer sbRcvMSG = new StringBuffer();
 			StringBuffer sbInBuffer = null;
-			
+
 			boolean rcvOK = false;
 			lSocketConnectionPeriod = System.currentTimeMillis() + TIMEOUT_iMAP_WAIT;
-			
-			while(System.currentTimeMillis() < lSocketConnectionPeriod) {
+
+			while (System.currentTimeMillis() < lSocketConnectionPeriod) {
 				try {
-					if(br.ready()) {
+					if (br.ready()) {
 						try {
 							char[] readData = new char[SOCKET_BUFFER_SIZE_READ * 1024];
 							sbInBuffer = new StringBuffer();
-							
-							while(br.ready()) {
+
+							while (br.ready()) {
 								long charCnt = br.read(readData);
-								sbInBuffer.append(new String(readData, 0, (int)charCnt));
+								sbInBuffer.append(new String(readData, 0, (int) charCnt));
 							}
-							
-							if(sbInBuffer != null || sbInBuffer.toString().trim().length() > 0) 
+
+							if (sbInBuffer != null || sbInBuffer.toString().trim().length() > 0)
 								sbRcvMSG.append(sbInBuffer.toString());
-							
-							if(0 < sbInBuffer.toString().indexOf("</imap>")) {
+
+							if (0 < sbInBuffer.toString().indexOf("</imap>")) {
 								rcvOK = true;
 								logger.info("Client Message Receive DONE!!!");
 								break;
 							}
-						}catch(Exception e) {
+						} catch (Exception e) {
 							logger.error("Message Read ERROR --> " + e.getMessage());
 							return;
 						}
-					}else {
+					} else {
 						Thread.sleep(100);
-					} 
-				}catch(Exception e) {
+					}
+				} catch (Exception e) {
 					logger.error("Message Read Error 2 ...  --> " + e.getMessage());
 					clientSocket.close();
 					return;
-				}finally {
+				} finally {
 					rcvMsgStr = sbRcvMSG.toString();
 				}
 			}
-			
-			if(!rcvOK) {
+
+			if (!rcvOK) {
 				logger.error("FAIL...  iMap message is unacceptable!! : \n\r " + rcvMsgStr);
 				clientSocket.close();
 				return;
 			}
-			
+
 			logger.info(" :: >> " + rcvMsgStr);
-		}catch(Exception e) {
-			
-		}finally {
-			try { if(!clientSocket.isClosed()) clientSocket.close(); }catch(Exception e) { }
-			try { br.close(); } catch(Exception e) { }
-			try { isr.close(); } catch(Exception e) { }
-			try { is.close(); } catch(Exception e) { }
+		} catch (Exception e) {
+
+		} finally {
+			try {
+				if (!clientSocket.isClosed())
+					clientSocket.close();
+			} catch (Exception e) {
+			}
+			try {
+				br.close();
+			} catch (Exception e) {
+			}
+			try {
+				isr.close();
+			} catch (Exception e) {
+			}
+			try {
+				is.close();
+			} catch (Exception e) {
+			}
 		}
-			
+
 		try {
-			rcvMsgStr = rcvMsgStr.substring(rcvMsgStr.indexOf("<")); // 이 부분에 대한 예시 데이터가 있으면 이해하기 좋을거 같다. 테스트 하면서 뽑아내고 주석으로 잘아보자.
-																	 // 내가 생각하기엔 앞에 공백이 있을 경우? 혹은 다른 문자가 있을경우를 대비하기 위함이지 않을까 생각한다.
+			rcvMsgStr = rcvMsgStr.substring(rcvMsgStr.indexOf("<")); // 이 부분에 대한 예시 데이터가 있으면 이해하기 좋을거 같다. 테스트 하면서 뽑아내고
+																		// 주석으로 잘아보자.
+																		// 내가 생각하기엔 앞에 공백이 있을 경우? 혹은 다른 문자가 있을경우를 대비하기
+																		// 위함이지 않을까 생각한다.
 			// 이벤트명 가져오기
-			DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();						// XML 문서를 읽기 위한 Factory 객체 생성
-			DocumentBuilder builder = factory.newDocumentBuilder();										// Builder 객체 생성
+			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);
-			
+			Node iMap = (Node) xpath.evaluate("//imap/service", doc, XPathConstants.NODE);
+
 			final String eventName = iMap.getAttributes().getNamedItem("name").getTextContent();
-			
+
 			// 이벤트 명이 null 이거나 공란이면 종료.
-			if(eventName == null || eventName.trim().length() == 0) return;
+			if (eventName == null || eventName.trim().length() == 0)
+				return;
+
+			final boolean isContainCompany = rcvMsgStr.contains("<req_company>") ? true : false; // <req_company>UPLUS</req_company>
+																									// Element가 있는지
+																									// 확인한다.
+																									// 없으면 설정파일에 등록된 모든
+																									// 서비스에 이벤트를 전송하고
+																									// 있으면 해당 Element에
+																									// 정의된 서비스에만 전송한다.
 
-			final boolean isContainCompany = rcvMsgStr.contains("<req_company>")?true:false;	// <req_company>UPLUS</req_company> Element가 있는지 확인한다.
-																								// 없으면 설정파일에 등록된 모든 서비스에 이벤트를 전송하고 있으면 해당 Element에 정의된 서비스에만 전송한다.
-			
-			final String midStr  = isContainCompany?rcvMsgStr.substring(rcvMsgStr.indexOf("<req_company>"), rcvMsgStr.indexOf("</req_company>")):"";
+			final String midStr = isContainCompany
+					? rcvMsgStr.substring(rcvMsgStr.indexOf("<req_company>"), rcvMsgStr.indexOf("</req_company>"))
+					: "";
+
+			final String reqStr = isContainCompany ? midStr.substring(midStr.indexOf(">") + 1) : "";
+			final String topStr = isContainCompany ? rcvMsgStr.substring(0, rcvMsgStr.indexOf(reqStr)) : "";
+			final String bottomStr = isContainCompany ? rcvMsgStr.substring(rcvMsgStr.indexOf("</req_company>")) : "";
+
+			String[] companies = reqStr.split("/");
 
-			final String reqStr = isContainCompany?midStr.substring(midStr.indexOf(">")+1):"";
-			final String topStr = isContainCompany?rcvMsgStr.substring(0, rcvMsgStr.indexOf(reqStr)):"";
-			final String bottomStr = isContainCompany?rcvMsgStr.substring(rcvMsgStr.indexOf("</req_company>")):"";
-			
 			// 서비스 목록 가져오기
-	    	for(ServiceDetail service : COMMON_INFO.serviceDtailList) {
+			for (String companyName : companies) {
 //	    	for(JsonElement jsonObj : COMMON_INFO.propList) {
 //	    		ServiceDetail service = new Gson().fromJson(jsonObj.toString(), ServiceDetail.class);
-	    		
-	    		if(!Arrays.asList(service.getEvents()).contains(eventName)) continue;
-	    		
-    			StringBuffer sb = new StringBuffer();
-    			
-    			if(isContainCompany) rcvMsgStr = sb.append(topStr).append(service.getName()).append(bottomStr).toString();
-    			
-    			logger.debug("최종 - \r\n" + rcvMsgStr);
-    			
-    			Runnable task = () -> {
-    				Socket danziSocket = null;
-    				DataOutputStream outStream = null;
-    				try {
-    					danziSocket = new Socket();
-    					danziSocket.setSoLinger(true, 3000);
-    					danziSocket.setSendBufferSize(SOCKET_BUFFER_SIZE * 1024);
-    					danziSocket.setSoTimeout(SOCKET_WAIT_TIME);
-    					
-    					InetSocketAddress iSocAddr = new InetSocketAddress(service.getAddress(), service.getPort());
-    					danziSocket.connect(iSocAddr, SOCKET_WAIT_TIME);
-    					
-    					outStream = new DataOutputStream(danziSocket.getOutputStream());
-    					String sendMsg = rcvMsgStr + "\r\n";
-    					byte[] outBF = sendMsg.getBytes("euc-kr");
-    					
-    					outStream.write(outBF);
-    					outStream.flush();
-    					
-    					StringBuffer logSB = new StringBuffer();
-    					
-    					logSB.append("   S E N D    T O " + service.getPort() + "  C O M P L I T E ! ! ! !  \n");
-    					
-    					logger.info(logSB.toString());
-    				} catch (Exception e) {
-    					// TODO Auto-generated catch block
-    					
-    					StringBuffer errSB = new StringBuffer();
-    					
-    					errSB.append("\n***************************************************\n")
-    					.append("   F A I L   T O "+ service.getPort() + "   S E N D   E V E N T   ! ! ! !  \n")
-    					.append("   ERROR MESSAGE = " + e.getMessage() + " \n")
-    					.append("***************************************************");
-    					
-    					logger.error(errSB.toString());
-    					
-    					e.printStackTrace();
-    				} finally {
-    					try {
-    						Thread.sleep(100);
-    						outStream.close();
-    						danziSocket.close();
-    					} catch (Exception e) {
-    						e.printStackTrace();
-    					}
-    				}
-    			};
-    			new Thread(task).start();
-	    	}
+				ServiceDetail service = COMMON_INFO.serviceDtailList.get(companyName);
+
+				if (!Arrays.asList(service.getEvents()).contains(eventName))
+					continue;
+
+				StringBuffer sb = new StringBuffer();
+
+				if (isContainCompany)
+					rcvMsgStr = sb.append(topStr).append(service.getName()).append(bottomStr).toString();
+
+				logger.debug("최종 - \r\n" + rcvMsgStr);
+
+				Runnable task = () -> {
+					Socket danziSocket = null;
+					DataOutputStream outStream = null;
+					try {
+						danziSocket = new Socket();
+						danziSocket.setSoLinger(true, 3000);
+						danziSocket.setSendBufferSize(SOCKET_BUFFER_SIZE * 1024);
+						danziSocket.setSoTimeout(SOCKET_WAIT_TIME);
+
+						InetSocketAddress iSocAddr = new InetSocketAddress(service.getAddress(), service.getPort());
+						danziSocket.connect(iSocAddr, SOCKET_WAIT_TIME);
+
+						outStream = new DataOutputStream(danziSocket.getOutputStream());
+						String sendMsg = rcvMsgStr + "\r\n";
+						byte[] outBF = sendMsg.getBytes("euc-kr");
+
+						outStream.write(outBF);
+						outStream.flush();
+
+						StringBuffer logSB = new StringBuffer();
+
+						logSB.append("   S E N D    T O " + service.getPort() + "  C O M P L I T E ! ! ! !  \n");
+
+						logger.info(logSB.toString());
+					} catch (Exception e) {
+						// TODO Auto-generated catch block
+
+						StringBuffer errSB = new StringBuffer();
+
+						errSB.append("\n***************************************************\n")
+								.append("   F A I L   T O " + service.getPort()
+										+ "   S E N D   E V E N T   ! ! ! !  \n")
+								.append("   ERROR MESSAGE = " + e.getMessage() + " \n")
+								.append("***************************************************");
+
+						logger.error(errSB.toString());
+
+						e.printStackTrace();
+					} finally {
+						try {
+							Thread.sleep(100);
+							outStream.close();
+							danziSocket.close();
+						} catch (Exception e) {
+							e.printStackTrace();
+						}
+					}
+				};
+				new Thread(task).start();
+			}
 		} catch (IOException e) {
 			// TODO Auto-generated catch block
 			e.printStackTrace();
 			logger.error("[ERROR] IOEXCEPTION-" + e.getMessage());
-		} catch(Exception e) {
+		} catch (Exception e) {
 			logger.error("[ERROR] EXCEPTION - " + e.getMessage());
 			e.printStackTrace();
 		}