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]

Reply via email to