diff --git a/compliance/repository/src/test/java/org/eclipse/rdf4j/repository/sparql/SPARQLStoreConnectionTest.java b/compliance/repository/src/test/java/org/eclipse/rdf4j/repository/sparql/SPARQLStoreConnectionTest.java index 7465c3d7b45..e736c7ecd35 100644 --- a/compliance/repository/src/test/java/org/eclipse/rdf4j/repository/sparql/SPARQLStoreConnectionTest.java +++ b/compliance/repository/src/test/java/org/eclipse/rdf4j/repository/sparql/SPARQLStoreConnectionTest.java @@ -255,6 +255,13 @@ public void testGetNamespace() throws Exception { System.err.println("disabled testGetNamespace() as namespace retrieval is not supported by SPARQL"); } + @Override + @Ignore + public void testImportNamespacesFromIterable() throws Exception { + System.err + .println("disabled testImportNamespacesFromIterable() as namespace setting is not supported by SPARQL"); + } + @Override @Ignore public void testTransactionIsolation() throws Exception { diff --git a/core/repository/api/src/main/java/org/eclipse/rdf4j/repository/RepositoryConnection.java b/core/repository/api/src/main/java/org/eclipse/rdf4j/repository/RepositoryConnection.java index 80c48ac9c99..319cfa03505 100644 --- a/core/repository/api/src/main/java/org/eclipse/rdf4j/repository/RepositoryConnection.java +++ b/core/repository/api/src/main/java/org/eclipse/rdf4j/repository/RepositoryConnection.java @@ -940,7 +940,9 @@ void add(File file, String baseURI, RDFFormat dataFormat, Resource... contexts) /** * Adds the supplied statements to this repository, optionally to one or more named contexts. * - * @param statements The statements that should be added. + * @param statements The statements that should be added. In case the iterable is + * {@link org.eclipse.rdf4j.model.NamespaceAware} and the target repository supports it, the + * iterable's namespaces are also added to the repository, without overwriting existing ones. * @param contexts The contexts to add the statements to. Note that this parameter is a vararg and as such is * optional. If no contexts are specified, each statement is added to any context specified in the * statement, or if the statement contains no context, it is added without context. If one or more diff --git a/core/repository/api/src/main/java/org/eclipse/rdf4j/repository/base/AbstractRepositoryConnection.java b/core/repository/api/src/main/java/org/eclipse/rdf4j/repository/base/AbstractRepositoryConnection.java index 9a998ffb6a1..26b40139bc1 100644 --- a/core/repository/api/src/main/java/org/eclipse/rdf4j/repository/base/AbstractRepositoryConnection.java +++ b/core/repository/api/src/main/java/org/eclipse/rdf4j/repository/base/AbstractRepositoryConnection.java @@ -15,9 +15,7 @@ import java.io.InputStream; import java.io.Reader; import java.net.URL; -import java.util.HashSet; import java.util.Objects; -import java.util.Set; import java.util.concurrent.atomic.AtomicBoolean; import org.eclipse.rdf4j.common.iteration.Iteration; @@ -370,20 +368,19 @@ public void add(Iterable statements, Resource... contexts) "contexts argument may not be null; either the value should be cast to Resource or an empty array should be supplied"); boolean localTransaction = startLocalTransaction(); - Set newNamespaces = new HashSet<>(); try { for (Statement st : statements) { - if (st instanceof NamespaceAware) { - newNamespaces.addAll(((NamespaceAware) st).getNamespaces()); - } addWithoutCommit(st, contexts); } - for (Namespace newNamespace : newNamespaces) { - String nsPrefix = newNamespace.getPrefix(); - if (getNamespace(nsPrefix) == null) { - setNamespace(nsPrefix, newNamespace.getName()); + if (statements instanceof NamespaceAware) { + var newNamespaces = ((NamespaceAware) statements).getNamespaces(); + for (Namespace newNamespace : newNamespaces) { + String nsPrefix = newNamespace.getPrefix(); + if (getNamespace(nsPrefix) == null) { + setNamespace(nsPrefix, newNamespace.getName()); + } } } @@ -427,15 +424,6 @@ public void add(Statement st, Resource... contexts) throws RepositoryException { addWithoutCommit(st, contexts); - if (st instanceof NamespaceAware) { - for (Namespace newNamespace : ((NamespaceAware) st).getNamespaces()) { - String nsPrefix = newNamespace.getPrefix(); - if (getNamespace(nsPrefix) == null) { - setNamespace(nsPrefix, newNamespace.getName()); - } - } - } - conditionalCommit(localTransaction); } diff --git a/core/repository/sparql/src/main/java/org/eclipse/rdf4j/repository/sparql/SPARQLConnection.java b/core/repository/sparql/src/main/java/org/eclipse/rdf4j/repository/sparql/SPARQLConnection.java index faba3dae9de..26e91274b5e 100644 --- a/core/repository/sparql/src/main/java/org/eclipse/rdf4j/repository/sparql/SPARQLConnection.java +++ b/core/repository/sparql/src/main/java/org/eclipse/rdf4j/repository/sparql/SPARQLConnection.java @@ -642,6 +642,32 @@ public void add(Reader reader, String baseURI, RDFFormat dataFormat, Resource... } } + @Override + public void add(Statement st, Resource... contexts) throws RepositoryException { + boolean localTransaction = startLocalTransaction(); + addWithoutCommit(st, contexts); + try { + conditionalCommit(localTransaction); + } catch (RepositoryException e) { + conditionalRollback(localTransaction); + throw e; + } + } + + @Override + public void add(Iterable statements, Resource... contexts) throws RepositoryException { + boolean localTransaction = startLocalTransaction(); + for (Statement st : statements) { + addWithoutCommit(st, contexts); + } + try { + conditionalCommit(localTransaction); + } catch (RepositoryException e) { + conditionalRollback(localTransaction); + throw e; + } + } + @Override public void clear(Resource... contexts) throws RepositoryException { Objects.requireNonNull(contexts, diff --git a/testsuites/repository/src/main/java/org/eclipse/rdf4j/testsuite/repository/RepositoryConnectionTest.java b/testsuites/repository/src/main/java/org/eclipse/rdf4j/testsuite/repository/RepositoryConnectionTest.java index 426f20bd051..a63bab2844d 100644 --- a/testsuites/repository/src/main/java/org/eclipse/rdf4j/testsuite/repository/RepositoryConnectionTest.java +++ b/testsuites/repository/src/main/java/org/eclipse/rdf4j/testsuite/repository/RepositoryConnectionTest.java @@ -1127,6 +1127,22 @@ public void testGetNamespaces() throws Exception { assertThat(map.get(RDF_PREFIX)).isEqualTo("http://www.w3.org/1999/02/22-rdf-syntax-ns#"); } + @Test + public void testImportNamespacesFromIterable() throws Exception { + Model nsAwareModel = new LinkedHashModel(); + nsAwareModel.setNamespace(RDFS_PREFIX, RDFS_NS); + nsAwareModel.setNamespace(EXAMPLE, EXAMPLE_NS); + + testCon.add(nsAwareModel); + assertThat(testCon.getNamespace(RDFS_PREFIX)).isEqualTo(RDFS_NS); + assertThat(testCon.getNamespace(EXAMPLE)).isEqualTo(EXAMPLE_NS); + + // Test that existing namespaces are not overwritten + nsAwareModel.setNamespace(EXAMPLE, "http://something.else/"); + testCon.add(nsAwareModel); + assertThat(testCon.getNamespace(EXAMPLE)).isEqualTo(EXAMPLE_NS); + } + private void setupNamespaces() throws IOException, RDFParseException, RepositoryException { testCon.setNamespace(EXAMPLE, EXAMPLE_NS); testCon.setNamespace(RDF_PREFIX, "http://www.w3.org/1999/02/22-rdf-syntax-ns#");