Skip to content

Method: translationsToLangStrings(MultilingualString)

1: /*
2: * JOPA
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.jopa.oom;
19:
20: import cz.cvut.kbss.jopa.exceptions.CardinalityConstraintViolatedException;
21: import cz.cvut.kbss.jopa.model.MultilingualString;
22: import cz.cvut.kbss.jopa.model.descriptors.Descriptor;
23: import cz.cvut.kbss.jopa.model.metamodel.AbstractAttribute;
24: import cz.cvut.kbss.jopa.model.metamodel.EntityType;
25: import cz.cvut.kbss.jopa.utils.EntityPropertiesUtils;
26: import cz.cvut.kbss.ontodriver.model.*;
27:
28: import java.util.Collection;
29: import java.util.Collections;
30: import java.util.Set;
31: import java.util.stream.Collectors;
32: import java.util.stream.Stream;
33:
34: class SingularMultilingualStringFieldStrategy<X>
35: extends DataPropertyFieldStrategy<AbstractAttribute<? super X, MultilingualString>, X> {
36:
37: private MultilingualString value;
38:
39: SingularMultilingualStringFieldStrategy(EntityType<X> et, AbstractAttribute<? super X, MultilingualString> att,
40: Descriptor entityDescriptor, EntityMappingHelper mapper) {
41: super(et, att, entityDescriptor, mapper);
42: }
43:
44: @Override
45: void addAxiomValue(Axiom<?> ax) {
46: if (value == null) {
47: this.value = new MultilingualString();
48: }
49: final Value<?> axiomValue = ax.getValue();
50: if (axiomValue.getValue() instanceof LangString lsAxiomValue) {
51: verifyCardinality(lsAxiomValue.getLanguage().orElse(null), ax.getSubject());
52: value.set(lsAxiomValue.getLanguage().orElse(null), lsAxiomValue.getValue());
53: } else {
54: value.set(axiomValue.stringValue());
55: }
56: }
57:
58: private void verifyCardinality(String language, NamedResource subject) {
59: if (language != null && value.contains(language)) {
60: throw new CardinalityConstraintViolatedException(String.format(
61: "Expected single value with language tag %s of attribute %s of instance <%s>, but got multiple.",
62: language, attribute.getName(), subject));
63: } else if (language == null && value.containsSimple()) {
64: throw new CardinalityConstraintViolatedException(String.format(
65: "Expected single simple literal value of attribute %s of instance <%s>, but got multiple.",
66: attribute.getName(), subject));
67: }
68: }
69:
70: @Override
71: boolean hasValue() {
72: return value != null;
73: }
74:
75: @Override
76: void buildInstanceFieldValue(Object instance) {
77: setValueOnInstance(instance, value);
78: }
79:
80: @Override
81: void buildAxiomValuesFromInstance(X instance, AxiomValueGatherer valueBuilder) {
82: final MultilingualString attValue = (MultilingualString) extractFieldValueFromInstance(instance);
83: if (attValue == null || attValue.isEmpty()) {
84: valueBuilder.addValue(createAssertion(), Value.nullValue(), getAttributeWriteContext());
85: } else {
86: valueBuilder.addValues(createAssertion(), translationsToLangStrings(attValue).collect(Collectors.toList()), getAttributeWriteContext());
87: }
88: }
89:
90: static Stream<Value<?>> translationsToLangStrings(MultilingualString str) {
91: return str.getValue().entrySet().stream().map(e -> new Value<>(new LangString(e.getValue(), e.getKey())));
92: }
93:
94: @Override
95: Set<Axiom<?>> buildAxiomsFromInstance(X instance) {
96: final MultilingualString attValue = (MultilingualString) extractFieldValueFromInstance(instance);
97: if (attValue == null || attValue.isEmpty()) {
98: return Collections.emptySet();
99: } else {
100: final NamedResource id = NamedResource.create(EntityPropertiesUtils.getIdentifier(instance, et));
101: final Assertion assertion = createAssertion();
102: return translationsToLangStrings(attValue).map(v -> new AxiomImpl<>(id, assertion, v)).collect(
103: Collectors.toSet());
104: }
105: }
106:
107: @Override
108: Collection<Value<?>> toAxiomValue(Object value) {
109: assert value instanceof MultilingualString;
110: return translationsToLangStrings((MultilingualString) value).collect(Collectors.toList());
111: }
112: }