Pārlūkot izejas kodu

parsing improvements

iliax 2 gadi atpakaļ
vecāks
revīzija
4e4d04dc2d

+ 14 - 6
kafka-ui-api/src/main/java/com/provectus/kafka/ui/serdes/builtin/HexSerde.java

@@ -10,7 +10,7 @@ import java.util.Optional;
 
 public class HexSerde implements BuiltInSerde {
 
-  private HexFormat hexFormat;
+  private HexFormat deserializeHexFormat;
 
   public static String name() {
     return "Hex";
@@ -22,9 +22,9 @@ public class HexSerde implements BuiltInSerde {
                         PropertyResolver globalProperties) {
     String delim = serdeProperties.getProperty("delimiter", String.class).orElse(" ");
     boolean uppercase = serdeProperties.getProperty("uppercase", Boolean.class).orElse(true);
-    hexFormat = HexFormat.ofDelimiter(delim);
+    deserializeHexFormat = HexFormat.ofDelimiter(delim);
     if (uppercase) {
-      hexFormat = hexFormat.withUpperCase();
+      deserializeHexFormat = deserializeHexFormat.withUpperCase();
     }
   }
 
@@ -54,17 +54,25 @@ public class HexSerde implements BuiltInSerde {
       input = input.trim();
       // it is a hack to provide ability to sent empty array as a key/value
       if (input.length() == 0) {
-        return new byte[]{};
+        return new byte[] {};
       }
-      return hexFormat.parseHex(input);
+      return HexFormat.of().parseHex(prepareInputForParse(input));
     };
   }
 
+  // removing most-common delimiters and prefixes
+  private static String prepareInputForParse(String input) {
+    return input
+        .replaceAll(" ", "")
+        .replaceAll("#", "")
+        .replaceAll(":", "");
+  }
+
   @Override
   public Deserializer deserializer(String topic, Target type) {
     return (headers, data) ->
         new DeserializeResult(
-            hexFormat.formatHex(data),
+            deserializeHexFormat.formatHex(data),
             DeserializeResult.Type.STRING,
             Map.of()
         );

+ 16 - 5
kafka-ui-api/src/test/java/com/provectus/kafka/ui/serdes/builtin/HexSerdeTest.java

@@ -8,6 +8,7 @@ import com.provectus.kafka.ui.serdes.PropertyResolverImpl;
 import com.provectus.kafka.ui.serdes.RecordHeadersImpl;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.CsvSource;
 import org.junit.jupiter.params.provider.EnumSource;
 
 public class HexSerdeTest {
@@ -27,12 +28,22 @@ public class HexSerdeTest {
     );
   }
 
+
   @ParameterizedTest
-  @EnumSource
-  void serializesInputAsHexString(Serde.Target type) {
-    var serializer = hexSerde.serializer("anyTopic", type);
-    byte[] bytes = serializer.serialize(TEST_BYTES_HEX_ENCODED);
-    assertThat(bytes).isEqualTo(TEST_BYTES);
+  @CsvSource({
+      "68656C6C6F20776F726C64", // uppercase
+      "68656c6c6f20776f726c64", // lowercase
+      "68:65:6c:6c:6f:20:77:6f:72:6c:64", // ':' delim
+      "68 65 6C 6C 6F 20 77 6F 72 6C 64", // space delim, UC
+      "68 65 6c 6c 6f 20 77 6f 72 6c 64", // space delim, LC
+      "#68 #65 #6C #6C #6F #20 #77 #6F #72 #6C #64"  // '#' prefix, space delim
+  })
+  void serializesInputAsHexString(String hexString) {
+    for (Serde.Target type : Serde.Target.values()) {
+      var serializer = hexSerde.serializer("anyTopic", type);
+      byte[] bytes = serializer.serialize(hexString);
+      assertThat(bytes).isEqualTo(TEST_BYTES);
+    }
   }
 
   @ParameterizedTest