-
Notifications
You must be signed in to change notification settings - Fork 2
/
JsonNodeFactory.java
168 lines (149 loc) · 5.97 KB
/
JsonNodeFactory.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
/**
* Copyright (C) 2020 Czech Technical University in Prague
* <p>
* This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public
* License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later
* version.
* <p>
* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
* details. You should have received a copy of the GNU General Public License along with this program. If not, see
* <http://www.gnu.org/licenses/>.
*/
package cz.cvut.kbss.jsonld.serialization;
import cz.cvut.kbss.jsonld.common.CollectionType;
import cz.cvut.kbss.jsonld.serialization.model.*;
import java.util.Collection;
import java.util.Date;
import java.util.List;
import java.util.Set;
/**
* Factory for constructing {@link JsonNode} instances.
*/
public class JsonNodeFactory {
private JsonNodeFactory() {
throw new AssertionError();
}
private enum LiteralType {
BOOLEAN, NUMBER, STRING, TEMPORAL
}
public static LiteralNode<?> createLiteralNode(Object value) {
return createLiteralNode(null, value);
}
public static LiteralNode<?> createLiteralNode(String name, Object value) {
final LiteralType type = determineLiteralType(value);
LiteralNode<?> node = null;
switch (type) {
case BOOLEAN:
node = name != null ? new BooleanLiteralNode(name, (Boolean) value) : new BooleanLiteralNode(
(Boolean) value);
break;
case NUMBER:
node = name != null ? new NumericLiteralNode<>(name, (Number) value) :
new NumericLiteralNode<>((Number) value);
break;
case STRING:
node = name != null ? new StringLiteralNode(name, value.toString()) :
new StringLiteralNode(value.toString());
break;
case TEMPORAL:
node = TemporalNodeFactory.createLiteralNode(name, value);
break;
}
return node;
}
private static LiteralType determineLiteralType(Object value) {
if (value instanceof Boolean) {
return LiteralType.BOOLEAN;
} else if (value instanceof Number) {
return LiteralType.NUMBER;
} else if (value instanceof Date) {
return LiteralType.TEMPORAL;
}
return LiteralType.STRING;
}
/**
* Creates a node for representing a single translation of a string value.
*
* @param value String value
* @param language Language tag for the value
* @return A node representing the language tagged value
*/
public static LangStringNode createLangStringNode(String value, String language) {
return new LangStringNode(value, language);
}
/**
* Creates a node for representing a single translation of a string value.
* <p>
* Usually, multiple translations are expected which are put into a collection. But if there is only one translation
* in the multilingual string, this method may be used to directly serialize the attribute.
*
* @param name Attribute name
* @param value String value
* @param language Language tag for the value
* @return A node representing the language tagged value
*/
public static LangStringNode createLangStringNode(String name, String value, String language) {
return new LangStringNode(name, value, language);
}
/**
* Creates collection node for the specified collection.
* <p>
* The node is without name, so it cannot be used as attribute.
*
* @param value The collection. It is used only to determine the type of the target node, no values are added to the
* result
* @return An empty collection node
*/
public static CollectionNode createCollectionNode(Collection<?> value) {
return createCollectionNode(null, value);
}
/**
* Creates collection node with the specified name, for the specified collection.
*
* @param name Name of the node (attribute)
* @param value The collection. It is used only to determine the type of the target node, no values are added to the
* result
* @return An empty collection node
*/
public static CollectionNode createCollectionNode(String name, Collection<?> value) {
final CollectionType type = determineCollectionType(value);
CollectionNode n = null;
switch (type) {
case LIST:
n = name != null ? new ListNode(name) : new ListNode();
break;
case SET:
n = name != null ? new SetNode(name) : new SetNode();
break;
}
return n;
}
private static CollectionType determineCollectionType(Collection<?> collection) {
if (collection instanceof List) {
return CollectionType.LIST;
} else if (collection instanceof Set) {
return CollectionType.SET;
} else {
throw new IllegalArgumentException("Unsupported collection type " + collection.getClass());
}
}
public static CollectionNode createCollectionNodeFromArray() {
return new SetNode();
}
public static CollectionNode createCollectionNodeFromArray(String name) {
return new SetNode(name);
}
public static ObjectNode createObjectNode() {
return new ObjectNode();
}
public static ObjectNode createObjectNode(String name) {
return new ObjectNode(name);
}
public static ObjectIdNode createObjectIdNode(Object id) {
return new ObjectIdNode(id.toString());
}
public static ObjectIdNode createObjectIdNode(String name, Object id) {
return new ObjectIdNode(name, id.toString());
}
}