1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.any23.extractor.yaml;
18
19 import com.google.common.collect.Sets;
20 import java.util.HashSet;
21 import java.util.List;
22 import java.util.Map;
23 import org.apache.any23.rdf.RDFUtils;
24 import org.apache.any23.vocab.YAML;
25 import org.eclipse.rdf4j.model.BNode;
26 import org.eclipse.rdf4j.model.IRI;
27 import org.eclipse.rdf4j.model.Literal;
28 import org.eclipse.rdf4j.model.Model;
29 import org.eclipse.rdf4j.model.ModelFactory;
30 import org.eclipse.rdf4j.model.Resource;
31 import org.eclipse.rdf4j.model.Value;
32 import org.eclipse.rdf4j.model.ValueFactory;
33 import org.eclipse.rdf4j.model.impl.LinkedHashModelFactory;
34 import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
35 import org.eclipse.rdf4j.model.util.Literals;
36 import org.eclipse.rdf4j.model.vocabulary.RDF;
37 import org.eclipse.rdf4j.model.vocabulary.RDFS;
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52 public class ElementsProcessor {
53
54 private final ModelFactory modelFactory = new LinkedHashModelFactory();
55 private final YAML vocab = YAML.getInstance();
56 protected ValueFactory vf = SimpleValueFactory.getInstance();
57
58 private static final ElementsProcessorlementsProcessor.html#ElementsProcessor">ElementsProcessor _ep = new ElementsProcessor();
59
60
61 private ElementsProcessor() {
62 }
63
64
65
66
67
68 public static class ModelHolder {
69 private final Value root;
70 private final Model model;
71
72 public ModelHolder(Value root, Model model) {
73 this.root = root;
74 this.model = model;
75 }
76
77 public Value getRoot() {
78 return root;
79 }
80
81 public Model getModel() {
82 return model;
83 }
84 }
85
86 private ModelHolder asModelHolder(Value v, Model m) {
87 return new ModelHolder(v, m);
88 }
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106 @SuppressWarnings("unchecked")
107 public ModelHolder asModel(IRI namespace, final Object t, Value rootNode) {
108
109 if (t instanceof List) {
110 return processList(namespace, (List<Object>) t);
111 } else if (t instanceof Map) {
112 return processMap(namespace, (Map<String, Object>) t, rootNode);
113 } else if (t instanceof String) {
114 return asModelHolder(RDFUtils.makeIRI(t.toString()), modelFactory.createEmptyModel());
115 } else if (t == null) {
116 return asModelHolder(vocab.nullValue, modelFactory.createEmptyModel());
117 } else {
118 return asModelHolder(Literals.createLiteral(vf, t), modelFactory.createEmptyModel());
119 }
120 }
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136 protected ModelHolder processMap(IRI ns, Map<String, Object> object, Value parentNode) {
137
138 if (object.isEmpty()) {
139 return null;
140 }
141 HashSet<Object> vals = Sets.newHashSet(object.values());
142 boolean isEmpty = false;
143 if (vals.size() == 1 && vals.contains(null)) {
144 isEmpty = true;
145 }
146 assert ns != null : "Namespace value is null";
147
148 Model model = modelFactory.createEmptyModel();
149 Value nodeURI = parentNode instanceof BNode ? RDFUtils.makeIRI("node", ns, true) : parentNode;
150
151 if (!isEmpty) {
152 model.add(vf.createStatement((Resource) nodeURI, RDF.TYPE, vocab.mapping));
153 }
154 object.keySet().forEach((k) -> {
155
156
157
158
159 Resource predicate = RDFUtils.makeIRI(k, ns, false);
160
161
162
163 model.add(vf.createStatement(predicate, RDF.TYPE, RDF.PREDICATE));
164 model.add(vf.createStatement(predicate, RDFS.LABEL, RDFUtils.literal(k)));
165 Value subGraphRoot = RDFUtils.makeIRI();
166 ModelHolder valInst = asModel(ns, object.get(k), subGraphRoot);
167
168 if (valInst != null) {
169
170
171
172
173 model.add(vf.createStatement((Resource) nodeURI, (IRI) predicate, valInst.root));
174 if (valInst.model != null) {
175 model.addAll(valInst.model);
176 }
177 }
178
179 });
180 return asModelHolder(nodeURI, model);
181 }
182
183 protected ModelHolder processList(IRI ns, List<Object> object) {
184
185 if (object.isEmpty() || object.stream().noneMatch((i) -> {
186 return i != null;
187 })) {
188 return null;
189 }
190 assert ns != null : "Namespace value is null";
191
192 int objectSize = object.size();
193 Value listRoot = null;
194 Resource prevNode = null;
195 Model finalModel = modelFactory.createEmptyModel();
196 for (int i = 0; i < objectSize; i++) {
197 ModelHolder node = asModel(ns, object.get(i), RDFUtils.bnode());
198 BNode currentNode = RDFUtils.bnode();
199
200 if (i == 0) {
201 listRoot = currentNode;
202 }
203
204 finalModel.add(currentNode, RDF.FIRST, node.root, (Resource[]) null);
205
206 if (prevNode != null) {
207 finalModel.add(prevNode, RDF.REST, currentNode, (Resource[]) null);
208 }
209
210 if (i == objectSize - 1) {
211 finalModel.add(currentNode, RDF.REST, RDF.NIL, (Resource[]) null);
212 }
213
214 if (node.model != null) {
215 finalModel.addAll(node.model);
216 }
217
218 prevNode = currentNode;
219 }
220
221 return asModelHolder(listRoot, finalModel);
222 }
223
224 public static final ElementsProcessor getInstance() {
225 return _ep;
226 }
227 }