31
31
import java .util .function .Function ;
32
32
33
33
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 ;
34
36
import static uk .co .real_logic .sbe .generation .java .JavaUtil .*;
35
37
import static uk .co .real_logic .sbe .ir .GenerationUtil .*;
36
38
37
39
public class JavaGenerator implements CodeGenerator
38
40
{
39
- public enum CodecType
41
+ enum CodecType
40
42
{
41
43
DECODER ,
42
44
ENCODER
@@ -248,7 +250,7 @@ private void generateDecoder(
248
250
generateAnnotations (indent , className , groups , out , 0 , this ::decoderName );
249
251
out .append (generateDeclaration (className , implementsString ));
250
252
out .append (generateDecoderFlyweightCode (className , msgToken ));
251
- out .append (generateDecoderFields (false , fields , indent ));
253
+ out .append (generateDecoderFields (fields , indent ));
252
254
253
255
final StringBuilder sb = new StringBuilder ();
254
256
generateDecoderGroups (sb , className , groups , indent );
@@ -288,7 +290,7 @@ private void generateDecoderGroups(
288
290
289
291
final List <Token > fields = new ArrayList <>();
290
292
i = collectFields (tokens , i , fields );
291
- sb .append (generateDecoderFields (false , fields , indent + INDENT ));
293
+ sb .append (generateDecoderFields (fields , indent + INDENT ));
292
294
293
295
final List <Token > groups = new ArrayList <>();
294
296
i = collectGroups (tokens , i , groups );
@@ -519,11 +521,10 @@ private void generateGroupDecoderClassDeclaration(
519
521
indent + " private final %3$s dimensions = new %3$s();\n " +
520
522
indent + " private %4$s parentMessage;\n " +
521
523
indent + " private %5$s buffer;\n " +
522
- indent + " private int blockLength;\n " +
523
- indent + " private int actingVersion;\n " +
524
524
indent + " private int count;\n " +
525
525
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 " ,
527
528
formatClassName (groupName ),
528
529
dimensionHeaderSize ,
529
530
decoderName (dimensionsClassName ),
@@ -590,7 +591,7 @@ private static CharSequence generateGroupDecoderProperty(final String groupName,
590
591
591
592
final String actingVersionGuard = token .version () == 0 ?
592
593
"" :
593
- indent + " if (actingVersion < " + token .version () + ")\n " +
594
+ indent + " if (parentMessage. actingVersion < " + token .version () + ")\n " +
594
595
indent + " {\n " +
595
596
indent + " " + propertyName + ".count = 0;\n " +
596
597
indent + " " + propertyName + ".index = -1;\n " +
@@ -1041,17 +1042,17 @@ private void generateComposite(final List<Token> tokens) throws IOException
1041
1042
1042
1043
case BEGIN_ENUM :
1043
1044
out .append (sb );
1044
- out .append (generateEnumDecoder (encodingToken , propertyName , encodingToken , BASE_INDENT ));
1045
+ out .append (generateEnumDecoder (true , encodingToken , propertyName , encodingToken , BASE_INDENT ));
1045
1046
break ;
1046
1047
1047
1048
case BEGIN_SET :
1048
1049
out .append (sb );
1049
- out .append (generateBitSetProperty (propertyName , encodingToken , BASE_INDENT , typeName ));
1050
+ out .append (generateBitSetProperty (true , DECODER , propertyName , encodingToken , BASE_INDENT , typeName ));
1050
1051
break ;
1051
1052
1052
1053
case BEGIN_COMPOSITE :
1053
1054
out .append (sb );
1054
- out .append (generateCompositeProperty (propertyName , encodingToken , BASE_INDENT , typeName ));
1055
+ out .append (generateCompositeProperty (true , DECODER , propertyName , encodingToken , BASE_INDENT , typeName ));
1055
1056
i += encodingToken .componentTokenCount ();
1056
1057
break ;
1057
1058
}
@@ -1091,12 +1092,12 @@ private void generateComposite(final List<Token> tokens) throws IOException
1091
1092
1092
1093
case BEGIN_SET :
1093
1094
out .append (sb );
1094
- out .append (generateBitSetProperty (propertyName , encodingToken , BASE_INDENT , typeName ));
1095
+ out .append (generateBitSetProperty (true , ENCODER , propertyName , encodingToken , BASE_INDENT , typeName ));
1095
1096
break ;
1096
1097
1097
1098
case BEGIN_COMPOSITE :
1098
1099
out .append (sb );
1099
- out .append (generateCompositeProperty (propertyName , encodingToken , BASE_INDENT , typeName ));
1100
+ out .append (generateCompositeProperty (true , ENCODER , propertyName , encodingToken , BASE_INDENT , typeName ));
1100
1101
i += encodingToken .componentTokenCount ();
1101
1102
break ;
1102
1103
}
@@ -1558,7 +1559,7 @@ private CharSequence generateFieldNotPresentCondition(
1558
1559
}
1559
1560
1560
1561
return String .format (
1561
- indent + " if (actingVersion < %d)\n " +
1562
+ indent + " if (parentMessage. actingVersion < %d)\n " +
1562
1563
indent + " {\n " +
1563
1564
indent + " return %s;\n " +
1564
1565
indent + " }\n \n " ,
@@ -1574,7 +1575,7 @@ private static CharSequence generateArrayFieldNotPresentCondition(final int sinc
1574
1575
}
1575
1576
1576
1577
return String .format (
1577
- indent + " if (actingVersion < %d)\n " +
1578
+ indent + " if (parentMessage. actingVersion < %d)\n " +
1578
1579
indent + " {\n " +
1579
1580
indent + " return 0;\n " +
1580
1581
indent + " }\n \n " ,
@@ -1589,22 +1590,23 @@ private static CharSequence generateStringNotPresentCondition(final int sinceVer
1589
1590
}
1590
1591
1591
1592
return String .format (
1592
- indent + " if (actingVersion < %d)\n " +
1593
+ indent + " if (parentMessage. actingVersion < %d)\n " +
1593
1594
indent + " {\n " +
1594
1595
indent + " return \" \" ;\n " +
1595
1596
indent + " }\n \n " ,
1596
1597
sinceVersion );
1597
1598
}
1598
1599
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 )
1600
1602
{
1601
- if (0 == sinceVersion )
1603
+ if (inComposite || codecType == ENCODER || 0 == sinceVersion )
1602
1604
{
1603
1605
return "" ;
1604
1606
}
1605
1607
1606
1608
return String .format (
1607
- indent + " if (actingVersion < %d)\n " +
1609
+ indent + " if (parentMessage. actingVersion < %d)\n " +
1608
1610
indent + " {\n " +
1609
1611
indent + " return null;\n " +
1610
1612
indent + " }\n \n " ,
@@ -1906,9 +1908,7 @@ private static CharSequence generateFixedFlyweightCode(
1906
1908
}
1907
1909
1908
1910
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 )
1912
1912
{
1913
1913
return String .format (
1914
1914
" public static final int ENCODED_LENGTH = %2$d;\n " +
@@ -1953,7 +1953,7 @@ private CharSequence generateDecoderFlyweightCode(final String className, final
1953
1953
className ,
1954
1954
readOnlyBuffer );
1955
1955
1956
- return generateFlyweightCode (CodecType . DECODER , className , token , wrapMethod , readOnlyBuffer );
1956
+ return generateFlyweightCode (DECODER , className , token , wrapMethod , readOnlyBuffer );
1957
1957
}
1958
1958
1959
1959
private CharSequence generateFlyweightCode (
@@ -2082,19 +2082,19 @@ private CharSequence generateEncoderFields(final String containingClassName, fin
2082
2082
break ;
2083
2083
2084
2084
case BEGIN_SET :
2085
- sb .append (generateBitSetProperty (propertyName , typeToken , indent , typeName ));
2085
+ sb .append (generateBitSetProperty (false , ENCODER , propertyName , typeToken , indent , typeName ));
2086
2086
break ;
2087
2087
2088
2088
case BEGIN_COMPOSITE :
2089
- sb .append (generateCompositeProperty (propertyName , typeToken , indent , typeName ));
2089
+ sb .append (generateCompositeProperty (false , ENCODER , propertyName , typeToken , indent , typeName ));
2090
2090
break ;
2091
2091
}
2092
2092
});
2093
2093
2094
2094
return sb ;
2095
2095
}
2096
2096
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 )
2098
2098
{
2099
2099
final StringBuilder sb = new StringBuilder ();
2100
2100
@@ -2114,19 +2114,19 @@ private CharSequence generateDecoderFields(final boolean inComposite, final List
2114
2114
switch (typeToken .signal ())
2115
2115
{
2116
2116
case ENCODING :
2117
- sb .append (generatePrimitiveDecoder (inComposite , propertyName , typeToken , indent ));
2117
+ sb .append (generatePrimitiveDecoder (false , propertyName , typeToken , indent ));
2118
2118
break ;
2119
2119
2120
2120
case BEGIN_ENUM :
2121
- sb .append (generateEnumDecoder (fieldToken , propertyName , typeToken , indent ));
2121
+ sb .append (generateEnumDecoder (false , fieldToken , propertyName , typeToken , indent ));
2122
2122
break ;
2123
2123
2124
2124
case BEGIN_SET :
2125
- sb .append (generateBitSetProperty (propertyName , typeToken , indent , typeName ));
2125
+ sb .append (generateBitSetProperty (false , DECODER , propertyName , typeToken , indent , typeName ));
2126
2126
break ;
2127
2127
2128
2128
case BEGIN_COMPOSITE :
2129
- sb .append (generateCompositeProperty (propertyName , typeToken , indent , typeName ));
2129
+ sb .append (generateCompositeProperty (false , DECODER , propertyName , typeToken , indent , typeName ));
2130
2130
break ;
2131
2131
}
2132
2132
});
@@ -2228,7 +2228,11 @@ private static void generateFieldMetaAttributeMethod(final StringBuilder sb, fin
2228
2228
}
2229
2229
2230
2230
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 )
2232
2236
{
2233
2237
final String enumName = formatClassName (token .name ());
2234
2238
final Encoding encoding = token .encoding ();
@@ -2256,7 +2260,7 @@ private CharSequence generateEnumDecoder(
2256
2260
indent + " }\n \n " ,
2257
2261
enumName ,
2258
2262
propertyName ,
2259
- generateTypeFieldNotPresentCondition ( token .version (), indent ),
2263
+ generatePropertyNotPresentCondition ( inComposite , DECODER , token .version (), indent ),
2260
2264
enumName ,
2261
2265
generateGet (encoding .primitiveType (), "offset + " + token .offset (), byteOrderString (encoding )));
2262
2266
}
@@ -2288,7 +2292,12 @@ private CharSequence generateEnumEncoder(
2288
2292
}
2289
2293
2290
2294
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 )
2292
2301
{
2293
2302
final StringBuilder sb = new StringBuilder ();
2294
2303
@@ -2309,7 +2318,7 @@ private CharSequence generateBitSetProperty(
2309
2318
indent + " }\n " ,
2310
2319
bitSetName ,
2311
2320
propertyName ,
2312
- generateTypeFieldNotPresentCondition ( token .version (), indent ),
2321
+ generatePropertyNotPresentCondition ( inComposite , codecType , token .version (), indent ),
2313
2322
propertyName ,
2314
2323
token .offset (),
2315
2324
propertyName ));
@@ -2318,7 +2327,12 @@ private CharSequence generateBitSetProperty(
2318
2327
}
2319
2328
2320
2329
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 )
2322
2336
{
2323
2337
final StringBuilder sb = new StringBuilder ();
2324
2338
@@ -2339,7 +2353,7 @@ private CharSequence generateCompositeProperty(
2339
2353
indent + " }\n " ,
2340
2354
compositeName ,
2341
2355
propertyName ,
2342
- generateTypeFieldNotPresentCondition ( token .version (), indent ),
2356
+ generatePropertyNotPresentCondition ( inComposite , codecType , token .version (), indent ),
2343
2357
propertyName ,
2344
2358
token .offset (),
2345
2359
propertyName ));
@@ -2648,9 +2662,9 @@ private CharSequence generateDecoderDisplay(
2648
2662
append (sb , indent , " builder.append(\" |sbeSchemaId=\" );" );
2649
2663
append (sb , indent , " builder.append(SCHEMA_ID);" );
2650
2664
append (sb , indent , " builder.append(\" |sbeSchemaVersion=\" );" );
2651
- append (sb , indent , " if (actingVersion != SCHEMA_VERSION)" );
2665
+ append (sb , indent , " if (parentMessage. actingVersion != SCHEMA_VERSION)" );
2652
2666
append (sb , indent , " {" );
2653
- append (sb , indent , " builder.append(actingVersion);" );
2667
+ append (sb , indent , " builder.append(parentMessage. actingVersion);" );
2654
2668
append (sb , indent , " builder.append('/');" );
2655
2669
append (sb , indent , " }" );
2656
2670
append (sb , indent , " builder.append(SCHEMA_VERSION);" );
@@ -2850,6 +2864,7 @@ private int writeTokenDisplay(
2850
2864
2851
2865
private void appendToString (final StringBuilder sb , final String indent )
2852
2866
{
2867
+ sb .append ('\n' );
2853
2868
append (sb , indent , "public String toString()" );
2854
2869
append (sb , indent , "{" );
2855
2870
append (sb , indent , " return appendTo(new StringBuilder(100)).toString();" );
0 commit comments