/**
 * 
 */
package com.plf.mybatis.utils;


import java.io.File;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

import com.plf.mybatis.constants.Constant;
import com.plf.mybatis.constants.Constant.SqlType;
import com.plf.mybatis.mapping.MappedStatement;
import com.plf.mybatis.session.Configuration;


/**
 * XmlUtil.java
 * 
 * @author PLF
 * @date 2019年3月7日
 */
public final class XmlUtil
{

    /**
     * readMapperXml
     * 
     * @param fileName
     * @param mappedStatements 
     * @see 
     */
    @SuppressWarnings("rawtypes")
    public static void readMapperXml(File fileName, Configuration configuration)
    {

        try
        {

            // 创建一个读取器
            SAXReader saxReader = new SAXReader();
            saxReader.setEncoding(Constant.CHARSET_UTF8);
            
            // 读取文件内容
            Document document = saxReader.read(fileName);

            // 获取xml中的根元素
            Element rootElement = document.getRootElement();

            // 不是beans根元素的,文件不对
            if (!Constant.XML_ROOT_LABEL.equals(rootElement.getName()))
            {
                System.err.println("mapper xml文件根元素不是mapper");
                return;
            }

            String namespace = rootElement.attributeValue(Constant.XML_SELECT_NAMESPACE);

            List<MappedStatement> statements = new ArrayList<>();
            for (Iterator iterator = rootElement.elementIterator(); iterator.hasNext();)
            {
                Element element = (Element)iterator.next();
                String eleName = element.getName();
                
                MappedStatement statement = new MappedStatement();
                
                if (SqlType.SELECT.value().equals(eleName))
                {
                    String resultType = element.attributeValue(Constant.XML_SELECT_RESULTTYPE);
                    statement.setResultType(resultType);
                    statement.setSqlCommandType(SqlType.SELECT);
                }
                else if (SqlType.UPDATE.value().equals(eleName))
                {
                    statement.setSqlCommandType(SqlType.UPDATE);
                }
                else
                {
                    // 其他标签自己实现
                    System.err.println("不支持此xml标签解析:" + eleName);
                    statement.setSqlCommandType(SqlType.DEFAULT);
                }

                //设置SQL的唯一ID
                String sqlId = namespace + "." + element.attributeValue(Constant.XML_ELEMENT_ID); 
                
                statement.setSqlId(sqlId);
                statement.setNamespace(namespace);
                statement.setSql(CommonUtis.stringTrim(element.getStringValue()));
                statements.add(statement);
                
                System.out.println(statement);
                configuration.addMappedStatement(sqlId, statement);
                
                //这里其实是在MapperRegistry中生产一个mapper对应的代理工厂
                configuration.addMapper(Class.forName(namespace));
            }

        }
        catch (Exception e)
        {
            e.printStackTrace();
        }

    }

}