package nlib.sch.service.impl; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.Reader; import java.lang.reflect.Type; import java.net.URL; import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.List; import javax.annotation.Resource; import org.apache.commons.beanutils.BeanUtils; import org.json.JSONException; import org.json.JSONObject; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Value; import org.springframework.http.HttpEntity; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpMethod; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.http.converter.StringHttpMessageConverter; import org.springframework.stereotype.Service; import org.springframework.util.MultiValueMap; import org.springframework.web.client.RestTemplate; import com.google.gson.Gson; import com.google.gson.JsonArray; import com.google.gson.JsonObject; import com.google.gson.JsonParser; import com.google.gson.reflect.TypeToken; import nlib.sch.service.NlibSearchVO; import nlib.col.service.CollectionVO; import nlib.restful.DataApi; import nlib.restful.service.DataApiInterface; import nlib.restful.service.DataApiReqVO; import nlib.restful.service.DataApiResVO; import nlib.restful.service.impl.DataApiRESTful; import nlib.sch.service.NlibSearchCollectionVO; import nlib.sch.service.NlibSearchInterface; import nlib.sch.service.NlibSearchService; import nlib.util.StringUtil; @Service("nlibSearchService") public class NlibSearchServiceImpl implements NlibSearchService{ private static final Logger log = LoggerFactory.getLogger(NlibSearchServiceImpl.class); /* DataApi 접속 서버 정보 */ @Value("#{properties['search.searchIp']}") private String SEARCH_IP; @Value("#{properties['search.searchPort']}") private String SEARCH_PORT; @Value("#{properties['search.protocol']}") private String SEARCH_PROTOCOL; /** RESTFul API 송수신 모듈 */ @Resource(name = "dataApi") private DataApi dataApi; public NlibSearchVO getSearch(NlibSearchVO searchVO) throws Exception { try { //검색엔진 페이지 셋팅 searchVO.setListCount(Integer.toString(searchVO.getPageSize())); searchVO.setStartCount(Integer.toString(searchVO.getPageIndex())); String collectionTemp=""; String nameTemp=""; //----------------------------------- // 입력값 검증작업 //----------------------------------- /*resVO = DataApiInterface.checkReqCommonParams(reqVO); if(resVO != null) return resVO; HttpMethod method = reqVO.getReqMethod();*/ //----------------------------------- // 폼 파라메터 생성 작업 및 요청 처리 //----------------------------------- String url = SEARCH_PROTOCOL + "://" + SEARCH_IP + ("80".equals(SEARCH_PORT) ? "" : ":" + SEARCH_PORT) + "/searchApi/searchApi.jsp"; log.debug("REQ URL : " + url); HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED); ResponseEntity responseEntity = null; ResponseEntity allResponseEntity = null; RestTemplate restTemplate = new RestTemplate(); restTemplate.getMessageConverters() .add(0, new StringHttpMessageConverter(StandardCharsets.UTF_8)); //단일 탭 검색 MultiValueMap parameters= searchVO.getSearchMap(); //전체 검색 (각 탭별 count가 목적) collectionTemp = searchVO.getCollection(); if("".equals(StringUtil.getString(searchVO.getCollectionList(), "")) || "ALL".equals(StringUtil.getString(searchVO.getCollectionList(), ""))) { searchVO.setCollection("ALL"); }else { //상세검색시 콜렉션리스트만 카운트하기위해 추가. searchVO.setCollection(searchVO.getCollectionList()); } MultiValueMap allParameters= searchVO.getSearchMap(); searchVO.setCollection(collectionTemp); //post방식 parameters.forEach((k, v) -> log.debug("params > " + k + " : " + v)); allParameters.forEach((k, v) -> log.debug("allParams > " + k + " : " + v)); HttpEntity> requestEntity = new HttpEntity(parameters, headers); HttpEntity> allRequestEntity = new HttpEntity(allParameters, headers); responseEntity = restTemplate.postForEntity(url, requestEntity , String.class); allResponseEntity = restTemplate.postForEntity(url, allRequestEntity , String.class); //----------------------------------- // 응답 처리 //----------------------------------- HttpStatus statusCode = responseEntity.getStatusCode(); log.debug("RES StatusCode : " + statusCode); String resultXML = responseEntity.getBody(); log.debug("RES resultXML : " + resultXML); HttpStatus allStatusCode = allResponseEntity.getStatusCode(); log.debug("RES allStatusCode : " + allStatusCode); String allResultXML = allResponseEntity.getBody(); log.debug("RES allResultXML : " + allResultXML); //검색엔진 결과 json 파싱 JsonParser jsonParser = new JsonParser(); JsonObject jsonObject = null; JsonObject tmp = null; String collection = ""; String totalCount = ""; JsonArray jsonArray = null; //전체검색 결과 탭별 count jsonObject = (JsonObject) jsonParser.parse(allResultXML); jsonObject = (JsonObject) jsonObject.get("SearchQueryResult"); jsonArray = (JsonArray) jsonObject.get("Collection"); for(int i=0;i list = new ArrayList<>(); List> subjectMap = new ArrayList>(); List> typeMap = new ArrayList>(); List> orgMap = new ArrayList>(); String code=""; String code_up=""; int j; int k; for(int i=0;i0) { filterObject =(JsonObject) subjectList.get(0); filterObject = (JsonObject) filterObject.get("Categories"); subjectList = (JsonArray) filterObject.get("Category"); }; if(typeList.size()>0) { filterObject =(JsonObject) typeList.get(0); filterObject = (JsonObject) filterObject.get("Categories"); typeList = (JsonArray) filterObject.get("Category"); }; if(orgList.size()>0) { filterObject =(JsonObject) orgList.get(0); filterObject = (JsonObject) filterObject.get("Categories"); orgList = (JsonArray) filterObject.get("Category"); }; for(k = 0; k < subjectList.size(); k++){ HashMap temp = new HashMap(); filterObject = (JsonObject)subjectList.get(k); nameTemp = filterObject.get("Name").getAsString(); //상위코드값 code_up = nameTemp.substring(nameTemp.indexOf("@")+1,nameTemp.indexOf("^")); temp.put("category_nm_up",code_up); //코드값 code = nameTemp.substring(nameTemp.lastIndexOf("@")+1); temp.put("category_nm",code); temp.put("category_cnt",filterObject.get("Count").getAsString()); subjectMap.add(temp); } for(k = 0; k < typeList.size(); k++){ HashMap temp = new HashMap(); filterObject = (JsonObject)typeList.get(k); nameTemp = filterObject.get("Name").getAsString(); //상위코드값 code_up = nameTemp.substring(nameTemp.indexOf("@")+1,nameTemp.indexOf("^")); temp.put("class_nm_up",code_up); //코드값 code = nameTemp.substring(nameTemp.lastIndexOf("@")+1); temp.put("class_nm",code); temp.put("class_cnt",filterObject.get("Count").getAsString()); typeMap.add(temp); } for(k = 0; k < orgList.size(); k++){ HashMap temp = new HashMap(); filterObject = (JsonObject)orgList.get(k); nameTemp = filterObject.get("Name").getAsString(); if(!"null".equals(nameTemp)) { temp.put("org_nm",nameTemp); temp.put("org_cnt",filterObject.get("Count").getAsString()); orgMap.add(temp); } } } tmp = (JsonObject) tmp.get("DocumentSet"); searchVO.setTotalCount(tmp.get("TotalCount").getAsString()); colArray = (JsonArray) tmp.get("Document"); if(colArray != null) { //vo list로 json list 파싱 for(j=0;j Exception 발생 : " + e.toString()); } return searchVO; } }