use of com.nhn.dbtool.query.parser.sqlmap.model.SqlMapQuery in project cubrid-manager by CUBRID.
the class SqlMapQueryParser method createSqlMapQuery.
/**
* Element 타입의 node에서 Query 정보를 읽어 SqlMapQuery를 생성한다.
*
* @param node Element 타입의 node
* @return Query 정보가 포함된 SqlMapQuery
* @throws Exception
*/
private SqlMapQuery createSqlMapQuery(Node node) throws Exception {
SqlMapQuery query = new SqlMapQuery();
query.setType(node.getName());
query.setId(SqlMapParserUtil.getAttribute(node, "id"));
query.setParameterClass(SqlMapParserUtil.getAttribute(node, "parameterClass"));
logger.debug("[[node.asXML]]" + node.asXML());
// Element에서 하위 노드의 tag가 포함된 text를 읽기위해서는 node.asXML()를 사용하여야 하는데,
// 이때, Element 자체의 tag가 포함되어 있어 순수한 text값을 읽어들이기 위해서 해당 tag를 제거한다.
String text = SqlMapParserUtil.removeElementTag(node.asXML(), node.getName());
query.setQuery(text);
return query;
}
use of com.nhn.dbtool.query.parser.sqlmap.model.SqlMapQuery in project cubrid-manager by CUBRID.
the class Parser method mergeInclude.
/**
* 하위의 모든 SqlMapCondition 를 대상으로 Include Id에 해당 하는 Query의 파싱된 정보를 원본 Query 및 Condition 에 추가한다.
*
* @param sqlMapFile SqlMapFile
* @param query SqlMapQuery
* @param condition SqlMapCondition 리스트
*/
private void mergeInclude(SqlMapFile sqlMapFile, SqlMapQuery query, SqlMapCondition condition) {
// child condition 을 우선 처리
for (SqlMapCondition childCondition : condition.getChildConditionList()) {
// 재귀 호출
this.mergeInclude(sqlMapFile, query, childCondition);
}
// include 타입인 경우만 처리
if ("include".equals(condition.getType())) {
// refId attribute에서 namespace 부분 제거
String referenceId = condition.getRefid();
referenceId = referenceId.replace(sqlMapFile.getNamespace() + ".", "");
logger.debug("include id:" + referenceId);
// Include Id에 해당 하는 Query 가져오기
SqlMapQuery includeQuery = sqlMapFile.getQuery(referenceId);
if (includeQuery != null) {
// Include Id에 해당 하는 Query의 파싱된 정보를 원본 Query 및 Condition 에 추가
this.mergeInclude(query, condition, includeQuery);
} else if (refSqlHashMap != null) {
// Include Id 에 해당하는 Query 가 없는 경우 SqlMapQuery 해쉬맵에서 찾음
if (referenceId.contains(".")) {
includeQuery = refSqlHashMap.get(referenceId);
} else {
includeQuery = refSqlHashMap.get(sqlMapFile.getNamespace() + "." + referenceId);
}
if (includeQuery != null) {
mergeInclude(query, condition, includeQuery);
}
}
}
}
use of com.nhn.dbtool.query.parser.sqlmap.model.SqlMapQuery in project cubrid-manager by CUBRID.
the class Parser method loopSqlNode.
/**
* 멀티파일 include 처리위해 sql 엘리먼트 타입만 우선 파싱하여 SqlMapQuery 해쉬맵에 저장한다.
*
* @param document XML Document
* @param sqlMapFile SqlMapFile
* @throws Exception 예외
*/
private void loopSqlNode(Document document, SqlMapFile sqlMapFile) throws Exception {
String currentComment = "";
SqlMapQueryParser queryParser = new SqlMapQueryParser();
// rootElement 하위의 모든 Node를 읽어온다
// Node 타입이 COMMENT, ELEMENT인 경우에 따라 정보 수집
Iterator<?> nodeIterator = document.getRootElement().nodeIterator();
while (nodeIterator.hasNext()) {
Node node = (Node) nodeIterator.next();
switch(node.getNodeType()) {
case Node.COMMENT_NODE:
currentComment = node.getText();
break;
case Node.ELEMENT_NODE:
// 멀티파일 include 처리위해 sql 엘리먼트이면 SqlMapQuery 해쉬맵에 추가
if ("sql".equals(node.getName())) {
//Element 타입의 node에서 Query 정보를 읽어 SqlMapQuery를 생성한다.
SqlMapQuery query = queryParser.parse((Element) node);
// ELEMENT_NODE 직전에 읽어들인 Comment를 본 쿼리의 comment로 간주하여 설정한다.
query.setComment(currentComment.replaceAll("\t", ""));
// SqlMapQuery 해쉬맵에 추가
if (refSqlHashMap != null && "sql".equals(query.getType())) {
refSqlHashMap.put(sqlMapFile.getNamespace() + "." + query.getId().replace(sqlMapFile.getNamespace() + ".", ""), query);
}
}
currentComment = "";
break;
default:
currentComment = "";
break;
}
}
}
use of com.nhn.dbtool.query.parser.sqlmap.model.SqlMapQuery in project cubrid-manager by CUBRID.
the class Parser method parse.
public void parse(SqlMapFile sqlMapFile) throws Exception {
Document document;
if (StringUtils.isEmpty(sqlMapFile.getFileContent())) {
sqlMapFile.setErrorMessage(Messages.sqlmapEmptyContent);
throw new Exception(Messages.sqlmapEmptyContent);
}
// create a XML document with SQLMap document.
try {
document = createDocument(sqlMapFile.getFileContent());
} catch (Exception e) {
sqlMapFile.setErrorMessage(Messages.sqlmapInvalidFormat);
throw new Exception(Messages.sqlmapInvalidFormat, e);
}
// determine whether iBatis(sqlMap) or MyBatis(mapper) from the document header.
if (!isMapperXML(document)) {
sqlMapFile.setErrorMessage(Messages.sqlmapNoMybatisFormat);
throw new Exception(Messages.sqlmapNoMybatisFormat);
}
// generate a namespace
String namespace = SqlMapParserUtil.getAttribute(document.getRootElement(), "namespace");
sqlMapFile.setNamespace(namespace);
logger.debug("namespace:" + namespace);
// parse sqlmap document
try {
loopNode(document, sqlMapFile);
} catch (Exception e) {
sqlMapFile.setErrorMessage(Messages.sqlmapNoMybatisFormat);
throw new Exception(Messages.sqlmapNoMybatisFormat, e);
}
// replace <include refid=""></include> by referred sql through the refid
for (SqlMapQuery query : sqlMapFile.getSqlMapQueryList()) {
// find Include condition in queries
for (SqlMapCondition condition : query.getConditionList()) {
mergeInclude(sqlMapFile, query, condition);
}
}
}
use of com.nhn.dbtool.query.parser.sqlmap.model.SqlMapQuery in project cubrid-manager by CUBRID.
the class Parser method loopNode.
/**
* XML Document에서 Node 단위로 반복하여 Query를 추출하여 SqlMapFile에 담는다.
*
* @param document XML Document
* @param sqlMapFile
* @throws Exception
*/
private void loopNode(Document document, SqlMapFile sqlMapFile) throws Exception {
String currentComment = "";
SqlMapQueryParser queryParser = new SqlMapQueryParser();
// rootElement 하위의 모든 Node를 읽어온다
// Node 타입이 COMMENT, ELEMENT인 경우에 따라 정보 수집
Iterator<?> nodeIterator = document.getRootElement().nodeIterator();
while (nodeIterator.hasNext()) {
Node node = (Node) nodeIterator.next();
switch(node.getNodeType()) {
case Node.COMMENT_NODE:
currentComment = node.getText();
break;
case Node.ELEMENT_NODE:
// parsing 해야 할 element인지 확인
if (SqlMapParserUtil.isParsingTarget(node.getName())) {
//Element 타입의 node에서 Query 정보를 읽어 SqlMapQuery를 생성한다.
SqlMapQuery query = queryParser.parse((Element) node);
// ELEMENT_NODE 직전에 읽어들인 Comment를 본 쿼리의 comment로 간주하여 설정한다.
query.setComment(currentComment.replaceAll("\t", ""));
sqlMapFile.getSqlMapQueryList().add(query);
}
currentComment = "";
break;
case Node.TEXT_NODE:
break;
default:
currentComment = "";
break;
}
}
}
Aggregations