Skip to content

Commit 6aa2ed4

Browse files
committed
[Java] Capture sinceVersion and description for types in composites that are not directly used as a field. Remove actingVersion guard condition for encoders and apply parent message actingVersion when required in repeating groups. Issue #418.
1 parent 18e1910 commit 6aa2ed4

File tree

9 files changed

+77
-50
lines changed

9 files changed

+77
-50
lines changed

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

Lines changed: 52 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -31,12 +31,14 @@
3131
import java.util.function.Function;
3232

3333
import static uk.co.real_logic.sbe.SbeTool.JAVA_INTERFACE_PACKAGE;
34+
import static uk.co.real_logic.sbe.generation.java.JavaGenerator.CodecType.DECODER;
35+
import static uk.co.real_logic.sbe.generation.java.JavaGenerator.CodecType.ENCODER;
3436
import static uk.co.real_logic.sbe.generation.java.JavaUtil.*;
3537
import static uk.co.real_logic.sbe.ir.GenerationUtil.*;
3638

3739
public class JavaGenerator implements CodeGenerator
3840
{
39-
public enum CodecType
41+
enum CodecType
4042
{
4143
DECODER,
4244
ENCODER
@@ -248,7 +250,7 @@ private void generateDecoder(
248250
generateAnnotations(indent, className, groups, out, 0, this::decoderName);
249251
out.append(generateDeclaration(className, implementsString));
250252
out.append(generateDecoderFlyweightCode(className, msgToken));
251-
out.append(generateDecoderFields(false, fields, indent));
253+
out.append(generateDecoderFields(fields, indent));
252254

253255
final StringBuilder sb = new StringBuilder();
254256
generateDecoderGroups(sb, className, groups, indent);
@@ -288,7 +290,7 @@ private void generateDecoderGroups(
288290

289291
final List<Token> fields = new ArrayList<>();
290292
i = collectFields(tokens, i, fields);
291-
sb.append(generateDecoderFields(false, fields, indent + INDENT));
293+
sb.append(generateDecoderFields(fields, indent + INDENT));
292294

293295
final List<Token> groups = new ArrayList<>();
294296
i = collectGroups(tokens, i, groups);
@@ -519,11 +521,10 @@ private void generateGroupDecoderClassDeclaration(
519521
indent + " private final %3$s dimensions = new %3$s();\n" +
520522
indent + " private %4$s parentMessage;\n" +
521523
indent + " private %5$s buffer;\n" +
522-
indent + " private int blockLength;\n" +
523-
indent + " private int actingVersion;\n" +
524524
indent + " private int count;\n" +
525525
indent + " private int index;\n" +
526-
indent + " private int offset;\n\n",
526+
indent + " private int offset;\n" +
527+
indent + " private int blockLength;\n\n",
527528
formatClassName(groupName),
528529
dimensionHeaderSize,
529530
decoderName(dimensionsClassName),
@@ -590,7 +591,7 @@ private static CharSequence generateGroupDecoderProperty(final String groupName,
590591

591592
final String actingVersionGuard = token.version() == 0 ?
592593
"" :
593-
indent + " if (actingVersion < " + token.version() + ")\n" +
594+
indent + " if (parentMessage.actingVersion < " + token.version() + ")\n" +
594595
indent + " {\n" +
595596
indent + " " + propertyName + ".count = 0;\n" +
596597
indent + " " + propertyName + ".index = -1;\n" +
@@ -1041,17 +1042,17 @@ private void generateComposite(final List<Token> tokens) throws IOException
10411042

10421043
case BEGIN_ENUM:
10431044
out.append(sb);
1044-
out.append(generateEnumDecoder(encodingToken, propertyName, encodingToken, BASE_INDENT));
1045+
out.append(generateEnumDecoder(true, encodingToken, propertyName, encodingToken, BASE_INDENT));
10451046
break;
10461047

10471048
case BEGIN_SET:
10481049
out.append(sb);
1049-
out.append(generateBitSetProperty(propertyName, encodingToken, BASE_INDENT, typeName));
1050+
out.append(generateBitSetProperty(true, DECODER, propertyName, encodingToken, BASE_INDENT, typeName));
10501051
break;
10511052

10521053
case BEGIN_COMPOSITE:
10531054
out.append(sb);
1054-
out.append(generateCompositeProperty(propertyName, encodingToken, BASE_INDENT, typeName));
1055+
out.append(generateCompositeProperty(true, DECODER, propertyName, encodingToken, BASE_INDENT, typeName));
10551056
i += encodingToken.componentTokenCount();
10561057
break;
10571058
}
@@ -1091,12 +1092,12 @@ private void generateComposite(final List<Token> tokens) throws IOException
10911092

10921093
case BEGIN_SET:
10931094
out.append(sb);
1094-
out.append(generateBitSetProperty(propertyName, encodingToken, BASE_INDENT, typeName));
1095+
out.append(generateBitSetProperty(true, ENCODER, propertyName, encodingToken, BASE_INDENT, typeName));
10951096
break;
10961097

10971098
case BEGIN_COMPOSITE:
10981099
out.append(sb);
1099-
out.append(generateCompositeProperty(propertyName, encodingToken, BASE_INDENT, typeName));
1100+
out.append(generateCompositeProperty(true, ENCODER, propertyName, encodingToken, BASE_INDENT, typeName));
11001101
i += encodingToken.componentTokenCount();
11011102
break;
11021103
}
@@ -1558,7 +1559,7 @@ private CharSequence generateFieldNotPresentCondition(
15581559
}
15591560

15601561
return String.format(
1561-
indent + " if (actingVersion < %d)\n" +
1562+
indent + " if (parentMessage.actingVersion < %d)\n" +
15621563
indent + " {\n" +
15631564
indent + " return %s;\n" +
15641565
indent + " }\n\n",
@@ -1574,7 +1575,7 @@ private static CharSequence generateArrayFieldNotPresentCondition(final int sinc
15741575
}
15751576

15761577
return String.format(
1577-
indent + " if (actingVersion < %d)\n" +
1578+
indent + " if (parentMessage.actingVersion < %d)\n" +
15781579
indent + " {\n" +
15791580
indent + " return 0;\n" +
15801581
indent + " }\n\n",
@@ -1589,22 +1590,23 @@ private static CharSequence generateStringNotPresentCondition(final int sinceVer
15891590
}
15901591

15911592
return String.format(
1592-
indent + " if (actingVersion < %d)\n" +
1593+
indent + " if (parentMessage.actingVersion < %d)\n" +
15931594
indent + " {\n" +
15941595
indent + " return \"\";\n" +
15951596
indent + " }\n\n",
15961597
sinceVersion);
15971598
}
15981599

1599-
private static CharSequence generateTypeFieldNotPresentCondition(final int sinceVersion, final String indent)
1600+
private static CharSequence generatePropertyNotPresentCondition(
1601+
final boolean inComposite, final CodecType codecType, final int sinceVersion, final String indent)
16001602
{
1601-
if (0 == sinceVersion)
1603+
if (inComposite || codecType == ENCODER || 0 == sinceVersion)
16021604
{
16031605
return "";
16041606
}
16051607

16061608
return String.format(
1607-
indent + " if (actingVersion < %d)\n" +
1609+
indent + " if (parentMessage.actingVersion < %d)\n" +
16081610
indent + " {\n" +
16091611
indent + " return null;\n" +
16101612
indent + " }\n\n",
@@ -1906,9 +1908,7 @@ private static CharSequence generateFixedFlyweightCode(
19061908
}
19071909

19081910
private static CharSequence generateCompositeFlyweightCode(
1909-
final String className,
1910-
final int size,
1911-
final String bufferImplementation)
1911+
final String className, final int size, final String bufferImplementation)
19121912
{
19131913
return String.format(
19141914
" public static final int ENCODED_LENGTH = %2$d;\n" +
@@ -1953,7 +1953,7 @@ private CharSequence generateDecoderFlyweightCode(final String className, final
19531953
className,
19541954
readOnlyBuffer);
19551955

1956-
return generateFlyweightCode(CodecType.DECODER, className, token, wrapMethod, readOnlyBuffer);
1956+
return generateFlyweightCode(DECODER, className, token, wrapMethod, readOnlyBuffer);
19571957
}
19581958

19591959
private CharSequence generateFlyweightCode(
@@ -2082,19 +2082,19 @@ private CharSequence generateEncoderFields(final String containingClassName, fin
20822082
break;
20832083

20842084
case BEGIN_SET:
2085-
sb.append(generateBitSetProperty(propertyName, typeToken, indent, typeName));
2085+
sb.append(generateBitSetProperty(false, ENCODER, propertyName, typeToken, indent, typeName));
20862086
break;
20872087

20882088
case BEGIN_COMPOSITE:
2089-
sb.append(generateCompositeProperty(propertyName, typeToken, indent, typeName));
2089+
sb.append(generateCompositeProperty(false, ENCODER, propertyName, typeToken, indent, typeName));
20902090
break;
20912091
}
20922092
});
20932093

20942094
return sb;
20952095
}
20962096

2097-
private CharSequence generateDecoderFields(final boolean inComposite, final List<Token> tokens, final String indent)
2097+
private CharSequence generateDecoderFields(final List<Token> tokens, final String indent)
20982098
{
20992099
final StringBuilder sb = new StringBuilder();
21002100

@@ -2114,19 +2114,19 @@ private CharSequence generateDecoderFields(final boolean inComposite, final List
21142114
switch (typeToken.signal())
21152115
{
21162116
case ENCODING:
2117-
sb.append(generatePrimitiveDecoder(inComposite, propertyName, typeToken, indent));
2117+
sb.append(generatePrimitiveDecoder(false, propertyName, typeToken, indent));
21182118
break;
21192119

21202120
case BEGIN_ENUM:
2121-
sb.append(generateEnumDecoder(fieldToken, propertyName, typeToken, indent));
2121+
sb.append(generateEnumDecoder(false, fieldToken, propertyName, typeToken, indent));
21222122
break;
21232123

21242124
case BEGIN_SET:
2125-
sb.append(generateBitSetProperty(propertyName, typeToken, indent, typeName));
2125+
sb.append(generateBitSetProperty(false, DECODER, propertyName, typeToken, indent, typeName));
21262126
break;
21272127

21282128
case BEGIN_COMPOSITE:
2129-
sb.append(generateCompositeProperty(propertyName, typeToken, indent, typeName));
2129+
sb.append(generateCompositeProperty(false, DECODER, propertyName, typeToken, indent, typeName));
21302130
break;
21312131
}
21322132
});
@@ -2228,7 +2228,11 @@ private static void generateFieldMetaAttributeMethod(final StringBuilder sb, fin
22282228
}
22292229

22302230
private CharSequence generateEnumDecoder(
2231-
final Token signalToken, final String propertyName, final Token token, final String indent)
2231+
final boolean inComposite,
2232+
final Token signalToken,
2233+
final String propertyName,
2234+
final Token token,
2235+
final String indent)
22322236
{
22332237
final String enumName = formatClassName(token.name());
22342238
final Encoding encoding = token.encoding();
@@ -2256,7 +2260,7 @@ private CharSequence generateEnumDecoder(
22562260
indent + " }\n\n",
22572261
enumName,
22582262
propertyName,
2259-
generateTypeFieldNotPresentCondition(token.version(), indent),
2263+
generatePropertyNotPresentCondition(inComposite, DECODER, token.version(), indent),
22602264
enumName,
22612265
generateGet(encoding.primitiveType(), "offset + " + token.offset(), byteOrderString(encoding)));
22622266
}
@@ -2288,7 +2292,12 @@ private CharSequence generateEnumEncoder(
22882292
}
22892293

22902294
private CharSequence generateBitSetProperty(
2291-
final String propertyName, final Token token, final String indent, final String bitSetName)
2295+
final boolean inComposite,
2296+
final CodecType codecType,
2297+
final String propertyName,
2298+
final Token token,
2299+
final String indent,
2300+
final String bitSetName)
22922301
{
22932302
final StringBuilder sb = new StringBuilder();
22942303

@@ -2309,7 +2318,7 @@ private CharSequence generateBitSetProperty(
23092318
indent + " }\n",
23102319
bitSetName,
23112320
propertyName,
2312-
generateTypeFieldNotPresentCondition(token.version(), indent),
2321+
generatePropertyNotPresentCondition(inComposite, codecType, token.version(), indent),
23132322
propertyName,
23142323
token.offset(),
23152324
propertyName));
@@ -2318,7 +2327,12 @@ private CharSequence generateBitSetProperty(
23182327
}
23192328

23202329
private CharSequence generateCompositeProperty(
2321-
final String propertyName, final Token token, final String indent, final String compositeName)
2330+
final boolean inComposite,
2331+
final CodecType codecType,
2332+
final String propertyName,
2333+
final Token token,
2334+
final String indent,
2335+
final String compositeName)
23222336
{
23232337
final StringBuilder sb = new StringBuilder();
23242338

@@ -2339,7 +2353,7 @@ private CharSequence generateCompositeProperty(
23392353
indent + " }\n",
23402354
compositeName,
23412355
propertyName,
2342-
generateTypeFieldNotPresentCondition(token.version(), indent),
2356+
generatePropertyNotPresentCondition(inComposite, codecType, token.version(), indent),
23432357
propertyName,
23442358
token.offset(),
23452359
propertyName));
@@ -2648,9 +2662,9 @@ private CharSequence generateDecoderDisplay(
26482662
append(sb, indent, " builder.append(\"|sbeSchemaId=\");");
26492663
append(sb, indent, " builder.append(SCHEMA_ID);");
26502664
append(sb, indent, " builder.append(\"|sbeSchemaVersion=\");");
2651-
append(sb, indent, " if (actingVersion != SCHEMA_VERSION)");
2665+
append(sb, indent, " if (parentMessage.actingVersion != SCHEMA_VERSION)");
26522666
append(sb, indent, " {");
2653-
append(sb, indent, " builder.append(actingVersion);");
2667+
append(sb, indent, " builder.append(parentMessage.actingVersion);");
26542668
append(sb, indent, " builder.append('/');");
26552669
append(sb, indent, " }");
26562670
append(sb, indent, " builder.append(SCHEMA_VERSION);");
@@ -2850,6 +2864,7 @@ private int writeTokenDisplay(
28502864

28512865
private void appendToString(final StringBuilder sb, final String indent)
28522866
{
2867+
sb.append('\n');
28532868
append(sb, indent, "public String toString()");
28542869
append(sb, indent, "{");
28552870
append(sb, indent, " return appendTo(new StringBuilder(100)).toString();");

sbe-tool/src/main/java/uk/co/real_logic/sbe/ir/generated/FrameCodecDecoder.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -493,6 +493,7 @@ public String semanticVersion()
493493
return value;
494494
}
495495

496+
496497
public String toString()
497498
{
498499
return appendTo(new StringBuilder(100)).toString();
@@ -507,9 +508,9 @@ public StringBuilder appendTo(final StringBuilder builder)
507508
builder.append("|sbeSchemaId=");
508509
builder.append(SCHEMA_ID);
509510
builder.append("|sbeSchemaVersion=");
510-
if (actingVersion != SCHEMA_VERSION)
511+
if (parentMessage.actingVersion != SCHEMA_VERSION)
511512
{
512-
builder.append(actingVersion);
513+
builder.append(parentMessage.actingVersion);
513514
builder.append('/');
514515
}
515516
builder.append(SCHEMA_VERSION);

sbe-tool/src/main/java/uk/co/real_logic/sbe/ir/generated/FrameCodecEncoder.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -431,6 +431,7 @@ public FrameCodecEncoder semanticVersion(final String value)
431431
return this;
432432
}
433433

434+
434435
public String toString()
435436
{
436437
return appendTo(new StringBuilder(100)).toString();

sbe-tool/src/main/java/uk/co/real_logic/sbe/ir/generated/TokenCodecDecoder.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1339,6 +1339,7 @@ public String description()
13391339
return value;
13401340
}
13411341

1342+
13421343
public String toString()
13431344
{
13441345
return appendTo(new StringBuilder(100)).toString();
@@ -1353,9 +1354,9 @@ public StringBuilder appendTo(final StringBuilder builder)
13531354
builder.append("|sbeSchemaId=");
13541355
builder.append(SCHEMA_ID);
13551356
builder.append("|sbeSchemaVersion=");
1356-
if (actingVersion != SCHEMA_VERSION)
1357+
if (parentMessage.actingVersion != SCHEMA_VERSION)
13571358
{
1358-
builder.append(actingVersion);
1359+
builder.append(parentMessage.actingVersion);
13591360
builder.append('/');
13601361
}
13611362
builder.append(SCHEMA_VERSION);

sbe-tool/src/main/java/uk/co/real_logic/sbe/ir/generated/TokenCodecEncoder.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1161,6 +1161,7 @@ public TokenCodecEncoder description(final String value)
11611161
return this;
11621162
}
11631163

1164+
11641165
public String toString()
11651166
{
11661167
return appendTo(new StringBuilder(100)).toString();

sbe-tool/src/main/java/uk/co/real_logic/sbe/ir/generated/VarDataEncodingDecoder.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,7 @@ public static short varDataMaxValue()
8989
{
9090
return (short)254;
9191
}
92+
9293
public String toString()
9394
{
9495
return appendTo(new StringBuilder(100)).toString();
@@ -97,11 +98,11 @@ public String toString()
9798
public StringBuilder appendTo(final StringBuilder builder)
9899
{
99100
builder.append('(');
100-
//Token{signal=ENCODING, name='length', description='null', id=-1, version=0, encodedLength=2, offset=0, componentTokenCount=1, encoding=Encoding{presence=REQUIRED, primitiveType=UINT16, byteOrder=LITTLE_ENDIAN, minValue=null, maxValue=null, nullValue=null, constValue=null, characterEncoding='UTF-8', epoch='unix', timeUnit=nanosecond, semanticType='null'}}
101+
//Token{signal=ENCODING, name='length', description='null', id=-1, version=0, encodedLength=2, offset=0, componentTokenCount=1, encoding=Encoding{presence=REQUIRED, primitiveType=UINT16, byteOrder=LITTLE_ENDIAN, minValue=null, maxValue=null, nullValue=null, constValue=null, characterEncoding='UTF-8', epoch='null', timeUnit=null, semanticType='null'}}
101102
builder.append("length=");
102103
builder.append(length());
103104
builder.append('|');
104-
//Token{signal=ENCODING, name='varData', description='null', id=-1, version=0, encodedLength=-1, offset=2, componentTokenCount=1, encoding=Encoding{presence=REQUIRED, primitiveType=UINT8, byteOrder=LITTLE_ENDIAN, minValue=null, maxValue=null, nullValue=null, constValue=null, characterEncoding='UTF-8', epoch='unix', timeUnit=nanosecond, semanticType='null'}}
105+
//Token{signal=ENCODING, name='varData', description='null', id=-1, version=0, encodedLength=-1, offset=2, componentTokenCount=1, encoding=Encoding{presence=REQUIRED, primitiveType=UINT8, byteOrder=LITTLE_ENDIAN, minValue=null, maxValue=null, nullValue=null, constValue=null, characterEncoding='UTF-8', epoch='null', timeUnit=null, semanticType='null'}}
105106
builder.append(')');
106107

107108
return builder;

sbe-tool/src/main/java/uk/co/real_logic/sbe/ir/generated/VarDataEncodingEncoder.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,7 @@ public static short varDataMaxValue()
9090
{
9191
return (short)254;
9292
}
93+
9394
public String toString()
9495
{
9596
return appendTo(new StringBuilder(100)).toString();

sbe-tool/src/main/java/uk/co/real_logic/sbe/xml/CompositeType.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -120,9 +120,9 @@ public int encodedLength()
120120
}
121121

122122
/**
123-
* Return list of the Type that compose this composite
123+
* Return list of the {@link Type}s that compose this composite
124124
*
125-
* @return {@link List} that holds the types in this composite
125+
* @return {@link List} that holds the {@link Type}s in this composite
126126
*/
127127
public List<Type> getTypeList()
128128
{

0 commit comments

Comments
 (0)