xiejun
2024-11-01 80b6cbfc9c861469146318d0b3dd5f8b8b525b8a
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
package org.springblade.core.mongo.utils;
 
import com.fasterxml.jackson.databind.JsonNode;
import lombok.Getter;
import org.springframework.util.Assert;
 
import java.util.LinkedList;
import java.util.StringJoiner;
 
/**
 * json tree 节点信息
 *
 * @author L.cm
 */
public class JsonNodeInfo {
    /**
     * mongo keys: class1.class2.item
     */
    private volatile String nodeKeys;
    /**
     * jsonPath语法:/class1/class2/item
     */
    private volatile String nodePath;
    /**
     * 节点关系
     */
    @Getter
    private final LinkedList<String> elements;
    /**
     * tree 的 叶子节点,此处为引用
     */
    @Getter
    private final JsonNode leafNode;
 
    public JsonNodeInfo(LinkedList<String> elements, JsonNode leafNode) {
        Assert.notNull(elements, "elements can not be null.");
        this.nodeKeys = null;
        this.nodePath = null;
        this.elements = elements;
        this.leafNode = leafNode;
    }
 
    /**
     * 获取 mongo db的 key 语法
     * @return mongo db的 key 语法
     */
    public String getNodeKeys() {
        if (nodeKeys == null) {
            synchronized (this) {
                if (nodeKeys == null) {
                    StringJoiner nodeKeysJoiner = new StringJoiner(".");
                    elements.forEach(nodeKeysJoiner::add);
                    nodeKeys = nodeKeysJoiner.toString();
                }
            }
        }
        return nodeKeys;
    }
 
    /**
     * 获取 json path 语法路径
     * @return jsonPath 路径
     */
    public String getNodePath() {
        if (nodePath == null) {
            synchronized (this) {
                if (nodePath == null) {
                    StringJoiner nodePathJoiner = new StringJoiner("/", "/", "");
                    elements.forEach(nodePathJoiner::add);
                    nodePath = nodePathJoiner.toString();
                }
            }
        }
        return nodePath;
    }
 
    /**
     * 获取第一个元素
     * @return element
     */
    public String getFirst() {
        return elements.getFirst();
    }
 
}