This is an automated email from the ASF dual-hosted git repository.
dimas pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/polaris.git
The following commit(s) were added to refs/heads/main by this push:
new 95ebdd359 Remove commons-lang3 dependency (#2456)
95ebdd359 is described below
commit 95ebdd359ed0956ddc7a771c37683f9a3ecb0176
Author: Christopher Lambert <[email protected]>
AuthorDate: Thu Aug 28 03:56:45 2025 +0200
Remove commons-lang3 dependency (#2456)
outside of tests we can replace the functionality with jdk11 and guava.
also stop using `org.assertj.core.util` as its a non-public api.
---
.../it/test/PolarisRestCatalogViewAwsIntegrationTest.java | 2 +-
.../it/test/PolarisRestCatalogViewAzureIntegrationTest.java | 2 +-
.../it/test/PolarisRestCatalogViewGcpIntegrationTest.java | 2 +-
polaris-core/build.gradle.kts | 1 -
.../storage/azure/AzureCredentialStorageIntegrationTest.java | 2 +-
.../apache/polaris/service/admin/PolarisAdminService.java | 12 ++++++------
.../polaris/service/auth/DefaultActiveRolesProvider.java | 4 ++--
.../apache/polaris/service/auth/DefaultAuthenticator.java | 4 ++--
.../main/java/org/apache/polaris/service/auth/JWTBroker.java | 5 ++---
.../polaris/service/catalog/iceberg/IcebergCatalog.java | 4 ++--
.../polaris/service/catalog/io/ExceptionMappingFileIO.java | 4 ++--
.../polaris/service/exception/IcebergExceptionMapper.java | 4 ++--
.../org/apache/polaris/service/task/TaskFileIOSupplier.java | 5 +----
.../service/catalog/iceberg/IcebergCatalogAdapterTest.java | 2 +-
14 files changed, 24 insertions(+), 29 deletions(-)
diff --git
a/integration-tests/src/main/java/org/apache/polaris/service/it/test/PolarisRestCatalogViewAwsIntegrationTest.java
b/integration-tests/src/main/java/org/apache/polaris/service/it/test/PolarisRestCatalogViewAwsIntegrationTest.java
index d6b7e39cb..63471c92b 100644
---
a/integration-tests/src/main/java/org/apache/polaris/service/it/test/PolarisRestCatalogViewAwsIntegrationTest.java
+++
b/integration-tests/src/main/java/org/apache/polaris/service/it/test/PolarisRestCatalogViewAwsIntegrationTest.java
@@ -18,12 +18,12 @@
*/
package org.apache.polaris.service.it.test;
+import com.google.common.base.Strings;
import java.util.List;
import java.util.Optional;
import java.util.stream.Stream;
import org.apache.polaris.core.admin.model.AwsStorageConfigInfo;
import org.apache.polaris.core.admin.model.StorageConfigInfo;
-import org.assertj.core.util.Strings;
/** Runs PolarisRestCatalogViewIntegrationTest on AWS. */
public class PolarisRestCatalogViewAwsIntegrationTest
diff --git
a/integration-tests/src/main/java/org/apache/polaris/service/it/test/PolarisRestCatalogViewAzureIntegrationTest.java
b/integration-tests/src/main/java/org/apache/polaris/service/it/test/PolarisRestCatalogViewAzureIntegrationTest.java
index 4a4eef984..9d2c4d84a 100644
---
a/integration-tests/src/main/java/org/apache/polaris/service/it/test/PolarisRestCatalogViewAzureIntegrationTest.java
+++
b/integration-tests/src/main/java/org/apache/polaris/service/it/test/PolarisRestCatalogViewAzureIntegrationTest.java
@@ -18,11 +18,11 @@
*/
package org.apache.polaris.service.it.test;
+import com.google.common.base.Strings;
import java.util.List;
import java.util.stream.Stream;
import org.apache.polaris.core.admin.model.AzureStorageConfigInfo;
import org.apache.polaris.core.admin.model.StorageConfigInfo;
-import org.assertj.core.util.Strings;
/** Runs PolarisRestCatalogViewIntegrationTest on Azure. */
public class PolarisRestCatalogViewAzureIntegrationTest
diff --git
a/integration-tests/src/main/java/org/apache/polaris/service/it/test/PolarisRestCatalogViewGcpIntegrationTest.java
b/integration-tests/src/main/java/org/apache/polaris/service/it/test/PolarisRestCatalogViewGcpIntegrationTest.java
index f1c4a762a..3dea04e61 100644
---
a/integration-tests/src/main/java/org/apache/polaris/service/it/test/PolarisRestCatalogViewGcpIntegrationTest.java
+++
b/integration-tests/src/main/java/org/apache/polaris/service/it/test/PolarisRestCatalogViewGcpIntegrationTest.java
@@ -18,11 +18,11 @@
*/
package org.apache.polaris.service.it.test;
+import com.google.common.base.Strings;
import java.util.List;
import java.util.stream.Stream;
import org.apache.polaris.core.admin.model.GcpStorageConfigInfo;
import org.apache.polaris.core.admin.model.StorageConfigInfo;
-import org.assertj.core.util.Strings;
/** Runs PolarisRestCatalogViewIntegrationTest on GCP. */
public class PolarisRestCatalogViewGcpIntegrationTest
diff --git a/polaris-core/build.gradle.kts b/polaris-core/build.gradle.kts
index f5a889241..9a5beb35c 100644
--- a/polaris-core/build.gradle.kts
+++ b/polaris-core/build.gradle.kts
@@ -42,7 +42,6 @@ dependencies {
runtimeOnly("com.fasterxml.jackson.datatype:jackson-datatype-jsr310")
implementation(libs.caffeine)
- implementation(libs.commons.lang3)
implementation(libs.commons.codec)
implementation(libs.guava)
implementation(libs.slf4j.api)
diff --git
a/polaris-core/src/test/java/org/apache/polaris/service/storage/azure/AzureCredentialStorageIntegrationTest.java
b/polaris-core/src/test/java/org/apache/polaris/service/storage/azure/AzureCredentialStorageIntegrationTest.java
index 768f4c330..d1783baed 100644
---
a/polaris-core/src/test/java/org/apache/polaris/service/storage/azure/AzureCredentialStorageIntegrationTest.java
+++
b/polaris-core/src/test/java/org/apache/polaris/service/storage/azure/AzureCredentialStorageIntegrationTest.java
@@ -32,6 +32,7 @@ import
com.azure.storage.file.datalake.DataLakeFileSystemClient;
import com.azure.storage.file.datalake.DataLakeFileSystemClientBuilder;
import com.azure.storage.file.datalake.models.DataLakeStorageException;
import com.azure.storage.file.datalake.models.PathItem;
+import com.google.common.base.Strings;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.lang.annotation.ElementType;
@@ -52,7 +53,6 @@ import
org.apache.polaris.core.storage.azure.AzureCredentialsStorageIntegration;
import org.apache.polaris.core.storage.azure.AzureStorageConfigurationInfo;
import org.assertj.core.api.Assertions;
import org.assertj.core.api.Assumptions;
-import org.assertj.core.util.Strings;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtensionContext;
import org.junit.jupiter.params.ParameterizedTest;
diff --git
a/runtime/service/src/main/java/org/apache/polaris/service/admin/PolarisAdminService.java
b/runtime/service/src/main/java/org/apache/polaris/service/admin/PolarisAdminService.java
index 69f1c1006..d4c1892dc 100644
---
a/runtime/service/src/main/java/org/apache/polaris/service/admin/PolarisAdminService.java
+++
b/runtime/service/src/main/java/org/apache/polaris/service/admin/PolarisAdminService.java
@@ -21,6 +21,7 @@ package org.apache.polaris.service.admin;
import static com.google.common.base.Preconditions.checkArgument;
import static com.google.common.base.Preconditions.checkState;
+import com.google.common.base.Strings;
import jakarta.annotation.Nonnull;
import jakarta.annotation.Nullable;
import jakarta.validation.constraints.NotNull;
@@ -37,7 +38,6 @@ import java.util.Optional;
import java.util.Set;
import java.util.function.Function;
import java.util.stream.Stream;
-import org.apache.commons.lang3.StringUtils;
import org.apache.iceberg.catalog.Namespace;
import org.apache.iceberg.catalog.TableIdentifier;
import org.apache.iceberg.exceptions.AlreadyExistsException;
@@ -907,14 +907,14 @@ public class PolarisAdminService {
// additionalProperties while neglecting to "echo" the
default-base-location from the
// fetched catalog, it's most user-friendly to treat a null or empty
default-base-location
// as meaning no intended change to the default-base-location.
- if (StringUtils.isNotEmpty(newDefaultBaseLocation)) {
- // New base location is already in the updated properties; we'll also
potentially
- // plumb it into the logic for setting an updated
StorageConfigurationInfo.
- defaultBaseLocation = newDefaultBaseLocation;
- } else {
+ if (Strings.isNullOrEmpty(newDefaultBaseLocation)) {
// No default-base-location present at all in the properties of the
update request,
// so we must restore it explicitly in the updateBuilder.
updateBuilder.setDefaultBaseLocation(defaultBaseLocation);
+ } else {
+ // New base location is already in the updated properties; we'll also
potentially
+ // plumb it into the logic for setting an updated
StorageConfigurationInfo.
+ defaultBaseLocation = newDefaultBaseLocation;
}
}
if (updateRequest.getStorageConfigInfo() != null) {
diff --git
a/runtime/service/src/main/java/org/apache/polaris/service/auth/DefaultActiveRolesProvider.java
b/runtime/service/src/main/java/org/apache/polaris/service/auth/DefaultActiveRolesProvider.java
index 003b37bcd..a27d57476 100644
---
a/runtime/service/src/main/java/org/apache/polaris/service/auth/DefaultActiveRolesProvider.java
+++
b/runtime/service/src/main/java/org/apache/polaris/service/auth/DefaultActiveRolesProvider.java
@@ -18,6 +18,7 @@
*/
package org.apache.polaris.service.auth;
+import com.google.common.base.Throwables;
import io.smallrye.common.annotation.Identifier;
import jakarta.enterprise.context.RequestScoped;
import jakarta.inject.Inject;
@@ -25,7 +26,6 @@ import java.util.List;
import java.util.Set;
import java.util.function.Predicate;
import java.util.stream.Collectors;
-import org.apache.commons.lang3.exception.ExceptionUtils;
import org.apache.iceberg.exceptions.NotAuthorizedException;
import org.apache.iceberg.exceptions.ServiceFailureException;
import org.apache.polaris.core.PolarisCallContext;
@@ -61,7 +61,7 @@ public class DefaultActiveRolesProvider implements
ActiveRolesProvider {
LOGGER.error(
"Expected an PersistedPolarisPrincipal, but got {}: {}",
principal.getClass().getName(),
- ExceptionUtils.getStackTrace(new ServiceFailureException("Invalid
principal type")));
+ Throwables.getStackTraceAsString(new
ServiceFailureException("Invalid principal type")));
throw new NotAuthorizedException("Unable to authenticate");
}
List<PrincipalRoleEntity> activeRoles =
diff --git
a/runtime/service/src/main/java/org/apache/polaris/service/auth/DefaultAuthenticator.java
b/runtime/service/src/main/java/org/apache/polaris/service/auth/DefaultAuthenticator.java
index 6808c2341..149ae1874 100644
---
a/runtime/service/src/main/java/org/apache/polaris/service/auth/DefaultAuthenticator.java
+++
b/runtime/service/src/main/java/org/apache/polaris/service/auth/DefaultAuthenticator.java
@@ -18,12 +18,12 @@
*/
package org.apache.polaris.service.auth;
+import com.google.common.base.Throwables;
import io.smallrye.common.annotation.Identifier;
import jakarta.enterprise.context.RequestScoped;
import jakarta.inject.Inject;
import java.util.HashSet;
import java.util.Set;
-import org.apache.commons.lang3.exception.ExceptionUtils;
import org.apache.iceberg.exceptions.NotAuthorizedException;
import org.apache.iceberg.exceptions.ServiceFailureException;
import org.apache.polaris.core.auth.PolarisPrincipal;
@@ -81,7 +81,7 @@ public class DefaultAuthenticator implements Authenticator {
LOGGER
.atError()
.addKeyValue("errMsg", e.getMessage())
- .addKeyValue("stackTrace", ExceptionUtils.getStackTrace(e))
+ .addKeyValue("stackTrace", Throwables.getStackTraceAsString(e))
.log("Unable to authenticate user with token");
throw new ServiceFailureException("Unable to fetch principal entity");
}
diff --git
a/runtime/service/src/main/java/org/apache/polaris/service/auth/JWTBroker.java
b/runtime/service/src/main/java/org/apache/polaris/service/auth/JWTBroker.java
index c591ca123..559ba2bc5 100644
---
a/runtime/service/src/main/java/org/apache/polaris/service/auth/JWTBroker.java
+++
b/runtime/service/src/main/java/org/apache/polaris/service/auth/JWTBroker.java
@@ -28,7 +28,6 @@ import java.time.temporal.ChronoUnit;
import java.util.Objects;
import java.util.Optional;
import java.util.UUID;
-import org.apache.commons.lang3.StringUtils;
import org.apache.iceberg.exceptions.NotAuthorizedException;
import org.apache.polaris.core.PolarisCallContext;
import org.apache.polaris.core.entity.PolarisEntityType;
@@ -108,7 +107,7 @@ public abstract class JWTBroker implements TokenBroker {
if (!TokenType.ACCESS_TOKEN.equals(subjectTokenType)) {
return new TokenResponse(OAuthTokenErrorResponse.Error.invalid_request);
}
- if (StringUtils.isBlank(subjectToken)) {
+ if (subjectToken == null || subjectToken.isBlank()) {
return new TokenResponse(OAuthTokenErrorResponse.Error.invalid_request);
}
DecodedToken decodedToken;
@@ -188,6 +187,6 @@ public abstract class JWTBroker implements TokenBroker {
}
private String scopes(String scope) {
- return StringUtils.isNotBlank(scope) ? scope :
DefaultAuthenticator.PRINCIPAL_ROLE_ALL;
+ return scope == null || scope.isBlank() ?
DefaultAuthenticator.PRINCIPAL_ROLE_ALL : scope;
}
}
diff --git
a/runtime/service/src/main/java/org/apache/polaris/service/catalog/iceberg/IcebergCatalog.java
b/runtime/service/src/main/java/org/apache/polaris/service/catalog/iceberg/IcebergCatalog.java
index 4c0f7af2e..438cf9922 100644
---
a/runtime/service/src/main/java/org/apache/polaris/service/catalog/iceberg/IcebergCatalog.java
+++
b/runtime/service/src/main/java/org/apache/polaris/service/catalog/iceberg/IcebergCatalog.java
@@ -24,6 +24,7 @@ import com.google.common.annotations.VisibleForTesting;
import com.google.common.base.Joiner;
import com.google.common.base.Objects;
import com.google.common.base.Preconditions;
+import com.google.common.base.Throwables;
import com.google.common.collect.ImmutableMap;
import jakarta.annotation.Nonnull;
import jakarta.annotation.Nullable;
@@ -47,7 +48,6 @@ import java.util.function.Function;
import java.util.function.Predicate;
import java.util.stream.Collectors;
import java.util.stream.Stream;
-import org.apache.commons.lang3.exception.ExceptionUtils;
import org.apache.iceberg.BaseTable;
import org.apache.iceberg.CatalogProperties;
import org.apache.iceberg.CatalogUtil;
@@ -165,7 +165,7 @@ public class IcebergCatalog extends BaseMetastoreViewCatalog
&& !(ex instanceof ForbiddenException)
&& !(ex instanceof UnprocessableEntityException)
&& (isStorageProviderRetryableException(ex)
- ||
isStorageProviderRetryableException(ExceptionUtils.getRootCause(ex)));
+ ||
isStorageProviderRetryableException(Throwables.getRootCause(ex)));
};
private final StorageCredentialCache storageCredentialCache;
diff --git
a/runtime/service/src/main/java/org/apache/polaris/service/catalog/io/ExceptionMappingFileIO.java
b/runtime/service/src/main/java/org/apache/polaris/service/catalog/io/ExceptionMappingFileIO.java
index 4ac718079..809ca446e 100644
---
a/runtime/service/src/main/java/org/apache/polaris/service/catalog/io/ExceptionMappingFileIO.java
+++
b/runtime/service/src/main/java/org/apache/polaris/service/catalog/io/ExceptionMappingFileIO.java
@@ -19,9 +19,9 @@
package org.apache.polaris.service.catalog.io;
import com.google.common.annotations.VisibleForTesting;
+import com.google.common.base.Throwables;
import java.net.UnknownHostException;
import java.util.Map;
-import org.apache.commons.lang3.exception.ExceptionUtils;
import org.apache.iceberg.io.FileIO;
import org.apache.iceberg.io.InputFile;
import org.apache.iceberg.io.OutputFile;
@@ -36,7 +36,7 @@ public class ExceptionMappingFileIO implements FileIO {
}
private void handleException(RuntimeException e) {
- for (Throwable t : ExceptionUtils.getThrowables(e)) {
+ for (Throwable t : Throwables.getCausalChain(e)) {
// UnknownHostException isn't a RuntimeException so it's always wrapped
if (t instanceof UnknownHostException) {
throw new FileIOUnknownHostException("UnknownHostException during File
IO", t);
diff --git
a/runtime/service/src/main/java/org/apache/polaris/service/exception/IcebergExceptionMapper.java
b/runtime/service/src/main/java/org/apache/polaris/service/exception/IcebergExceptionMapper.java
index fff99e1f2..6e2dec197 100644
---
a/runtime/service/src/main/java/org/apache/polaris/service/exception/IcebergExceptionMapper.java
+++
b/runtime/service/src/main/java/org/apache/polaris/service/exception/IcebergExceptionMapper.java
@@ -23,6 +23,7 @@ import com.azure.core.exception.HttpResponseException;
import com.google.cloud.BaseServiceException;
import com.google.cloud.storage.StorageException;
import com.google.common.annotations.VisibleForTesting;
+import com.google.common.base.Throwables;
import com.google.common.collect.ImmutableSet;
import jakarta.ws.rs.WebApplicationException;
import jakarta.ws.rs.core.MediaType;
@@ -34,7 +35,6 @@ import java.util.Collection;
import java.util.Locale;
import java.util.Optional;
import java.util.Set;
-import org.apache.commons.lang3.exception.ExceptionUtils;
import org.apache.iceberg.exceptions.AlreadyExistsException;
import org.apache.iceberg.exceptions.CherrypickAncestorCommitException;
import org.apache.iceberg.exceptions.CleanableFailure;
@@ -156,7 +156,7 @@ public class IcebergExceptionMapper implements
ExceptionMapper<RuntimeException>
}
static int mapExceptionToResponseCode(RuntimeException rex) {
- for (Throwable t : ExceptionUtils.getThrowables(rex)) {
+ for (Throwable t : Throwables.getCausalChain(rex)) {
// Cloud exceptions can be wrapped by the Iceberg SDK
Optional<Integer> code = mapCloudExceptionToResponseCode(t);
if (code.isPresent()) {
diff --git
a/runtime/service/src/main/java/org/apache/polaris/service/task/TaskFileIOSupplier.java
b/runtime/service/src/main/java/org/apache/polaris/service/task/TaskFileIOSupplier.java
index 44de36210..b21eaebf5 100644
---
a/runtime/service/src/main/java/org/apache/polaris/service/task/TaskFileIOSupplier.java
+++
b/runtime/service/src/main/java/org/apache/polaris/service/task/TaskFileIOSupplier.java
@@ -24,7 +24,6 @@ import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
-import org.apache.commons.lang3.function.TriFunction;
import org.apache.iceberg.CatalogProperties;
import org.apache.iceberg.catalog.TableIdentifier;
import org.apache.iceberg.io.FileIO;
@@ -37,8 +36,7 @@ import org.apache.polaris.core.storage.PolarisStorageActions;
import org.apache.polaris.service.catalog.io.FileIOFactory;
@ApplicationScoped
-public class TaskFileIOSupplier
- implements TriFunction<TaskEntity, TableIdentifier, CallContext, FileIO> {
+public class TaskFileIOSupplier {
private final FileIOFactory fileIOFactory;
@Inject
@@ -46,7 +44,6 @@ public class TaskFileIOSupplier
this.fileIOFactory = fileIOFactory;
}
- @Override
public FileIO apply(TaskEntity task, TableIdentifier identifier, CallContext
callContext) {
Map<String, String> internalProperties = task.getInternalPropertiesAsMap();
Map<String, String> properties = new HashMap<>(internalProperties);
diff --git
a/runtime/service/src/test/java/org/apache/polaris/service/catalog/iceberg/IcebergCatalogAdapterTest.java
b/runtime/service/src/test/java/org/apache/polaris/service/catalog/iceberg/IcebergCatalogAdapterTest.java
index f8f948a66..f5e6a81c3 100644
---
a/runtime/service/src/test/java/org/apache/polaris/service/catalog/iceberg/IcebergCatalogAdapterTest.java
+++
b/runtime/service/src/test/java/org/apache/polaris/service/catalog/iceberg/IcebergCatalogAdapterTest.java
@@ -19,6 +19,7 @@
package org.apache.polaris.service.catalog.iceberg;
+import com.google.common.base.Strings;
import java.io.IOException;
import java.lang.reflect.Field;
import java.util.List;
@@ -41,7 +42,6 @@ import
org.apache.polaris.core.admin.model.IcebergRestConnectionConfigInfo;
import org.apache.polaris.core.admin.model.StorageConfigInfo;
import org.apache.polaris.service.TestServices;
import org.assertj.core.api.Assertions;
-import org.assertj.core.util.Strings;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.Arguments;