Search in sources :

Example 1 with SqlMapQuery

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;
}
Also used : SqlMapQuery(com.nhn.dbtool.query.parser.sqlmap.model.SqlMapQuery)

Example 2 with SqlMapQuery

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);
            }
        }
    }
}
Also used : SqlMapQuery(com.nhn.dbtool.query.parser.sqlmap.model.SqlMapQuery) SqlMapCondition(com.nhn.dbtool.query.parser.sqlmap.model.SqlMapCondition)

Example 3 with SqlMapQuery

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;
        }
    }
}
Also used : Node(org.dom4j.Node) SqlMapQuery(com.nhn.dbtool.query.parser.sqlmap.model.SqlMapQuery)

Example 4 with SqlMapQuery

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);
        }
    }
}
Also used : SqlMapQuery(com.nhn.dbtool.query.parser.sqlmap.model.SqlMapQuery) Document(org.dom4j.Document) DocumentException(org.dom4j.DocumentException) SqlMapCondition(com.nhn.dbtool.query.parser.sqlmap.model.SqlMapCondition)

Example 5 with SqlMapQuery

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;
        }
    }
}
Also used : Node(org.dom4j.Node) SqlMapQuery(com.nhn.dbtool.query.parser.sqlmap.model.SqlMapQuery)

Aggregations

SqlMapQuery (com.nhn.dbtool.query.parser.sqlmap.model.SqlMapQuery)6 SqlMapCondition (com.nhn.dbtool.query.parser.sqlmap.model.SqlMapCondition)3 Node (org.dom4j.Node)3 Document (org.dom4j.Document)1 DocumentException (org.dom4j.DocumentException)1