This is an automated email from the ASF dual-hosted git repository. andy pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/jena.git
commit a4e7e9c3f6b123b6fee3050b7c977298d402485d Author: Andy Seaborne <[email protected]> AuthorDate: Tue Feb 17 16:11:50 2026 +0000 GH-3755: QueryIterPlainWrapper.cancel can use framework close() call --- .../engine/iterator/QueryIterPlainWrapper.java | 33 ++++++++++++++-------- 1 file changed, 21 insertions(+), 12 deletions(-) diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/engine/iterator/QueryIterPlainWrapper.java b/jena-arq/src/main/java/org/apache/jena/sparql/engine/iterator/QueryIterPlainWrapper.java index ddaec075ea..62c235e0e2 100644 --- a/jena-arq/src/main/java/org/apache/jena/sparql/engine/iterator/QueryIterPlainWrapper.java +++ b/jena-arq/src/main/java/org/apache/jena/sparql/engine/iterator/QueryIterPlainWrapper.java @@ -31,7 +31,10 @@ import org.apache.jena.sparql.engine.QueryIterator; import org.apache.jena.sparql.engine.binding.Binding ; import org.apache.jena.sparql.serializer.SerializationContext ; -/** Turn an normal java.util.Iterator (of Bindings) into a QueryIterator */ +/** + * Turn an normal {@link java.util.Iterator} (of {@link Binding Bindings}) + * into a {@link QueryIterator}. + */ public class QueryIterPlainWrapper extends QueryIter { public static QueryIterator create(Iterator<Binding> iter, ExecutionContext execCxt) { @@ -52,22 +55,29 @@ public class QueryIterPlainWrapper extends QueryIter iterator = iter; } - /** Preferable to use a constructor - but sometimes that is inconvenient - * so pass null in the constructor and then call this before the iterator is - * used. + /** + * Preferable to use a constructor - but sometimes that is inconvenient so pass + * null in the constructor and then call this before the iterator is used. */ - public void setIterator(Iterator<Binding> iterator) { this.iterator = iterator; } + protected void setIterator(Iterator<Binding> iter) { + // Only used by QueryIterTopN and QueryIterSort for delayed setting in their constructors. + if ( this.iterator != null ) + throw new IllegalStateException("QueryIterPlainWrapper: iterator already set"); + this.iterator = iter; + } @Override - protected boolean hasNextBinding() { return iterator.hasNext(); } + protected boolean hasNextBinding() { + return iterator.hasNext(); + } @Override - protected Binding moveToNextBinding() { return iterator.next(); } + protected Binding moveToNextBinding() { + return iterator.next(); + } - // Synchronized to prevent race conditions when abort() and close() compete - // to close the iterator concurrent by calling closeIterator() @Override - protected synchronized void closeIterator() { + protected void closeIterator() { if ( iterator != null ) { // In case we wrapped a QueryIterator or a Jena graph ExtendedIterator. // Includes the effect of NiceIterator.close(iterator) @@ -77,8 +87,7 @@ public class QueryIterPlainWrapper extends QueryIter } @Override - protected void requestCancel() - { closeIterator(); } + protected void requestCancel() {} @Override public void output(IndentedWriter out, SerializationContext sCxt)
