Skip to content

Commit c483c5c

Browse files
authored
Fix strcmp treating null and empty strings as equal (#1069)
* Fix strcmp treating null and empty strings as equal Previously, strcmp could return equality when comparing a null value with an empty string. This happened because rtrim(null) returned an empty string, causing null and "" to be treated as equivalent during comparison. This change preserves the semantic difference between null and empty strings by handling null values explicitly and delegating comparison to Comparator.nullsFirst after trimming. Behavior: - null is considered less than any non-null String - empty strings are not equal to null - trailing whitespace is ignored during comparison Issue: 207440 * A json with a string field with value "null" was being serialized as ""
1 parent cca0a3f commit c483c5c

File tree

2 files changed

+9
-4
lines changed

2 files changed

+9
-4
lines changed

common/src/main/java/com/genexus/CommonUtil.java

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import java.math.BigInteger;
2020
import java.net.HttpURLConnection;
2121
import java.net.URL;
22+
import java.util.Comparator;
2223
import java.util.regex.Matcher;
2324
import java.util.regex.Pattern;
2425

@@ -853,8 +854,12 @@ public static boolean dateCompare( Date left , Date right)
853854
public static int strcmp( String left ,
854855
String right )
855856
{
856-
return rtrim(left).compareTo(rtrim(right));
857-
}
857+
return Comparator.nullsFirst(String::compareTo)
858+
.compare(
859+
left == null ? null : rtrim(left),
860+
right == null ? null : rtrim(right)
861+
);
862+
}
858863

859864
public static boolean strcmp2( String left ,
860865
String right )
@@ -2804,7 +2809,7 @@ else if (className.equals("long") || className.equals("java.lang.Long") || class
28042809
}
28052810
else if (className.equals("string") || className.indexOf("java.lang.String") != -1)
28062811
{
2807-
return objStr.equals("null") ? null : objStr;
2812+
return (obj == JSONObject.NULL)? null : objStr;
28082813
}
28092814
else if (className.equals("double") || className.equals("java.lang.Double") || className.equals("[D"))
28102815
{

java/src/test/java/com/genexus/TestCommonUtil.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -295,7 +295,7 @@ public void testConvertObjectTo() {
295295
try{
296296
Class stringClass = Class.forName("java.lang.String");
297297
result = CommonUtil.convertObjectTo(obj, stringClass, true);
298-
Assert.assertEquals(null, result);
298+
Assert.assertEquals("null", result);
299299
} catch (Exception e){
300300
Assert.fail("Test failed " + e);
301301
}

0 commit comments

Comments
 (0)