소스 동기화

This commit is contained in:
JSYOO 2021-07-23 16:23:41 +09:00
commit e740c21f84
9 changed files with 1198 additions and 1131 deletions

View File

@ -10,7 +10,7 @@
<noticeNo>1</noticeNo> <noticeNo>1</noticeNo>
<noticeType>101</noticeType> <noticeType>101</noticeType>
<title>공지사항 테스트</title> <title>공지사항 테스트</title>
<readCount>55</readCount> <readCount>15</readCount>
<regDate>2021-07-19</regDate> <regDate>2021-07-19</regDate>
</record> </record>
<record> <record>
@ -90,5 +90,6 @@
<readCount>55</readCount> <readCount>55</readCount>
<regDate>2021-07-19</regDate> <regDate>2021-07-19</regDate>
</record> </record>
<end>3333</end>
</result> </result>

View File

@ -164,13 +164,6 @@
<version>53.1</version> <version>53.1</version>
</dependency> </dependency>
<!-- XML-Map 변환 기능을 위한 추가 (DIGITALSHIP KNKIM 2021.06.15)-->
<dependency>
<groupId>com.thoughtworks.xstream</groupId>
<artifactId>xstream</artifactId>
<version>1.4.4</version>
</dependency>
<!-- XML/자바객체 변환 (DIGITALSHIP KNKIM 2021.06.21)--> <!-- XML/자바객체 변환 (DIGITALSHIP KNKIM 2021.06.21)-->
<dependency> <dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId> <groupId>com.fasterxml.jackson.dataformat</groupId>

View File

@ -1,95 +0,0 @@
package nlib.cmm.util;
import java.util.AbstractMap;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import com.thoughtworks.xstream.converters.Converter;
import com.thoughtworks.xstream.converters.MarshallingContext;
import com.thoughtworks.xstream.converters.UnmarshallingContext;
import com.thoughtworks.xstream.io.HierarchicalStreamReader;
import com.thoughtworks.xstream.io.HierarchicalStreamWriter;
/**
* <pre>
* @Class Name : MapEntryConverter.java
*
* @Description : XML 문자열을 Map 객체로 변환 처리
*
*
* @프로젝트명: 지방문화원 통합자료관리시스템 구축사업 (2021)
*
* </pre>
*
* @ ------------ -------- ---------------------------
* @ 수정일 수정자 수정내용
* @ ------------ -------- ---------------------------
* @ 2021. 6. 22. KNKIM 최초 생성
*
*
* @author 이씨플라자 * DIGITALSHIP KNKIM
* @since 2021. 6. 22.
* @version 1.0
*
*/
public class MapEntryConverter implements Converter {
public boolean canConvert(Class clazz) {
return AbstractMap.class.isAssignableFrom(clazz);
}
public void marshal(Object value, HierarchicalStreamWriter writer, MarshallingContext context) {
AbstractMap map = (AbstractMap) value;
for (Object obj : map.entrySet()) {
Entry entry = (Entry) obj;
Object entryValue = entry.getValue();
if (entryValue instanceof Map) {
writer.startNode(entry.getKey().toString());
marshal(entry.getValue(), writer, context);
writer.endNode();
continue;
}
writer.startNode(entry.getKey().toString());
writer.setValue(entryValue.toString());
writer.endNode();
}
}
public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext context) {
Map<String, Object> map = new HashMap<String, Object>();
while (reader.hasMoreChildren()) {
reader.moveDown();
if (reader.hasMoreChildren()) {
Map<String, Object> childMap = new HashMap<String, Object>();
map.put(reader.getNodeName(), childMap);
unmarshalHierarchical(reader, context, childMap);
reader.moveUp();
continue;
}
map.put(reader.getNodeName(), reader.getValue());
reader.moveUp();
}
return map;
}
private void unmarshalHierarchical(HierarchicalStreamReader reader, UnmarshallingContext context,
Map<String, Object> map) {
while (reader.hasMoreChildren()) {
reader.moveDown();
if (reader.hasMoreChildren()) {
Map<String, Object> childMap = new HashMap<String, Object>();
map.put(reader.getNodeName(), childMap);
unmarshalHierarchical(reader, context, childMap);
reader.moveUp();
continue;
}
map.put(reader.getNodeName(), reader.getValue());
reader.moveUp();
}
}
}

View File

@ -9,9 +9,6 @@ import org.springframework.http.HttpMethod;
import org.springframework.util.LinkedMultiValueMap; import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap; import org.springframework.util.MultiValueMap;
import com.thoughtworks.xstream.XStream;
import nlib.cmm.util.MapEntryConverter;
import nlib.util.StringUtil; import nlib.util.StringUtil;
/** /**
@ -166,14 +163,10 @@ public interface DataApiInterface {
public static DataApiResVO convertXmlToResVO(String xmlStr) { public static DataApiResVO convertXmlToResVO(String xmlStr) {
DataApiResVO resVO = new DataApiResVO(); DataApiResVO resVO = new DataApiResVO();
XStream magicApi = new XStream();
magicApi.registerConverter(new MapEntryConverter());
magicApi.alias("result", Map.class);
Map<String, Object> map = null; Map<String, Object> map = null;
try { try {
map = (Map<String, Object>) magicApi.fromXML(xmlStr); map = XmlConverter.convert(xmlStr);
} catch(Exception e) { } catch(Exception e) {
e.printStackTrace(); e.printStackTrace();

View File

@ -1,9 +1,12 @@
package nlib.restful.service; package nlib.restful.service;
import java.io.ByteArrayInputStream;
import java.io.FileInputStream; import java.io.FileInputStream;
import java.io.FileNotFoundException; import java.io.FileNotFoundException;
import java.io.InputStream; import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.List;
import javax.xml.stream.XMLEventReader; import javax.xml.stream.XMLEventReader;
import javax.xml.stream.XMLInputFactory; import javax.xml.stream.XMLInputFactory;
@ -11,69 +14,226 @@ import javax.xml.stream.XMLStreamException;
import javax.xml.stream.events.StartElement; import javax.xml.stream.events.StartElement;
import javax.xml.stream.events.XMLEvent; import javax.xml.stream.events.XMLEvent;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import nlib.sample.web.SampleEncoderController;
import nlib.util.StringUtil;
public class XmlConverter { public class XmlConverter {
@SuppressWarnings("restriction") private static final Logger log = LoggerFactory.getLogger(XmlConverter.class);
public static void main(String argv[]) {
String inputFile = "C:/iams/workspace/nlib/data/dataxml/uac.service.board.qna.list_GET.xml"; public static HashMap<String, Object> convert(String xmlStr) throws Exception {
HashMap<String, String> resMap = new HashMap<String, String>();
if(xmlStr == null) return null;
ByteArrayInputStream bIn = new ByteArrayInputStream(xmlStr.getBytes());
HashMap<String, Object> resMap = new HashMap<String, Object>();
try { try {
// First create a new XMLInputFactory
XMLInputFactory inputFactory = XMLInputFactory.newInstance(); XMLInputFactory inputFactory = XMLInputFactory.newInstance();
// Setup a new eventReader XMLEventReader eventReader = inputFactory.createXMLEventReader(bIn);
InputStream in = new FileInputStream(inputFile);
XMLEventReader eventReader = inputFactory.createXMLEventReader(in);
// Read the XML document
int depth = 0; resMap = getElementValue("result", eventReader, null);
log.debug("Converting XML to HashMap : Done >> " + resMap);
} catch (XMLStreamException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
return resMap;
}
/**
* @param rootElementName
* @param eventReader
* @param alreadyRootOpened : 부모 요소 찾기 없이 작업 진행할지 여부. false인 경우, rootElementName 요소를 찾아서 이후 추출 수행
* @param startElement
* @return
* @throws Exception
*/
public static HashMap<String, Object> getElementValue(
String rootElementName
, XMLEventReader eventReader
, XMLEvent firstChildElement) throws Exception {
HashMap<String, Object> retMap = new HashMap<String, Object>();
try {
int depth = (firstChildElement == null ? 0 : 1);
StartElement startElement = null; StartElement startElement = null;
while (eventReader.hasNext()) { XMLEvent event = firstChildElement;
XMLEvent event = eventReader.nextEvent();
System.out.println(" -> " + event); String upperElementName = null;
String elementName = null; String elementName = null; //(firstChildElement == null ? null : firstChildElement.asStartElement().getName().getLocalPart());
String elementValue = null; String content = null;
String elementValue = "";
HashMap<String, String> elementValues = null; HashMap<String, String> elementValues = null;
boolean hasSubElements = false;
boolean isFirst = true;
if (event.isStartElement()) { while (eventReader.hasNext()) {
startElement = event.asStartElement(); // 이벤트가 함께 매개변수로 넘어온 경우, 처음 읽기 생략
if(!isFirst || event == null) {
event = eventReader.nextEvent();
}
if (startElement.getName().getLocalPart().equals("result")) { if(isFirst) isFirst = false;
// 1 레벨 엘리먼트 찾기
if (depth == 0 && event.isStartElement() && event.asStartElement().getName().getLocalPart().equals(rootElementName)) {
depth++; depth++;
event = eventReader.nextEvent();
System.out.println(" > " + event);
// result의 하위 엘리먼트 시작 찾기
while (!event.isStartElement()) {
event = eventReader.nextEvent();
System.out.println(" 하위엘리먼트 시작전: " + event);
}
while (!event.isEndElement()) {
if (event.isCharacters()) {
String content = event.asCharacters().getData();
System.out.println("content: -" + content + "_");
}
event = eventReader.nextEvent();
System.out.println(" >> " + event);
}
event = eventReader.nextEvent();
System.out.println(" >>> " + event);
continue; continue;
} }
// 1 레벨 엘리먼트내의 2 레벨 엘리먼트 찾기
if(depth == 1 && elementName == null && event.isStartElement()) {
elementName = event.asStartElement().getName().getLocalPart();
elementValue = "";
elementValues = null;
hasSubElements = false;
depth++;
continue;
} }
// 2 레벨 엘리먼트 내용 찾기
if(depth == 2 && elementName != null && event.isCharacters()) {
content = event.asCharacters().getData();
if(StringUtil.isNotEmpty(content)) {
elementValue += content;
} }
} catch (FileNotFoundException e) { continue;
System.out.println("File not Found: " + inputFile); }
// 2 레벨 엘리먼트 종료
if(depth == 2 && elementName != null && event.isEndElement()) {
if(!elementName.equals(event.asEndElement().getName().getLocalPart())) {
throw new Exception("XML문의 요소 시작/종료 태그가 일치하지 않습니다. : " + elementName + " 요소가 " + event.asEndElement().getName().getLocalPart() + "로 종료되었습니다.");
}
addValue(retMap, elementName, elementValue);
System.out.println(elementName + " : -" + elementValue + "_");
elementName = null;
elementValue = "";
depth--;
}
// 2 레벨 엘리먼트 > 하위 엘리먼트 존재하는 경우
if(depth == 2 && elementName != null && event.isStartElement()) {
HashMap<String, Object> subMap = getElementValue(elementName, eventReader, event);
addValue(retMap, elementName, subMap);
depth--;
elementName = null;
}
// 1 레벨 엘리먼트 종료된 경우, 돌아가기
if(depth == 1 && elementName == null && event.isEndElement() && rootElementName.equals(event.asEndElement().getName().getLocalPart())) {
depth--;
return retMap;
}
} // while
} catch (XMLStreamException e) { } catch (XMLStreamException e) {
e.printStackTrace(); e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
} }
System.out.println("END");
return retMap;
} }
public static void addValue(HashMap<String, Object> map, String key, Object value) throws Exception {
if(map == null) throw new Exception("값을 넣을 Map 변수가 초기화되지 않았습니다.");
if(key == null) return;
if(value == null) return;
Object curValObj = map.get(key);
if(curValObj == null) {
map.put(key, value);
return;
}
if(curValObj instanceof String || curValObj instanceof HashMap) {
List<Object> values = new ArrayList<Object>();
values.add(curValObj);
values.add(value);
map.put(key, values);
} else if(curValObj instanceof List) {
((ArrayList<Object>)curValObj).add(value);
}
return;
}
/*
public static void main(String argv[]) throws Exception {
XmlConverter xmlConverter = new XmlConverter();
String xmlStr = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\r\n" +
"<!-- uac.service.board.qna_GET.xml -->\r\n" +
"<result>\r\n" +
" <code>S</code>\r\n" +
" <message>성공적으로 조회되었습니다.</message>\r\n" +
" <records>10</records>\r\n" +
" <page>1</page>\r\n" +
" <totPages>15</totPages>\r\n" +
" <record>\r\n" +
" <noticeNo>1</noticeNo>\r\n" +
" <noticeType>101</noticeType>\r\n" +
" <title>공지사항 테스트</title>\r\n" +
" <readCount>15</readCount>\r\n" +
" <regDate>2021-07-19</regDate>\r\n" +
" </record>\r\n" +
" <record>\r\n" +
" <noticeNo>2</noticeNo>\r\n" +
" <noticeType>101</noticeType>\r\n" +
" <title>공지사항 테스트</title>\r\n" +
" <readCount>55</readCount>\r\n" +
" <regDate>2021-07-19</regDate>\r\n" +
" </record>\r\n" +
" <record>\r\n" +
" <noticeNo>3</noticeNo>\r\n" +
" <noticeType>101</noticeType>\r\n" +
" <title>공지사항 테스트</title>\r\n" +
" <readCount>55</readCount>\r\n" +
" <regDate>2021-07-19</regDate>\r\n" +
" </record>\r\n" +
" <record>\r\n" +
" <noticeNo>4</noticeNo>\r\n" +
" <noticeType>101</noticeType>\r\n" +
" <title>공지사항 테스트</title>\r\n" +
" <readCount>55</readCount>\r\n" +
" <regDate>2021-07-19</regDate>\r\n" +
" </record>\r\n" +
" <record>\r\n" +
" <noticeNo>5</noticeNo>\r\n" +
" <noticeType>101</noticeType>\r\n" +
" <title>공지사항 테스트</title>\r\n" +
" <readCount>55</readCount>\r\n" +
" <regDate>2021-07-19</regDate>\r\n" +
" </record>\r\n" +
" <record>\r\n" +
" <noticeNo>6</noticeNo>\r\n" +
" <noticeType>101</noticeType>\r\n" +
" <title>공지사항 테스트</title>\r\n" +
" <readCount>55</readCount>\r\n" +
" <regDate>2021-07-19</regDate>\r\n" +
" </record>\r\n" +
" <end>3333</end>\r\n" +
"</result>";
HashMap<String, Object> resMap = xmlConverter.convert(xmlStr);
}
*/
} }

View File

@ -32,56 +32,57 @@ public class NlibLoginVO implements Serializable {
private static final long serialVersionUID = -8274004534207618049L; private static final long serialVersionUID = -8274004534207618049L;
/** 아이디 */ /** 아이디 */
private String id; private String id = null;
/** 이름 */ /** 이름 */
private String name; private String name = null;
/** 주민등록번호 */ /** 주민등록번호 */
private String ihidNum; private String ihidNum = null;
/** 이메일주소 */ /** 이메일주소 */
private String email; private String email = null;
/** 비밀번호 */ /** 비밀번호 */
private String password; private String password = null;
/** 비밀번호 힌트 */ /** 비밀번호 힌트 */
private String passwordHint; private String passwordHint = null;
/** 비밀번호 정답 */ /** 비밀번호 정답 */
private String passwordCnsr; private String passwordCnsr = null;
/** 사용자구분 */ /** 사용자구분 */
private String userSe; private String userSe = null;
/** 조직(부서)ID */ /** 조직(부서)ID */
private String orgnztId; private String orgnztId = null;
/** 조직(부서)명 */ /** 조직(부서)명 */
private String orgnztNm; private String orgnztNm = null;
/** 고유아이디 */ /** 고유아이디 */
private String uniqId; private String uniqId = null;
/** 로그인 후 이동할 페이지 */ /** 로그인 후 이동할 페이지 */
private String url; private String url = null;
/** 사용자 IP정보 */ /** 사용자 IP정보 */
private String ip; private String ip = null;
/** GPKI인증 DN */ /** GPKI인증 DN */
private String dn; private String dn = null;
/** 인증키 */ /** 인증키 */
private String authKey; private String authKey = null;
/** 페이지번호 */ /** 페이지번호 */
private String page; private String page = null;
/** 게시물 수 */ /** 게시물 수 */
private String rows; private String rows = null;
/** 핸드폰 번호 */ /** 핸드폰 번호 */
private String phone; private String phone = null;
/** 우편번호 */ /** 우편번호 */
private String zipNo; private String zipNo = null;
/** 도로명주소 */ /** 도로명주소 */
private String roadAddrPart; private String roadAddrPart = null;
/** 상세주소 */ /** 상세주소 */
private String addrDetail; private String addrDetail = null;
/** 생년월일 */ /** 생년월일 */
private String birthday; private String birthday = null;
/** 생일 년도 */ /** 생일 년도 */
private String birth_yy; private String birth_yy = null;
/** 생일 월 */ /** 생일 월 */
private String birth_mm; private String birth_mm = null;
/** 생일 날짜 */ /** 생일 날짜 */
private String birth_dd; private String birth_dd = null;
public String getAuthKey() { public String getAuthKey() {
return authKey; return authKey;

View File

@ -40,6 +40,16 @@ public class StringUtil extends EgovStringUtil {
return str == null || str.trim().length() == 0; return str == null || str.trim().length() == 0;
} }
/**
* Null이 아니고 빈문자열(공백 포함) 아닌 일반 문자가 존재하는 , true를 리턴한다.
*
* @param str
* @return
*/
public static boolean isNotEmpty(String str) {
return !isEmpty(str);
}
/** /**
* 문자열을 정수형으로 변환하여 리턴한다. 만일 문자열이 null 또는 문자열인 경우, -1을 리턴한다. * 문자열을 정수형으로 변환하여 리턴한다. 만일 문자열이 null 또는 문자열인 경우, -1을 리턴한다.
* *

View File

@ -148,7 +148,9 @@ $("#jsGrid").jsGrid({
/* 이하만 설정 */ /* 이하만 설정 */
/*
data: clients, data: clients,
*/
fields: [ fields: [
{ title:"번호", name: "noticeNo" , type: "number" , width: 50, align: "center"}, { title:"번호", name: "noticeNo" , type: "number" , width: 50, align: "center"},
@ -178,7 +180,9 @@ function fn_search_article() {
data: JSON.stringify(inputData), data: JSON.stringify(inputData),
dataType:'json', /* Server Response Data Type */ dataType:'json', /* Server Response Data Type */
success: function(returnData, status){ success: function(returnData, status){
alert("returnData=" + JSON.stringify(returnData)); var jsonObj = JSON.parse(returnData);
alert("record=" + JSON.stringify(jsonObj.info.record));
$("#jsGrid").jsGrid("loadData", jsonObj.info.record)
}, },
error: function(data){ error: function(data){
alert("조회에 실패하였습니다.\n" + data.code + " : " + data.message); alert("조회에 실패하였습니다.\n" + data.code + " : " + data.message);