Skip to content

Commit 626eb68

Browse files
authored
merge main into develop (#5790)
2 parents 6723e4e + 75404cb commit 626eb68

7 files changed

Lines changed: 135 additions & 8 deletions

File tree

core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/ConnectionHelper.java

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,15 @@
1111

1212
package org.eclipse.rdf4j.sail.shacl;
1313

14+
import java.util.NoSuchElementException;
15+
1416
import org.eclipse.rdf4j.common.iteration.CloseableIteration;
1517
import org.eclipse.rdf4j.model.IRI;
1618
import org.eclipse.rdf4j.model.Resource;
1719
import org.eclipse.rdf4j.model.Statement;
1820
import org.eclipse.rdf4j.model.Value;
1921
import org.eclipse.rdf4j.repository.RepositoryResult;
22+
import org.eclipse.rdf4j.sail.InterruptedSailException;
2023
import org.eclipse.rdf4j.sail.SailConnection;
2124
import org.eclipse.rdf4j.sail.SailException;
2225

@@ -55,8 +58,23 @@ static void transferStatements(SailConnection from, TransferStatement transfer)
5558
try (CloseableIteration<? extends Statement> statements = from
5659
.getStatements(null, null, null, false)) {
5760

58-
while (statements.hasNext()) {
59-
Statement next = statements.next();
61+
while (true) {
62+
throwIfInterrupted();
63+
boolean hasNext = statements.hasNext();
64+
throwIfInterrupted();
65+
if (!hasNext) {
66+
break;
67+
}
68+
69+
Statement next;
70+
try {
71+
next = statements.next();
72+
} catch (NoSuchElementException e) {
73+
if (Thread.currentThread().isInterrupted()) {
74+
throw new InterruptedSailException("Thread was interrupted while transferring statements.", e);
75+
}
76+
throw e;
77+
}
6078

6179
transfer.transfer(next.getSubject(), next.getPredicate(),
6280
next.getObject(), next.getContext());
@@ -66,6 +84,12 @@ static void transferStatements(SailConnection from, TransferStatement transfer)
6684

6785
}
6886

87+
private static void throwIfInterrupted() {
88+
if (Thread.currentThread().isInterrupted()) {
89+
throw new InterruptedSailException("Thread was interrupted while transferring statements.");
90+
}
91+
}
92+
6993
static boolean isEmpty(SailConnection connection) {
7094
return !connection.hasStatement(null, null, null, false);
7195
}
Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
/*******************************************************************************
2+
* Copyright (c) 2026 Eclipse RDF4J contributors.
3+
*
4+
* All rights reserved. This program and the accompanying materials
5+
* are made available under the terms of the Eclipse Distribution License v1.0
6+
* which accompanies this distribution, and is available at
7+
* http://www.eclipse.org/org/documents/edl-v10.php.
8+
*
9+
* SPDX-License-Identifier: BSD-3-Clause
10+
*******************************************************************************/
11+
// Some portions generated by Codex
12+
13+
package org.eclipse.rdf4j.sail.shacl;
14+
15+
import static org.assertj.core.api.Assertions.assertThatExceptionOfType;
16+
import static org.mockito.ArgumentMatchers.anyBoolean;
17+
import static org.mockito.ArgumentMatchers.isNull;
18+
import static org.mockito.Mockito.doReturn;
19+
import static org.mockito.Mockito.mock;
20+
import static org.mockito.Mockito.never;
21+
import static org.mockito.Mockito.verify;
22+
import static org.mockito.Mockito.when;
23+
24+
import java.util.NoSuchElementException;
25+
26+
import org.eclipse.rdf4j.common.iteration.CloseableIteration;
27+
import org.eclipse.rdf4j.model.Statement;
28+
import org.eclipse.rdf4j.sail.InterruptedSailException;
29+
import org.eclipse.rdf4j.sail.SailConnection;
30+
import org.junit.jupiter.api.Test;
31+
32+
class ConnectionHelperTest {
33+
34+
@Test
35+
void transferStatementsConvertsInterruptedIterationToInterruptedSailException() {
36+
SailConnection connection = mock(SailConnection.class);
37+
@SuppressWarnings("unchecked")
38+
CloseableIteration<? extends Statement> statements = mock(CloseableIteration.class);
39+
doReturn(statements).when(connection).getStatements(isNull(), isNull(), isNull(), anyBoolean());
40+
when(statements.hasNext()).thenReturn(true);
41+
when(statements.next()).thenAnswer(invocation -> {
42+
Thread.currentThread().interrupt();
43+
throw new NoSuchElementException("The iteration has been interrupted.");
44+
});
45+
46+
try {
47+
assertThatExceptionOfType(InterruptedSailException.class)
48+
.isThrownBy(() -> ConnectionHelper.transferStatements(connection, (subject, predicate, object,
49+
context) -> {
50+
throw new AssertionError("No statement should be transferred after interrupt");
51+
}))
52+
.withCauseInstanceOf(NoSuchElementException.class);
53+
verify(statements).close();
54+
} finally {
55+
Thread.interrupted();
56+
}
57+
}
58+
59+
@Test
60+
void transferStatementsKeepsNonInterruptNoSuchElementException() {
61+
SailConnection connection = mock(SailConnection.class);
62+
@SuppressWarnings("unchecked")
63+
CloseableIteration<? extends Statement> statements = mock(CloseableIteration.class);
64+
NoSuchElementException exception = new NoSuchElementException("empty");
65+
doReturn(statements).when(connection).getStatements(isNull(), isNull(), isNull(), anyBoolean());
66+
when(statements.hasNext()).thenReturn(true);
67+
when(statements.next()).thenThrow(exception);
68+
69+
assertThatExceptionOfType(NoSuchElementException.class)
70+
.isThrownBy(() -> ConnectionHelper.transferStatements(connection, (subject, predicate, object,
71+
context) -> {
72+
throw new AssertionError("No statement should be transferred");
73+
}))
74+
.isSameAs(exception);
75+
verify(statements).close();
76+
verify(statements, never()).remove();
77+
}
78+
}

site/content/download.md

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,15 @@ toc: true
55

66
You can either retrieve RDF4J via Apache Maven, or download the SDK or onejar directly.
77

8-
## RDF4J 5.3.0 (latest)
8+
## RDF4J 5.3.1 (latest)
99

10-
RDF4J 5.3.0 is our latest stable release. It requires Java 11 minimally.
11-
For details on what’s new and how to upgrade, see the [release and upgrade notes](/release-notes/5.3.0).
10+
RDF4J 5.3.1 is our latest stable release. It requires Java 11 minimally.
11+
For details on what’s new and how to upgrade, see the [release and upgrade notes](/release-notes/5.3.1).
1212

13-
- [RDF4J 5.3.0 SDK (zip)](http://www.eclipse.org/downloads/download.php?file=/rdf4j/eclipse-rdf4j-5.3.0-sdk.zip)<br/>
13+
- [RDF4J 5.3.1 SDK (zip)](http://www.eclipse.org/downloads/download.php?file=/rdf4j/eclipse-rdf4j-5.3.1-sdk.zip)<br/>
1414
Full Eclipse RDF4J SDK, containing all libraries, RDF4J Server, Workbench, and Console applications, and Javadoc API.
1515

16-
- [RDF4J 5.3.0 onejar](http://www.eclipse.org/downloads/download.php?file=/rdf4j/eclipse-rdf4j-5.3.0-onejar.jar)<br/>
16+
- [RDF4J 5.3.1 onejar](http://www.eclipse.org/downloads/download.php?file=/rdf4j/eclipse-rdf4j-5.3.1-onejar.jar)<br/>
1717
Single jar file for easy inclusion of the full RDF4J toolkit in your Java project.
1818

1919
- [RDF4J artifacts](https://search.maven.org/search?q=org.eclipse.rdf4j) on the [Maven Central Repository](http://search.maven.org/)
@@ -28,7 +28,7 @@ You can include RDF4J as a Maven dependency in your Java project by including th
2828
<dependency>
2929
<groupId>org.eclipse.rdf4j</groupId>
3030
<artifactId>rdf4j-bom</artifactId>
31-
<version>5.3.0</version>
31+
<version>5.3.1</version>
3232
<type>pom</type>
3333
<scope>import</scope>
3434
</dependency>

site/content/news/rdf4j-531.md

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
---
2+
title: "RDF4J 5.3.1 released"
3+
date: 2026-04-23T21:24:25+0200
4+
layout: "single"
5+
categories: ["news"]
6+
---
7+
RDF4J 5.3.1 is now available. This is a patch release fixing 2 bugs.
8+
9+
For more details, have a look at the [release notes](/release-notes/5.3.1).
10+
<!--more-->
11+
### Links
12+
13+
- [Download RDF4J](/download/)
14+
- [release notes](/release-notes/5.3.1)
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
---
2+
title: "5.3.1"
3+
toc: true
4+
---
5+
RDF4J 5.3.1 is a patch release that fixes 2 performance issues.
6+
7+
For a complete overview, see [all issues fixed in 5.3.1](https://github.com/eclipse/rdf4j/milestone/129?closed=1).
8+
9+
### Acknowledgements
10+
11+
This release was made possible by contributions from [Håvard M. Ottestad](https://github.com/hmottestad).

site/static/javadoc/5.3.1.tar.xz

3.65 MB
Binary file not shown.

site/static/javadoc/latest.tar.xz

404 KB
Binary file not shown.

0 commit comments

Comments
 (0)