Skip to content

Commit 36cb449

Browse files
author
James Leigh
committed
Merge branch 'master' of github.com:eclipse/rdf4j into develop
2 parents 7a5ebd1 + 351f42f commit 36cb449

17 files changed

Lines changed: 252 additions & 150 deletions

File tree

core/console/src/main/java/org/eclipse/rdf4j/console/ConsoleIO.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,11 @@ protected String readCommand()
5353
}
5454
write("> ");
5555
}
56-
String line = input.readLine().trim();
56+
String line = input.readLine();
57+
if (line == null) {
58+
return null;
59+
}
60+
line = line.trim();
5761
if (line.endsWith(".")) {
5862
line = line.substring(0, line.length() - 1);
5963
}

core/console/src/main/java/org/eclipse/rdf4j/console/Create.java

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import org.eclipse.rdf4j.model.Model;
2323
import org.eclipse.rdf4j.model.Resource;
2424
import org.eclipse.rdf4j.model.impl.LinkedHashModel;
25+
import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
2526
import org.eclipse.rdf4j.model.util.Models;
2627
import org.eclipse.rdf4j.model.vocabulary.RDF;
2728
import org.eclipse.rdf4j.repository.Repository;
@@ -94,10 +95,9 @@ private void createRepository(final String templateName)
9495
boolean eof = inputParameters(valueMap, variableMap, configTemplate.getMultilineMap());
9596
if (!eof) {
9697
final String configString = configTemplate.render(valueMap);
97-
final Repository systemRepo = this.state.getManager().getSystemRepository();
9898
final Model graph = new LinkedHashModel();
9999
final RDFParser rdfParser = Rio.createParser(RDFFormat.TURTLE,
100-
systemRepo.getValueFactory());
100+
SimpleValueFactory.getInstance());
101101
rdfParser.setRDFHandler(new StatementCollector(graph));
102102
rdfParser.parse(new StringReader(configString), RepositoryConfigSchema.NAMESPACE);
103103
final Resource repositoryNode = Models.subject(
@@ -106,20 +106,20 @@ private void createRepository(final String templateName)
106106
final RepositoryConfig repConfig = RepositoryConfig.create(graph, repositoryNode);
107107
repConfig.validate();
108108
String overwrite = "WARNING: you are about to overwrite the configuration of an existing repository!";
109-
boolean proceedOverwrite = RepositoryConfigUtil.hasRepositoryConfig(systemRepo,
109+
boolean proceedOverwrite = this.state.getManager().hasRepositoryConfig(
110110
repConfig.getID()) ? consoleIO.askProceed(overwrite, false) : true;
111111
String suggested = this.state.getManager().getNewRepositoryID(repConfig.getID());
112112
String invalid = "WARNING: There are potentially incompatible characters in the repository id.";
113113
boolean proceedInvalid = !suggested.startsWith(repConfig.getID())
114114
? consoleIO.askProceed(invalid, false) : true;
115115
if (proceedInvalid && proceedOverwrite) {
116116
try {
117-
RepositoryConfigUtil.updateRepositoryConfigs(systemRepo, repConfig);
117+
this.state.getManager().addRepositoryConfig(repConfig);
118118
consoleIO.writeln("Repository created");
119119
}
120120
catch (RepositoryReadOnlyException e) {
121-
if (lockRemover.tryToRemoveLock(systemRepo)) {
122-
RepositoryConfigUtil.updateRepositoryConfigs(systemRepo, repConfig);
121+
if (lockRemover.tryToRemoveLock(this.state.getManager().getSystemRepository())) {
122+
this.state.getManager().addRepositoryConfig(repConfig);
123123
consoleIO.writeln("Repository created");
124124
}
125125
else {

core/console/src/test/java/org/eclipse/rdf4j/console/AbstractCommandTest.java

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,14 +19,13 @@
1919
import org.eclipse.rdf4j.model.Model;
2020
import org.eclipse.rdf4j.model.Resource;
2121
import org.eclipse.rdf4j.model.impl.LinkedHashModel;
22+
import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
2223
import org.eclipse.rdf4j.model.util.Models;
2324
import org.eclipse.rdf4j.model.vocabulary.RDF;
24-
import org.eclipse.rdf4j.repository.Repository;
2525
import org.eclipse.rdf4j.repository.RepositoryConnection;
2626
import org.eclipse.rdf4j.repository.config.RepositoryConfig;
2727
import org.eclipse.rdf4j.repository.config.RepositoryConfigException;
2828
import org.eclipse.rdf4j.repository.config.RepositoryConfigSchema;
29-
import org.eclipse.rdf4j.repository.config.RepositoryConfigUtil;
3029
import org.eclipse.rdf4j.repository.manager.RepositoryManager;
3130
import org.eclipse.rdf4j.rio.RDFFormat;
3231
import org.eclipse.rdf4j.rio.RDFParser;
@@ -81,8 +80,7 @@ protected final void addRepositories(String... identities)
8180
protected void addRepository(InputStream configStream, URL data)
8281
throws UnsupportedEncodingException, IOException, RDF4JException
8382
{
84-
Repository systemRepo = manager.getSystemRepository();
85-
RDFParser rdfParser = Rio.createParser(RDFFormat.TURTLE, systemRepo.getValueFactory());
83+
RDFParser rdfParser = Rio.createParser(RDFFormat.TURTLE, SimpleValueFactory.getInstance());
8684
Model graph = new LinkedHashModel();
8785
rdfParser.setRDFHandler(new StatementCollector(graph));
8886
rdfParser.parse(new StringReader(IOUtil.readString(new InputStreamReader(configStream, "UTF-8"))),
@@ -93,7 +91,7 @@ protected void addRepository(InputStream configStream, URL data)
9391
() -> new RepositoryConfigException("could not find subject resource"));
9492
RepositoryConfig repoConfig = RepositoryConfig.create(graph, repositoryNode);
9593
repoConfig.validate();
96-
RepositoryConfigUtil.updateRepositoryConfigs(systemRepo, repoConfig);
94+
manager.addRepositoryConfig(repoConfig);
9795
if (null != data) { // null if we didn't provide a data file
9896
final String repId = Models.objectLiteral(
9997
graph.filter(repositoryNode, RepositoryConfigSchema.REPOSITORYID, null)).orElseThrow(

core/http/server-spring/src/main/java/org/eclipse/rdf4j/http/server/repository/RepositoryListController.java

Lines changed: 28 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -18,16 +18,14 @@
1818
import org.eclipse.rdf4j.http.server.ProtocolUtil;
1919
import org.eclipse.rdf4j.http.server.ServerHTTPException;
2020
import org.eclipse.rdf4j.model.ValueFactory;
21+
import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
2122
import org.eclipse.rdf4j.query.BindingSet;
22-
import org.eclipse.rdf4j.query.QueryLanguage;
23-
import org.eclipse.rdf4j.query.TupleQueryResult;
2423
import org.eclipse.rdf4j.query.algebra.evaluation.QueryBindingSet;
2524
import org.eclipse.rdf4j.query.impl.IteratingTupleQueryResult;
2625
import org.eclipse.rdf4j.query.resultio.TupleQueryResultWriterFactory;
2726
import org.eclipse.rdf4j.query.resultio.TupleQueryResultWriterRegistry;
28-
import org.eclipse.rdf4j.repository.Repository;
29-
import org.eclipse.rdf4j.repository.RepositoryConnection;
3027
import org.eclipse.rdf4j.repository.RepositoryException;
28+
import org.eclipse.rdf4j.repository.config.RepositoryConfig;
3129
import org.eclipse.rdf4j.repository.manager.RepositoryManager;
3230
import org.springframework.context.ApplicationContextException;
3331
import org.springframework.web.servlet.ModelAndView;
@@ -40,19 +38,6 @@
4038
*/
4139
public class RepositoryListController extends AbstractController {
4240

43-
private static final String REPOSITORY_LIST_QUERY;
44-
45-
static {
46-
StringBuilder query = new StringBuilder(256);
47-
query.append(
48-
"SELECT id, title, \"true\"^^xsd:boolean as \"readable\", \"true\"^^xsd:boolean as \"writable\"");
49-
query.append("FROM {} rdf:type {sys:Repository};");
50-
query.append(" [rdfs:label {title}];");
51-
query.append(" sys:repositoryID {id} ");
52-
query.append("USING NAMESPACE sys = <http://www.openrdf.org/config/repository#>");
53-
REPOSITORY_LIST_QUERY = query.toString();
54-
}
55-
5641
private RepositoryManager repositoryManager;
5742

5843
public RepositoryListController()
@@ -72,52 +57,36 @@ protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpSer
7257
Map<String, Object> model = new HashMap<String, Object>();
7358

7459
if (METHOD_GET.equals(request.getMethod())) {
75-
Repository systemRepository = repositoryManager.getSystemRepository();
76-
ValueFactory vf = systemRepository.getValueFactory();
60+
ValueFactory vf = SimpleValueFactory.getInstance();
7761

7862
try {
79-
RepositoryConnection con = systemRepository.getConnection();
80-
try {
81-
// FIXME: The query result is cached here as we need to close the
82-
// connection before returning. Would be much better to stream
83-
// the
84-
// query result directly to the client.
85-
86-
List<String> bindingNames = new ArrayList<String>();
87-
List<BindingSet> bindingSets = new ArrayList<BindingSet>();
88-
89-
TupleQueryResult queryResult = con.prepareTupleQuery(QueryLanguage.SERQL,
90-
REPOSITORY_LIST_QUERY).evaluate();
91-
try {
92-
// Determine the repository's URI
93-
StringBuffer requestURL = request.getRequestURL();
94-
if (requestURL.charAt(requestURL.length() - 1) != '/') {
95-
requestURL.append('/');
96-
}
97-
String namespace = requestURL.toString();
98-
99-
while (queryResult.hasNext()) {
100-
QueryBindingSet bindings = new QueryBindingSet(queryResult.next());
101-
102-
String id = bindings.getValue("id").stringValue();
103-
bindings.addBinding("uri", vf.createIRI(namespace, id));
104-
105-
bindingSets.add(bindings);
106-
}
107-
108-
bindingNames.add("uri");
109-
bindingNames.addAll(queryResult.getBindingNames());
110-
}
111-
finally {
112-
queryResult.close();
113-
}
114-
model.put(QueryResultView.QUERY_RESULT_KEY,
115-
new IteratingTupleQueryResult(bindingNames, bindingSets));
63+
List<String> bindingNames = new ArrayList<String>();
64+
List<BindingSet> bindingSets = new ArrayList<BindingSet>();
11665

66+
// Determine the repository's URI
67+
StringBuffer requestURL = request.getRequestURL();
68+
if (requestURL.charAt(requestURL.length() - 1) != '/') {
69+
requestURL.append('/');
11770
}
118-
finally {
119-
con.close();
120-
}
71+
String namespace = requestURL.toString();
72+
73+
repositoryManager.getAllRepositoryInfos(false).forEach(info -> {
74+
QueryBindingSet bindings = new QueryBindingSet();
75+
bindings.addBinding("uri", vf.createIRI(namespace, info.getId()));
76+
bindings.addBinding("id", vf.createLiteral(info.getId()));
77+
bindings.addBinding("title", vf.createLiteral(info.getDescription()));
78+
bindings.addBinding("readable", vf.createLiteral(true));
79+
bindings.addBinding("writable", vf.createLiteral(true));
80+
bindingSets.add(bindings);
81+
});
82+
83+
bindingNames.add("uri");
84+
bindingNames.add("id");
85+
bindingNames.add("title");
86+
bindingNames.add("readable");
87+
bindingNames.add("writable");
88+
model.put(QueryResultView.QUERY_RESULT_KEY,
89+
new IteratingTupleQueryResult(bindingNames, bindingSets));
12190
}
12291
catch (RepositoryException e) {
12392
throw new ServerHTTPException(e.getMessage(), e);

core/http/workbench/src/main/java/org/eclipse/rdf4j/workbench/commands/CreateServlet.java

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,15 +22,14 @@
2222
import org.eclipse.rdf4j.model.Model;
2323
import org.eclipse.rdf4j.model.Resource;
2424
import org.eclipse.rdf4j.model.impl.LinkedHashModel;
25+
import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
2526
import org.eclipse.rdf4j.model.util.Models;
2627
import org.eclipse.rdf4j.model.vocabulary.RDF;
2728
import org.eclipse.rdf4j.query.QueryResultHandlerException;
28-
import org.eclipse.rdf4j.repository.Repository;
2929
import org.eclipse.rdf4j.repository.RepositoryException;
3030
import org.eclipse.rdf4j.repository.config.ConfigTemplate;
3131
import org.eclipse.rdf4j.repository.config.RepositoryConfig;
3232
import org.eclipse.rdf4j.repository.config.RepositoryConfigSchema;
33-
import org.eclipse.rdf4j.repository.config.RepositoryConfigUtil;
3433
import org.eclipse.rdf4j.repository.manager.RepositoryInfo;
3534
import org.eclipse.rdf4j.repository.manager.SystemRepository;
3635
import org.eclipse.rdf4j.rio.RDFFormat;
@@ -125,9 +124,8 @@ private String createRepositoryConfig(final WorkbenchRequest req)
125124
private RepositoryConfig updateRepositoryConfig(final String configString)
126125
throws IOException, RDF4JException
127126
{
128-
final Repository systemRepo = manager.getSystemRepository();
129127
final Model graph = new LinkedHashModel();
130-
final RDFParser rdfParser = Rio.createParser(RDFFormat.TURTLE, systemRepo.getValueFactory());
128+
final RDFParser rdfParser = Rio.createParser(RDFFormat.TURTLE, SimpleValueFactory.getInstance());
131129
rdfParser.setRDFHandler(new StatementCollector(graph));
132130
rdfParser.parse(new StringReader(configString), RepositoryConfigSchema.NAMESPACE);
133131

@@ -137,7 +135,7 @@ private RepositoryConfig updateRepositoryConfig(final String configString)
137135
"could not find instance of Repository class in config"));
138136
final RepositoryConfig repConfig = RepositoryConfig.create(graph, res);
139137
repConfig.validate();
140-
RepositoryConfigUtil.updateRepositoryConfigs(systemRepo, repConfig);
138+
manager.addRepositoryConfig(repConfig);
141139
return repConfig;
142140
}
143141

core/model/src/main/java/org/eclipse/rdf4j/model/vocabulary/DCAT.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,16 +22,16 @@
2222
*/
2323
public class DCAT {
2424

25-
/**
26-
* The DCAT namespace: http://www.w3.org/ns/dcat#
27-
*/
28-
public static final String NAMESPACE = "http://www.w3.org/ns/dcat#";
29-
3025
/**
3126
* Recommended prefix for the Data Catalog Vocabulary namespace: "dcat"
3227
*/
3328
public static final String PREFIX = "dcat";
3429

30+
/**
31+
* The DCAT namespace: http://www.w3.org/ns/dcat#
32+
*/
33+
public static final String NAMESPACE = "http://www.w3.org/ns/dcat#";
34+
3535
/**
3636
* An immutable {@link Namespace} constant that represents the Data Catalog Vocabulary namespace.
3737
*/

core/model/src/main/java/org/eclipse/rdf4j/model/vocabulary/DOAP.java

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,16 +8,35 @@
88
package org.eclipse.rdf4j.model.vocabulary;
99

1010
import org.eclipse.rdf4j.model.IRI;
11+
12+
import org.eclipse.rdf4j.model.Namespace;
13+
1114
import org.eclipse.rdf4j.model.ValueFactory;
15+
16+
import org.eclipse.rdf4j.model.impl.SimpleNamespace;
17+
1218
import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
1319

1420
/**
1521
* Constants for DOAP primitives and for the DOAP namespace.
1622
*/
1723
public class DOAP {
1824

25+
/**
26+
* The recommended prefix for the DOAP namespace: "doap"
27+
*/
28+
public static final String PREFIX = "doap";
29+
30+
/**
31+
* The DOAP namespace: http://usefulinc.com/ns/doap#
32+
*/
1933
public static final String NAMESPACE = "http://usefulinc.com/ns/doap#";
2034

35+
/**
36+
* An immutable {@link Namespace} constant that represents the DOAP namespace.
37+
*/
38+
public static final Namespace NS = new SimpleNamespace(PREFIX, NAMESPACE);
39+
2140
/**
2241
* Classes
2342
*/

core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/QueryBindingSet.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,6 @@ public void setBinding(Binding binding) {
8686
}
8787

8888
public void setBinding(String name, Value value) {
89-
assert value != null : "null value for variable " + name;
9089
bindings.put(name, value);
9190
}
9291

core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/impl/StrictEvaluationStrategy.java

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -348,7 +348,7 @@ public CloseableIteration<BindingSet, QueryEvaluationException> evaluate(Service
348348
if (serviceRef.hasValue())
349349
serviceUri = serviceRef.getValue().stringValue();
350350
else {
351-
if (bindings != null && bindings.hasBinding(serviceRef.getName())) {
351+
if (bindings != null && bindings.getValue(serviceRef.getName()) != null) {
352352
serviceUri = bindings.getBinding(serviceRef.getName()).getValue().stringValue();
353353
}
354354
else {
@@ -469,6 +469,13 @@ public CloseableIteration<BindingSet, QueryEvaluationException> evaluate(Stateme
469469
CloseableIteration<? extends Statement, QueryEvaluationException> stIter3 = null;
470470
ConvertingIteration<Statement, BindingSet, QueryEvaluationException> result = null;
471471

472+
if (isUnbound(subjVar, bindings) || isUnbound(predVar, bindings) || isUnbound(objVar, bindings)
473+
|| isUnbound(conVar, bindings))
474+
{
475+
// the variable must remain unbound for this solution see https://www.w3.org/TR/sparql11-query/#assignment
476+
return new EmptyIteration<BindingSet, QueryEvaluationException>();
477+
}
478+
472479
boolean allGood = false;
473480
try {
474481
try {
@@ -653,6 +660,15 @@ protected BindingSet convert(Statement st) {
653660
}
654661
}
655662

663+
protected boolean isUnbound(Var var, BindingSet bindings) {
664+
if (var == null) {
665+
return false;
666+
}
667+
else {
668+
return bindings.hasBinding(var.getName()) && bindings.getValue(var.getName()) == null;
669+
}
670+
}
671+
656672
protected Value getVarValue(Var var, BindingSet bindings) {
657673
if (var == null) {
658674
return null;

core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/iterator/ExtensionIterator.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,10 @@ public BindingSet convert(BindingSet sourceBindings)
5757
}
5858
catch (ValueExprEvaluationException e) {
5959
// silently ignore type errors in extension arguments. They should not cause the
60-
// query to fail but just result in no additional binding.
60+
// query to fail but result in no bindings for this solution
61+
// see https://www.w3.org/TR/sparql11-query/#assignment
62+
// use null as place holder for unbound variables that must remain so
63+
targetBindings.setBinding(extElem.getName(), null);
6164
}
6265
}
6366
}

0 commit comments

Comments
 (0)