Skip to content

Method: createExpandedDeserializer(Configuration)

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