-
Notifications
You must be signed in to change notification settings - Fork 2
/
JsonNodeFactory.java
139 lines (122 loc) · 4.73 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
/**
* Copyright (C) 2017 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.net.URI;
import java.util.Collection;
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
}
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;
}
return node;
}
private static LiteralType determineLiteralType(Object value) {
if (value instanceof Boolean) {
return LiteralType.BOOLEAN;
} else if (value instanceof Number) {
return LiteralType.NUMBER;
}
return LiteralType.STRING;
}
/**
* 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(URI.create(id.toString()));
}
public static ObjectIdNode createObjectIdNode(String name, Object id) {
return new ObjectIdNode(name, URI.create(id.toString()));
}
}