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());
- }
-}