Skip to content

Commit 6ad2ca5

Browse files
authored
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?
1 parent 18feb0e commit 6ad2ca5

File tree

4 files changed

+32
-1
lines changed

4 files changed

+32
-1
lines changed

.gitignore

+2
Original file line numberDiff line numberDiff line change
@@ -36,3 +36,5 @@ javascript/**/node_modules/
3636
javascript/**/build
3737
MODULE.bazel
3838
MODULE.bazel.lock
39+
.DS_Store
40+
**/.DS_Store

java/fury-core/src/main/java/org/apache/fury/meta/MetaString.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ public MetaString(
7979
this.bytes = bytes;
8080
if (encoding != Encoding.UTF_8) {
8181
Preconditions.checkArgument(bytes.length > 0);
82-
this.stripLastChar = (bytes[0] & 0b1) != 0;
82+
this.stripLastChar = (bytes[0] & 0x80) != 0;
8383
} else {
8484
this.stripLastChar = false;
8585
}

java/fury-core/src/main/java/org/apache/fury/meta/MetaStringDecoder.java

+3
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,9 @@ public MetaStringDecoder(char specialChar1, char specialChar2) {
4848
* @return Decoded string.
4949
*/
5050
public String decode(byte[] encodedData, Encoding encoding) {
51+
if (encodedData.length == 0) {
52+
return "";
53+
}
5154
switch (encoding) {
5255
case LOWER_SPECIAL:
5356
return decodeLowerSpecial(encodedData);

java/fury-core/src/test/java/org/apache/fury/meta/MetaStringTest.java

+26
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,9 @@
2020
package org.apache.fury.meta;
2121

2222
import static org.testng.Assert.assertEquals;
23+
import static org.testng.Assert.assertFalse;
2324
import static org.testng.Assert.assertNotSame;
25+
import static org.testng.Assert.assertTrue;
2426
import static org.testng.AssertJUnit.assertSame;
2527

2628
import org.apache.fury.util.StringUtils;
@@ -188,4 +190,28 @@ public void testUtf8Encoding() {
188190
decoder.decode(encodedMetaString.getBytes(), encodedMetaString.getEncoding());
189191
assertEquals(decodedString, testString);
190192
}
193+
194+
@Test
195+
public void testStripLastChar() {
196+
String testString = "abc"; // encoded as 1|00000|00, 001|00010, exactly two bytes
197+
MetaStringEncoder encoder = new MetaStringEncoder('_', '$');
198+
MetaString encodedMetaString = encoder.encode(testString);
199+
assertFalse(encodedMetaString.stripLastChar());
200+
201+
testString =
202+
"abcde"; // encoded as 1|00000|00, 001|00010, 00011|001, 00xxxxxx, stripped last char
203+
encodedMetaString = encoder.encode(testString);
204+
assertTrue(encodedMetaString.stripLastChar());
205+
}
206+
207+
@Test
208+
public void testEmptyString() {
209+
MetaStringEncoder encoder = new MetaStringEncoder('_', '$');
210+
MetaString metaString = encoder.encode("");
211+
assertEquals(metaString.getBytes(), new byte[0]);
212+
213+
MetaStringDecoder decoder = new MetaStringDecoder('_', '$');
214+
String decoded = decoder.decode(metaString.getBytes(), metaString.getEncoding());
215+
assertEquals(decoded, "");
216+
}
191217
}

0 commit comments

Comments
 (0)