Skip to content

Commit ea4d73d

Browse files
committed
[Java] Added support for var data in repeating groups in Java generated codecs.
1 parent c614c8d commit ea4d73d

File tree

6 files changed

+39
-24
lines changed

6 files changed

+39
-24
lines changed

build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -295,7 +295,7 @@ project(':sbe-samples') {
295295
}
296296

297297
task runJavaExamples {
298-
dependsOn 'runExampleUsingGeneratedStub', 'runExampleUsingGeneratedStubExtension', 'runOtfExample'
298+
dependsOn 'runExampleUsingGeneratedStub', 'runExampleUsingGeneratedStubExtension'
299299
}
300300

301301
task sourcesJar(type: Jar) {

sbe-samples/src/main/java/uk/co/real_logic/sbe/examples/ExampleUsingGeneratedStub.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -136,9 +136,9 @@ public static int encode(final CarEncoder car, final UnsafeBuffer directBuffer,
136136
.putManufacturerCode(MANUFACTURER_CODE, srcOffset);
137137

138138
car.fuelFiguresCount(3)
139-
.next().speed(30).mpg(35.9f)
140-
.next().speed(55).mpg(49.0f)
141-
.next().speed(75).mpg(40.0f);
139+
.next().speed(30).mpg(35.9f).usageDescription("Urban Cycle")
140+
.next().speed(55).mpg(49.0f).usageDescription("Combined Cycle")
141+
.next().speed(75).mpg(40.0f).usageDescription("Highway Cycle");
142142

143143
final CarEncoder.PerformanceFiguresEncoder perfFigures = car.performanceFiguresCount(2);
144144
perfFigures.next()
@@ -218,6 +218,7 @@ public static void decode(
218218
{
219219
sb.append("\ncar.fuelFigures.speed=").append(fuelFigures.speed());
220220
sb.append("\ncar.fuelFigures.mpg=").append(fuelFigures.mpg());
221+
sb.append("\ncar.fuelFigures.usageDescription=").append(fuelFigures.usageDescription());
221222
}
222223

223224
for (final CarDecoder.PerformanceFiguresDecoder performanceFigures : car.performanceFigures())

sbe-samples/src/main/java/uk/co/real_logic/sbe/examples/ExampleUsingGeneratedStubExtension.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -141,9 +141,9 @@ public static int encode(final baseline.CarEncoder car, final UnsafeBuffer direc
141141
.putManufacturerCode(MANUFACTURER_CODE, srcOffset);
142142

143143
car.fuelFiguresCount(3)
144-
.next().speed(30).mpg(35.9f)
145-
.next().speed(55).mpg(49.0f)
146-
.next().speed(75).mpg(40.0f);
144+
.next().speed(30).mpg(35.9f).usageDescription("Urban Cycle")
145+
.next().speed(55).mpg(49.0f).usageDescription("Combined Cycle")
146+
.next().speed(75).mpg(40.0f).usageDescription("Highway Cycle");
147147

148148
final baseline.CarEncoder.PerformanceFiguresEncoder perfFigures = car.performanceFiguresCount(2);
149149
perfFigures.next()
@@ -226,6 +226,7 @@ public static void decode(
226226
{
227227
sb.append("\ncar.fuelFigures.speed=").append(fuelFigures.speed());
228228
sb.append("\ncar.fuelFigures.mpg=").append(fuelFigures.mpg());
229+
sb.append("\ncar.fuelFigures.usageDescription=").append(fuelFigures.usageDescription());
229230
}
230231

231232
for (final extension.CarDecoder.PerformanceFiguresDecoder performanceFigures : car.performanceFigures())

sbe-samples/src/main/resources/example-extension-schema.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@
6464
<group name="fuelFigures" id="10" dimensionType="groupSizeEncoding">
6565
<field name="speed" id="11" type="uint16"/>
6666
<field name="mpg" id="12" type="float"/>
67+
<data name="usageDescription" id="200" type="varDataEncoding"/>
6768
</group>
6869
<group name="performanceFigures" id="13" dimensionType="groupSizeEncoding">
6970
<field name="octaneRating" id="14" type="Ron"/>

sbe-samples/src/main/resources/example-schema.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@
6262
<group name="fuelFigures" id="10" dimensionType="groupSizeEncoding">
6363
<field name="speed" id="11" type="uint16"/>
6464
<field name="mpg" id="12" type="float"/>
65+
<data name="usageDescription" id="200" type="varDataEncoding"/>
6566
</group>
6667
<group name="performanceFigures" id="13" dimensionType="groupSizeEncoding">
6768
<field name="octaneRating" id="14" type="Ron"/>

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

Lines changed: 28 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -187,7 +187,7 @@ private void generateEncoder(
187187
generateEncoderGroups(sb, className, groups, 0, indent);
188188
out.append(sb);
189189

190-
out.append(generateVarDataEncoders(className, varData, indent));
190+
out.append(generateDataEncoders(className, varData, indent));
191191
out.append("}\n");
192192
}
193193
}
@@ -215,6 +215,7 @@ private void generateDecoder(
215215
out.append(sb);
216216

217217
out.append(generateDataDecoders(dataFields, BASE_INDENT));
218+
218219
out.append("}\n");
219220
}
220221
}
@@ -246,6 +247,10 @@ private int generateDecoderGroups(
246247
index = generateDecoderGroups(sb, parentMessageClassName, tokens, index, indent + INDENT);
247248
}
248249

250+
final List<Token> dataFields = new ArrayList<>();
251+
collectDataFields(tokens, index, dataFields);
252+
sb.append(generateDataDecoders(dataFields, indent + INDENT));
253+
249254
sb.append(indent).append(" }\n");
250255
}
251256
}
@@ -281,6 +286,10 @@ private int generateEncoderGroups(
281286
index = generateEncoderGroups(sb, parentMessageClassName, tokens, index, indent + INDENT);
282287
}
283288

289+
final List<Token> dataFields = new ArrayList<>();
290+
collectDataFields(tokens, index, dataFields);
291+
sb.append(generateDataEncoders(groupClassName, dataFields, indent + INDENT));
292+
284293
sb.append(indent).append(" }\n");
285294
}
286295
}
@@ -619,7 +628,7 @@ private CharSequence generateDataDecoders(final List<Token> tokens, final String
619628
indent + " public int %sLength()\n" +
620629
indent + " {\n" +
621630
indent + "%s" +
622-
indent + " final int limit = limit();\n" +
631+
indent + " final int limit = parentMessage.limit();\n" +
623632
indent + " return CodecUtil.%sGet(buffer, limit%s);\n" +
624633
indent + " }\n",
625634
toLowerFirstChar(propertyName),
@@ -635,7 +644,7 @@ private CharSequence generateDataDecoders(final List<Token> tokens, final String
635644
return sb;
636645
}
637646

638-
private CharSequence generateVarDataEncoders(final String className, final List<Token> tokens, final String indent)
647+
private CharSequence generateDataEncoders(final String className, final List<Token> tokens, final String indent)
639648
{
640649
final StringBuilder sb = new StringBuilder();
641650

@@ -709,11 +718,11 @@ private void generateDataDecodeMethods(
709718
"\n" +
710719
indent + " public String %1$s()\n" +
711720
indent + " {\n" +
712-
indent + "%2$s" +
721+
"%2$s" +
713722
indent + " final int sizeOfLengthField = %3$d;\n" +
714-
indent + " final int limit = limit();\n" +
723+
indent + " final int limit = parentMessage.limit();\n" +
715724
indent + " final int dataLength = CodecUtil.%4$sGet(buffer, limit%5$s);\n" +
716-
indent + " limit(limit + sizeOfLengthField + dataLength);\n" +
725+
indent + " parentMessage.limit(limit + sizeOfLengthField + dataLength);\n" +
717726
indent + " final byte[] tmp = new byte[dataLength];\n" +
718727
indent + " buffer.getBytes(limit + sizeOfLengthField, tmp, 0, dataLength);\n\n" +
719728
indent + " final String value;\n" +
@@ -728,7 +737,7 @@ private void generateDataDecodeMethods(
728737
indent + " return value;\n" +
729738
indent + " }\n",
730739
toLowerFirstChar(propertyName),
731-
generateStringNotPresentCondition(token.version(), BASE_INDENT),
740+
generateStringNotPresentCondition(token.version(), indent),
732741
sizeOfLengthField,
733742
lengthTypePrefix,
734743
byteOrderStr,
@@ -782,8 +791,8 @@ private void generateDataEncodeMethods(
782791
indent + " }\n\n" +
783792
indent + " final int length = bytes.length;\n" +
784793
indent + " final int sizeOfLengthField = %3$d;\n" +
785-
indent + " final int limit = limit();\n" +
786-
indent + " limit(limit + sizeOfLengthField + length);\n" +
794+
indent + " final int limit = parentMessage.limit();\n" +
795+
indent + " parentMessage.limit(limit + sizeOfLengthField + length);\n" +
787796
indent + " CodecUtil.%4$sPut(buffer, limit, (%5$s)length%6$s);\n" +
788797
indent + " buffer.putBytes(limit + sizeOfLengthField, bytes, 0, length);\n\n" +
789798
indent + " return this;\n" +
@@ -810,20 +819,21 @@ private void generateDataTypedDecoder(
810819
{
811820
sb.append(String.format(
812821
"\n" +
813-
indent + " public int get%s(final %s dst, final int dstOffset, final int length)\n" +
822+
indent + " public int get%s(\n" +
823+
indent + " final %s dst, final int dstOffset, final int length)\n" +
814824
indent + " {\n" +
815-
indent + "%s" +
825+
"%s" +
816826
indent + " final int sizeOfLengthField = %d;\n" +
817-
indent + " final int limit = limit();\n" +
827+
indent + " final int limit = parentMessage.limit();\n" +
818828
indent + " final int dataLength = CodecUtil.%sGet(buffer, limit%s);\n" +
819829
indent + " final int bytesCopied = Math.min(length, dataLength);\n" +
820-
indent + " limit(limit + sizeOfLengthField + dataLength);\n" +
830+
indent + " parentMessage.limit(limit + sizeOfLengthField + dataLength);\n" +
821831
indent + " buffer.getBytes(limit + sizeOfLengthField, dst, dstOffset, bytesCopied);\n\n" +
822832
indent + " return bytesCopied;\n" +
823833
indent + " }\n",
824834
propertyName,
825835
exchangeType,
826-
generateArrayFieldNotPresentCondition(token.version(), BASE_INDENT),
836+
generateArrayFieldNotPresentCondition(token.version(), indent),
827837
sizeOfLengthField,
828838
lengthTypePrefix,
829839
byteOrderStr
@@ -842,11 +852,12 @@ private void generateDataTypedEncoder(
842852
{
843853
sb.append(String.format(
844854
"\n" +
845-
indent + " public int put%s(final %s src, final int srcOffset, final int length)\n" +
855+
indent + " public int put%s(\n" +
856+
indent + " final %s src, final int srcOffset, final int length)\n" +
846857
indent + " {\n" +
847858
indent + " final int sizeOfLengthField = %d;\n" +
848-
indent + " final int limit = limit();\n" +
849-
indent + " limit(limit + sizeOfLengthField + length);\n" +
859+
indent + " final int limit = parentMessage.limit();\n" +
860+
indent + " parentMessage.limit(limit + sizeOfLengthField + length);\n" +
850861
indent + " CodecUtil.%sPut(buffer, limit, (%s)length%s);\n" +
851862
indent + " buffer.putBytes(limit + sizeOfLengthField, src, srcOffset, length);\n\n" +
852863
indent + " return length;\n" +

0 commit comments

Comments
 (0)