package net.northking.cctp.element.json;

import net.northking.cctp.element.core.AbstractLibrary;
import net.northking.cctp.element.core.annotation.Library;
import net.northking.cctp.element.core.type.LibraryConstant;
import net.northking.cctp.element.util.Javadoc2Libdoc;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * <p>这是一个用于验证和修改JSON数据的测试组件库。</p>
 * JSON组件库有以下主要用途：<br>
 * <li>
 * 将JSON的字符串解析为JSON数据对象，并从中查找某些节点以进行进一步分析（例如 getNode、setNode）。
 * </li>
 * <li>
 * 获取节点的值（例如：getNode）。
 * </li>
 * <li>
 * 修改节点、添加节点（例如：setNode）。
 * </li>
 * <br>
 * <span style="font-size: 120%;"><b>示例</b></span><br>
 * 下面的简单示例演示如何解析JSON并验证其内容以及如何使用jsonPath表达式查找、新增、修改、删除节点。
 * <pre>
 * bookstore =>{
 * 	"bookstore": {
 * 		"book": [{
 * 				"title": {
 * 					"lang": "eng",
 * 					"text": "Harry Potter"
 *                                },
 * 				"price": "29.99"
 *            },
 *            {
 * 				"title": {
 * 					"lang": "eng",
 * 					"text": "Learning XML"
 *                },
 * 				"price": "39.95"
 *            }]
 *        }
 *  }
 *
 *  =>
 *  // 获取节点
 *  first  =    getNode('root', '$.bookstore.book[0]');
 *  // 修改节点
 *  setNode('root', "$.bookstore.book[1].title.text", 'Learning XML1');
 *  // 新增节点
 *  setNode('root', "$.bookstore.book[2]", '{"title":{"lang":"eng2","text":"Learning XML2"}, "price": "59.8"}');
 * </pre>
 * <span style="font-size: 120%;"><b>JSONPath</b></span><br>
 * JSON Path 使用路径表达式来选取JSON文档中的节点或节点集。<br>
 * <br>
 * <b>选取节点</b><br>
 * <table style="border-collapse:collapse" border="1" cellspacing="0" width="90%">
 * <tr>
 * <td width=250><b>表达式</b></td>
 * <td><b>描述</b></td>
 * </tr>
 * <tr>
 * <td>nodename</td>
 * <td>选取此节点的所有子节点。</td>
 * </tr>
 * <tr>
 * <td>$</td>
 * <td>从根节点选取。</td>
 * </tr>
 * <tr>
 * <td>..</td>
 * <td>从匹配选择的当前节点选择文档中的节点，而不考虑它们的位置。</td>
 * </tr>
 * <tr>
 * <td>@</td>
 * <td>选取当前节点。</td>
 * </tr>
 * <tr>
 * <td>[]</td>
 * <td>迭代器标识，可以在里面做简单的迭代操作，如数组下标，根据内容选值等。</td>
 * </tr>
 * <tr>
 * <td>*</td>
 * <td>匹配任何节点。</td>
 * </tr>
 * </table>
 * <br>
 * <b>常用实例</b><br>
 * <table style="border-collapse:collapse" border="1" cellspacing="0" width="90%">
 * <tr>
 * <td width=250><b>路径表达式</b></td>
 * <td><b>描述</b></td>
 * </tr>
 * <tr>
 * <td>$.bookstore</td>
 * <td>选取根节点 bookstore。</td>
 * </tr>
 * <tr>
 * <td>$..book</td>
 * <td>选取所有 book 子节点，而不管它们在文档中的位置。</td>
 * </tr>
 * <tr>
 * <td>$.bookstore..book</td>
 * <td>选择属于 bookstore 节点的后代的所有 book 节点，而不管它们位于 bookstore 之下的什么位置。</td>
 * </tr>
 * <tr>
 * <td>$.bookstore.book[1]</td>
 * <td>选取属于 bookstore 子节点的第一个 book 节点。</td>
 * </tr>
 * <tr>
 * <td>$.bookstore.book[price>'35.00']</td>
 * <td>选取 bookstore 节点的所有 book 节点，且其中的 price 节点的值须大于 35.00。</td>
 * </tr>
 * <tr>
 * <td>$.bookstore*</td>
 * <td>选取 bookstore 节点的所有子节点。</td>
 * </tr>
 * </table>
 */
@Library(scanBasePackage = "net.northking.cctp.element.json", infoClass = JSONLibrary.class)
public class JSONLibrary extends AbstractLibrary {

    private static final Logger logger = LoggerFactory.getLogger(JSONLibrary.class);
    private static final Javadoc2Libdoc JAVA_DOC_2_LIB_DOC = new Javadoc2Libdoc(JSONLibrary.class);
    private static final String NAME = "NK.JSON";
    private static final String VERSION = "2.5.3";
    private static final String CH_NAME = "JSON组件库";
    private static final Integer TYPE = LibraryConstant.LIB_TYPE_COMMON;

    @Override
    public String getName() {
        return NAME;
    }

    /**
     * 库中文名称
     *
     * @return
     */
    @Override
    public String getChName() {
        return CH_NAME;
    }

    @Override
    public String getVersion() {
        return VERSION;
    }

    /**
     * 组件库类别
     *
     * @return
     */
    @Override
    public Integer getType() {
        return TYPE;
    }

    @Override
    public Javadoc2Libdoc getLibDoc() {
        return JAVA_DOC_2_LIB_DOC;
    }

    @Override
    public void destroy() {
        logger.info("destroy done.");
    }
}