Skip to content

Commit bdfbc8f

Browse files
committed
[Java] Add support for DTO generation.
This commit adds support for generating SBE DTOs in Java. Unlike the C# and C++ support, there isn't a natural candidate for the idiomatic representation of optional fields, e.g., `Optional<T>` is only meant for use as a return type. Therefore, the mapping between Java types and the encoding is simpler than in these other languages. In a future commit, I will extend the property-based tests to cover Java DTOs.
1 parent 1a7a9dc commit bdfbc8f

File tree

10 files changed

+2141
-19
lines changed

10 files changed

+2141
-19
lines changed

build.gradle

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -280,6 +280,7 @@ project(':sbe-tool') {
280280

281281
compileGeneratedJava {
282282
dependsOn 'generateTestCodecs'
283+
dependsOn 'generateTestDtos'
283284
classpath += sourceSets.main.runtimeClasspath
284285
}
285286

@@ -344,6 +345,21 @@ project(':sbe-tool') {
344345
'src/test/resources/field-order-check-schema.xml']
345346
}
346347

348+
tasks.register('generateTestDtos', JavaExec) {
349+
dependsOn 'compileJava'
350+
mainClass.set('uk.co.real_logic.sbe.SbeTool')
351+
classpath = sourceSets.main.runtimeClasspath
352+
systemProperties(
353+
'sbe.output.dir': generatedDir,
354+
'sbe.target.language': 'java',
355+
'sbe.validation.stop.on.error': 'true',
356+
'sbe.validation.xsd': validationXsdPath,
357+
'sbe.generate.precedence.checks': 'true',
358+
'sbe.java.precedence.checks.property.name': 'sbe.enable.test.precedence.checks',
359+
'sbe.java.generate.dtos': 'true')
360+
args = ['src/test/resources/example-extension-schema.xml']
361+
}
362+
347363
jar {
348364
manifest.attributes(
349365
'Specification-Title': 'Simple Binary Encoding',

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

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -195,7 +195,12 @@ public class SbeTool
195195
/**
196196
* Should generate C++ DTOs. Defaults to false.
197197
*/
198-
public static final String GENERATE_CPP_DTOS = "sbe.cpp.generate.dtos";
198+
public static final String CPP_GENERATE_DTOS = "sbe.cpp.generate.dtos";
199+
200+
/**
201+
* Should generate Java DTOs. Defaults to false.
202+
*/
203+
public static final String JAVA_GENERATE_DTOS = "sbe.java.generate.dtos";
199204

200205
/**
201206
* Configuration option used to manage sinceVersion based transformations. When set, parsed schemas will be

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

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import uk.co.real_logic.sbe.generation.cpp.NamespaceOutputManager;
2424
import uk.co.real_logic.sbe.generation.golang.GolangGenerator;
2525
import uk.co.real_logic.sbe.generation.golang.GolangOutputManager;
26+
import uk.co.real_logic.sbe.generation.java.JavaDtoGenerator;
2627
import uk.co.real_logic.sbe.generation.java.JavaGenerator;
2728
import uk.co.real_logic.sbe.generation.java.JavaOutputManager;
2829
import uk.co.real_logic.sbe.generation.rust.RustGenerator;
@@ -47,7 +48,9 @@ public enum TargetCodeGeneratorLoader implements TargetCodeGenerator
4748
*/
4849
public CodeGenerator newInstance(final Ir ir, final String outputDir)
4950
{
50-
return new JavaGenerator(
51+
final JavaOutputManager outputManager = new JavaOutputManager(outputDir, ir.applicableNamespace());
52+
53+
final JavaGenerator codecGenerator = new JavaGenerator(
5154
ir,
5255
System.getProperty(JAVA_ENCODING_BUFFER_TYPE, JAVA_DEFAULT_ENCODING_BUFFER_TYPE),
5356
System.getProperty(JAVA_DECODING_BUFFER_TYPE, JAVA_DEFAULT_DECODING_BUFFER_TYPE),
@@ -56,7 +59,18 @@ public CodeGenerator newInstance(final Ir ir, final String outputDir)
5659
"true".equals(System.getProperty(DECODE_UNKNOWN_ENUM_VALUES)),
5760
"true".equals(System.getProperty(TYPES_PACKAGE_OVERRIDE)),
5861
precedenceChecks(),
59-
new JavaOutputManager(outputDir, ir.applicableNamespace()));
62+
outputManager);
63+
64+
final JavaDtoGenerator dtoGenerator = new JavaDtoGenerator(ir, outputManager);
65+
66+
final CodeGenerator combinedGenerator = () ->
67+
{
68+
codecGenerator.generate();
69+
dtoGenerator.generate();
70+
};
71+
72+
final boolean generateDtos = "true".equals(System.getProperty(JAVA_GENERATE_DTOS));
73+
return generateDtos ? combinedGenerator : codecGenerator;
6074
}
6175
},
6276

@@ -97,7 +111,7 @@ public CodeGenerator newInstance(final Ir ir, final String outputDir)
97111
dtoGenerator.generate();
98112
};
99113

100-
final boolean generateDtos = "true".equals(System.getProperty(GENERATE_CPP_DTOS));
114+
final boolean generateDtos = "true".equals(System.getProperty(CPP_GENERATE_DTOS));
101115
return generateDtos ? combinedGenerator : codecGenerator;
102116
}
103117
},

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
import uk.co.real_logic.sbe.ir.Ir;
2323

2424
/**
25-
* {@link CodeGenerator} factory for CSharp DTOs.
25+
* {@link CodeGenerator} factory for C++ DTOs.
2626
*/
2727
public class CppDtos implements TargetCodeGenerator
2828
{

0 commit comments

Comments
 (0)