Skip to content

Method: ContextBuildingTypesSerializer.ContextBasedTypesNode(SerializationContext)

1: package cz.cvut.kbss.jsonld.serialization.serializer.context;
2:
3: import cz.cvut.kbss.jsonld.JsonLd;
4: import cz.cvut.kbss.jsonld.serialization.JsonGenerator;
5: import cz.cvut.kbss.jsonld.serialization.JsonNodeFactory;
6: import cz.cvut.kbss.jsonld.serialization.model.CollectionNode;
7: import cz.cvut.kbss.jsonld.serialization.model.JsonNode;
8: import cz.cvut.kbss.jsonld.serialization.model.SetNode;
9: import cz.cvut.kbss.jsonld.serialization.serializer.ValueSerializer;
10: import cz.cvut.kbss.jsonld.serialization.traversal.SerializationContext;
11:
12: import java.io.IOException;
13: import java.util.Optional;
14: import java.util.Set;
15:
16: public class ContextBuildingTypesSerializer implements ValueSerializer<Set<String>> {
17:
18: @Override
19: public JsonNode serialize(Set<String> value, SerializationContext<Set<String>> ctx) {
20: final CollectionNode<?> typesNode;
21: if (ctx.getField() != null) {
22: ctx.registerTermMapping(ctx.getFieldName(), JsonLd.TYPE);
23: typesNode = JsonNodeFactory.createSetNode(ctx.getTerm());
24: } else {
25: typesNode = new ContextBasedTypesNode(ctx);
26: }
27: value.forEach(type -> typesNode.addItem(JsonNodeFactory.createLiteralNode(type)));
28: return typesNode;
29: }
30:
31: /**
32: * JSON node representing types ({@link JsonLd#TYPE}).
33: * <p>
34: * Allows overriding the default JSON attribute when a term mapping for types is provided deeper in the object
35: * graph. For example, when an instance without a {@link cz.cvut.kbss.jopa.model.annotations.Types} is serialized,
36: * its type would be serialized in the {@link JsonLd#TYPE} attribute. But if it also references an object with a
37: * {@link cz.cvut.kbss.jopa.model.annotations.Types} field, the field name will be used for term mapping in the
38: * context. This new name is applied to the types attribute representing the parent's type.
39: */
40: private static class ContextBasedTypesNode extends SetNode {
41:
42: private final SerializationContext<Set<String>> ctx;
43:
44: private ContextBasedTypesNode(SerializationContext<Set<String>> ctx) {
45: super(JsonLd.TYPE);
46: this.ctx = ctx;
47: }
48:
49: @Override
50: protected void writeKey(JsonGenerator writer) throws IOException {
51: final Optional<String> typesTerm = ctx.getMappedTerm(JsonLd.TYPE);
52: if (typesTerm.isPresent()) {
53: writer.writeFieldName(typesTerm.get());
54: } else {
55: super.writeKey(writer);
56: }
57: }
58: }
59: }