Skip to content

Commit c7f1ac7

Browse files
committed
[Java] Add version check to generated wrap var data method. Issue #600.
1 parent fc5911a commit c7f1ac7

File tree

1 file changed

+45
-16
lines changed

1 file changed

+45
-16
lines changed

sbe-tool/src/main/java/uk/co/real_logic/sbe/generation/java/JavaGenerator.java

Lines changed: 45 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -749,7 +749,7 @@ private void generateDataDecodeMethods(
749749
final String characterEncoding,
750750
final String indent)
751751
{
752-
generateDataTypedDecoder(
752+
generateVarDataTypedDecoder(
753753
sb,
754754
token,
755755
propertyName,
@@ -759,7 +759,7 @@ private void generateDataDecodeMethods(
759759
byteOrderStr,
760760
indent);
761761

762-
generateDataTypedDecoder(
762+
generateVarDataTypedDecoder(
763763
sb,
764764
token,
765765
propertyName,
@@ -769,19 +769,7 @@ private void generateDataDecodeMethods(
769769
byteOrderStr,
770770
indent);
771771

772-
sb.append(String.format("\n" +
773-
indent + " public void wrap%s(final %s wrapBuffer)\n" +
774-
indent + " {\n" +
775-
indent + " final int headerLength = %d;\n" +
776-
indent + " final int limit = parentMessage.limit();\n" +
777-
indent + " final int dataLength = (int)%s;\n" +
778-
indent + " parentMessage.limit(limit + headerLength + dataLength);\n" +
779-
indent + " wrapBuffer.wrap(buffer, limit + headerLength, dataLength);\n" +
780-
indent + " }\n",
781-
propertyName,
782-
readOnlyBuffer,
783-
sizeOfLengthField,
784-
generateGet(lengthType, "limit", byteOrderStr)));
772+
generateVarDataWrapDecoder(sb, token, propertyName, sizeOfLengthField, lengthType, byteOrderStr, indent);
785773

786774
if (null != characterEncoding)
787775
{
@@ -849,6 +837,32 @@ private void generateDataDecodeMethods(
849837
}
850838
}
851839

840+
private void generateVarDataWrapDecoder(
841+
final StringBuilder sb,
842+
final Token token,
843+
final String propertyName,
844+
final int sizeOfLengthField,
845+
final PrimitiveType lengthType,
846+
final String byteOrderStr,
847+
final String indent)
848+
{
849+
sb.append(String.format("\n" +
850+
indent + " public void wrap%s(final %s wrapBuffer)\n" +
851+
indent + " {\n" +
852+
"%s" +
853+
indent + " final int headerLength = %d;\n" +
854+
indent + " final int limit = parentMessage.limit();\n" +
855+
indent + " final int dataLength = (int)%s;\n" +
856+
indent + " parentMessage.limit(limit + headerLength + dataLength);\n" +
857+
indent + " wrapBuffer.wrap(buffer, limit + headerLength, dataLength);\n" +
858+
indent + " }\n",
859+
propertyName,
860+
readOnlyBuffer,
861+
generateVarWrapFieldNotPresentCondition(token.version(), indent),
862+
sizeOfLengthField,
863+
generateGet(lengthType, "limit", byteOrderStr)));
864+
}
865+
852866
private void generateDataEncodeMethods(
853867
final StringBuilder sb,
854868
final String propertyName,
@@ -993,7 +1007,7 @@ private void generateCharArrayEncodeMethods(
9931007
}
9941008
}
9951009

996-
private void generateDataTypedDecoder(
1010+
private void generateVarDataTypedDecoder(
9971011
final StringBuilder sb,
9981012
final Token token,
9991013
final String propertyName,
@@ -1721,6 +1735,21 @@ private CharSequence generatePrimitivePropertyEncode(
17211735
generatePut(encoding.primitiveType(), "offset + " + offset, "value", byteOrderStr));
17221736
}
17231737

1738+
private CharSequence generateVarWrapFieldNotPresentCondition(final int sinceVersion, final String indent)
1739+
{
1740+
if (0 == sinceVersion)
1741+
{
1742+
return "";
1743+
}
1744+
1745+
return String.format(
1746+
indent + " if (parentMessage.actingVersion < %d)\n" +
1747+
indent + " {\n" +
1748+
indent + " wrapBuffer.wrap(buffer, offset, 0);\n" +
1749+
indent + " }\n\n",
1750+
sinceVersion);
1751+
}
1752+
17241753
private CharSequence generateFieldNotPresentCondition(
17251754
final boolean inComposite, final int sinceVersion, final Encoding encoding, final String indent)
17261755
{

0 commit comments

Comments
 (0)