Skip to content

Commit fbed609

Browse files
committed
[Java] Fix group order annotation generation.
1 parent d61377f commit fbed609

File tree

3 files changed

+77
-81
lines changed

3 files changed

+77
-81
lines changed

sbe-tool/src/main/java/uk/co/real_logic/sbe/SbeTool.java

Lines changed: 8 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -17,24 +17,13 @@
1717

1818
import org.agrona.DirectBuffer;
1919
import org.agrona.MutableDirectBuffer;
20-
import uk.co.real_logic.sbe.generation.CodeGenerator;
21-
import uk.co.real_logic.sbe.generation.TargetCodeGenerator;
22-
import uk.co.real_logic.sbe.generation.TargetCodeGeneratorLoader;
23-
import uk.co.real_logic.sbe.ir.Ir;
24-
import uk.co.real_logic.sbe.ir.IrDecoder;
25-
import uk.co.real_logic.sbe.ir.IrEncoder;
26-
import uk.co.real_logic.sbe.xml.IrGenerator;
27-
import uk.co.real_logic.sbe.xml.MessageSchema;
28-
import uk.co.real_logic.sbe.xml.ParserOptions;
29-
import uk.co.real_logic.sbe.xml.XmlSchemaParser;
30-
31-
import java.io.BufferedInputStream;
32-
import java.io.File;
33-
import java.io.InputStream;
34-
import java.nio.file.Files;
35-
import java.nio.file.Path;
36-
import java.nio.file.Paths;
3720
import org.xml.sax.InputSource;
21+
import uk.co.real_logic.sbe.generation.*;
22+
import uk.co.real_logic.sbe.ir.*;
23+
import uk.co.real_logic.sbe.xml.*;
24+
25+
import java.io.*;
26+
import java.nio.file.*;
3827

3928
/**
4029
* A tool for running the SBE parser, validator, and code generator.
@@ -52,7 +41,7 @@
5241
* <li><b>sbe.validation.stop.on.error</b>: Should the parser stop on first error encountered? Defaults to false.</li>
5342
* <li><b>sbe.validation.warnings.fatal</b>: Are warnings in parsing considered fatal? Defaults to false.</li>
5443
* <li>
55-
* <b>sbe.validation.suppress.output</b>: Should the parser suppress output during validation? Defaults to false.
44+
* <b>sbe.validation.suppress.output</b>: Should the parser suppress output during validation? Defaults to false.
5645
* </li>
5746
* <li><b>sbe.generate.stubs</b>: Generate stubs or not. Defaults to true.</li>
5847
* <li><b>sbe.target.language</b>: Target language for code generation, defaults to Java.</li>
@@ -64,7 +53,7 @@
6453
* <li><b>sbe.target.namespace</b>: Namespace for the generated code to override schema package.</li>
6554
* <li><b>sbe.cpp.namespaces.collapse</b>: Namespace for the generated code to override schema package.</li>
6655
* <li>
67-
* <b>sbe.java.generate.group-order.annotation</b>: Should the GroupOrder annotation be added to generated stubs.
56+
* <b>sbe.java.generate.group-order.annotation</b>: Should the GroupOrder annotation be added to generated stubs.
6857
* </li>
6958
* <li><b>sbe.csharp.generate.namespace.dir</b>: Should a directory be created for the namespace under
7059
* the output directory? Defaults to true</li>

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

Lines changed: 52 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -203,13 +203,16 @@ private void generateEncoder(
203203
{
204204
out.append(generateMainHeader(ir.applicableNamespace(), ENCODER, hasVarData));
205205

206-
generateAnnotations(BASE_INDENT, className, groups, out, 0, this::encoderName);
206+
if (shouldGenerateGroupOrderAnnotation)
207+
{
208+
generateAnnotations(BASE_INDENT, className, groups, out, this::encoderName);
209+
}
207210
out.append(generateDeclaration(className, implementsString, msgToken));
208211
out.append(generateEncoderFlyweightCode(className, msgToken));
209212

210213
final StringBuilder sb = new StringBuilder();
211214
generateEncoderFields(sb, className, fields, BASE_INDENT);
212-
generateEncoderGroups(sb, className, groups, BASE_INDENT, false);
215+
generateEncoderGroups(sb, className, null, groups, BASE_INDENT, false);
213216
generateEncoderVarData(sb, className, varData, BASE_INDENT);
214217

215218
generateEncoderDisplay(sb, decoderName(msgToken.name()));
@@ -234,13 +237,16 @@ private void generateDecoder(
234237
{
235238
out.append(generateMainHeader(ir.applicableNamespace(), DECODER, hasVarData));
236239

237-
generateAnnotations(BASE_INDENT, className, groups, out, 0, this::decoderName);
240+
if (shouldGenerateGroupOrderAnnotation)
241+
{
242+
generateAnnotations(BASE_INDENT, className, groups, out, this::decoderName);
243+
}
238244
out.append(generateDeclaration(className, implementsString, msgToken));
239245
out.append(generateDecoderFlyweightCode(className, msgToken));
240246

241247
final StringBuilder sb = new StringBuilder();
242248
generateDecoderFields(sb, fields, BASE_INDENT);
243-
generateDecoderGroups(sb, className, groups, BASE_INDENT, false);
249+
generateDecoderGroups(sb, className, null, groups, BASE_INDENT, false);
244250
generateDecoderVarData(sb, varData, BASE_INDENT);
245251

246252
generateDecoderDisplay(sb, msgToken.name(), fields, groups, varData);
@@ -253,6 +259,7 @@ private void generateDecoder(
253259
private void generateDecoderGroups(
254260
final StringBuilder sb,
255261
final String outerClassName,
262+
final String outerGroupName,
256263
final List<Token> tokens,
257264
final String indent,
258265
final boolean isSubGroup) throws IOException
@@ -265,7 +272,7 @@ private void generateDecoderGroups(
265272
throw new IllegalStateException("tokens must begin with BEGIN_GROUP: token=" + groupToken);
266273
}
267274

268-
final int groupIndex = i;
275+
final int index = i;
269276
final String groupName = decoderName(formatClassName(groupToken.name()));
270277

271278
++i;
@@ -282,11 +289,16 @@ private void generateDecoderGroups(
282289
i = collectVarData(tokens, i, varData);
283290

284291
generateGroupDecoderProperty(sb, groupName, groupToken, indent, isSubGroup);
285-
generateAnnotations(indent + INDENT, groupName, tokens, sb, groupIndex + 1, this::decoderName);
286-
generateGroupDecoderClassHeader(sb, groupName, outerClassName, tokens, groups, groupIndex, indent + INDENT);
292+
generateTypeJavadoc(sb, indent + INDENT, groupToken);
293+
294+
if (shouldGenerateGroupOrderAnnotation)
295+
{
296+
generateAnnotations(indent + INDENT, groupName, groups, sb, this::decoderName);
297+
}
298+
generateGroupDecoderClassHeader(sb, groupName, outerClassName, tokens, groups, index, indent + INDENT);
287299

288300
generateDecoderFields(sb, fields, indent + INDENT);
289-
generateDecoderGroups(sb, outerClassName, groups, indent + INDENT, true);
301+
generateDecoderGroups(sb, outerClassName, groupName, groups, indent + INDENT, true);
290302
generateDecoderVarData(sb, varData, indent + INDENT);
291303

292304
appendGroupInstanceDecoderDisplay(sb, fields, groups, varData, indent + INDENT);
@@ -298,6 +310,7 @@ private void generateDecoderGroups(
298310
private void generateEncoderGroups(
299311
final StringBuilder sb,
300312
final String outerClassName,
313+
final String outerGroupName,
301314
final List<Token> tokens,
302315
final String indent,
303316
final boolean isSubGroup) throws IOException
@@ -310,7 +323,7 @@ private void generateEncoderGroups(
310323
throw new IllegalStateException("tokens must begin with BEGIN_GROUP: token=" + groupToken);
311324
}
312325

313-
final int groupIndex = i;
326+
final int index = i;
314327
final String groupName = groupToken.name();
315328
final String groupClassName = encoderName(groupName);
316329

@@ -328,11 +341,16 @@ private void generateEncoderGroups(
328341
i = collectVarData(tokens, i, varData);
329342

330343
generateGroupEncoderProperty(sb, groupName, groupToken, indent, isSubGroup);
331-
generateAnnotations(indent + INDENT, groupClassName, tokens, sb, groupIndex + 1, this::encoderName);
332-
generateGroupEncoderClassHeader(sb, groupName, outerClassName, tokens, groups, groupIndex, indent + INDENT);
344+
generateTypeJavadoc(sb, indent + INDENT, groupToken);
345+
346+
if (shouldGenerateGroupOrderAnnotation)
347+
{
348+
generateAnnotations(indent + INDENT, groupClassName, groups, sb, this::encoderName);
349+
}
350+
generateGroupEncoderClassHeader(sb, groupName, outerClassName, tokens, groups, index, indent + INDENT);
333351

334352
generateEncoderFields(sb, groupClassName, fields, indent + INDENT);
335-
generateEncoderGroups(sb, outerClassName, groups, indent + INDENT, true);
353+
generateEncoderGroups(sb, outerClassName, groupClassName, groups, indent + INDENT, true);
336354
generateEncoderVarData(sb, groupClassName, varData, indent + INDENT);
337355

338356
sb.append(indent).append(" }\n");
@@ -348,7 +366,6 @@ private void generateGroupDecoderClassHeader(
348366
final int index,
349367
final String indent)
350368
{
351-
final Token groupToken = tokens.get(index);
352369
final String className = formatClassName(groupName);
353370
final int dimensionHeaderLen = tokens.get(index + 1).encodedLength();
354371

@@ -367,7 +384,6 @@ private void generateGroupDecoderClassHeader(
367384

368385
generateGroupDecoderClassDeclaration(
369386
sb,
370-
groupToken,
371387
groupName,
372388
parentMessageClassName,
373389
findSubGroupNames(subGroupTokens),
@@ -448,12 +464,10 @@ private void generateGroupEncoderClassHeader(
448464
final int index,
449465
final String ind)
450466
{
451-
final Token groupToken = tokens.get(index);
452467
final int dimensionHeaderSize = tokens.get(index + 1).encodedLength();
453468

454469
generateGroupEncoderClassDeclaration(
455470
sb,
456-
groupToken,
457471
groupName,
458472
parentMessageClassName,
459473
findSubGroupNames(subGroupTokens),
@@ -549,7 +563,6 @@ private static String primitiveTypeName(final Token token)
549563

550564
private void generateGroupDecoderClassDeclaration(
551565
final StringBuilder sb,
552-
final Token groupToken,
553566
final String groupName,
554567
final String parentMessageClassName,
555568
final List<String> subGroupNames,
@@ -558,7 +571,6 @@ private void generateGroupDecoderClassDeclaration(
558571
{
559572
final String className = formatClassName(groupName);
560573

561-
generateTypeJavadoc(sb, indent, groupToken);
562574
new Formatter(sb).format("\n" +
563575
indent + "public static class %1$s\n" +
564576
indent + " implements Iterable<%1$s>, java.util.Iterator<%1$s>\n" +
@@ -603,7 +615,6 @@ private void generateGroupDecoderClassDeclaration(
603615

604616
private void generateGroupEncoderClassDeclaration(
605617
final StringBuilder sb,
606-
final Token groupToken,
607618
final String groupName,
608619
final String parentMessageClassName,
609620
final List<String> subGroupNames,
@@ -612,7 +623,6 @@ private void generateGroupEncoderClassDeclaration(
612623
{
613624
final String className = encoderName(groupName);
614625

615-
generateTypeJavadoc(sb, indent, groupToken);
616626
new Formatter(sb).format("\n" +
617627
indent + "public static class %1$s\n" +
618628
indent + "{\n" +
@@ -1596,47 +1606,40 @@ private void generateAnnotations(
15961606
final String className,
15971607
final List<Token> tokens,
15981608
final Appendable out,
1599-
final int index,
16001609
final Function<String, String> nameMapping) throws IOException
16011610
{
1602-
if (shouldGenerateGroupOrderAnnotation)
1603-
{
1604-
final List<String> groupClassNames = new ArrayList<>();
1605-
int level = 0;
1606-
int i = index;
1611+
final List<String> groupClassNames = new ArrayList<>();
1612+
int level = 0;
16071613

1608-
for (int size = tokens.size(); i < size; i++)
1614+
for (final Token token : tokens)
1615+
{
1616+
if (token.signal() == Signal.BEGIN_GROUP)
16091617
{
1610-
if (tokens.get(index).signal() == Signal.BEGIN_GROUP)
1618+
if (1 == ++level)
16111619
{
1612-
if (++level == 1)
1613-
{
1614-
final Token groupToken = tokens.get(index);
1615-
final String groupName = groupToken.name();
1616-
groupClassNames.add(formatClassName(nameMapping.apply(groupName)));
1617-
}
1618-
}
1619-
else if (tokens.get(index).signal() == Signal.END_GROUP && --level < 0)
1620-
{
1621-
break;
1620+
groupClassNames.add(formatClassName(nameMapping.apply(token.name())));
16221621
}
16231622
}
1623+
else if (token.signal() == Signal.END_GROUP)
1624+
{
1625+
--level;
1626+
}
1627+
}
16241628

1625-
if (!groupClassNames.isEmpty())
1629+
if (!groupClassNames.isEmpty())
1630+
{
1631+
out.append(indent).append("@uk.co.real_logic.sbe.codec.java.GroupOrder({\n");
1632+
int i = 0;
1633+
for (final String name : groupClassNames)
16261634
{
1627-
out.append(indent).append("@uk.co.real_logic.sbe.codec.java.GroupOrder({");
1628-
i = 0;
1629-
for (final String name : groupClassNames)
1635+
out.append(indent).append(INDENT).append(className).append('.').append(name).append(".class");
1636+
if (++i < groupClassNames.size())
16301637
{
1631-
out.append(className).append('.').append(name).append(".class");
1632-
if (++i < groupClassNames.size())
1633-
{
1634-
out.append(", ");
1635-
}
1638+
out.append(",\n");
16361639
}
1637-
1638-
out.append("})\n");
16391640
}
1641+
1642+
out.append("})");
16401643
}
16411644
}
16421645

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

Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
*/
1616
package uk.co.real_logic.sbe.generation.java;
1717

18+
import org.agrona.Strings;
1819
import uk.co.real_logic.sbe.PrimitiveType;
1920
import uk.co.real_logic.sbe.SbeTool;
2021
import uk.co.real_logic.sbe.generation.Generators;
@@ -275,12 +276,13 @@ public static void generateTypeJavadoc(
275276
final StringBuilder sb, final String indent, final Token typeToken)
276277
{
277278
final String description = typeToken.description();
278-
if (null == description || description.isEmpty())
279+
if (Strings.isEmpty(description))
279280
{
280281
return;
281282
}
282283

283-
sb.append(indent).append("/**\n")
284+
sb.append('\n')
285+
.append(indent).append("/**\n")
284286
.append(indent).append(" * ").append(description).append('\n')
285287
.append(indent).append(" */\n");
286288
}
@@ -298,15 +300,15 @@ public static void generateOptionDecodeJavadoc(
298300
throws IOException
299301
{
300302
final String description = optionToken.description();
301-
if (null == description || description.isEmpty())
303+
if (Strings.isEmpty(description))
302304
{
303305
return;
304306
}
305307

306308
out.append(indent).append("/**\n")
307309
.append(indent).append(" * ").append(description).append('\n')
308310
.append(indent).append(" *\n")
309-
.append(indent).append(" * @return true if ").append(optionToken.name()).append(" is set or false if not\n")
311+
.append(indent).append(" * @return true if ").append(optionToken.name()).append(" set or false if not.\n")
310312
.append(indent).append(" */\n");
311313
}
312314

@@ -323,7 +325,7 @@ public static void generateOptionEncodeJavadoc(
323325
throws IOException
324326
{
325327
final String description = optionToken.description();
326-
if (null == description || description.isEmpty())
328+
if (Strings.isEmpty(description))
327329
{
328330
return;
329331
}
@@ -348,16 +350,17 @@ public static void generateFlyweightPropertyJavadoc(
348350
final StringBuilder sb, final String indent, final Token propertyToken, final String typeName)
349351
{
350352
final String description = propertyToken.description();
351-
if (null == description || description.isEmpty())
353+
if (Strings.isEmpty(description))
352354
{
353355
return;
354356
}
355357

356-
sb.append(indent).append("/**\n")
358+
sb.append('\n')
359+
.append(indent).append("/**\n")
357360
.append(indent).append(" * ").append(description).append('\n')
358361
.append(indent).append(" *\n")
359362
.append(indent).append(" * @return ").append(typeName).append(" : ").append(description).append("\n")
360-
.append(indent).append(" */\n");
363+
.append(indent).append(" */");
361364
}
362365

363366
/**
@@ -372,16 +375,17 @@ public static void generateGroupEncodePropertyJavadoc(
372375
final StringBuilder sb, final String indent, final Token propertyToken, final String typeName)
373376
{
374377
final String description = propertyToken.description();
375-
if (null == description || description.isEmpty())
378+
if (Strings.isEmpty(description))
376379
{
377380
return;
378381
}
379382

380-
sb.append(indent).append("/**\n")
383+
sb.append('\n')
384+
.append(indent).append("/**\n")
381385
.append(indent).append(" * ").append(description).append("\n")
382386
.append(indent).append(" *\n")
383-
.append(indent).append(" * @param count of times the group will be encoded\n")
384-
.append(indent).append(" * @return ").append(typeName).append(" : encoder for the group\n")
385-
.append(indent).append(" */\n");
387+
.append(indent).append(" * @param count of times the group will be encoded.\n")
388+
.append(indent).append(" * @return ").append(typeName).append(" : encoder for the group.\n")
389+
.append(indent).append(" */");
386390
}
387391
}

0 commit comments

Comments
 (0)