/
CTFJsonMetadataNode.java
170 lines (149 loc) · 4.51 KB
/
CTFJsonMetadataNode.java
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
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
/*******************************************************************************
* Copyright (c) 2023 Ericsson
*
* All rights reserved. This program and the accompanying materials are made
* available under the terms of the Eclipse Public License 2.0 which
* accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Sehr Moosabhoy - Initial implementation
*******************************************************************************/
package org.eclipse.tracecompass.internal.ctf.core.event.metadata;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import org.eclipse.tracecompass.ctf.core.CTFException;
import org.eclipse.tracecompass.internal.ctf.core.event.types.ICTFMetadataNode;
import com.google.gson.annotations.SerializedName;
/**
* Nodes used to store one fragment of JSON Metadata for CTF2
*
* @author Sehr Moosabhoy
*/
public class CTFJsonMetadataNode implements ICTFMetadataNode {
//deserialized attributes from Json
@SerializedName("type")
private String fType;
@SerializedName("user-attributes")
private Map<String, String> fUserAttributes;
//other attributes added for convenience
private ICTFMetadataNode fParent;
private Map<String, ICTFMetadataNode> fChildren;
private ArrayList<ICTFMetadataNode> fChildrenList;
private final String fValue;
/**
* Constructor for a CTFJsonMetadataNode
*
* @param parent
* the parent node
* @param type
* the fragment type of the node
* @param value
* the value of the node
*/
public CTFJsonMetadataNode(ICTFMetadataNode parent, String type, String value) {
fParent = parent;
if (parent != null) {
parent.addChild(this);
}
fType = Objects.requireNonNull(type);
fValue = value;
fChildren = new HashMap<>();
fChildrenList = new ArrayList<>();
}
@Override
public ICTFMetadataNode getParent() {
return fParent;
}
@Override
public ICTFMetadataNode getChild(String id) {
return fChildren.get(id);
}
@Override
public ICTFMetadataNode getChild(int index) {
return fChildrenList.get(index);
}
@Override
public String getText() {
return fValue;
}
@Override
public String getType() {
return fType;
}
@Override
public void setParent(ICTFMetadataNode node) {
fParent = node;
}
@Override
public void addChild(ICTFMetadataNode node) {
fChildren.put(node.getType(), node);
fChildrenList.add(node);
}
@Override
public List<ICTFMetadataNode> getChildren() {
return fChildrenList;
}
@Override
public int getChildCount() {
return fChildrenList.size();
}
@Override
public ICTFMetadataNode getFirstChildWithType(String typeDeclaratorList) {
for (ICTFMetadataNode child : fChildrenList) {
if (child.getType().equals(typeDeclaratorList)) {
return child;
}
}
return null;
}
/**
* Get the user attributes of the node
*
* @return the userAttributes
*/
public Map<String, String> getUserAttributes() {
return fUserAttributes;
}
/**
* Set the type of the node, specifically used for nodes that do not have a
* type when created such as JsonStructureFieldMemberMetadataNode
*
* @param type
* the new type of the node
*/
public void setType(String type) {
fType = Objects.requireNonNull(type);
}
/**
* Set the childrenList of the node
*
* @param childrenList
* the children of the node
*/
public void setChildrenList(List<ICTFMetadataNode> childrenList) {
fChildrenList = (ArrayList<ICTFMetadataNode>) childrenList;
}
/**
* Helper method to initialize fields that aren't set by gson library
*
* @throws CTFException
* if type is null but node is created with gson
*/
public void initialize() throws CTFException {
if (fChildren == null) {
fChildren = new HashMap<>();
}
if (fChildrenList == null) {
fChildrenList = new ArrayList<>();
}
if (fType == null) {
throw new CTFException("type of node cannot be null"); //$NON-NLS-1$
}
}
}