From 012e3e1b5fb99e1d2e991aaddd67249a8c69e45b Mon Sep 17 00:00:00 2001 From: ratcash Date: Mon, 3 Oct 2022 14:55:11 +0200 Subject: [PATCH 1/6] enhanced test case. --- .../resources/explicit-package-test-schema.xml | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/sbe-tool/src/test/resources/explicit-package-test-schema.xml b/sbe-tool/src/test/resources/explicit-package-test-schema.xml index a0e02791b1..fc3aaf6929 100644 --- a/sbe-tool/src/test/resources/explicit-package-test-schema.xml +++ b/sbe-tool/src/test/resources/explicit-package-test-schema.xml @@ -18,6 +18,13 @@ + + + + + + + @@ -25,6 +32,10 @@ 0 1 + + + + 0 1 @@ -34,6 +45,13 @@ 5 6 + + 1 + 2 + 3 + 4 + 5 + From e9a60d5e8e7a92eb7ca168bc1cd3074a4b41937f Mon Sep 17 00:00:00 2001 From: ratcash Date: Mon, 3 Oct 2022 15:06:56 +0200 Subject: [PATCH 2/6] Bugfix: embedded composites were missing import for required types. --- .../sbe/generation/java/JavaGenerator.java | 22 ++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/sbe-tool/src/main/java/uk/co/real_logic/sbe/generation/java/JavaGenerator.java b/sbe-tool/src/main/java/uk/co/real_logic/sbe/generation/java/JavaGenerator.java index f02cfc419d..d5fed7dcd1 100644 --- a/sbe-tool/src/main/java/uk/co/real_logic/sbe/generation/java/JavaGenerator.java +++ b/sbe-tool/src/main/java/uk/co/real_logic/sbe/generation/java/JavaGenerator.java @@ -1332,6 +1332,17 @@ private void generateComposite(final List tokens) throws IOException try (Writer out = outputManager.createOutput(decoderName)) { final String implementsString = implementsInterface(CompositeDecoderFlyweight.class.getSimpleName()); + for (int i = 1; i < tokens.size() - 1; i++) + { + // scan ahead possible types we'll need to import + final Token typeToken = tokens.get(i); + if (typeToken.signal() == Signal.BEGIN_ENUM || + typeToken.signal() == Signal.BEGIN_SET || + typeToken.signal() == Signal.BEGIN_COMPOSITE) + { + registerTypesPackageName(typeToken, ir); + } + } generateCompositeFlyweightHeader( token, decoderName, out, readOnlyBuffer, fqReadOnlyBuffer, implementsString); @@ -1620,11 +1631,20 @@ private String interfaceImportLine() private CharSequence generateFileHeader(final String packageName, final String fqBuffer) { + final StringBuilder packageImports = new StringBuilder(); + for (final String typePackage : packageNameByTypes) + { + packageImports.append("import "); + packageImports.append(typePackage); + packageImports.append(".*;\n"); + } + return "/* Generated SBE (Simple Binary Encoding) message codec. */\n" + "package " + packageName + ";\n\n" + "import " + fqBuffer + ";\n" + - interfaceImportLine(); + interfaceImportLine() + + packageImports; } private CharSequence generateMainHeader( From 370ec2885a5d5d38ddefc30eb0bb4f6c7f668a7c Mon Sep 17 00:00:00 2001 From: ratcash Date: Mon, 3 Oct 2022 22:56:10 +0200 Subject: [PATCH 3/6] polish --- .../sbe/generation/java/JavaGenerator.java | 115 +++++++++++------- 1 file changed, 74 insertions(+), 41 deletions(-) diff --git a/sbe-tool/src/main/java/uk/co/real_logic/sbe/generation/java/JavaGenerator.java b/sbe-tool/src/main/java/uk/co/real_logic/sbe/generation/java/JavaGenerator.java index d5fed7dcd1..0dee946be7 100644 --- a/sbe-tool/src/main/java/uk/co/real_logic/sbe/generation/java/JavaGenerator.java +++ b/sbe-tool/src/main/java/uk/co/real_logic/sbe/generation/java/JavaGenerator.java @@ -29,6 +29,7 @@ import java.io.IOException; import java.io.Writer; import java.util.ArrayList; +import java.util.Collections; import java.util.Formatter; import java.util.HashSet; import java.util.List; @@ -60,6 +61,7 @@ enum CodecType private static final String PACKAGE_INFO = "package-info"; private static final String BASE_INDENT = ""; private static final String INDENT = " "; + private static final Set NO_PACKAGES = Collections.unmodifiableSet(new HashSet<>()); private final Ir ir; private final DynamicPackageOutputManager outputManager; @@ -184,11 +186,15 @@ public void generateTypeStubs() throws IOException */ private String registerTypesPackageName(final Token token, final Ir ir) { - if (shouldSupportTypesPackageNames && token.packageName() != null) + + if (!shouldSupportTypesPackageNames) + { + return ir.applicableNamespace(); + } + if (token.packageName() != null) { packageNameByTypes.add(token.packageName()); outputManager.setPackageName(token.packageName()); - return token.packageName(); } return ir.applicableNamespace(); @@ -1243,7 +1249,8 @@ private void generateBitSet(final List tokens) throws IOException try (Writer out = outputManager.createOutput(decoderName)) { final Encoding encoding = token.encoding(); - generateFixedFlyweightHeader(out, token, decoderName, implementsString, readOnlyBuffer, fqReadOnlyBuffer); + generateFixedFlyweightHeader(out, token, decoderName, implementsString, readOnlyBuffer, fqReadOnlyBuffer, + NO_PACKAGES); out.append(generateChoiceIsEmpty(encoding.primitiveType())); new Formatter(out).format( @@ -1263,7 +1270,8 @@ private void generateBitSet(final List tokens) throws IOException registerTypesPackageName(token, ir); try (Writer out = outputManager.createOutput(encoderName)) { - generateFixedFlyweightHeader(out, token, encoderName, implementsString, mutableBuffer, fqMutableBuffer); + generateFixedFlyweightHeader(out, token, encoderName, implementsString, mutableBuffer, fqMutableBuffer, + NO_PACKAGES); generateChoiceClear(out, encoderName, token); generateChoiceEncoders(out, encoderName, choiceList); out.append("}\n"); @@ -1276,10 +1284,11 @@ private void generateFixedFlyweightHeader( final String typeName, final String implementsString, final String buffer, - final String fqBuffer) throws IOException + final String fqBuffer, + final Set additionalPackages) throws IOException { final String packageName = registerTypesPackageName(token, ir); - out.append(generateFileHeader(packageName, fqBuffer)); + out.append(generateFileHeader(packageName, additionalPackages, fqBuffer)); out.append(generateDeclaration(typeName, implementsString, token)); out.append(generateFixedFlyweightCode(typeName, token.encodedLength(), buffer)); } @@ -1290,10 +1299,11 @@ private void generateCompositeFlyweightHeader( final Writer out, final String buffer, final String fqBuffer, - final String implementsString) throws IOException + final String implementsString, + final Set additionalPackages) throws IOException { final String packageName = registerTypesPackageName(token, ir); - out.append(generateFileHeader(packageName, fqBuffer)); + out.append(generateFileHeader(packageName, additionalPackages, fqBuffer)); out.append(generateDeclaration(typeName, implementsString, token)); out.append(generateFixedFlyweightCode(typeName, token.encodedLength(), buffer)); } @@ -1329,22 +1339,12 @@ private void generateComposite(final List tokens) throws IOException final String encoderName = encoderName(compositeName); registerTypesPackageName(token, ir); + final Set additionalPackages = scanPackagesToImport(tokens); try (Writer out = outputManager.createOutput(decoderName)) { final String implementsString = implementsInterface(CompositeDecoderFlyweight.class.getSimpleName()); - for (int i = 1; i < tokens.size() - 1; i++) - { - // scan ahead possible types we'll need to import - final Token typeToken = tokens.get(i); - if (typeToken.signal() == Signal.BEGIN_ENUM || - typeToken.signal() == Signal.BEGIN_SET || - typeToken.signal() == Signal.BEGIN_COMPOSITE) - { - registerTypesPackageName(typeToken, ir); - } - } generateCompositeFlyweightHeader( - token, decoderName, out, readOnlyBuffer, fqReadOnlyBuffer, implementsString); + token, decoderName, out, readOnlyBuffer, fqReadOnlyBuffer, implementsString, additionalPackages); for (int i = 1, end = tokens.size() - 1; i < end;) { @@ -1392,7 +1392,8 @@ private void generateComposite(final List tokens) throws IOException try (Writer out = outputManager.createOutput(encoderName)) { final String implementsString = implementsInterface(CompositeEncoderFlyweight.class.getSimpleName()); - generateCompositeFlyweightHeader(token, encoderName, out, mutableBuffer, fqMutableBuffer, implementsString); + generateCompositeFlyweightHeader(token, encoderName, out, mutableBuffer, fqMutableBuffer, implementsString, + additionalPackages); for (int i = 1, end = tokens.size() - 1; i < end;) { @@ -1434,6 +1435,30 @@ private void generateComposite(final List tokens) throws IOException } } + private Set scanPackagesToImport(final List tokens) + { + if (!shouldSupportTypesPackageNames) + { + return NO_PACKAGES; + } + + final Set packagesToImport = new HashSet<>(); + for (int i = 1; i < tokens.size() - 1; i++) + { + final Token typeToken = tokens.get(i); + if (typeToken.signal() == Signal.BEGIN_ENUM || + typeToken.signal() == Signal.BEGIN_SET || + typeToken.signal() == Signal.BEGIN_COMPOSITE) + { + if (typeToken.packageName() != null) + { + packagesToImport.add(typeToken.packageName()); + } + } + } + return packagesToImport; + } + private void generateChoiceClear(final Appendable out, final String bitSetClassName, final Token token) throws IOException { @@ -1619,6 +1644,25 @@ private CharSequence generateEnumLookupMethod(final List tokens, final St return sb; } + private StringBuilder generateImportStatements(final Set packages, final String currentPackage) + { + final StringBuilder importsStatements = new StringBuilder(); + for (final String candidatePackage : packages) + { + if (!candidatePackage.equalsIgnoreCase(currentPackage)) + { + importsStatements.append("import "); + importsStatements.append(candidatePackage); + importsStatements.append(".*;\n"); + } + } + if (importsStatements.length() > 0) + { + importsStatements.append("\n\n"); + } + return importsStatements; + } + private String interfaceImportLine() { if (!shouldGenerateInterfaces) @@ -1629,34 +1673,23 @@ private String interfaceImportLine() return "import " + JAVA_INTERFACE_PACKAGE + ".*;\n\n"; } - private CharSequence generateFileHeader(final String packageName, final String fqBuffer) + + private CharSequence generateFileHeader(final String packageName, final Set additionalPackages, + final String fqBuffer) { - final StringBuilder packageImports = new StringBuilder(); - for (final String typePackage : packageNameByTypes) - { - packageImports.append("import "); - packageImports.append(typePackage); - packageImports.append(".*;\n"); - } + final StringBuilder importStatements = generateImportStatements(additionalPackages, packageName); - return - "/* Generated SBE (Simple Binary Encoding) message codec. */\n" + + return "/* Generated SBE (Simple Binary Encoding) message codec. */\n" + "package " + packageName + ";\n\n" + "import " + fqBuffer + ";\n" + interfaceImportLine() + - packageImports; + importStatements; } private CharSequence generateMainHeader( final String packageName, final CodecType codecType, final boolean hasVarData) { - final StringBuilder packageImports = new StringBuilder(); - for (final String typePackage : packageNameByTypes) - { - packageImports.append("import "); - packageImports.append(typePackage); - packageImports.append(".*;\n"); - } + final StringBuilder importStatements = generateImportStatements(packageNameByTypes, packageName); if (fqMutableBuffer.equals(fqReadOnlyBuffer)) { @@ -1665,7 +1698,7 @@ private CharSequence generateMainHeader( "package " + packageName + ";\n\n" + "import " + fqMutableBuffer + ";\n" + interfaceImportLine() + - packageImports; + importStatements; } else { @@ -1678,7 +1711,7 @@ private CharSequence generateMainHeader( (hasMutableBuffer ? "import " + fqMutableBuffer + ";\n" : "") + (hasReadOnlyBuffer ? "import " + fqReadOnlyBuffer + ";\n" : "") + interfaceImportLine() + - packageImports; + importStatements; } } From 046b9c8d9b65ce7f43f53544255f285cc3ff1b3b Mon Sep 17 00:00:00 2001 From: ratcash Date: Wed, 5 Oct 2022 14:48:31 +0200 Subject: [PATCH 4/6] use Collections.emptySet() --- .../uk/co/real_logic/sbe/generation/java/JavaGenerator.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sbe-tool/src/main/java/uk/co/real_logic/sbe/generation/java/JavaGenerator.java b/sbe-tool/src/main/java/uk/co/real_logic/sbe/generation/java/JavaGenerator.java index 0dee946be7..11a026b503 100644 --- a/sbe-tool/src/main/java/uk/co/real_logic/sbe/generation/java/JavaGenerator.java +++ b/sbe-tool/src/main/java/uk/co/real_logic/sbe/generation/java/JavaGenerator.java @@ -61,7 +61,7 @@ enum CodecType private static final String PACKAGE_INFO = "package-info"; private static final String BASE_INDENT = ""; private static final String INDENT = " "; - private static final Set NO_PACKAGES = Collections.unmodifiableSet(new HashSet<>()); + private static final Set NO_PACKAGES = Collections.emptySet(); private final Ir ir; private final DynamicPackageOutputManager outputManager; From 0f0080f7341b5f38f78ca847817fc8aeeab706f8 Mon Sep 17 00:00:00 2001 From: ratcash Date: Wed, 5 Oct 2022 14:54:02 +0200 Subject: [PATCH 5/6] chain append statements --- .../uk/co/real_logic/sbe/generation/java/JavaGenerator.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/sbe-tool/src/main/java/uk/co/real_logic/sbe/generation/java/JavaGenerator.java b/sbe-tool/src/main/java/uk/co/real_logic/sbe/generation/java/JavaGenerator.java index 11a026b503..29e38d9c96 100644 --- a/sbe-tool/src/main/java/uk/co/real_logic/sbe/generation/java/JavaGenerator.java +++ b/sbe-tool/src/main/java/uk/co/real_logic/sbe/generation/java/JavaGenerator.java @@ -1651,9 +1651,7 @@ private StringBuilder generateImportStatements(final Set packages, final { if (!candidatePackage.equalsIgnoreCase(currentPackage)) { - importsStatements.append("import "); - importsStatements.append(candidatePackage); - importsStatements.append(".*;\n"); + importsStatements.append("import ").append(candidatePackage).append(".*;\n"); } } if (importsStatements.length() > 0) From 6734bb29a66678db22ff14d4f4a951c45f92513f Mon Sep 17 00:00:00 2001 From: ratcash Date: Wed, 5 Oct 2022 15:16:23 +0200 Subject: [PATCH 6/6] renamed method argument additionalPackages -> importedTypesPackages --- .../sbe/generation/java/JavaGenerator.java | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/sbe-tool/src/main/java/uk/co/real_logic/sbe/generation/java/JavaGenerator.java b/sbe-tool/src/main/java/uk/co/real_logic/sbe/generation/java/JavaGenerator.java index 29e38d9c96..5977951e69 100644 --- a/sbe-tool/src/main/java/uk/co/real_logic/sbe/generation/java/JavaGenerator.java +++ b/sbe-tool/src/main/java/uk/co/real_logic/sbe/generation/java/JavaGenerator.java @@ -1285,10 +1285,10 @@ private void generateFixedFlyweightHeader( final String implementsString, final String buffer, final String fqBuffer, - final Set additionalPackages) throws IOException + final Set importedTypesPackages) throws IOException { final String packageName = registerTypesPackageName(token, ir); - out.append(generateFileHeader(packageName, additionalPackages, fqBuffer)); + out.append(generateFileHeader(packageName, importedTypesPackages, fqBuffer)); out.append(generateDeclaration(typeName, implementsString, token)); out.append(generateFixedFlyweightCode(typeName, token.encodedLength(), buffer)); } @@ -1300,10 +1300,10 @@ private void generateCompositeFlyweightHeader( final String buffer, final String fqBuffer, final String implementsString, - final Set additionalPackages) throws IOException + final Set importedTypesPackages) throws IOException { final String packageName = registerTypesPackageName(token, ir); - out.append(generateFileHeader(packageName, additionalPackages, fqBuffer)); + out.append(generateFileHeader(packageName, importedTypesPackages, fqBuffer)); out.append(generateDeclaration(typeName, implementsString, token)); out.append(generateFixedFlyweightCode(typeName, token.encodedLength(), buffer)); } @@ -1339,12 +1339,12 @@ private void generateComposite(final List tokens) throws IOException final String encoderName = encoderName(compositeName); registerTypesPackageName(token, ir); - final Set additionalPackages = scanPackagesToImport(tokens); + final Set importedTypesPackages = scanPackagesToImport(tokens); try (Writer out = outputManager.createOutput(decoderName)) { final String implementsString = implementsInterface(CompositeDecoderFlyweight.class.getSimpleName()); generateCompositeFlyweightHeader( - token, decoderName, out, readOnlyBuffer, fqReadOnlyBuffer, implementsString, additionalPackages); + token, decoderName, out, readOnlyBuffer, fqReadOnlyBuffer, implementsString, importedTypesPackages); for (int i = 1, end = tokens.size() - 1; i < end;) { @@ -1393,7 +1393,7 @@ private void generateComposite(final List tokens) throws IOException { final String implementsString = implementsInterface(CompositeEncoderFlyweight.class.getSimpleName()); generateCompositeFlyweightHeader(token, encoderName, out, mutableBuffer, fqMutableBuffer, implementsString, - additionalPackages); + importedTypesPackages); for (int i = 1, end = tokens.size() - 1; i < end;) { @@ -1672,10 +1672,10 @@ private String interfaceImportLine() } - private CharSequence generateFileHeader(final String packageName, final Set additionalPackages, + private CharSequence generateFileHeader(final String packageName, final Set importedTypesPackages, final String fqBuffer) { - final StringBuilder importStatements = generateImportStatements(additionalPackages, packageName); + final StringBuilder importStatements = generateImportStatements(importedTypesPackages, packageName); return "/* Generated SBE (Simple Binary Encoding) message codec. */\n" + "package " + packageName + ";\n\n" +