This is an automated email from the ASF dual-hosted git repository.

asf-gitbox-commits pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/cayenne.git


The following commit(s) were added to refs/heads/master by this push:
     new 9db4d1483 CAY-2912 Compact SQL logger
9db4d1483 is described below

commit 9db4d14834aac8683e8915e371fc8184869f6b6a
Author: Andrus Adamchik <[email protected]>
AuthorDate: Fri Jul 3 18:07:55 2026 -0400

    CAY-2912 Compact SQL logger
    
    cleanup
---
 .../java/org/apache/cayenne/access/DataNode.java   |   2 +-
 .../apache/cayenne/access/OperationObserver.java   |  41 ++++--
 .../cayenne/access/OriginalQueryObserver.java      |  93 -------------
 .../apache/cayenne/access/flush/FlushObserver.java |  41 ++----
 .../apache/cayenne/access/jdbc/EJBQLAction.java    |  70 +++++++++-
 .../access/util/DefaultOperationObserver.java      | 149 ---------------------
 .../access/util/DoNothingOperationObserver.java    |  80 -----------
 .../access/util/IteratedSelectObserver.java        |  74 ----------
 .../org/apache/cayenne/dba/JdbcPkGenerator.java    |  25 +---
 .../dba/frontbase/FrontBasePkGenerator.java        |  21 ++-
 .../dba/sqlserver/SQLServerProcedureAction.java    |  10 +-
 .../cayenne/query/IteratedQueryDecorator.java      |   2 +-
 .../access/util/DefaultOperationObserverIT.java    |  51 -------
 13 files changed, 127 insertions(+), 532 deletions(-)

diff --git a/cayenne/src/main/java/org/apache/cayenne/access/DataNode.java 
b/cayenne/src/main/java/org/apache/cayenne/access/DataNode.java
index 3351852e4..e3cea59be 100644
--- a/cayenne/src/main/java/org/apache/cayenne/access/DataNode.java
+++ b/cayenne/src/main/java/org/apache/cayenne/access/DataNode.java
@@ -262,7 +262,7 @@ public class DataNode {
                 try {
                     getAdapter()
                             .getAction(nextQuery, this)
-                            .performAction(connection, new 
OriginalQueryObserver(instrumentedCallback, nextQuery));
+                            .performAction(connection, instrumentedCallback);
                 } catch (Exception queryEx) {
                     instrumentedCallback.nextQueryException(nextQuery, 
queryEx);
 
diff --git 
a/cayenne/src/main/java/org/apache/cayenne/access/OperationObserver.java 
b/cayenne/src/main/java/org/apache/cayenne/access/OperationObserver.java
index 270577503..f3f63ae32 100644
--- a/cayenne/src/main/java/org/apache/cayenne/access/OperationObserver.java
+++ b/cayenne/src/main/java/org/apache/cayenne/access/OperationObserver.java
@@ -19,6 +19,7 @@
 
 package org.apache.cayenne.access;
 
+import org.apache.cayenne.CayenneRuntimeException;
 import org.apache.cayenne.ObjectId;
 import org.apache.cayenne.ResultIterator;
 import org.apache.cayenne.access.translator.TranslatedStatement;
@@ -29,6 +30,10 @@ import java.util.List;
 /**
  * Defines a set of callback methods that allow {@link DataNode} to pass back 
query
  * results and notify caller about exceptions.
+ * <p>
+ * All methods have default implementations: the result callbacks do nothing, 
the exception callbacks rethrow the
+ * reported exception wrapped in a {@link CayenneRuntimeException}, and {@link 
#isIteratedResult()} returns false. An
+ * implementation only needs to override the callbacks it cares about.
  */
 public interface OperationObserver extends OperationHints {
 
@@ -50,22 +55,33 @@ public interface OperationObserver extends OperationHints {
     default void onSuccess() {
     }
 
+    /**
+     * Returns whether results should be returned as a {@link ResultIterator}. 
Defaults to false.
+     */
+    @Override
+    default boolean isIteratedResult() {
+        return false;
+    }
+
     /**
      * Callback method invoked after an updating query is executed.
      */
-    void nextCount(Query query, int resultCount);
+    default void nextCount(Query query, int resultCount) {
+    }
 
     /**
      * Callback method invoked after a batch update is executed.
      */
-    void nextBatchCount(Query query, int[] resultCount);
+    default void nextBatchCount(Query query, int[] resultCount) {
+    }
 
     /**
      * Callback method invoked for each processed ResultSet.
      *
      * @since 3.0
      */
-    void nextRows(Query query, List<?> dataRows);
+    default void nextRows(Query query, List<?> dataRows) {
+    }
 
     /**
      * Callback method invoked for each opened ResultIterator. If this 
observer requested
@@ -74,24 +90,31 @@ public interface OperationObserver extends OperationHints {
      *
      * @since 3.0
      */
-    void nextRows(Query q, ResultIterator<?> it);
+    default void nextRows(Query q, ResultIterator<?> it) {
+    }
 
     /**
      * Callback method invoked after each batch of generated values is read 
during an update.
      *
      * @since 4.2
      */
-    void nextGeneratedRows(Query query, ResultIterator<?> keys, List<ObjectId> 
idsToUpdate);
+    default void nextGeneratedRows(Query query, ResultIterator<?> keys, 
List<ObjectId> idsToUpdate) {
+    }
 
     /**
      * Callback method invoked on exceptions that happen during an execution 
of a specific
-     * query.
+     * query. The default implementation rethrows the exception wrapped in a 
{@link CayenneRuntimeException}.
      */
-    void nextQueryException(Query query, Exception ex);
+    default void nextQueryException(Query query, Exception ex) {
+        throw new CayenneRuntimeException(ex);
+    }
 
     /**
      * Callback method invoked on exceptions that are not tied to a specific 
query
-     * execution, such as JDBC connection exceptions, etc.
+     * execution, such as JDBC connection exceptions, etc. The default 
implementation rethrows the exception wrapped in
+     * a {@link CayenneRuntimeException}.
      */
-    void nextGlobalException(Exception ex);
+    default void nextGlobalException(Exception ex) {
+        throw new CayenneRuntimeException(ex);
+    }
 }
diff --git 
a/cayenne/src/main/java/org/apache/cayenne/access/OriginalQueryObserver.java 
b/cayenne/src/main/java/org/apache/cayenne/access/OriginalQueryObserver.java
deleted file mode 100644
index fc999bc57..000000000
--- a/cayenne/src/main/java/org/apache/cayenne/access/OriginalQueryObserver.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/*****************************************************************
- *   Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    https://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- ****************************************************************/
-
-package org.apache.cayenne.access;
-
-import org.apache.cayenne.ObjectId;
-import org.apache.cayenne.ResultIterator;
-import org.apache.cayenne.access.translator.TranslatedStatement;
-import org.apache.cayenne.query.Query;
-
-import java.util.List;
-
-/**
- * An {@link OperationObserver} decorator that reports all results against the 
original query, even when the underlying
- * {@link org.apache.cayenne.query.SQLAction} executes a substitute query. All 
callbacks are delegated to the wrapped
- * observer with the {@code query} argument replaced by the original query.
- */
-class OriginalQueryObserver implements OperationObserver {
-
-    private final OperationObserver delegate;
-    private final Query originalQuery;
-
-    OriginalQueryObserver(OperationObserver delegate, Query originalQuery) {
-        this.delegate = delegate;
-        this.originalQuery = originalQuery;
-    }
-
-    @Override
-    public void nextStatement(Query query, TranslatedStatement statement) {
-        delegate.nextStatement(originalQuery, statement);
-    }
-
-    @Override
-    public void onSuccess() {
-        delegate.onSuccess();
-    }
-
-    @Override
-    public void nextCount(Query query, int resultCount) {
-        delegate.nextCount(originalQuery, resultCount);
-    }
-
-    @Override
-    public void nextBatchCount(Query query, int[] resultCount) {
-        delegate.nextBatchCount(originalQuery, resultCount);
-    }
-
-    @Override
-    public void nextRows(Query query, List<?> dataRows) {
-        delegate.nextRows(originalQuery, dataRows);
-    }
-
-    @Override
-    public void nextRows(Query query, ResultIterator<?> it) {
-        delegate.nextRows(originalQuery, it);
-    }
-
-    @Override
-    public void nextGeneratedRows(Query query, ResultIterator<?> keys, 
List<ObjectId> idsToUpdate) {
-        delegate.nextGeneratedRows(originalQuery, keys, idsToUpdate);
-    }
-
-    @Override
-    public void nextQueryException(Query query, Exception ex) {
-        delegate.nextQueryException(originalQuery, ex);
-    }
-
-    @Override
-    public void nextGlobalException(Exception ex) {
-        delegate.nextGlobalException(ex);
-    }
-
-    @Override
-    public boolean isIteratedResult() {
-        return delegate.isIteratedResult();
-    }
-}
diff --git 
a/cayenne/src/main/java/org/apache/cayenne/access/flush/FlushObserver.java 
b/cayenne/src/main/java/org/apache/cayenne/access/flush/FlushObserver.java
index 8d74821dc..dff2f3fee 100644
--- a/cayenne/src/main/java/org/apache/cayenne/access/flush/FlushObserver.java
+++ b/cayenne/src/main/java/org/apache/cayenne/access/flush/FlushObserver.java
@@ -19,8 +19,6 @@
 
 package org.apache.cayenne.access.flush;
 
-import java.util.List;
-
 import org.apache.cayenne.CayenneRuntimeException;
 import org.apache.cayenne.DataRow;
 import org.apache.cayenne.ObjectId;
@@ -28,19 +26,20 @@ import org.apache.cayenne.ResultIterator;
 import org.apache.cayenne.access.OperationObserver;
 import org.apache.cayenne.log.SqlLogger;
 import org.apache.cayenne.map.DbAttribute;
-import org.apache.cayenne.query.BatchQuery;
 import org.apache.cayenne.query.InsertBatchQuery;
 import org.apache.cayenne.query.Query;
 import org.apache.cayenne.util.Util;
 
+import java.util.List;
+
 /**
  * @since 4.2
  */
 class FlushObserver implements OperationObserver {
 
-    private SqlLogger logger;
+    private final SqlLogger logger;
 
-    FlushObserver(SqlLogger logger) {
+    public FlushObserver(SqlLogger logger) {
         this.logger = logger;
     }
 
@@ -63,13 +62,11 @@ class FlushObserver implements OperationObserver {
 
         // read and close the iterator before doing anything else
         List<DataRow> keys;
-        try {
+        try (keysIterator) {
             keys = (List<DataRow>) keysIterator.allRows();
-        } finally {
-            keysIterator.close();
         }
 
-        if (!(query instanceof InsertBatchQuery)) {
+        if (!(query instanceof InsertBatchQuery batch)) {
             throw new CayenneRuntimeException("Generated keys only supported 
for InsertBatchQuery, instead got %s", query);
         }
 
@@ -80,8 +77,7 @@ class FlushObserver implements OperationObserver {
         for (int i = 0; i < keys.size(); i++) {
                DataRow key = keys.get(i);
        
-               // empty key?
-               if (key.size() == 0) {
+               if (key.isEmpty()) {
                    throw new CayenneRuntimeException("Empty key generated.");
                }
        
@@ -91,8 +87,7 @@ class FlushObserver implements OperationObserver {
                    return;
                }
 
-               BatchQuery batch = (BatchQuery) query;
-               for (DbAttribute attribute : 
batch.getDbEntity().getGeneratedAttributes()) {
+            for (DbAttribute attribute : 
batch.getDbEntity().getGeneratedAttributes()) {
        
                    // batch can have generated attributes that are not PKs, 
e.g.
                    // columns with
@@ -121,26 +116,6 @@ class FlushObserver implements OperationObserver {
         }
     }
 
-    public void setSqlLogger(SqlLogger logger) {
-        this.logger = logger;
-    }
-
-    public SqlLogger getSqlLogger() {
-        return this.logger;
-    }
-
-    @Override
-    public void nextBatchCount(Query query, int[] resultCount) {
-    }
-
-    @Override
-    public void nextCount(Query query, int resultCount) {
-    }
-
-    @Override
-    public void nextRows(Query query, List<?> dataRows) {
-    }
-
     @Override
     @SuppressWarnings("rawtypes")
     public void nextRows(Query q, ResultIterator it) {
diff --git 
a/cayenne/src/main/java/org/apache/cayenne/access/jdbc/EJBQLAction.java 
b/cayenne/src/main/java/org/apache/cayenne/access/jdbc/EJBQLAction.java
index ae7770caa..57ba161ab 100644
--- a/cayenne/src/main/java/org/apache/cayenne/access/jdbc/EJBQLAction.java
+++ b/cayenne/src/main/java/org/apache/cayenne/access/jdbc/EJBQLAction.java
@@ -18,10 +18,13 @@
  ****************************************************************/
 package org.apache.cayenne.access.jdbc;
 
+import org.apache.cayenne.ObjectId;
+import org.apache.cayenne.ResultIterator;
 import org.apache.cayenne.access.DataNode;
 import org.apache.cayenne.access.OperationObserver;
 import org.apache.cayenne.access.translator.ejbql.EJBQLTranslationContext;
 import org.apache.cayenne.access.translator.EJBQLTranslator;
+import org.apache.cayenne.access.translator.TranslatedStatement;
 import org.apache.cayenne.dba.QuotingStrategy;
 import org.apache.cayenne.ejbql.EJBQLBaseVisitor;
 import org.apache.cayenne.ejbql.EJBQLCompiledExpression;
@@ -29,11 +32,13 @@ import org.apache.cayenne.map.DbEntity;
 import org.apache.cayenne.ejbql.EJBQLExpression;
 import org.apache.cayenne.ejbql.EJBQLExpressionVisitor;
 import org.apache.cayenne.query.EJBQLQuery;
+import org.apache.cayenne.query.Query;
 import org.apache.cayenne.query.QueryMetadata;
 import org.apache.cayenne.query.SQLActionVisitor;
 import org.apache.cayenne.query.SQLTemplate;
 
 import java.sql.Connection;
+import java.util.List;
 
 /**
  * Parses an EJBQL statement, converting it to SQL. Executes the resulting SQL.
@@ -110,6 +115,69 @@ public class EJBQLAction extends BaseSQLAction {
             sqlQuery.setQueryTimeout(queryTimeout);
         }
 
-        actionFactory.sqlAction(sqlQuery).performAction(connection, observer);
+        // the SQLTemplate is a substitute for the original EJBQLQuery; wrap 
the observer so that results are reported
+        // against the EJBQLQuery the caller submitted rather than the 
internally compiled SQLTemplate
+        actionFactory.sqlAction(sqlQuery).performAction(connection, new 
OriginalQueryObserver(observer, query));
+    }
+    
+    static class OriginalQueryObserver implements OperationObserver {
+
+        private final OperationObserver delegate;
+        private final Query originalQuery;
+
+        OriginalQueryObserver(OperationObserver delegate, Query originalQuery) 
{
+            this.delegate = delegate;
+            this.originalQuery = originalQuery;
+        }
+
+        @Override
+        public void nextStatement(Query query, TranslatedStatement statement) {
+            delegate.nextStatement(originalQuery, statement);
+        }
+
+        @Override
+        public void onSuccess() {
+            delegate.onSuccess();
+        }
+
+        @Override
+        public void nextCount(Query query, int resultCount) {
+            delegate.nextCount(originalQuery, resultCount);
+        }
+
+        @Override
+        public void nextBatchCount(Query query, int[] resultCount) {
+            delegate.nextBatchCount(originalQuery, resultCount);
+        }
+
+        @Override
+        public void nextRows(Query query, List<?> dataRows) {
+            delegate.nextRows(originalQuery, dataRows);
+        }
+
+        @Override
+        public void nextRows(Query query, ResultIterator<?> it) {
+            delegate.nextRows(originalQuery, it);
+        }
+
+        @Override
+        public void nextGeneratedRows(Query query, ResultIterator<?> keys, 
List<ObjectId> idsToUpdate) {
+            delegate.nextGeneratedRows(originalQuery, keys, idsToUpdate);
+        }
+
+        @Override
+        public void nextQueryException(Query query, Exception ex) {
+            delegate.nextQueryException(originalQuery, ex);
+        }
+
+        @Override
+        public void nextGlobalException(Exception ex) {
+            delegate.nextGlobalException(ex);
+        }
+
+        @Override
+        public boolean isIteratedResult() {
+            return delegate.isIteratedResult();
+        }
     }
 }
diff --git 
a/cayenne/src/main/java/org/apache/cayenne/access/util/DefaultOperationObserver.java
 
b/cayenne/src/main/java/org/apache/cayenne/access/util/DefaultOperationObserver.java
deleted file mode 100644
index 8add835b5..000000000
--- 
a/cayenne/src/main/java/org/apache/cayenne/access/util/DefaultOperationObserver.java
+++ /dev/null
@@ -1,149 +0,0 @@
-/*****************************************************************
- *   Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    https://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- ****************************************************************/
-
-package org.apache.cayenne.access.util;
-
-import org.apache.cayenne.ResultIterator;
-import org.apache.cayenne.access.OperationObserver;
-import org.apache.cayenne.query.Query;
-import org.apache.cayenne.util.Util;
-
-import java.io.PrintWriter;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-/**
- * Simple implementation of OperationObserver interface. Useful as a superclass
- * of other implementations of OperationObserver. This implementation only
- * tracks transaction events and exceptions.
- * <p>
- * <i>This operation observer is unsafe to use in application, since it doesn't
- * rethrow the exceptions immediately, and may cause the database to hang.</i>
- * </p>
- * 
- */
-public class DefaultOperationObserver implements OperationObserver {
-
-    protected List<Throwable> globalExceptions = new ArrayList<>();
-    protected Map<Query, Throwable> queryExceptions = new HashMap<>();
-
-    /**
-     * Prints the information about query and global exceptions.
-     */
-    public void printExceptions(PrintWriter out) {
-        if (globalExceptions.size() > 0) {
-            if (globalExceptions.size() == 1) {
-                out.println("Global Exception:");
-            } else {
-                out.println("Global Exceptions:");
-            }
-
-            for (final Throwable th : globalExceptions) {
-                th.printStackTrace(out);
-            }
-        }
-
-        if (queryExceptions.size() > 0) {
-            if (queryExceptions.size() == 1) {
-                out.println("Query Exception:");
-            } else {
-                out.println("Query Exceptions:");
-            }
-
-            for (final Query query : queryExceptions.keySet()) {
-                Throwable th = queryExceptions.get(query);
-                th.printStackTrace(out);
-            }
-        }
-    }
-
-    /**
-     * Returns a list of global exceptions that occured during data operation
-     * run.
-     */
-    public List<Throwable> getGlobalExceptions() {
-        return globalExceptions;
-    }
-
-    /**
-     * Returns a list of exceptions that occured during data operation run by
-     * query.
-     */
-    public Map<Query, Throwable> getQueryExceptions() {
-        return queryExceptions;
-    }
-
-    /**
-     * Returns <code>true</code> if at least one exception was registered 
during
-     * query execution.
-     */
-    public boolean hasExceptions() {
-        return globalExceptions.size() > 0 || queryExceptions.size() > 0;
-    }
-
-    public void nextCount(Query query, int resultCount) {
-    }
-
-    public void nextBatchCount(Query query, int[] resultCount) {
-
-    }
-
-    public void nextRows(Query query, List<?> dataRows) {
-        // noop
-    }
-
-    /**
-     * Closes ResultIterator without reading its data. If you implement a 
custom
-     * subclass, only call super if closing the iterator is what you need.
-     */
-    public void nextRows(Query query, ResultIterator it) {
-        if (it != null) {
-            it.close();
-        }
-    }
-
-    /**
-     * Closes ResultIterator without reading its data. If you implement a 
custom
-     * subclass, only call super if closing the iterator is what you need.
-     * 
-     * @since 4.0
-     */
-    public void nextGeneratedRows(Query query, ResultIterator<?> keys, 
List<org.apache.cayenne.ObjectId> idsToUpdate) {
-        if (keys != null) {
-            keys.close();
-        }
-    }
-
-    public void nextQueryException(Query query, Exception ex) {
-        queryExceptions.put(query, Util.unwindException(ex));
-    }
-
-    public void nextGlobalException(Exception ex) {
-        globalExceptions.add(Util.unwindException(ex));
-    }
-
-    /**
-     * Returns <code>false</code>.
-     */
-    public boolean isIteratedResult() {
-        return false;
-    }
-}
diff --git 
a/cayenne/src/main/java/org/apache/cayenne/access/util/DoNothingOperationObserver.java
 
b/cayenne/src/main/java/org/apache/cayenne/access/util/DoNothingOperationObserver.java
deleted file mode 100644
index bc90d0bd2..000000000
--- 
a/cayenne/src/main/java/org/apache/cayenne/access/util/DoNothingOperationObserver.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*****************************************************************
- *   Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    https://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- ****************************************************************/
-package org.apache.cayenne.access.util;
-
-import java.util.List;
-
-import org.apache.cayenne.CayenneRuntimeException;
-import org.apache.cayenne.ObjectId;
-import org.apache.cayenne.ResultIterator;
-import org.apache.cayenne.access.OperationObserver;
-import org.apache.cayenne.query.Query;
-
-/**
- * A very simple observer that does nothing with provided data, and rethrows 
any
- * reported exceptions. Can be used as a base superclass for custom observers.
- * 
- * @since 4.0
- */
-public class DoNothingOperationObserver implements OperationObserver {
-
-       @Override
-       public boolean isIteratedResult() {
-               return false;
-       }
-
-       @Override
-       public void nextCount(Query query, int resultCount) {
-               // TODO Auto-generated method stub
-
-       }
-
-       @Override
-       public void nextBatchCount(Query query, int[] resultCount) {
-               // TODO Auto-generated method stub
-
-       }
-
-       @Override
-       public void nextRows(Query query, List<?> dataRows) {
-               // TODO Auto-generated method stub
-
-       }
-
-       @Override
-       public void nextRows(Query q, ResultIterator<?> it) {
-               // TODO Auto-generated method stub
-
-       }
-
-       @Override
-       public void nextGeneratedRows(Query query, ResultIterator<?> keys, 
List<ObjectId> idsToUpdate) {
-               // do
-       }
-
-       @Override
-       public void nextQueryException(Query query, Exception ex) {
-               throw new CayenneRuntimeException(ex);
-       }
-
-       @Override
-       public void nextGlobalException(Exception ex) {
-               throw new CayenneRuntimeException(ex);
-       }
-}
diff --git 
a/cayenne/src/main/java/org/apache/cayenne/access/util/IteratedSelectObserver.java
 
b/cayenne/src/main/java/org/apache/cayenne/access/util/IteratedSelectObserver.java
deleted file mode 100644
index 53354304e..000000000
--- 
a/cayenne/src/main/java/org/apache/cayenne/access/util/IteratedSelectObserver.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*****************************************************************
- *   Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    https://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- ****************************************************************/
-
-package org.apache.cayenne.access.util;
-
-import java.io.IOException;
-import java.io.PrintWriter;
-import java.io.StringWriter;
-import java.util.List;
-
-import org.apache.cayenne.CayenneRuntimeException;
-import org.apache.cayenne.ResultIterator;
-import org.apache.cayenne.query.Query;
-
-/**
- * OperationObserver that is used to track the execution of SelectQueries with
- * results returned as ResultIterator.
- * 
- */
-public class IteratedSelectObserver extends DefaultOperationObserver {
-    protected ResultIterator resultIterator;
-
-    @Override
-    public boolean isIteratedResult() {
-        return true;
-    }
-
-    @Override
-    public void nextRows(Query query, List<?> dataRows) {
-        throw new CayenneRuntimeException("Results unexpectedly returned as 
list.");
-    }
-
-    @Override
-    public void nextRows(Query q, ResultIterator it) {
-        // don't call super - it closes the iterator
-        resultIterator = it;
-    }
-
-    public ResultIterator getResultIterator() {
-        if (super.hasExceptions()) {
-            StringWriter str = new StringWriter();
-            PrintWriter out = new PrintWriter(str);
-            super.printExceptions(out);
-
-            try {
-                out.close();
-                str.close();
-            } catch (IOException ioex) {
-                // this should never happen
-            }
-
-            throw new CayenneRuntimeException("Error getting ResultIterator: 
%s", str.getBuffer());
-        }
-
-        return resultIterator;
-    }
-
-}
diff --git a/cayenne/src/main/java/org/apache/cayenne/dba/JdbcPkGenerator.java 
b/cayenne/src/main/java/org/apache/cayenne/dba/JdbcPkGenerator.java
index cbd631fc4..e49ea2899 100644
--- a/cayenne/src/main/java/org/apache/cayenne/dba/JdbcPkGenerator.java
+++ b/cayenne/src/main/java/org/apache/cayenne/dba/JdbcPkGenerator.java
@@ -21,8 +21,6 @@ package org.apache.cayenne.dba;
 
 import org.apache.cayenne.CayenneRuntimeException;
 import org.apache.cayenne.DataRow;
-import org.apache.cayenne.ObjectId;
-import org.apache.cayenne.ResultIterator;
 import org.apache.cayenne.access.DataNode;
 import org.apache.cayenne.access.OperationObserver;
 import org.apache.cayenne.access.types.ValueObjectType;
@@ -321,10 +319,7 @@ public class JdbcPkGenerator implements PkGenerator {
         pkCache.clear();
     }
 
-    /**
-     * OperationObserver for primary key retrieval.
-     */
-    final class PkRetrieveProcessor implements OperationObserver {
+    static final class PkRetrieveProcessor implements OperationObserver {
 
         Number id;
         final String entityName;
@@ -333,10 +328,6 @@ public class JdbcPkGenerator implements PkGenerator {
             this.entityName = entityName;
         }
 
-        public boolean isIteratedResult() {
-            return false;
-        }
-
         public long getId() {
             if (id == null) {
                 throw new CayenneRuntimeException("No key was retrieved for 
entity %s", entityName);
@@ -347,7 +338,7 @@ public class JdbcPkGenerator implements PkGenerator {
 
         public void nextRows(Query query, List<?> dataRows) {
             // process selected object, issue an update query
-            if (dataRows == null || dataRows.size() == 0) {
+            if (dataRows == null || dataRows.isEmpty()) {
                 throw new CayenneRuntimeException("Error generating PK : 
entity not supported: %s", entityName);
             }
 
@@ -355,7 +346,7 @@ public class JdbcPkGenerator implements PkGenerator {
                 throw new CayenneRuntimeException("Error generating PK : too 
many rows for entity: %s", entityName);
             }
 
-            DataRow lastPk = (DataRow) dataRows.get(0);
+            DataRow lastPk = (DataRow) dataRows.getFirst();
             id = (Number) lastPk.get("NEXT_ID");
         }
 
@@ -366,16 +357,6 @@ public class JdbcPkGenerator implements PkGenerator {
             }
         }
 
-        public void nextBatchCount(Query query, int[] resultCount) {
-        }
-
-        @Override
-        public void nextGeneratedRows(Query query, ResultIterator<?> keys, 
List<ObjectId> idsToUpdate) {
-        }
-
-        public void nextRows(Query q, ResultIterator it) {
-        }
-
         public void nextQueryException(Query query, Exception ex) {
             throw new CayenneRuntimeException("Error generating PK for entity 
'" + entityName + "'.", ex);
         }
diff --git 
a/cayenne/src/main/java/org/apache/cayenne/dba/frontbase/FrontBasePkGenerator.java
 
b/cayenne/src/main/java/org/apache/cayenne/dba/frontbase/FrontBasePkGenerator.java
index 4686f3b83..919afa00c 100644
--- 
a/cayenne/src/main/java/org/apache/cayenne/dba/frontbase/FrontBasePkGenerator.java
+++ 
b/cayenne/src/main/java/org/apache/cayenne/dba/frontbase/FrontBasePkGenerator.java
@@ -19,21 +19,20 @@
 
 package org.apache.cayenne.dba.frontbase;
 
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
 import org.apache.cayenne.CayenneRuntimeException;
 import org.apache.cayenne.DataRow;
 import org.apache.cayenne.access.DataNode;
 import org.apache.cayenne.access.OperationObserver;
-import org.apache.cayenne.access.util.DoNothingOperationObserver;
 import org.apache.cayenne.dba.JdbcAdapter;
 import org.apache.cayenne.dba.JdbcPkGenerator;
 import org.apache.cayenne.map.DbEntity;
 import org.apache.cayenne.query.Query;
 import org.apache.cayenne.query.SQLTemplate;
 
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
 /**
  * @since 1.2
  */
@@ -93,16 +92,12 @@ public class FrontBasePkGenerator extends JdbcPkGenerator {
 
     @Override
     protected String pkCreateString(String entName) {
-        StringBuilder buf = new StringBuilder();
-        buf.append("SET UNIQUE = ").append(pkStartValue).append(" FOR 
\"").append(entName).append("\"");
-        return buf.toString();
+        return "SET UNIQUE = " + pkStartValue + " FOR \"" + entName + "\"";
     }
 
     @Override
     protected String pkSelectString(String entName) {
-        StringBuilder buf = new StringBuilder();
-        buf.append("SELECT UNIQUE FROM \"").append(entName).append("\"");
-        return buf.toString();
+        return "SELECT UNIQUE FROM \"" + entName + "\"";
     }
 
     @Override
@@ -126,7 +121,7 @@ public class FrontBasePkGenerator extends JdbcPkGenerator {
         final long[] pkHolder = new long[1];
 
         SQLTemplate query = new SQLTemplate(entity, template);
-        OperationObserver observer = new DoNothingOperationObserver() {
+        OperationObserver observer = new OperationObserver() {
 
             @Override
             public void nextRows(Query query, List<?> dataRows) {
@@ -134,7 +129,7 @@ public class FrontBasePkGenerator extends JdbcPkGenerator {
                     throw new CayenneRuntimeException("Error fetching PK. 
Expected one row, got %d", dataRows.size());
                 }
 
-                DataRow row = (DataRow) dataRows.get(0);
+                DataRow row = (DataRow) dataRows.getFirst();
                 Number pk = (Number) row.get("UNIQUE");
                 pkHolder[0] = pk.longValue();
             }
diff --git 
a/cayenne/src/main/java/org/apache/cayenne/dba/sqlserver/SQLServerProcedureAction.java
 
b/cayenne/src/main/java/org/apache/cayenne/dba/sqlserver/SQLServerProcedureAction.java
index 23bbb1a1c..5fb116bc3 100644
--- 
a/cayenne/src/main/java/org/apache/cayenne/dba/sqlserver/SQLServerProcedureAction.java
+++ 
b/cayenne/src/main/java/org/apache/cayenne/dba/sqlserver/SQLServerProcedureAction.java
@@ -62,7 +62,7 @@ public class SQLServerProcedureAction extends ProcedureAction 
{
 
                observer.nextStatement(query, translated);
 
-               try (CallableStatement statement = 
connection.prepareCall(translated.sql());) {
+               try (CallableStatement statement = 
connection.prepareCall(translated.sql())) {
                        bindParameters(statement, translated);
 
                        // stored procedure may contain a mixture of update 
counts and
@@ -82,7 +82,7 @@ public class SQLServerProcedureAction extends ProcedureAction 
{
                        while (true) {
                                if (hasResultSet) {
 
-                                       try (ResultSet rs = 
statement.getResultSet();) {
+                                       try (ResultSet rs = 
statement.getResultSet()) {
                                                RSColumn[] columns = 
describeResultSet(rs, processedResultSets++);
                                                readResultSet(rs, columns, 
query, localObserver);
                                        }
@@ -110,7 +110,7 @@ public class SQLServerProcedureAction extends 
ProcedureAction {
                }
        }
 
-       class Observer implements OperationObserver {
+       static class Observer implements OperationObserver {
 
                List<List<?>> results;
                List<Integer> counts;
@@ -149,7 +149,7 @@ public class SQLServerProcedureAction extends 
ProcedureAction {
                                counts = new ArrayList<>();
                        }
 
-                       counts.add(Integer.valueOf(resultCount));
+                       counts.add(resultCount);
                }
 
                @Override
@@ -164,7 +164,7 @@ public class SQLServerProcedureAction extends 
ProcedureAction {
                }
 
                @Override
-               public void nextRows(Query q, ResultIterator it) {
+               public void nextRows(Query q, ResultIterator<?> it) {
                        observer.nextRows(q, it);
                }
 
diff --git 
a/cayenne/src/main/java/org/apache/cayenne/query/IteratedQueryDecorator.java 
b/cayenne/src/main/java/org/apache/cayenne/query/IteratedQueryDecorator.java
index bbb2e318e..47d505ac4 100644
--- a/cayenne/src/main/java/org/apache/cayenne/query/IteratedQueryDecorator.java
+++ b/cayenne/src/main/java/org/apache/cayenne/query/IteratedQueryDecorator.java
@@ -23,7 +23,7 @@ import org.apache.cayenne.map.EntityResolver;
 
 /**
  * A simple decorator for an iterated query.
- * @see org.apache.cayenne.access.DataContext#iterator(Select)
+ *
  * @since 5.0
  */
 public class IteratedQueryDecorator implements Query {
diff --git 
a/cayenne/src/test/java/org/apache/cayenne/access/util/DefaultOperationObserverIT.java
 
b/cayenne/src/test/java/org/apache/cayenne/access/util/DefaultOperationObserverIT.java
deleted file mode 100644
index 4857ff7da..000000000
--- 
a/cayenne/src/test/java/org/apache/cayenne/access/util/DefaultOperationObserverIT.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*****************************************************************
- *   Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    https://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- ****************************************************************/
-
-package org.apache.cayenne.access.util;
-
-import org.apache.cayenne.query.ObjectSelect;
-import org.apache.cayenne.testdo.testmap.Artist;
-import org.apache.cayenne.unit.CayenneProjects;
-import org.apache.cayenne.unit.CayenneTestsEnv;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.junit.jupiter.api.Test;
-import static org.junit.jupiter.api.Assertions.assertFalse;
-import static org.junit.jupiter.api.Assertions.assertTrue;
-
-public class DefaultOperationObserverIT {
-
-    @RegisterExtension
-    static final CayenneTestsEnv env = 
CayenneTestsEnv.forProject(CayenneProjects.TESTMAP_PROJECT);
-
-    @Test
-    public void hasExceptions1() {
-        DefaultOperationObserver observer = new DefaultOperationObserver();
-        assertFalse(observer.hasExceptions());
-        observer.nextGlobalException(new Exception());
-        assertTrue(observer.hasExceptions());
-    }
-
-    @Test
-    public void hasExceptions2() {
-        DefaultOperationObserver observer = new DefaultOperationObserver();
-        assertFalse(observer.hasExceptions());
-        observer.nextQueryException(ObjectSelect.query(Artist.class), new 
Exception());
-        assertTrue(observer.hasExceptions());
-    }
-}


Reply via email to