From eeee9f25986ba9f987b7d5a0ef8fca4092f629d8 Mon Sep 17 00:00:00 2001
From: Mark Rotteveel <mark@lawinegevaar.nl>
Date: Sat, 6 Jan 2024 14:32:10 +0100
Subject: [PATCH] Various code cleanup/fixes as suggested by Sonarlint

---
 .../internal/tools/PerFacilityStore.java      | 16 ++--
 .../gds/ng/jna/FbEmbeddedDatabaseFactory.java |  6 +-
 .../firebirdsql/gds/ng/jna/JnaConnection.java |  8 +-
 .../firebirdsql/gds/ng/jna/JnaDatabase.java   |  8 +-
 .../gds/ng/jna/NativeResourceTracker.java     |  7 +-
 .../jna/embedded/FirebirdEmbeddedLookup.java  |  6 +-
 ...bstractConnectionPropertiesDataSource.java |  4 +-
 .../org/firebirdsql/ds/StatementHandler.java  | 14 +--
 .../firebirdsql/ds/XAConnectionHandler.java   |  3 +-
 .../encodings/EncodingFactory.java            |  2 +-
 .../org/firebirdsql/event/FBEventManager.java |  1 +
 .../org/firebirdsql/gds/impl/GDSFactory.java  |  2 -
 .../gds/impl/GDSServerVersion.java            |  4 +-
 .../gds/impl/wire/FbCipherInputStream.java    |  2 +-
 .../gds/impl/wire/XdrInputStream.java         |  4 +-
 .../gds/impl/wire/XdrOutputStream.java        |  4 +-
 .../gds/ng/AbstractFbDatabase.java            |  2 +-
 .../gds/ng/AbstractFbStatement.java           |  9 +-
 .../gds/ng/AbstractParameterConverter.java    |  2 +-
 .../org/firebirdsql/gds/ng/DatatypeCoder.java |  1 -
 .../gds/ng/EncodingSpecificDatatypeCoder.java |  3 +-
 .../org/firebirdsql/gds/ng/FbBatchConfig.java |  4 +-
 .../gds/ng/ServerVersionInformation.java      | 14 ++-
 .../gds/ng/tz/TimeZoneDatatypeCoder.java      |  4 +-
 .../gds/ng/tz/TimeZoneMapping.java            |  6 +-
 .../gds/ng/wire/AbstractFbWireStatement.java  |  4 +-
 .../gds/ng/wire/AbstractWireOperations.java   | 20 ++--
 .../gds/ng/wire/ProtocolDescriptor.java       |  4 +-
 .../gds/ng/wire/WireConnection.java           |  9 +-
 .../auth/AuthenticationPluginRegistry.java    |  4 +
 .../gds/ng/wire/auth/ClientAuthBlock.java     |  2 +-
 .../gds/ng/wire/auth/srp/SrpClient.java       |  2 +-
 .../wire/crypt/EncryptionPluginRegistry.java  |  4 +
 .../gds/ng/wire/version10/V10Statement.java   |  4 +-
 .../gds/ng/wire/version11/V11Statement.java   |  1 -
 .../wire/version12/V12ParameterConverter.java |  2 +
 .../wire/version13/V13ParameterConverter.java |  2 +
 .../ng/wire/version13/V13WireOperations.java  | 10 +-
 .../ng/wire/version16/V16WireOperations.java  |  5 +-
 .../fb/constants/StandardBlobTypes.java       |  4 +
 .../parser/ReturningClauseDetector.java       |  4 +-
 .../jaybird/parser/StringLiteralToken.java    |  2 +-
 .../firebirdsql/jaybird/props/DpbType.java    |  4 +-
 .../internal/TransactionNameMapping.java      | 33 +++----
 .../jaybird/xca/FBLocalTransaction.java       | 19 ++--
 .../jaybird/xca/FBManagedConnection.java      | 92 +++++++++----------
 .../xca/FBManagedConnectionFactory.java       | 31 +++----
 .../jaybird/xca/FBXAException.java            |  1 +
 .../jaybird/xca/FatalErrorHelper.java         |  2 +-
 .../jdbc/AbstractFieldMetaData.java           |  6 +-
 .../firebirdsql/jdbc/ClientInfoProvider.java  |  4 +-
 src/main/org/firebirdsql/jdbc/FBBlob.java     | 30 +++---
 .../org/firebirdsql/jdbc/FBCachedFetcher.java | 14 +--
 .../firebirdsql/jdbc/FBCallableStatement.java | 33 +++----
 .../org/firebirdsql/jdbc/FBConnection.java    |  4 +-
 .../jdbc/FBConnectionProperties.java          |  4 +-
 .../firebirdsql/jdbc/FBDatabaseMetaData.java  |  8 +-
 .../firebirdsql/jdbc/FBPreparedStatement.java | 23 ++---
 .../org/firebirdsql/jdbc/FBProcedureCall.java |  2 +-
 .../org/firebirdsql/jdbc/FBResultSet.java     | 22 ++---
 src/main/org/firebirdsql/jdbc/FBRowId.java    |  2 +-
 .../org/firebirdsql/jdbc/FBRowUpdater.java    |  5 +-
 .../org/firebirdsql/jdbc/FBSQLException.java  |  2 +-
 .../org/firebirdsql/jdbc/FBStatement.java     | 19 +++-
 .../firebirdsql/jdbc/FirebirdConnection.java  |  2 +-
 .../jdbc/FirebirdConnectionProperties.java    |  4 +-
 .../jdbc/GeneratedKeysQueryBuilder.java       |  2 +-
 .../jdbc/InternalTransactionCoordinator.java  |  1 +
 .../org/firebirdsql/jdbc/ServerBatch.java     |  8 +-
 .../jdbc/escape/FBEscapedCallParser.java      | 30 +++---
 .../jdbc/field/FBBigDecimalField.java         | 18 ++++
 .../firebirdsql/jdbc/field/FBBlobField.java   |  4 +-
 .../jdbc/field/FBCachedBlobField.java         |  4 +-
 .../jdbc/field/FBCachedLongVarCharField.java  |  4 +-
 .../firebirdsql/jdbc/field/FBDateField.java   |  1 +
 .../jdbc/field/FBDecfloatField.java           |  1 +
 .../firebirdsql/jdbc/field/FBDoubleField.java | 48 +++++++---
 .../org/firebirdsql/jdbc/field/FBField.java   | 60 ++++++------
 .../firebirdsql/jdbc/field/FBFloatField.java  | 18 ++++
 .../firebirdsql/jdbc/field/FBNullField.java   | 32 +++++++
 .../jdbc/metadata/AbstractKeysMethod.java     | 30 +++---
 .../jdbc/metadata/GetAttributes.java          | 44 ++++-----
 .../jdbc/metadata/GetBestRowIdentifier.java   | 22 +++--
 .../metadata/GetClientInfoProperties.java     | 10 +-
 .../jdbc/metadata/GetColumnPrivileges.java    | 19 ++--
 .../firebirdsql/jdbc/metadata/GetColumns.java | 54 +++++------
 .../jdbc/metadata/GetCrossReference.java      | 49 +++++-----
 .../jdbc/metadata/GetFunctionColumns.java     | 36 ++++----
 .../jdbc/metadata/GetFunctions.java           | 24 ++---
 .../jdbc/metadata/GetIndexInfo.java           | 28 +++---
 .../jdbc/metadata/GetPrimaryKeys.java         | 14 +--
 .../jdbc/metadata/GetProcedureColumns.java    | 42 +++++----
 .../jdbc/metadata/GetProcedures.java          | 18 ++--
 .../jdbc/metadata/GetPseudoColumns.java       | 26 +++---
 .../jdbc/metadata/GetSuperTables.java         | 10 +-
 .../jdbc/metadata/GetSuperTypes.java          | 14 +--
 .../jdbc/metadata/GetTablePrivileges.java     | 18 ++--
 .../firebirdsql/jdbc/metadata/GetTables.java  | 26 +++---
 .../jdbc/metadata/GetTypeInfo.java            | 38 ++++----
 .../jdbc/metadata/GetVersionColumns.java      | 20 ++--
 .../firebirdsql/management/FBCommandLine.java | 47 ++++------
 .../management/FBServiceManager.java          | 14 ++-
 .../management/FBStatisticsManager.java       |  4 +-
 .../management/FBStreamingBackupManager.java  |  4 +-
 .../management/FBTraceManager.java            |  5 +-
 .../management/ServiceManager.java            |  8 +-
 .../firebirdsql/util/FirebirdSupportInfo.java | 49 ++++------
 .../org/firebirdsql/util/NumericHelper.java   |  2 +-
 .../gds/ng/DefaultDatatypeCoderTest.java      |  2 +-
 .../ng/EncodingSpecificDatatypeCoderTest.java |  4 +-
 .../ng/wire/crypt/EncryptionInitInfoTest.java |  4 +-
 .../jaybird/xca/FBXAResourceTest.java         |  4 +-
 .../firebirdsql/jdbc/BatchUpdatesTest.java    |  6 +-
 .../firebirdsql/jdbc/FBConnectionTest.java    |  2 +-
 .../jdbc/FBDatabaseMetaDataIndexInfoTest.java |  2 +-
 .../firebirdsql/jdbc/JDBCUrlPrefixTest.java   |  2 +-
 .../jdbc/escape/LocateFunctionTest.java       |  2 +-
 .../jdbc/escape/OuterJoinEscapesTest.java     | 12 +--
 .../firebirdsql/jdbc/metadata/ClauseTest.java |  4 +-
 .../metadata/MetadataPatternMatcherTest.java  |  4 +-
 .../management/FBMaintenanceManagerTest.java  |  4 +-
 121 files changed, 819 insertions(+), 724 deletions(-)

diff --git a/internal-tools/src/main/java/org/firebirdsql/internal/tools/PerFacilityStore.java b/internal-tools/src/main/java/org/firebirdsql/internal/tools/PerFacilityStore.java
index 9f563713f..62268e8e8 100644
--- a/internal-tools/src/main/java/org/firebirdsql/internal/tools/PerFacilityStore.java
+++ b/internal-tools/src/main/java/org/firebirdsql/internal/tools/PerFacilityStore.java
@@ -20,10 +20,10 @@
 
 import java.io.IOException;
 import java.nio.file.Path;
-import java.util.HashMap;
+import java.util.EnumMap;
 import java.util.Map;
 import java.util.TreeMap;
-import java.util.function.Function;
+import java.util.function.IntFunction;
 
 import static java.lang.String.format;
 import static org.firebirdsql.internal.tools.MessageConverter.toJaybirdMessageFormat;
@@ -36,13 +36,11 @@
  */
 class PerFacilityStore extends MessageStore {
 
+    @SuppressWarnings("unused")
     private static final int MAX_FACILITY = 25; // NOTE: This is Firebird max, Jaybird has facility 26
-    static final int FACILITY_SIZE = MAX_FACILITY + 1;
 
-    private final Map<Facility, Map<Integer, String>> messagesPerFacility =
-            new HashMap<>((int) (FACILITY_SIZE / 0.75f));
-    private final Map<Facility, Map<Integer, String>> sqlStatesPerFacility =
-            new HashMap<>((int) (FACILITY_SIZE / 0.75f));
+    private final Map<Facility, Map<Integer, String>> messagesPerFacility = new EnumMap<>(Facility.class);
+    private final Map<Facility, Map<Integer, String>> sqlStatesPerFacility = new EnumMap<>(Facility.class);
     private final SymbolStore symbolStore = new SymbolStore();
 
     @Override
@@ -79,8 +77,8 @@ public void save() throws IOException {
         symbolStore.save();
     }
 
-    private void save(Map<Facility, Map<Integer, String>> facilityMap,
-            Function<Integer, String> filenameGenerator) throws IOException {
+    private void save(Map<Facility, Map<Integer, String>> facilityMap, IntFunction<String> filenameGenerator)
+            throws IOException {
         for (Map.Entry<Facility, Map<Integer, String>> facilityEntry : facilityMap.entrySet()) {
             Map<Integer, String> facilityData = facilityEntry.getValue();
             if (facilityData.isEmpty()) {
diff --git a/jaybird-native/src/main/java/org/firebirdsql/gds/ng/jna/FbEmbeddedDatabaseFactory.java b/jaybird-native/src/main/java/org/firebirdsql/gds/ng/jna/FbEmbeddedDatabaseFactory.java
index d88467ad5..a26466ca9 100644
--- a/jaybird-native/src/main/java/org/firebirdsql/gds/ng/jna/FbEmbeddedDatabaseFactory.java
+++ b/jaybird-native/src/main/java/org/firebirdsql/gds/ng/jna/FbEmbeddedDatabaseFactory.java
@@ -106,9 +106,9 @@ private List<String> findLibrariesToTry() {
         if (optionalFbEmbeddedInstance.isPresent()) {
             FirebirdEmbeddedLibrary firebirdEmbeddedLibrary = optionalFbEmbeddedInstance.get();
             log.log(INFO, "Found Firebird Embedded {0} on classpath", firebirdEmbeddedLibrary.getVersion());
-            if (firebirdEmbeddedLibrary instanceof DisposableFirebirdEmbeddedLibrary) {
-                NativeResourceTracker.strongRegisterNativeResource(new FirebirdEmbeddedLibraryNativeResource(
-                        (DisposableFirebirdEmbeddedLibrary) firebirdEmbeddedLibrary));
+            if (firebirdEmbeddedLibrary instanceof DisposableFirebirdEmbeddedLibrary disposableLibrary) {
+                NativeResourceTracker.strongRegisterNativeResource(
+                        new FirebirdEmbeddedLibraryNativeResource(disposableLibrary));
             }
 
             Path entryPointPath = firebirdEmbeddedLibrary.getEntryPointPath().toAbsolutePath();
diff --git a/jaybird-native/src/main/java/org/firebirdsql/gds/ng/jna/JnaConnection.java b/jaybird-native/src/main/java/org/firebirdsql/gds/ng/jna/JnaConnection.java
index a7801410e..1b3335fcb 100644
--- a/jaybird-native/src/main/java/org/firebirdsql/gds/ng/jna/JnaConnection.java
+++ b/jaybird-native/src/main/java/org/firebirdsql/gds/ng/jna/JnaConnection.java
@@ -46,7 +46,7 @@
 public abstract class JnaConnection<T extends IAttachProperties<T>, C extends JnaAttachment>
         extends AbstractConnection<T, C> {
 
-    private static final boolean bigEndian = ByteOrder.nativeOrder() == ByteOrder.BIG_ENDIAN;
+    private static final boolean BIG_ENDIAN = ByteOrder.nativeOrder() == ByteOrder.BIG_ENDIAN;
 
     private final FbClientLibrary clientLibrary;
     private final String attachUrl;
@@ -152,8 +152,8 @@ protected void processStatusVector(ISC_STATUS[] statusVector, WarningMessageCall
 
         if (!builder.isEmpty()) {
             SQLException exception = builder.toFlatSQLException();
-            if (exception instanceof SQLWarning) {
-                warningMessageCallback.processWarning((SQLWarning) exception);
+            if (exception instanceof SQLWarning warning) {
+                warningMessageCallback.processWarning(warning);
             } else {
                 throw exception;
             }
@@ -161,7 +161,7 @@ protected void processStatusVector(ISC_STATUS[] statusVector, WarningMessageCall
     }
 
     final DatatypeCoder createDatatypeCoder() {
-        if (bigEndian) {
+        if (BIG_ENDIAN) {
             return BigEndianDatatypeCoder.forEncodingFactory(getEncodingFactory());
         }
         return LittleEndianDatatypeCoder.forEncodingFactory(getEncodingFactory());
diff --git a/jaybird-native/src/main/java/org/firebirdsql/gds/ng/jna/JnaDatabase.java b/jaybird-native/src/main/java/org/firebirdsql/gds/ng/jna/JnaDatabase.java
index 8df032b5f..718ac80a6 100644
--- a/jaybird-native/src/main/java/org/firebirdsql/gds/ng/jna/JnaDatabase.java
+++ b/jaybird-native/src/main/java/org/firebirdsql/gds/ng/jna/JnaDatabase.java
@@ -64,11 +64,9 @@ public class JnaDatabase extends AbstractFbDatabase<JnaDatabaseConnection>
     public JnaDatabase(JnaDatabaseConnection connection) {
         super(connection, connection.createDatatypeCoder());
         clientLibrary = connection.getClientLibrary();
-        if (clientLibrary instanceof FbClientFeatureAccess) {
-            clientFeatures = ((FbClientFeatureAccess) clientLibrary).getFeatures();
-        } else {
-            clientFeatures = emptySet();
-        }
+        clientFeatures = clientLibrary instanceof FbClientFeatureAccess featureAccess
+                ? featureAccess.getFeatures()
+                : emptySet();
     }
 
     /**
diff --git a/jaybird-native/src/main/java/org/firebirdsql/gds/ng/jna/NativeResourceTracker.java b/jaybird-native/src/main/java/org/firebirdsql/gds/ng/jna/NativeResourceTracker.java
index 0dfbe1da3..7400e4d84 100644
--- a/jaybird-native/src/main/java/org/firebirdsql/gds/ng/jna/NativeResourceTracker.java
+++ b/jaybird-native/src/main/java/org/firebirdsql/gds/ng/jna/NativeResourceTracker.java
@@ -128,10 +128,9 @@ public static void shutdownNativeResources() {
     }
 
     static void disableShutdownHook() {
-        Object currentShutdownThread = shutdownThread.getAndSet(new Object());
-        if (currentShutdownThread instanceof Thread) {
+        if (shutdownThread.getAndSet(new Object()) instanceof Thread thread) {
             try {
-                Runtime.getRuntime().removeShutdownHook((Thread) currentShutdownThread);
+                Runtime.getRuntime().removeShutdownHook(thread);
             } catch (IllegalStateException e) {
                 // ignore
             } catch (SecurityException e) {
@@ -182,7 +181,7 @@ public void run() {
     /**
      * A native resource that can be registered with {@link NativeResourceTracker}.
      */
-    static abstract class NativeResource {
+    abstract static class NativeResource {
         /**
          * Dispose method to clean up the native resource.
          * <p>
diff --git a/jaybird-native/src/main/java/org/firebirdsql/jna/embedded/FirebirdEmbeddedLookup.java b/jaybird-native/src/main/java/org/firebirdsql/jna/embedded/FirebirdEmbeddedLookup.java
index 65f12b2d3..0170d8851 100644
--- a/jaybird-native/src/main/java/org/firebirdsql/jna/embedded/FirebirdEmbeddedLookup.java
+++ b/jaybird-native/src/main/java/org/firebirdsql/jna/embedded/FirebirdEmbeddedLookup.java
@@ -35,10 +35,14 @@
  * @author Mark Rotteveel
  * @since 5
  */
-public class FirebirdEmbeddedLookup {
+public final class FirebirdEmbeddedLookup {
 
     private static final System.Logger log = System.getLogger(FirebirdEmbeddedLookup.class.getName());
 
+    private FirebirdEmbeddedLookup() {
+        // no instances
+    }
+
     /**
      * Tries to find a Firebird Embedded library service provider for the current platform and install it.
      * <p>
diff --git a/src/main/org/firebirdsql/ds/AbstractConnectionPropertiesDataSource.java b/src/main/org/firebirdsql/ds/AbstractConnectionPropertiesDataSource.java
index ba6efaa01..d204909cd 100644
--- a/src/main/org/firebirdsql/ds/AbstractConnectionPropertiesDataSource.java
+++ b/src/main/org/firebirdsql/ds/AbstractConnectionPropertiesDataSource.java
@@ -457,14 +457,14 @@ public void setUseCatalogAsPackage(boolean useCatalogAsPackage) {
     }
 
     @SuppressWarnings("deprecation")
-    @Deprecated
+    @Deprecated(since = "5")
     @Override
     public String getUserName() {
         return FirebirdConnectionProperties.super.getUserName();
     }
 
     @SuppressWarnings("deprecation")
-    @Deprecated
+    @Deprecated(since = "5")
     @Override
     public void setUserName(String userName) {
         FirebirdConnectionProperties.super.setUserName(userName);
diff --git a/src/main/org/firebirdsql/ds/StatementHandler.java b/src/main/org/firebirdsql/ds/StatementHandler.java
index 050eb783c..289fd9db3 100644
--- a/src/main/org/firebirdsql/ds/StatementHandler.java
+++ b/src/main/org/firebirdsql/ds/StatementHandler.java
@@ -163,14 +163,14 @@ public boolean isClosed() {
     }
 
     // Statement methods
-    private final static Method STATEMENT_IS_CLOSED = findMethod(Statement.class, "isClosed", new Class[0]);
-    private final static Method FIREBIRD_STATEMENT_IS_CLOSED = findMethod(FirebirdStatement.class, "isClosed",
+    private static final Method STATEMENT_IS_CLOSED = findMethod(Statement.class, "isClosed", new Class[0]);
+    private static final Method FIREBIRD_STATEMENT_IS_CLOSED = findMethod(FirebirdStatement.class, "isClosed",
             new Class[0]);
-    private final static Method STATEMENT_CLOSE = findMethod(Statement.class, "close", new Class[0]);
-    private final static Method GET_CONNECTION = findMethod(Statement.class, "getConnection", new Class[0]);
+    private static final Method STATEMENT_CLOSE = findMethod(Statement.class, "close", new Class[0]);
+    private static final Method GET_CONNECTION = findMethod(Statement.class, "getConnection", new Class[0]);
 
     // Object Methods
-    private final static Method TO_STRING = findMethod(Object.class, "toString", new Class[0]);
-    private final static Method EQUALS = findMethod(Object.class, "equals", new Class[] { Object.class });
-    private final static Method HASH_CODE = findMethod(Object.class, "hashCode", new Class[0]);
+    private static final Method TO_STRING = findMethod(Object.class, "toString", new Class[0]);
+    private static final Method EQUALS = findMethod(Object.class, "equals", new Class[] { Object.class });
+    private static final Method HASH_CODE = findMethod(Object.class, "hashCode", new Class[0]);
 }
diff --git a/src/main/org/firebirdsql/ds/XAConnectionHandler.java b/src/main/org/firebirdsql/ds/XAConnectionHandler.java
index 2b7455389..7490bf11e 100644
--- a/src/main/org/firebirdsql/ds/XAConnectionHandler.java
+++ b/src/main/org/firebirdsql/ds/XAConnectionHandler.java
@@ -35,7 +35,8 @@ final class XAConnectionHandler extends PooledConnectionHandler {
         super(connection, owner);
         xaOwner = owner;
     }
-    
+
+    @Override
     boolean isRollbackAllowed() throws SQLException {
         return !(xaOwner.inDistributedTransaction() || connection.getAutoCommit());
     }
diff --git a/src/main/org/firebirdsql/encodings/EncodingFactory.java b/src/main/org/firebirdsql/encodings/EncodingFactory.java
index 18a9fea91..09f5c07a4 100644
--- a/src/main/org/firebirdsql/encodings/EncodingFactory.java
+++ b/src/main/org/firebirdsql/encodings/EncodingFactory.java
@@ -63,7 +63,7 @@ private static class DefaultEncodingFactory {
         }
     }
 
-    // Linked HashMap because we need to preserve insertion order for the lazy initialization;
+    // Linked HashMap because we need to preserve insertion order for the lazy initialization.
     // Initial capacity of 128 should prevent resizing during loading (if only DefaultEncodingSet is present)
     private final Map<String, EncodingDefinition> firebirdEncodingToDefinition = new LinkedHashMap<>(128);
     private final EncodingDefinition[] firebirdCharacterSetIdToDefinition =
diff --git a/src/main/org/firebirdsql/event/FBEventManager.java b/src/main/org/firebirdsql/event/FBEventManager.java
index 3bcc0d361..49a489f56 100644
--- a/src/main/org/firebirdsql/event/FBEventManager.java
+++ b/src/main/org/firebirdsql/event/FBEventManager.java
@@ -205,6 +205,7 @@ private void terminateDispatcher() throws SQLException {
             try {
                 dispatchThread.join();
             } catch (InterruptedException ex) {
+                Thread.currentThread().interrupt();
                throw new SQLException(ex);
             } finally {
                 this.eventDispatcher = null;
diff --git a/src/main/org/firebirdsql/gds/impl/GDSFactory.java b/src/main/org/firebirdsql/gds/impl/GDSFactory.java
index b89d9dbac..6aec3b3fe 100644
--- a/src/main/org/firebirdsql/gds/impl/GDSFactory.java
+++ b/src/main/org/firebirdsql/gds/impl/GDSFactory.java
@@ -30,8 +30,6 @@
 import org.firebirdsql.jaybird.util.PluginLoader;
 import org.firebirdsql.util.InternalApi;
 
-import java.io.Serial;
-import java.io.Serializable;
 import java.sql.SQLException;
 import java.util.*;
 import java.util.Map.Entry;
diff --git a/src/main/org/firebirdsql/gds/impl/GDSServerVersion.java b/src/main/org/firebirdsql/gds/impl/GDSServerVersion.java
index 2f58e97e8..f058c767d 100644
--- a/src/main/org/firebirdsql/gds/impl/GDSServerVersion.java
+++ b/src/main/org/firebirdsql/gds/impl/GDSServerVersion.java
@@ -158,7 +158,7 @@ public String getFullVersion() {
      * @return Protocol version of the connection, or {@code -1} if this information is not available.
      */
     public int getProtocolVersion() {
-        // We assume the protocol information is in the second version string;
+        // We assume the protocol information is in the second version string,
         // this assumption may be wrong for multi-hop connections
         if (rawVersions.length == 1 || rawVersions[1] == null) return -1;
         Matcher connectionMetadataMatcher = CONNECTION_METADATA_PATTERN.matcher(rawVersions[1]);
@@ -181,7 +181,7 @@ public boolean isWireCompressionUsed() {
     }
 
     private String getConnectionOptions() {
-        // We assume the protocol information is in the second version string;
+        // We assume the protocol information is in the second version string,
         // this assumption may be wrong for multi-hop connections
         if (rawVersions.length == 1 || rawVersions[1] == null) return "";
         Matcher connectionMetadataMatcher = CONNECTION_METADATA_PATTERN.matcher(rawVersions[1]);
diff --git a/src/main/org/firebirdsql/gds/impl/wire/FbCipherInputStream.java b/src/main/org/firebirdsql/gds/impl/wire/FbCipherInputStream.java
index 13cff4cbf..49da7251b 100644
--- a/src/main/org/firebirdsql/gds/impl/wire/FbCipherInputStream.java
+++ b/src/main/org/firebirdsql/gds/impl/wire/FbCipherInputStream.java
@@ -90,7 +90,7 @@ public int read() throws IOException {
             } while (i == 0);
             if (i == -1) return -1;
         }
-        return (int) outBuf[outPos++] & 0xFF;
+        return outBuf[outPos++] & 0xFF;
     }
 
     @Override
diff --git a/src/main/org/firebirdsql/gds/impl/wire/XdrInputStream.java b/src/main/org/firebirdsql/gds/impl/wire/XdrInputStream.java
index a099794c7..8eb675536 100644
--- a/src/main/org/firebirdsql/gds/impl/wire/XdrInputStream.java
+++ b/src/main/org/firebirdsql/gds/impl/wire/XdrInputStream.java
@@ -235,8 +235,8 @@ public void setCipher(Cipher cipher) throws IOException {
             throw new IOException("Input stream already encrypted");
         }
         InputStream currentStream = in;
-        if (currentStream instanceof EncryptedStreamSupport) {
-            ((EncryptedStreamSupport) currentStream).setCipher(cipher);
+        if (currentStream instanceof EncryptedStreamSupport encryptedStreamSupport) {
+            encryptedStreamSupport.setCipher(cipher);
         } else {
             in = new FbCipherInputStream(currentStream, cipher);
         }
diff --git a/src/main/org/firebirdsql/gds/impl/wire/XdrOutputStream.java b/src/main/org/firebirdsql/gds/impl/wire/XdrOutputStream.java
index 7e471e3ae..6364ba969 100644
--- a/src/main/org/firebirdsql/gds/impl/wire/XdrOutputStream.java
+++ b/src/main/org/firebirdsql/gds/impl/wire/XdrOutputStream.java
@@ -368,8 +368,8 @@ public void setCipher(Cipher cipher) throws IOException {
         }
         flush();
         OutputStream currentStream = out;
-        if (currentStream instanceof EncryptedStreamSupport) {
-            ((EncryptedStreamSupport) currentStream).setCipher(cipher);
+        if (currentStream instanceof EncryptedStreamSupport encryptedStreamSupport) {
+            encryptedStreamSupport.setCipher(cipher);
         } else {
             out = new CipherOutputStream(currentStream, cipher);
         }
diff --git a/src/main/org/firebirdsql/gds/ng/AbstractFbDatabase.java b/src/main/org/firebirdsql/gds/ng/AbstractFbDatabase.java
index e0f038a0a..a82a2cd70 100644
--- a/src/main/org/firebirdsql/gds/ng/AbstractFbDatabase.java
+++ b/src/main/org/firebirdsql/gds/ng/AbstractFbDatabase.java
@@ -283,7 +283,7 @@ public final void transactionStateChanged(FbTransaction transaction, Transaction
                This is acceptable as commit/rollback failure should be limited to situations were the database
                is either inaccessible and the transaction is likely already rolled back or pending rollback by
                the server, or the transaction was already committed or rolled back.
-            */
+             */
             // TODO "register" transaction as pendingEnd for debugging?
         case PREPARED:
             try (LockCloseable ignored = withLock()) {
diff --git a/src/main/org/firebirdsql/gds/ng/AbstractFbStatement.java b/src/main/org/firebirdsql/gds/ng/AbstractFbStatement.java
index 1bde2b9ea..a59426a9c 100644
--- a/src/main/org/firebirdsql/gds/ng/AbstractFbStatement.java
+++ b/src/main/org/firebirdsql/gds/ng/AbstractFbStatement.java
@@ -28,7 +28,6 @@
 
 import java.sql.SQLException;
 import java.sql.SQLNonTransientException;
-import java.sql.SQLWarning;
 import java.util.Collections;
 import java.util.EnumSet;
 import java.util.Set;
@@ -56,13 +55,9 @@ public abstract class AbstractFbStatement implements FbStatement {
     private static final int IN_CURSOR = 0;
     private static final int AFTER_LAST = 1;
 
-    private final WarningMessageCallback warningCallback = new WarningMessageCallback() {
-        @Override
-        public void processWarning(SQLWarning warning) {
-            statementListenerDispatcher.warningReceived(AbstractFbStatement.this, warning);
-        }
-    };
     protected final StatementListenerDispatcher statementListenerDispatcher = new StatementListenerDispatcher();
+    private final WarningMessageCallback warningCallback = warning ->
+            statementListenerDispatcher.warningReceived(AbstractFbStatement.this, warning);
     protected final ExceptionListenerDispatcher exceptionListenerDispatcher = new ExceptionListenerDispatcher(this);
     private volatile int cursorPosition = BEFORE_FIRST;
     // Indicates whether at least one fetch was done for the current cursor
diff --git a/src/main/org/firebirdsql/gds/ng/AbstractParameterConverter.java b/src/main/org/firebirdsql/gds/ng/AbstractParameterConverter.java
index 01d4bcfe6..e02e664e1 100644
--- a/src/main/org/firebirdsql/gds/ng/AbstractParameterConverter.java
+++ b/src/main/org/firebirdsql/gds/ng/AbstractParameterConverter.java
@@ -128,7 +128,7 @@ protected void populateDefaultProperties(final S connection, final ServiceParame
         if (props.getRoleName() != null) {
             spb.addArgument(isc_spb_sql_role_name, props.getRoleName());
         }
-        if (props.getConnectTimeout() != IConnectionProperties.DEFAULT_CONNECT_TIMEOUT) {
+        if (props.getConnectTimeout() != IAttachProperties.DEFAULT_CONNECT_TIMEOUT) {
             spb.addArgument(isc_spb_connect_timeout, props.getConnectTimeout());
         }
     }
diff --git a/src/main/org/firebirdsql/gds/ng/DatatypeCoder.java b/src/main/org/firebirdsql/gds/ng/DatatypeCoder.java
index 8b19b057e..9cb751ced 100644
--- a/src/main/org/firebirdsql/gds/ng/DatatypeCoder.java
+++ b/src/main/org/firebirdsql/gds/ng/DatatypeCoder.java
@@ -33,7 +33,6 @@
 import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.time.LocalTime;
-import java.util.Calendar;
 
 /**
  * Interface defining the encoding and decoding for Firebird (numerical) data types.
diff --git a/src/main/org/firebirdsql/gds/ng/EncodingSpecificDatatypeCoder.java b/src/main/org/firebirdsql/gds/ng/EncodingSpecificDatatypeCoder.java
index 1f7e04949..84e0524e2 100644
--- a/src/main/org/firebirdsql/gds/ng/EncodingSpecificDatatypeCoder.java
+++ b/src/main/org/firebirdsql/gds/ng/EncodingSpecificDatatypeCoder.java
@@ -114,8 +114,7 @@ public boolean equals(Object o) {
         if (o == this) {
             return true;
         }
-        if (o instanceof EncodingSpecificDatatypeCoder) {
-            EncodingSpecificDatatypeCoder other = (EncodingSpecificDatatypeCoder) o;
+        if (o instanceof EncodingSpecificDatatypeCoder other) {
             return encodingDefinition.equals(other.encodingDefinition)
                    && parentCoder.getClass() == other.parentCoder.getClass();
         } else {
diff --git a/src/main/org/firebirdsql/gds/ng/FbBatchConfig.java b/src/main/org/firebirdsql/gds/ng/FbBatchConfig.java
index dc0e65c36..5bbee7eef 100644
--- a/src/main/org/firebirdsql/gds/ng/FbBatchConfig.java
+++ b/src/main/org/firebirdsql/gds/ng/FbBatchConfig.java
@@ -167,8 +167,8 @@ default void populateBatchParameterBuffer(BatchParameterBuffer batchPb) {
         if (batchBufferSize() >= 0) {
             batchPb.addArgument(TAG_BUFFER_BYTES_SIZE, batchBufferSize());
         }
-        // Doesn't seem to make a difference in current implementation;
-        // in practice we register existing blobs under their own id (see registerBlobs in V16Statement)
+        // Doesn't seem to make a difference in current implementation, in practice we register existing blobs under
+        // their own id (see registerBlobs in V16Statement)
         // TODO Might need to change when implementing batching of blobs
         batchPb.addArgument(TAG_BLOB_POLICY, BLOB_ID_USER);
     }
diff --git a/src/main/org/firebirdsql/gds/ng/ServerVersionInformation.java b/src/main/org/firebirdsql/gds/ng/ServerVersionInformation.java
index cae9dce0d..dd8d8d662 100644
--- a/src/main/org/firebirdsql/gds/ng/ServerVersionInformation.java
+++ b/src/main/org/firebirdsql/gds/ng/ServerVersionInformation.java
@@ -138,8 +138,8 @@ public static ServerVersionInformation getForVersion(GDSServerVersion serverVers
         return getForVersion(serverVersion.getMajorVersion(), serverVersion.getMinorVersion());
     }
 
-    private static class Constants {
-        public static final byte[] V1_0_STATEMENT_INFO = new byte[] {
+    private static final class Constants {
+        static final byte[] V1_0_STATEMENT_INFO = new byte[] {
                 isc_info_sql_stmt_type,
                 isc_info_sql_select,
                 isc_info_sql_describe_vars,
@@ -165,7 +165,7 @@ private static class Constants {
                 //isc_info_sql_owner,
                 isc_info_sql_describe_end
         };
-        public static final byte[] V_1_0_PARAMETER_INFO = new byte[] {
+        static final byte[] V_1_0_PARAMETER_INFO = new byte[] {
                 isc_info_sql_describe_vars,
                 isc_info_sql_sqlda_seq,
                 isc_info_sql_type, isc_info_sql_sub_type,
@@ -176,7 +176,7 @@ private static class Constants {
                 isc_info_sql_owner,
                 isc_info_sql_describe_end
         };
-        public static final byte[] V_2_0_STATEMENT_INFO = new byte[] {
+        static final byte[] V_2_0_STATEMENT_INFO = new byte[] {
                 isc_info_sql_stmt_type,
                 isc_info_sql_select,
                 isc_info_sql_describe_vars,
@@ -203,7 +203,7 @@ private static class Constants {
                 //isc_info_sql_owner,
                 isc_info_sql_describe_end
         };
-        public static final byte[] V_2_0_PARAMETER_INFO = new byte[] {
+        static final byte[] V_2_0_PARAMETER_INFO = new byte[] {
                 isc_info_sql_describe_vars,
                 isc_info_sql_sqlda_seq,
                 isc_info_sql_type, isc_info_sql_sub_type,
@@ -215,5 +215,9 @@ private static class Constants {
                 isc_info_sql_owner,
                 isc_info_sql_describe_end
         };
+
+        private Constants() {
+            // no instances
+        }
     }
 }
diff --git a/src/main/org/firebirdsql/gds/ng/tz/TimeZoneDatatypeCoder.java b/src/main/org/firebirdsql/gds/ng/tz/TimeZoneDatatypeCoder.java
index a2e38d206..fab5c6a4f 100644
--- a/src/main/org/firebirdsql/gds/ng/tz/TimeZoneDatatypeCoder.java
+++ b/src/main/org/firebirdsql/gds/ng/tz/TimeZoneDatatypeCoder.java
@@ -191,7 +191,7 @@ private OffsetTime decodeTimeTzToOffsetTime(byte[] timeTzBytes) {
                     .withOffsetSameInstant((ZoneOffset) zoneId);
         }
 
-        // We need to base on a date to determine value, we use the 2020-01-01 date;
+        // We need to base on a date to determine value, we use the 2020-01-01 date,
         // this aligns closest with Firebird behaviour
 
         return ZonedDateTime.of(TIME_TZ_BASE_DATE, utcTime, ZoneOffset.UTC)
@@ -225,7 +225,7 @@ private ZonedDateTime decodeTimeTzToZonedDateTime(byte[] timeTzBytes) {
     }
 
     private ZonedDateTime decodeTimeTzToZonedDateTime(LocalTime utcTime, ZoneId zoneId) {
-        // We need to base on a date to determine value, we use the 2020-01-01 date;
+        // We need to base on a date to determine value, we use the 2020-01-01 date,
         // this aligns closest with Firebird behaviour
 
         ZonedDateTime timeAtBaseDate = ZonedDateTime.of(TIME_TZ_BASE_DATE, utcTime, ZoneOffset.UTC)
diff --git a/src/main/org/firebirdsql/gds/ng/tz/TimeZoneMapping.java b/src/main/org/firebirdsql/gds/ng/tz/TimeZoneMapping.java
index 930d99592..9f2bbdcae 100644
--- a/src/main/org/firebirdsql/gds/ng/tz/TimeZoneMapping.java
+++ b/src/main/org/firebirdsql/gds/ng/tz/TimeZoneMapping.java
@@ -39,7 +39,7 @@ public final class TimeZoneMapping {
 
     private static final TimeZoneMapping INSTANCE = new TimeZoneMapping();
     private static final int MAX_ZONE_ID = 65535;
-    private static final int MAX_OFFSET = 1439; // 23h:59m;
+    private static final int MAX_OFFSET = 1439; // 23h:59m
     private static final int MIN_OFFSET = -MAX_OFFSET;
     private static final int MAX_OFFSET_SUPPORTED = 1080; // 18h:00m; derived from ZoneOffset limitations
     private static final int MIN_OFFSET_SUPPORTED = -MAX_OFFSET_SUPPORTED;
@@ -183,8 +183,8 @@ public int toTimeZoneId(ZoneOffset zoneOffset) {
      * @since 4.0.1
      */
     public int toTimeZoneId(ZoneId zoneId) {
-        if (zoneId instanceof ZoneOffset) {
-            return toTimeZoneId((ZoneOffset) zoneId);
+        if (zoneId instanceof ZoneOffset zoneOffset) {
+            return toTimeZoneId(zoneOffset);
         }
         Integer firebirdId = namedZoneIdCache.get(zoneId);
         if (firebirdId != null) {
diff --git a/src/main/org/firebirdsql/gds/ng/wire/AbstractFbWireStatement.java b/src/main/org/firebirdsql/gds/ng/wire/AbstractFbWireStatement.java
index 7e8e82be9..182d0e5d8 100644
--- a/src/main/org/firebirdsql/gds/ng/wire/AbstractFbWireStatement.java
+++ b/src/main/org/firebirdsql/gds/ng/wire/AbstractFbWireStatement.java
@@ -226,8 +226,8 @@ protected final <T> DeferredAction wrapDeferredResponse(DeferredResponse<T> defe
      * @param exception exception received in a deferred response, or thrown while receiving the deferred response
      */
     private void deferredExceptionHandler(Exception exception) {
-        if (exception instanceof SQLException) {
-            exceptionListenerDispatcher.errorOccurred((SQLException) exception);
+        if (exception instanceof SQLException sqle) {
+            exceptionListenerDispatcher.errorOccurred(sqle);
         }
         if (exception instanceof IOException || exception.getCause() instanceof IOException) {
             forceState(StatementState.ERROR);
diff --git a/src/main/org/firebirdsql/gds/ng/wire/AbstractWireOperations.java b/src/main/org/firebirdsql/gds/ng/wire/AbstractWireOperations.java
index 203bd3efe..940eb1aa4 100644
--- a/src/main/org/firebirdsql/gds/ng/wire/AbstractWireOperations.java
+++ b/src/main/org/firebirdsql/gds/ng/wire/AbstractWireOperations.java
@@ -36,6 +36,8 @@
 import java.sql.SQLWarning;
 import java.util.List;
 
+import static java.util.Objects.requireNonNull;
+import static java.util.Objects.requireNonNullElse;
 import static org.firebirdsql.gds.ISCConstants.*;
 import static org.firebirdsql.gds.impl.wire.WireProtocolConstants.*;
 
@@ -52,8 +54,9 @@ public abstract class AbstractWireOperations implements FbWireOperations {
 
     protected AbstractWireOperations(WireConnection<?, ?> connection,
             WarningMessageCallback defaultWarningMessageCallback) {
-        this.connection = connection;
-        this.defaultWarningMessageCallback = defaultWarningMessageCallback;
+        this.connection = requireNonNull(connection, "connection");
+        this.defaultWarningMessageCallback =
+                requireNonNull(defaultWarningMessageCallback, "defaultWarningMessageCallback");
     }
 
     @Override
@@ -233,14 +236,9 @@ public final void processResponse(Response response) throws SQLException {
      *         Response to process
      */
     public final void processResponseWarnings(final Response response, WarningMessageCallback warningCallback) {
-        if (warningCallback == null) {
-            warningCallback = defaultWarningMessageCallback;
-        }
-        if (response instanceof GenericResponse genericResponse) {
-            SQLException exception = genericResponse.getException();
-            if (exception instanceof SQLWarning) {
-                warningCallback.processWarning((SQLWarning) exception);
-            }
+        if (response instanceof GenericResponse genericResponse
+            && genericResponse.getException() instanceof SQLWarning warning) {
+            requireNonNullElse(warningCallback, defaultWarningMessageCallback).processWarning(warning);
         }
     }
 
@@ -266,7 +264,7 @@ public final void consumePackets(int numberOfResponses, WarningMessageCallback w
             try {
                 readResponse(warningCallback);
             } catch (Exception e) {
-                warningCallback.processWarning(new SQLWarning(e));
+                requireNonNullElse(warningCallback, defaultWarningMessageCallback).processWarning(new SQLWarning(e));
                 // ignoring exceptions
                 log.log(System.Logger.Level.WARNING, "Exception in consumePackets; see debug level for stacktrace");
                 log.log(System.Logger.Level.DEBUG, "Exception in consumePackets", e);
diff --git a/src/main/org/firebirdsql/gds/ng/wire/ProtocolDescriptor.java b/src/main/org/firebirdsql/gds/ng/wire/ProtocolDescriptor.java
index 62e916dc9..99bf5fc7f 100644
--- a/src/main/org/firebirdsql/gds/ng/wire/ProtocolDescriptor.java
+++ b/src/main/org/firebirdsql/gds/ng/wire/ProtocolDescriptor.java
@@ -214,9 +214,9 @@ FbWireBlob createInputBlob(FbWireDatabase database, FbWireTransaction transactio
      * Create an {@link FbWireOperations} implementation for this protocol version.
      *
      * @param connection
-     *         WireConnection instance
+     *         WireConnection instance (non-{@code null})
      * @param defaultWarningMessageCallback
-     *         Default warning message callback
+     *         default warning message callback (non-{@code null})
      * @return Wire operations implementation
      */
     FbWireOperations createWireOperations(WireConnection<?, ?> connection,
diff --git a/src/main/org/firebirdsql/gds/ng/wire/WireConnection.java b/src/main/org/firebirdsql/gds/ng/wire/WireConnection.java
index ad219d82d..79671ab42 100644
--- a/src/main/org/firebirdsql/gds/ng/wire/WireConnection.java
+++ b/src/main/org/firebirdsql/gds/ng/wire/WireConnection.java
@@ -31,8 +31,8 @@
 import org.firebirdsql.gds.ng.AbstractConnection;
 import org.firebirdsql.gds.ng.FbExceptionBuilder;
 import org.firebirdsql.gds.ng.IAttachProperties;
-import org.firebirdsql.gds.ng.IConnectionProperties;
 import org.firebirdsql.gds.ng.LockCloseable;
+import org.firebirdsql.gds.ng.WarningMessageCallback;
 import org.firebirdsql.gds.ng.dbcrypt.DbCryptCallback;
 import org.firebirdsql.gds.ng.wire.auth.ClientAuthBlock;
 import org.firebirdsql.gds.ng.wire.crypt.KnownServerKey;
@@ -78,6 +78,7 @@ public abstract class WireConnection<T extends IAttachProperties<T>, C extends F
             "The server and client could not agree on connection options. A possible reasons is attempting to connect "
             + "to an unsupported Firebird version. See the documentation of connection property 'enableProtocol' for "
             + "a possible workaround.";
+    private static final WarningMessageCallback NOOP_WARNING_MESSAGE_CALLBACK = warning -> {};
 
     // Micro-optimization: we usually expect at most 3 (Firebird 5)
     private final List<KnownServerKey> knownServerKeys = new ArrayList<>(3);
@@ -256,7 +257,7 @@ public final void socketConnect() throws SQLException {
             }
 
             final int socketBufferSize = attachProperties.getSocketBufferSize();
-            if (socketBufferSize != IConnectionProperties.DEFAULT_SOCKET_BUFFER_SIZE) {
+            if (socketBufferSize != IAttachProperties.DEFAULT_SOCKET_BUFFER_SIZE) {
                 socket.setReceiveBufferSize(socketBufferSize);
                 socket.setSendBufferSize(socketBufferSize);
             }
@@ -495,7 +496,7 @@ void clearServerKeys() {
     private AbstractWireOperations getDefaultWireOperations() {
         ProtocolDescriptor protocolDescriptor = protocols
                 .getProtocolDescriptor(WireProtocolConstants.PROTOCOL_VERSION10);
-        return (AbstractWireOperations) protocolDescriptor.createWireOperations(this, null);
+        return (AbstractWireOperations) protocolDescriptor.createWireOperations(this, NOOP_WARNING_MESSAGE_CALLBACK);
     }
 
     /**
@@ -504,7 +505,7 @@ private AbstractWireOperations getDefaultWireOperations() {
     private FbWireOperations getCryptKeyCallbackWireOperations() {
         ProtocolDescriptor protocolDescriptor = protocols
                 .getProtocolDescriptor(WireProtocolConstants.PROTOCOL_VERSION15);
-        return protocolDescriptor.createWireOperations(this, null);
+        return protocolDescriptor.createWireOperations(this, NOOP_WARNING_MESSAGE_CALLBACK);
     }
 
     /**
diff --git a/src/main/org/firebirdsql/gds/ng/wire/auth/AuthenticationPluginRegistry.java b/src/main/org/firebirdsql/gds/ng/wire/auth/AuthenticationPluginRegistry.java
index 5dd111967..a31b5917a 100644
--- a/src/main/org/firebirdsql/gds/ng/wire/auth/AuthenticationPluginRegistry.java
+++ b/src/main/org/firebirdsql/gds/ng/wire/auth/AuthenticationPluginRegistry.java
@@ -38,6 +38,10 @@ public final class AuthenticationPluginRegistry {
     private static final Map<String, AuthenticationPluginSpi> PLUGIN_SPI_MAP =
             Map.copyOf(findAuthenticationPluginSpi());
 
+    private AuthenticationPluginRegistry() {
+        // no instances
+    }
+
     public static AuthenticationPluginSpi getAuthenticationPluginSpi(String authenticationPluginName) {
         return PLUGIN_SPI_MAP.get(authenticationPluginName);
     }
diff --git a/src/main/org/firebirdsql/gds/ng/wire/auth/ClientAuthBlock.java b/src/main/org/firebirdsql/gds/ng/wire/auth/ClientAuthBlock.java
index 4507113ef..95b72d9f5 100644
--- a/src/main/org/firebirdsql/gds/ng/wire/auth/ClientAuthBlock.java
+++ b/src/main/org/firebirdsql/gds/ng/wire/auth/ClientAuthBlock.java
@@ -175,7 +175,7 @@ public void setServerData(byte[] serverData) {
     }
 
     private static String getPluginNames(List<AuthenticationPluginSpi> pluginProviders) {
-        if (pluginProviders.size() == 0) {
+        if (pluginProviders.isEmpty()) {
             return null;
         }
         StringBuilder names = new StringBuilder();
diff --git a/src/main/org/firebirdsql/gds/ng/wire/auth/srp/SrpClient.java b/src/main/org/firebirdsql/gds/ng/wire/auth/srp/SrpClient.java
index 3396aa402..0021550c5 100644
--- a/src/main/org/firebirdsql/gds/ng/wire/auth/srp/SrpClient.java
+++ b/src/main/org/firebirdsql/gds/ng/wire/auth/srp/SrpClient.java
@@ -52,7 +52,7 @@ public final class SrpClient {
     private static final int EXPECTED_AUTH_DATA_LENGTH = (SRP_SALT_SIZE + SRP_KEY_SIZE + 2) * 2;
 
     private static final BigInteger N = new BigInteger("E67D2E994B2F900C3F41F08F5BB2627ED0D49EE1FE767A52EFCD565CD6E768812C3E1E9CE8F0A8BEA6CB13CD29DDEBF7A96D4A93B55D488DF099A15C89DCB0640738EB2CBDD9A8F7BAB561AB1B0DC1C6CDABF303264A08D1BCA932D1F1EE428B619D970F342ABA9A65793B8B2F041AE5364350C16F735F56ECBCA87BD57B29E7", 16);
-    private static final BigInteger g = new BigInteger("2");
+    private static final BigInteger g = BigInteger.TWO;
     private static final BigInteger k = new BigInteger("1277432915985975349439481660349303019122249719989");
 
     private static final SecureRandom random = new SecureRandom();
diff --git a/src/main/org/firebirdsql/gds/ng/wire/crypt/EncryptionPluginRegistry.java b/src/main/org/firebirdsql/gds/ng/wire/crypt/EncryptionPluginRegistry.java
index b77eacea8..5c56418b0 100644
--- a/src/main/org/firebirdsql/gds/ng/wire/crypt/EncryptionPluginRegistry.java
+++ b/src/main/org/firebirdsql/gds/ng/wire/crypt/EncryptionPluginRegistry.java
@@ -35,6 +35,10 @@
 @InternalApi
 public final class EncryptionPluginRegistry {
 
+    private EncryptionPluginRegistry() {
+        // no instances
+    }
+
     /**
      * Gets the encryption plugin SPI identified by {@code encryptionIdentifier}.
      *
diff --git a/src/main/org/firebirdsql/gds/ng/wire/version10/V10Statement.java b/src/main/org/firebirdsql/gds/ng/wire/version10/V10Statement.java
index 53cda2689..a8c0b6142 100644
--- a/src/main/org/firebirdsql/gds/ng/wire/version10/V10Statement.java
+++ b/src/main/org/firebirdsql/gds/ng/wire/version10/V10Statement.java
@@ -266,8 +266,8 @@ public void execute(final RowValue parameters) throws SQLException {
                              * have a result set that will be fetched, instead we have a singleton result if we have fields
                              */
                             statementListenerDispatcher.statementExecuted(this, false, true);
-                            if (response instanceof SqlResponse) {
-                                processExecuteSingletonResponse((SqlResponse) response);
+                            if (response instanceof SqlResponse sqlResponse) {
+                                processExecuteSingletonResponse(sqlResponse);
                                 expectedResponseCount--;
                                 response = db.readResponse(statementWarningCallback);
                             } else {
diff --git a/src/main/org/firebirdsql/gds/ng/wire/version11/V11Statement.java b/src/main/org/firebirdsql/gds/ng/wire/version11/V11Statement.java
index 06750a156..528ca3094 100644
--- a/src/main/org/firebirdsql/gds/ng/wire/version11/V11Statement.java
+++ b/src/main/org/firebirdsql/gds/ng/wire/version11/V11Statement.java
@@ -19,7 +19,6 @@
 package org.firebirdsql.gds.ng.wire.version11;
 
 import org.firebirdsql.gds.ISCConstants;
-import org.firebirdsql.gds.JaybirdErrorCodes;
 import org.firebirdsql.gds.ng.wire.AsyncFetchStatus;
 import org.firebirdsql.gds.ng.CursorFlag;
 import org.firebirdsql.gds.ng.DeferredResponse;
diff --git a/src/main/org/firebirdsql/gds/ng/wire/version12/V12ParameterConverter.java b/src/main/org/firebirdsql/gds/ng/wire/version12/V12ParameterConverter.java
index 67b769df3..51d68b671 100644
--- a/src/main/org/firebirdsql/gds/ng/wire/version12/V12ParameterConverter.java
+++ b/src/main/org/firebirdsql/gds/ng/wire/version12/V12ParameterConverter.java
@@ -40,6 +40,7 @@
  */
 public class V12ParameterConverter extends V11ParameterConverter {
 
+    @Override
     protected DatabaseParameterBuffer createDatabaseParameterBuffer(WireDatabaseConnection connection) {
         final Encoding stringEncoding = connection.getEncodingFactory().getEncodingForFirebirdName("UTF8");
         DatabaseParameterBuffer dpb =
@@ -48,6 +49,7 @@ protected DatabaseParameterBuffer createDatabaseParameterBuffer(WireDatabaseConn
         return dpb;
     }
 
+    @Override
     protected ServiceParameterBuffer createServiceParameterBuffer(WireServiceConnection connection) {
         final Encoding stringEncoding = connection.getEncodingFactory().getEncodingForFirebirdName("UTF8");
         ServiceParameterBuffer spb = new ServiceParameterBufferImp(
diff --git a/src/main/org/firebirdsql/gds/ng/wire/version13/V13ParameterConverter.java b/src/main/org/firebirdsql/gds/ng/wire/version13/V13ParameterConverter.java
index 54879fbc0..b03984ace 100644
--- a/src/main/org/firebirdsql/gds/ng/wire/version13/V13ParameterConverter.java
+++ b/src/main/org/firebirdsql/gds/ng/wire/version13/V13ParameterConverter.java
@@ -46,6 +46,7 @@
  */
 public class V13ParameterConverter extends V12ParameterConverter {
 
+    @Override
     protected DatabaseParameterBuffer createDatabaseParameterBuffer(WireDatabaseConnection connection) {
         final Encoding stringEncoding = connection.getEncodingFactory().getEncodingForFirebirdName("UTF8");
         DatabaseParameterBuffer dpb =
@@ -54,6 +55,7 @@ protected DatabaseParameterBuffer createDatabaseParameterBuffer(WireDatabaseConn
         return dpb;
     }
 
+    @Override
     protected ServiceParameterBuffer createServiceParameterBuffer(WireServiceConnection connection) {
         final Encoding stringEncoding = connection.getEncodingFactory().getEncodingForFirebirdName("UTF8");
         ServiceParameterBuffer spb = new ServiceParameterBufferImp(
diff --git a/src/main/org/firebirdsql/gds/ng/wire/version13/V13WireOperations.java b/src/main/org/firebirdsql/gds/ng/wire/version13/V13WireOperations.java
index ffcf39f33..d8a046895 100644
--- a/src/main/org/firebirdsql/gds/ng/wire/version13/V13WireOperations.java
+++ b/src/main/org/firebirdsql/gds/ng/wire/version13/V13WireOperations.java
@@ -132,15 +132,13 @@ public void authReceiveResponse(FbWireAttachment.AcceptPacket acceptPacket, DbCr
                 }
             }
 
-            if (pluginName != null && pluginName.length() > 0
-                    && Objects.equals(pluginName, clientAuthBlock.getCurrentPluginName())) {
+            if (pluginName != null && !pluginName.isEmpty()
+                && Objects.equals(pluginName, clientAuthBlock.getCurrentPluginName())) {
                 pluginName = null;
             }
 
-            if (pluginName != null && pluginName.length() > 0) {
-                if (!clientAuthBlock.switchPlugin(pluginName)) {
-                    break;
-                }
+            if (pluginName != null && !pluginName.isEmpty() && !clientAuthBlock.switchPlugin(pluginName)) {
+                break;
             }
 
             if (!clientAuthBlock.hasPlugin()) {
diff --git a/src/main/org/firebirdsql/gds/ng/wire/version16/V16WireOperations.java b/src/main/org/firebirdsql/gds/ng/wire/version16/V16WireOperations.java
index dfb95f473..c4a046dc4 100644
--- a/src/main/org/firebirdsql/gds/ng/wire/version16/V16WireOperations.java
+++ b/src/main/org/firebirdsql/gds/ng/wire/version16/V16WireOperations.java
@@ -94,6 +94,7 @@ protected void afterProcessDeferredActions(int processedDeferredActions) {
         super.afterProcessDeferredActions(processedDeferredActions < BATCH_LIMIT ? processedDeferredActions : -1);
     }
 
+    @Override
     protected BatchCompletionResponse readBatchCompletionResponse(XdrInputStream xdrIn) throws SQLException, IOException {
         xdrIn.skipNBytes(4); // skip int: p_batch_statement
         int elementCount = xdrIn.readInt(); // p_batch_reccount
@@ -102,8 +103,8 @@ protected BatchCompletionResponse readBatchCompletionResponse(XdrInputStream xdr
         int simplifiedErrorsCount = xdrIn.readInt(); // p_batch_errors
 
         int[] updateCounts = new int[updateCountsCount];
-        for (int record = 0; record < updateCountsCount; record++) {
-            updateCounts[record] = xdrIn.readInt();
+        for (int row = 0; row < updateCountsCount; row++) {
+            updateCounts[row] = xdrIn.readInt();
         }
 
         List<BatchCompletion.DetailedError> detailedErrors = new ArrayList<>(detailedErrorsCount);
diff --git a/src/main/org/firebirdsql/jaybird/fb/constants/StandardBlobTypes.java b/src/main/org/firebirdsql/jaybird/fb/constants/StandardBlobTypes.java
index 4a477a76c..215f95075 100644
--- a/src/main/org/firebirdsql/jaybird/fb/constants/StandardBlobTypes.java
+++ b/src/main/org/firebirdsql/jaybird/fb/constants/StandardBlobTypes.java
@@ -50,4 +50,8 @@ public final class StandardBlobTypes {
     public static final int isc_blob_extfile = 8;
     public static final int isc_blob_debug_info = 9;
 
+    private StandardBlobTypes() {
+        // no instances
+    }
+
 }
diff --git a/src/main/org/firebirdsql/jaybird/parser/ReturningClauseDetector.java b/src/main/org/firebirdsql/jaybird/parser/ReturningClauseDetector.java
index f0e0ddc49..22eab12f6 100644
--- a/src/main/org/firebirdsql/jaybird/parser/ReturningClauseDetector.java
+++ b/src/main/org/firebirdsql/jaybird/parser/ReturningClauseDetector.java
@@ -140,8 +140,8 @@ private boolean cannotOccurInReturning(Token token) {
      * RETURNING} clause
      */
     private boolean cannotOccurAsFirstReturningToken(Token token) {
-        return token instanceof OperatorToken
-                && !(isPossibleUnaryOperator((OperatorToken) token) || token.equalsIgnoreCase("*"))
+        return token instanceof OperatorToken operatorToken
+                && !(isPossibleUnaryOperator(operatorToken) || operatorToken.equalsIgnoreCase("*"))
                 || NOT_IMMEDIATELY_AFTER_RETURNING_TOKEN_TEXT.contains(token.textAsCharSequence());
     }
 
diff --git a/src/main/org/firebirdsql/jaybird/parser/StringLiteralToken.java b/src/main/org/firebirdsql/jaybird/parser/StringLiteralToken.java
index 84db86c1e..b901fff72 100644
--- a/src/main/org/firebirdsql/jaybird/parser/StringLiteralToken.java
+++ b/src/main/org/firebirdsql/jaybird/parser/StringLiteralToken.java
@@ -78,7 +78,7 @@ public String value() {
             return value.indexOf('\'') == -1
                     ? value
                     // unescape single quotes
-                    : value.replaceAll("''", "'");
+                    : value.replace("''", "'");
         }
         case 'q':
         case 'Q':
diff --git a/src/main/org/firebirdsql/jaybird/props/DpbType.java b/src/main/org/firebirdsql/jaybird/props/DpbType.java
index af6cf43a1..d2ffac20a 100644
--- a/src/main/org/firebirdsql/jaybird/props/DpbType.java
+++ b/src/main/org/firebirdsql/jaybird/props/DpbType.java
@@ -21,6 +21,8 @@
 import org.firebirdsql.gds.ParameterBuffer;
 import org.firebirdsql.jaybird.props.def.ConnectionPropertyType;
 
+import java.util.Objects;
+
 /**
  * Identifies the database (or service attach) <em>parameter buffer type</em> of a connection property.
  * <p>
@@ -67,7 +69,7 @@ public void addValue(ParameterBuffer pb, int pbItem, Object value, ConnectionPro
     SINGLE {
         @Override
         public void addValue(ParameterBuffer pb, int pbItem, Object value, ConnectionPropertyType type) {
-            if (type.asBoolean(value)) {
+            if (Objects.equals(Boolean.TRUE, type.asBoolean(value))) {
                 pb.addArgument(pbItem);
             }
         }
diff --git a/src/main/org/firebirdsql/jaybird/props/internal/TransactionNameMapping.java b/src/main/org/firebirdsql/jaybird/props/internal/TransactionNameMapping.java
index 88a4a66ef..e6314a7c9 100644
--- a/src/main/org/firebirdsql/jaybird/props/internal/TransactionNameMapping.java
+++ b/src/main/org/firebirdsql/jaybird/props/internal/TransactionNameMapping.java
@@ -57,25 +57,20 @@ private TransactionNameMapping() {
      *         For an unknown transaction isolation level name
      */
     public static int toIsolationLevel(String isolationLevelName) {
-        switch (isolationLevelName) {
-        case TRANSACTION_NONE:
-        case "" + Connection.TRANSACTION_NONE:
-            return Connection.TRANSACTION_NONE;
-        case TRANSACTION_READ_UNCOMMITTED:
-        case "" + Connection.TRANSACTION_READ_UNCOMMITTED:
-            return Connection.TRANSACTION_READ_UNCOMMITTED;
-        case TRANSACTION_READ_COMMITTED:
-        case "" + Connection.TRANSACTION_READ_COMMITTED:
-            return Connection.TRANSACTION_READ_COMMITTED;
-        case TRANSACTION_REPEATABLE_READ:
-        case "" + Connection.TRANSACTION_REPEATABLE_READ:
-            return Connection.TRANSACTION_REPEATABLE_READ;
-        case TRANSACTION_SERIALIZABLE:
-        case "" + Connection.TRANSACTION_SERIALIZABLE:
-            return Connection.TRANSACTION_SERIALIZABLE;
-        default:
-            throw new IllegalArgumentException("Unknown transaction isolation level name: " + isolationLevelName);
-        }
+        return switch (isolationLevelName) {
+            case TRANSACTION_NONE, "" + Connection.TRANSACTION_NONE ->
+                    Connection.TRANSACTION_NONE;
+            case TRANSACTION_READ_UNCOMMITTED, "" + Connection.TRANSACTION_READ_UNCOMMITTED ->
+                    Connection.TRANSACTION_READ_UNCOMMITTED;
+            case TRANSACTION_READ_COMMITTED, "" + Connection.TRANSACTION_READ_COMMITTED ->
+                    Connection.TRANSACTION_READ_COMMITTED;
+            case TRANSACTION_REPEATABLE_READ, "" + Connection.TRANSACTION_REPEATABLE_READ ->
+                    Connection.TRANSACTION_REPEATABLE_READ;
+            case TRANSACTION_SERIALIZABLE, "" + Connection.TRANSACTION_SERIALIZABLE ->
+                    Connection.TRANSACTION_SERIALIZABLE;
+            default -> throw new IllegalArgumentException(
+                    "Unknown transaction isolation level name: " + isolationLevelName);
+        };
     }
 
     /**
diff --git a/src/main/org/firebirdsql/jaybird/xca/FBLocalTransaction.java b/src/main/org/firebirdsql/jaybird/xca/FBLocalTransaction.java
index 11e466e3b..e38d4e142 100644
--- a/src/main/org/firebirdsql/jaybird/xca/FBLocalTransaction.java
+++ b/src/main/org/firebirdsql/jaybird/xca/FBLocalTransaction.java
@@ -74,8 +74,8 @@ public void begin() throws SQLException {
             mc.internalStart(xid, XAResource.TMNOFLAGS);
         } catch (XAException ex) {
             xid = null;
-            if (ex.getCause() instanceof SQLException) {
-                throw (SQLException) ex.getCause();
+            if (ex.getCause() instanceof SQLException sqle) {
+                throw sqle;
             }
             // TODO More specific exception, Jaybird error code (or is this flow unlikely to hit?)
             throw new SQLException(ex.getMessage(), ex);
@@ -98,8 +98,8 @@ public void commit() throws SQLException {
                 mc.internalEnd(xid, XAResource.TMSUCCESS);
                 mc.internalCommit(xid, true);
             } catch (XAException ex) {
-                if (ex.getCause() instanceof SQLException) {
-                    throw (SQLException) ex.getCause();
+                if (ex.getCause() instanceof SQLException sqle) {
+                    throw sqle;
                 }
                 // TODO More specific exception, Jaybird error code (or is this flow unlikely to hit?)
                 throw new SQLException(ex.getMessage(), ex);
@@ -126,8 +126,8 @@ public void rollback() throws SQLException {
                 // --FBManagedConnection is its own XAResource
                 mc.internalRollback(xid);
             } catch (XAException ex) {
-                if (ex.getCause() instanceof SQLException) {
-                    throw (SQLException) ex.getCause();
+                if (ex.getCause() instanceof SQLException sqle) {
+                    throw sqle;
                 }
                 // TODO More specific exception, Jaybird error code (or is this flow unlikely to hit?)
                 throw new SQLException(ex.getMessage(), ex);
@@ -137,12 +137,11 @@ public void rollback() throws SQLException {
         }
     }
 
-    // This is an intentionally non-implemented xid, so if prepare is called
-    // with it, it won't work.
+    // This is an intentionally non-implemented xid, so if prepare is called with it, it won't work.
     // Only object identity works for equals!
     private static final class FBLocalXid implements Xid {
 
-        private static final int formatId = 0x0102;// ????????????
+        private static final int FORMAT_ID = 0x0102;// ????????????
 
         private final String strValue;
 
@@ -172,7 +171,7 @@ public byte[] getBranchQualifier() {
          * </p>
          */
         public int getFormatId() {
-            return formatId;
+            return FORMAT_ID;
         }
 
         public String toString() {
diff --git a/src/main/org/firebirdsql/jaybird/xca/FBManagedConnection.java b/src/main/org/firebirdsql/jaybird/xca/FBManagedConnection.java
index a31ce272b..a51039609 100644
--- a/src/main/org/firebirdsql/jaybird/xca/FBManagedConnection.java
+++ b/src/main/org/firebirdsql/jaybird/xca/FBManagedConnection.java
@@ -598,13 +598,12 @@ private void forget(Xid id) throws XAException {
         try {
             // delete XID
             FbTransaction trHandle2 = database.startTransaction(tpb.getTransactionParameterBuffer());
-            FbStatement stmtHandle2 = database.createStatement(trHandle2);
-
-            stmtHandle2.prepare(getXidQueries().forgetDelete() + inLimboId);
-            stmtHandle2.execute(RowValue.EMPTY_ROW_VALUE);
-
-            stmtHandle2.close();
-            trHandle2.commit();
+            try (FbStatement stmtHandle2 = database.createStatement(trHandle2)) {
+                stmtHandle2.prepare(getXidQueries().forgetDelete() + inLimboId);
+                stmtHandle2.execute(RowValue.EMPTY_ROW_VALUE);
+            } finally {
+                trHandle2.commit();
+            }
         } catch (SQLException ex) {
             throw new FBXAException("can't perform query to delete xids", XAException.XAER_RMFAIL, ex);
         }
@@ -689,34 +688,33 @@ private Xid[] recover(int flags) throws javax.transaction.xa.XAException {
             var xids = new ArrayList<FBXid>();
 
             FbTransaction trHandle2 = database.startTransaction(tpb.getTransactionParameterBuffer());
-            FbStatement stmtHandle2 = database.createStatement(trHandle2);
-
-            var gdsHelper2 = new GDSHelper(database);
-            gdsHelper2.setCurrentTransaction(trHandle2);
+            try (FbStatement stmtHandle2 = database.createStatement(trHandle2)) {
+                var gdsHelper2 = new GDSHelper(database);
+                gdsHelper2.setCurrentTransaction(trHandle2);
 
-            stmtHandle2.prepare(getXidQueries().recoveryQuery());
+                stmtHandle2.prepare(getXidQueries().recoveryQuery());
 
-            var dataProvider = new DataProvider(stmtHandle2);
-            stmtHandle2.addStatementListener(dataProvider);
+                var dataProvider = new DataProvider(stmtHandle2);
+                stmtHandle2.addStatementListener(dataProvider);
 
-            stmtHandle2.execute(RowValue.EMPTY_ROW_VALUE);
+                stmtHandle2.execute(RowValue.EMPTY_ROW_VALUE);
 
-            var field0 = FBField.createField(stmtHandle2.getRowDescriptor().getFieldDescriptor(0), dataProvider.asFieldDataProvider(0), gdsHelper2, false);
-            var field1 = FBField.createField(stmtHandle2.getRowDescriptor().getFieldDescriptor(1), dataProvider.asFieldDataProvider(1), gdsHelper2, false);
+                var field0 = FBField.createField(stmtHandle2.getRowDescriptor().getFieldDescriptor(0), dataProvider.asFieldDataProvider(0), gdsHelper2, false);
+                var field1 = FBField.createField(stmtHandle2.getRowDescriptor().getFieldDescriptor(1), dataProvider.asFieldDataProvider(1), gdsHelper2, false);
 
-            while (dataProvider.next()) {
-                long inLimboTxId = field0.getLong();
-                byte[] inLimboMessage = field1.getBytes();
+                while (dataProvider.next()) {
+                    long inLimboTxId = field0.getLong();
+                    byte[] inLimboMessage = field1.getBytes();
 
-                FBXid xid = extractXid(inLimboMessage, inLimboTxId);
-                if (xid != null) {
-                    xids.add(xid);
+                    FBXid xid = extractXid(inLimboMessage, inLimboTxId);
+                    if (xid != null) {
+                        xids.add(xid);
+                    }
                 }
+            } finally {
+                trHandle2.commit();
             }
 
-            stmtHandle2.close();
-            trHandle2.commit();
-
             return xids.toArray(new Xid[0]);
         } catch (SQLException | IOException e) {
             throw new FBXAException("can't perform query to fetch xids", XAException.XAER_RMFAIL, e);
@@ -749,35 +747,33 @@ private static FBXid extractXid(byte[] xidData, long txId) throws IOException {
     Xid findSingleXid(Xid externalXid) throws javax.transaction.xa.XAException {
         try {
             FbTransaction trHandle2 = database.startTransaction(tpb.getTransactionParameterBuffer());
-            FbStatement stmtHandle2 = database.createStatement(trHandle2);
-
-            var gdsHelper2 = new GDSHelper(database);
-            gdsHelper2.setCurrentTransaction(trHandle2);
+            try (FbStatement stmtHandle2 = database.createStatement(trHandle2)) {
 
-            stmtHandle2.prepare(getXidQueries().recoveryQueryParameterized());
+                var gdsHelper2 = new GDSHelper(database);
+                gdsHelper2.setCurrentTransaction(trHandle2);
 
-            var dataProvider = new DataProvider(stmtHandle2);
-            stmtHandle2.addStatementListener(dataProvider);
+                stmtHandle2.prepare(getXidQueries().recoveryQueryParameterized());
 
-            var tempXid = new FBXid(externalXid);
-            stmtHandle2.execute(RowValue.of(stmtHandle2.getParameterDescriptor(), tempXid.toBytes()));
+                var dataProvider = new DataProvider(stmtHandle2);
+                stmtHandle2.addStatementListener(dataProvider);
 
-            var field0 = FBField.createField(stmtHandle2.getRowDescriptor().getFieldDescriptor(0), dataProvider.asFieldDataProvider(0), gdsHelper2, false);
-            var field1 = FBField.createField(stmtHandle2.getRowDescriptor().getFieldDescriptor(1), dataProvider.asFieldDataProvider(1), gdsHelper2, false);
+                var tempXid = new FBXid(externalXid);
+                stmtHandle2.execute(RowValue.of(stmtHandle2.getParameterDescriptor(), tempXid.toBytes()));
 
-            stmtHandle2.fetchRows(1);
-            FBXid xid = null;
-            if (dataProvider.next()) {
-                long inLimboTxId = field0.getLong();
-                byte[] inLimboMessage = field1.getBytes();
+                var field0 = FBField.createField(stmtHandle2.getRowDescriptor().getFieldDescriptor(0), dataProvider.asFieldDataProvider(0), gdsHelper2, false);
+                var field1 = FBField.createField(stmtHandle2.getRowDescriptor().getFieldDescriptor(1), dataProvider.asFieldDataProvider(1), gdsHelper2, false);
 
-                xid = extractXid(inLimboMessage, inLimboTxId);
+                stmtHandle2.fetchRows(1);
+                if (dataProvider.next()) {
+                    long inLimboTxId = field0.getLong();
+                    byte[] inLimboMessage = field1.getBytes();
+                    return extractXid(inLimboMessage, inLimboTxId);
+                } else {
+                    return null;
+                }
+            } finally {
+                trHandle2.commit();
             }
-
-            stmtHandle2.close();
-            trHandle2.commit();
-
-            return xid;
         } catch (SQLException | IOException e) {
             throw new FBXAException("can't perform query to fetch xids", XAException.XAER_RMFAIL, e);
         }
diff --git a/src/main/org/firebirdsql/jaybird/xca/FBManagedConnectionFactory.java b/src/main/org/firebirdsql/jaybird/xca/FBManagedConnectionFactory.java
index d66995d29..b6eb1e30f 100644
--- a/src/main/org/firebirdsql/jaybird/xca/FBManagedConnectionFactory.java
+++ b/src/main/org/firebirdsql/jaybird/xca/FBManagedConnectionFactory.java
@@ -494,7 +494,7 @@ public void forget(FBManagedConnection mc, Xid xid) {
     }
 
     public void recover(FBManagedConnection mc, Xid xid) {
-
+        // nothing to do
     }
 
     /**
@@ -561,13 +561,12 @@ private void tryCompleteInLimboTransaction(Xid xid, boolean commit) throws XAExc
                         String query = "delete from rdb$transactions where rdb$transaction_id = " + fbTransactionId;
 
                         FbTransaction trHandle2 = dbHandle.startTransaction(getDefaultTpb().getTransactionParameterBuffer());
-                        FbStatement stmtHandle2 = dbHandle.createStatement(trHandle2);
-
-                        stmtHandle2.prepare(query);
-                        stmtHandle2.execute(RowValue.EMPTY_ROW_VALUE);
-
-                        stmtHandle2.close();
-                        trHandle2.commit();
+                        try (FbStatement stmtHandle2 = dbHandle.createStatement(trHandle2)) {
+                            stmtHandle2.prepare(query);
+                            stmtHandle2.execute(RowValue.EMPTY_ROW_VALUE);
+                        } finally {
+                            trHandle2.commit();
+                        }
                     } catch (SQLException sqle) {
                         throw new FBXAException("unable to remove in limbo transaction from rdb$transactions where rdb$transaction_id = " + fbTransactionId, XAException.XAER_RMERR);
                     }
@@ -625,16 +624,12 @@ private static FBConnection newConnection(FBManagedConnection mc, Class<?> conne
                                    + " class as single parameter was found.");
         } catch (InvocationTargetException ex) {
             final Throwable cause = ex.getCause();
-            if (cause instanceof RuntimeException) {
-                throw (RuntimeException) cause;
-            }
-
-            if (cause instanceof Error) {
-                throw (Error) cause;
-            }
-
-            if (cause instanceof SQLException) {
-                throw (SQLException) cause;
+            if (cause instanceof RuntimeException re) {
+                throw re;
+            } else if (cause instanceof Error error) {
+                throw error;
+            } else if (cause instanceof SQLException sqle) {
+                throw sqle;
             }
 
             // TODO More specific exception, Jaybird error code
diff --git a/src/main/org/firebirdsql/jaybird/xca/FBXAException.java b/src/main/org/firebirdsql/jaybird/xca/FBXAException.java
index ac2f1f145..9cb817d60 100644
--- a/src/main/org/firebirdsql/jaybird/xca/FBXAException.java
+++ b/src/main/org/firebirdsql/jaybird/xca/FBXAException.java
@@ -102,6 +102,7 @@ public FBXAException(String msg, int errorCode, Exception reason) {
      *
      * @return combined message of this exception and original exception.
      */
+    @Override
     public String getMessage() {
         String s = super.getMessage();
         if (reason == null) return s;
diff --git a/src/main/org/firebirdsql/jaybird/xca/FatalErrorHelper.java b/src/main/org/firebirdsql/jaybird/xca/FatalErrorHelper.java
index 44c6db2d6..9e0f3b931 100644
--- a/src/main/org/firebirdsql/jaybird/xca/FatalErrorHelper.java
+++ b/src/main/org/firebirdsql/jaybird/xca/FatalErrorHelper.java
@@ -79,7 +79,7 @@ private static boolean isFatal(int errorCode) {
      * @return {@code true} if the SQLSTATE is (considered) fatal
      */
     private static boolean isFatal(String sqlState) {
-        // Don't consider absence of SQLSTATE as a sign of fatal error (we did in the past for FBPooledConnection);
+        // Don't consider absence of SQLSTATE as a sign of fatal error (we did in the past for FBPooledConnection),
         // there are exceptions in Jaybird without SQLSTATE, and most of them are not fatal.
         if (sqlState == null) return false;
         // Invalid SQLSTATE specified, assume it's fatal
diff --git a/src/main/org/firebirdsql/jdbc/AbstractFieldMetaData.java b/src/main/org/firebirdsql/jdbc/AbstractFieldMetaData.java
index f734e85da..33c3a886e 100644
--- a/src/main/org/firebirdsql/jdbc/AbstractFieldMetaData.java
+++ b/src/main/org/firebirdsql/jdbc/AbstractFieldMetaData.java
@@ -194,11 +194,11 @@ protected final int getPrecisionInternal(int field) throws SQLException {
             default -> 0;
         };
         case Types.CHAR, Types.VARCHAR -> {
-            final FieldDescriptor var = getFieldDescriptor(field);
+            final FieldDescriptor fieldDesc = getFieldDescriptor(field);
             final EncodingDefinition encodingDefinition =
-                    var.getEncodingFactory().getEncodingDefinitionByCharacterSetId(var.getSubType());
+                    fieldDesc.getEncodingFactory().getEncodingDefinitionByCharacterSetId(fieldDesc.getSubType());
             final int charSetSize = encodingDefinition != null ? encodingDefinition.getMaxBytesPerChar() : 1;
-            yield var.getLength() / charSetSize;
+            yield fieldDesc.getLength() / charSetSize;
         }
         case Types.BINARY, Types.VARBINARY -> getFieldDescriptor(field).getLength();
         case Types.FLOAT -> {
diff --git a/src/main/org/firebirdsql/jdbc/ClientInfoProvider.java b/src/main/org/firebirdsql/jdbc/ClientInfoProvider.java
index e2686cb06..b07b88468 100644
--- a/src/main/org/firebirdsql/jdbc/ClientInfoProvider.java
+++ b/src/main/org/firebirdsql/jdbc/ClientInfoProvider.java
@@ -69,8 +69,8 @@ final class ClientInfoProvider {
     private final FBConnection connection;
     // if null, use DEFAULT_CLIENT_INFO_PROPERTIES
     private Set<ClientInfoProperty> knownProperties;
-    // Statement used for setting or retrieving client info properties;
-    // we don't try to close this statement, and rely on it getting closed by connection close
+    // Statement used for setting or retrieving client info properties.
+    // We don't try to close this statement, and rely on it getting closed by connection close
     private Statement statement;
 
     ClientInfoProvider(FBConnection connection) throws SQLException {
diff --git a/src/main/org/firebirdsql/jdbc/FBBlob.java b/src/main/org/firebirdsql/jdbc/FBBlob.java
index 4534009fb..e9ddcbd58 100644
--- a/src/main/org/firebirdsql/jdbc/FBBlob.java
+++ b/src/main/org/firebirdsql/jdbc/FBBlob.java
@@ -204,24 +204,24 @@ public InputStream getBinaryStream(long pos, long length) throws SQLException {
     }
 
     /**
-     * Get information about this Blob. This method should be considered as
-     * temporary because it provides access to low-level API. More information
-     * on how to use the API can be found in "API Guide".
+     * Get information about this Blob. This method should be considered as temporary because it provides access to
+     * low-level API. More information on how to use the API can be found in "API Guide".
      *
-     * @param items items in which we are interested.
-     * @param buffer_length buffer where information will be stored.
-     *
-     * @return array of bytes containing information about this Blob.
-     *
-     * @throws SQLException if something went wrong.
+     * @param items
+     *         items in which we are interested
+     * @param bufferLength
+     *         buffer where information will be stored
+     * @return array of bytes containing information about this Blob
+     * @throws SQLException
+     *         if something went wrong
      */
-    public byte[] getInfo(byte[] items, int buffer_length) throws SQLException {
+    public byte[] getInfo(byte[] items, int bufferLength) throws SQLException {
         try (LockCloseable ignored = withLock()) {
             checkClosed();
             blobListener.executionStarted(this);
             // TODO Does it make sense to close blob here?
             try (FbBlob blob = gdsHelper.openBlob(blobId, config)) {
-                return blob.getBlobInfo(items, buffer_length);
+                return blob.getBlobInfo(items, bufferLength);
             } finally {
                 blobListener.executionCompleted(this);
             }
@@ -642,18 +642,12 @@ public void copyCharacterStream(Reader reader) throws SQLException {
     @Override
     public void transactionStateChanged(FbTransaction transaction, TransactionState newState,
             TransactionState previousState) {
-        switch (newState) {
-        case COMMITTED:
-        case ROLLED_BACK:
+        if (newState == TransactionState.COMMITTED || newState == TransactionState.ROLLED_BACK) {
             try (LockCloseable ignored = withLock()) {
                 free();
             } catch (SQLException e) {
                 logger.log(System.Logger.Level.ERROR, "Error calling free on blob during transaction end", e);
             }
-            break;
-        default:
-            // Do nothing
-            break;
         }
     }
 
diff --git a/src/main/org/firebirdsql/jdbc/FBCachedFetcher.java b/src/main/org/firebirdsql/jdbc/FBCachedFetcher.java
index a77ac1c65..95dc80454 100644
--- a/src/main/org/firebirdsql/jdbc/FBCachedFetcher.java
+++ b/src/main/org/firebirdsql/jdbc/FBCachedFetcher.java
@@ -47,11 +47,11 @@ final class FBCachedFetcher implements FBFetcher {
     private int fetchSize;
     private FBObjectListener.FetcherListener fetcherListener;
 
-    FBCachedFetcher(GDSHelper gdsHelper, int fetchSize, int maxRows, FbStatement stmt_handle,
+    FBCachedFetcher(GDSHelper gdsHelper, int fetchSize, int maxRows, FbStatement stmtHandle,
             FBObjectListener.FetcherListener fetcherListener, boolean forwardOnly) throws SQLException {
         this.fetcherListener = fetcherListener;
         this.forwardOnly = forwardOnly;
-        final RowDescriptor rowDescriptor = stmt_handle.getRowDescriptor();
+        final RowDescriptor rowDescriptor = stmtHandle.getRowDescriptor();
 
         // Check if there is blobs to catch
         final boolean[] isBlob = new boolean[rowDescriptor.getCount()];
@@ -62,7 +62,7 @@ final class FBCachedFetcher implements FBFetcher {
 
         try {
             RowListener rowListener = new RowListener();
-            stmt_handle.addStatementListener(rowListener);
+            stmtHandle.addStatementListener(rowListener);
             try {
                 int actualFetchSize = getFetchSize();
                 while (!rowListener.isAllRowsFetched() && (maxRows == 0 || rowListener.size() < maxRows)) {
@@ -70,11 +70,11 @@ final class FBCachedFetcher implements FBFetcher {
                         actualFetchSize = Math.min(actualFetchSize, maxRows - rowListener.size());
                     }
                     assert actualFetchSize > 0 : "actualFetchSize should be > 0";
-                    stmt_handle.fetchRows(actualFetchSize);
+                    stmtHandle.fetchRows(actualFetchSize);
                 }
                 rows = rowListener.getRows();
             } finally {
-                stmt_handle.removeStatementListener(rowListener);
+                stmtHandle.removeStatementListener(rowListener);
             }
 
             if (hasBlobs) {
@@ -83,7 +83,7 @@ final class FBCachedFetcher implements FBFetcher {
                 }
             }
         } finally {
-            stmt_handle.closeCursor();
+            stmtHandle.closeCursor();
         }
     }
 
@@ -296,7 +296,7 @@ public int getRowNum() {
 
     @Override
     public boolean isEmpty() {
-        return rows == null || rows.size() == 0;
+        return rows == null || rows.isEmpty();
     }
 
     @Override
diff --git a/src/main/org/firebirdsql/jdbc/FBCallableStatement.java b/src/main/org/firebirdsql/jdbc/FBCallableStatement.java
index b3007a14f..64ed43d37 100644
--- a/src/main/org/firebirdsql/jdbc/FBCallableStatement.java
+++ b/src/main/org/firebirdsql/jdbc/FBCallableStatement.java
@@ -304,10 +304,10 @@ protected boolean internalExecute(boolean sendOutParams) throws SQLException {
 
                 if (value == null) {
                     field.setNull();
-                } else if (value instanceof WrapperWithCalendar) {
-                    setField(field, (WrapperWithCalendar)value);
-                } else if (value instanceof WrapperWithLong) {
-                    setField(field, (WrapperWithLong)value);
+                } else if (value instanceof WrapperWithCalendar wrapperWithCalendar) {
+                    setField(field, wrapperWithCalendar);
+                } else if (value instanceof WrapperWithLong wrapperWithLong) {
+                    setField(field, wrapperWithLong);
                 } else {
                     field.setObject(value);
                 }
@@ -339,10 +339,10 @@ private void setField(FBField field, WrapperWithLong value) throws SQLException
         } else {
             long longValue = value.longValue();
 
-            if (obj instanceof InputStream) {
-                field.setBinaryStream((InputStream) obj, longValue);
-            } else if (obj instanceof Reader) {
-                field.setCharacterStream((Reader) obj, longValue);
+            if (obj instanceof InputStream inputStream) {
+                field.setBinaryStream(inputStream, longValue);
+            } else if (obj instanceof Reader reader) {
+                field.setCharacterStream(reader, longValue);
             } else {
                 throw new TypeConversionException("Cannot convert type " + obj.getClass().getName());
             }
@@ -357,14 +357,15 @@ private void setField(FBField field, WrapperWithCalendar value) throws SQLExcept
         } else {
             Calendar cal = value.calendar();
 
-            if (obj instanceof Timestamp)
-                field.setTimestamp((Timestamp) obj, cal);
-            else if (obj instanceof java.sql.Date)
-                field.setDate((java.sql.Date) obj, cal);
-            else if (obj instanceof Time)
-                field.setTime((Time) obj, cal);
-            else
+            if (obj instanceof Timestamp timestamp) {
+                field.setTimestamp(timestamp, cal);
+            } else if (obj instanceof java.sql.Date date) {
+                field.setDate(date, cal);
+            } else if (obj instanceof Time time) {
+                field.setTime(time, cal);
+            } else {
                 throw new TypeConversionException("Cannot convert type " + obj.getClass().getName());
+            }
         }
     }
 
@@ -469,7 +470,7 @@ public double getDouble(int parameterIndex) throws SQLException {
         return getAndAssertSingletonResultSet().getDouble(mapOutParamIndexToPosition(parameterIndex));
     }
 
-    @Deprecated
+    @Deprecated(since = "1")
     @Override
     public BigDecimal getBigDecimal(int parameterIndex, int scale) throws SQLException {
         return getAndAssertSingletonResultSet().getBigDecimal(mapOutParamIndexToPosition(parameterIndex), scale);
diff --git a/src/main/org/firebirdsql/jdbc/FBConnection.java b/src/main/org/firebirdsql/jdbc/FBConnection.java
index e4684b5e8..962099011 100644
--- a/src/main/org/firebirdsql/jdbc/FBConnection.java
+++ b/src/main/org/firebirdsql/jdbc/FBConnection.java
@@ -143,7 +143,7 @@ protected void checkValidity() throws SQLException {
      */
     void notifyStatementClosed(FBStatement stmt) {
         if (!activeStatements.remove(stmt)) {
-            if (stmt instanceof FBPreparedStatement && !((FBPreparedStatement) stmt).isInitialized()) {
+            if (stmt instanceof FBPreparedStatement pstmt && !pstmt.isInitialized()) {
                 // Close was likely triggered by finalizer of a prepared statement that failed on prepare in
                 // the constructor: Do not log warning
                 return;
@@ -219,7 +219,7 @@ public DatabaseConnectionProperties connectionProperties() {
         return mc != null ? mc.getConnectionRequestInfo().asIConnectionProperties().asImmutable() : null;
     }
 
-    @Deprecated
+    @Deprecated(since = "2")
     @Override
     public void setTransactionParameters(int isolationLevel, int[] parameters) throws SQLException {
         try (LockCloseable ignored = withLock()) {
diff --git a/src/main/org/firebirdsql/jdbc/FBConnectionProperties.java b/src/main/org/firebirdsql/jdbc/FBConnectionProperties.java
index 247f5902f..2cdcd36f6 100644
--- a/src/main/org/firebirdsql/jdbc/FBConnectionProperties.java
+++ b/src/main/org/firebirdsql/jdbc/FBConnectionProperties.java
@@ -112,7 +112,7 @@ public Object clone() {
 
             return clone;
         } catch (CloneNotSupportedException ex) {
-            throw new Error("Assertion failure: clone not supported"); // Can't happen
+            throw new AssertionError("Assertion failure: clone not supported"); // Can't happen
         }
     }
 
@@ -128,7 +128,7 @@ public void setNonStandardProperty(String propertyMapping) {
             key = propertyMapping.substring(0, equalsIndex).trim();
             value = propertyMapping.substring(equalsIndex + 1).trim();
         }
-        if (key.length() > 0) {
+        if (!key.isEmpty()) {
             setProperty(key, value);
         } else {
             throw new IllegalArgumentException("Invalid non-standard property. "
diff --git a/src/main/org/firebirdsql/jdbc/FBDatabaseMetaData.java b/src/main/org/firebirdsql/jdbc/FBDatabaseMetaData.java
index 57c2b560a..952784fb6 100644
--- a/src/main/org/firebirdsql/jdbc/FBDatabaseMetaData.java
+++ b/src/main/org/firebirdsql/jdbc/FBDatabaseMetaData.java
@@ -48,7 +48,7 @@
 @SuppressWarnings("RedundantThrows")
 public class FBDatabaseMetaData implements FirebirdDatabaseMetaData {
 
-    private final static System.Logger log = System.getLogger(FBDatabaseMetaData.class.getName());
+    private static final System.Logger log = System.getLogger(FBDatabaseMetaData.class.getName());
 
     private final GDSHelper gdsHelper;
     private final FBConnection connection;
@@ -1498,21 +1498,21 @@ public boolean othersInsertsAreVisible(int type) throws SQLException {
 
     @Override
     public boolean updatesAreDetected(int type) throws SQLException {
-        // TODO Currently not correct when scrollableCursor=SERVER (and not a holdable cursor);
+        // TODO Currently not correct when scrollableCursor=SERVER (and not a holdable cursor),
         //  change to return true when behaviour of EMULATED is the same
         return false;
     }
 
     @Override
     public boolean deletesAreDetected(int type) throws SQLException {
-        // TODO Currently not correct when scrollableCursor=SERVER (and not a holdable cursor);
+        // TODO Currently not correct when scrollableCursor=SERVER (and not a holdable cursor),
         //  change to return true when behaviour of EMULATED is the same
         return false;
     }
 
     @Override
     public boolean insertsAreDetected(int type) throws SQLException {
-        // TODO Currently not correct when scrollableCursor=SERVER (and not a holdable cursor);
+        // TODO Currently not correct when scrollableCursor=SERVER (and not a holdable cursor),
         //  change to return true when behaviour of EMULATED is the same
         return false;
     }
diff --git a/src/main/org/firebirdsql/jdbc/FBPreparedStatement.java b/src/main/org/firebirdsql/jdbc/FBPreparedStatement.java
index 8313db973..7b565cde6 100644
--- a/src/main/org/firebirdsql/jdbc/FBPreparedStatement.java
+++ b/src/main/org/firebirdsql/jdbc/FBPreparedStatement.java
@@ -408,7 +408,7 @@ public final void setAsciiStream(int parameterIndex, InputStream x) throws SQLEx
      * @throws SQLFeatureNotSupportedException Always
      * @deprecated
      */
-    @Deprecated
+    @Deprecated(since = "1")
     public void setUnicodeStream(int parameterIndex, InputStream x, int length) throws SQLException {
         throw new SQLFeatureNotSupportedException(UNICODE_STREAM_NOT_SUPPORTED);
     }
@@ -590,10 +590,8 @@ protected boolean isGeneratedKeyQuery() {
     private void flushFields() throws SQLException {
         // flush any cached data that can be hanging
         for (int i = 0; i < fields.length; i++) {
-            FBField field = fields[i];
-
-            if (field instanceof FBFlushableField) {
-                ((FBFlushableField) field).flushCachedData();
+            if (fields[i] instanceof FBFlushableField flushableField) {
+                flushableField.flushCachedData();
             }
         }
     }
@@ -628,9 +626,8 @@ public void addBatch() throws SQLException {
         try (LockCloseable ignored = withLock()) {
             final BatchedRowValue batchedValues = new BatchedRowValue(fieldValues.deepCopy());
             for (int i = 0; i < batchedValues.getCount(); i++) {
-                FBField field = getField(i + 1);
-                if (field instanceof FBFlushableField) {
-                    batchedValues.setCachedObject(i, ((FBFlushableField) field).getCachedObject());
+                if (getField(i + 1) instanceof FBFlushableField flushableField) {
+                    batchedValues.setCachedObject(i, flushableField.getCachedObject());
                 }
             }
 
@@ -790,8 +787,8 @@ public void setFieldData(byte[] data) {
 
             // FIXME check if we can safely pass cached here
             FBField field = FBField.createField(getParameterDescriptor(i + 1), dataProvider, gdsHelper, false);
-            if (field instanceof BlobListenableField) {
-                ((BlobListenableField) field).setBlobListener(blobListener);
+            if (field instanceof BlobListenableField blobListenableField) {
+                blobListenableField.setBlobListener(blobListener);
             }
             fields[i] = field;
         }
@@ -898,6 +895,7 @@ public boolean execute(String sql, String[] columnNames) throws SQLException {
         throw new SQLNonTransientException(METHOD_NOT_SUPPORTED, SQL_STATE_GENERAL_ERROR);
     }
 
+    @Override
     public long executeLargeUpdate() throws SQLException {
         executeUpdate();
         return getLargeUpdateCountMinZero();
@@ -975,9 +973,8 @@ public RowValue toRowValue() throws SQLException {
             try {
                 fieldValues = rowValue;
                 for (int i = 0; i < fieldValues.getCount(); i++) {
-                    FBField field = getField(i + 1);
-                    if (field instanceof FBFlushableField) {
-                        ((FBFlushableField) field).setCachedObject((CachedObject) getCachedObject(i));
+                    if (getField(i + 1) instanceof FBFlushableField flushableField) {
+                        flushableField.setCachedObject((CachedObject) getCachedObject(i));
                     }
                 }
                 flushFields();
diff --git a/src/main/org/firebirdsql/jdbc/FBProcedureCall.java b/src/main/org/firebirdsql/jdbc/FBProcedureCall.java
index ea71acb30..331cdfc1f 100644
--- a/src/main/org/firebirdsql/jdbc/FBProcedureCall.java
+++ b/src/main/org/firebirdsql/jdbc/FBProcedureCall.java
@@ -88,7 +88,7 @@ public void setName(String name) {
     public FBProcedureParam getInputParam(int index) {
         FBProcedureParam result = getParam(inputParams, index);
 
-        if (result == null || result == NullParam.NULL_PARAM) {
+        if (result == NullParam.NULL_PARAM) {
             result = getParam(outputParams, index);
 
             // ensure that vector has right size
diff --git a/src/main/org/firebirdsql/jdbc/FBResultSet.java b/src/main/org/firebirdsql/jdbc/FBResultSet.java
index c2a19f522..5dce0295a 100644
--- a/src/main/org/firebirdsql/jdbc/FBResultSet.java
+++ b/src/main/org/firebirdsql/jdbc/FBResultSet.java
@@ -67,7 +67,7 @@ public class FBResultSet implements ResultSet, FirebirdResultSet, FBObjectListen
 
     private boolean wasNull = false;
     private boolean wasNullValid = false;
-    // closed is false until the close method is invoked;
+    // closed is false until the close method is invoked
     private volatile boolean closed = false;
 
     private SQLWarning firstWarning;
@@ -295,12 +295,12 @@ public void setFieldData(byte[] data) {
 
             final FBField field = FBField.createField(rowDescriptor.getFieldDescriptor(i), dataProvider, gdsHelper, cached);
 
-            if (field instanceof FBCloseableField) {
-                closeableFields.add((FBCloseableField) field);
+            if (field instanceof FBCloseableField closeableField) {
+                closeableFields.add(closeableField);
             }
 
-            if (trimStrings && field instanceof TrimmableField) {
-                ((TrimmableField) field).setTrimTrailing(true);
+            if (trimStrings && field instanceof TrimmableField trimmableField) {
+                trimmableField.setTrimTrailing(true);
             }
 
             fields[i] = field;
@@ -572,7 +572,7 @@ public Timestamp getTimestamp(int columnIndex) throws SQLException {
      *         Always
      * @deprecated
      */
-    @Deprecated
+    @Deprecated(since = "1")
     public InputStream getUnicodeStream(int columnIndex) throws SQLException {
         throw new SQLFeatureNotSupportedException(UNICODE_STREAM_NOT_SUPPORTED);
     }
@@ -666,7 +666,7 @@ public FBField getField(String columnName) throws SQLException {
      * Implementation note: ignores {@code scale} and behaves identical to {@link #getBigDecimal(int)}.
      * </p>
      */
-    @Deprecated
+    @Deprecated(since = "1")
     @Override
     public BigDecimal getBigDecimal(int columnIndex, int scale) throws SQLException {
         return getField(columnIndex).getBigDecimal(scale);
@@ -729,7 +729,7 @@ public double getDouble(String columnName) throws SQLException {
      * Implementation note: ignores {@code scale} and behaves identical to {@link #getBigDecimal(String)}.
      * </p>
      */
-    @Deprecated
+    @Deprecated(since = "1")
     @Override
     public BigDecimal getBigDecimal(String columnName, int scale) throws SQLException {
         return getField(columnName).getBigDecimal(scale);
@@ -777,7 +777,7 @@ public final InputStream getAsciiStream(String columnName) throws SQLException {
      *         Always
      * @deprecated
      */
-    @Deprecated
+    @Deprecated(since = "1")
     @Override
     public InputStream getUnicodeStream(String columnName) throws SQLException {
         throw new SQLFeatureNotSupportedException(UNICODE_STREAM_NOT_SUPPORTED);
@@ -989,8 +989,8 @@ public void setFetchDirection(int direction) throws SQLException {
             break;
         default:
             throw FbExceptionBuilder.forException(JaybirdErrorCodes.jb_invalidFetchDirection)
-                    .messageParameter(direction)
-                    .toSQLException();
+                .messageParameter(direction)
+                .toSQLException();
         }
     }
 
diff --git a/src/main/org/firebirdsql/jdbc/FBRowId.java b/src/main/org/firebirdsql/jdbc/FBRowId.java
index f4c45aa2b..648ea4884 100644
--- a/src/main/org/firebirdsql/jdbc/FBRowId.java
+++ b/src/main/org/firebirdsql/jdbc/FBRowId.java
@@ -61,7 +61,7 @@ public String toString() {
     @Override
     public boolean equals(Object obj) {
         // TODO Implementation breaks equality/hashcode contract
-        return obj instanceof RowId && Arrays.equals(rowIdBytes, ((RowId) obj).getBytes());
+        return obj instanceof RowId rowId && Arrays.equals(rowIdBytes, rowId.getBytes());
     }
 
     @Override
diff --git a/src/main/org/firebirdsql/jdbc/FBRowUpdater.java b/src/main/org/firebirdsql/jdbc/FBRowUpdater.java
index ba9f560d4..dcbc21693 100644
--- a/src/main/org/firebirdsql/jdbc/FBRowUpdater.java
+++ b/src/main/org/firebirdsql/jdbc/FBRowUpdater.java
@@ -488,8 +488,9 @@ private void executeStatement(int statementType, FbStatement stmt) throws SQLExc
         // since flushable field can update the value, which
         // in turn can change the parameter distribution
         for (int i = 0; i < rowDescriptor.getCount(); i++) {
-            if (fields[i] instanceof FBFlushableField)
-                ((FBFlushableField) fields[i]).flushCachedData();
+            if (fields[i] instanceof FBFlushableField flushableField) {
+                flushableField.flushCachedData();
+            }
         }
 
         int[] parameterMask = getParameterMask();
diff --git a/src/main/org/firebirdsql/jdbc/FBSQLException.java b/src/main/org/firebirdsql/jdbc/FBSQLException.java
index 9b526f1b5..7aa6dfcee 100644
--- a/src/main/org/firebirdsql/jdbc/FBSQLException.java
+++ b/src/main/org/firebirdsql/jdbc/FBSQLException.java
@@ -25,7 +25,7 @@
  * @deprecated Unused, will be removed in Jaybird 7
  */
 @SuppressWarnings("unused")
-@Deprecated
+@Deprecated(since = "6", forRemoval = true)
 public class FBSQLException extends SQLException {
 
     @Serial
diff --git a/src/main/org/firebirdsql/jdbc/FBStatement.java b/src/main/org/firebirdsql/jdbc/FBStatement.java
index e7e59daa1..aa4955b68 100644
--- a/src/main/org/firebirdsql/jdbc/FBStatement.java
+++ b/src/main/org/firebirdsql/jdbc/FBStatement.java
@@ -679,8 +679,8 @@ public void setFetchDirection(int direction) throws SQLException {
             break;
         default:
             throw FbExceptionBuilder.forException(JaybirdErrorCodes.jb_invalidFetchDirection)
-                    .messageParameter(direction)
-                    .toSQLException();
+                .messageParameter(direction)
+                .toSQLException();
         }
     }
 
@@ -788,9 +788,9 @@ private void executeSingleForBatch(List<Long> responses, String sql) throws SQLE
         }
     }
 
-    protected final BatchUpdateException createBatchUpdateException(String reason, String SQLState, int vendorCode,
+    protected final BatchUpdateException createBatchUpdateException(String reason, String sqlState, int vendorCode,
             long[] updateCounts, Throwable cause) {
-        return new BatchUpdateException(reason, SQLState, vendorCode, updateCounts, cause);
+        return new BatchUpdateException(reason, sqlState, vendorCode, updateCounts, cause);
     }
 
     @Override
@@ -1077,6 +1077,7 @@ public long getLargeUpdateCount() throws SQLException {
      * add a warning to the statement and reset the maximum to 0.
      * </p>
      */
+    @Override
     public void setLargeMaxRows(long max) throws SQLException {
         if (max > Integer.MAX_VALUE) {
             addWarning(new SQLWarning(
@@ -1094,10 +1095,12 @@ public void setLargeMaxRows(long max) throws SQLException {
      * same as {@link #getMaxRows()}.
      * </p>
      */
+    @Override
     public long getLargeMaxRows() throws SQLException {
         return getMaxRows();
     }
 
+    @Override
     public final long[] executeLargeBatch() throws SQLException {
         if (connection.getAutoCommit()) {
             addWarning(new SQLWarning("Batch updates should be run with auto-commit disabled", SQL_STATE_WARNING));
@@ -1106,6 +1109,7 @@ public final long[] executeLargeBatch() throws SQLException {
         return Primitives.toLongArray(executeBatchInternal());
     }
 
+    @Override
     public final long executeLargeUpdate(String sql) throws SQLException {
         try (LockCloseable ignored = withLock()) {
             executeUpdate(sql);
@@ -1113,6 +1117,7 @@ public final long executeLargeUpdate(String sql) throws SQLException {
         }
     }
 
+    @Override
     public final long executeLargeUpdate(String sql, int autoGeneratedKeys) throws SQLException {
         try (LockCloseable ignored = withLock()) {
             if (execute(sql, autoGeneratedKeys)) {
@@ -1122,6 +1127,7 @@ public final long executeLargeUpdate(String sql, int autoGeneratedKeys) throws S
         }
     }
 
+    @Override
     public final long executeLargeUpdate(String sql, int[] columnIndexes) throws SQLException {
         try (LockCloseable ignored = withLock()) {
             if (execute(sql, columnIndexes)) {
@@ -1131,6 +1137,7 @@ public final long executeLargeUpdate(String sql, int[] columnIndexes) throws SQL
         }
     }
 
+    @Override
     public final long executeLargeUpdate(String sql, String[] columnNames) throws SQLException {
         try (LockCloseable ignored = withLock()) {
             if (execute(sql, columnNames)) {
@@ -1154,6 +1161,7 @@ public final long executeLargeUpdate(String sql, String[] columnNames) throws SQ
      * @throws NullPointerException if val is {@code null}
      * @throws SQLException if a database access error occurs
      */
+    @Override
     public String enquoteLiteral(String val)  throws SQLException {
         if (gdsHelper.getCurrentDatabase().getDatabaseDialect() == 1) {
             return '"' + val.replace("\"", "\"\"") + '"';
@@ -1164,6 +1172,7 @@ public String enquoteLiteral(String val)  throws SQLException {
     /**
      * @see #enquoteLiteral(String)
      */
+    @Override
     public String enquoteNCharLiteral(String val)  throws SQLException {
         return enquoteLiteral(val);
     }
@@ -1189,6 +1198,7 @@ public String enquoteNCharLiteral(String val)  throws SQLException {
      * delimited identifiers (ie: a dialect 1 database)
      * @throws NullPointerException if identifier is {@code null}
      */
+    @Override
     public String enquoteIdentifier(String identifier, boolean alwaysQuote) throws SQLException {
         int len = identifier.length();
         if (len < 1 || len > connection.getMetaData().getMaxColumnNameLength()) {
@@ -1208,6 +1218,7 @@ public String enquoteIdentifier(String identifier, boolean alwaysQuote) throws S
         return quoteStrategy.quoteObjectName(identifier);
     }
 
+    @Override
     public boolean isSimpleIdentifier(String identifier) throws SQLException {
         int len = identifier.length();
         return len >= 1 && len <= connection.getMetaData().getMaxColumnNameLength()
diff --git a/src/main/org/firebirdsql/jdbc/FirebirdConnection.java b/src/main/org/firebirdsql/jdbc/FirebirdConnection.java
index 1a35b6efa..2ce68f78b 100644
--- a/src/main/org/firebirdsql/jdbc/FirebirdConnection.java
+++ b/src/main/org/firebirdsql/jdbc/FirebirdConnection.java
@@ -59,7 +59,7 @@ public interface FirebirdConnection extends Connection {
      *         if specified transaction parameters cannot be set.
      * @deprecated use {@link #setTransactionParameters(int, TransactionParameterBuffer)} instead.
      */
-    @Deprecated
+    @Deprecated(since = "2")
     void setTransactionParameters(int isolationLevel, int[] parameters) throws SQLException;
 
     /**
diff --git a/src/main/org/firebirdsql/jdbc/FirebirdConnectionProperties.java b/src/main/org/firebirdsql/jdbc/FirebirdConnectionProperties.java
index 35b809dd9..6d2cec911 100644
--- a/src/main/org/firebirdsql/jdbc/FirebirdConnectionProperties.java
+++ b/src/main/org/firebirdsql/jdbc/FirebirdConnectionProperties.java
@@ -38,7 +38,7 @@ public interface FirebirdConnectionProperties extends DatabaseConnectionProperti
      * @return name of the user that will be used when connecting to the database.
      * @deprecated Use {@link #getUser()} instead; will be retained indefinitely for compatibility
      */
-    @Deprecated
+    @Deprecated(since = "5")
     default String getUserName() {
         return getUser();
     }
@@ -48,7 +48,7 @@ default String getUserName() {
      *         name of the user that will be used when connecting to the database.
      * @deprecated Use {@link #setUser(String)}; will be retained indefinitely for compatibility
      */
-    @Deprecated
+    @Deprecated(since = "5")
     default void setUserName(String userName) {
         setUser(userName);
     }
diff --git a/src/main/org/firebirdsql/jdbc/GeneratedKeysQueryBuilder.java b/src/main/org/firebirdsql/jdbc/GeneratedKeysQueryBuilder.java
index 9c379eda8..0e8c5eba5 100644
--- a/src/main/org/firebirdsql/jdbc/GeneratedKeysQueryBuilder.java
+++ b/src/main/org/firebirdsql/jdbc/GeneratedKeysQueryBuilder.java
@@ -367,7 +367,7 @@ private String normalizeObjectName(String objectName) {
         if (objectName.length() > 2
                 && objectName.charAt(0) == '"'
                 && objectName.charAt(objectName.length() - 1) == '"') {
-            return objectName.substring(1, objectName.length() - 1).replaceAll("\"\"", "\"");
+            return objectName.substring(1, objectName.length() - 1).replace("\"\"", "\"");
         }
         return objectName.toUpperCase(Locale.ROOT);
     }
diff --git a/src/main/org/firebirdsql/jdbc/InternalTransactionCoordinator.java b/src/main/org/firebirdsql/jdbc/InternalTransactionCoordinator.java
index 96a46731e..86f8a699b 100644
--- a/src/main/org/firebirdsql/jdbc/InternalTransactionCoordinator.java
+++ b/src/main/org/firebirdsql/jdbc/InternalTransactionCoordinator.java
@@ -680,6 +680,7 @@ public void executionStarted(FirebirdBlob blob) throws SQLException {
 
         }
 
+        @Override
         boolean isAutoCommit() throws SQLException {
             return tc.getAutoCommit();
         }
diff --git a/src/main/org/firebirdsql/jdbc/ServerBatch.java b/src/main/org/firebirdsql/jdbc/ServerBatch.java
index 548317fa1..96df12d0e 100644
--- a/src/main/org/firebirdsql/jdbc/ServerBatch.java
+++ b/src/main/org/firebirdsql/jdbc/ServerBatch.java
@@ -381,11 +381,9 @@ private static class BatchDeferredAction implements DeferredResponse<Void> {
 
         @Override
         public void onException(Exception exception) {
-            if (exception instanceof SQLException) {
-                chain.append((SQLException) exception);
-            } else {
-                chain.append(new SQLNonTransientException(genericExceptionMessage, exception));
-            }
+            chain.append(exception instanceof SQLException sqle
+                    ? sqle
+                    : new SQLNonTransientException(genericExceptionMessage, exception));
         }
 
     }
diff --git a/src/main/org/firebirdsql/jdbc/escape/FBEscapedCallParser.java b/src/main/org/firebirdsql/jdbc/escape/FBEscapedCallParser.java
index 6e1d19d5d..61812c8e0 100644
--- a/src/main/org/firebirdsql/jdbc/escape/FBEscapedCallParser.java
+++ b/src/main/org/firebirdsql/jdbc/escape/FBEscapedCallParser.java
@@ -172,27 +172,23 @@ public FBProcedureCall parseCall(String sql) throws SQLException {
 
             switch (state) {
             case NORMAL_STATE:
-                // if we have an equal sign, most likely {? = call ...}
-                // syntax is used (there's hardly any place for this sign
-                // in procedure parameters). but to be sure, we check if
-                // no brace is open and if buffer contains only '?'
-                if (currentChar == '=') {
-                    if (openBraceCount <= 0) {
-                        if (buffer.length() >= 1 && buffer.charAt(0) == '?' && !isFirstOutParam && !isNameProcessed) {
-                            FBProcedureParam param = procedureCall.addParam(paramPosition, "?");
-                            paramCount++;
-                            param.setIndex(paramCount);
-                            isFirstOutParam = true;
-                            paramPosition++;
-                            buffer.setLength(0);
-                            continue;
-                        }
-                    }
+                // if we have an equal sign, most likely {? = call ...} syntax is used (there's hardly any place for
+                // this symbol in procedure parameters).
+                // To be sure, we check if no brace is open and if buffer contains only '?'.
+                if (currentChar == '=' && openBraceCount <= 0 && !buffer.isEmpty() && buffer.charAt(0) == '?'
+                    && !isFirstOutParam && !isNameProcessed) {
+                    FBProcedureParam param = procedureCall.addParam(paramPosition, "?");
+                    paramCount++;
+                    param.setIndex(paramCount);
+                    isFirstOutParam = true;
+                    paramPosition++;
+                    buffer.setLength(0);
+                    continue;
                 }
                 buffer.append(currentChar);
                 break;
             case SPACE_STATE:
-                if (buffer.length() == 0) {
+                if (buffer.isEmpty()) {
                     state = NORMAL_STATE;
                     continue;
                 }
diff --git a/src/main/org/firebirdsql/jdbc/field/FBBigDecimalField.java b/src/main/org/firebirdsql/jdbc/field/FBBigDecimalField.java
index 4f81563c4..fd3801256 100644
--- a/src/main/org/firebirdsql/jdbc/field/FBBigDecimalField.java
+++ b/src/main/org/firebirdsql/jdbc/field/FBBigDecimalField.java
@@ -65,11 +65,13 @@ public Object getObject() throws SQLException {
         return getBigDecimal();
     }
 
+    @Override
     public boolean getBoolean() throws SQLException {
         // TODO might be better to use BigDecimal.ONE.equals(getBigDecimal()) (or compareTo == 0), but is not backwards compatible.
         return getByte() == 1;
     }
 
+    @Override
     public byte getByte() throws SQLException {
         long longValue = getLong();
         // check if value is within bounds
@@ -80,16 +82,19 @@ public byte getByte() throws SQLException {
         return (byte) longValue;
     }
 
+    @Override
     public double getDouble() throws SQLException {
         BigDecimal value = getBigDecimal();
         return value != null ? value.doubleValue() : DOUBLE_NULL_VALUE;
     }
 
+    @Override
     public float getFloat() throws SQLException {
         BigDecimal value = getBigDecimal();
         return value != null ? value.floatValue() : FLOAT_NULL_VALUE;
     }
 
+    @Override
     public int getInt() throws SQLException {
         long longValue = getLong();
         // check if value is within bounds
@@ -100,6 +105,7 @@ public int getInt() throws SQLException {
         return (int) longValue;
     }
 
+    @Override
     public long getLong() throws SQLException {
         BigDecimal value = getBigDecimal();
         if (value == null) return LONG_NULL_VALUE;
@@ -111,6 +117,7 @@ public long getLong() throws SQLException {
         return value.longValue();
     }
 
+    @Override
     public short getShort() throws SQLException {
         long longValue = getLong();
         // check if value is within bounds
@@ -121,11 +128,13 @@ public short getShort() throws SQLException {
         return (short) longValue;
     }
 
+    @Override
     public String getString() throws SQLException {
         BigDecimal value = getBigDecimal();
         return value != null ? value.toString() : null;
     }
 
+    @Override
     public BigDecimal getBigDecimal() throws SQLException {
         return fieldDataSize.decode(fieldDescriptor, getFieldData());
     }
@@ -138,38 +147,47 @@ public BigInteger getBigInteger() throws SQLException {
 
     //--- setXXX methods
 
+    @Override
     public void setBoolean(boolean value) throws SQLException {
         setLong(value ? 1 : 0);
     }
 
+    @Override
     public void setByte(byte value) throws SQLException {
         setLong(value);
     }
 
+    @Override
     public void setDouble(double value) throws SQLException {
         setBigDecimal(BigDecimal.valueOf(value));
     }
 
+    @Override
     public void setFloat(float value) throws SQLException {
         setDouble(value);
     }
 
+    @Override
     public void setInteger(int value) throws SQLException {
         setLong(value);
     }
 
+    @Override
     public void setLong(long value) throws SQLException {
         setBigDecimal(BigDecimal.valueOf(value));
     }
 
+    @Override
     public void setShort(short value) throws SQLException {
         setLong(value);
     }
 
+    @Override
     public void setString(String value) throws SQLException {
         setBigDecimal(fromString(value, BigDecimal::new));
     }
 
+    @Override
     public void setBigDecimal(BigDecimal value) throws SQLException {
         setFieldData(fieldDataSize.encode(fieldDescriptor, value));
     }
diff --git a/src/main/org/firebirdsql/jdbc/field/FBBlobField.java b/src/main/org/firebirdsql/jdbc/field/FBBlobField.java
index 751d32fe8..9c08127ac 100644
--- a/src/main/org/firebirdsql/jdbc/field/FBBlobField.java
+++ b/src/main/org/firebirdsql/jdbc/field/FBBlobField.java
@@ -304,10 +304,10 @@ public void setNull() {
     }
 
     private <T extends FirebirdBlob> T registerWithTransaction(T blob) {
-        if (blob instanceof TransactionListener) {
+        if (blob instanceof TransactionListener transactionListener) {
             FbTransaction currentTransaction = gdsHelper.getCurrentTransaction();
             if (currentTransaction != null) {
-                currentTransaction.addWeakTransactionListener((TransactionListener) blob);
+                currentTransaction.addWeakTransactionListener(transactionListener);
             }
         }
         return blob;
diff --git a/src/main/org/firebirdsql/jdbc/field/FBCachedBlobField.java b/src/main/org/firebirdsql/jdbc/field/FBCachedBlobField.java
index 98cf46195..9edd65e1d 100644
--- a/src/main/org/firebirdsql/jdbc/field/FBCachedBlobField.java
+++ b/src/main/org/firebirdsql/jdbc/field/FBCachedBlobField.java
@@ -47,12 +47,14 @@ protected FirebirdBlob getBlobInternal() {
         blob = new FBCachedBlob(bytes);
         return blob;
     }
-    
+
+    @Override
     public Clob getClob() throws SQLException {
     	if (isNull()) return null;
     	return new FBCachedClob((FBCachedBlob) getBlob(), blobConfig);
     }
 
+    @Override
     public byte[] getBytes() throws SQLException {
         // TODO Looks suspicious compared to the implementation in FBBlobField
         return getFieldData();
diff --git a/src/main/org/firebirdsql/jdbc/field/FBCachedLongVarCharField.java b/src/main/org/firebirdsql/jdbc/field/FBCachedLongVarCharField.java
index 6a59e7cea..cca6e581d 100644
--- a/src/main/org/firebirdsql/jdbc/field/FBCachedLongVarCharField.java
+++ b/src/main/org/firebirdsql/jdbc/field/FBCachedLongVarCharField.java
@@ -41,11 +41,13 @@ final class FBCachedLongVarCharField extends FBLongVarCharField {
         super(fieldDescriptor, dataProvider, requiredType, gdsHelper);
     }
 
+    @Override
     public Blob getBlob() throws SQLException {
         if (isNull()) return null;
         return new FBCachedBlob(getFieldData());
     }
-    
+
+    @Override
     public Clob getClob() throws SQLException {
     	if (isNull()) return null;
     	return new FBCachedClob((FBCachedBlob)getBlob(), blobConfig);
diff --git a/src/main/org/firebirdsql/jdbc/field/FBDateField.java b/src/main/org/firebirdsql/jdbc/field/FBDateField.java
index e1edff84f..6a377de9f 100644
--- a/src/main/org/firebirdsql/jdbc/field/FBDateField.java
+++ b/src/main/org/firebirdsql/jdbc/field/FBDateField.java
@@ -54,6 +54,7 @@ LocalDateTime getLocalDateTime() throws SQLException {
         return localDate != null ? localDate.atStartOfDay() : null;
     }
 
+    @Override
     public String getString() throws SQLException {
         return FbDatetimeConversion.formatSqlDate(getLocalDate());
     }
diff --git a/src/main/org/firebirdsql/jdbc/field/FBDecfloatField.java b/src/main/org/firebirdsql/jdbc/field/FBDecfloatField.java
index f97bcbe2f..19b722a24 100644
--- a/src/main/org/firebirdsql/jdbc/field/FBDecfloatField.java
+++ b/src/main/org/firebirdsql/jdbc/field/FBDecfloatField.java
@@ -197,6 +197,7 @@ public boolean getBoolean() throws SQLException {
         return BigDecimal.ONE.equals(getBigDecimal());
     }
 
+    @Override
     public void setBoolean(boolean value) throws SQLException {
         setBigDecimal(value ? BigDecimal.ONE : BigDecimal.ZERO);
     }
diff --git a/src/main/org/firebirdsql/jdbc/field/FBDoubleField.java b/src/main/org/firebirdsql/jdbc/field/FBDoubleField.java
index 51c3d150e..a63351503 100644
--- a/src/main/org/firebirdsql/jdbc/field/FBDoubleField.java
+++ b/src/main/org/firebirdsql/jdbc/field/FBDoubleField.java
@@ -44,6 +44,7 @@ public Object getObject() throws SQLException {
         return getDouble();
     }
 
+    @Override
     public byte getByte() throws SQLException {
         double value = getDouble();
         // check if value is within bounds
@@ -53,7 +54,8 @@ public byte getByte() throws SQLException {
 
         return (byte) value;
     }
-    
+
+    @Override
     public short getShort() throws SQLException {
         double value = getDouble();
         // check if value is within bounds
@@ -63,7 +65,8 @@ public short getShort() throws SQLException {
 
         return (short) value;
     }
-    
+
+    @Override
     public int getInt() throws SQLException {
         double value = getDouble();
         // check if value is within bounds
@@ -73,7 +76,8 @@ public int getInt() throws SQLException {
 
         return (int) value;
     }
-    
+
+    @Override
     public long getLong() throws SQLException {
         double value = getDouble();
         // check if value is within bounds
@@ -83,7 +87,8 @@ public long getLong() throws SQLException {
 
         return (long) value;
     }
-    
+
+    @Override
     public float getFloat() throws SQLException {
         // TODO Does this match with the way getDouble() works?
         double value = getDouble();
@@ -95,20 +100,24 @@ public float getFloat() throws SQLException {
 
         return cValue;
     }
-    
+
+    @Override
     public double getDouble() throws SQLException {
         return getDatatypeCoder().decodeDouble(getFieldData());
     }
-    
+
+    @Override
     public BigDecimal getBigDecimal() throws SQLException {
         if (isNull()) return null;
         return BigDecimal.valueOf(getDouble());
     }
 
+    @Override
     public boolean getBoolean() throws SQLException {
         return getDouble() == 1;
     }
-    
+
+    @Override
     public String getString() throws SQLException {
         if (isNull()) return null;
         return String.valueOf(getDouble());
@@ -116,6 +125,7 @@ public String getString() throws SQLException {
 
     //--- setXXX methods
 
+    @Override
     public void setString(String value) throws SQLException {
         if (setWhenNull(value)) return;
         String string = value.trim();
@@ -125,35 +135,43 @@ public void setString(String value) throws SQLException {
             throw invalidSetConversion(String.class, string, nfex);
         }
     }
-    
+
+    @Override
     public void setShort(short value) throws SQLException {
         setDouble(value);
     }
-    
+
+    @Override
     public void setBoolean(boolean value) throws SQLException {
         setDouble(value ? 1 : 0);
     }
-    
+
+    @Override
     public void setFloat(float value) throws SQLException {
         setDouble(value);
     }
-    
+
+    @Override
     public void setDouble(double value) throws SQLException {
         setFieldData(getDatatypeCoder().encodeDouble(value));
     }
-    
+
+    @Override
     public void setLong(long value) throws SQLException {
         setDouble(value);
     }
-    
+
+    @Override
     public void setInteger(int value) throws SQLException {
         setDouble(value);
     }
-    
+
+    @Override
     public void setByte(byte value) throws SQLException {
         setDouble(value);
     }
-    
+
+    @Override
     public void setBigDecimal(BigDecimal value) throws SQLException {
         if (setWhenNull(value)) return;
         // check if value is within bounds
diff --git a/src/main/org/firebirdsql/jdbc/field/FBField.java b/src/main/org/firebirdsql/jdbc/field/FBField.java
index 993234d6d..03b95fc13 100644
--- a/src/main/org/firebirdsql/jdbc/field/FBField.java
+++ b/src/main/org/firebirdsql/jdbc/field/FBField.java
@@ -491,38 +491,34 @@ public void setObject(Object value) throws SQLException {
         case FB_ROW_ID_CLASS_NAME -> setRowId((RowId) value);
         case DECIMAL32_CLASS_NAME, DECIMAL64_CLASS_NAME, DECIMAL128_CLASS_NAME -> setDecimal((Decimal<?>) value);
         default -> {
-            if (value instanceof BigDecimal) {
-                setBigDecimal((BigDecimal) value);
-            } else if (value instanceof BigInteger) {
-                setBigInteger((BigInteger) value);
-            } else if (value instanceof RowId) {
-                setRowId((RowId) value);
-            } else if (value instanceof InputStream) {
-                setBinaryStream((InputStream) value);
-            } else if (value instanceof Reader) {
-                setCharacterStream((Reader) value);
-            } else if (value instanceof Clob) {
-                if (value instanceof FBClob) {
-                    setClob((FBClob) value);
-                } else {
-                    setCharacterStream(((Clob) value).getCharacterStream());
-                }
-            } else if (value instanceof Blob) {
-                if (value instanceof FBBlob) {
-                    setBlob((FBBlob) value);
-                } else {
-                    setBinaryStream(((Blob) value).getBinaryStream());
-                }
-            } else if (value instanceof Date) {
-                setDate((Date) value);
-            } else if (value instanceof Time) {
-                setTime((Time) value);
-            } else if (value instanceof Timestamp) {
-                setTimestamp((Timestamp) value);
-            } else if (value instanceof java.util.Date) {
-                setTimestamp(new Timestamp(((java.util.Date) value).getTime()));
-            } else if (value instanceof Decimal) {
-                setDecimal((Decimal<?>) value);
+            if (value instanceof BigDecimal bigDecimal) {
+                setBigDecimal(bigDecimal);
+            } else if (value instanceof BigInteger bigInteger) {
+                setBigInteger(bigInteger);
+            } else if (value instanceof RowId rowId) {
+                setRowId(rowId);
+            } else if (value instanceof InputStream inputStream) {
+                setBinaryStream(inputStream);
+            } else if (value instanceof Reader reader) {
+                setCharacterStream(reader);
+            } else if (value instanceof FBClob fbClob) {
+                setClob(fbClob);
+            } else if (value instanceof Clob clob) {
+                setCharacterStream(clob.getCharacterStream());
+            } else if (value instanceof FBBlob fbBlob) {
+                setBlob(fbBlob);
+            }  else if (value instanceof Blob blob) {
+                setBinaryStream(blob.getBinaryStream());
+            } else if (value instanceof Date date) {
+                setDate(date);
+            } else if (value instanceof Time time) {
+                setTime(time);
+            } else if (value instanceof Timestamp timestamp) {
+                setTimestamp(timestamp);
+            } else if (value instanceof java.util.Date juDate) {
+                setTimestamp(new Timestamp(juDate.getTime()));
+            } else if (value instanceof Decimal<?> decimal) {
+                setDecimal(decimal);
             } else {
                 throw invalidSetConversion(value.getClass());
             }
diff --git a/src/main/org/firebirdsql/jdbc/field/FBFloatField.java b/src/main/org/firebirdsql/jdbc/field/FBFloatField.java
index 1dcacefca..06550a511 100644
--- a/src/main/org/firebirdsql/jdbc/field/FBFloatField.java
+++ b/src/main/org/firebirdsql/jdbc/field/FBFloatField.java
@@ -46,6 +46,7 @@ public Object getObject() throws SQLException {
         return getDouble();
     }
 
+    @Override
     public byte getByte() throws SQLException {
         float value = getFloat();
         // check if value is within bounds
@@ -56,6 +57,7 @@ public byte getByte() throws SQLException {
         return (byte) value;
     }
 
+    @Override
     public short getShort() throws SQLException {
         float value = getFloat();
         // check if value is within bounds
@@ -66,6 +68,7 @@ public short getShort() throws SQLException {
         return (short) value;
     }
 
+    @Override
     public int getInt() throws SQLException {
         float value = getFloat();
         // check if value is within bounds
@@ -76,6 +79,7 @@ public int getInt() throws SQLException {
         return (int) value;
     }
 
+    @Override
     public long getLong() throws SQLException {
         float value = getFloat();
         // check if value is within bounds
@@ -86,23 +90,28 @@ public long getLong() throws SQLException {
         return (long) value;
     }
 
+    @Override
     public float getFloat() throws SQLException {
         return getDatatypeCoder().decodeFloat(getFieldData());
     }
 
+    @Override
     public double getDouble() throws SQLException {
         return getFloat();
     }
 
+    @Override
     public BigDecimal getBigDecimal() throws SQLException {
         if (isNull()) return null;
         return BigDecimal.valueOf(getFloat());
     }
 
+    @Override
     public boolean getBoolean() throws SQLException {
         return getFloat() == 1;
     }
 
+    @Override
     public String getString() throws SQLException {
         if (isNull()) return null;
         return String.valueOf(getFloat());
@@ -110,6 +119,7 @@ public String getString() throws SQLException {
 
     //--- setXXX methods
 
+    @Override
     public void setString(String value) throws SQLException {
         if (setWhenNull(value)) return;
         String string = value.trim();
@@ -120,18 +130,22 @@ public void setString(String value) throws SQLException {
         }
     }
 
+    @Override
     public void setShort(short value) throws SQLException {
         setFloat(value);
     }
 
+    @Override
     public void setBoolean(boolean value) throws SQLException {
         setFloat(value ? 1.0f : 0.0f);
     }
 
+    @Override
     public void setFloat(float value) throws SQLException {
         setFieldData(getDatatypeCoder().encodeFloat(value));
     }
 
+    @Override
     public void setDouble(double value) throws SQLException {
         // check if value is within bounds
         if (value == Double.NEGATIVE_INFINITY) {
@@ -146,18 +160,22 @@ public void setDouble(double value) throws SQLException {
         }
     }
 
+    @Override
     public void setLong(long value) throws SQLException {
         setFloat(value);
     }
 
+    @Override
     public void setInteger(int value) throws SQLException {
         setFloat(value);
     }
 
+    @Override
     public void setByte(byte value) throws SQLException {
         setFloat(value);
     }
 
+    @Override
     public void setBigDecimal(BigDecimal value) throws SQLException {
         if (setWhenNull(value)) return;
         // check if value is within bounds
diff --git a/src/main/org/firebirdsql/jdbc/field/FBNullField.java b/src/main/org/firebirdsql/jdbc/field/FBNullField.java
index 1750e4d6a..d29bac662 100644
--- a/src/main/org/firebirdsql/jdbc/field/FBNullField.java
+++ b/src/main/org/firebirdsql/jdbc/field/FBNullField.java
@@ -77,35 +77,42 @@ private <T> T getAsNull() throws SQLException {
 
     // ----- Math code
 
+    @Override
     public byte getByte() throws SQLException {
         checkNull();
         return BYTE_NULL_VALUE;
     }
 
+    @Override
     public short getShort() throws SQLException {
         checkNull();
         return SHORT_NULL_VALUE;
     }
 
+    @Override
     public int getInt() throws SQLException {
         checkNull();
         return INT_NULL_VALUE;
     }
 
+    @Override
     public long getLong() throws SQLException {
         checkNull();
         return LONG_NULL_VALUE;
     }
 
+    @Override
     public BigDecimal getBigDecimal() throws SQLException {
         return getAsNull();
     }
 
+    @Override
     public float getFloat() throws SQLException {
         checkNull();
         return FLOAT_NULL_VALUE;
     }
 
+    @Override
     public double getDouble() throws SQLException {
         checkNull();
         return DOUBLE_NULL_VALUE;
@@ -113,83 +120,101 @@ public double getDouble() throws SQLException {
 
     // ----- getBoolean, getString and getObject code
 
+    @Override
     public boolean getBoolean() throws SQLException {
         checkNull();
         return BOOLEAN_NULL_VALUE;
     }
 
+    @Override
     public String getString() throws SQLException {
         return getAsNull();
     }
 
     // ----- getXXXStream code
 
+    @Override
     public InputStream getBinaryStream() throws SQLException {
         return getAsNull();
     }
 
+    @Override
     public byte[] getBytes() throws SQLException {
         return getAsNull();
     }
 
     // ----- getDate, getTime and getTimestamp code
 
+    @Override
     public Date getDate(Calendar cal) throws SQLException {
         return getAsNull();
     }
 
+    @Override
     public Date getDate() throws SQLException {
         return getAsNull();
     }
 
+    @Override
     public Time getTime(Calendar cal) throws SQLException {
         return getAsNull();
     }
 
+    @Override
     public Time getTime() throws SQLException {
         return getAsNull();
     }
 
+    @Override
     public Timestamp getTimestamp(Calendar cal) throws SQLException {
         return getAsNull();
     }
 
+    @Override
     public Timestamp getTimestamp() throws SQLException {
         return getAsNull();
     }
 
     // --- setXXX methods
 
+    @Override
     public void setByte(byte value) throws SQLException {
         setDummyObject();
     }
 
+    @Override
     public void setShort(short value) throws SQLException {
         setDummyObject();
     }
 
+    @Override
     public void setInteger(int value) throws SQLException {
         setDummyObject();
     }
 
+    @Override
     public void setLong(long value) throws SQLException {
         setDummyObject();
     }
 
+    @Override
     public void setFloat(float value) throws SQLException {
         setDummyObject();
     }
 
+    @Override
     public void setDouble(double value) throws SQLException {
         setDummyObject();
     }
 
+    @Override
     public void setBigDecimal(BigDecimal value) throws SQLException {
         setObject(value);
     }
 
     // ----- setBoolean, setObject and setObject code
 
+    @Override
     public void setBoolean(boolean value) throws SQLException {
         setDummyObject();
     }
@@ -210,32 +235,39 @@ protected void setCharacterStreamInternal(Reader in, long length) throws SQLExce
         setDummyObject();
     }
 
+    @Override
     public void setBytes(byte[] value) throws SQLException {
         setObject(value);
     }
 
     // ----- setDate, setTime and setTimestamp code
 
+    @Override
     public void setDate(Date value, Calendar cal) throws SQLException {
         setObject(value);
     }
 
+    @Override
     public void setDate(Date value) throws SQLException {
         setObject(value);
     }
 
+    @Override
     public void setTime(Time value, Calendar cal) throws SQLException {
         setObject(value);
     }
 
+    @Override
     public void setTime(Time value) throws SQLException {
         setObject(value);
     }
 
+    @Override
     public void setTimestamp(Timestamp value, Calendar cal) throws SQLException {
         setObject(value);
     }
 
+    @Override
     public void setTimestamp(Timestamp value) throws SQLException {
         setObject(value);
     }
diff --git a/src/main/org/firebirdsql/jdbc/metadata/AbstractKeysMethod.java b/src/main/org/firebirdsql/jdbc/metadata/AbstractKeysMethod.java
index 1b5735bde..c5c79eaeb 100644
--- a/src/main/org/firebirdsql/jdbc/metadata/AbstractKeysMethod.java
+++ b/src/main/org/firebirdsql/jdbc/metadata/AbstractKeysMethod.java
@@ -38,21 +38,23 @@
  */
 abstract class AbstractKeysMethod extends AbstractMetadataMethod {
 
+    private static final String COLUMNINFO = "COLUMNINFO";
+
     private static final RowDescriptor ROW_DESCRIPTOR = DbMetadataMediator.newRowDescriptorBuilder(14)
-            .at(0).simple(SQL_VARYING | 1, OBJECT_NAME_LENGTH, "PKTABLE_CAT", "COLUMNINFO").addField()
-            .at(1).simple(SQL_VARYING | 1, OBJECT_NAME_LENGTH, "PKTABLE_SCHEM", "COLUMNINFO").addField()
-            .at(2).simple(SQL_VARYING, OBJECT_NAME_LENGTH, "PKTABLE_NAME", "COLUMNINFO").addField()
-            .at(3).simple(SQL_VARYING, OBJECT_NAME_LENGTH, "PKCOLUMN_NAME", "COLUMNINFO").addField()
-            .at(4).simple(SQL_VARYING | 1, OBJECT_NAME_LENGTH, "FKTABLE_CAT", "COLUMNINFO").addField()
-            .at(5).simple(SQL_VARYING | 1, OBJECT_NAME_LENGTH, "FKTABLE_SCHEM", "COLUMNINFO").addField()
-            .at(6).simple(SQL_VARYING, OBJECT_NAME_LENGTH, "FKTABLE_NAME", "COLUMNINFO").addField()
-            .at(7).simple(SQL_VARYING, OBJECT_NAME_LENGTH, "FKCOLUMN_NAME", "COLUMNINFO").addField()
-            .at(8).simple(SQL_SHORT, 0, "KEY_SEQ", "COLUMNINFO").addField()
-            .at(9).simple(SQL_SHORT, 0, "UPDATE_RULE", "COLUMNINFO").addField()
-            .at(10).simple(SQL_SHORT, 0, "DELETE_RULE", "COLUMNINFO").addField()
-            .at(11).simple(SQL_VARYING, OBJECT_NAME_LENGTH, "FK_NAME", "COLUMNINFO").addField()
-            .at(12).simple(SQL_VARYING, OBJECT_NAME_LENGTH, "PK_NAME", "COLUMNINFO").addField()
-            .at(13).simple(SQL_SHORT, 0, "DEFERRABILITY", "COLUMNINFO").addField()
+            .at(0).simple(SQL_VARYING | 1, OBJECT_NAME_LENGTH, "PKTABLE_CAT", COLUMNINFO).addField()
+            .at(1).simple(SQL_VARYING | 1, OBJECT_NAME_LENGTH, "PKTABLE_SCHEM", COLUMNINFO).addField()
+            .at(2).simple(SQL_VARYING, OBJECT_NAME_LENGTH, "PKTABLE_NAME", COLUMNINFO).addField()
+            .at(3).simple(SQL_VARYING, OBJECT_NAME_LENGTH, "PKCOLUMN_NAME", COLUMNINFO).addField()
+            .at(4).simple(SQL_VARYING | 1, OBJECT_NAME_LENGTH, "FKTABLE_CAT", COLUMNINFO).addField()
+            .at(5).simple(SQL_VARYING | 1, OBJECT_NAME_LENGTH, "FKTABLE_SCHEM", COLUMNINFO).addField()
+            .at(6).simple(SQL_VARYING, OBJECT_NAME_LENGTH, "FKTABLE_NAME", COLUMNINFO).addField()
+            .at(7).simple(SQL_VARYING, OBJECT_NAME_LENGTH, "FKCOLUMN_NAME", COLUMNINFO).addField()
+            .at(8).simple(SQL_SHORT, 0, "KEY_SEQ", COLUMNINFO).addField()
+            .at(9).simple(SQL_SHORT, 0, "UPDATE_RULE", COLUMNINFO).addField()
+            .at(10).simple(SQL_SHORT, 0, "DELETE_RULE", COLUMNINFO).addField()
+            .at(11).simple(SQL_VARYING, OBJECT_NAME_LENGTH, "FK_NAME", COLUMNINFO).addField()
+            .at(12).simple(SQL_VARYING, OBJECT_NAME_LENGTH, "PK_NAME", COLUMNINFO).addField()
+            .at(13).simple(SQL_SHORT, 0, "DEFERRABILITY", COLUMNINFO).addField()
             .toRowDescriptor();
 
     AbstractKeysMethod(DbMetadataMediator mediator) {
diff --git a/src/main/org/firebirdsql/jdbc/metadata/GetAttributes.java b/src/main/org/firebirdsql/jdbc/metadata/GetAttributes.java
index 4706f48b0..497abd4c2 100644
--- a/src/main/org/firebirdsql/jdbc/metadata/GetAttributes.java
+++ b/src/main/org/firebirdsql/jdbc/metadata/GetAttributes.java
@@ -39,28 +39,30 @@
  */
 public final class GetAttributes {
 
+    private static final String ATTRIBUTES = "ATTRIBUTES";
+    
     private static final RowDescriptor ROW_DESCRIPTOR = DbMetadataMediator.newRowDescriptorBuilder(21)
-            .at(0).simple(SQL_VARYING, OBJECT_NAME_LENGTH, "TYPE_CAT", "ATTRIBUTES").addField()
-            .at(1).simple(SQL_VARYING, OBJECT_NAME_LENGTH, "TYPE_SCHEM", "ATTRIBUTES").addField()
-            .at(2).simple(SQL_VARYING, 31, "TYPE_NAME", "ATTRIBUTES").addField()
-            .at(3).simple(SQL_VARYING, 31, "ATTR_NAME", "ATTRIBUTES").addField()
-            .at(4).simple(SQL_LONG, 0, "DATA_TYPE", "ATTRIBUTES").addField()
-            .at(5).simple(SQL_VARYING, 31, "ATTR_TYPE_NAME", "ATTRIBUTES").addField()
-            .at(6).simple(SQL_LONG, 0, "ATTR_SIZE", "ATTRIBUTES").addField()
-            .at(7).simple(SQL_LONG, 0, "DECIMAL_DIGITS", "ATTRIBUTES").addField()
-            .at(8).simple(SQL_LONG, 0, "NUM_PREC_RADIX", "ATTRIBUTES").addField()
-            .at(9).simple(SQL_LONG, 0, "NULLABLE", "ATTRIBUTES").addField()
-            .at(10).simple(SQL_VARYING, 80, "REMARKS", "ATTRIBUTES").addField()
-            .at(11).simple(SQL_VARYING, 31, "ATTR_DEF", "ATTRIBUTES").addField()
-            .at(12).simple(SQL_LONG, 0, "SQL_DATA_TYPE", "ATTRIBUTES").addField()
-            .at(13).simple(SQL_LONG, 0, "SQL_DATETIME_SUB", "ATTRIBUTES").addField()
-            .at(14).simple(SQL_LONG, 0, "CHAR_OCTET_LENGTH", "ATTRIBUTES").addField()
-            .at(15).simple(SQL_SHORT, 0, "ORDINAL_POSITION", "ATTRIBUTES").addField()
-            .at(16).simple(SQL_VARYING, 31, "IS_NULLABLE", "ATTRIBUTES").addField()
-            .at(17).simple(SQL_VARYING, OBJECT_NAME_LENGTH, "SCOPE_CATALOG", "ATTRIBUTES").addField()
-            .at(18).simple(SQL_VARYING, OBJECT_NAME_LENGTH, "SCOPE_SCHEMA", "ATTRIBUTES").addField()
-            .at(19).simple(SQL_VARYING, OBJECT_NAME_LENGTH, "SCOPE_TABLE", "ATTRIBUTES").addField()
-            .at(20).simple(SQL_SHORT, 0, "SOURCE_DATA_TYPE", "ATTRIBUTES").addField()
+            .at(0).simple(SQL_VARYING, OBJECT_NAME_LENGTH, "TYPE_CAT", ATTRIBUTES).addField()
+            .at(1).simple(SQL_VARYING, OBJECT_NAME_LENGTH, "TYPE_SCHEM", ATTRIBUTES).addField()
+            .at(2).simple(SQL_VARYING, 31, "TYPE_NAME", ATTRIBUTES).addField()
+            .at(3).simple(SQL_VARYING, 31, "ATTR_NAME", ATTRIBUTES).addField()
+            .at(4).simple(SQL_LONG, 0, "DATA_TYPE", ATTRIBUTES).addField()
+            .at(5).simple(SQL_VARYING, 31, "ATTR_TYPE_NAME", ATTRIBUTES).addField()
+            .at(6).simple(SQL_LONG, 0, "ATTR_SIZE", ATTRIBUTES).addField()
+            .at(7).simple(SQL_LONG, 0, "DECIMAL_DIGITS", ATTRIBUTES).addField()
+            .at(8).simple(SQL_LONG, 0, "NUM_PREC_RADIX", ATTRIBUTES).addField()
+            .at(9).simple(SQL_LONG, 0, "NULLABLE", ATTRIBUTES).addField()
+            .at(10).simple(SQL_VARYING, 80, "REMARKS", ATTRIBUTES).addField()
+            .at(11).simple(SQL_VARYING, 31, "ATTR_DEF", ATTRIBUTES).addField()
+            .at(12).simple(SQL_LONG, 0, "SQL_DATA_TYPE", ATTRIBUTES).addField()
+            .at(13).simple(SQL_LONG, 0, "SQL_DATETIME_SUB", ATTRIBUTES).addField()
+            .at(14).simple(SQL_LONG, 0, "CHAR_OCTET_LENGTH", ATTRIBUTES).addField()
+            .at(15).simple(SQL_SHORT, 0, "ORDINAL_POSITION", ATTRIBUTES).addField()
+            .at(16).simple(SQL_VARYING, 31, "IS_NULLABLE", ATTRIBUTES).addField()
+            .at(17).simple(SQL_VARYING, OBJECT_NAME_LENGTH, "SCOPE_CATALOG", ATTRIBUTES).addField()
+            .at(18).simple(SQL_VARYING, OBJECT_NAME_LENGTH, "SCOPE_SCHEMA", ATTRIBUTES).addField()
+            .at(19).simple(SQL_VARYING, OBJECT_NAME_LENGTH, "SCOPE_TABLE", ATTRIBUTES).addField()
+            .at(20).simple(SQL_SHORT, 0, "SOURCE_DATA_TYPE", ATTRIBUTES).addField()
             .toRowDescriptor();
 
     private GetAttributes() {
diff --git a/src/main/org/firebirdsql/jdbc/metadata/GetBestRowIdentifier.java b/src/main/org/firebirdsql/jdbc/metadata/GetBestRowIdentifier.java
index cfefa60cd..5d9e37c49 100644
--- a/src/main/org/firebirdsql/jdbc/metadata/GetBestRowIdentifier.java
+++ b/src/main/org/firebirdsql/jdbc/metadata/GetBestRowIdentifier.java
@@ -58,15 +58,17 @@
  */
 public final class GetBestRowIdentifier extends AbstractMetadataMethod {
 
+    private static final String ROWIDENTIFIER = "ROWIDENTIFIER";
+    
     private static final RowDescriptor ROW_DESCRIPTOR = DbMetadataMediator.newRowDescriptorBuilder(8)
-            .at(0).simple(SQL_SHORT, 0, "SCOPE", "ROWIDENTIFIER").addField()
-            .at(1).simple(SQL_VARYING, OBJECT_NAME_LENGTH, "COLUMN_NAME", "ROWIDENTIFIER").addField()
-            .at(2).simple(SQL_LONG, 0, "DATA_TYPE", "ROWIDENTIFIER").addField()
-            .at(3).simple(SQL_VARYING, 31, "TYPE_NAME", "ROWIDENTIFIER").addField()
-            .at(4).simple(SQL_LONG, 0, "COLUMN_SIZE", "ROWIDENTIFIER").addField()
-            .at(5).simple(SQL_LONG, 0, "BUFFER_LENGTH", "ROWIDENTIFIER").addField()
-            .at(6).simple(SQL_SHORT, 0, "DECIMAL_DIGITS", "ROWIDENTIFIER").addField()
-            .at(7).simple(SQL_SHORT, 0, "PSEUDO_COLUMN", "ROWIDENTIFIER").addField()
+            .at(0).simple(SQL_SHORT, 0, "SCOPE", ROWIDENTIFIER).addField()
+            .at(1).simple(SQL_VARYING, OBJECT_NAME_LENGTH, "COLUMN_NAME", ROWIDENTIFIER).addField()
+            .at(2).simple(SQL_LONG, 0, "DATA_TYPE", ROWIDENTIFIER).addField()
+            .at(3).simple(SQL_VARYING, 31, "TYPE_NAME", ROWIDENTIFIER).addField()
+            .at(4).simple(SQL_LONG, 0, "COLUMN_SIZE", ROWIDENTIFIER).addField()
+            .at(5).simple(SQL_LONG, 0, "BUFFER_LENGTH", ROWIDENTIFIER).addField()
+            .at(6).simple(SQL_SHORT, 0, "DECIMAL_DIGITS", ROWIDENTIFIER).addField()
+            .at(7).simple(SQL_SHORT, 0, "PSEUDO_COLUMN", ROWIDENTIFIER).addField()
             .toRowDescriptor();
 
     //@formatter:off
@@ -100,7 +102,7 @@ private GetBestRowIdentifier(DbMetadataMediator mediator) {
 
     public ResultSet getBestRowIdentifier(String catalog, String schema, String table, int scope, boolean nullable)
             throws SQLException {
-        if (table == null || "".equals(table)) {
+        if (table == null || table.isEmpty()) {
             return createEmpty();
         }
 
@@ -108,7 +110,7 @@ public ResultSet getBestRowIdentifier(String catalog, String schema, String tabl
         List<RowValue> rows = getPrimaryKeyIdentifier(table, valueBuilder);
 
         // if no primary key exists, add RDB$DB_KEY as pseudo-column
-        if (rows.size() == 0) {
+        if (rows.isEmpty()) {
             FBDatabaseMetaData dbmd = mediator.getMetaData();
             // NOTE: Currently is always ROWID_VALID_TRANSACTION
             RowIdLifetime rowIdLifetime = dbmd.getRowIdLifetime();
diff --git a/src/main/org/firebirdsql/jdbc/metadata/GetClientInfoProperties.java b/src/main/org/firebirdsql/jdbc/metadata/GetClientInfoProperties.java
index 186dae2c3..39065a92b 100644
--- a/src/main/org/firebirdsql/jdbc/metadata/GetClientInfoProperties.java
+++ b/src/main/org/firebirdsql/jdbc/metadata/GetClientInfoProperties.java
@@ -40,11 +40,13 @@
  */
 public final class GetClientInfoProperties {
 
+    private static final String CLIENTINFO = "CLIENTINFO";
+    
     private static final RowDescriptor ROW_DESCRIPTOR = DbMetadataMediator.newRowDescriptorBuilder(4)
-            .at(0).simple(SQL_VARYING, 80, "NAME", "CLIENTINFO").addField()
-            .at(1).simple(SQL_LONG, 0, "MAX_LEN", "CLIENTINFO").addField()
-            .at(2).simple(SQL_VARYING | 1, 31, "DEFAULT_VALUE", "CLIENTINFO").addField()
-            .at(3).simple(SQL_VARYING | 1, Integer.MAX_VALUE, "DESCRIPTION", "CLIENTINFO").addField()
+            .at(0).simple(SQL_VARYING, 80, "NAME", CLIENTINFO).addField()
+            .at(1).simple(SQL_LONG, 0, "MAX_LEN", CLIENTINFO).addField()
+            .at(2).simple(SQL_VARYING | 1, 31, "DEFAULT_VALUE", CLIENTINFO).addField()
+            .at(3).simple(SQL_VARYING | 1, Integer.MAX_VALUE, "DESCRIPTION", CLIENTINFO).addField()
             .toRowDescriptor();
 
     private final DbMetadataMediator mediator;
diff --git a/src/main/org/firebirdsql/jdbc/metadata/GetColumnPrivileges.java b/src/main/org/firebirdsql/jdbc/metadata/GetColumnPrivileges.java
index 9f44f7170..0220b4a65 100644
--- a/src/main/org/firebirdsql/jdbc/metadata/GetColumnPrivileges.java
+++ b/src/main/org/firebirdsql/jdbc/metadata/GetColumnPrivileges.java
@@ -44,16 +44,17 @@
  */
 public final class GetColumnPrivileges extends AbstractMetadataMethod {
 
+    private static final String COLUMNPRIV = "COLUMNPRIV";
     private static final RowDescriptor ROW_DESCRIPTOR = DbMetadataMediator.newRowDescriptorBuilder(9)
-            .at(0).simple(SQL_VARYING | 1, OBJECT_NAME_LENGTH, "TABLE_CAT", "COLUMNPRIV").addField()
-            .at(1).simple(SQL_VARYING | 1, OBJECT_NAME_LENGTH, "TABLE_SCHEM", "COLUMNPRIV").addField()
-            .at(2).simple(SQL_VARYING, OBJECT_NAME_LENGTH, "TABLE_NAME", "COLUMNPRIV").addField()
-            .at(3).simple(SQL_VARYING, OBJECT_NAME_LENGTH, "COLUMN_NAME", "COLUMNPRIV").addField()
-            .at(4).simple(SQL_VARYING, OBJECT_NAME_LENGTH, "GRANTOR", "COLUMNPRIV").addField()
-            .at(5).simple(SQL_VARYING, OBJECT_NAME_LENGTH, "GRANTEE", "COLUMNPRIV").addField()
-            .at(6).simple(SQL_VARYING, 31, "PRIVILEGE", "COLUMNPRIV").addField()
-            .at(7).simple(SQL_VARYING, 3, "IS_GRANTABLE", "COLUMNPRIV").addField()
-            .at(8).simple(SQL_VARYING, OBJECT_NAME_LENGTH, "JB_GRANTEE_TYPE", "COLUMNPRIV").addField()
+            .at(0).simple(SQL_VARYING | 1, OBJECT_NAME_LENGTH, "TABLE_CAT", COLUMNPRIV).addField()
+            .at(1).simple(SQL_VARYING | 1, OBJECT_NAME_LENGTH, "TABLE_SCHEM", COLUMNPRIV).addField()
+            .at(2).simple(SQL_VARYING, OBJECT_NAME_LENGTH, "TABLE_NAME", COLUMNPRIV).addField()
+            .at(3).simple(SQL_VARYING, OBJECT_NAME_LENGTH, "COLUMN_NAME", COLUMNPRIV).addField()
+            .at(4).simple(SQL_VARYING, OBJECT_NAME_LENGTH, "GRANTOR", COLUMNPRIV).addField()
+            .at(5).simple(SQL_VARYING, OBJECT_NAME_LENGTH, "GRANTEE", COLUMNPRIV).addField()
+            .at(6).simple(SQL_VARYING, 31, "PRIVILEGE", COLUMNPRIV).addField()
+            .at(7).simple(SQL_VARYING, 3, "IS_GRANTABLE", COLUMNPRIV).addField()
+            .at(8).simple(SQL_VARYING, OBJECT_NAME_LENGTH, "JB_GRANTEE_TYPE", COLUMNPRIV).addField()
             .toRowDescriptor();
 
     //@formatter:off
diff --git a/src/main/org/firebirdsql/jdbc/metadata/GetColumns.java b/src/main/org/firebirdsql/jdbc/metadata/GetColumns.java
index 1e897212e..02405b5bc 100644
--- a/src/main/org/firebirdsql/jdbc/metadata/GetColumns.java
+++ b/src/main/org/firebirdsql/jdbc/metadata/GetColumns.java
@@ -52,35 +52,37 @@
  */
 public abstract class GetColumns extends AbstractMetadataMethod {
 
+    private static final String COLUMNINFO = "COLUMNINFO";
+    
     private static final RowDescriptor ROW_DESCRIPTOR = DbMetadataMediator.newRowDescriptorBuilder(26)
-            .at(0).simple(SQL_VARYING | 1, OBJECT_NAME_LENGTH, "TABLE_CAT", "COLUMNINFO").addField()
-            .at(1).simple(SQL_VARYING | 1, OBJECT_NAME_LENGTH, "TABLE_SCHEM", "COLUMNINFO").addField()
-            .at(2).simple(SQL_VARYING, OBJECT_NAME_LENGTH, "TABLE_NAME", "COLUMNINFO").addField()
-            .at(3).simple(SQL_VARYING, OBJECT_NAME_LENGTH, "COLUMN_NAME", "COLUMNINFO").addField()
-            .at(4).simple(SQL_LONG, 0, "DATA_TYPE", "COLUMNINFO").addField()
-            .at(5).simple(SQL_VARYING | 1, 31, "TYPE_NAME", "COLUMNINFO").addField()
-            .at(6).simple(SQL_LONG, 0, "COLUMN_SIZE", "COLUMNINFO").addField()
-            .at(7).simple(SQL_LONG, 0, "BUFFER_LENGTH", "COLUMNINFO").addField()
-            .at(8).simple(SQL_LONG, 0, "DECIMAL_DIGITS", "COLUMNINFO").addField()
-            .at(9).simple(SQL_LONG, 0, "NUM_PREC_RADIX", "COLUMNINFO").addField()
-            .at(10).simple(SQL_LONG, 0, "NULLABLE", "COLUMNINFO").addField()
+            .at(0).simple(SQL_VARYING | 1, OBJECT_NAME_LENGTH, "TABLE_CAT", COLUMNINFO).addField()
+            .at(1).simple(SQL_VARYING | 1, OBJECT_NAME_LENGTH, "TABLE_SCHEM", COLUMNINFO).addField()
+            .at(2).simple(SQL_VARYING, OBJECT_NAME_LENGTH, "TABLE_NAME", COLUMNINFO).addField()
+            .at(3).simple(SQL_VARYING, OBJECT_NAME_LENGTH, "COLUMN_NAME", COLUMNINFO).addField()
+            .at(4).simple(SQL_LONG, 0, "DATA_TYPE", COLUMNINFO).addField()
+            .at(5).simple(SQL_VARYING | 1, 31, "TYPE_NAME", COLUMNINFO).addField()
+            .at(6).simple(SQL_LONG, 0, "COLUMN_SIZE", COLUMNINFO).addField()
+            .at(7).simple(SQL_LONG, 0, "BUFFER_LENGTH", COLUMNINFO).addField()
+            .at(8).simple(SQL_LONG, 0, "DECIMAL_DIGITS", COLUMNINFO).addField()
+            .at(9).simple(SQL_LONG, 0, "NUM_PREC_RADIX", COLUMNINFO).addField()
+            .at(10).simple(SQL_LONG, 0, "NULLABLE", COLUMNINFO).addField()
             // Field in Firebird is actually a blob, using Integer.MAX_VALUE for length
-            .at(11).simple(SQL_VARYING | 1, Integer.MAX_VALUE, "REMARKS", "COLUMNINFO").addField()
+            .at(11).simple(SQL_VARYING | 1, Integer.MAX_VALUE, "REMARKS", COLUMNINFO).addField()
             // Field in Firebird is actually a blob, using Integer.MAX_VALUE for length
-            .at(12).simple(SQL_VARYING | 1, Integer.MAX_VALUE, "COLUMN_DEF", "COLUMNINFO").addField()
-            .at(13).simple(SQL_LONG, 0, "SQL_DATA_TYPE", "COLUMNINFO").addField()
-            .at(14).simple(SQL_LONG, 0, "SQL_DATETIME_SUB", "COLUMNINFO").addField()
-            .at(15).simple(SQL_LONG, 0, "CHAR_OCTET_LENGTH", "COLUMNINFO").addField()
-            .at(16).simple(SQL_LONG, 0, "ORDINAL_POSITION", "COLUMNINFO").addField()
-            .at(17).simple(SQL_VARYING, 3, "IS_NULLABLE", "COLUMNINFO").addField()
-            .at(18).simple(SQL_VARYING, OBJECT_NAME_LENGTH, "SCOPE_CATALOG", "COLUMNINFO").addField()
-            .at(19).simple(SQL_VARYING, OBJECT_NAME_LENGTH, "SCOPE_SCHEMA", "COLUMNINFO").addField()
-            .at(20).simple(SQL_VARYING, OBJECT_NAME_LENGTH, "SCOPE_TABLE", "COLUMNINFO").addField()
-            .at(21).simple(SQL_SHORT, 0, "SOURCE_DATA_TYPE", "COLUMNINFO").addField()
-            .at(22).simple(SQL_VARYING, 3, "IS_AUTOINCREMENT", "COLUMNINFO").addField()
-            .at(23).simple(SQL_VARYING, 3, "IS_GENERATEDCOLUMN", "COLUMNINFO").addField()
-            .at(24).simple(SQL_VARYING, 3, "JB_IS_IDENTITY", "COLUMNINFO").addField()
-            .at(25).simple(SQL_VARYING, 10, "JB_IDENTITY_TYPE", "COLUMNINFO").addField()
+            .at(12).simple(SQL_VARYING | 1, Integer.MAX_VALUE, "COLUMN_DEF", COLUMNINFO).addField()
+            .at(13).simple(SQL_LONG, 0, "SQL_DATA_TYPE", COLUMNINFO).addField()
+            .at(14).simple(SQL_LONG, 0, "SQL_DATETIME_SUB", COLUMNINFO).addField()
+            .at(15).simple(SQL_LONG, 0, "CHAR_OCTET_LENGTH", COLUMNINFO).addField()
+            .at(16).simple(SQL_LONG, 0, "ORDINAL_POSITION", COLUMNINFO).addField()
+            .at(17).simple(SQL_VARYING, 3, "IS_NULLABLE", COLUMNINFO).addField()
+            .at(18).simple(SQL_VARYING, OBJECT_NAME_LENGTH, "SCOPE_CATALOG", COLUMNINFO).addField()
+            .at(19).simple(SQL_VARYING, OBJECT_NAME_LENGTH, "SCOPE_SCHEMA", COLUMNINFO).addField()
+            .at(20).simple(SQL_VARYING, OBJECT_NAME_LENGTH, "SCOPE_TABLE", COLUMNINFO).addField()
+            .at(21).simple(SQL_SHORT, 0, "SOURCE_DATA_TYPE", COLUMNINFO).addField()
+            .at(22).simple(SQL_VARYING, 3, "IS_AUTOINCREMENT", COLUMNINFO).addField()
+            .at(23).simple(SQL_VARYING, 3, "IS_GENERATEDCOLUMN", COLUMNINFO).addField()
+            .at(24).simple(SQL_VARYING, 3, "JB_IS_IDENTITY", COLUMNINFO).addField()
+            .at(25).simple(SQL_VARYING, 10, "JB_IDENTITY_TYPE", COLUMNINFO).addField()
             .toRowDescriptor();
 
     private GetColumns(DbMetadataMediator mediator) {
diff --git a/src/main/org/firebirdsql/jdbc/metadata/GetCrossReference.java b/src/main/org/firebirdsql/jdbc/metadata/GetCrossReference.java
index f5911c168..fe08571f1 100644
--- a/src/main/org/firebirdsql/jdbc/metadata/GetCrossReference.java
+++ b/src/main/org/firebirdsql/jdbc/metadata/GetCrossReference.java
@@ -32,39 +32,36 @@
  */
 public final class GetCrossReference extends AbstractKeysMethod {
 
-    //@formatter:off
-    private static final String GET_CROSS_KEYS_START =
-            "select\n"
-            + "  PK.RDB$RELATION_NAME as PKTABLE_NAME,\n"
-            + "  ISP.RDB$FIELD_NAME as PKCOLUMN_NAME,\n"
-            + "  FK.RDB$RELATION_NAME as FKTABLE_NAME,\n"
-            + "  ISF.RDB$FIELD_NAME as FKCOLUMN_NAME,\n"
-            + "  ISP.RDB$FIELD_POSITION + 1 as KEY_SEQ,\n"
-            + "  RC.RDB$UPDATE_RULE as UPDATE_RULE,\n"
-            + "  RC.RDB$DELETE_RULE as DELETE_RULE,\n"
-            + "  PK.RDB$CONSTRAINT_NAME as PK_NAME,\n"
-            + "  FK.RDB$CONSTRAINT_NAME as FK_NAME\n"
-            + "from RDB$RELATION_CONSTRAINTS PK\n"
-            + "inner join RDB$REF_CONSTRAINTS RC\n"
-            + "  on PK.RDB$CONSTRAINT_NAME = RC.RDB$CONST_NAME_UQ\n"
-            + "inner join RDB$RELATION_CONSTRAINTS FK\n"
-            + "  on FK.RDB$CONSTRAINT_NAME = RC.RDB$CONSTRAINT_NAME\n"
-            + "inner join RDB$INDEX_SEGMENTS ISP\n"
-            + "  on ISP.RDB$INDEX_NAME = PK.RDB$INDEX_NAME\n"
-            + "inner join RDB$INDEX_SEGMENTS ISF\n"
-            + "  on ISF.RDB$INDEX_NAME = FK.RDB$INDEX_NAME and ISP.RDB$FIELD_POSITION = ISF.RDB$FIELD_POSITION\n"
-            + "where ";
+    private static final String GET_CROSS_KEYS_START = """
+            select
+              PK.RDB$RELATION_NAME as PKTABLE_NAME,
+              ISP.RDB$FIELD_NAME as PKCOLUMN_NAME,
+              FK.RDB$RELATION_NAME as FKTABLE_NAME,
+              ISF.RDB$FIELD_NAME as FKCOLUMN_NAME,
+              ISP.RDB$FIELD_POSITION + 1 as KEY_SEQ,
+              RC.RDB$UPDATE_RULE as UPDATE_RULE,
+              RC.RDB$DELETE_RULE as DELETE_RULE,
+              PK.RDB$CONSTRAINT_NAME as PK_NAME,
+              FK.RDB$CONSTRAINT_NAME as FK_NAME
+            from RDB$RELATION_CONSTRAINTS PK
+            inner join RDB$REF_CONSTRAINTS RC
+              on PK.RDB$CONSTRAINT_NAME = RC.RDB$CONST_NAME_UQ
+            inner join RDB$RELATION_CONSTRAINTS FK
+              on FK.RDB$CONSTRAINT_NAME = RC.RDB$CONSTRAINT_NAME
+            inner join RDB$INDEX_SEGMENTS ISP
+              on ISP.RDB$INDEX_NAME = PK.RDB$INDEX_NAME
+            inner join RDB$INDEX_SEGMENTS ISF
+              on ISF.RDB$INDEX_NAME = FK.RDB$INDEX_NAME and ISP.RDB$FIELD_POSITION = ISF.RDB$FIELD_POSITION
+            where\s""";
 
-    private static final String GET_CROSS_KEYS_END =
-            "\norder by FK.RDB$RELATION_NAME, ISP.RDB$FIELD_POSITION";
-    //@formatter:on
+    private static final String GET_CROSS_KEYS_END = "\norder by FK.RDB$RELATION_NAME, ISP.RDB$FIELD_POSITION";
 
     private GetCrossReference(DbMetadataMediator mediator) {
         super(mediator);
     }
 
     public ResultSet getCrossReference(String primaryTable, String foreignTable) throws SQLException {
-        if (primaryTable == null || "".equals(primaryTable) || foreignTable == null || "".equals(foreignTable)) {
+        if (primaryTable == null || primaryTable.isEmpty() || foreignTable == null || foreignTable.isEmpty()) {
             return createEmpty();
         }
 
diff --git a/src/main/org/firebirdsql/jdbc/metadata/GetFunctionColumns.java b/src/main/org/firebirdsql/jdbc/metadata/GetFunctionColumns.java
index 9affbaf1f..cd2b43b60 100644
--- a/src/main/org/firebirdsql/jdbc/metadata/GetFunctionColumns.java
+++ b/src/main/org/firebirdsql/jdbc/metadata/GetFunctionColumns.java
@@ -56,26 +56,28 @@
 @InternalApi
 public abstract class GetFunctionColumns extends AbstractMetadataMethod {
 
+    private static final String FUNCTION_COLUMNS = "FUNCTION_COLUMNS";
+    
     private static final RowDescriptor ROW_DESCRIPTOR = DbMetadataMediator.newRowDescriptorBuilder(17)
-            .at(0).simple(SQL_VARYING | 1, OBJECT_NAME_LENGTH, "FUNCTION_CAT", "FUNCTION_COLUMNS").addField()
-            .at(1).simple(SQL_VARYING | 1, OBJECT_NAME_LENGTH, "FUNCTION_SCHEM", "FUNCTION_COLUMNS").addField()
-            .at(2).simple(SQL_VARYING, OBJECT_NAME_LENGTH, "FUNCTION_NAME", "FUNCTION_COLUMNS").addField()
-            .at(3).simple(SQL_VARYING, OBJECT_NAME_LENGTH, "COLUMN_NAME", "FUNCTION_COLUMNS").addField()
-            .at(4).simple(SQL_SHORT, 0, "COLUMN_TYPE", "FUNCTION_COLUMNS").addField()
-            .at(5).simple(SQL_LONG, 0, "DATA_TYPE", "FUNCTION_COLUMNS").addField()
-            .at(6).simple(SQL_VARYING, OBJECT_NAME_LENGTH, "TYPE_NAME", "FUNCTION_COLUMNS").addField()
-            .at(7).simple(SQL_LONG | 1, 0, "PRECISION", "FUNCTION_COLUMNS").addField()
-            .at(8).simple(SQL_LONG, 0, "LENGTH", "FUNCTION_COLUMNS").addField()
-            .at(9).simple(SQL_SHORT | 1, 0, "SCALE", "FUNCTION_COLUMNS").addField()
-            .at(10).simple(SQL_SHORT, 0, "RADIX", "FUNCTION_COLUMNS").addField()
-            .at(11).simple(SQL_SHORT, 0, "NULLABLE", "FUNCTION_COLUMNS").addField()
+            .at(0).simple(SQL_VARYING | 1, OBJECT_NAME_LENGTH, "FUNCTION_CAT", FUNCTION_COLUMNS).addField()
+            .at(1).simple(SQL_VARYING | 1, OBJECT_NAME_LENGTH, "FUNCTION_SCHEM", FUNCTION_COLUMNS).addField()
+            .at(2).simple(SQL_VARYING, OBJECT_NAME_LENGTH, "FUNCTION_NAME", FUNCTION_COLUMNS).addField()
+            .at(3).simple(SQL_VARYING, OBJECT_NAME_LENGTH, "COLUMN_NAME", FUNCTION_COLUMNS).addField()
+            .at(4).simple(SQL_SHORT, 0, "COLUMN_TYPE", FUNCTION_COLUMNS).addField()
+            .at(5).simple(SQL_LONG, 0, "DATA_TYPE", FUNCTION_COLUMNS).addField()
+            .at(6).simple(SQL_VARYING, OBJECT_NAME_LENGTH, "TYPE_NAME", FUNCTION_COLUMNS).addField()
+            .at(7).simple(SQL_LONG | 1, 0, "PRECISION", FUNCTION_COLUMNS).addField()
+            .at(8).simple(SQL_LONG, 0, "LENGTH", FUNCTION_COLUMNS).addField()
+            .at(9).simple(SQL_SHORT | 1, 0, "SCALE", FUNCTION_COLUMNS).addField()
+            .at(10).simple(SQL_SHORT, 0, "RADIX", FUNCTION_COLUMNS).addField()
+            .at(11).simple(SQL_SHORT, 0, "NULLABLE", FUNCTION_COLUMNS).addField()
             // Field in Firebird is actually a blob, using Integer.MAX_VALUE for length
-            .at(12).simple(SQL_VARYING | 1, Integer.MAX_VALUE, "REMARKS", "FUNCTION_COLUMNS").addField()
-            .at(13).simple(SQL_LONG | 1, 0, "CHAR_OCTET_LENGTH", "FUNCTION_COLUMNS").addField()
-            .at(14).simple(SQL_LONG, 0, "ORDINAL_POSITION", "FUNCTION_COLUMNS").addField()
-            .at(15).simple(SQL_VARYING, 3, "IS_NULLABLE", "FUNCTION_COLUMNS").addField()
+            .at(12).simple(SQL_VARYING | 1, Integer.MAX_VALUE, "REMARKS", FUNCTION_COLUMNS).addField()
+            .at(13).simple(SQL_LONG | 1, 0, "CHAR_OCTET_LENGTH", FUNCTION_COLUMNS).addField()
+            .at(14).simple(SQL_LONG, 0, "ORDINAL_POSITION", FUNCTION_COLUMNS).addField()
+            .at(15).simple(SQL_VARYING, 3, "IS_NULLABLE", FUNCTION_COLUMNS).addField()
             // space for quoted package name, ".", quoted function name (assuming no double quotes in name)
-            .at(16).simple(SQL_VARYING, 2 * OBJECT_NAME_LENGTH + 5, "SPECIFIC_NAME", "FUNCTION_COLUMNS").addField()
+            .at(16).simple(SQL_VARYING, 2 * OBJECT_NAME_LENGTH + 5, "SPECIFIC_NAME", FUNCTION_COLUMNS).addField()
             .toRowDescriptor();
 
     private GetFunctionColumns(DbMetadataMediator mediator) {
diff --git a/src/main/org/firebirdsql/jdbc/metadata/GetFunctions.java b/src/main/org/firebirdsql/jdbc/metadata/GetFunctions.java
index 096660b99..a4fed8d00 100644
--- a/src/main/org/firebirdsql/jdbc/metadata/GetFunctions.java
+++ b/src/main/org/firebirdsql/jdbc/metadata/GetFunctions.java
@@ -44,21 +44,23 @@
 @InternalApi
 public abstract class GetFunctions extends AbstractMetadataMethod {
 
+    private static final String FUNCTIONS = "FUNCTIONS";
+    
     private static final RowDescriptor ROW_DESCRIPTOR = DbMetadataMediator.newRowDescriptorBuilder(11)
-            .at(0).simple(SQL_VARYING | 1, OBJECT_NAME_LENGTH, "FUNCTION_CAT", "FUNCTIONS").addField()
-            .at(1).simple(SQL_VARYING | 1, OBJECT_NAME_LENGTH, "FUNCTION_SCHEM", "FUNCTIONS").addField()
-            .at(2).simple(SQL_VARYING, OBJECT_NAME_LENGTH, "FUNCTION_NAME", "FUNCTIONS").addField()
+            .at(0).simple(SQL_VARYING | 1, OBJECT_NAME_LENGTH, "FUNCTION_CAT", FUNCTIONS).addField()
+            .at(1).simple(SQL_VARYING | 1, OBJECT_NAME_LENGTH, "FUNCTION_SCHEM", FUNCTIONS).addField()
+            .at(2).simple(SQL_VARYING, OBJECT_NAME_LENGTH, "FUNCTION_NAME", FUNCTIONS).addField()
             // Field in Firebird is actually a blob, using Integer.MAX_VALUE for length
-            .at(3).simple(SQL_VARYING | 1, Integer.MAX_VALUE, "REMARKS", "FUNCTIONS").addField()
-            .at(4).simple(SQL_SHORT, 0, "FUNCTION_TYPE", "FUNCTIONS").addField()
+            .at(3).simple(SQL_VARYING | 1, Integer.MAX_VALUE, "REMARKS", FUNCTIONS).addField()
+            .at(4).simple(SQL_SHORT, 0, "FUNCTION_TYPE", FUNCTIONS).addField()
             // space for quoted package name, ".", quoted function name (assuming no double quotes in name)
-            .at(5).simple(SQL_VARYING, 2 * OBJECT_NAME_LENGTH + 5, "SPECIFIC_NAME", "FUNCTIONS").addField()
+            .at(5).simple(SQL_VARYING, 2 * OBJECT_NAME_LENGTH + 5, "SPECIFIC_NAME", FUNCTIONS).addField()
             // non-standard extensions
-            .at(6).simple(SQL_VARYING | 1, Integer.MAX_VALUE, "JB_FUNCTION_SOURCE", "FUNCTIONS").addField()
-            .at(7).simple(SQL_VARYING, 4, "JB_FUNCTION_KIND", "FUNCTIONS").addField()
-            .at(8).simple(SQL_VARYING | 1, 255, "JB_MODULE_NAME", "FUNCTIONS").addField()
-            .at(9).simple(SQL_VARYING | 1, 255, "JB_ENTRYPOINT", "FUNCTIONS").addField()
-            .at(10).simple(SQL_VARYING | 1, 255, "JB_ENGINE_NAME", "FUNCTIONS").addField()
+            .at(6).simple(SQL_VARYING | 1, Integer.MAX_VALUE, "JB_FUNCTION_SOURCE", FUNCTIONS).addField()
+            .at(7).simple(SQL_VARYING, 4, "JB_FUNCTION_KIND", FUNCTIONS).addField()
+            .at(8).simple(SQL_VARYING | 1, 255, "JB_MODULE_NAME", FUNCTIONS).addField()
+            .at(9).simple(SQL_VARYING | 1, 255, "JB_ENTRYPOINT", FUNCTIONS).addField()
+            .at(10).simple(SQL_VARYING | 1, 255, "JB_ENGINE_NAME", FUNCTIONS).addField()
             .toRowDescriptor();
 
     private GetFunctions(DbMetadataMediator mediator) {
diff --git a/src/main/org/firebirdsql/jdbc/metadata/GetIndexInfo.java b/src/main/org/firebirdsql/jdbc/metadata/GetIndexInfo.java
index 6a9e12677..f87315a52 100644
--- a/src/main/org/firebirdsql/jdbc/metadata/GetIndexInfo.java
+++ b/src/main/org/firebirdsql/jdbc/metadata/GetIndexInfo.java
@@ -38,21 +38,23 @@
  */
 public final class GetIndexInfo extends AbstractMetadataMethod {
 
+    private static final String INDEXINFO = "INDEXINFO";
+    
     private static final RowDescriptor ROW_DESCRIPTOR = DbMetadataMediator.newRowDescriptorBuilder(13)
-            .at(0).simple(SQL_VARYING | 1, OBJECT_NAME_LENGTH, "TABLE_CAT", "INDEXINFO").addField()
-            .at(1).simple(SQL_VARYING | 1, OBJECT_NAME_LENGTH, "TABLE_SCHEM", "INDEXINFO").addField()
-            .at(2).simple(SQL_VARYING, OBJECT_NAME_LENGTH, "TABLE_NAME", "INDEXINFO").addField()
-            .at(3).simple(SQL_TEXT, 1, "NON_UNIQUE", "INDEXINFO").addField()
-            .at(4).simple(SQL_VARYING, OBJECT_NAME_LENGTH, "INDEX_QUALIFIER", "INDEXINFO").addField()
-            .at(5).simple(SQL_VARYING, OBJECT_NAME_LENGTH, "INDEX_NAME", "INDEXINFO").addField()
-            .at(6).simple(SQL_SHORT, 0, "TYPE", "INDEXINFO").addField()
-            .at(7).simple(SQL_SHORT, 0, "ORDINAL_POSITION", "INDEXINFO").addField()
+            .at(0).simple(SQL_VARYING | 1, OBJECT_NAME_LENGTH, "TABLE_CAT", INDEXINFO).addField()
+            .at(1).simple(SQL_VARYING | 1, OBJECT_NAME_LENGTH, "TABLE_SCHEM", INDEXINFO).addField()
+            .at(2).simple(SQL_VARYING, OBJECT_NAME_LENGTH, "TABLE_NAME", INDEXINFO).addField()
+            .at(3).simple(SQL_TEXT, 1, "NON_UNIQUE", INDEXINFO).addField()
+            .at(4).simple(SQL_VARYING, OBJECT_NAME_LENGTH, "INDEX_QUALIFIER", INDEXINFO).addField()
+            .at(5).simple(SQL_VARYING, OBJECT_NAME_LENGTH, "INDEX_NAME", INDEXINFO).addField()
+            .at(6).simple(SQL_SHORT, 0, "TYPE", INDEXINFO).addField()
+            .at(7).simple(SQL_SHORT, 0, "ORDINAL_POSITION", INDEXINFO).addField()
             // Field with EXPRESSION_SOURCE (used for expression indexes) in Firebird is actually a blob, using Integer.MAX_VALUE for length
-            .at(8).simple(SQL_VARYING, Integer.MAX_VALUE, "COLUMN_NAME", "INDEXINFO").addField()
-            .at(9).simple(SQL_TEXT | 1, 1, "ASC_OR_DESC", "INDEXINFO").addField()
-            .at(10).simple(SQL_LONG, 0, "CARDINALITY", "INDEXINFO").addField()
-            .at(11).simple(SQL_LONG, 0, "PAGES", "INDEXINFO").addField()
-            .at(12).simple(SQL_VARYING | 1, 31, "FILTER_CONDITION", "INDEXINFO").addField()
+            .at(8).simple(SQL_VARYING, Integer.MAX_VALUE, "COLUMN_NAME", INDEXINFO).addField()
+            .at(9).simple(SQL_TEXT | 1, 1, "ASC_OR_DESC", INDEXINFO).addField()
+            .at(10).simple(SQL_LONG, 0, "CARDINALITY", INDEXINFO).addField()
+            .at(11).simple(SQL_LONG, 0, "PAGES", INDEXINFO).addField()
+            .at(12).simple(SQL_VARYING | 1, 31, "FILTER_CONDITION", INDEXINFO).addField()
             .toRowDescriptor();
 
     private static final String GET_INDEX_INFO_START = """
diff --git a/src/main/org/firebirdsql/jdbc/metadata/GetPrimaryKeys.java b/src/main/org/firebirdsql/jdbc/metadata/GetPrimaryKeys.java
index 80417e228..bf2f140dc 100644
--- a/src/main/org/firebirdsql/jdbc/metadata/GetPrimaryKeys.java
+++ b/src/main/org/firebirdsql/jdbc/metadata/GetPrimaryKeys.java
@@ -38,13 +38,15 @@
  */
 public final class GetPrimaryKeys extends AbstractMetadataMethod {
 
+    private static final String COLUMNINFO = "COLUMNINFO";
+    
     private static final RowDescriptor ROW_DESCRIPTOR = DbMetadataMediator.newRowDescriptorBuilder(6)
-            .at(0).simple(SQL_VARYING | 1, OBJECT_NAME_LENGTH, "TABLE_CAT", "COLUMNINFO").addField()
-            .at(1).simple(SQL_VARYING | 1, OBJECT_NAME_LENGTH, "TABLE_SCHEM", "COLUMNINFO").addField()
-            .at(2).simple(SQL_VARYING, OBJECT_NAME_LENGTH, "TABLE_NAME", "COLUMNINFO").addField()
-            .at(3).simple(SQL_VARYING, OBJECT_NAME_LENGTH, "COLUMN_NAME", "COLUMNINFO").addField()
-            .at(4).simple(SQL_SHORT, 0, "KEY_SEQ", "COLUMNINFO").addField()
-            .at(5).simple(SQL_VARYING, OBJECT_NAME_LENGTH, "PK_NAME", "COLUMNINFO").addField()
+            .at(0).simple(SQL_VARYING | 1, OBJECT_NAME_LENGTH, "TABLE_CAT", COLUMNINFO).addField()
+            .at(1).simple(SQL_VARYING | 1, OBJECT_NAME_LENGTH, "TABLE_SCHEM", COLUMNINFO).addField()
+            .at(2).simple(SQL_VARYING, OBJECT_NAME_LENGTH, "TABLE_NAME", COLUMNINFO).addField()
+            .at(3).simple(SQL_VARYING, OBJECT_NAME_LENGTH, "COLUMN_NAME", COLUMNINFO).addField()
+            .at(4).simple(SQL_SHORT, 0, "KEY_SEQ", COLUMNINFO).addField()
+            .at(5).simple(SQL_VARYING, OBJECT_NAME_LENGTH, "PK_NAME", COLUMNINFO).addField()
             .toRowDescriptor();
 
     private static final String GET_PRIMARY_KEYS_START = """
diff --git a/src/main/org/firebirdsql/jdbc/metadata/GetProcedureColumns.java b/src/main/org/firebirdsql/jdbc/metadata/GetProcedureColumns.java
index 3cfde3fe5..0633baa06 100644
--- a/src/main/org/firebirdsql/jdbc/metadata/GetProcedureColumns.java
+++ b/src/main/org/firebirdsql/jdbc/metadata/GetProcedureColumns.java
@@ -55,28 +55,30 @@
  */
 public abstract class GetProcedureColumns extends AbstractMetadataMethod {
 
+    private static final String COLUMNINFO = "COLUMNINFO";
+    
     private static final RowDescriptor ROW_DESCRIPTOR = DbMetadataMediator.newRowDescriptorBuilder(20)
-            .at(0).simple(SQL_VARYING | 1, OBJECT_NAME_LENGTH, "PROCEDURE_CAT", "COLUMNINFO").addField()
-            .at(1).simple(SQL_VARYING | 1, OBJECT_NAME_LENGTH, "PROCEDURE_SCHEM", "COLUMNINFO").addField()
-            .at(2).simple(SQL_VARYING, OBJECT_NAME_LENGTH, "PROCEDURE_NAME", "COLUMNINFO").addField()
-            .at(3).simple(SQL_VARYING, OBJECT_NAME_LENGTH, "COLUMN_NAME", "COLUMNINFO").addField()
-            .at(4).simple(SQL_SHORT, 0, "COLUMN_TYPE", "COLUMNINFO").addField()
-            .at(5).simple(SQL_LONG, 0, "DATA_TYPE", "COLUMNINFO").addField()
-            .at(6).simple(SQL_VARYING, 31, "TYPE_NAME", "COLUMNINFO").addField()
-            .at(7).simple(SQL_LONG, 0, "PRECISION", "COLUMNINFO").addField()
-            .at(8).simple(SQL_LONG, 0, "LENGTH", "COLUMNINFO").addField()
-            .at(9).simple(SQL_SHORT, 0, "SCALE", "COLUMNINFO").addField()
-            .at(10).simple(SQL_SHORT, 0, "RADIX", "COLUMNINFO").addField()
-            .at(11).simple(SQL_SHORT, 0, "NULLABLE", "COLUMNINFO").addField()
+            .at(0).simple(SQL_VARYING | 1, OBJECT_NAME_LENGTH, "PROCEDURE_CAT", COLUMNINFO).addField()
+            .at(1).simple(SQL_VARYING | 1, OBJECT_NAME_LENGTH, "PROCEDURE_SCHEM", COLUMNINFO).addField()
+            .at(2).simple(SQL_VARYING, OBJECT_NAME_LENGTH, "PROCEDURE_NAME", COLUMNINFO).addField()
+            .at(3).simple(SQL_VARYING, OBJECT_NAME_LENGTH, "COLUMN_NAME", COLUMNINFO).addField()
+            .at(4).simple(SQL_SHORT, 0, "COLUMN_TYPE", COLUMNINFO).addField()
+            .at(5).simple(SQL_LONG, 0, "DATA_TYPE", COLUMNINFO).addField()
+            .at(6).simple(SQL_VARYING, 31, "TYPE_NAME", COLUMNINFO).addField()
+            .at(7).simple(SQL_LONG, 0, "PRECISION", COLUMNINFO).addField()
+            .at(8).simple(SQL_LONG, 0, "LENGTH", COLUMNINFO).addField()
+            .at(9).simple(SQL_SHORT, 0, "SCALE", COLUMNINFO).addField()
+            .at(10).simple(SQL_SHORT, 0, "RADIX", COLUMNINFO).addField()
+            .at(11).simple(SQL_SHORT, 0, "NULLABLE", COLUMNINFO).addField()
             // Field in Firebird is actually a blob, using Integer.MAX_VALUE for length
-            .at(12).simple(SQL_VARYING, Integer.MAX_VALUE, "REMARKS", "COLUMNINFO").addField()
-            .at(13).simple(SQL_VARYING, 31, "COLUMN_DEF", "COLUMNINFO").addField()
-            .at(14).simple(SQL_LONG, 0, "SQL_DATA_TYPE", "COLUMNINFO").addField()
-            .at(15).simple(SQL_LONG, 0, "SQL_DATETIME_SUB", "COLUMNINFO").addField()
-            .at(16).simple(SQL_LONG, 0, "CHAR_OCTET_LENGTH", "COLUMNINFO").addField()
-            .at(17).simple(SQL_LONG, 0, "ORDINAL_POSITION", "COLUMNINFO").addField()
-            .at(18).simple(SQL_VARYING, 3, "IS_NULLABLE", "COLUMNINFO").addField()
-            .at(19).simple(SQL_VARYING, OBJECT_NAME_LENGTH, "SPECIFIC_NAME", "COLUMNINFO").addField()
+            .at(12).simple(SQL_VARYING, Integer.MAX_VALUE, "REMARKS", COLUMNINFO).addField()
+            .at(13).simple(SQL_VARYING, 31, "COLUMN_DEF", COLUMNINFO).addField()
+            .at(14).simple(SQL_LONG, 0, "SQL_DATA_TYPE", COLUMNINFO).addField()
+            .at(15).simple(SQL_LONG, 0, "SQL_DATETIME_SUB", COLUMNINFO).addField()
+            .at(16).simple(SQL_LONG, 0, "CHAR_OCTET_LENGTH", COLUMNINFO).addField()
+            .at(17).simple(SQL_LONG, 0, "ORDINAL_POSITION", COLUMNINFO).addField()
+            .at(18).simple(SQL_VARYING, 3, "IS_NULLABLE", COLUMNINFO).addField()
+            .at(19).simple(SQL_VARYING, OBJECT_NAME_LENGTH, "SPECIFIC_NAME", COLUMNINFO).addField()
             .toRowDescriptor();
 
     private GetProcedureColumns(DbMetadataMediator mediator) {
diff --git a/src/main/org/firebirdsql/jdbc/metadata/GetProcedures.java b/src/main/org/firebirdsql/jdbc/metadata/GetProcedures.java
index 0d984f6a9..75ea6a54d 100644
--- a/src/main/org/firebirdsql/jdbc/metadata/GetProcedures.java
+++ b/src/main/org/firebirdsql/jdbc/metadata/GetProcedures.java
@@ -46,18 +46,20 @@
 @InternalApi
 public abstract class GetProcedures extends AbstractMetadataMethod {
 
+    private static final String PROCEDURES = "PROCEDURES";
+    
     private static final RowDescriptor ROW_DESCRIPTOR = DbMetadataMediator.newRowDescriptorBuilder(9)
-            .at(0).simple(SQL_VARYING | 1, OBJECT_NAME_LENGTH, "PROCEDURE_CAT", "PROCEDURES").addField()
+            .at(0).simple(SQL_VARYING | 1, OBJECT_NAME_LENGTH, "PROCEDURE_CAT", PROCEDURES).addField()
             .at(1).simple(SQL_VARYING | 1, OBJECT_NAME_LENGTH, "PROCEDURE_SCHEM", "ROCEDURES").addField()
-            .at(2).simple(SQL_VARYING, OBJECT_NAME_LENGTH, "PROCEDURE_NAME", "PROCEDURES").addField()
-            .at(3).simple(SQL_VARYING, 31, "FUTURE1", "PROCEDURES").addField()
-            .at(4).simple(SQL_VARYING, 31, "FUTURE2", "PROCEDURES").addField()
-            .at(5).simple(SQL_VARYING, 31, "FUTURE3", "PROCEDURES").addField()
+            .at(2).simple(SQL_VARYING, OBJECT_NAME_LENGTH, "PROCEDURE_NAME", PROCEDURES).addField()
+            .at(3).simple(SQL_VARYING, 31, "FUTURE1", PROCEDURES).addField()
+            .at(4).simple(SQL_VARYING, 31, "FUTURE2", PROCEDURES).addField()
+            .at(5).simple(SQL_VARYING, 31, "FUTURE3", PROCEDURES).addField()
             // Field in Firebird is actually a blob, using Integer.MAX_VALUE for length
-            .at(6).simple(SQL_VARYING, Integer.MAX_VALUE, "REMARKS", "PROCEDURES").addField()
-            .at(7).simple(SQL_SHORT, 0, "PROCEDURE_TYPE", "PROCEDURES").addField()
+            .at(6).simple(SQL_VARYING, Integer.MAX_VALUE, "REMARKS", PROCEDURES).addField()
+            .at(7).simple(SQL_SHORT, 0, "PROCEDURE_TYPE", PROCEDURES).addField()
             // space for quoted package name, ".", quoted procedure name (assuming no double quotes in name)
-            .at(8).simple(SQL_VARYING, 2 * OBJECT_NAME_LENGTH + 5, "SPECIFIC_NAME", "PROCEDURES").addField()
+            .at(8).simple(SQL_VARYING, 2 * OBJECT_NAME_LENGTH + 5, "SPECIFIC_NAME", PROCEDURES).addField()
             .toRowDescriptor();
 
     private GetProcedures(DbMetadataMediator mediator) {
diff --git a/src/main/org/firebirdsql/jdbc/metadata/GetPseudoColumns.java b/src/main/org/firebirdsql/jdbc/metadata/GetPseudoColumns.java
index c93a9de83..aa43a2f3c 100644
--- a/src/main/org/firebirdsql/jdbc/metadata/GetPseudoColumns.java
+++ b/src/main/org/firebirdsql/jdbc/metadata/GetPseudoColumns.java
@@ -46,20 +46,22 @@
  */
 public abstract class GetPseudoColumns {
 
+    private static final String PSEUDOCOLUMNS = "PSEUDOCOLUMNS";
+
     private static final RowDescriptor ROW_DESCRIPTOR = DbMetadataMediator.newRowDescriptorBuilder(12)
-            .at(0).simple(SQL_VARYING | 1, OBJECT_NAME_LENGTH, "TABLE_CAT", "PSEUDOCOLUMNS").addField()
-            .at(1).simple(SQL_VARYING | 1, OBJECT_NAME_LENGTH, "TABLE_SCHEM", "PSEUDOCOLUMNS").addField()
-            .at(2).simple(SQL_VARYING, OBJECT_NAME_LENGTH, "TABLE_NAME", "PSEUDOCOLUMNS").addField()
-            .at(3).simple(SQL_VARYING, OBJECT_NAME_LENGTH, "COLUMN_NAME", "PSEUDOCOLUMNS").addField()
-            .at(4).simple(SQL_LONG, 0, "DATA_TYPE", "PSEUDOCOLUMNS").addField()
-            .at(5).simple(SQL_LONG, 0, "COLUMN_SIZE", "PSEUDOCOLUMNS").addField()
-            .at(6).simple(SQL_LONG | 1, 0, "DECIMAL_DIGITS", "PSEUDOCOLUMNS").addField()
-            .at(7).simple(SQL_LONG, 0, "NUM_PREC_RADIX", "PSEUDOCOLUMNS").addField()
-            .at(8).simple(SQL_VARYING, 50, "COLUMN_USAGE", "PSEUDOCOLUMNS").addField()
+            .at(0).simple(SQL_VARYING | 1, OBJECT_NAME_LENGTH, "TABLE_CAT", PSEUDOCOLUMNS).addField()
+            .at(1).simple(SQL_VARYING | 1, OBJECT_NAME_LENGTH, "TABLE_SCHEM", PSEUDOCOLUMNS).addField()
+            .at(2).simple(SQL_VARYING, OBJECT_NAME_LENGTH, "TABLE_NAME", PSEUDOCOLUMNS).addField()
+            .at(3).simple(SQL_VARYING, OBJECT_NAME_LENGTH, "COLUMN_NAME", PSEUDOCOLUMNS).addField()
+            .at(4).simple(SQL_LONG, 0, "DATA_TYPE", PSEUDOCOLUMNS).addField()
+            .at(5).simple(SQL_LONG, 0, "COLUMN_SIZE", PSEUDOCOLUMNS).addField()
+            .at(6).simple(SQL_LONG | 1, 0, "DECIMAL_DIGITS", PSEUDOCOLUMNS).addField()
+            .at(7).simple(SQL_LONG, 0, "NUM_PREC_RADIX", PSEUDOCOLUMNS).addField()
+            .at(8).simple(SQL_VARYING, 50, "COLUMN_USAGE", PSEUDOCOLUMNS).addField()
             // Field in Firebird is actually a blob, using Integer.MAX_VALUE for length
-            .at(9).simple(SQL_VARYING | 1, Integer.MAX_VALUE, "REMARKS", "PSEUDOCOLUMNS").addField()
-            .at(10).simple(SQL_LONG, 0, "CHAR_OCTET_LENGTH", "PSEUDOCOLUMNS").addField()
-            .at(11).simple(SQL_VARYING, 3, "IS_NULLABLE", "PSEUDOCOLUMNS").addField()
+            .at(9).simple(SQL_VARYING | 1, Integer.MAX_VALUE, "REMARKS", PSEUDOCOLUMNS).addField()
+            .at(10).simple(SQL_LONG, 0, "CHAR_OCTET_LENGTH", PSEUDOCOLUMNS).addField()
+            .at(11).simple(SQL_VARYING, 3, "IS_NULLABLE", PSEUDOCOLUMNS).addField()
             .toRowDescriptor();
 
     private static final String DB_KEY_REMARK = "The RDB$DB_KEY column in a select list will be renamed by Firebird to "
diff --git a/src/main/org/firebirdsql/jdbc/metadata/GetSuperTables.java b/src/main/org/firebirdsql/jdbc/metadata/GetSuperTables.java
index 3b91ff755..81ff1cc8f 100644
--- a/src/main/org/firebirdsql/jdbc/metadata/GetSuperTables.java
+++ b/src/main/org/firebirdsql/jdbc/metadata/GetSuperTables.java
@@ -37,11 +37,13 @@
  */
 public final class GetSuperTables {
 
+    private static final String SUPERTABLES = "SUPERTABLES";
+    
     private static final RowDescriptor ROW_DESCRIPTOR = DbMetadataMediator.newRowDescriptorBuilder(4)
-            .at(0).simple(SQL_VARYING, OBJECT_NAME_LENGTH, "TABLE_CAT", "SUPERTABLES").addField()
-            .at(1).simple(SQL_VARYING, OBJECT_NAME_LENGTH, "TABLE_SCHEM", "SUPERTABLES").addField()
-            .at(2).simple(SQL_VARYING, OBJECT_NAME_LENGTH, "TABLE_NAME", "SUPERTABLES").addField()
-            .at(3).simple(SQL_VARYING, OBJECT_NAME_LENGTH, "SUPERTABLE_NAME", "SUPERTABLES").addField()
+            .at(0).simple(SQL_VARYING, OBJECT_NAME_LENGTH, "TABLE_CAT", SUPERTABLES).addField()
+            .at(1).simple(SQL_VARYING, OBJECT_NAME_LENGTH, "TABLE_SCHEM", SUPERTABLES).addField()
+            .at(2).simple(SQL_VARYING, OBJECT_NAME_LENGTH, "TABLE_NAME", SUPERTABLES).addField()
+            .at(3).simple(SQL_VARYING, OBJECT_NAME_LENGTH, "SUPERTABLE_NAME", SUPERTABLES).addField()
             .toRowDescriptor();
 
     private GetSuperTables() {
diff --git a/src/main/org/firebirdsql/jdbc/metadata/GetSuperTypes.java b/src/main/org/firebirdsql/jdbc/metadata/GetSuperTypes.java
index 78f2e405b..7bffa061b 100644
--- a/src/main/org/firebirdsql/jdbc/metadata/GetSuperTypes.java
+++ b/src/main/org/firebirdsql/jdbc/metadata/GetSuperTypes.java
@@ -37,13 +37,15 @@
  */
 public final class GetSuperTypes {
 
+    private static final String SUPERTYPES = "SUPERTYPES";
+    
     private static final RowDescriptor ROW_DESCRIPTOR = DbMetadataMediator.newRowDescriptorBuilder(6)
-            .at(0).simple(SQL_VARYING, OBJECT_NAME_LENGTH, "TYPE_CAT", "SUPERTYPES").addField()
-            .at(1).simple(SQL_VARYING, OBJECT_NAME_LENGTH, "TYPE_SCHEM", "SUPERTYPES").addField()
-            .at(2).simple(SQL_VARYING, 31, "TYPE_NAME", "SUPERTYPES").addField()
-            .at(3).simple(SQL_VARYING, OBJECT_NAME_LENGTH, "SUPERTYPE_CAT", "SUPERTYPES").addField()
-            .at(4).simple(SQL_VARYING, OBJECT_NAME_LENGTH, "SUPERTYPE_SCHEM", "SUPERTYPES").addField()
-            .at(5).simple(SQL_VARYING, 31, "SUPERTYPE_NAME", "SUPERTYPES").addField()
+            .at(0).simple(SQL_VARYING, OBJECT_NAME_LENGTH, "TYPE_CAT", SUPERTYPES).addField()
+            .at(1).simple(SQL_VARYING, OBJECT_NAME_LENGTH, "TYPE_SCHEM", SUPERTYPES).addField()
+            .at(2).simple(SQL_VARYING, 31, "TYPE_NAME", SUPERTYPES).addField()
+            .at(3).simple(SQL_VARYING, OBJECT_NAME_LENGTH, "SUPERTYPE_CAT", SUPERTYPES).addField()
+            .at(4).simple(SQL_VARYING, OBJECT_NAME_LENGTH, "SUPERTYPE_SCHEM", SUPERTYPES).addField()
+            .at(5).simple(SQL_VARYING, 31, "SUPERTYPE_NAME", SUPERTYPES).addField()
             .toRowDescriptor();
 
     private GetSuperTypes() {
diff --git a/src/main/org/firebirdsql/jdbc/metadata/GetTablePrivileges.java b/src/main/org/firebirdsql/jdbc/metadata/GetTablePrivileges.java
index 17e9c6d62..702da78d6 100644
--- a/src/main/org/firebirdsql/jdbc/metadata/GetTablePrivileges.java
+++ b/src/main/org/firebirdsql/jdbc/metadata/GetTablePrivileges.java
@@ -44,15 +44,17 @@
  */
 public final class GetTablePrivileges extends AbstractMetadataMethod {
 
+    private static final String TABLEPRIV = "TABLEPRIV";
+    
     private static final RowDescriptor ROW_DESCRIPTOR = DbMetadataMediator.newRowDescriptorBuilder(8)
-            .at(0).simple(SQL_VARYING | 1, OBJECT_NAME_LENGTH, "TABLE_CAT", "TABLEPRIV").addField()
-            .at(1).simple(SQL_VARYING | 1, OBJECT_NAME_LENGTH, "TABLE_SCHEM", "TABLEPRIV").addField()
-            .at(2).simple(SQL_VARYING, OBJECT_NAME_LENGTH, "TABLE_NAME", "TABLEPRIV").addField()
-            .at(3).simple(SQL_VARYING, OBJECT_NAME_LENGTH, "GRANTOR", "TABLEPRIV").addField()
-            .at(4).simple(SQL_VARYING, OBJECT_NAME_LENGTH, "GRANTEE", "TABLEPRIV").addField()
-            .at(5).simple(SQL_VARYING, 31, "PRIVILEGE", "TABLEPRIV").addField()
-            .at(6).simple(SQL_VARYING, 3, "IS_GRANTABLE", "TABLEPRIV").addField()
-            .at(7).simple(SQL_VARYING, OBJECT_NAME_LENGTH, "JB_GRANTEE_TYPE", "TABLEPRIV").addField()
+            .at(0).simple(SQL_VARYING | 1, OBJECT_NAME_LENGTH, "TABLE_CAT", TABLEPRIV).addField()
+            .at(1).simple(SQL_VARYING | 1, OBJECT_NAME_LENGTH, "TABLE_SCHEM", TABLEPRIV).addField()
+            .at(2).simple(SQL_VARYING, OBJECT_NAME_LENGTH, "TABLE_NAME", TABLEPRIV).addField()
+            .at(3).simple(SQL_VARYING, OBJECT_NAME_LENGTH, "GRANTOR", TABLEPRIV).addField()
+            .at(4).simple(SQL_VARYING, OBJECT_NAME_LENGTH, "GRANTEE", TABLEPRIV).addField()
+            .at(5).simple(SQL_VARYING, 31, "PRIVILEGE", TABLEPRIV).addField()
+            .at(6).simple(SQL_VARYING, 3, "IS_GRANTABLE", TABLEPRIV).addField()
+            .at(7).simple(SQL_VARYING, OBJECT_NAME_LENGTH, "JB_GRANTEE_TYPE", TABLEPRIV).addField()
             .toRowDescriptor();
 
     //@formatter:off
diff --git a/src/main/org/firebirdsql/jdbc/metadata/GetTables.java b/src/main/org/firebirdsql/jdbc/metadata/GetTables.java
index 94203c6d1..dcda1d4e8 100644
--- a/src/main/org/firebirdsql/jdbc/metadata/GetTables.java
+++ b/src/main/org/firebirdsql/jdbc/metadata/GetTables.java
@@ -59,21 +59,23 @@
 @InternalApi
 public abstract class GetTables extends AbstractMetadataMethod {
 
+    private static final String TABLES = "TABLES";
+    
     private static final RowDescriptor ROW_DESCRIPTOR = DbMetadataMediator.newRowDescriptorBuilder(12)
-            .at(0).simple(SQL_VARYING | 1, OBJECT_NAME_LENGTH, "TABLE_CAT", "TABLES").addField()
-            .at(1).simple(SQL_VARYING | 1, OBJECT_NAME_LENGTH, "TABLE_SCHEM", "TABLES").addField()
-            .at(2).simple(SQL_VARYING, OBJECT_NAME_LENGTH, "TABLE_NAME", "TABLES").addField()
-            .at(3).simple(SQL_VARYING, 20, "TABLE_TYPE", "TABLES").addField()
+            .at(0).simple(SQL_VARYING | 1, OBJECT_NAME_LENGTH, "TABLE_CAT", TABLES).addField()
+            .at(1).simple(SQL_VARYING | 1, OBJECT_NAME_LENGTH, "TABLE_SCHEM", TABLES).addField()
+            .at(2).simple(SQL_VARYING, OBJECT_NAME_LENGTH, "TABLE_NAME", TABLES).addField()
+            .at(3).simple(SQL_VARYING, 20, "TABLE_TYPE", TABLES).addField()
             // Field in Firebird is actually a blob, using Integer.MAX_VALUE for length
-            .at(4).simple(SQL_VARYING | 1, Integer.MAX_VALUE, "REMARKS", "TABLES").addField()
-            .at(5).simple(SQL_VARYING | 1, OBJECT_NAME_LENGTH, "TYPE_CAT", "TABLES").addField()
-            .at(6).simple(SQL_VARYING | 1, OBJECT_NAME_LENGTH, "TYPE_SCHEM", "TABLES").addField()
-            .at(7).simple(SQL_VARYING | 1, OBJECT_NAME_LENGTH, "TYPE_NAME", "TABLES").addField()
-            .at(8).simple(SQL_VARYING | 1, OBJECT_NAME_LENGTH, "SELF_REFERENCING_COL_NAME", "TABLES").addField()
-            .at(9).simple(SQL_VARYING | 1, 10, "REF_GENERATION", "TABLES").addField()
+            .at(4).simple(SQL_VARYING | 1, Integer.MAX_VALUE, "REMARKS", TABLES).addField()
+            .at(5).simple(SQL_VARYING | 1, OBJECT_NAME_LENGTH, "TYPE_CAT", TABLES).addField()
+            .at(6).simple(SQL_VARYING | 1, OBJECT_NAME_LENGTH, "TYPE_SCHEM", TABLES).addField()
+            .at(7).simple(SQL_VARYING | 1, OBJECT_NAME_LENGTH, "TYPE_NAME", TABLES).addField()
+            .at(8).simple(SQL_VARYING | 1, OBJECT_NAME_LENGTH, "SELF_REFERENCING_COL_NAME", TABLES).addField()
+            .at(9).simple(SQL_VARYING | 1, 10, "REF_GENERATION", TABLES).addField()
             // Jaybird extensions
-            .at(10).simple(SQL_VARYING | 1, OBJECT_NAME_LENGTH, "OWNER_NAME", "TABLES").addField()
-            .at(11).simple(SQL_SHORT, 0, "JB_RELATION_ID", "TABLES").addField()
+            .at(10).simple(SQL_VARYING | 1, OBJECT_NAME_LENGTH, "OWNER_NAME", TABLES).addField()
+            .at(11).simple(SQL_SHORT, 0, "JB_RELATION_ID", TABLES).addField()
             .toRowDescriptor();
 
     private static final RowDescriptor ROW_DESCRIPTOR_TABLE_TYPES = DbMetadataMediator.newRowDescriptorBuilder(1)
diff --git a/src/main/org/firebirdsql/jdbc/metadata/GetTypeInfo.java b/src/main/org/firebirdsql/jdbc/metadata/GetTypeInfo.java
index ab1f0ad81..ce6856a5b 100644
--- a/src/main/org/firebirdsql/jdbc/metadata/GetTypeInfo.java
+++ b/src/main/org/firebirdsql/jdbc/metadata/GetTypeInfo.java
@@ -44,25 +44,27 @@
  */
 public final class GetTypeInfo {
 
+    private static final String TYPEINFO = "TYPEINFO";
+    
     private static final RowDescriptor ROW_DESCRIPTOR = DbMetadataMediator.newRowDescriptorBuilder(18)
-            .at(0).simple(SQL_VARYING, 31, "TYPE_NAME", "TYPEINFO").addField()
-            .at(1).simple(SQL_LONG, 0, "DATA_TYPE", "TYPEINFO").addField()
-            .at(2).simple(SQL_LONG, 0, "PRECISION", "TYPEINFO").addField()
-            .at(3).simple(SQL_VARYING | 1, 1, "LITERAL_PREFIX", "TYPEINFO").addField()
-            .at(4).simple(SQL_VARYING | 1, 1, "LITERAL_SUFFIX", "TYPEINFO").addField()
-            .at(5).simple(SQL_VARYING | 1, 31, "CREATE_PARAMS", "TYPEINFO").addField()
-            .at(6).simple(SQL_SHORT, 0, "NULLABLE", "TYPEINFO").addField()
-            .at(7).simple(SQL_TEXT, 1, "CASE_SENSITIVE", "TYPEINFO").addField()
-            .at(8).simple(SQL_SHORT, 0, "SEARCHABLE", "TYPEINFO").addField()
-            .at(9).simple(SQL_TEXT, 1, "UNSIGNED_ATTRIBUTE", "TYPEINFO").addField()
-            .at(10).simple(SQL_TEXT, 1, "FIXED_PREC_SCALE", "TYPEINFO").addField()
-            .at(11).simple(SQL_TEXT, 1, "AUTO_INCREMENT", "TYPEINFO").addField()
-            .at(12).simple(SQL_VARYING | 1, 31, "LOCAL_TYPE_NAME", "TYPEINFO").addField()
-            .at(13).simple(SQL_SHORT, 0, "MINIMUM_SCALE", "TYPEINFO").addField()
-            .at(14).simple(SQL_SHORT, 0, "MAXIMUM_SCALE", "TYPEINFO").addField()
-            .at(15).simple(SQL_LONG, 0, "SQL_DATA_TYPE", "TYPEINFO").addField()
-            .at(16).simple(SQL_LONG | 1, 0, "SQL_DATETIME_SUB", "TYPEINFO").addField()
-            .at(17).simple(SQL_LONG, 0, "NUM_PREC_RADIX", "TYPEINFO").addField()
+            .at(0).simple(SQL_VARYING, 31, "TYPE_NAME", TYPEINFO).addField()
+            .at(1).simple(SQL_LONG, 0, "DATA_TYPE", TYPEINFO).addField()
+            .at(2).simple(SQL_LONG, 0, "PRECISION", TYPEINFO).addField()
+            .at(3).simple(SQL_VARYING | 1, 1, "LITERAL_PREFIX", TYPEINFO).addField()
+            .at(4).simple(SQL_VARYING | 1, 1, "LITERAL_SUFFIX", TYPEINFO).addField()
+            .at(5).simple(SQL_VARYING | 1, 31, "CREATE_PARAMS", TYPEINFO).addField()
+            .at(6).simple(SQL_SHORT, 0, "NULLABLE", TYPEINFO).addField()
+            .at(7).simple(SQL_TEXT, 1, "CASE_SENSITIVE", TYPEINFO).addField()
+            .at(8).simple(SQL_SHORT, 0, "SEARCHABLE", TYPEINFO).addField()
+            .at(9).simple(SQL_TEXT, 1, "UNSIGNED_ATTRIBUTE", TYPEINFO).addField()
+            .at(10).simple(SQL_TEXT, 1, "FIXED_PREC_SCALE", TYPEINFO).addField()
+            .at(11).simple(SQL_TEXT, 1, "AUTO_INCREMENT", TYPEINFO).addField()
+            .at(12).simple(SQL_VARYING | 1, 31, "LOCAL_TYPE_NAME", TYPEINFO).addField()
+            .at(13).simple(SQL_SHORT, 0, "MINIMUM_SCALE", TYPEINFO).addField()
+            .at(14).simple(SQL_SHORT, 0, "MAXIMUM_SCALE", TYPEINFO).addField()
+            .at(15).simple(SQL_LONG, 0, "SQL_DATA_TYPE", TYPEINFO).addField()
+            .at(16).simple(SQL_LONG | 1, 0, "SQL_DATETIME_SUB", TYPEINFO).addField()
+            .at(17).simple(SQL_LONG, 0, "NUM_PREC_RADIX", TYPEINFO).addField()
             .toRowDescriptor();
 
     private final DbMetadataMediator mediator;
diff --git a/src/main/org/firebirdsql/jdbc/metadata/GetVersionColumns.java b/src/main/org/firebirdsql/jdbc/metadata/GetVersionColumns.java
index b75fd78e5..06016622d 100644
--- a/src/main/org/firebirdsql/jdbc/metadata/GetVersionColumns.java
+++ b/src/main/org/firebirdsql/jdbc/metadata/GetVersionColumns.java
@@ -42,15 +42,17 @@
  */
 public class GetVersionColumns {
 
+    private static final String VERSIONCOL = "VERSIONCOL";
+    
     private static final RowDescriptor ROW_DESCRIPTOR = DbMetadataMediator.newRowDescriptorBuilder(8)
-            .at(0).simple(SQL_SHORT, 0, "SCOPE", "VERSIONCOL").addField()
-            .at(1).simple(SQL_VARYING, OBJECT_NAME_LENGTH, "COLUMN_NAME", "VERSIONCOL").addField()
-            .at(2).simple(SQL_LONG, 0, "DATA_TYPE", "VERSIONCOL").addField()
-            .at(3).simple(SQL_VARYING, 31, "TYPE_NAME", "VERSIONCOL").addField()
-            .at(4).simple(SQL_LONG, 0, "COLUMN_SIZE", "VERSIONCOL").addField()
-            .at(5).simple(SQL_LONG, 0, "BUFFER_LENGTH", "VERSIONCOL").addField()
-            .at(6).simple(SQL_SHORT, 0, "DECIMAL_DIGITS", "VERSIONCOL").addField()
-            .at(7).simple(SQL_SHORT, 0, "PSEUDO_COLUMN", "VERSIONCOL").addField()
+            .at(0).simple(SQL_SHORT, 0, "SCOPE", VERSIONCOL).addField()
+            .at(1).simple(SQL_VARYING, OBJECT_NAME_LENGTH, "COLUMN_NAME", VERSIONCOL).addField()
+            .at(2).simple(SQL_LONG, 0, "DATA_TYPE", VERSIONCOL).addField()
+            .at(3).simple(SQL_VARYING, 31, "TYPE_NAME", VERSIONCOL).addField()
+            .at(4).simple(SQL_LONG, 0, "COLUMN_SIZE", VERSIONCOL).addField()
+            .at(5).simple(SQL_LONG, 0, "BUFFER_LENGTH", VERSIONCOL).addField()
+            .at(6).simple(SQL_SHORT, 0, "DECIMAL_DIGITS", VERSIONCOL).addField()
+            .at(7).simple(SQL_SHORT, 0, "PSEUDO_COLUMN", VERSIONCOL).addField()
             .toRowDescriptor();
 
     private final DbMetadataMediator mediator;
@@ -60,7 +62,7 @@ private GetVersionColumns(DbMetadataMediator mediator) {
     }
 
     public ResultSet getVersionColumns(String catalog, String schema, String table) throws SQLException {
-        if (table == null || "".equals(table)) {
+        if (table == null || table.isEmpty()) {
             return new FBResultSet(ROW_DESCRIPTOR, emptyList());
         }
 
diff --git a/src/main/org/firebirdsql/management/FBCommandLine.java b/src/main/org/firebirdsql/management/FBCommandLine.java
index 084ac30cf..34fbf4bee 100644
--- a/src/main/org/firebirdsql/management/FBCommandLine.java
+++ b/src/main/org/firebirdsql/management/FBCommandLine.java
@@ -27,24 +27,17 @@
 package org.firebirdsql.management;
 
 /**
- * FBCommandLine.java
- * 
- * 
- * Created: Thu Oct 10 14:14:07 2002
- * 
+ * FBCommandLine
+ *
  * @author David Jencks
  */
-
 public class FBCommandLine {
-    public FBCommandLine() {
-
-    }
 
     public static void main(String[] args) throws Exception {
         if (args.length != 6) {
             usage();
             return;
-        } // end of if ()
+        }
         if (!(args[2].equals("-user") || args[2].equals("-u"))) {
             usage();
             return;
@@ -56,32 +49,30 @@ public static void main(String[] args) throws Exception {
         String filename = args[1];
         String user = args[3];
         String password = args[5];
-        FBManager fbm = new FBManager();
-        System.out.println("filename: " + filename + ", user: " + user
-                + ", password: " + password);
-        fbm.start();
-        if (args[0].equals("-create") || args[0].equals("-c")) {
-            fbm.createDatabase(filename, user, password);
-            return;
-        } // end of if ()
-        if (args[0].equals("-drop") || args[0].equals("-d")) {
-            fbm.dropDatabase(filename, user, password);
-            return;
+        try (var fbm = new FBManager()) {
+            System.out.printf("filename: %s, user: %s, password: %s%n", filename, user, password);
+            fbm.start();
+            if (args[0].equals("-create") || args[0].equals("-c")) {
+                fbm.createDatabase(filename, user, password);
+                return;
+            }
+
+            if (args[0].equals("-drop") || args[0].equals("-d")) {
+                fbm.dropDatabase(filename, user, password);
+                return;
+            }
         }
         usage();
-
-    } // end of main()
+    }
 
     private static void usage() {
         System.out.println("Firebird driver command line db create/drop tool");
-        System.out
-                .println("This works only on localhost. Use filename rather than jdbc url.");
+        System.out.println("This works only on localhost. Use filename rather than jdbc url.");
         System.out.println("create:");
-        System.out
-                .println("     -create <filename> -user <user> -password <password>");
+        System.out.println("     -create <filename> -user <user> -password <password>");
         System.out.println("drop:");
         System.out.println("     -drop <filename>");
         System.out.println("flags -create may be abbreviated as -c, etc.");
     }
 
-}// FBCommandLine
+}
diff --git a/src/main/org/firebirdsql/management/FBServiceManager.java b/src/main/org/firebirdsql/management/FBServiceManager.java
index df7e6c5c4..57f4237f9 100644
--- a/src/main/org/firebirdsql/management/FBServiceManager.java
+++ b/src/main/org/firebirdsql/management/FBServiceManager.java
@@ -53,7 +53,7 @@ public class FBServiceManager implements ServiceManager {
     private String database;
     private OutputStream logger;
 
-    public final static int BUFFER_SIZE = 1024; //1K
+    public static final int BUFFER_SIZE = 1024; //1K
 
     /**
      * Create a new instance of <code>FBServiceManager</code> based on
@@ -182,26 +182,30 @@ public String getDatabase() {
         return database;
     }
 
+    @SuppressWarnings("removal")
     @Override
-    @Deprecated
+    @Deprecated(since = "5", forRemoval = true)
     public String getHost() {
         return getServerName();
     }
 
+    @SuppressWarnings("removal")
     @Override
-    @Deprecated
+    @Deprecated(since = "5", forRemoval = true)
     public void setHost(String host) {
         setServerName(host);
     }
 
+    @SuppressWarnings("removal")
     @Override
-    @Deprecated
+    @Deprecated(since = "5", forRemoval = true)
     public int getPort() {
         return getPortNumber();
     }
 
+    @SuppressWarnings("removal")
     @Override
-    @Deprecated
+    @Deprecated(since = "5", forRemoval = true)
     public void setPort(int port) {
         setPortNumber(port);
     }
diff --git a/src/main/org/firebirdsql/management/FBStatisticsManager.java b/src/main/org/firebirdsql/management/FBStatisticsManager.java
index 2307b7a8a..46eeda793 100644
--- a/src/main/org/firebirdsql/management/FBStatisticsManager.java
+++ b/src/main/org/firebirdsql/management/FBStatisticsManager.java
@@ -60,7 +60,7 @@
  */
 public class FBStatisticsManager extends FBServiceManager implements StatisticsManager {
 
-    private static final int possibleStatistics =
+    private static final int POSSIBLE_STATISTICS =
             DATA_TABLE_STATISTICS | SYSTEM_TABLE_STATISTICS | INDEX_STATISTICS |
                     RECORD_VERSION_STATISTICS;
 
@@ -109,7 +109,7 @@ public void getDatabaseStatistics() throws SQLException {
     }
 
     public void getDatabaseStatistics(int options) throws SQLException {
-        if (options != 0 && (options | possibleStatistics) != possibleStatistics) {
+        if (options != 0 && (options | POSSIBLE_STATISTICS) != POSSIBLE_STATISTICS) {
             throw new IllegalArgumentException("options must be 0 or a "
                     + "combination of DATA_TABLE_STATISTICS, "
                     + "SYSTEM_TABLE_STATISTICS, INDEX_STATISTICS, or 0");
diff --git a/src/main/org/firebirdsql/management/FBStreamingBackupManager.java b/src/main/org/firebirdsql/management/FBStreamingBackupManager.java
index da4bd6679..6c0602883 100644
--- a/src/main/org/firebirdsql/management/FBStreamingBackupManager.java
+++ b/src/main/org/firebirdsql/management/FBStreamingBackupManager.java
@@ -108,8 +108,8 @@ public void setBackupOutputStream(OutputStream backupStream) {
     }
 
     public void setRestoreInputStream(InputStream restoreStream) {
-        restoreInputStream = (restoreStream instanceof BufferedInputStream)
-                ? (BufferedInputStream) restoreStream
+        restoreInputStream = (restoreStream instanceof BufferedInputStream bufferedInputStream)
+                ? bufferedInputStream
                 : new BufferedInputStream(restoreStream, 128 * MAX_RESTORE_CHUNK);
     }
 
diff --git a/src/main/org/firebirdsql/management/FBTraceManager.java b/src/main/org/firebirdsql/management/FBTraceManager.java
index b41c353a9..f02ff6ec1 100644
--- a/src/main/org/firebirdsql/management/FBTraceManager.java
+++ b/src/main/org/firebirdsql/management/FBTraceManager.java
@@ -157,8 +157,8 @@ public void startTraceSession(String traceSessionName, String configuration) thr
 
         synchronized (this) {
             OutputStream currentLogger = getLogger();
-            if (currentLogger instanceof TraceStream) {
-                currentLogger = ((TraceStream) currentLogger).unwrap();
+            if (currentLogger instanceof TraceStream traceStream) {
+                currentLogger = traceStream.unwrap();
             }
             setLogger(new TraceStream(currentLogger, traceSessionName));
 
@@ -256,6 +256,7 @@ public TraceStream(OutputStream out, String sessionName) {
             this.sessionName = sessionName;
         }
 
+        @Override
         public void write(byte[] b, int off, int len) throws IOException {
             if (lookForSessionId) {
                 findSessionId(b, off, len);
diff --git a/src/main/org/firebirdsql/management/ServiceManager.java b/src/main/org/firebirdsql/management/ServiceManager.java
index ee2038ce8..a9e01d722 100644
--- a/src/main/org/firebirdsql/management/ServiceManager.java
+++ b/src/main/org/firebirdsql/management/ServiceManager.java
@@ -66,7 +66,7 @@ public interface ServiceManager extends ServiceConnectionProperties {
      * @return the host for the connection to the service manager.
      * @deprecated Use {@link #getServerName()}; will be removed in Jaybird 6 or later
      */
-    @Deprecated
+    @Deprecated(since = "5", forRemoval = true)
     String getHost();
 
     /**
@@ -79,7 +79,7 @@ public interface ServiceManager extends ServiceConnectionProperties {
      *         for the connection to the service manager.
      * @deprecated Use {@link #setServerName(String)}; will be removed in Jaybird 6 or later
      */
-    @Deprecated
+    @Deprecated(since = "5", forRemoval = true)
     void setHost(String host);
 
     /**
@@ -88,7 +88,7 @@ public interface ServiceManager extends ServiceConnectionProperties {
      * @return the port for the connection to the service manager.
      * @deprecated Use {@link #getPortNumber()}; will be removed in Jaybird 6 or later
      */
-    @Deprecated
+    @Deprecated(since = "5", forRemoval = true)
     int getPort();
 
     /**
@@ -98,7 +98,7 @@ public interface ServiceManager extends ServiceConnectionProperties {
      *         for the connection to the service manager.
      * @deprecated Use {@link #setPortNumber(int)}; will be removed in Jaybird 6 or later
      */
-    @Deprecated
+    @Deprecated(since = "5", forRemoval = true)
     void setPort(int port);
 
     /**
diff --git a/src/main/org/firebirdsql/util/FirebirdSupportInfo.java b/src/main/org/firebirdsql/util/FirebirdSupportInfo.java
index 5e07232d8..da028b6cb 100644
--- a/src/main/org/firebirdsql/util/FirebirdSupportInfo.java
+++ b/src/main/org/firebirdsql/util/FirebirdSupportInfo.java
@@ -315,26 +315,17 @@ public boolean supportsUserAndGroupIdInUser() {
      * @return {@code true} when the database supports the specified protocol
      */
     public boolean supportsProtocol(int protocolVersion) {
-        switch (protocolVersion) {
-        case 10:
-            return true;
-        case 11:
-            return isVersionEqualOrAbove(2, 1);
-        case 12:
-            return isVersionEqualOrAbove(2, 5);
-        case 13:
-            return isVersionEqualOrAbove(3);
-        case 14:
-            // fall-through: Jaybird has only implemented protocol version 14 as part of version 15
-        case 15:
-            return isVersionEqualOrAbove(3, 0, 2);
-        case 16:
-            return isVersionEqualOrAbove(4, 0, 0);
-        case 18:
-            return isVersionEqualOrAbove(5, 0 ,0);
-        default:
-            return false;
-        }
+        return switch (protocolVersion) {
+            case 10 -> true;
+            case 11 -> isVersionEqualOrAbove(2, 1);
+            case 12 -> isVersionEqualOrAbove(2, 5);
+            case 13 -> isVersionEqualOrAbove(3);
+            // Jaybird has only implemented protocol version 14 as part of version 15
+            case 14, 15 -> isVersionEqualOrAbove(3, 0, 2);
+            case 16 -> isVersionEqualOrAbove(4, 0, 0);
+            case 18 -> isVersionEqualOrAbove(5, 0, 0);
+            default -> false;
+        };
     }
 
     /**
@@ -433,18 +424,12 @@ public int reportedMetadataCharacterSetId() {
     }
 
     public boolean supportsPageSize(int pageSize) {
-        switch (pageSize) {
-        case PageSizeConstants.SIZE_1K:
-        case PageSizeConstants.SIZE_2K:
-            return !isVersionEqualOrAbove(2, 1);
-        case PageSizeConstants.SIZE_4K:
-        case PageSizeConstants.SIZE_8K:
-        case PageSizeConstants.SIZE_16K:
-            return true;
-        case PageSizeConstants.SIZE_32K:
-            return isVersionEqualOrAbove(4);
-        }
-        return false;
+        return switch (pageSize) {
+            case PageSizeConstants.SIZE_1K, PageSizeConstants.SIZE_2K -> !isVersionEqualOrAbove(2, 1);
+            case PageSizeConstants.SIZE_4K, PageSizeConstants.SIZE_8K, PageSizeConstants.SIZE_16K -> true;
+            case PageSizeConstants.SIZE_32K -> isVersionEqualOrAbove(4);
+            default -> false;
+        };
     }
 
     public boolean supportsWireEncryption() {
diff --git a/src/main/org/firebirdsql/util/NumericHelper.java b/src/main/org/firebirdsql/util/NumericHelper.java
index cd4dfe5db..ea5b8f30f 100644
--- a/src/main/org/firebirdsql/util/NumericHelper.java
+++ b/src/main/org/firebirdsql/util/NumericHelper.java
@@ -39,7 +39,7 @@ private NumericHelper() {
      * @return {@code intValue} as an unsigned long.
      */
     public static long toUnsignedLong(int intValue) {
-        return ((long) intValue) & 0xffffffffL;
+        return intValue & 0xffffffffL;
     }
 
     /**
diff --git a/src/test/org/firebirdsql/gds/ng/DefaultDatatypeCoderTest.java b/src/test/org/firebirdsql/gds/ng/DefaultDatatypeCoderTest.java
index e693a1a19..9ea3a2dc2 100644
--- a/src/test/org/firebirdsql/gds/ng/DefaultDatatypeCoderTest.java
+++ b/src/test/org/firebirdsql/gds/ng/DefaultDatatypeCoderTest.java
@@ -270,7 +270,7 @@ void testLocalTimeToTimestamp() {
      * Checks cache maintenance implementation (warning: reflection ties this to the implementation)
      */
     @Test
-    public void testCacheOfEncodingSpecificDatatypeCoders() throws Exception {
+    void testCacheOfEncodingSpecificDatatypeCoders() throws Exception {
         Field cacheField = DefaultDatatypeCoder.class.getDeclaredField("encodingSpecificDatatypeCoders");
         cacheField.setAccessible(true);
 
diff --git a/src/test/org/firebirdsql/gds/ng/EncodingSpecificDatatypeCoderTest.java b/src/test/org/firebirdsql/gds/ng/EncodingSpecificDatatypeCoderTest.java
index ec5fcb6b6..c96f8399e 100644
--- a/src/test/org/firebirdsql/gds/ng/EncodingSpecificDatatypeCoderTest.java
+++ b/src/test/org/firebirdsql/gds/ng/EncodingSpecificDatatypeCoderTest.java
@@ -211,7 +211,7 @@ void decodeLong() {
     }
 
     @Test
-    public void encodeFloat() {
+    void encodeFloat() {
         final float value = 23.1f;
         final byte[] response = {1, 2, 3, 4};
         when(parentCoder.encodeFloat(value)).thenReturn(response);
@@ -255,7 +255,7 @@ void decodeDouble() {
     }
 
     @Test
-    public void decodeBoolean() {
+    void decodeBoolean() {
         final byte[] valueTrue = {1, 0};
         final byte[] valueFalse = {0, 0};
         when(parentCoder.decodeBoolean(valueTrue)).thenReturn(true);
diff --git a/src/test/org/firebirdsql/gds/ng/wire/crypt/EncryptionInitInfoTest.java b/src/test/org/firebirdsql/gds/ng/wire/crypt/EncryptionInitInfoTest.java
index 38b0f0501..c79d491d5 100644
--- a/src/test/org/firebirdsql/gds/ng/wire/crypt/EncryptionInitInfoTest.java
+++ b/src/test/org/firebirdsql/gds/ng/wire/crypt/EncryptionInitInfoTest.java
@@ -79,7 +79,7 @@ void successRequiresDecryptionCipherNotNull() {
     }
 
     @Test
-    public void failureValues() {
+    void failureValues() {
         final SQLException exception = new SQLException();
         EncryptionInitInfo initInfo = EncryptionInitInfo.failure(DUMMY_IDENTIFIER, exception);
 
@@ -100,7 +100,6 @@ void failureRequiresExceptionNotNull() {
     void failureGetEncryptionCipherNotAllowed() {
         EncryptionInitInfo initInfo = EncryptionInitInfo.failure(DUMMY_IDENTIFIER, new SQLException());
 
-        //noinspection ResultOfMethodCallIgnored
         assertThrows(IllegalStateException.class, initInfo::getEncryptionCipher);
     }
 
@@ -108,7 +107,6 @@ void failureGetEncryptionCipherNotAllowed() {
     void failureGetDecryptionCipherNotAllowed() {
         EncryptionInitInfo initInfo = EncryptionInitInfo.failure(DUMMY_IDENTIFIER, new SQLException());
 
-        //noinspection ResultOfMethodCallIgnored
         assertThrows(IllegalStateException.class, initInfo::getDecryptionCipher);
     }
 }
\ No newline at end of file
diff --git a/src/test/org/firebirdsql/jaybird/xca/FBXAResourceTest.java b/src/test/org/firebirdsql/jaybird/xca/FBXAResourceTest.java
index 4c6de8592..1959c9975 100644
--- a/src/test/org/firebirdsql/jaybird/xca/FBXAResourceTest.java
+++ b/src/test/org/firebirdsql/jaybird/xca/FBXAResourceTest.java
@@ -228,7 +228,7 @@ void testRecover() throws Exception {
      * </p>
      */
     @Test
-    public void testXAMultipleStatements() throws Throwable {
+    void testXAMultipleStatements() throws Throwable {
         FBManagedConnectionFactory mcf = createDefaultMcf();
         FBManagedConnection mc = mcf.createManagedConnection();
         try {
@@ -268,7 +268,7 @@ public void testXAMultipleStatements() throws Throwable {
      * </p>
      */
     @Test
-    public void testCloseConnectionDuringXA() throws Throwable {
+    void testCloseConnectionDuringXA() throws Throwable {
         FBManagedConnectionFactory mcf = createDefaultMcf();
         FBManagedConnection mc = mcf.createManagedConnection();
         try {
diff --git a/src/test/org/firebirdsql/jdbc/BatchUpdatesTest.java b/src/test/org/firebirdsql/jdbc/BatchUpdatesTest.java
index f3f947d23..b17a0059f 100644
--- a/src/test/org/firebirdsql/jdbc/BatchUpdatesTest.java
+++ b/src/test/org/firebirdsql/jdbc/BatchUpdatesTest.java
@@ -162,13 +162,13 @@ void testPreparedStatementBatch(boolean useServerBatch) throws SQLException {
 
             var rs = stmt.executeQuery("SELECT * FROM batch_updates order by id");
             assertTrue(rs.next(), "expected row 1");
-            assertEquals(rs.getInt(1), 1, "id=1");
+            assertEquals(1, rs.getInt(1), "id=1");
             assertEquals("test", rs.getString(2), "id=1 str_value");
             assertTrue(rs.next(), "expected row 2");
-            assertEquals(rs.getInt(1), 2, "id=2");
+            assertEquals(2, rs.getInt(1), "id=2");
             assertEquals("another", rs.getString(2), "id=2 str_value");
             assertTrue(rs.next(), "expected row 3");
-            assertEquals(rs.getInt(1), 3, "id=3");
+            assertEquals(3, rs.getInt(1), "id=3");
             assertEquals("stream", rs.getString(2), "id=3 str_value");
             assertEquals("string", rs.getString(3), "id=3 clob_value");
             assertFalse(rs.next(), "no more rows");
diff --git a/src/test/org/firebirdsql/jdbc/FBConnectionTest.java b/src/test/org/firebirdsql/jdbc/FBConnectionTest.java
index b16b20c14..42935976b 100644
--- a/src/test/org/firebirdsql/jdbc/FBConnectionTest.java
+++ b/src/test/org/firebirdsql/jdbc/FBConnectionTest.java
@@ -356,7 +356,7 @@ void testNoCharacterSetWithDefaultConnectionEncoding() throws Exception {
      * {@code org.firebirdsql.jdbc.requireConnectionEncoding} have not been set.
      */
     @Test
-    public void testNoCharacterSetWithoutDefaultConnectionEncodingDefaultsToNONEIfEncodingNotRequired() throws Exception {
+    void testNoCharacterSetWithoutDefaultConnectionEncodingDefaultsToNONEIfEncodingNotRequired() throws Exception {
         String defaultConnectionEncoding = System.getProperty("org.firebirdsql.jdbc.defaultConnectionEncoding");
         assumeThat("Test only works if org.firebirdsql.jdbc.defaultConnectionEncoding has not been specified",
                 defaultConnectionEncoding, nullValue());
diff --git a/src/test/org/firebirdsql/jdbc/FBDatabaseMetaDataIndexInfoTest.java b/src/test/org/firebirdsql/jdbc/FBDatabaseMetaDataIndexInfoTest.java
index 75401775b..11c9d777f 100644
--- a/src/test/org/firebirdsql/jdbc/FBDatabaseMetaDataIndexInfoTest.java
+++ b/src/test/org/firebirdsql/jdbc/FBDatabaseMetaDataIndexInfoTest.java
@@ -119,7 +119,7 @@ static void tearDownAll() throws SQLException {
      * getIndexInfo().
      */
     @Test
-    public void testIndexInfoMetaDataColumns() throws Exception {
+    void testIndexInfoMetaDataColumns() throws Exception {
         try (ResultSet indexInfo = dbmd.getIndexInfo(null, null, "doesnotexist", false, true)) {
             getIndexInfoDefinition.validateResultSetColumns(indexInfo);
         }
diff --git a/src/test/org/firebirdsql/jdbc/JDBCUrlPrefixTest.java b/src/test/org/firebirdsql/jdbc/JDBCUrlPrefixTest.java
index e643dcc6c..f3175f9bc 100644
--- a/src/test/org/firebirdsql/jdbc/JDBCUrlPrefixTest.java
+++ b/src/test/org/firebirdsql/jdbc/JDBCUrlPrefixTest.java
@@ -80,7 +80,7 @@ void checkGDSType(String expectedType) {
 
     @ParameterizedTest(name = "{0} => {1}")
     @MethodSource("parameters")
-    public void verifyUrl(String urlPrefix, String expectedType) throws SQLException {
+    void verifyUrl(String urlPrefix, String expectedType) throws SQLException {
         checkGDSType(expectedType);
         String url = getUrl(urlPrefix);
         try (Connection connection = DriverManager.getConnection(url, getDefaultPropertiesForConnection())) {
diff --git a/src/test/org/firebirdsql/jdbc/escape/LocateFunctionTest.java b/src/test/org/firebirdsql/jdbc/escape/LocateFunctionTest.java
index 8ae58308f..0c7f1c2ae 100644
--- a/src/test/org/firebirdsql/jdbc/escape/LocateFunctionTest.java
+++ b/src/test/org/firebirdsql/jdbc/escape/LocateFunctionTest.java
@@ -43,7 +43,7 @@ void testSingleArgument_throwsException() {
     }
 
     @Test
-    public void testFourArgument_throwsException() {
+    void testFourArgument_throwsException() {
         assertParseException(() -> function.apply("a", "b", "c", "d"),
                 "Expected 2 or 3 parameters for LOCATE, received 4");
     }
diff --git a/src/test/org/firebirdsql/jdbc/escape/OuterJoinEscapesTest.java b/src/test/org/firebirdsql/jdbc/escape/OuterJoinEscapesTest.java
index 39fd7470e..88825a9a2 100644
--- a/src/test/org/firebirdsql/jdbc/escape/OuterJoinEscapesTest.java
+++ b/src/test/org/firebirdsql/jdbc/escape/OuterJoinEscapesTest.java
@@ -142,14 +142,12 @@ void testLeftOuterJoinEscape() throws Exception {
     }
 
     @Test
-    public void testRightOuterJoinEscape() throws Exception {
+    void testRightOuterJoinEscape() throws Exception {
         try (Statement stmt = con.createStatement();
-//@formatter:off
-             ResultSet rs = stmt.executeQuery(
-                    "SELECT TAB1.ID, TAB2.ID " +
-                    "FROM {oj TAB1 RIGHT OUTER JOIN TAB2 ON TAB2.TAB1_ID = TAB1.ID} " +
-                    "ORDER BY TAB1.ID NULLS LAST")) {
-//@formatter:on
+             ResultSet rs = stmt.executeQuery("""
+                     SELECT TAB1.ID, TAB2.ID
+                     FROM {oj TAB1 RIGHT OUTER JOIN TAB2 ON TAB2.TAB1_ID = TAB1.ID}
+                     ORDER BY TAB1.ID NULLS LAST""")) {
 
             assertTrue(rs.next(), "Expected first row");
             assertEquals(1, rs.getInt(1));
diff --git a/src/test/org/firebirdsql/jdbc/metadata/ClauseTest.java b/src/test/org/firebirdsql/jdbc/metadata/ClauseTest.java
index 1553cbe29..99806bace 100644
--- a/src/test/org/firebirdsql/jdbc/metadata/ClauseTest.java
+++ b/src/test/org/firebirdsql/jdbc/metadata/ClauseTest.java
@@ -135,12 +135,12 @@ void clauseEscapedAllWildcardValue() {
     }
 
     @Test
-    public void clauseNullValue_noCondition() {
+    void clauseNullValue_noCondition() {
         validateNoCondition(null);
     }
 
     @Test
-    public void clauseAllPattern_noCondition() {
+    void clauseAllPattern_noCondition() {
         validateNoCondition("%");
     }
 
diff --git a/src/test/org/firebirdsql/jdbc/metadata/MetadataPatternMatcherTest.java b/src/test/org/firebirdsql/jdbc/metadata/MetadataPatternMatcherTest.java
index 36c196363..add2e9fcf 100644
--- a/src/test/org/firebirdsql/jdbc/metadata/MetadataPatternMatcherTest.java
+++ b/src/test/org/firebirdsql/jdbc/metadata/MetadataPatternMatcherTest.java
@@ -65,7 +65,7 @@ static Stream<Arguments> parameters() {
 
     @ParameterizedTest(name = "{index}: {0} => {1}")
     @MethodSource("parameters")
-    public void testPatternToRegex(String metadataPattern, String expectedRegexPattern) {
+    void testPatternToRegex(String metadataPattern, String expectedRegexPattern) {
         assumeThat("patternToRegex not supported for this pattern", metadataPattern, is(notNullValue()));
         assertEquals(expectedRegexPattern, MetadataPatternMatcher.patternToRegex(metadataPattern),
                 "Unexpected regex pattern for '" + metadataPattern + "'");
@@ -73,7 +73,7 @@ public void testPatternToRegex(String metadataPattern, String expectedRegexPatte
 
     @ParameterizedTest(name = "{index}: {0} => {2}")
     @MethodSource("parameters")
-    public void testMetadataPatternMatcher(String metadataPattern, String ignored, List<String> expectedMatches) {
+    void testMetadataPatternMatcher(String metadataPattern, String ignored, List<String> expectedMatches) {
         final MetadataPatternMatcher metadataPatternMatcher =
                 MetadataPattern.compile(metadataPattern).toMetadataPatternMatcher();
         Matcher<String> matchesMetadataPattern = new TypeSafeMatcher<String>() {
diff --git a/src/test/org/firebirdsql/management/FBMaintenanceManagerTest.java b/src/test/org/firebirdsql/management/FBMaintenanceManagerTest.java
index 291257e14..3b24b7a7c 100644
--- a/src/test/org/firebirdsql/management/FBMaintenanceManagerTest.java
+++ b/src/test/org/firebirdsql/management/FBMaintenanceManagerTest.java
@@ -275,7 +275,7 @@ void testSetDefaultCacheBufferNegativeCount() {
     }
 
     @Test
-    public void testSetDefaultCacheBufferTooLow() {
+    void testSetDefaultCacheBufferTooLow() {
         assertThrows(IllegalArgumentException.class, () -> maintenanceManager.setDefaultCacheBuffer(49));
     }
 
@@ -441,7 +441,7 @@ void testKillUnavailableShadows() throws Exception {
     }
 
     @Test
-    public void testGetLimboTransactions() throws Exception {
+    void testGetLimboTransactions() throws Exception {
         final int COUNT_LIMBO = 5;
         createLimboTransaction(COUNT_LIMBO);
         long[] limboTransactions = maintenanceManager.getLimboTransactions();