Skip to content

Method: initializeTargetClassResolver()

1: /*
2: * JB4JSON-LD
3: * Copyright (C) 2024 Czech Technical University in Prague
4: *
5: * This library is free software; you can redistribute it and/or
6: * modify it under the terms of the GNU Lesser General Public
7: * License as published by the Free Software Foundation; either
8: * version 3.0 of the License, or (at your option) any later version.
9: *
10: * This library is distributed in the hope that it will be useful,
11: * but WITHOUT ANY WARRANTY; without even the implied warranty of
12: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13: * Lesser General Public License for more details.
14: *
15: * You should have received a copy of the GNU Lesser General Public
16: * License along with this library.
17: */
18: package cz.cvut.kbss.jsonld.deserialization;
19:
20: import cz.cvut.kbss.jopa.model.annotations.OWLClass;
21: import cz.cvut.kbss.jsonld.ConfigParam;
22: import cz.cvut.kbss.jsonld.Configuration;
23: import cz.cvut.kbss.jsonld.common.BeanAnnotationProcessor;
24: import cz.cvut.kbss.jsonld.common.Configured;
25: import cz.cvut.kbss.jsonld.deserialization.expanded.ExpandedJsonLdDeserializer;
26: import cz.cvut.kbss.jsonld.deserialization.util.ClasspathScanner;
27: import cz.cvut.kbss.jsonld.deserialization.util.TargetClassResolver;
28: import cz.cvut.kbss.jsonld.deserialization.util.TargetClassResolverConfig;
29: import cz.cvut.kbss.jsonld.deserialization.util.TypeMap;
30: import jakarta.json.JsonValue;
31:
32: import java.util.Objects;
33:
34: /**
35: * Takes a pre-processed JSON-LD structure and deserializes it.
36: */
37: public abstract class JsonLdDeserializer implements Configured {
38:
39: private final Configuration configuration;
40:
41: protected final TargetClassResolver classResolver;
42:
43: protected ValueDeserializers deserializers = new CommonValueDeserializers();
44:
45: protected JsonLdDeserializer() {
46: this.configuration = new Configuration();
47: this.classResolver = initializeTargetClassResolver();
48: }
49:
50: protected JsonLdDeserializer(Configuration configuration) {
51: this.configuration = Objects.requireNonNull(configuration);
52: this.classResolver = initializeTargetClassResolver();
53: }
54:
55: private TargetClassResolver initializeTargetClassResolver() {
56: final TypeMap typeMap = new TypeMap();
57: final String scanPath = configuration.get(ConfigParam.SCAN_PACKAGE, "");
58: new ClasspathScanner(c -> {
59: final OWLClass ann = c.getDeclaredAnnotation(OWLClass.class);
60: if (ann != null) {
61: typeMap.register(BeanAnnotationProcessor.expandIriIfNecessary(ann.iri(), c), c);
62: }
63: }).processClasses(scanPath);
64: return new TargetClassResolver(typeMap,
65: new TargetClassResolverConfig(
66: configuration.is(ConfigParam.ASSUME_TARGET_TYPE),
67: configuration().is(ConfigParam.ENABLE_OPTIMISTIC_TARGET_TYPE_RESOLUTION),
68: configuration().is(ConfigParam.PREFER_SUPERCLASS)));
69: }
70:
71: @Override
72: public Configuration configuration() {
73: return configuration;
74: }
75:
76: /**
77: * Registers a custom deserializer for the specified type.
78: * <p>
79: * If a deserializer already existed for the type, it is replaced by the new one.
80: *
81: * @param type Target type to register the deserializer for
82: * @param deserializer Deserializer to register
83: * @param <T> Target type
84: */
85: public <T> void registerDeserializer(Class<T> type, ValueDeserializer<T> deserializer) {
86: Objects.requireNonNull(type);
87: Objects.requireNonNull(deserializer);
88: deserializers.registerDeserializer(type, deserializer);
89: }
90:
91: /**
92: * Deserializes the specified JSON-LD data.
93: *
94: * @param <T> The type of the target object
95: * @param jsonLd JSON-LD structure
96: * @param resultClass Type of the result instance
97: * @return Deserialized Java instance
98: */
99: public abstract <T> T deserialize(JsonValue jsonLd, Class<T> resultClass);
100:
101: /**
102: * Creates deserializer for expanded JSON-LD, initialized with the specified configuration.
103: *
104: * @param configuration Configuration of the deserializer
105: * @return New deserializer
106: */
107: public static JsonLdDeserializer createExpandedDeserializer(Configuration configuration) {
108: return new ExpandedJsonLdDeserializer(configuration);
109: }
110:
111: /**
112: * Creates deserializer for expanded JSON-LD.
113: *
114: * @return New deserializer
115: */
116: public static JsonLdDeserializer createExpandedDeserializer() {
117: return new ExpandedJsonLdDeserializer();
118: }
119: }