This is an automated email from the ASF dual-hosted git repository.
jmclean pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/gravitino.git
The following commit(s) were added to refs/heads/main by this push:
new c021835b7e [#8409]Fix delimiters in Properties.java (#8442)
c021835b7e is described below
commit c021835b7eee407bed9c9086482902b69348a641
Author: Jackeyzhe <[email protected]>
AuthorDate: Wed Sep 10 07:35:58 2025 +0800
[#8409]Fix delimiters in Properties.java (#8442)
### What changes were proposed in this pull request?
Fix delimiters in Properties.java, make sure it split string correct
with custom delimiter
### Why are the changes needed?
Fix: #8409
### Does this PR introduce _any_ user-facing change?
no
### How was this patch tested?
add unit tests
---------
Co-authored-by: jackeyzhe <[email protected]>
---
.../java/org/apache/gravitino/cli/Properties.java | 29 ++++++++++----
.../org/apache/gravitino/cli/PropertiesTest.java | 44 ++++++++++++++++++++++
2 files changed, 65 insertions(+), 8 deletions(-)
diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/Properties.java
b/clients/cli/src/main/java/org/apache/gravitino/cli/Properties.java
index 16213976cf..0c85c3b688 100644
--- a/clients/cli/src/main/java/org/apache/gravitino/cli/Properties.java
+++ b/clients/cli/src/main/java/org/apache/gravitino/cli/Properties.java
@@ -19,8 +19,10 @@
package org.apache.gravitino.cli;
+import com.google.common.base.Preconditions;
import java.util.HashMap;
import java.util.Map;
+import java.util.regex.Pattern;
/**
* A utility class to parse a delimited list of name-value pairs into a List
of key-value entries.
@@ -29,13 +31,13 @@ import java.util.Map;
* delimiter and key-value separator can be customized.
*/
public class Properties {
- private String delimiter;
- private String keyValueSeparator;
+ private Pattern delimiterPattern;
+ private Pattern keyValueSeparatorPattern;
/** Default constructor, sets the delimiter to "," and the key-value
separator to "=". */
public Properties() {
- this.delimiter = ",";
- this.keyValueSeparator = "=";
+ this.delimiterPattern = Pattern.compile(",");
+ this.keyValueSeparatorPattern = Pattern.compile("=");
}
/**
@@ -45,8 +47,13 @@ public class Properties {
* @param keyValueSeparator The separator used to distinguish keys from
values in each pair.
*/
public Properties(String delimiter, String keyValueSeparator) {
- this.delimiter = delimiter;
- this.keyValueSeparator = keyValueSeparator;
+ Preconditions.checkArgument(
+ delimiter != null && !delimiter.isEmpty(), "delimiter cannot be null
or empty");
+ Preconditions.checkArgument(
+ keyValueSeparator != null && !keyValueSeparator.isEmpty(),
+ "keyValueSeparator cannot be null or empty");
+ this.delimiterPattern = Pattern.compile(Pattern.quote(delimiter));
+ this.keyValueSeparatorPattern =
Pattern.compile(Pattern.quote(keyValueSeparator));
}
/**
@@ -63,11 +70,17 @@ public class Properties {
if (inputs != null) {
for (String input : inputs) {
+ if (input == null || input.isEmpty()) {
+ continue;
+ }
// Split the input by the delimiter into key-value pairs
- String[] pairs = input.split(delimiter);
+ String[] pairs = delimiterPattern.split(input);
for (String pair : pairs) {
+ if (pair.isEmpty()) {
+ continue;
+ }
// Split each key-value pair by the separator
- String[] keyValue = pair.split(keyValueSeparator, 2);
+ String[] keyValue = keyValueSeparatorPattern.split(pair, 2);
if (keyValue.length == 2) {
map.put(keyValue[0].trim(), keyValue[1].trim());
}
diff --git
a/clients/cli/src/test/java/org/apache/gravitino/cli/PropertiesTest.java
b/clients/cli/src/test/java/org/apache/gravitino/cli/PropertiesTest.java
index 17af8c21a7..7a7b65a351 100644
--- a/clients/cli/src/test/java/org/apache/gravitino/cli/PropertiesTest.java
+++ b/clients/cli/src/test/java/org/apache/gravitino/cli/PropertiesTest.java
@@ -23,6 +23,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertTrue;
import java.util.Map;
+import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
public class PropertiesTest {
@@ -181,4 +182,47 @@ public class PropertiesTest {
assertEquals("value2", result.get("key1"), "Last value should overwrite
previous ones");
assertEquals("value3", result.get("key2"));
}
+
+ @Test
+ public void testDelimiterWithRegexSpecialChar() {
+ Properties properties = new Properties("|", "=");
+ String[] input = {"key1=value1|key2=value2"};
+
+ Map<String, String> result = properties.parse(input);
+
+ assertEquals(2, result.size());
+ assertEquals("value1", result.get("key1"));
+ assertEquals("value2", result.get("key2"));
+ }
+
+ @Test
+ public void testSeparatorWithRegexSpecialChar() {
+ Properties properties = new Properties(",", "|");
+ String[] input = {"key1|value1,key2|value2"};
+
+ Map<String, String> result = properties.parse(input);
+
+ assertEquals(2, result.size());
+ assertEquals("value1", result.get("key1"));
+ assertEquals("value2", result.get("key2"));
+ }
+
+ @Test
+ public void testSeparatorWithNullOrEmptyInput() {
+ Throwable ex1 =
+ Assertions.assertThrows(IllegalArgumentException.class, () -> new
Properties(null, "="));
+ Assertions.assertTrue(ex1.getMessage().contains("delimiter cannot be null
or empty"));
+
+ Throwable ex2 =
+ Assertions.assertThrows(IllegalArgumentException.class, () -> new
Properties("", "="));
+ Assertions.assertTrue(ex2.getMessage().contains("delimiter cannot be null
or empty"));
+
+ Throwable ex3 =
+ Assertions.assertThrows(IllegalArgumentException.class, () -> new
Properties(",", null));
+ Assertions.assertTrue(ex3.getMessage().contains("keyValueSeparator cannot
be null or empty"));
+
+ Throwable ex4 =
+ Assertions.assertThrows(IllegalArgumentException.class, () -> new
Properties(",", ""));
+ Assertions.assertTrue(ex4.getMessage().contains("keyValueSeparator cannot
be null or empty"));
+ }
}