This is an automated email from the ASF dual-hosted git repository.

chaokunyang pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/incubator-fury.git


The following commit(s) were added to refs/heads/main by this push:
     new 6ad2ca57 fix(java): meta string strip last char && check empty encoded 
string (#1587)
6ad2ca57 is described below

commit 6ad2ca578630a105d2791f48f80488167340d29c
Author: qingoba <[email protected]>
AuthorDate: Sat Apr 27 13:45:48 2024 +0800

    fix(java): meta string strip last char && check empty encoded string (#1587)
    
    ## What does this PR do?
    Fix two bugs:
    + fix method `MetaString.stripLastChar()` logical error
    + add empty encoded bytes check in `MetaStringDecoder.decode()`
    
    
    ## Related issues
    - #1565
    
    
    ## Does this PR introduce any user-facing change?
    - [No] Does this PR introduce any public API change?
    - [No] Does this PR introduce any binary protocol compatibility change?
---
 .gitignore                                         |  2 ++
 .../main/java/org/apache/fury/meta/MetaString.java |  2 +-
 .../org/apache/fury/meta/MetaStringDecoder.java    |  3 +++
 .../java/org/apache/fury/meta/MetaStringTest.java  | 26 ++++++++++++++++++++++
 4 files changed, 32 insertions(+), 1 deletion(-)

diff --git a/.gitignore b/.gitignore
index c438485d..53cfc24d 100644
--- a/.gitignore
+++ b/.gitignore
@@ -36,3 +36,5 @@ javascript/**/node_modules/
 javascript/**/build
 MODULE.bazel
 MODULE.bazel.lock
+.DS_Store
+**/.DS_Store
diff --git a/java/fury-core/src/main/java/org/apache/fury/meta/MetaString.java 
b/java/fury-core/src/main/java/org/apache/fury/meta/MetaString.java
index ec164048..3c2be21b 100644
--- a/java/fury-core/src/main/java/org/apache/fury/meta/MetaString.java
+++ b/java/fury-core/src/main/java/org/apache/fury/meta/MetaString.java
@@ -79,7 +79,7 @@ public class MetaString {
     this.bytes = bytes;
     if (encoding != Encoding.UTF_8) {
       Preconditions.checkArgument(bytes.length > 0);
-      this.stripLastChar = (bytes[0] & 0b1) != 0;
+      this.stripLastChar = (bytes[0] & 0x80) != 0;
     } else {
       this.stripLastChar = false;
     }
diff --git 
a/java/fury-core/src/main/java/org/apache/fury/meta/MetaStringDecoder.java 
b/java/fury-core/src/main/java/org/apache/fury/meta/MetaStringDecoder.java
index 345663af..85df1086 100644
--- a/java/fury-core/src/main/java/org/apache/fury/meta/MetaStringDecoder.java
+++ b/java/fury-core/src/main/java/org/apache/fury/meta/MetaStringDecoder.java
@@ -48,6 +48,9 @@ public class MetaStringDecoder {
    * @return Decoded string.
    */
   public String decode(byte[] encodedData, Encoding encoding) {
+    if (encodedData.length == 0) {
+      return "";
+    }
     switch (encoding) {
       case LOWER_SPECIAL:
         return decodeLowerSpecial(encodedData);
diff --git 
a/java/fury-core/src/test/java/org/apache/fury/meta/MetaStringTest.java 
b/java/fury-core/src/test/java/org/apache/fury/meta/MetaStringTest.java
index 4fa84d75..f85d5e15 100644
--- a/java/fury-core/src/test/java/org/apache/fury/meta/MetaStringTest.java
+++ b/java/fury-core/src/test/java/org/apache/fury/meta/MetaStringTest.java
@@ -20,7 +20,9 @@
 package org.apache.fury.meta;
 
 import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertFalse;
 import static org.testng.Assert.assertNotSame;
+import static org.testng.Assert.assertTrue;
 import static org.testng.AssertJUnit.assertSame;
 
 import org.apache.fury.util.StringUtils;
@@ -188,4 +190,28 @@ public class MetaStringTest {
         decoder.decode(encodedMetaString.getBytes(), 
encodedMetaString.getEncoding());
     assertEquals(decodedString, testString);
   }
+
+  @Test
+  public void testStripLastChar() {
+    String testString = "abc"; // encoded as 1|00000|00, 001|00010, exactly 
two bytes
+    MetaStringEncoder encoder = new MetaStringEncoder('_', '$');
+    MetaString encodedMetaString = encoder.encode(testString);
+    assertFalse(encodedMetaString.stripLastChar());
+
+    testString =
+        "abcde"; // encoded as 1|00000|00, 001|00010, 00011|001, 00xxxxxx, 
stripped last char
+    encodedMetaString = encoder.encode(testString);
+    assertTrue(encodedMetaString.stripLastChar());
+  }
+
+  @Test
+  public void testEmptyString() {
+    MetaStringEncoder encoder = new MetaStringEncoder('_', '$');
+    MetaString metaString = encoder.encode("");
+    assertEquals(metaString.getBytes(), new byte[0]);
+
+    MetaStringDecoder decoder = new MetaStringDecoder('_', '$');
+    String decoded = decoder.decode(metaString.getBytes(), 
metaString.getEncoding());
+    assertEquals(decoded, "");
+  }
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to