Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -33,8 +33,7 @@ static String generateUnsetOneOfConstants(final List<Field> fields) {
return """
/** Constant for an unset oneof for $fieldName */
public static final $className<$enum> $unsetFieldName = new $className<>($enum.UNSET,null);
"""
.replace("$className", field.className())
""".replace("$className", field.className())
.replace("$enum", field.getEnumClassRef())
.replace("$fieldName", field.name())
.replace("$unsetFieldName", Common.camelToUpperSnake(field.name()) + "_UNSET")
Expand Down Expand Up @@ -94,8 +93,7 @@ static String generateParseObjectMethod(final String modelClassName, final List<
throw new ParseException(ex);
}
}
"""
.replace("$modelClassName", modelClassName)
""".replace("$modelClassName", modelClassName)
.replace(
"$fieldDefs",
fields.stream()
Expand Down Expand Up @@ -166,9 +164,12 @@ private static void generateFieldCaseStatement(
case FLOAT -> sb.append("parseFloat(v)");
case DOUBLE -> sb.append("parseDouble(v)");
case STRING ->
sb.append("unescape(checkSize(\"$fieldName\", v.STRING().getText(), $maxSize))"
.replace("$maxSize", field.maxSize() >= 0 ? String.valueOf(field.maxSize()) : "maxSize")
.replace("$fieldName", field.name()));
sb.append(
"unescape(checkSize(\"$fieldName\", v.STRING()==null?null:v.STRING().getText(), $maxSize))"
.replace(
"$maxSize",
field.maxSize() >= 0 ? String.valueOf(field.maxSize()) : "maxSize")
.replace("$fieldName", field.name()));
case BOOL -> sb.append("parseBoolean(v)");

// maxSize * 2 - because Base64. The *2 math isn't precise, but it's good enough for our purposes.
Expand All @@ -190,9 +191,12 @@ private static void generateFieldCaseStatement(
case "FloatValue" -> sb.append("parseFloat($valueGetter)");
case "DoubleValue" -> sb.append("parseDouble($valueGetter)");
case "StringValue" ->
sb.append("unescape(checkSize(\"$fieldName\", $valueGetter.STRING().getText(), $maxSize))"
.replace("$maxSize", field.maxSize() >= 0 ? String.valueOf(field.maxSize()) : "maxSize")
.replace("$fieldName", field.name()));
sb.append(
"unescape(checkSize(\"$fieldName\", $valueGetter.STRING()==null?null:$valueGetter.STRING().getText(), $maxSize))"
.replace(
"$maxSize",
field.maxSize() >= 0 ? String.valueOf(field.maxSize()) : "maxSize")
.replace("$fieldName", field.name()));
case "BoolValue" -> sb.append("parseBoolean($valueGetter)");

// maxSize * 2 - because Base64. The *2 math isn't precise, but it's good enough for our purposes:
Expand All @@ -214,15 +218,12 @@ private static void generateFieldCaseStatement(
generateFieldCaseStatement(keySB, mapField.keyField(), "mapKV");
generateFieldCaseStatement(valueSB, mapField.valueField(), "mapKV.value()");

sb.append(
"""
sb.append("""
$valueGetter.getChild(JSONParser.ObjContext.class, 0).pair().stream()
.collect(Collectors.toMap(
mapKV -> $mapEntryKey,
new UncheckedThrowingFunction<>(mapKV -> $mapEntryValue)
))"""
.replace("$mapEntryKey", keySB.toString())
.replace("$mapEntryValue", valueSB.toString()));
))""".replace("$mapEntryKey", keySB.toString()).replace("$mapEntryValue", valueSB.toString()));
} else {
switch (field.type()) {
case MESSAGE ->
Expand All @@ -237,9 +238,12 @@ private static void generateFieldCaseStatement(
case FLOAT -> sb.append("parseFloat($valueGetter)");
case DOUBLE -> sb.append("parseDouble($valueGetter)");
case STRING ->
sb.append("unescape(checkSize(\"$fieldName\", $valueGetter.STRING().getText(), $maxSize))"
.replace("$maxSize", field.maxSize() >= 0 ? String.valueOf(field.maxSize()) : "maxSize")
.replace("$fieldName", field.name()));
sb.append(
"unescape(checkSize(\"$fieldName\", $valueGetter.STRING()==null?null:$valueGetter.STRING().getText(), $maxSize))"
.replace(
"$maxSize",
field.maxSize() >= 0 ? String.valueOf(field.maxSize()) : "maxSize")
.replace("$fieldName", field.name()));
case BOOL -> sb.append("parseBoolean($valueGetter)");

// maxSize * 2 - because Base64. The *2 math isn't precise, but it's good enough for our purposes:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -144,9 +144,9 @@ public static <T> List<T> checkSize(@NonNull final String fieldName, @NonNull fi
* @return the string itself
* @throws UncheckedParseException if the string size exceeds `maxSize`
*/
public static String checkSize(@NonNull final String fieldName, @NonNull final String string, final int maxSize)
public static String checkSize(@NonNull final String fieldName, final String string, final int maxSize)
throws UncheckedParseException {
if (string.length() > maxSize) {
if (string != null && string.length() > maxSize) {
throw new UncheckedParseException(
new ParseException(fieldName + " size " + string.length() + " is greater than max " + maxSize));
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@
package com.hedera.pbj.integration.test;

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotEquals;
import static org.junit.jupiter.api.Assertions.assertTrue;

import com.google.protobuf.ByteString;
import com.google.protobuf.util.JsonFormat;
Expand All @@ -11,8 +13,10 @@
import com.hedera.pbj.integration.AccountDetailsPbj;
import com.hedera.pbj.integration.EverythingTestData;
import com.hedera.pbj.runtime.io.buffer.BufferedData;
import com.hedera.pbj.runtime.io.buffer.Bytes;
import com.hedera.pbj.runtime.io.stream.WritableStreamingData;
import com.hedera.pbj.test.proto.pbj.Everything;
import com.hedera.pbj.test.proto.pbj.MessageWithBytesAndString;
import com.hederahashgraph.api.proto.java.GetAccountDetailsResponse;
import java.io.ByteArrayOutputStream;
import java.nio.charset.StandardCharsets;
Expand Down Expand Up @@ -119,4 +123,17 @@ public void everythingTest() throws Exception {
String pbjJson = bout.toString();
assertEquals(protoCJson, pbjJson);
}

@Test
public void NullStringTest() throws Exception {
final String json = """
{
"bytesField": "308201a2300d06092a86",
"stringField": null
}
""";
MessageWithBytesAndString bytesAndString = MessageWithBytesAndString.JSON.parse(Bytes.wrap(json));
assertNotEquals(0, bytesAndString.bytesField().length());
assertTrue(bytesAndString.stringField().isEmpty());
}
}
Loading