| 
					
				 | 
			
			
				@@ -20,7 +20,9 @@ import com.icontrols.kakao.common.utils.CommonUtil; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.icontrols.kakao.common.utils.JWTUtils2; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.icontrols.kakao.config.AsyncConfig; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.icontrols.kakao.entity.DonghoInfo; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import com.icontrols.kakao.entity.ThingsInfo; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.icontrols.kakao.repo.DonghoInfoRepository; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import com.icontrols.kakao.repo.ThingsInfoRepository; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.icontrols.kakao.service.KakaoExtensionService; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.icontrols.kakao.socket.wallpad.KakaoMsgHandler; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.icontrols.kakao.socket.wallpad.WallpadMsgSender; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -41,6 +43,9 @@ public class KakaoExtensionServiceImpl implements KakaoExtensionService { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	@Autowired 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	DonghoInfoRepository donghoRepository; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	@Autowired 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	ThingsInfoRepository thingsInfoRepository; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	@Override 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	public Map<String, Object> request_grantAuthorization(Map<String, Object> param) throws Exception { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		String dong_ho = JWTUtils2.getHomeIdFromToken((String)param.get(KEY_INFO.HTTP_KEY_AUTHORIZATION)); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -109,73 +114,52 @@ public class KakaoExtensionServiceImpl implements KakaoExtensionService { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		int dong = 802; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		int ho = 1103; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		Map <String, Object> body = (HashMap)param.get(KEY_INFO.HTTP_KEY_BODY); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		List<String> endpointIds = (ArrayList)body.get(KEY_INFO.BODY_KEY_ENDPOINT_IDS); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		List<String> unreachableIds = new ArrayList<String>(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		Map<String, Object> allDeviceMap = (Map<String, Object>) kMsgHandler.getDevicesStatusList(dong, ho).get(KEY_INFO.HTTP_KEY_BODY); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		List<CompletableFuture<Map<String, Object>>> fList = new ArrayList<>(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		body.clear(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		for(String endpointId:endpointIds) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			while(true) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    			if(asyncConfig.isTaskExecute()) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    				fList.add(wallpadMsgSender.getDeviceStatus(dong, ho, endpointId)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    				break; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    			} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    			Thread.sleep(1000); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		Map<String, Object> retMap = new HashMap<String, Object>(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		CompletableFuture.allOf(fList.toArray(new CompletableFuture[fList.size()])).join(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		logger.debug("******************************************************************************"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        logger.debug("								ASYNC D END"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        logger.debug("******************************************************************************"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-         
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        boolean isError = false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		for(CompletableFuture<Map<String, Object>> future:fList) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        	Map<String, Object> retMap = future.get(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        	 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        	String endpointId = (String)retMap.get(KEY_INFO.BODY_KEY_ENDPOINT_ID); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        	logger.debug(endpointId + "-------->" + retMap.toString()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        	 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        	if(retMap.containsKey(KEY_INFO.HTTP_KEY_ERROR)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        		Map<String, Object> errMap = (Map<String, Object>)retMap.get(KEY_INFO.HTTP_KEY_ERROR); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        		 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        		int errorCode = Integer.parseInt((String)errMap.get(KEY_INFO.ERROR_KEY_CODE)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        		logger.error("errror code == " + errorCode); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        		 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        		if(errorCode == KAKAO_RESULT.FAIL_UNREACHABLE) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        			unreachableIds.add(endpointId); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        			 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        			HashMap<String, Object> tmpMap = new HashMap<String, Object>(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        			tmpMap.put("power", "off"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        			retMap.clear(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        			retMap.put(endpointId, tmpMap); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        			 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        			retMap.remove(KEY_INFO.BODY_KEY_ENDPOINT_ID); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                	body.putAll(retMap); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        		} else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        			isError = true; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        			 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        			retMap.remove(KEY_INFO.BODY_KEY_ENDPOINT_ID); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        			body = retMap; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        			break; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		logger.info(allDeviceMap.toString()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		try { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			for(String endpointId:endpointIds) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				// 1. db 에서 해당 endpointId가 존재하는지 확인한다. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				// 없으면 endpointId가 잘못된것 -203 에러를 뱉자. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				List<ThingsInfo> thingsInfoList = thingsInfoRepository.findByDongAndHoAndEndpointId(Integer.toString(dong), Integer.toString(ho), endpointId); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				if(thingsInfoList == null || thingsInfoList.size() == 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					param.putAll(KAKAO_RESULT.getErrorInfo(KAKAO_RESULT.FAIL_NONEXIST)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					param.remove(KEY_INFO.HTTP_KEY_BODY); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					return param; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				// 2. allDeviceMap에서 해당 endpointId 를 조회하자. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				// 없으면 연결이 해제된것 unreachable 배열에 추가하자 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				Map<String, Object> state = new HashMap<String, Object>(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				if(!allDeviceMap.containsKey(endpointId)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					unreachableIds.add(endpointId); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					state.put("power", "off"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					logger.info("[" + endpointId + "] - unreachableId"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				}else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					state = (Map<String, Object>)((Map<String, Object>)allDeviceMap.get(endpointId)).get("state"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					logger.info("["+endpointId+"] - state = " + state ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				retMap.put(endpointId, state); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		if(!isError) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			param.put(KEY_INFO.HTTP_KEY_UNREACHABLEIDS, unreachableIds); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			param.put(KEY_INFO.HTTP_KEY_BODY, body); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		}else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			body.remove(KEY_INFO.BODY_KEY_ENDPOINT_IDS); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			body.putAll(retMap); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			param.put(KEY_INFO.HTTP_KEY_UNREACHABLEIDS, unreachableIds); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		}catch(Exception e) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			param.putAll(KAKAO_RESULT.getErrorInfo(KAKAO_RESULT.FAIL_INTERNAL)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			param.remove(KEY_INFO.HTTP_KEY_BODY); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			param.putAll(body); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			e.printStackTrace(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			return param; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		return param; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -196,11 +180,16 @@ public class KakaoExtensionServiceImpl implements KakaoExtensionService { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		@SuppressWarnings("unchecked") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		Map<String, Object> desired = (HashMap<String, Object>)body.get(KEY_INFO.BODY_KEY_DESIRED); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		Map<String, Object> retMap = null; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		String endpointId = (String)body.get(KEY_INFO.BODY_KEY_ENDPOINT_ID); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		String capabilityName = (String)body.get(KEY_INFO.BODY_KEY_CAPABILITY_NAME); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		Map<String, Object> retMap = kMsgHandler.sendDeviceAction(dong, ho, endpointId, capabilityName, desired); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		List<ThingsInfo> thingsInfoList = thingsInfoRepository.findByDongAndHoAndEndpointId(Integer.toString(dong), Integer.toString(ho), endpointId); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		if(thingsInfoList == null || thingsInfoList.size() == 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			retMap = KAKAO_RESULT.getErrorInfo(KAKAO_RESULT.FAIL_NONEXIST); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		}else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			retMap = kMsgHandler.sendDeviceAction(dong, ho, endpointId, capabilityName, desired); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		if(retMap.containsKey(KEY_INFO.HTTP_KEY_ERROR)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			param.putAll(retMap); 
			 |