Package: ContextBuildingJsonLdSerializer
ContextBuildingJsonLdSerializer
name | instruction | branch | complexity | line | method | ||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
ContextBuildingJsonLdSerializer(JsonGenerator) |
|
|
|
|
|
||||||||||||||||||||
ContextBuildingJsonLdSerializer(JsonGenerator, Configuration) |
|
|
|
|
|
||||||||||||||||||||
buildJsonTree(Object) |
|
|
|
|
|
||||||||||||||||||||
buildObjectWithContextAndGraph(ObjectGraphTraverser, JsonLdContext, JsonLdContextFactory, Collection) |
|
|
|
|
|
||||||||||||||||||||
ensureContextNodeNotPresent(CompositeNode, JsonNode) |
|
|
|
|
|
||||||||||||||||||||
initSerializers() |
|
|
|
|
|
||||||||||||||||||||
initTreeBuilder(ObjectGraphTraverser, JsonLdContextFactory) |
|
|
|
|
|
||||||||||||||||||||
lambda$buildObjectWithContextAndGraph$1(ObjectGraphTraverser, JsonLdContextFactory, Object) |
|
|
|
|
|
||||||||||||||||||||
lambda$ensureContextNodeNotPresent$0(JsonNode) |
|
|
|
|
|
Coverage
1: package cz.cvut.kbss.jsonld.serialization;
2:
3: import cz.cvut.kbss.jopa.model.MultilingualString;
4: import cz.cvut.kbss.jsonld.ConfigParam;
5: import cz.cvut.kbss.jsonld.Configuration;
6: import cz.cvut.kbss.jsonld.JsonLd;
7: import cz.cvut.kbss.jsonld.exception.AmbiguousTermMappingException;
8: import cz.cvut.kbss.jsonld.serialization.context.JsonLdContext;
9: import cz.cvut.kbss.jsonld.serialization.context.JsonLdContextFactory;
10: import cz.cvut.kbss.jsonld.serialization.context.MappingJsonLdContextFactory;
11: import cz.cvut.kbss.jsonld.serialization.model.CollectionNode;
12: import cz.cvut.kbss.jsonld.serialization.model.CompositeNode;
13: import cz.cvut.kbss.jsonld.serialization.model.JsonNode;
14: import cz.cvut.kbss.jsonld.serialization.model.ObjectNode;
15: import cz.cvut.kbss.jsonld.serialization.serializer.LiteralValueSerializers;
16: import cz.cvut.kbss.jsonld.serialization.serializer.ObjectGraphValueSerializers;
17: import cz.cvut.kbss.jsonld.serialization.serializer.ValueSerializer;
18: import cz.cvut.kbss.jsonld.serialization.serializer.ValueSerializers;
19: import cz.cvut.kbss.jsonld.serialization.serializer.context.*;
20: import cz.cvut.kbss.jsonld.serialization.serializer.context.datetime.ContextBuildingTemporalAmountSerializer;
21: import cz.cvut.kbss.jsonld.serialization.serializer.context.datetime.ContextBuildingTemporalSerializer;
22: import cz.cvut.kbss.jsonld.serialization.serializer.datetime.DateSerializer;
23: import cz.cvut.kbss.jsonld.serialization.traversal.ObjectGraphTraverser;
24: import cz.cvut.kbss.jsonld.serialization.traversal.SerializationContextFactory;
25:
26: import java.time.*;
27: import java.util.Collection;
28: import java.util.Date;
29: import java.util.Optional;
30:
31: /**
32: * JSON-LD serializer outputting compacted JSON-LD with context.
33: */
34: public class ContextBuildingJsonLdSerializer extends JsonLdSerializer {
35:
36: ContextBuildingJsonLdSerializer(JsonGenerator jsonGenerator) {
37: super(jsonGenerator);
38: }
39:
40: ContextBuildingJsonLdSerializer(JsonGenerator jsonGenerator, Configuration configuration) {
41: super(jsonGenerator, configuration);
42: }
43:
44: @Override
45: protected ValueSerializers initSerializers() {
46: final ValueSerializer<MultilingualString> mlsSerializer = new ContextBuildingMultilingualStringSerializer();
47: final ValueSerializer<Collection<MultilingualString>> mlsColSerializer =
48: new ContextBuildingPluralMultilingualStringSerializer();
49: final LiteralValueSerializers valueSerializers =
50: new LiteralValueSerializers(new ContextBuildingDefaultValueSerializer(mlsSerializer, mlsColSerializer));
51: valueSerializers.registerIdentifierSerializer(new ContextBuildingIdentifierSerializer());
52: valueSerializers.registerTypesSerializer(new ContextBuildingTypesSerializer());
53: final ContextBuildingTemporalSerializer ts = new ContextBuildingTemporalSerializer();
54: valueSerializers.registerSerializer(LocalDate.class, ts);
55: // Register the same temporal serializer for each of the types it supports (needed for key-based map access)
56: valueSerializers.registerSerializer(LocalDate.class, ts);
57: valueSerializers.registerSerializer(LocalTime.class, ts);
58: valueSerializers.registerSerializer(OffsetTime.class, ts);
59: valueSerializers.registerSerializer(LocalDateTime.class, ts);
60: valueSerializers.registerSerializer(OffsetDateTime.class, ts);
61: valueSerializers.registerSerializer(ZonedDateTime.class, ts);
62: valueSerializers.registerSerializer(Instant.class, ts);
63: valueSerializers.registerSerializer(Date.class, new DateSerializer(ts));
64: final ContextBuildingTemporalAmountSerializer tas = new ContextBuildingTemporalAmountSerializer();
65: valueSerializers.registerSerializer(Duration.class, tas);
66: valueSerializers.registerSerializer(Period.class, tas);
67: return valueSerializers;
68: }
69:
70: @Override
71: protected JsonNode buildJsonTree(Object root) {
72: final JsonLdContextFactory jsonLdContextFactory = new MappingJsonLdContextFactory();
73: final JsonLdContext rootContext = jsonLdContextFactory.createJsonLdContext();
74: final ObjectGraphTraverser traverser =
75: new ObjectGraphTraverser(new SerializationContextFactory(rootContext));
76: traverser.setRequireId(configuration().is(ConfigParam.REQUIRE_ID));
77:• if (root instanceof Collection) {
78: return buildObjectWithContextAndGraph(traverser, rootContext, jsonLdContextFactory, (Collection<?>) root);
79: }
80: final JsonLdTreeBuilder treeBuilder = initTreeBuilder(traverser, jsonLdContextFactory);
81: traverser.setVisitor(treeBuilder);
82: traverser.traverse(root);
83: ensureContextNodeNotPresent(treeBuilder.getTreeRoot(), rootContext.getContextNode());
84: treeBuilder.getTreeRoot().prependItem(rootContext.getContextNode());
85: return treeBuilder.getTreeRoot();
86: }
87:
88: private void ensureContextNodeNotPresent(CompositeNode<?> root, JsonNode rootCtx) {
89: final Optional<JsonNode> ctxNode =
90: root.getItems().stream().filter(n -> JsonLd.CONTEXT.equals(n.getName())).findAny();
91:• if (ctxNode.isPresent()) {
92: throw new AmbiguousTermMappingException(
93: "Unable to build context hierarchy. Attempted to add two root contexts. Original root context: " + rootCtx + ", conflicting: " + ctxNode.get());
94: }
95: }
96:
97: private JsonLdTreeBuilder initTreeBuilder(ObjectGraphTraverser traverser,
98: JsonLdContextFactory jsonLdContextFactory) {
99: return new JsonLdTreeBuilder(new ObjectGraphValueSerializers(serializers,
100: new ContextBuildingObjectPropertyValueSerializer(
101: traverser)), jsonLdContextFactory);
102: }
103:
104: private JsonNode buildObjectWithContextAndGraph(ObjectGraphTraverser traverser, JsonLdContext rootContext,
105: JsonLdContextFactory jsonLdContextFactory,
106: Collection<?> items) {
107: final CollectionNode<?> graph = JsonNodeFactory.createCollectionNodeFromArray(JsonLd.GRAPH);
108: items.stream().map(item -> {
109: final JsonLdTreeBuilder treeBuilder = initTreeBuilder(traverser, jsonLdContextFactory);
110: traverser.setVisitor(treeBuilder);
111: traverser.traverse(item);
112: return treeBuilder.getTreeRoot();
113: }).forEach(graph::addItem);
114: final ObjectNode result = JsonNodeFactory.createObjectNode();
115: result.addItem(rootContext.getContextNode());
116: result.addItem(graph);
117: return result;
118: }
119: }