diff --git a/java/flight/flight-jdbc-driver/jdbc-spotbugs-exclude.xml b/java/flight/flight-jdbc-driver/jdbc-spotbugs-exclude.xml new file mode 100644 index 000000000000..c257b39ea2bf --- /dev/null +++ b/java/flight/flight-jdbc-driver/jdbc-spotbugs-exclude.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/java/flight/flight-jdbc-driver/pom.xml b/java/flight/flight-jdbc-driver/pom.xml index 85af74730e9d..480055e95f03 100644 --- a/java/flight/flight-jdbc-driver/pom.xml +++ b/java/flight/flight-jdbc-driver/pom.xml @@ -79,16 +79,6 @@ ${arrow.vector.classifier} - - org.apache.calcite.avatica - avatica - - - - org.bouncycastle - bcpkix-jdk15on - - com.google.guava guava @@ -142,6 +132,17 @@ flight-sql ${project.version} + + + org.apache.calcite.avatica + avatica + 1.18.0 + + + org.bouncycastle + bcpkix-jdk15on + 1.61 + @@ -171,6 +172,7 @@ com.github.spotbugs spotbugs-maven-plugin + jdbc-spotbugs-exclude.xml true target/spotbugs diff --git a/java/flight/flight-jdbc-driver/src/main/java/org/apache/arrow/driver/jdbc/ArrowDatabaseMetadata.java b/java/flight/flight-jdbc-driver/src/main/java/org/apache/arrow/driver/jdbc/ArrowDatabaseMetadata.java index fa2fb389b803..f2579ea03e9f 100644 --- a/java/flight/flight-jdbc-driver/src/main/java/org/apache/arrow/driver/jdbc/ArrowDatabaseMetadata.java +++ b/java/flight/flight-jdbc-driver/src/main/java/org/apache/arrow/driver/jdbc/ArrowDatabaseMetadata.java @@ -729,8 +729,8 @@ private T getSqlInfoAndCacheIfCacheIsEmpty(final SqlInfo sqlInfoCommand, final Class desiredType) throws SQLException { final ArrowFlightConnection connection = getConnection(); - final FlightInfo sqlInfo = connection.getClientHandler().getSqlInfo(); if (cachedSqlInfo.isEmpty()) { + final FlightInfo sqlInfo = connection.getClientHandler().getSqlInfo(); synchronized (cachedSqlInfo) { if (cachedSqlInfo.isEmpty()) { try (final ResultSet resultSet = diff --git a/java/flight/flight-jdbc-driver/src/main/java/org/apache/arrow/driver/jdbc/ArrowFlightConnection.java b/java/flight/flight-jdbc-driver/src/main/java/org/apache/arrow/driver/jdbc/ArrowFlightConnection.java index f5e5a3c44932..76fe70c3b63f 100644 --- a/java/flight/flight-jdbc-driver/src/main/java/org/apache/arrow/driver/jdbc/ArrowFlightConnection.java +++ b/java/flight/flight-jdbc-driver/src/main/java/org/apache/arrow/driver/jdbc/ArrowFlightConnection.java @@ -104,7 +104,11 @@ private static ArrowFlightSqlClientHandler createNewClientHandler( .withCallOptions(config.toCallOption()) .build(); } catch (final SQLException e) { - allocator.close(); + try { + allocator.close(); + } catch (final Exception allocatorCloseEx) { + e.addSuppressed(allocatorCloseEx); + } throw e; } } @@ -149,7 +153,9 @@ synchronized ExecutorService getExecutorService() { @Override public Properties getClientInfo() { - return info; + final Properties copy = new Properties(); + copy.putAll(info); + return copy; } @Override diff --git a/java/flight/flight-jdbc-driver/src/main/java/org/apache/arrow/driver/jdbc/ArrowFlightJdbcCursor.java b/java/flight/flight-jdbc-driver/src/main/java/org/apache/arrow/driver/jdbc/ArrowFlightJdbcCursor.java index 3a552256baf7..45c23e4d5298 100644 --- a/java/flight/flight-jdbc-driver/src/main/java/org/apache/arrow/driver/jdbc/ArrowFlightJdbcCursor.java +++ b/java/flight/flight-jdbc-driver/src/main/java/org/apache/arrow/driver/jdbc/ArrowFlightJdbcCursor.java @@ -78,7 +78,7 @@ private Accessor createAccessor(FieldVector vector) { */ @Override protected Getter createGetter(int column) { - throw new UnsupportedOperationException(); + throw new UnsupportedOperationException("Not allowed."); } @Override diff --git a/java/flight/flight-jdbc-driver/src/main/java/org/apache/arrow/driver/jdbc/ArrowFlightJdbcDataSource.java b/java/flight/flight-jdbc-driver/src/main/java/org/apache/arrow/driver/jdbc/ArrowFlightJdbcDataSource.java index 289887067bdb..6e60bd95d590 100644 --- a/java/flight/flight-jdbc-driver/src/main/java/org/apache/arrow/driver/jdbc/ArrowFlightJdbcDataSource.java +++ b/java/flight/flight-jdbc-driver/src/main/java/org/apache/arrow/driver/jdbc/ArrowFlightJdbcDataSource.java @@ -103,17 +103,17 @@ public T unwrap(Class aClass) throws SQLException { } @Override - public boolean isWrapperFor(Class aClass) throws SQLException { + public boolean isWrapperFor(Class aClass) { return false; } @Override - public PrintWriter getLogWriter() throws SQLException { + public PrintWriter getLogWriter() { return this.logWriter; } @Override - public void setLogWriter(PrintWriter logWriter) throws SQLException { + public void setLogWriter(PrintWriter logWriter) { this.logWriter = logWriter; } @@ -123,12 +123,12 @@ public void setLoginTimeout(int timeout) throws SQLException { } @Override - public int getLoginTimeout() throws SQLException { + public int getLoginTimeout() { return 0; } @Override - public Logger getParentLogger() throws SQLFeatureNotSupportedException { + public Logger getParentLogger() { return Logger.getLogger("ArrowFlightJdbc"); } } diff --git a/java/flight/flight-jdbc-driver/src/main/java/org/apache/arrow/driver/jdbc/ArrowFlightJdbcDriver.java b/java/flight/flight-jdbc-driver/src/main/java/org/apache/arrow/driver/jdbc/ArrowFlightJdbcDriver.java index a855b2feb51e..fc15837c4b35 100644 --- a/java/flight/flight-jdbc-driver/src/main/java/org/apache/arrow/driver/jdbc/ArrowFlightJdbcDriver.java +++ b/java/flight/flight-jdbc-driver/src/main/java/org/apache/arrow/driver/jdbc/ArrowFlightJdbcDriver.java @@ -19,6 +19,7 @@ import java.io.BufferedReader; import java.io.IOException; +import java.io.InputStream; import java.io.InputStreamReader; import java.io.Reader; import java.net.URI; @@ -47,6 +48,7 @@ public class ArrowFlightJdbcDriver extends UnregisteredDriver { private static final String CONNECT_STRING_PREFIX = "jdbc:arrow-flight://"; + private static final String CONNECTION_STRING_EXPECTED = "jdbc:arrow-flight://[host][:port][?param1=value&...]"; private static DriverVersion version; static { @@ -81,7 +83,7 @@ public ArrowFlightConnection connect(final String url, final Properties info) url, properties, new RootAllocator(Long.MAX_VALUE)); - } catch (AssertionError | FlightRuntimeException e) { + } catch (final FlightRuntimeException e) { throw new SQLException("Failed to connect.", e); } } @@ -93,41 +95,39 @@ protected String getFactoryClassName(final JdbcVersion jdbcVersion) { @Override protected DriverVersion createDriverVersion() { - - CreateVersionIfNull: - { - - if (version != null) { - break CreateVersionIfNull; + if (version == null) { + final InputStream flightProperties = this.getClass().getResourceAsStream("/properties/flight.properties"); + if (flightProperties == null) { + throw new RuntimeException("Flight Properties not found. Ensure the JAR was built properly."); } - - try (Reader reader = new BufferedReader(new InputStreamReader( - this.getClass().getResourceAsStream("/properties/flight.properties"), - StandardCharsets.UTF_8))) { + try (final Reader reader = new BufferedReader(new InputStreamReader(flightProperties, StandardCharsets.UTF_8))) { final Properties properties = new Properties(); properties.load(reader); - final String parentName = properties - .getProperty("org.apache.arrow.flight.name"); - final String parentVersion = properties - .getProperty("org.apache.arrow.flight.version"); + final String parentName = properties.getProperty("org.apache.arrow.flight.name"); + final String parentVersion = properties.getProperty("org.apache.arrow.flight.version"); final String[] pVersion = parentVersion.split("\\."); final int parentMajorVersion = Integer.parseInt(pVersion[0]); final int parentMinorVersion = Integer.parseInt(pVersion[1]); - final String childName = properties - .getProperty("org.apache.arrow.flight.jdbc-driver.name"); - final String childVersion = properties - .getProperty("org.apache.arrow.flight.jdbc-driver.version"); + final String childName = properties.getProperty("org.apache.arrow.flight.jdbc-driver.name"); + final String childVersion = properties.getProperty("org.apache.arrow.flight.jdbc-driver.version"); final String[] cVersion = childVersion.split("\\."); final int childMajorVersion = Integer.parseInt(cVersion[0]); final int childMinorVersion = Integer.parseInt(cVersion[1]); - version = new DriverVersion(childName, childVersion, parentName, - parentVersion, true, childMajorVersion, childMinorVersion, - parentMajorVersion, parentMinorVersion); + version = new DriverVersion( + childName, + childVersion, + parentName, + parentVersion, + true, + childMajorVersion, + childMinorVersion, + parentMajorVersion, + parentMinorVersion); } catch (final IOException e) { throw new RuntimeException("Failed to load driver version.", e); } @@ -138,7 +138,7 @@ protected DriverVersion createDriverVersion() { @Override public Meta createMeta(final AvaticaConnection connection) { - return new ArrowFlightMetaImpl((ArrowFlightConnection) connection); + return new ArrowFlightMetaImpl(connection); } @Override @@ -147,7 +147,7 @@ protected String getConnectStringPrefix() { } @Override - public boolean acceptsURL(final String url) throws SQLException { + public boolean acceptsURL(final String url) { return Preconditions.checkNotNull(url).startsWith(CONNECT_STRING_PREFIX); } @@ -218,7 +218,8 @@ private Map getUrlsArgs(String url) */ if (!url.startsWith("jdbc:")) { - throw new SQLException("Malformed/invalid URL!"); + throw new SQLException("Connection string must start with 'jdbc:'. Expected format: " + + CONNECTION_STRING_EXPECTED); } // It's necessary to use a string without "jdbc:" at the beginning to be parsed as a valid URL. @@ -233,7 +234,8 @@ private Map getUrlsArgs(String url) } if (!Objects.equals(uri.getScheme(), "arrow-flight")) { - throw new SQLException("Malformed/invalid URL!"); + throw new SQLException("URL Scheme must be 'arrow-flight'. Expected format: " + + CONNECTION_STRING_EXPECTED); } @@ -244,8 +246,7 @@ private Map getUrlsArgs(String url) final String extraParams = uri.getRawQuery(); // optional params - final List keyValuePairs = - URLEncodedUtils.parse(extraParams, StandardCharsets.UTF_8); + final List keyValuePairs = URLEncodedUtils.parse(extraParams, StandardCharsets.UTF_8); keyValuePairs.forEach(p -> resultMap.put(p.getName(), p.getValue())); return resultMap; diff --git a/java/flight/flight-jdbc-driver/src/main/java/org/apache/arrow/driver/jdbc/ArrowFlightJdbcFactory.java b/java/flight/flight-jdbc-driver/src/main/java/org/apache/arrow/driver/jdbc/ArrowFlightJdbcFactory.java index 94cc97c9ea06..a54fbb9511b5 100644 --- a/java/flight/flight-jdbc-driver/src/main/java/org/apache/arrow/driver/jdbc/ArrowFlightJdbcFactory.java +++ b/java/flight/flight-jdbc-driver/src/main/java/org/apache/arrow/driver/jdbc/ArrowFlightJdbcFactory.java @@ -68,7 +68,7 @@ public AvaticaStatement newStatement( final Meta.StatementHandle handle, final int resultType, final int resultSetConcurrency, - final int resultSetHoldability) throws SQLException { + final int resultSetHoldability) { return new ArrowFlightStatement((ArrowFlightConnection) connection, handle, resultType, resultSetConcurrency, resultSetHoldability); } @@ -107,7 +107,7 @@ public AvaticaSpecificDatabaseMetaData newDatabaseMetaData(final AvaticaConnecti @Override public ResultSetMetaData newResultSetMetaData( final AvaticaStatement avaticaStatement, - final Meta.Signature signature) throws SQLException { + final Meta.Signature signature) { return new AvaticaResultSetMetaData(avaticaStatement, null, signature); } diff --git a/java/flight/flight-jdbc-driver/src/main/java/org/apache/arrow/driver/jdbc/ArrowFlightJdbcVectorSchemaRootResultSet.java b/java/flight/flight-jdbc-driver/src/main/java/org/apache/arrow/driver/jdbc/ArrowFlightJdbcVectorSchemaRootResultSet.java index 6e19d1272f42..9e377e51decc 100644 --- a/java/flight/flight-jdbc-driver/src/main/java/org/apache/arrow/driver/jdbc/ArrowFlightJdbcVectorSchemaRootResultSet.java +++ b/java/flight/flight-jdbc-driver/src/main/java/org/apache/arrow/driver/jdbc/ArrowFlightJdbcVectorSchemaRootResultSet.java @@ -89,7 +89,7 @@ public static ArrowFlightJdbcVectorSchemaRootResultSet fromVectorSchemaRoot( @Override protected AvaticaResultSet execute() throws SQLException { - throw new RuntimeException(); + throw new RuntimeException("Can only execute with execute(VectorSchemaRoot)"); } void execute(final VectorSchemaRoot vectorSchemaRoot) { diff --git a/java/flight/flight-jdbc-driver/src/main/java/org/apache/arrow/driver/jdbc/ArrowFlightMetaImpl.java b/java/flight/flight-jdbc-driver/src/main/java/org/apache/arrow/driver/jdbc/ArrowFlightMetaImpl.java index f75c94532400..cc7addc3a74d 100644 --- a/java/flight/flight-jdbc-driver/src/main/java/org/apache/arrow/driver/jdbc/ArrowFlightMetaImpl.java +++ b/java/flight/flight-jdbc-driver/src/main/java/org/apache/arrow/driver/jdbc/ArrowFlightMetaImpl.java @@ -99,8 +99,8 @@ public ExecuteResult execute(final StatementHandle statementHandle, @Override public ExecuteBatchResult executeBatch(final StatementHandle statementHandle, final List> parameterValuesList) - throws NoSuchStatementException { - throw new IllegalStateException(); + throws IllegalStateException { + throw new IllegalStateException("executeBatch not implemented."); } @Override diff --git a/java/flight/flight-jdbc-driver/src/main/java/org/apache/arrow/driver/jdbc/accessor/ArrowFlightJdbcAccessor.java b/java/flight/flight-jdbc-driver/src/main/java/org/apache/arrow/driver/jdbc/accessor/ArrowFlightJdbcAccessor.java index e095fd928e58..3821ee1dc875 100644 --- a/java/flight/flight-jdbc-driver/src/main/java/org/apache/arrow/driver/jdbc/accessor/ArrowFlightJdbcAccessor.java +++ b/java/flight/flight-jdbc-driver/src/main/java/org/apache/arrow/driver/jdbc/accessor/ArrowFlightJdbcAccessor.java @@ -17,7 +17,6 @@ package org.apache.arrow.driver.jdbc.accessor; -import static org.apache.arrow.driver.jdbc.utils.ExceptionTemplateThrower.getOperationNotSupported; import static org.apache.calcite.avatica.util.Cursor.Accessor; import java.io.InputStream; @@ -250,4 +249,8 @@ public T getObject(final Class type) throws SQLException { } return !type.isPrimitive() && wasNull ? null : type.cast(value); } + + private static SQLException getOperationNotSupported(final Class type) { + return new SQLException(String.format("Operation not supported for type: %s.", type.getName())); + } } diff --git a/java/flight/flight-jdbc-driver/src/main/java/org/apache/arrow/driver/jdbc/accessor/ArrowFlightJdbcAccessorFactory.java b/java/flight/flight-jdbc-driver/src/main/java/org/apache/arrow/driver/jdbc/accessor/ArrowFlightJdbcAccessorFactory.java index 648b5dfd0850..813b40a8070f 100644 --- a/java/flight/flight-jdbc-driver/src/main/java/org/apache/arrow/driver/jdbc/accessor/ArrowFlightJdbcAccessorFactory.java +++ b/java/flight/flight-jdbc-driver/src/main/java/org/apache/arrow/driver/jdbc/accessor/ArrowFlightJdbcAccessorFactory.java @@ -83,7 +83,7 @@ public class ArrowFlightJdbcAccessorFactory { /** - * Create an accessor according to the its type. + * Create an accessor according to its type. * * @param vector an instance of an arrow vector. * @param getCurrentRow a supplier to check which row is being accessed. diff --git a/java/flight/flight-jdbc-driver/src/main/java/org/apache/arrow/driver/jdbc/accessor/impl/calendar/ArrowFlightJdbcDateVectorGetter.java b/java/flight/flight-jdbc-driver/src/main/java/org/apache/arrow/driver/jdbc/accessor/impl/calendar/ArrowFlightJdbcDateVectorGetter.java index 52ccea6db3f3..ea545851a3ae 100644 --- a/java/flight/flight-jdbc-driver/src/main/java/org/apache/arrow/driver/jdbc/accessor/impl/calendar/ArrowFlightJdbcDateVectorGetter.java +++ b/java/flight/flight-jdbc-driver/src/main/java/org/apache/arrow/driver/jdbc/accessor/impl/calendar/ArrowFlightJdbcDateVectorGetter.java @@ -35,8 +35,8 @@ private ArrowFlightJdbcDateVectorGetter() { * Auxiliary class meant to unify Date*Vector#get implementations with different classes of ValueHolders. */ static class Holder { - int isSet; - long value; + int isSet; // Tells if value is set; 0 = not set, 1 = set + long value; // Holds actual value in its respective timeunit } /** diff --git a/java/flight/flight-jdbc-driver/src/main/java/org/apache/arrow/driver/jdbc/accessor/impl/calendar/ArrowFlightJdbcIntervalVectorAccessor.java b/java/flight/flight-jdbc-driver/src/main/java/org/apache/arrow/driver/jdbc/accessor/impl/calendar/ArrowFlightJdbcIntervalVectorAccessor.java index 577bb54108e6..bae052bf02d8 100644 --- a/java/flight/flight-jdbc-driver/src/main/java/org/apache/arrow/driver/jdbc/accessor/impl/calendar/ArrowFlightJdbcIntervalVectorAccessor.java +++ b/java/flight/flight-jdbc-driver/src/main/java/org/apache/arrow/driver/jdbc/accessor/impl/calendar/ArrowFlightJdbcIntervalVectorAccessor.java @@ -92,11 +92,11 @@ public Class getObjectClass() { @Override public String getString() { - StringBuilder stringBuilder = this.stringBuilderGetter.get(getCurrentRow()); + StringBuilder stringBuilder = stringBuilderGetter.get(getCurrentRow()); this.wasNull = stringBuilder == null; this.wasNullConsumer.setWasNull(this.wasNull); - if (this.wasNull) { + if (stringBuilder == null) { return null; } diff --git a/java/flight/flight-jdbc-driver/src/main/java/org/apache/arrow/driver/jdbc/accessor/impl/calendar/ArrowFlightJdbcTimeStampVectorGetter.java b/java/flight/flight-jdbc-driver/src/main/java/org/apache/arrow/driver/jdbc/accessor/impl/calendar/ArrowFlightJdbcTimeStampVectorGetter.java index 22f2ffa6561e..03fb35face72 100644 --- a/java/flight/flight-jdbc-driver/src/main/java/org/apache/arrow/driver/jdbc/accessor/impl/calendar/ArrowFlightJdbcTimeStampVectorGetter.java +++ b/java/flight/flight-jdbc-driver/src/main/java/org/apache/arrow/driver/jdbc/accessor/impl/calendar/ArrowFlightJdbcTimeStampVectorGetter.java @@ -48,8 +48,8 @@ private ArrowFlightJdbcTimeStampVectorGetter() { * Auxiliary class meant to unify TimeStamp*Vector#get implementations with different classes of ValueHolders. */ static class Holder { - int isSet; - long value; + int isSet; // Tells if value is set; 0 = not set, 1 = set + long value; // Holds actual value in its respective timeunit } /** diff --git a/java/flight/flight-jdbc-driver/src/main/java/org/apache/arrow/driver/jdbc/accessor/impl/calendar/ArrowFlightJdbcTimeVectorGetter.java b/java/flight/flight-jdbc-driver/src/main/java/org/apache/arrow/driver/jdbc/accessor/impl/calendar/ArrowFlightJdbcTimeVectorGetter.java index d2873bea4e89..fb254c694014 100644 --- a/java/flight/flight-jdbc-driver/src/main/java/org/apache/arrow/driver/jdbc/accessor/impl/calendar/ArrowFlightJdbcTimeVectorGetter.java +++ b/java/flight/flight-jdbc-driver/src/main/java/org/apache/arrow/driver/jdbc/accessor/impl/calendar/ArrowFlightJdbcTimeVectorGetter.java @@ -39,8 +39,8 @@ private ArrowFlightJdbcTimeVectorGetter() { * Auxiliary class meant to unify TimeStamp*Vector#get implementations with different classes of ValueHolders. */ static class Holder { - int isSet; - long value; + int isSet; // Tells if value is set; 0 = not set, 1 = set + long value; // Holds actual value in its respective timeunit } /** diff --git a/java/flight/flight-jdbc-driver/src/main/java/org/apache/arrow/driver/jdbc/accessor/impl/numeric/ArrowFlightJdbcBaseIntVectorAccessor.java b/java/flight/flight-jdbc-driver/src/main/java/org/apache/arrow/driver/jdbc/accessor/impl/numeric/ArrowFlightJdbcBaseIntVectorAccessor.java index d89c96b798da..aea9b75fa6c3 100644 --- a/java/flight/flight-jdbc-driver/src/main/java/org/apache/arrow/driver/jdbc/accessor/impl/numeric/ArrowFlightJdbcBaseIntVectorAccessor.java +++ b/java/flight/flight-jdbc-driver/src/main/java/org/apache/arrow/driver/jdbc/accessor/impl/numeric/ArrowFlightJdbcBaseIntVectorAccessor.java @@ -189,7 +189,7 @@ public Number getObject() { number = getLong(); break; default: - throw new IllegalStateException(); + throw new IllegalStateException("No valid MinorType was provided."); } return wasNull ? null : number; } diff --git a/java/flight/flight-jdbc-driver/src/main/java/org/apache/arrow/driver/jdbc/accessor/impl/numeric/ArrowFlightJdbcBitVectorAccessor.java b/java/flight/flight-jdbc-driver/src/main/java/org/apache/arrow/driver/jdbc/accessor/impl/numeric/ArrowFlightJdbcBitVectorAccessor.java index c28f931be50a..777b3eca212d 100644 --- a/java/flight/flight-jdbc-driver/src/main/java/org/apache/arrow/driver/jdbc/accessor/impl/numeric/ArrowFlightJdbcBitVectorAccessor.java +++ b/java/flight/flight-jdbc-driver/src/main/java/org/apache/arrow/driver/jdbc/accessor/impl/numeric/ArrowFlightJdbcBitVectorAccessor.java @@ -51,7 +51,7 @@ public ArrowFlightJdbcBitVectorAccessor(BitVector vector, IntSupplier currentRow @Override public Class getObjectClass() { - return Long.class; + return Boolean.class; } @Override diff --git a/java/flight/flight-jdbc-driver/src/main/java/org/apache/arrow/driver/jdbc/accessor/impl/numeric/ArrowFlightJdbcFloat4VectorAccessor.java b/java/flight/flight-jdbc-driver/src/main/java/org/apache/arrow/driver/jdbc/accessor/impl/numeric/ArrowFlightJdbcFloat4VectorAccessor.java index 2c116dacb3d0..230732779242 100644 --- a/java/flight/flight-jdbc-driver/src/main/java/org/apache/arrow/driver/jdbc/accessor/impl/numeric/ArrowFlightJdbcFloat4VectorAccessor.java +++ b/java/flight/flight-jdbc-driver/src/main/java/org/apache/arrow/driver/jdbc/accessor/impl/numeric/ArrowFlightJdbcFloat4VectorAccessor.java @@ -20,6 +20,7 @@ import java.math.BigDecimal; import java.math.RoundingMode; import java.nio.ByteBuffer; +import java.sql.SQLException; import java.util.function.IntSupplier; import org.apache.arrow.driver.jdbc.accessor.ArrowFlightJdbcAccessor; @@ -106,12 +107,11 @@ public double getDouble() { } @Override - public BigDecimal getBigDecimal() { + public BigDecimal getBigDecimal() throws SQLException { final float value = this.getFloat(); - final boolean infinite = Float.isInfinite(value); - if (infinite) { - throw new UnsupportedOperationException(); + if (Float.isInfinite(value) || Float.isNaN(value)) { + throw new SQLException("BigDecimal doesn't support Infinite/NaN."); } return this.wasNull ? null : BigDecimal.valueOf(value); @@ -125,10 +125,12 @@ public byte[] getBytes() { } @Override - public BigDecimal getBigDecimal(int scale) { - final BigDecimal value = - BigDecimal.valueOf(this.getFloat()).setScale(scale, RoundingMode.HALF_UP); - return this.wasNull ? null : value; + public BigDecimal getBigDecimal(int scale) throws SQLException { + final float value = this.getFloat(); + if (Float.isInfinite(value) || Float.isNaN(value)) { + throw new SQLException("BigDecimal doesn't support Infinite/NaN."); + } + return this.wasNull ? null : BigDecimal.valueOf(value).setScale(scale, RoundingMode.HALF_UP); } @Override diff --git a/java/flight/flight-jdbc-driver/src/main/java/org/apache/arrow/driver/jdbc/accessor/impl/numeric/ArrowFlightJdbcFloat8VectorAccessor.java b/java/flight/flight-jdbc-driver/src/main/java/org/apache/arrow/driver/jdbc/accessor/impl/numeric/ArrowFlightJdbcFloat8VectorAccessor.java index e29981d1b13e..00b2768f7fd3 100644 --- a/java/flight/flight-jdbc-driver/src/main/java/org/apache/arrow/driver/jdbc/accessor/impl/numeric/ArrowFlightJdbcFloat8VectorAccessor.java +++ b/java/flight/flight-jdbc-driver/src/main/java/org/apache/arrow/driver/jdbc/accessor/impl/numeric/ArrowFlightJdbcFloat8VectorAccessor.java @@ -20,6 +20,7 @@ import java.math.BigDecimal; import java.math.RoundingMode; import java.nio.ByteBuffer; +import java.sql.SQLException; import java.util.function.IntSupplier; import org.apache.arrow.driver.jdbc.accessor.ArrowFlightJdbcAccessor; @@ -112,16 +113,21 @@ public float getFloat() { } @Override - public BigDecimal getBigDecimal() { - final BigDecimal value = BigDecimal.valueOf(this.getDouble()); - return this.wasNull ? null : value; + public BigDecimal getBigDecimal() throws SQLException { + final double value = this.getDouble(); + if (Double.isInfinite(value) || Double.isNaN(value)) { + throw new SQLException("BigDecimal doesn't support Infinite/NaN."); + } + return this.wasNull ? null : BigDecimal.valueOf(value); } @Override - public BigDecimal getBigDecimal(int scale) { - final BigDecimal value = - BigDecimal.valueOf(this.getDouble()).setScale(scale, RoundingMode.HALF_UP); - return this.wasNull ? null : value; + public BigDecimal getBigDecimal(int scale) throws SQLException { + final double value = this.getDouble(); + if (Double.isInfinite(value) || Double.isNaN(value)) { + throw new SQLException("BigDecimal doesn't support Infinite/NaN."); + } + return this.wasNull ? null : BigDecimal.valueOf(value).setScale(scale, RoundingMode.HALF_UP); } @Override diff --git a/java/flight/flight-jdbc-driver/src/main/java/org/apache/arrow/driver/jdbc/accessor/impl/numeric/ArrowFlightJdbcNumericGetter.java b/java/flight/flight-jdbc-driver/src/main/java/org/apache/arrow/driver/jdbc/accessor/impl/numeric/ArrowFlightJdbcNumericGetter.java index b88ed4e7c589..cc802a0089d3 100644 --- a/java/flight/flight-jdbc-driver/src/main/java/org/apache/arrow/driver/jdbc/accessor/impl/numeric/ArrowFlightJdbcNumericGetter.java +++ b/java/flight/flight-jdbc-driver/src/main/java/org/apache/arrow/driver/jdbc/accessor/impl/numeric/ArrowFlightJdbcNumericGetter.java @@ -44,8 +44,8 @@ class ArrowFlightJdbcNumericGetter { * A holder for values from the {@link BaseIntVector}. */ static class NumericHolder { - int isSet; - long value; + int isSet; // Tells if value is set; 0 = not set, 1 = set + long value; // Holds actual value } /** @@ -82,7 +82,7 @@ static Getter createGetter(BaseIntVector vector) { return createGetter((BigIntVector) vector); } - throw new UnsupportedOperationException(); + throw new UnsupportedOperationException("No valid IntVector was provided."); } /** diff --git a/java/flight/flight-jdbc-driver/src/main/java/org/apache/arrow/driver/jdbc/client/ArrowFlightSqlClientHandler.java b/java/flight/flight-jdbc-driver/src/main/java/org/apache/arrow/driver/jdbc/client/ArrowFlightSqlClientHandler.java index ae4bbdddc3d8..62156a037c28 100644 --- a/java/flight/flight-jdbc-driver/src/main/java/org/apache/arrow/driver/jdbc/client/ArrowFlightSqlClientHandler.java +++ b/java/flight/flight-jdbc-driver/src/main/java/org/apache/arrow/driver/jdbc/client/ArrowFlightSqlClientHandler.java @@ -33,6 +33,7 @@ import org.apache.arrow.flight.FlightClientMiddleware; import org.apache.arrow.flight.FlightEndpoint; import org.apache.arrow.flight.FlightInfo; +import org.apache.arrow.flight.FlightRuntimeException; import org.apache.arrow.flight.FlightStream; import org.apache.arrow.flight.Location; import org.apache.arrow.flight.auth2.BearerCredentialWriter; @@ -441,7 +442,8 @@ public Builder withToken(final String token) { * @return this instance. */ public Builder withBufferAllocator(final BufferAllocator allocator) { - this.allocator = allocator; + this.allocator = allocator + .newChildAllocator("ArrowFlightSqlClientHandler", 0, allocator.getLimit()); return this; } @@ -495,6 +497,7 @@ public Builder withCallOptions(final Collection options) { * @throws SQLException on error. */ public ArrowFlightSqlClientHandler build() throws SQLException { + FlightClient client = null; try { ClientIncomingAuthHeaderMiddleware.Factory authFactory = null; if (username != null) { @@ -517,7 +520,7 @@ public ArrowFlightSqlClientHandler build() throws SQLException { clientBuilder.trustedCertificates( ClientAuthenticationUtils.getCertificateStream(keyStorePath, keyStorePassword)); } - final FlightClient client = clientBuilder.build(); + client = clientBuilder.build(); if (authFactory != null) { options.add( ClientAuthenticationUtils.getAuthenticate(client, username, password, authFactory)); @@ -527,8 +530,17 @@ public ArrowFlightSqlClientHandler build() throws SQLException { client, new CredentialCallOption(new BearerCredentialWriter(token)))); } return ArrowFlightSqlClientHandler.createNewHandler(client, options); - } catch (final IllegalArgumentException | GeneralSecurityException | IOException e) { - throw new SQLException(e); + + } catch (final IllegalArgumentException | GeneralSecurityException | IOException | FlightRuntimeException e) { + final SQLException originalException = new SQLException(e); + if (client != null) { + try { + client.close(); + } catch (final InterruptedException interruptedException) { + originalException.addSuppressed(interruptedException); + } + } + throw originalException; } } } diff --git a/java/flight/flight-jdbc-driver/src/main/java/org/apache/arrow/driver/jdbc/utils/ExceptionTemplateThrower.java b/java/flight/flight-jdbc-driver/src/main/java/org/apache/arrow/driver/jdbc/utils/ExceptionTemplateThrower.java deleted file mode 100644 index 7f4ab1e16514..000000000000 --- a/java/flight/flight-jdbc-driver/src/main/java/org/apache/arrow/driver/jdbc/utils/ExceptionTemplateThrower.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.apache.arrow.driver.jdbc.utils; - -import static java.lang.String.format; - -import java.sql.SQLException; - -import org.apache.calcite.avatica.util.Cursor.Accessor; - -/** - * Utility class for managing exceptions thrown by - * {@link Accessor}s. - */ -public final class ExceptionTemplateThrower { - - private ExceptionTemplateThrower() { - // Prevent instantiation. - } - - /** - * Gets a {@link Exception} for an attempt to perform a conversion - * not yet supported by the {@link Accessor} in use. - * - * @return the exception. - */ - public static SQLException getOperationNotSupported(final Class type) { - return new SQLException( - format("Operation not supported for type: %s.", type.getName())); - } -} diff --git a/java/flight/flight-jdbc-driver/src/main/java/org/apache/arrow/driver/jdbc/utils/VectorSchemaRootTransformer.java b/java/flight/flight-jdbc-driver/src/main/java/org/apache/arrow/driver/jdbc/utils/VectorSchemaRootTransformer.java index cbb9eda0c757..3bab918c83aa 100644 --- a/java/flight/flight-jdbc-driver/src/main/java/org/apache/arrow/driver/jdbc/utils/VectorSchemaRootTransformer.java +++ b/java/flight/flight-jdbc-driver/src/main/java/org/apache/arrow/driver/jdbc/utils/VectorSchemaRootTransformer.java @@ -45,14 +45,6 @@ VectorSchemaRoot transform(VectorSchemaRoot originalRoot, VectorSchemaRoot trans */ class Builder { - /** - * Functional interface used to a task to transform a VectorSchemaRoot into a new VectorSchemaRoot. - */ - @FunctionalInterface - interface Task { - void run(VectorSchemaRoot originalRoot, VectorSchemaRoot transformedRoot); - } - private final Schema schema; private final BufferAllocator bufferAllocator; private final List newFields = new ArrayList<>(); @@ -60,7 +52,8 @@ interface Task { public Builder(final Schema schema, final BufferAllocator bufferAllocator) { this.schema = schema; - this.bufferAllocator = bufferAllocator; + this.bufferAllocator = bufferAllocator + .newChildAllocator("VectorSchemaRootTransformer", 0, bufferAllocator.getLimit()); } /** @@ -149,5 +142,13 @@ public VectorSchemaRootTransformer build() { return transformedRoot; }; } + + /** + * Functional interface used to a task to transform a VectorSchemaRoot into a new VectorSchemaRoot. + */ + @FunctionalInterface + interface Task { + void run(VectorSchemaRoot originalRoot, VectorSchemaRoot transformedRoot); + } } } diff --git a/java/flight/flight-jdbc-driver/src/test/java/org/apache/arrow/driver/jdbc/ArrowDatabaseMetadataTest.java b/java/flight/flight-jdbc-driver/src/test/java/org/apache/arrow/driver/jdbc/ArrowDatabaseMetadataTest.java index a3cd501beba5..74b2f6afa72f 100644 --- a/java/flight/flight-jdbc-driver/src/test/java/org/apache/arrow/driver/jdbc/ArrowDatabaseMetadataTest.java +++ b/java/flight/flight-jdbc-driver/src/test/java/org/apache/arrow/driver/jdbc/ArrowDatabaseMetadataTest.java @@ -26,7 +26,7 @@ import static java.util.Collections.singletonList; import static java.util.stream.Collectors.toList; import static java.util.stream.IntStream.range; -import static org.apache.arrow.driver.jdbc.adhoc.MockFlightSqlProducer.serializeSchema; +import static org.apache.arrow.driver.jdbc.utils.MockFlightSqlProducer.serializeSchema; import static org.apache.arrow.flight.sql.impl.FlightSql.CommandGetCrossReference; import static org.apache.arrow.flight.sql.impl.FlightSql.SqlSupportsConvert.SQL_CONVERT_BIGINT_VALUE; import static org.apache.arrow.flight.sql.impl.FlightSql.SqlSupportsConvert.SQL_CONVERT_BIT_VALUE; @@ -46,8 +46,9 @@ import java.util.Objects; import java.util.function.Consumer; -import org.apache.arrow.driver.jdbc.adhoc.MockFlightSqlProducer; +import org.apache.arrow.driver.jdbc.utils.MockFlightSqlProducer; import org.apache.arrow.driver.jdbc.utils.ResultSetTestUtils; +import org.apache.arrow.driver.jdbc.utils.ThrowableAssertionUtils; import org.apache.arrow.flight.FlightProducer.ServerStreamListener; import org.apache.arrow.flight.sql.FlightSqlProducer.Schemas; import org.apache.arrow.flight.sql.impl.FlightSql; @@ -602,7 +603,7 @@ public static void setUpBeforeClass() throws SQLException { @AfterClass public static void tearDown() throws Exception { - AutoCloseables.close(connection, FLIGHT_SERVER_TEST_RULE, FLIGHT_SQL_PRODUCER); + AutoCloseables.close(connection, FLIGHT_SQL_PRODUCER); } @@ -915,9 +916,9 @@ public void testGetSqlInfo() throws SQLException { collector.checkThat(metaData.supportsDifferentTableCorrelationNames(), is(EXPECTED_SUPPORTS_DIFFERENT_TABLE_CORRELATION_NAMES)); - collector.checkThrows(SQLException.class, + ThrowableAssertionUtils.simpleAssertThrowableClass(SQLException.class, () -> metaData.supportsTransactionIsolationLevel(Connection.TRANSACTION_SERIALIZABLE + 1)); - collector.checkThrows(SQLException.class, + ThrowableAssertionUtils.simpleAssertThrowableClass(SQLException.class, () -> metaData.supportsResultSetType(ResultSet.HOLD_CURSORS_OVER_COMMIT)); } diff --git a/java/flight/flight-jdbc-driver/src/test/java/org/apache/arrow/driver/jdbc/ArrowFlightJdbcConnectionCookieTest.java b/java/flight/flight-jdbc-driver/src/test/java/org/apache/arrow/driver/jdbc/ArrowFlightJdbcConnectionCookieTest.java index 7399e3812631..da6c034ce1bf 100644 --- a/java/flight/flight-jdbc-driver/src/test/java/org/apache/arrow/driver/jdbc/ArrowFlightJdbcConnectionCookieTest.java +++ b/java/flight/flight-jdbc-driver/src/test/java/org/apache/arrow/driver/jdbc/ArrowFlightJdbcConnectionCookieTest.java @@ -21,7 +21,7 @@ import java.sql.SQLException; import java.sql.Statement; -import org.apache.arrow.driver.jdbc.adhoc.CoreMockedSqlProducers; +import org.apache.arrow.driver.jdbc.utils.CoreMockedSqlProducers; import org.junit.Assert; import org.junit.ClassRule; import org.junit.Rule; diff --git a/java/flight/flight-jdbc-driver/src/test/java/org/apache/arrow/driver/jdbc/ArrowFlightJdbcConnectionPoolDataSourceTest.java b/java/flight/flight-jdbc-driver/src/test/java/org/apache/arrow/driver/jdbc/ArrowFlightJdbcConnectionPoolDataSourceTest.java index 9dd7e74a93ad..9237f14f700f 100644 --- a/java/flight/flight-jdbc-driver/src/test/java/org/apache/arrow/driver/jdbc/ArrowFlightJdbcConnectionPoolDataSourceTest.java +++ b/java/flight/flight-jdbc-driver/src/test/java/org/apache/arrow/driver/jdbc/ArrowFlightJdbcConnectionPoolDataSourceTest.java @@ -21,9 +21,9 @@ import javax.sql.PooledConnection; -import org.apache.arrow.driver.jdbc.adhoc.MockFlightSqlProducer; import org.apache.arrow.driver.jdbc.authentication.UserPasswordAuthentication; import org.apache.arrow.driver.jdbc.utils.ConnectionWrapper; +import org.apache.arrow.driver.jdbc.utils.MockFlightSqlProducer; import org.junit.After; import org.junit.Assert; import org.junit.Before; diff --git a/java/flight/flight-jdbc-driver/src/test/java/org/apache/arrow/driver/jdbc/ArrowFlightJdbcCursorTest.java b/java/flight/flight-jdbc-driver/src/test/java/org/apache/arrow/driver/jdbc/ArrowFlightJdbcCursorTest.java index c481a6729463..b818f7115b7f 100644 --- a/java/flight/flight-jdbc-driver/src/test/java/org/apache/arrow/driver/jdbc/ArrowFlightJdbcCursorTest.java +++ b/java/flight/flight-jdbc-driver/src/test/java/org/apache/arrow/driver/jdbc/ArrowFlightJdbcCursorTest.java @@ -52,8 +52,8 @@ import org.apache.arrow.vector.types.pojo.FieldType; import org.apache.arrow.vector.types.pojo.Schema; import org.apache.calcite.avatica.util.Cursor; +import org.junit.After; import org.junit.Test; -import org.junit.jupiter.api.AfterEach; import com.google.common.collect.ImmutableList; @@ -65,7 +65,7 @@ public class ArrowFlightJdbcCursorTest { ArrowFlightJdbcCursor cursor; BufferAllocator allocator; - @AfterEach + @After public void cleanUp() { allocator.close(); cursor.close(); @@ -191,7 +191,7 @@ public void testBitVectorNullTrue() throws SQLException { @Test public void testDecimalVectorNullTrue() throws SQLException { final VectorSchemaRoot root = getVectorSchemaRoot("Decimal", - new ArrowType.Decimal(2, 2), null); + new ArrowType.Decimal(2, 2, 128), null); ((DecimalVector) root.getVector("Decimal")).setNull(0); testCursorWasNull(root); } diff --git a/java/flight/flight-jdbc-driver/src/test/java/org/apache/arrow/driver/jdbc/ArrowFlightJdbcDriverTest.java b/java/flight/flight-jdbc-driver/src/test/java/org/apache/arrow/driver/jdbc/ArrowFlightJdbcDriverTest.java index 67d975d4b48f..c3a8f326e90d 100644 --- a/java/flight/flight-jdbc-driver/src/test/java/org/apache/arrow/driver/jdbc/ArrowFlightJdbcDriverTest.java +++ b/java/flight/flight-jdbc-driver/src/test/java/org/apache/arrow/driver/jdbc/ArrowFlightJdbcDriverTest.java @@ -28,9 +28,9 @@ import java.util.Collection; import java.util.Map; -import org.apache.arrow.driver.jdbc.adhoc.MockFlightSqlProducer; import org.apache.arrow.driver.jdbc.authentication.UserPasswordAuthentication; import org.apache.arrow.driver.jdbc.utils.ArrowFlightConnectionConfigImpl.ArrowFlightConnectionProperty; +import org.apache.arrow.driver.jdbc.utils.MockFlightSqlProducer; import org.apache.arrow.memory.BufferAllocator; import org.apache.arrow.memory.RootAllocator; import org.apache.arrow.util.AutoCloseables; diff --git a/java/flight/flight-jdbc-driver/src/test/java/org/apache/arrow/driver/jdbc/ArrowFlightJdbcFactoryTest.java b/java/flight/flight-jdbc-driver/src/test/java/org/apache/arrow/driver/jdbc/ArrowFlightJdbcFactoryTest.java index 675ae4681007..4f48b16c4888 100644 --- a/java/flight/flight-jdbc-driver/src/test/java/org/apache/arrow/driver/jdbc/ArrowFlightJdbcFactoryTest.java +++ b/java/flight/flight-jdbc-driver/src/test/java/org/apache/arrow/driver/jdbc/ArrowFlightJdbcFactoryTest.java @@ -21,9 +21,9 @@ import java.sql.Connection; import java.util.Properties; -import org.apache.arrow.driver.jdbc.adhoc.MockFlightSqlProducer; import org.apache.arrow.driver.jdbc.authentication.UserPasswordAuthentication; import org.apache.arrow.driver.jdbc.utils.ArrowFlightConnectionConfigImpl.ArrowFlightConnectionProperty; +import org.apache.arrow.driver.jdbc.utils.MockFlightSqlProducer; import org.apache.arrow.memory.BufferAllocator; import org.apache.arrow.memory.RootAllocator; import org.apache.arrow.util.AutoCloseables; diff --git a/java/flight/flight-jdbc-driver/src/test/java/org/apache/arrow/driver/jdbc/ArrowFlightPreparedStatementTest.java b/java/flight/flight-jdbc-driver/src/test/java/org/apache/arrow/driver/jdbc/ArrowFlightPreparedStatementTest.java index 52825d14313d..e43d07521a47 100644 --- a/java/flight/flight-jdbc-driver/src/test/java/org/apache/arrow/driver/jdbc/ArrowFlightPreparedStatementTest.java +++ b/java/flight/flight-jdbc-driver/src/test/java/org/apache/arrow/driver/jdbc/ArrowFlightPreparedStatementTest.java @@ -24,7 +24,7 @@ import java.sql.ResultSet; import java.sql.SQLException; -import org.apache.arrow.driver.jdbc.adhoc.CoreMockedSqlProducers; +import org.apache.arrow.driver.jdbc.utils.CoreMockedSqlProducers; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.ClassRule; diff --git a/java/flight/flight-jdbc-driver/src/test/java/org/apache/arrow/driver/jdbc/ArrowFlightStatementExecuteTest.java b/java/flight/flight-jdbc-driver/src/test/java/org/apache/arrow/driver/jdbc/ArrowFlightStatementExecuteTest.java index 226e868de787..0d780c8aa0c1 100644 --- a/java/flight/flight-jdbc-driver/src/test/java/org/apache/arrow/driver/jdbc/ArrowFlightStatementExecuteTest.java +++ b/java/flight/flight-jdbc-driver/src/test/java/org/apache/arrow/driver/jdbc/ArrowFlightStatementExecuteTest.java @@ -33,7 +33,7 @@ import java.util.stream.Collectors; import java.util.stream.IntStream; -import org.apache.arrow.driver.jdbc.adhoc.MockFlightSqlProducer; +import org.apache.arrow.driver.jdbc.utils.MockFlightSqlProducer; import org.apache.arrow.memory.BufferAllocator; import org.apache.arrow.memory.RootAllocator; import org.apache.arrow.util.AutoCloseables; @@ -114,7 +114,7 @@ public void tearDown() throws Exception { @AfterClass public static void tearDownAfterClass() throws Exception { - AutoCloseables.close(SERVER_TEST_RULE, PRODUCER); + AutoCloseables.close(PRODUCER); } @Test diff --git a/java/flight/flight-jdbc-driver/src/test/java/org/apache/arrow/driver/jdbc/ArrowFlightStatementExecuteUpdateTest.java b/java/flight/flight-jdbc-driver/src/test/java/org/apache/arrow/driver/jdbc/ArrowFlightStatementExecuteUpdateTest.java index d3ed65651aff..b14fb003c8f1 100644 --- a/java/flight/flight-jdbc-driver/src/test/java/org/apache/arrow/driver/jdbc/ArrowFlightStatementExecuteUpdateTest.java +++ b/java/flight/flight-jdbc-driver/src/test/java/org/apache/arrow/driver/jdbc/ArrowFlightStatementExecuteUpdateTest.java @@ -30,7 +30,7 @@ import java.sql.Statement; import java.util.Collections; -import org.apache.arrow.driver.jdbc.adhoc.MockFlightSqlProducer; +import org.apache.arrow.driver.jdbc.utils.MockFlightSqlProducer; import org.apache.arrow.memory.BufferAllocator; import org.apache.arrow.memory.RootAllocator; import org.apache.arrow.util.AutoCloseables; @@ -105,7 +105,7 @@ public void tearDown() throws Exception { @AfterClass public static void tearDownAfterClass() throws Exception { - AutoCloseables.close(SERVER_TEST_RULE, PRODUCER); + AutoCloseables.close(PRODUCER); } @Test diff --git a/java/flight/flight-jdbc-driver/src/test/java/org/apache/arrow/driver/jdbc/ConnectionTest.java b/java/flight/flight-jdbc-driver/src/test/java/org/apache/arrow/driver/jdbc/ConnectionTest.java index 56b43bf3bd75..ab7493c92e97 100644 --- a/java/flight/flight-jdbc-driver/src/test/java/org/apache/arrow/driver/jdbc/ConnectionTest.java +++ b/java/flight/flight-jdbc-driver/src/test/java/org/apache/arrow/driver/jdbc/ConnectionTest.java @@ -24,13 +24,12 @@ import java.sql.Driver; import java.sql.DriverManager; import java.sql.SQLException; -import java.util.Collection; import java.util.Properties; -import org.apache.arrow.driver.jdbc.adhoc.MockFlightSqlProducer; import org.apache.arrow.driver.jdbc.authentication.UserPasswordAuthentication; import org.apache.arrow.driver.jdbc.client.ArrowFlightSqlClientHandler; import org.apache.arrow.driver.jdbc.utils.ArrowFlightConnectionConfigImpl.ArrowFlightConnectionProperty; +import org.apache.arrow.driver.jdbc.utils.MockFlightSqlProducer; import org.apache.arrow.memory.BufferAllocator; import org.apache.arrow.memory.RootAllocator; import org.apache.arrow.util.AutoCloseables; @@ -70,8 +69,7 @@ public void setUp() throws Exception { @After public void tearDown() throws Exception { - Collection childAllocators = allocator.getChildAllocators(); - AutoCloseables.close(childAllocators.toArray(new AutoCloseable[0])); + allocator.getChildAllocators().forEach(BufferAllocator::close); AutoCloseables.close(allocator); } @@ -217,7 +215,7 @@ public void testUnencryptedConnectionShouldThrowExceptionWhenProvidedWithInvalid properties.put(ArrowFlightConnectionProperty.PASSWORD.camelName(), "invalidPassword"); - try (Connection connection = DriverManager.getConnection("jdbc:arrow-flight://localhost:32010", + try (Connection ignored = DriverManager.getConnection("jdbc:arrow-flight://localhost:32010", properties)) { Assert.fail(); } @@ -234,13 +232,14 @@ public void testTLSConnectionPropertyFalseCorrectCastUrlWithDriverManager() thro final Driver driver = new ArrowFlightJdbcDriver(); DriverManager.registerDriver(driver); - Assert.assertTrue(DriverManager.getConnection( - String.format( - "jdbc:arrow-flight://localhost:%s?user=%s&password=%s&useTls=false", - FLIGHT_SERVER_TEST_RULE.getPort(), - userTest, - passTest)) - .isValid(0)); + Connection connection = DriverManager.getConnection( + String.format( + "jdbc:arrow-flight://localhost:%s?user=%s&password=%s&useTls=false", + FLIGHT_SERVER_TEST_RULE.getPort(), + userTest, + passTest)); + Assert.assertTrue(connection.isValid(0)); + connection.close(); } /** @@ -263,11 +262,13 @@ public void testTLSConnectionPropertyFalseCorrectCastUrlAndPropertiesUsingSetPro passTest); properties.setProperty(ArrowFlightConnectionProperty.USE_TLS.camelName(), "false"); - Assert.assertTrue(DriverManager.getConnection( + Connection connection = DriverManager.getConnection( String.format( "jdbc:arrow-flight://localhost:%s", FLIGHT_SERVER_TEST_RULE.getPort()), - properties).isValid(0)); + properties); + Assert.assertTrue(connection.isValid(0)); + connection.close(); } /** @@ -289,11 +290,13 @@ public void testTLSConnectionPropertyFalseCorrectCastUrlAndPropertiesUsingPutWit passTest); properties.put(ArrowFlightConnectionProperty.USE_TLS.camelName(), false); - Assert.assertTrue(DriverManager.getConnection( + Connection connection = DriverManager.getConnection( String.format( "jdbc:arrow-flight://localhost:%s", FLIGHT_SERVER_TEST_RULE.getPort()), - properties).isValid(0)); + properties); + Assert.assertTrue(connection.isValid(0)); + connection.close(); } /** @@ -308,13 +311,14 @@ public void testTLSConnectionPropertyFalseIntegerCorrectCastUrlWithDriverManager final Driver driver = new ArrowFlightJdbcDriver(); DriverManager.registerDriver(driver); - Assert.assertTrue(DriverManager.getConnection( - String.format( - "jdbc:arrow-flight://localhost:%s?user=%s&password=%s&useTls=0", - FLIGHT_SERVER_TEST_RULE.getPort(), - userTest, - passTest)) - .isValid(0)); + Connection connection = DriverManager.getConnection( + String.format( + "jdbc:arrow-flight://localhost:%s?user=%s&password=%s&useTls=0", + FLIGHT_SERVER_TEST_RULE.getPort(), + userTest, + passTest)); + Assert.assertTrue(connection.isValid(0)); + connection.close(); } /** @@ -337,11 +341,13 @@ public void testTLSConnectionPropertyFalseIntegerCorrectCastUrlAndPropertiesUsin passTest); properties.setProperty(ArrowFlightConnectionProperty.USE_TLS.camelName(), "0"); - Assert.assertTrue(DriverManager.getConnection( + Connection connection = DriverManager.getConnection( String.format( "jdbc:arrow-flight://localhost:%s", FLIGHT_SERVER_TEST_RULE.getPort()), - properties).isValid(0)); + properties); + Assert.assertTrue(connection.isValid(0)); + connection.close(); } /** @@ -364,11 +370,13 @@ public void testTLSConnectionPropertyFalseIntegerCorrectCastUrlAndPropertiesUsin passTest); properties.put(ArrowFlightConnectionProperty.USE_TLS.camelName(), 0); - Assert.assertTrue(DriverManager.getConnection( + Connection connection = DriverManager.getConnection( String.format( "jdbc:arrow-flight://localhost:%s", FLIGHT_SERVER_TEST_RULE.getPort()), - properties).isValid(0)); + properties); + Assert.assertTrue(connection.isValid(0)); + connection.close(); } /** @@ -383,13 +391,14 @@ public void testThreadPoolSizeConnectionPropertyCorrectCastUrlWithDriverManager( final Driver driver = new ArrowFlightJdbcDriver(); DriverManager.registerDriver(driver); - Assert.assertTrue(DriverManager.getConnection( - String.format( - "jdbc:arrow-flight://localhost:%s?user=%s&password=%s&threadPoolSize=1", - FLIGHT_SERVER_TEST_RULE.getPort(), - userTest, - passTest)) - .isValid(0)); + Connection connection = DriverManager.getConnection( + String.format( + "jdbc:arrow-flight://localhost:%s?user=%s&password=%s&threadPoolSize=1", + FLIGHT_SERVER_TEST_RULE.getPort(), + userTest, + passTest)); + Assert.assertTrue(connection.isValid(0)); + connection.close(); } /** @@ -412,11 +421,13 @@ public void testThreadPoolSizeConnectionPropertyCorrectCastUrlAndPropertiesUsing passTest); properties.setProperty(ArrowFlightConnectionProperty.THREAD_POOL_SIZE.camelName(), "1"); - Assert.assertTrue(DriverManager.getConnection( + Connection connection = DriverManager.getConnection( String.format( "jdbc:arrow-flight://localhost:%s", FLIGHT_SERVER_TEST_RULE.getPort()), - properties).isValid(0)); + properties); + Assert.assertTrue(connection.isValid(0)); + connection.close(); } /** @@ -439,11 +450,13 @@ public void testThreadPoolSizeConnectionPropertyCorrectCastUrlAndPropertiesUsing passTest); properties.put(ArrowFlightConnectionProperty.THREAD_POOL_SIZE.camelName(), 1); - Assert.assertTrue(DriverManager.getConnection( + Connection connection = DriverManager.getConnection( String.format( "jdbc:arrow-flight://localhost:%s", FLIGHT_SERVER_TEST_RULE.getPort()), - properties).isValid(0)); + properties); + Assert.assertTrue(connection.isValid(0)); + connection.close(); } /** @@ -458,13 +471,14 @@ public void testPasswordConnectionPropertyIntegerCorrectCastUrlWithDriverManager final Driver driver = new ArrowFlightJdbcDriver(); DriverManager.registerDriver(driver); - Assert.assertTrue(DriverManager.getConnection( - String.format( - "jdbc:arrow-flight://localhost:%s?user=%s&password=%s", - FLIGHT_SERVER_TEST_RULE.getPort(), - userTest, - passTest)) - .isValid(0)); + Connection connection = DriverManager.getConnection( + String.format( + "jdbc:arrow-flight://localhost:%s?user=%s&password=%s", + FLIGHT_SERVER_TEST_RULE.getPort(), + userTest, + passTest)); + Assert.assertTrue(connection.isValid(0)); + connection.close(); } /** @@ -486,11 +500,13 @@ public void testPasswordConnectionPropertyIntegerCorrectCastUrlAndPropertiesUsin properties.setProperty(ArrowFlightConnectionProperty.PASSWORD.camelName(), passTest); - Assert.assertTrue(DriverManager.getConnection( + Connection connection = DriverManager.getConnection( String.format( "jdbc:arrow-flight://localhost:%s", FLIGHT_SERVER_TEST_RULE.getPort()), - properties).isValid(0)); + properties); + Assert.assertTrue(connection.isValid(0)); + connection.close(); } /** @@ -512,10 +528,12 @@ public void testPasswordConnectionPropertyIntegerCorrectCastUrlAndPropertiesUsin properties.put(ArrowFlightConnectionProperty.PASSWORD.camelName(), passTest); - Assert.assertTrue(DriverManager.getConnection( + Connection connection = DriverManager.getConnection( String.format( "jdbc:arrow-flight://localhost:%s", FLIGHT_SERVER_TEST_RULE.getPort()), - properties).isValid(0)); + properties); + Assert.assertTrue(connection.isValid(0)); + connection.close(); } } diff --git a/java/flight/flight-jdbc-driver/src/test/java/org/apache/arrow/driver/jdbc/ConnectionTlsTest.java b/java/flight/flight-jdbc-driver/src/test/java/org/apache/arrow/driver/jdbc/ConnectionTlsTest.java index 15fa8141d5aa..a2a0f0e06b1f 100644 --- a/java/flight/flight-jdbc-driver/src/test/java/org/apache/arrow/driver/jdbc/ConnectionTlsTest.java +++ b/java/flight/flight-jdbc-driver/src/test/java/org/apache/arrow/driver/jdbc/ConnectionTlsTest.java @@ -25,11 +25,11 @@ import java.sql.SQLException; import java.util.Properties; -import org.apache.arrow.driver.jdbc.adhoc.MockFlightSqlProducer; import org.apache.arrow.driver.jdbc.authentication.UserPasswordAuthentication; import org.apache.arrow.driver.jdbc.client.ArrowFlightSqlClientHandler; import org.apache.arrow.driver.jdbc.utils.ArrowFlightConnectionConfigImpl.ArrowFlightConnectionProperty; import org.apache.arrow.driver.jdbc.utils.FlightSqlTestCertificates; +import org.apache.arrow.driver.jdbc.utils.MockFlightSqlProducer; import org.apache.arrow.memory.BufferAllocator; import org.apache.arrow.memory.RootAllocator; import org.apache.arrow.util.AutoCloseables; @@ -69,11 +69,8 @@ public class ConnectionTlsTest { .build(); } - private final String keyStorePath = this.getClass().getResource("/keys/keyStore.jks") - .getPath(); - private final String noCertificateKeyStorePath = - this.getClass().getResource("/keys/noCertificate.jks") - .getPath(); + private final String keyStorePath = getClass().getResource("/keys/keyStore.jks").getPath(); + private final String noCertificateKeyStorePath = getClass().getResource("/keys/noCertificate.jks").getPath(); private final String keyStorePass = "flight"; private BufferAllocator allocator; @@ -84,6 +81,7 @@ public void setUp() throws Exception { @After public void tearDown() throws Exception { + allocator.getChildAllocators().forEach(BufferAllocator::close); AutoCloseables.close(allocator); } @@ -122,7 +120,7 @@ public void testGetEncryptedClientAuthenticated() throws Exception { public void testGetEncryptedClientWithNoCertificateOnKeyStore() throws Exception { final String noCertificateKeyStorePassword = "flight1"; - try (ArrowFlightSqlClientHandler client = + try (ArrowFlightSqlClientHandler ignored = new ArrowFlightSqlClientHandler.Builder() .withHost(FLIGHT_SERVER_TEST_RULE.getHost()) .withKeyStorePath(noCertificateKeyStorePath) @@ -163,7 +161,7 @@ public void testGetNonAuthenticatedEncryptedClientNoAuth() throws Exception { public void testGetEncryptedClientWithKeyStoreBadPasswordAndNoAuth() throws Exception { String keyStoreBadPassword = "badPassword"; - try (ArrowFlightSqlClientHandler client = + try (ArrowFlightSqlClientHandler ignored = new ArrowFlightSqlClientHandler.Builder() .withHost(FLIGHT_SERVER_TEST_RULE.getHost()) .withKeyStorePath(keyStorePath) @@ -227,7 +225,7 @@ public void testGetAuthenticatedEncryptedConnectionWithKeyStoreBadPassword() thr final ArrowFlightJdbcDataSource dataSource = ArrowFlightJdbcDataSource.createNewDataSource(properties); - try (final Connection connection = dataSource.getConnection()) { + try (final Connection ignored = dataSource.getConnection()) { Assert.fail(); } } @@ -241,16 +239,13 @@ public void testGetAuthenticatedEncryptedConnectionWithKeyStoreBadPassword() thr public void testGetNonAuthenticatedEncryptedConnection() throws Exception { final Properties properties = new Properties(); - properties.put(ArrowFlightConnectionProperty.HOST.camelName(), - FLIGHT_SERVER_TEST_RULE.getHost()); - properties.put(ArrowFlightConnectionProperty.PORT.camelName(), - FLIGHT_SERVER_TEST_RULE.getPort()); + properties.put(ArrowFlightConnectionProperty.HOST.camelName(), FLIGHT_SERVER_TEST_RULE.getHost()); + properties.put(ArrowFlightConnectionProperty.PORT.camelName(), FLIGHT_SERVER_TEST_RULE.getPort()); properties.put(ArrowFlightConnectionProperty.USE_TLS.camelName(), true); properties.put(BuiltInConnectionProperty.KEYSTORE.camelName(), keyStorePath); properties.put(BuiltInConnectionProperty.KEYSTORE_PASSWORD.camelName(), keyStorePass); - final ArrowFlightJdbcDataSource dataSource = - ArrowFlightJdbcDataSource.createNewDataSource(properties); + final ArrowFlightJdbcDataSource dataSource = ArrowFlightJdbcDataSource.createNewDataSource(properties); try (final Connection connection = dataSource.getConnection()) { assert connection.isValid(300); } @@ -267,7 +262,7 @@ public void testTLSConnectionPropertyTrueCorrectCastUrlWithDriverManager() throw final Driver driver = new ArrowFlightJdbcDriver(); DriverManager.registerDriver(driver); - Assert.assertTrue(DriverManager.getConnection( + final Connection connection = DriverManager.getConnection( String.format( "jdbc:arrow-flight://localhost:%s?user=%s&password=%s&useTls=true&%s=%s&%s=%s", FLIGHT_SERVER_TEST_RULE.getPort(), @@ -276,7 +271,9 @@ public void testTLSConnectionPropertyTrueCorrectCastUrlWithDriverManager() throw BuiltInConnectionProperty.KEYSTORE.camelName(), keyStorePath, BuiltInConnectionProperty.KEYSTORE_PASSWORD.camelName(), - keyStorePass)).isValid(0)); + keyStorePass)); + Assert.assertTrue(connection.isValid(0)); + connection.close(); } /** @@ -293,18 +290,19 @@ public void testTLSConnectionPropertyTrueCorrectCastUrlAndPropertiesUsingSetProp Properties properties = new Properties(); - properties.setProperty(ArrowFlightConnectionProperty.USER.camelName(), - userTest); - properties.setProperty(ArrowFlightConnectionProperty.PASSWORD.camelName(), - passTest); + properties.setProperty(ArrowFlightConnectionProperty.USER.camelName(), userTest); + properties.setProperty(ArrowFlightConnectionProperty.PASSWORD.camelName(), passTest); properties.setProperty(BuiltInConnectionProperty.KEYSTORE.camelName(), keyStorePath); properties.setProperty(BuiltInConnectionProperty.KEYSTORE_PASSWORD.camelName(), keyStorePass); properties.setProperty(ArrowFlightConnectionProperty.USE_TLS.camelName(), "true"); - Assert.assertTrue(DriverManager.getConnection( + + final Connection connection = DriverManager.getConnection( String.format( "jdbc:arrow-flight://localhost:%s", FLIGHT_SERVER_TEST_RULE.getPort()), - properties).isValid(0)); + properties); + Assert.assertTrue(connection.isValid(0)); + connection.close(); } /** @@ -321,19 +319,19 @@ public void testTLSConnectionPropertyTrueCorrectCastUrlAndPropertiesUsingPutWith Properties properties = new Properties(); - properties.put(ArrowFlightConnectionProperty.USER.camelName(), - userTest); - properties.put(ArrowFlightConnectionProperty.PASSWORD.camelName(), - passTest); + properties.put(ArrowFlightConnectionProperty.USER.camelName(), userTest); + properties.put(ArrowFlightConnectionProperty.PASSWORD.camelName(), passTest); properties.put(ArrowFlightConnectionProperty.USE_TLS.camelName(), true); properties.put(BuiltInConnectionProperty.KEYSTORE.camelName(), keyStorePath); properties.put(BuiltInConnectionProperty.KEYSTORE_PASSWORD.camelName(), keyStorePass); - Assert.assertTrue(DriverManager.getConnection( + final Connection connection = DriverManager.getConnection( String.format( "jdbc:arrow-flight://localhost:%s", FLIGHT_SERVER_TEST_RULE.getPort()), - properties).isValid(0)); + properties); + Assert.assertTrue(connection.isValid(0)); + connection.close(); } /** @@ -348,7 +346,7 @@ public void testTLSConnectionPropertyTrueIntegerCorrectCastUrlWithDriverManager( final Driver driver = new ArrowFlightJdbcDriver(); DriverManager.registerDriver(driver); - Assert.assertTrue(DriverManager.getConnection( + final Connection connection = DriverManager.getConnection( String.format( "jdbc:arrow-flight://localhost:%s?user=%s&password=%s&useTls=1&%s=%s&%s=%s", FLIGHT_SERVER_TEST_RULE.getPort(), @@ -357,7 +355,9 @@ public void testTLSConnectionPropertyTrueIntegerCorrectCastUrlWithDriverManager( BuiltInConnectionProperty.KEYSTORE.camelName(), keyStorePath, BuiltInConnectionProperty.KEYSTORE_PASSWORD.camelName(), - keyStorePass)).isValid(0)); + keyStorePass)); + Assert.assertTrue(connection.isValid(0)); + connection.close(); } /** @@ -374,17 +374,17 @@ public void testTLSConnectionPropertyTrueIntegerCorrectCastUrlAndPropertiesUsing Properties properties = new Properties(); - properties.setProperty(ArrowFlightConnectionProperty.USER.camelName(), - userTest); - properties.setProperty(ArrowFlightConnectionProperty.PASSWORD.camelName(), - passTest); + properties.setProperty(ArrowFlightConnectionProperty.USER.camelName(), userTest); + properties.setProperty(ArrowFlightConnectionProperty.PASSWORD.camelName(), passTest); properties.setProperty(BuiltInConnectionProperty.KEYSTORE.camelName(), keyStorePath); properties.setProperty(BuiltInConnectionProperty.KEYSTORE_PASSWORD.camelName(), keyStorePass); properties.setProperty(ArrowFlightConnectionProperty.USE_TLS.camelName(), "1"); - Assert.assertTrue(DriverManager.getConnection( + final Connection connection = DriverManager.getConnection( String.format("jdbc:arrow-flight://localhost:%s", FLIGHT_SERVER_TEST_RULE.getPort()), - properties).isValid(0)); + properties); + Assert.assertTrue(connection.isValid(0)); + connection.close(); } /** @@ -401,17 +401,17 @@ public void testTLSConnectionPropertyTrueIntegerCorrectCastUrlAndPropertiesUsing Properties properties = new Properties(); - properties.put(ArrowFlightConnectionProperty.USER.camelName(), - userTest); - properties.put(ArrowFlightConnectionProperty.PASSWORD.camelName(), - passTest); + properties.put(ArrowFlightConnectionProperty.USER.camelName(), userTest); + properties.put(ArrowFlightConnectionProperty.PASSWORD.camelName(), passTest); properties.put(ArrowFlightConnectionProperty.USE_TLS.camelName(), 1); properties.put(BuiltInConnectionProperty.KEYSTORE.camelName(), keyStorePath); properties.put(BuiltInConnectionProperty.KEYSTORE_PASSWORD.camelName(), keyStorePass); - Assert.assertTrue(DriverManager.getConnection( + final Connection connection = DriverManager.getConnection( String.format("jdbc:arrow-flight://localhost:%s", FLIGHT_SERVER_TEST_RULE.getPort()), - properties).isValid(0)); + properties); + Assert.assertTrue(connection.isValid(0)); + connection.close(); } } diff --git a/java/flight/flight-jdbc-driver/src/test/java/org/apache/arrow/driver/jdbc/ResultSetMetadataTest.java b/java/flight/flight-jdbc-driver/src/test/java/org/apache/arrow/driver/jdbc/ResultSetMetadataTest.java index c992dd244735..8509df700cca 100644 --- a/java/flight/flight-jdbc-driver/src/test/java/org/apache/arrow/driver/jdbc/ResultSetMetadataTest.java +++ b/java/flight/flight-jdbc-driver/src/test/java/org/apache/arrow/driver/jdbc/ResultSetMetadataTest.java @@ -27,7 +27,7 @@ import java.sql.Statement; import java.sql.Types; -import org.apache.arrow.driver.jdbc.adhoc.CoreMockedSqlProducers; +import org.apache.arrow.driver.jdbc.utils.CoreMockedSqlProducers; import org.hamcrest.CoreMatchers; import org.junit.AfterClass; import org.junit.Assert; @@ -109,7 +109,7 @@ public void testShouldGetColumnTypesName() throws SQLException { */ @Test(expected = IndexOutOfBoundsException.class) public void testShouldGetColumnTypesNameFromOutOfBoundIndex() throws SQLException { - final String outOfBoundColumn = metadata.getColumnTypeName(4); + metadata.getColumnTypeName(4); Assert.fail(); } @@ -138,7 +138,7 @@ public void testShouldGetColumnNames() throws SQLException { */ @Test(expected = IndexOutOfBoundsException.class) public void testShouldGetColumnNameFromOutOfBoundIndex() throws SQLException { - final String outOfBoundColumn = metadata.getColumnName(4); + metadata.getColumnName(4); Assert.fail(); } @@ -229,7 +229,7 @@ public void testShouldIsSearchable() throws SQLException { */ @Test(expected = IndexOutOfBoundsException.class) public void testShouldGetColumnTypesFromOutOfBoundIndex() throws SQLException { - final int outOfBoundColumn = metadata.getColumnType(4); + metadata.getColumnType(4); Assert.fail(); } diff --git a/java/flight/flight-jdbc-driver/src/test/java/org/apache/arrow/driver/jdbc/ResultSetTest.java b/java/flight/flight-jdbc-driver/src/test/java/org/apache/arrow/driver/jdbc/ResultSetTest.java index f627a04512f6..fde1ef225c29 100644 --- a/java/flight/flight-jdbc-driver/src/test/java/org/apache/arrow/driver/jdbc/ResultSetTest.java +++ b/java/flight/flight-jdbc-driver/src/test/java/org/apache/arrow/driver/jdbc/ResultSetTest.java @@ -35,7 +35,7 @@ import java.util.Set; import java.util.concurrent.CountDownLatch; -import org.apache.arrow.driver.jdbc.adhoc.CoreMockedSqlProducers; +import org.apache.arrow.driver.jdbc.utils.CoreMockedSqlProducers; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.ClassRule; @@ -142,7 +142,7 @@ public void testShouldRunSelectQuerySettingMaxRowLimit() throws Exception { public void testShouldThrowExceptionUponAttemptingToExecuteAnInvalidSelectQuery() throws Exception { Statement statement = connection.createStatement(); - ResultSet resultSet = statement.executeQuery("SELECT * FROM SHOULD-FAIL"); + statement.executeQuery("SELECT * FROM SHOULD-FAIL"); fail(); } @@ -310,7 +310,7 @@ public void testShouldInterruptFlightStreamsIfQueryIsCancelledMidProcessingForTi try (final Statement statement = connection.createStatement()) { final Set exceptions = synchronizedSet(new HashSet<>(1)); final Thread thread = new Thread(() -> { - try (final ResultSet resultSet = statement.executeQuery(query)) { + try (final ResultSet ignored = statement.executeQuery(query)) { fail(); } catch (final SQLException e) { exceptions.add(e); diff --git a/java/flight/flight-jdbc-driver/src/test/java/org/apache/arrow/driver/jdbc/TokenAuthenticationTest.java b/java/flight/flight-jdbc-driver/src/test/java/org/apache/arrow/driver/jdbc/TokenAuthenticationTest.java index f4eb7c6a8603..393a4599a5af 100644 --- a/java/flight/flight-jdbc-driver/src/test/java/org/apache/arrow/driver/jdbc/TokenAuthenticationTest.java +++ b/java/flight/flight-jdbc-driver/src/test/java/org/apache/arrow/driver/jdbc/TokenAuthenticationTest.java @@ -20,8 +20,10 @@ import java.sql.Connection; import java.sql.SQLException; -import org.apache.arrow.driver.jdbc.adhoc.MockFlightSqlProducer; import org.apache.arrow.driver.jdbc.authentication.TokenAuthentication; +import org.apache.arrow.driver.jdbc.utils.MockFlightSqlProducer; +import org.apache.arrow.util.AutoCloseables; +import org.junit.AfterClass; import org.junit.Assert; import org.junit.ClassRule; import org.junit.Test; @@ -43,9 +45,14 @@ public class TokenAuthenticationTest { .build(); } + @AfterClass + public static void tearDownAfterClass() { + AutoCloseables.closeNoChecked(FLIGHT_SQL_PRODUCER); + } + @Test(expected = SQLException.class) public void connectUsingTokenAuthenticationShouldFail() throws SQLException { - try (Connection connection = FLIGHT_SERVER_TEST_RULE.getConnectionFromToken("invalid")) { + try (Connection ignored = FLIGHT_SERVER_TEST_RULE.getConnectionFromToken("invalid")) { Assert.fail(); } } diff --git a/java/flight/flight-jdbc-driver/src/test/java/org/apache/arrow/driver/jdbc/accessor/impl/ArrowFlightJdbcNullVectorAccessorTest.java b/java/flight/flight-jdbc-driver/src/test/java/org/apache/arrow/driver/jdbc/accessor/impl/ArrowFlightJdbcNullVectorAccessorTest.java index 26af7a41e878..57e7ecfe0258 100644 --- a/java/flight/flight-jdbc-driver/src/test/java/org/apache/arrow/driver/jdbc/accessor/impl/ArrowFlightJdbcNullVectorAccessorTest.java +++ b/java/flight/flight-jdbc-driver/src/test/java/org/apache/arrow/driver/jdbc/accessor/impl/ArrowFlightJdbcNullVectorAccessorTest.java @@ -17,8 +17,8 @@ package org.apache.arrow.driver.jdbc.accessor.impl; -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.Test; +import org.junit.Assert; +import org.junit.Test; public class ArrowFlightJdbcNullVectorAccessorTest { @@ -27,12 +27,12 @@ public class ArrowFlightJdbcNullVectorAccessorTest { }); @Test - void testShouldWasNullReturnTrue() { - Assertions.assertTrue(accessor.wasNull()); + public void testShouldWasNullReturnTrue() { + Assert.assertTrue(accessor.wasNull()); } @Test - void testShouldGetObjectReturnNull() { - Assertions.assertNull(accessor.getObject()); + public void testShouldGetObjectReturnNull() { + Assert.assertNull(accessor.getObject()); } } diff --git a/java/flight/flight-jdbc-driver/src/test/java/org/apache/arrow/driver/jdbc/accessor/impl/numeric/ArrowFlightJdbcBitVectorAccessorTest.java b/java/flight/flight-jdbc-driver/src/test/java/org/apache/arrow/driver/jdbc/accessor/impl/numeric/ArrowFlightJdbcBitVectorAccessorTest.java index ba2c2bdd8871..3eea3034cb32 100644 --- a/java/flight/flight-jdbc-driver/src/test/java/org/apache/arrow/driver/jdbc/accessor/impl/numeric/ArrowFlightJdbcBitVectorAccessorTest.java +++ b/java/flight/flight-jdbc-driver/src/test/java/org/apache/arrow/driver/jdbc/accessor/impl/numeric/ArrowFlightJdbcBitVectorAccessorTest.java @@ -162,6 +162,6 @@ public void testShouldGetStringMethodFromBitVectorFromNull() throws Exception { @Test public void testShouldGetObjectClass() throws Exception { accessorIterator.assertAccessorGetter(vector, ArrowFlightJdbcBitVectorAccessor::getObjectClass, - equalTo(Long.class)); + equalTo(Boolean.class)); } } diff --git a/java/flight/flight-jdbc-driver/src/test/java/org/apache/arrow/driver/jdbc/accessor/impl/numeric/ArrowFlightJdbcFloat4VectorAccessorTest.java b/java/flight/flight-jdbc-driver/src/test/java/org/apache/arrow/driver/jdbc/accessor/impl/numeric/ArrowFlightJdbcFloat4VectorAccessorTest.java index 293ef4a025ac..8f368292aff1 100644 --- a/java/flight/flight-jdbc-driver/src/test/java/org/apache/arrow/driver/jdbc/accessor/impl/numeric/ArrowFlightJdbcFloat4VectorAccessorTest.java +++ b/java/flight/flight-jdbc-driver/src/test/java/org/apache/arrow/driver/jdbc/accessor/impl/numeric/ArrowFlightJdbcFloat4VectorAccessorTest.java @@ -21,6 +21,8 @@ import static org.hamcrest.CoreMatchers.is; import java.math.BigDecimal; +import java.math.RoundingMode; +import java.sql.SQLException; import org.apache.arrow.driver.jdbc.utils.AccessorTestUtils; import org.apache.arrow.driver.jdbc.utils.RootAllocatorTestRule; @@ -204,13 +206,25 @@ public void testShouldGetDoubleMethodFromFloat4Vector() throws Exception { public void testShouldGetBigDecimalMethodFromFloat4Vector() throws Exception { accessorIterator.iterate(vector, (accessor, currentRow) -> { float value = accessor.getFloat(); - if (Double.isInfinite(value)) { - exceptionCollector.expect(UnsupportedOperationException.class); + if (Float.isInfinite(value) || Float.isNaN(value)) { + exceptionCollector.expect(SQLException.class); } collector.checkThat(accessor.getBigDecimal(), is(BigDecimal.valueOf(value))); }); } + @Test + public void testShouldGetBigDecimalWithScaleMethodFromFloat4Vector() throws Exception { + accessorIterator.iterate(vector, (accessor, currentRow) -> { + float value = accessor.getFloat(); + if (Float.isInfinite(value) || Float.isNaN(value)) { + exceptionCollector.expect(SQLException.class); + } + collector.checkThat(accessor.getBigDecimal(9), + is(BigDecimal.valueOf(value).setScale(9, RoundingMode.HALF_UP))); + }); + } + @Test public void testShouldGetObjectClass() throws Exception { accessorIterator.assertAccessorGetter(vector, diff --git a/java/flight/flight-jdbc-driver/src/test/java/org/apache/arrow/driver/jdbc/accessor/impl/numeric/ArrowFlightJdbcFloat8VectorAccessorTest.java b/java/flight/flight-jdbc-driver/src/test/java/org/apache/arrow/driver/jdbc/accessor/impl/numeric/ArrowFlightJdbcFloat8VectorAccessorTest.java index c1ba7bd47d92..950791c88b04 100644 --- a/java/flight/flight-jdbc-driver/src/test/java/org/apache/arrow/driver/jdbc/accessor/impl/numeric/ArrowFlightJdbcFloat8VectorAccessorTest.java +++ b/java/flight/flight-jdbc-driver/src/test/java/org/apache/arrow/driver/jdbc/accessor/impl/numeric/ArrowFlightJdbcFloat8VectorAccessorTest.java @@ -21,6 +21,8 @@ import static org.hamcrest.CoreMatchers.is; import java.math.BigDecimal; +import java.math.RoundingMode; +import java.sql.SQLException; import org.apache.arrow.driver.jdbc.utils.AccessorTestUtils; import org.apache.arrow.driver.jdbc.utils.RootAllocatorTestRule; @@ -142,11 +144,10 @@ public void testShouldGetFloatMethodFromFloat8Vector() throws Exception { @Test public void testShouldGetBigDecimalMethodFromFloat8Vector() throws Exception { - accessorIterator.iterate(vector, (accessor) -> { + accessorIterator.iterate(vector, (accessor, currentRow) -> { double value = accessor.getDouble(); - if (Double.isInfinite(value)) { - // BigDecimal does not support Infinities - return; + if (Double.isInfinite(value) || Double.isNaN(value)) { + exceptionCollector.expect(SQLException.class); } collector.checkThat(accessor.getBigDecimal(), is(BigDecimal.valueOf(value))); }); @@ -187,6 +188,18 @@ public void testShouldGetBigDecimalMethodFromFloat8VectorWithNull() throws Excep CoreMatchers.nullValue()); } + @Test + public void testShouldGetBigDecimalWithScaleMethodFromFloat4Vector() throws Exception { + accessorIterator.iterate(vector, (accessor, currentRow) -> { + double value = accessor.getDouble(); + if (Double.isInfinite(value) || Double.isNaN(value)) { + exceptionCollector.expect(SQLException.class); + } + collector.checkThat(accessor.getBigDecimal(9), + is(BigDecimal.valueOf(value).setScale(9, RoundingMode.HALF_UP))); + }); + } + @Test public void testShouldGetObjectMethodFromFloat8VectorWithNull() throws Exception { accessorIterator diff --git a/java/flight/flight-jdbc-driver/src/test/java/org/apache/arrow/driver/jdbc/accessor/impl/text/ArrowFlightJdbcVarCharVectorAccessorTest.java b/java/flight/flight-jdbc-driver/src/test/java/org/apache/arrow/driver/jdbc/accessor/impl/text/ArrowFlightJdbcVarCharVectorAccessorTest.java index c92ab9d82444..90bf952a0b90 100644 --- a/java/flight/flight-jdbc-driver/src/test/java/org/apache/arrow/driver/jdbc/accessor/impl/text/ArrowFlightJdbcVarCharVectorAccessorTest.java +++ b/java/flight/flight-jdbc-driver/src/test/java/org/apache/arrow/driver/jdbc/accessor/impl/text/ArrowFlightJdbcVarCharVectorAccessorTest.java @@ -41,6 +41,7 @@ import org.apache.arrow.driver.jdbc.accessor.impl.calendar.ArrowFlightJdbcTimeStampVectorAccessor; import org.apache.arrow.driver.jdbc.accessor.impl.calendar.ArrowFlightJdbcTimeVectorAccessor; import org.apache.arrow.driver.jdbc.utils.RootAllocatorTestRule; +import org.apache.arrow.driver.jdbc.utils.ThrowableAssertionUtils; import org.apache.arrow.vector.DateMilliVector; import org.apache.arrow.vector.TimeMilliVector; import org.apache.arrow.vector.TimeStampVector; @@ -601,7 +602,7 @@ private void assertGetBoolean(Text value, boolean expectedResult) throws SQLExce private void assertGetBooleanForSQLException(Text value) { when(getter.get(0)).thenReturn(value); - collector.checkThrows(SQLException.class, () -> accessor.getBoolean()); + ThrowableAssertionUtils.simpleAssertThrowableClass(SQLException.class, () -> accessor.getBoolean()); } @Test diff --git a/java/flight/flight-jdbc-driver/src/test/java/org/apache/arrow/driver/jdbc/utils/AccessorTestUtils.java b/java/flight/flight-jdbc-driver/src/test/java/org/apache/arrow/driver/jdbc/utils/AccessorTestUtils.java index 8108f7aa95e8..bc1e8a042035 100644 --- a/java/flight/flight-jdbc-driver/src/test/java/org/apache/arrow/driver/jdbc/utils/AccessorTestUtils.java +++ b/java/flight/flight-jdbc-driver/src/test/java/org/apache/arrow/driver/jdbc/utils/AccessorTestUtils.java @@ -120,7 +120,7 @@ public void assertAccessorGetter(ValueVector vector, CheckedFunction g public void assertAccessorGetterThrowingException(ValueVector vector, CheckedFunction getter) throws Exception { iterate(vector, (accessor, currentRow) -> - collector.checkThrows(SQLException.class, () -> getter.apply(accessor))); + ThrowableAssertionUtils.simpleAssertThrowableClass(SQLException.class, () -> getter.apply(accessor))); } public void assertAccessorGetter(ValueVector vector, CheckedFunction getter, diff --git a/java/flight/flight-jdbc-driver/src/test/java/org/apache/arrow/driver/jdbc/utils/ArrowFlightConnectionPropertyTest.java b/java/flight/flight-jdbc-driver/src/test/java/org/apache/arrow/driver/jdbc/utils/ArrowFlightConnectionPropertyTest.java index 3ae5ab39b70f..25a48612cbd0 100644 --- a/java/flight/flight-jdbc-driver/src/test/java/org/apache/arrow/driver/jdbc/utils/ArrowFlightConnectionPropertyTest.java +++ b/java/flight/flight-jdbc-driver/src/test/java/org/apache/arrow/driver/jdbc/utils/ArrowFlightConnectionPropertyTest.java @@ -29,9 +29,7 @@ import org.junit.Assert; import org.junit.Assume; import org.junit.Before; -import org.junit.Rule; import org.junit.Test; -import org.junit.rules.ErrorCollector; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; import org.junit.runners.Parameterized.Parameter; @@ -49,9 +47,6 @@ public final class ArrowFlightConnectionPropertyTest { @Parameter public ArrowFlightConnectionProperty arrowFlightConnectionProperty; - @Rule - public final ErrorCollector collector = new ErrorCollector(); - @Before public void setUp() { mockitoResource = openMocks(this); @@ -64,14 +59,14 @@ public void tearDown() throws Exception { @Test public void testWrapIsUnsupported() { - collector.checkThrows(UnsupportedOperationException.class, + ThrowableAssertionUtils.simpleAssertThrowableClass(UnsupportedOperationException.class, () -> arrowFlightConnectionProperty.wrap(properties)); } @Test public void testRequiredPropertyThrows() { Assume.assumeTrue(arrowFlightConnectionProperty.required()); - Assert.assertThrows(IllegalStateException.class, + ThrowableAssertionUtils.simpleAssertThrowableClass(IllegalStateException.class, () -> arrowFlightConnectionProperty.get(new Properties())); } diff --git a/java/flight/flight-jdbc-driver/src/test/java/org/apache/arrow/driver/jdbc/utils/ConnectionWrapperTest.java b/java/flight/flight-jdbc-driver/src/test/java/org/apache/arrow/driver/jdbc/utils/ConnectionWrapperTest.java index 078572c8abc0..6044f3a363c7 100644 --- a/java/flight/flight-jdbc-driver/src/test/java/org/apache/arrow/driver/jdbc/utils/ConnectionWrapperTest.java +++ b/java/flight/flight-jdbc-driver/src/test/java/org/apache/arrow/driver/jdbc/utils/ConnectionWrapperTest.java @@ -93,9 +93,9 @@ public void testUnwrappingUnderlyingConnectionShouldReturnUnderlyingConnection() collector.checkThat( collector.checkSucceeds(() -> connectionWrapper.unwrap(AvaticaConnection.class)), is(sameInstance(underlyingConnection))); - collector.checkThrows(ClassCastException.class, + ThrowableAssertionUtils.simpleAssertThrowableClass(ClassCastException.class, () -> connectionWrapper.unwrap(ArrowFlightConnection.class)); - collector.checkThrows(ClassCastException.class, + ThrowableAssertionUtils.simpleAssertThrowableClass(ClassCastException.class, () -> connectionWrapper.unwrap(ConnectionWrapper.class)); } diff --git a/java/flight/flight-jdbc-driver/src/test/java/org/apache/arrow/driver/jdbc/adhoc/CoreMockedSqlProducers.java b/java/flight/flight-jdbc-driver/src/test/java/org/apache/arrow/driver/jdbc/utils/CoreMockedSqlProducers.java similarity index 99% rename from java/flight/flight-jdbc-driver/src/test/java/org/apache/arrow/driver/jdbc/adhoc/CoreMockedSqlProducers.java rename to java/flight/flight-jdbc-driver/src/test/java/org/apache/arrow/driver/jdbc/utils/CoreMockedSqlProducers.java index 77599063796b..7637e1dd1273 100644 --- a/java/flight/flight-jdbc-driver/src/test/java/org/apache/arrow/driver/jdbc/adhoc/CoreMockedSqlProducers.java +++ b/java/flight/flight-jdbc-driver/src/test/java/org/apache/arrow/driver/jdbc/utils/CoreMockedSqlProducers.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package org.apache.arrow.driver.jdbc.adhoc; +package org.apache.arrow.driver.jdbc.utils; import static java.lang.String.format; import static org.hamcrest.CoreMatchers.equalTo; diff --git a/java/flight/flight-jdbc-driver/src/test/java/org/apache/arrow/driver/jdbc/utils/FlightStreamQueueTest.java b/java/flight/flight-jdbc-driver/src/test/java/org/apache/arrow/driver/jdbc/utils/FlightStreamQueueTest.java index 3820285af520..b474da55a7f1 100644 --- a/java/flight/flight-jdbc-driver/src/test/java/org/apache/arrow/driver/jdbc/utils/FlightStreamQueueTest.java +++ b/java/flight/flight-jdbc-driver/src/test/java/org/apache/arrow/driver/jdbc/utils/FlightStreamQueueTest.java @@ -17,12 +17,10 @@ package org.apache.arrow.driver.jdbc.utils; -import static java.lang.String.format; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.nullValue; import static org.mockito.Mockito.mock; -import java.util.Optional; import java.util.concurrent.CompletionService; import org.apache.arrow.flight.FlightStream; @@ -59,31 +57,14 @@ public void testNextShouldRetrieveNullIfEmpty() throws Exception { @Test public void testNextShouldThrowExceptionUponClose() throws Exception { queue.close(); - Optional expectedExceptionOnNextIfClosed = Optional.empty(); - try { - queue.next(); - } catch (final IllegalStateException e) { - expectedExceptionOnNextIfClosed = Optional.of(e); - } - collector.checkThat(expectedExceptionOnNextIfClosed.isPresent(), is(true)); - collector.checkThat( - expectedExceptionOnNextIfClosed.orElse(new Exception()).getMessage(), - is(format("%s closed", queue.getClass().getSimpleName()))); + ThrowableAssertionUtils.simpleAssertThrowableClass(IllegalStateException.class, () -> queue.next()); } @Test public void testEnqueueShouldThrowExceptionUponClose() throws Exception { queue.close(); - Optional expectedExceptionOnEnqueueIfClosed = Optional.empty(); - try { - queue.enqueue(mock(FlightStream.class)); - } catch (final IllegalStateException e) { - expectedExceptionOnEnqueueIfClosed = Optional.of(e); - } - collector.checkThat(expectedExceptionOnEnqueueIfClosed.isPresent(), is(true)); - collector.checkThat( - expectedExceptionOnEnqueueIfClosed.orElse(new Exception()).getMessage(), - is(format("%s closed", queue.getClass().getSimpleName()))); + ThrowableAssertionUtils.simpleAssertThrowableClass(IllegalStateException.class, + () -> queue.enqueue(mock(FlightStream.class))); } @Test @@ -93,16 +74,7 @@ public void testCheckOpen() throws Exception { return true; }); queue.close(); - Optional expectedExceptionAfterClosed = Optional.empty(); - try { - queue.checkOpen(); - } catch (final IllegalStateException e) { - expectedExceptionAfterClosed = Optional.of(e); - } - collector.checkThat(expectedExceptionAfterClosed.isPresent(), is(true)); - collector.checkThat( - expectedExceptionAfterClosed.orElse(new Exception()).getMessage(), - is(format("%s closed", queue.getClass().getSimpleName()))); + ThrowableAssertionUtils.simpleAssertThrowableClass(IllegalStateException.class, () -> queue.checkOpen()); } @Test diff --git a/java/flight/flight-jdbc-driver/src/test/java/org/apache/arrow/driver/jdbc/adhoc/MockFlightSqlProducer.java b/java/flight/flight-jdbc-driver/src/test/java/org/apache/arrow/driver/jdbc/utils/MockFlightSqlProducer.java similarity index 99% rename from java/flight/flight-jdbc-driver/src/test/java/org/apache/arrow/driver/jdbc/adhoc/MockFlightSqlProducer.java rename to java/flight/flight-jdbc-driver/src/test/java/org/apache/arrow/driver/jdbc/utils/MockFlightSqlProducer.java index d699e0717d37..659ac92676c5 100644 --- a/java/flight/flight-jdbc-driver/src/test/java/org/apache/arrow/driver/jdbc/adhoc/MockFlightSqlProducer.java +++ b/java/flight/flight-jdbc-driver/src/test/java/org/apache/arrow/driver/jdbc/utils/MockFlightSqlProducer.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package org.apache.arrow.driver.jdbc.adhoc; +package org.apache.arrow.driver.jdbc.utils; import static com.google.protobuf.Any.pack; import static com.google.protobuf.ByteString.copyFrom; diff --git a/java/flight/flight-jdbc-driver/src/test/java/org/apache/arrow/driver/jdbc/utils/ThrowableAssertionUtils.java b/java/flight/flight-jdbc-driver/src/test/java/org/apache/arrow/driver/jdbc/utils/ThrowableAssertionUtils.java new file mode 100644 index 000000000000..f1bd44539ac5 --- /dev/null +++ b/java/flight/flight-jdbc-driver/src/test/java/org/apache/arrow/driver/jdbc/utils/ThrowableAssertionUtils.java @@ -0,0 +1,57 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.arrow.driver.jdbc.utils; + +/** + * Utility class to avoid upgrading JUnit to version >= 4.13 and keep using code to assert a {@link Throwable}. + * This should be removed as soon as we can use the proper assertThrows/checkThrows. + */ +public class ThrowableAssertionUtils { + private ThrowableAssertionUtils() { + } + + public static void simpleAssertThrowableClass( + final Class expectedThrowable, final ThrowingRunnable runnable) { + try { + runnable.run(); + } catch (Throwable actualThrown) { + if (expectedThrowable.isInstance(actualThrown)) { + return; + } else { + final String mismatchMessage = String.format("unexpected exception type thrown;\nexpected: %s\nactual: %s", + formatClass(expectedThrowable), + formatClass(actualThrown.getClass())); + + throw new AssertionError(mismatchMessage, actualThrown); + } + } + final String notThrownMessage = String.format("expected %s to be thrown, but nothing was thrown", + formatClass(expectedThrowable)); + throw new AssertionError(notThrownMessage); + } + + private static String formatClass(final Class value) { + // Fallback for anonymous inner classes + final String className = value.getCanonicalName(); + return className == null ? value.getName() : className; + } + + public interface ThrowingRunnable { + void run() throws Throwable; + } +} diff --git a/java/pom.xml b/java/pom.xml index 13985896769e..493558f0b3e5 100644 --- a/java/pom.xml +++ b/java/pom.xml @@ -506,23 +506,12 @@ - - com.github.spotbugs - spotbugs-maven-plugin - 4.2.3 - - - - org.apache.maven - maven-model - 3.3.9 - com.google.flatbuffers flatbuffers-java @@ -589,26 +578,6 @@ hamcrest 2.2 - - org.apache.calcite.avatica - avatica - 1.18.0 - - - org.bouncycastle - bcpkix-jdk15on - 1.61 - - - com.google.code.findbugs - annotations - 3.0.1 - - - org.codehaus.plexus - plexus-utils - 3.0.22 - @@ -664,7 +633,7 @@ junit junit - 4.13 + 4.12 test