forked from vivo-project/Vitro
-
Notifications
You must be signed in to change notification settings - Fork 0
/
RDFServiceModelMaker.java
168 lines (142 loc) · 3.94 KB
/
RDFServiceModelMaker.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
/* $This file is distributed under the terms of the license in LICENSE$ */
package edu.cornell.mannlib.vitro.webapp.dao.jena;
import java.util.Set;
import java.util.TreeSet;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.jena.graph.GraphMaker;
import org.apache.jena.rdf.model.Model;
import org.apache.jena.rdf.model.ModelMaker;
import org.apache.jena.rdf.model.ModelReader;
import org.apache.jena.shared.AlreadyExistsException;
import org.apache.jena.shared.CannotCreateException;
import org.apache.jena.shared.DoesNotExistException;
import org.apache.jena.util.iterator.ExtendedIterator;
import org.apache.jena.util.iterator.WrappedIterator;
import com.ibm.icu.text.Collator;
import edu.cornell.mannlib.vitro.webapp.rdfservice.RDFService;
import edu.cornell.mannlib.vitro.webapp.rdfservice.RDFServiceException;
public class RDFServiceModelMaker implements ModelMaker {
private final static Log log = LogFactory.getLog(RDFServiceModelMaker.class);
private RDFService service;
private RDFServiceDataset dataset;
public RDFServiceModelMaker(RDFService service) {
this.service = service;
this.dataset = new RDFServiceDataset(service);
}
@Override
public void close() {
dataset.close();
// service.close(); ?
}
@Override
public Model createModel(String name) {
Model model = getModel(name);
if (model == null) {
throw new CannotCreateException(name);
} else {
return model;
}
}
@Override
public Model createModel(String name, boolean strict) {
if (this.hasModel(name) && strict) {
throw new AlreadyExistsException(name);
} else {
return createModel(name);
}
}
@Override
public GraphMaker getGraphMaker() {
throw new UnsupportedOperationException("GraphMaker not supported by "
+ this.getClass().getName());
}
private Set<String> getModelNames() {
try {
@SuppressWarnings("unchecked")
Set<String> names = new TreeSet<>(Collator.getInstance());
names.addAll(service.getGraphURIs());
return names;
} catch (RDFServiceException e) {
throw new RuntimeException(e);
}
}
@Override
public boolean hasModel(String name) {
return getModelNames().contains(name);
}
@Override
public ExtendedIterator<String> listModels() {
return WrappedIterator.create(getModelNames().iterator());
}
@Override
public Model openModel(String name, boolean strict) {
if (strict && !this.hasModel(name)) {
throw new DoesNotExistException(name);
} else {
return getModel(name);
}
}
/**
* The contract says to disassociate the name while leaving the model
* undisturbed. However, you should then be able to create a new model with
* the same name, and that doesn't make any sense in this context.
*/
@Override
public void removeModel(String name) {
Model m = getModel(name);
m.removeAll();
}
@Override
public Model createDefaultModel() {
return dataset.getDefaultModel();
}
@Override
public Model createFreshModel() {
throw new UnsupportedOperationException(
"createFreshModel not supported by "
+ this.getClass().getName());
}
@Override
public Model openModel(String name) {
Model m = getModel(name);
if (m == null) {
throw new DoesNotExistException(name);
} else {
return m;
}
}
@Override
public Model openModelIfPresent(String name) {
if (this.hasModel(name)) {
return getModel(name);
} else {
return null;
}
}
@Override
public Model getModel(String name, ModelReader loadIfNotAbsent) {
Model m = getModel(name);
if (m == null) {
// Ignore the ModelReader. If the model is not present, give up.
throw new CannotCreateException(name);
} else {
return m;
}
}
/**
* Return a model from the RDFService. If the model does not exist, create
* an empty one.
*/
@Override
public Model getModel(String name) {
if (name == null) {
return null;
}
return dataset.getNamedModel(name);
}
@Override
public String toString() {
return "RDFServiceModelMaker[service=" + service + "]";
}
}