Skip to content

Method: LocalModel(boolean)

1: /**
2: * Copyright (C) 2022 Czech Technical University in Prague
3: *
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: *
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.ontodriver.jena.connector;
16:
17: import org.apache.jena.query.Dataset;
18: import org.apache.jena.query.DatasetFactory;
19: import org.apache.jena.rdf.model.*;
20:
21: import java.util.*;
22:
23: /**
24: * Tracks transactional changes.
25: */
26: class LocalModel {
27:
28: private final Dataset added;
29: private final Dataset removed;
30:
31: /**
32: * Whether default graph should be treated as union of all graphs.
33: */
34: private final boolean defaultAsUnion;
35:
36: enum Containment {
37: ADDED, REMOVED, UNKNOWN
38: }
39:
40: LocalModel(boolean defaultAsUnion) {
41: this.added = DatasetFactory.create();
42: this.removed = DatasetFactory.create();
43: this.defaultAsUnion = defaultAsUnion;
44: }
45:
46: Collection<Statement> enhanceStatements(Collection<Statement> statements, Resource subject, Property property,
47: RDFNode value, Collection<String> contexts) {
48: if (contexts.isEmpty()) {
49: return enhanceStatements(statements, subject, property, value, addedDefault(), removedDefault());
50: } else {
51: Collection<Statement> enhanced = statements;
52: for (String ctx : contexts) {
53: enhanced = enhanceStatements(statements, subject, property, value, added.getNamedModel(ctx),
54: removed.getNamedModel(ctx));
55: }
56: return enhanced;
57: }
58: }
59:
60: private Model addedDefault() {
61: return defaultAsUnion ? added.getUnionModel().union(added.getDefaultModel()) : added.getDefaultModel();
62: }
63:
64: private Model removedDefault() {
65: return defaultAsUnion ? removed.getUnionModel().union(removed.getDefaultModel()) : removed.getDefaultModel();
66: }
67:
68: private static Collection<Statement> enhanceStatements(Collection<Statement> toEnhance, Resource subject,
69: Property property, RDFNode value, Model addedModel,
70: Model removedModel) {
71: final Set<Statement> statements = new HashSet<>(toEnhance);
72: statements.addAll(addedModel.listStatements(subject, property, value).toList());
73: removedModel.listStatements(subject, property, value).toList().forEach(statements::remove);
74: return statements;
75: }
76:
77: Containment contains(Resource subject, Property property, RDFNode value, Collection<String> contexts) {
78: if (contexts.isEmpty()) {
79: if (removedDefault().contains(subject, property, value)) {
80: return Containment.REMOVED;
81: } else {
82: return addedDefault().contains(subject, property, value) ? Containment.ADDED :
83: Containment.UNKNOWN;
84: }
85: } else {
86: Containment result = Containment.UNKNOWN;
87: for (String c : contexts) {
88: if (removed.getNamedModel(c).contains(subject, property, value)) {
89: return Containment.REMOVED;
90: } else if (added.getNamedModel(c).contains(subject, property, value)) {
91: result = Containment.ADDED;
92: }
93: }
94: return result;
95: }
96: }
97:
98: void addStatements(List<Statement> statements, String context) {
99: registerStatements(statements, context, added, removed);
100: }
101:
102: private void registerStatements(List<Statement> statements, String context, Dataset addTo, Dataset removeFrom) {
103: if (context != null) {
104: addTo.getNamedModel(context).add(statements);
105: removeFrom.getNamedModel(context).remove(statements);
106: } else {
107: addTo.getDefaultModel().add(statements);
108: removeFrom.getDefaultModel().remove(statements);
109: if (defaultAsUnion) {
110: removeFrom.listNames().forEachRemaining(n -> removeFrom.getNamedModel(n).remove(statements));
111: }
112: }
113: }
114:
115: void removeStatements(List<Statement> statements, String context) {
116: registerStatements(statements, context, removed, added);
117: }
118:
119: Dataset getAdded() {
120: return added;
121: }
122:
123: Dataset getRemoved() {
124: return removed;
125: }
126:
127: List<String> getContexts() {
128: final Iterator<String> it = added.listNames();
129: final List<String> contexts = new ArrayList<>();
130: it.forEachRemaining(contexts::add);
131: return contexts;
132: }
133: }