Skip to content

Commit bc7c094

Browse files
author
Kyle D Kavanagh
committed
Only generate non-constant header fields in wrapAndApply method. Fixes aeron-io#602 for java only
1 parent cbb68f5 commit bc7c094

File tree

3 files changed

+57
-8
lines changed

3 files changed

+57
-8
lines changed

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

Lines changed: 31 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2272,19 +2272,42 @@ private CharSequence generateEncoderFlyweightCode(final String className, final
22722272
" }\n\n",
22732273
className,
22742274
mutableBuffer);
2275-
2276-
final String wrapAndApplyHeaderMethod = String.format(
2275+
final String indent = " ";
2276+
String wrapAndApplyHeaderMethodFmtString =
22772277
" public %1$s wrapAndApplyHeader(\n" +
22782278
" final %2$s buffer, final int offset, final %3$s headerEncoder)\n" +
22792279
" {\n" +
22802280
" headerEncoder\n" +
2281-
" .wrap(buffer, offset)\n" +
2282-
" .blockLength(BLOCK_LENGTH)\n" +
2283-
" .templateId(TEMPLATE_ID)\n" +
2284-
" .schemaId(SCHEMA_ID)\n" +
2285-
" .version(SCHEMA_VERSION);\n\n" +
2281+
" .wrap(buffer, offset)";
2282+
for (final Token headerToken : ir.headerStructure().tokens())
2283+
{
2284+
if (!headerToken.isConstantEncoding())
2285+
{
2286+
final String fieldName = headerToken.name();
2287+
switch (fieldName)
2288+
{
2289+
case "blockLength":
2290+
wrapAndApplyHeaderMethodFmtString += '\n' + indent + ".blockLength(BLOCK_LENGTH)";
2291+
break;
2292+
case "templateId":
2293+
wrapAndApplyHeaderMethodFmtString += '\n' + indent + ".templateId(TEMPLATE_ID)";
2294+
break;
2295+
case "schemaId":
2296+
wrapAndApplyHeaderMethodFmtString += '\n' + indent + ".schemaId(SCHEMA_ID)";
2297+
break;
2298+
case "version":
2299+
wrapAndApplyHeaderMethodFmtString += '\n' + indent + ".version(SCHEMA_VERSION)";
2300+
break;
2301+
}
2302+
}
2303+
}
2304+
2305+
2306+
wrapAndApplyHeaderMethodFmtString += ";\n" +
22862307
" return wrap(buffer, offset + %3$s.ENCODED_LENGTH);\n" +
2287-
" }\n\n",
2308+
" }\n\n";
2309+
final String wrapAndApplyHeaderMethod = String.format(
2310+
wrapAndApplyHeaderMethodFmtString,
22882311
className,
22892312
mutableBuffer,
22902313
formatClassName(ir.headerStructure().tokens().get(0).applicableTypeName() + "Encoder"));

sbe-tool/src/test/java/uk/co/real_logic/sbe/xml/BasicSchemaFileTest.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,13 @@ public void shouldHandleBasicFile()
3333
parse(TestUtil.getLocalResource("basic-schema.xml"), ParserOptions.DEFAULT);
3434
}
3535

36+
@Test
37+
public void shouldHandleConstantHeaderField()
38+
throws Exception
39+
{
40+
parse(TestUtil.getLocalResource("basic-schema-constant-header-field.xml"), ParserOptions.DEFAULT);
41+
}
42+
3643
@Test
3744
public void shouldHandleBasicFileWithGroup()
3845
throws Exception
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
2+
<messageSchema package="SBE tests"
3+
id="2"
4+
semanticVersion="5.2"
5+
description="Unit Test"
6+
byteOrder="littleEndian">
7+
<types>
8+
<type name="Symbol" description="Symbol" length="20" primitiveType="char" semanticType="char"/>
9+
<composite name="messageHeader" description="Message identifiers and length of message root">
10+
<type name="blockLength" primitiveType="uint16"/>
11+
<type name="templateId" primitiveType="uint16"/>
12+
<type name="schemaId" primitiveType="uint16" presence="constant">1</type>
13+
<type name="version" primitiveType="uint16"/>
14+
</composite>
15+
</types>
16+
<message name="TestMessage50001" id="50001" description="TestMessage" blockLength="16">
17+
<field name="Tag40001" id="40001" type="uint32" semanticType="int"/>
18+
</message>
19+
</messageSchema>

0 commit comments

Comments
 (0)