-
Notifications
You must be signed in to change notification settings - Fork 2
/
ContextBuildingPluralMultilingualStringSerializer.java
46 lines (41 loc) · 2.17 KB
/
ContextBuildingPluralMultilingualStringSerializer.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
package cz.cvut.kbss.jsonld.serialization.serializer.context;
import cz.cvut.kbss.jopa.model.MultilingualString;
import cz.cvut.kbss.jsonld.JsonLd;
import cz.cvut.kbss.jsonld.serialization.JsonNodeFactory;
import cz.cvut.kbss.jsonld.serialization.model.CollectionNode;
import cz.cvut.kbss.jsonld.serialization.model.ObjectNode;
import cz.cvut.kbss.jsonld.serialization.serializer.ValueSerializer;
import cz.cvut.kbss.jsonld.serialization.traversal.SerializationContext;
import java.util.*;
public class ContextBuildingPluralMultilingualStringSerializer implements ValueSerializer<Collection<MultilingualString>> {
@Override
public ObjectNode serialize(Collection<MultilingualString> value,
SerializationContext<Collection<MultilingualString>> ctx) {
if (ctx.getTerm() != null) {
registerTermMapping(ctx);
}
final Map<String, Set<String>> allValues = new HashMap<>();
value.forEach(ms -> ms.getValue().forEach((lang, text) -> {
allValues.putIfAbsent(lang, new LinkedHashSet<>());
allValues.get(lang).add(text);
}));
final ObjectNode node = JsonNodeFactory.createObjectNode(ctx.getTerm());
allValues.forEach((lang, texts) -> {
final String langKey = lang != null ? lang : JsonLd.NONE;
if (texts.size() == 1) {
node.addItem(JsonNodeFactory.createLiteralNode(langKey, texts.iterator().next()));
} else {
final CollectionNode<?> translations = JsonNodeFactory.createCollectionNodeFromArray(langKey);
texts.forEach(t -> translations.addItem(JsonNodeFactory.createLiteralNode(t)));
node.addItem(translations);
}
});
return node;
}
static void registerTermMapping(SerializationContext<Collection<MultilingualString>> ctx) {
final ObjectNode mapping = JsonNodeFactory.createObjectNode(ctx.getFieldName());
mapping.addItem(JsonNodeFactory.createLiteralNode(JsonLd.ID, ctx.getTerm()));
mapping.addItem(JsonNodeFactory.createLiteralNode(JsonLd.CONTAINER, JsonLd.LANGUAGE));
ctx.registerTermMapping(ctx.getFieldName(), mapping);
}
}