This is an automated email from the ASF dual-hosted git repository.
dongjoon pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/spark-kubernetes-operator.git
The following commit(s) were added to refs/heads/main by this push:
new 034cefc [SPARK-53820] Introduce `o.a.s.k8s.operator.utils.StringUtils`
034cefc is described below
commit 034cefc14d1292b05f4b98a3598ea4422a4000f2
Author: Dongjoon Hyun <[email protected]>
AuthorDate: Tue Oct 7 10:13:33 2025 -0700
[SPARK-53820] Introduce `o.a.s.k8s.operator.utils.StringUtils`
### What changes were proposed in this pull request?
This PR aims to introduce `org.apache.spark.k8s.operator.utils.StringUtils`.
### Why are the changes needed?
To reduce the dependency on `commons-lang3`.
**BEFORE**
```
$ git grep org.apache.commons.lang3 | grep -v test | grep -v checkstyle |
wc -l
11
```
**AFTER**
```
$ git grep org.apache.commons.lang3 | grep -v test | grep -v checkstyle |
wc -l
0
```
### Does this PR introduce _any_ user-facing change?
No behavior change.
### How was this patch tested?
Pass the CIs.
### Was this patch authored or co-authored using generative AI tooling?
No.
Closes #370 from dongjoon-hyun/SPARK-53820.
Authored-by: Dongjoon Hyun <[email protected]>
Signed-off-by: Dongjoon Hyun <[email protected]>
---
.../spark/k8s/operator/utils/StringUtils.java | 73 ++++++++++++++++++++++
.../spark/k8s/operator/config/ConfigOption.java | 2 +-
.../operator/config/SparkOperatorConfManager.java | 3 +-
.../k8s/operator/metrics/MetricsSystemFactory.java | 3 +-
.../metrics/PrometheusPullModelHandler.java | 2 +-
.../reconciler/reconcilesteps/AppCleanUpStep.java | 2 +-
.../k8s/operator/utils/ClassLoadingUtils.java | 1 -
.../k8s/operator/utils/SparkExceptionUtils.java | 4 +-
.../org/apache/spark/k8s/operator/utils/Utils.java | 1 -
.../config/SparkOperatorConfManagerTest.java | 3 +-
.../spark/k8s/operator/SparkAppResourceSpec.java | 2 +-
.../k8s/operator/SparkAppSubmissionWorker.java | 2 +-
12 files changed, 84 insertions(+), 14 deletions(-)
diff --git
a/spark-operator-api/src/main/java/org/apache/spark/k8s/operator/utils/StringUtils.java
b/spark-operator-api/src/main/java/org/apache/spark/k8s/operator/utils/StringUtils.java
new file mode 100644
index 0000000..cf35409
--- /dev/null
+++
b/spark-operator-api/src/main/java/org/apache/spark/k8s/operator/utils/StringUtils.java
@@ -0,0 +1,73 @@
+/*
+ * 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.spark.k8s.operator.utils;
+
+import java.io.PrintWriter;
+import java.io.StringWriter;
+
+/** Utility class for string operations. */
+public final class StringUtils {
+ private StringUtils() {}
+
+ public static boolean isBlank(final String str) {
+ return str == null || str.isBlank();
+ }
+
+ public static boolean isNotBlank(final String str) {
+ return !isBlank(str);
+ }
+
+ public static boolean isEmpty(final String str) {
+ return str == null || str.length() == 0;
+ }
+
+ public static boolean isNotEmpty(final String str) {
+ return !isEmpty(str);
+ }
+
+ public static int ordinalIndexOf(final String str, final String substr,
final int ordinal) {
+ if (str == null || substr == null || ordinal <= 0) {
+ return -1;
+ }
+ if (substr.isEmpty()) {
+ return 0;
+ }
+
+ int index = -1;
+ for (int i = 0; i < ordinal; i++) {
+ index = str.indexOf(substr, index + 1);
+ if (index == -1) {
+ return -1;
+ }
+ }
+ return index;
+ }
+
+ public static String getStackTrace(Throwable throwable) {
+ if (throwable == null) {
+ return "";
+ }
+
+ StringWriter sw = new StringWriter();
+ PrintWriter pw = new PrintWriter(sw);
+ throwable.printStackTrace(pw);
+ return sw.toString();
+ }
+}
diff --git
a/spark-operator/src/main/java/org/apache/spark/k8s/operator/config/ConfigOption.java
b/spark-operator/src/main/java/org/apache/spark/k8s/operator/config/ConfigOption.java
index d5cfa86..bcf7260 100644
---
a/spark-operator/src/main/java/org/apache/spark/k8s/operator/config/ConfigOption.java
+++
b/spark-operator/src/main/java/org/apache/spark/k8s/operator/config/ConfigOption.java
@@ -27,9 +27,9 @@ import lombok.Getter;
import lombok.RequiredArgsConstructor;
import lombok.ToString;
import lombok.extern.slf4j.Slf4j;
-import org.apache.commons.lang3.StringUtils;
import org.apache.spark.k8s.operator.utils.ModelUtils;
+import org.apache.spark.k8s.operator.utils.StringUtils;
/**
* Config options for Spark Operator. Supports primitive and serialized JSON.
diff --git
a/spark-operator/src/main/java/org/apache/spark/k8s/operator/config/SparkOperatorConfManager.java
b/spark-operator/src/main/java/org/apache/spark/k8s/operator/config/SparkOperatorConfManager.java
index 5def621..225fd99 100644
---
a/spark-operator/src/main/java/org/apache/spark/k8s/operator/config/SparkOperatorConfManager.java
+++
b/spark-operator/src/main/java/org/apache/spark/k8s/operator/config/SparkOperatorConfManager.java
@@ -27,7 +27,8 @@ import java.util.Map;
import java.util.Properties;
import lombok.extern.slf4j.Slf4j;
-import org.apache.commons.lang3.StringUtils;
+
+import org.apache.spark.k8s.operator.utils.StringUtils;
/**
* Loads ConfigOption from properties file. In addition, loads hot properties
override from config
diff --git
a/spark-operator/src/main/java/org/apache/spark/k8s/operator/metrics/MetricsSystemFactory.java
b/spark-operator/src/main/java/org/apache/spark/k8s/operator/metrics/MetricsSystemFactory.java
index 15370e2..799d0df 100644
---
a/spark-operator/src/main/java/org/apache/spark/k8s/operator/metrics/MetricsSystemFactory.java
+++
b/spark-operator/src/main/java/org/apache/spark/k8s/operator/metrics/MetricsSystemFactory.java
@@ -24,9 +24,8 @@ import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
-import org.apache.commons.lang3.StringUtils;
-
import org.apache.spark.k8s.operator.config.SparkOperatorConfManager;
+import org.apache.spark.k8s.operator.utils.StringUtils;
/** Factory for MetricsSystem. */
public final class MetricsSystemFactory {
diff --git
a/spark-operator/src/main/java/org/apache/spark/k8s/operator/metrics/PrometheusPullModelHandler.java
b/spark-operator/src/main/java/org/apache/spark/k8s/operator/metrics/PrometheusPullModelHandler.java
index b8de8ed..8b723ed 100644
---
a/spark-operator/src/main/java/org/apache/spark/k8s/operator/metrics/PrometheusPullModelHandler.java
+++
b/spark-operator/src/main/java/org/apache/spark/k8s/operator/metrics/PrometheusPullModelHandler.java
@@ -40,9 +40,9 @@ import com.sun.net.httpserver.HttpHandler;
import jakarta.servlet.http.HttpServletRequest;
import lombok.Getter;
import lombok.extern.slf4j.Slf4j;
-import org.apache.commons.lang3.StringUtils;
import org.apache.spark.k8s.operator.config.SparkOperatorConf;
+import org.apache.spark.k8s.operator.utils.StringUtils;
import org.apache.spark.metrics.sink.PrometheusServlet;
/** Serves as simple Prometheus sink (pull model), presenting metrics snapshot
as HttpHandler. */
diff --git
a/spark-operator/src/main/java/org/apache/spark/k8s/operator/reconciler/reconcilesteps/AppCleanUpStep.java
b/spark-operator/src/main/java/org/apache/spark/k8s/operator/reconciler/reconcilesteps/AppCleanUpStep.java
index 3d1291e..9cfc0ed 100644
---
a/spark-operator/src/main/java/org/apache/spark/k8s/operator/reconciler/reconcilesteps/AppCleanUpStep.java
+++
b/spark-operator/src/main/java/org/apache/spark/k8s/operator/reconciler/reconcilesteps/AppCleanUpStep.java
@@ -33,7 +33,6 @@ import io.fabric8.kubernetes.api.model.Pod;
import io.fabric8.kubernetes.client.KubernetesClient;
import lombok.NoArgsConstructor;
import lombok.extern.slf4j.Slf4j;
-import org.apache.commons.lang3.StringUtils;
import org.apache.spark.k8s.operator.SparkApplication;
import org.apache.spark.k8s.operator.config.SparkOperatorConf;
@@ -48,6 +47,7 @@ import org.apache.spark.k8s.operator.status.ApplicationStatus;
import org.apache.spark.k8s.operator.utils.ReconcilerUtils;
import org.apache.spark.k8s.operator.utils.SparkAppStatusRecorder;
import org.apache.spark.k8s.operator.utils.SparkAppStatusUtils;
+import org.apache.spark.k8s.operator.utils.StringUtils;
/**
* Cleanup all secondary resources when application is deleted, or at the end
of each attempt.
diff --git
a/spark-operator/src/main/java/org/apache/spark/k8s/operator/utils/ClassLoadingUtils.java
b/spark-operator/src/main/java/org/apache/spark/k8s/operator/utils/ClassLoadingUtils.java
index 69b6535..b9f8c36 100644
---
a/spark-operator/src/main/java/org/apache/spark/k8s/operator/utils/ClassLoadingUtils.java
+++
b/spark-operator/src/main/java/org/apache/spark/k8s/operator/utils/ClassLoadingUtils.java
@@ -25,7 +25,6 @@ import java.util.List;
import java.util.Set;
import lombok.extern.slf4j.Slf4j;
-import org.apache.commons.lang3.StringUtils;
import org.apache.spark.k8s.operator.listeners.BaseStatusListener;
diff --git
a/spark-operator/src/main/java/org/apache/spark/k8s/operator/utils/SparkExceptionUtils.java
b/spark-operator/src/main/java/org/apache/spark/k8s/operator/utils/SparkExceptionUtils.java
index cf7b3c9..8a3b87d 100644
---
a/spark-operator/src/main/java/org/apache/spark/k8s/operator/utils/SparkExceptionUtils.java
+++
b/spark-operator/src/main/java/org/apache/spark/k8s/operator/utils/SparkExceptionUtils.java
@@ -22,8 +22,6 @@ package org.apache.spark.k8s.operator.utils;
import static java.net.HttpURLConnection.HTTP_CONFLICT;
import io.fabric8.kubernetes.client.KubernetesClientException;
-import org.apache.commons.lang3.StringUtils;
-import org.apache.commons.lang3.exception.ExceptionUtils;
/** Utility class for Spark exceptions. */
public final class SparkExceptionUtils {
@@ -51,6 +49,6 @@ public final class SparkExceptionUtils {
* @return A string containing the stack trace of the exception.
*/
public static String buildGeneralErrorMessage(Exception e) {
- return ExceptionUtils.getStackTrace(e);
+ return StringUtils.getStackTrace(e);
}
}
diff --git
a/spark-operator/src/main/java/org/apache/spark/k8s/operator/utils/Utils.java
b/spark-operator/src/main/java/org/apache/spark/k8s/operator/utils/Utils.java
index a91497b..6272e8d 100644
---
a/spark-operator/src/main/java/org/apache/spark/k8s/operator/utils/Utils.java
+++
b/spark-operator/src/main/java/org/apache/spark/k8s/operator/utils/Utils.java
@@ -41,7 +41,6 @@ import java.util.stream.Collectors;
import io.fabric8.kubernetes.api.model.HasMetadata;
import io.javaoperatorsdk.operator.processing.event.ResourceID;
import
io.javaoperatorsdk.operator.processing.event.source.SecondaryToPrimaryMapper;
-import org.apache.commons.lang3.StringUtils;
import org.apache.spark.k8s.operator.Constants;
import org.apache.spark.k8s.operator.SparkApplication;
diff --git
a/spark-operator/src/test/java/org/apache/spark/k8s/operator/config/SparkOperatorConfManagerTest.java
b/spark-operator/src/test/java/org/apache/spark/k8s/operator/config/SparkOperatorConfManagerTest.java
index 88bb13e..a9ac740 100644
---
a/spark-operator/src/test/java/org/apache/spark/k8s/operator/config/SparkOperatorConfManagerTest.java
+++
b/spark-operator/src/test/java/org/apache/spark/k8s/operator/config/SparkOperatorConfManagerTest.java
@@ -22,10 +22,11 @@ package org.apache.spark.k8s.operator.config;
import java.io.IOException;
import java.util.Collections;
-import org.apache.commons.lang3.StringUtils;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
+import org.apache.spark.k8s.operator.utils.StringUtils;
+
class SparkOperatorConfManagerTest {
@Test
void testLoadPropertiesFromInitFile() throws IOException {
diff --git
a/spark-submission-worker/src/main/java/org/apache/spark/k8s/operator/SparkAppResourceSpec.java
b/spark-submission-worker/src/main/java/org/apache/spark/k8s/operator/SparkAppResourceSpec.java
index 031884b..39ed3f0 100644
---
a/spark-submission-worker/src/main/java/org/apache/spark/k8s/operator/SparkAppResourceSpec.java
+++
b/spark-submission-worker/src/main/java/org/apache/spark/k8s/operator/SparkAppResourceSpec.java
@@ -35,7 +35,6 @@ import io.fabric8.kubernetes.api.model.HasMetadata;
import io.fabric8.kubernetes.api.model.Pod;
import io.fabric8.kubernetes.api.model.PodBuilder;
import lombok.Getter;
-import org.apache.commons.lang3.StringUtils;
import org.apache.spark.deploy.k8s.Config;
import org.apache.spark.deploy.k8s.Constants;
@@ -46,6 +45,7 @@ import org.apache.spark.k8s.operator.spec.ConfigMapSpec;
import org.apache.spark.k8s.operator.spec.DriverServiceIngressSpec;
import org.apache.spark.k8s.operator.utils.ConfigMapSpecUtils;
import org.apache.spark.k8s.operator.utils.DriverServiceIngressUtils;
+import org.apache.spark.k8s.operator.utils.StringUtils;
/**
* Resembles resources that would be directly launched by operator. Based on
resolved
diff --git
a/spark-submission-worker/src/main/java/org/apache/spark/k8s/operator/SparkAppSubmissionWorker.java
b/spark-submission-worker/src/main/java/org/apache/spark/k8s/operator/SparkAppSubmissionWorker.java
index 285e44d..032e198 100644
---
a/spark-submission-worker/src/main/java/org/apache/spark/k8s/operator/SparkAppSubmissionWorker.java
+++
b/spark-submission-worker/src/main/java/org/apache/spark/k8s/operator/SparkAppSubmissionWorker.java
@@ -28,7 +28,6 @@ import scala.Option;
import io.fabric8.kubernetes.client.KubernetesClient;
import org.apache.commons.codec.digest.DigestUtils;
import org.apache.commons.collections4.MapUtils;
-import org.apache.commons.lang3.StringUtils;
import org.apache.spark.SparkConf;
import org.apache.spark.deploy.k8s.KubernetesDriverSpec;
@@ -41,6 +40,7 @@ import org.apache.spark.k8s.operator.spec.ApplicationSpec;
import org.apache.spark.k8s.operator.spec.ConfigMapSpec;
import org.apache.spark.k8s.operator.spec.DriverServiceIngressSpec;
import org.apache.spark.k8s.operator.utils.ModelUtils;
+import org.apache.spark.k8s.operator.utils.StringUtils;
/**
* Similar to org.apache.spark.deploy.k8s.submit.KubernetesClientApplication.
This reads args from
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]