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: valueSerializers.registerIndividualSerializer(new ContextBuildingIndividualSerializer());
54: final ContextBuildingTemporalSerializer ts = new ContextBuildingTemporalSerializer();
55: valueSerializers.registerSerializer(LocalDate.class, ts);
56: // Register the same temporal serializer for each of the types it supports (needed for key-based map access)
57: valueSerializers.registerSerializer(LocalDate.class, ts);
58: valueSerializers.registerSerializer(LocalTime.class, ts);
59: valueSerializers.registerSerializer(OffsetTime.class, ts);
60: valueSerializers.registerSerializer(LocalDateTime.class, ts);
61: valueSerializers.registerSerializer(OffsetDateTime.class, ts);
62: valueSerializers.registerSerializer(ZonedDateTime.class, ts);
63: valueSerializers.registerSerializer(Instant.class, ts);
64: valueSerializers.registerSerializer(Date.class, new DateSerializer(ts));
65: final ContextBuildingTemporalAmountSerializer tas = new ContextBuildingTemporalAmountSerializer();
66: valueSerializers.registerSerializer(Duration.class, tas);
67: valueSerializers.registerSerializer(Period.class, tas);
68: return valueSerializers;
69: }
70:
71: @Override
72: protected JsonNode buildJsonTree(Object root) {
73: final JsonLdContextFactory jsonLdContextFactory = new MappingJsonLdContextFactory();
74: final JsonLdContext rootContext = jsonLdContextFactory.createJsonLdContext();
75: final ObjectGraphTraverser traverser =
76: new ObjectGraphTraverser(new SerializationContextFactory(rootContext));
77: traverser.setRequireId(configuration().is(ConfigParam.REQUIRE_ID));
78:• if (root instanceof Collection) {
79: return buildObjectWithContextAndGraph(traverser, rootContext, jsonLdContextFactory, (Collection<?>) root);
80: }
81: final JsonLdTreeBuilder treeBuilder = initTreeBuilder(traverser, jsonLdContextFactory);
82: traverser.setVisitor(treeBuilder);
83: traverser.traverse(root);
84: ensureContextNodeNotPresent(treeBuilder.getTreeRoot(), rootContext.getContextNode());
85: treeBuilder.getTreeRoot().prependItem(rootContext.getContextNode());
86: return treeBuilder.getTreeRoot();
87: }
88:
89: private void ensureContextNodeNotPresent(CompositeNode<?> root, JsonNode rootCtx) {
90: final Optional<JsonNode> ctxNode =
91: root.getItems().stream().filter(n -> JsonLd.CONTEXT.equals(n.getName())).findAny();
92:• if (ctxNode.isPresent()) {
93: throw new AmbiguousTermMappingException(
94: "Unable to build context hierarchy. Attempted to add two root contexts. Original root context: " + rootCtx + ", conflicting: " + ctxNode.get());
95: }
96: }
97:
98: private JsonLdTreeBuilder initTreeBuilder(ObjectGraphTraverser traverser,
99: JsonLdContextFactory jsonLdContextFactory) {
100: final ContextBuildingObjectPropertyValueSerializer opSerializer = new ContextBuildingObjectPropertyValueSerializer(traverser);
101: opSerializer.configure(configuration());
102: return new JsonLdTreeBuilder(new ObjectGraphValueSerializers(serializers, opSerializer), jsonLdContextFactory);
103: }
104:
105: private JsonNode buildObjectWithContextAndGraph(ObjectGraphTraverser traverser, JsonLdContext rootContext,
106: JsonLdContextFactory jsonLdContextFactory,
107: Collection<?> items) {
108: final CollectionNode<?> graph = JsonNodeFactory.createCollectionNodeFromArray(JsonLd.GRAPH);
109: items.stream().map(item -> {
110: final JsonLdTreeBuilder treeBuilder = initTreeBuilder(traverser, jsonLdContextFactory);
111: traverser.setVisitor(treeBuilder);
112: traverser.traverse(item);
113: return treeBuilder.getTreeRoot();
114: }).forEach(graph::addItem);
115: final ObjectNode result = JsonNodeFactory.createObjectNode();
116: result.addItem(rootContext.getContextNode());
117: result.addItem(graph);
118: return result;
119: }
120: }