19
19
import org .agrona .MutableDirectBuffer ;
20
20
import org .agrona .Strings ;
21
21
import org .agrona .Verify ;
22
- import org .agrona .generation .OutputManager ;
22
+ import org .agrona .generation .DynamicPackageOutputManager ;
23
23
import org .agrona .sbe .*;
24
24
import uk .co .real_logic .sbe .PrimitiveType ;
25
25
import uk .co .real_logic .sbe .generation .CodeGenerator ;
30
30
import java .io .Writer ;
31
31
import java .util .ArrayList ;
32
32
import java .util .Formatter ;
33
+ import java .util .HashSet ;
33
34
import java .util .List ;
35
+ import java .util .Set ;
34
36
import java .util .function .Function ;
35
37
36
38
import static uk .co .real_logic .sbe .SbeTool .JAVA_INTERFACE_PACKAGE ;
@@ -60,14 +62,40 @@ enum CodecType
60
62
private static final String INDENT = " " ;
61
63
62
64
private final Ir ir ;
63
- private final OutputManager outputManager ;
65
+ private final DynamicPackageOutputManager outputManager ;
64
66
private final String fqMutableBuffer ;
65
67
private final String mutableBuffer ;
66
68
private final String fqReadOnlyBuffer ;
67
69
private final String readOnlyBuffer ;
68
70
private final boolean shouldGenerateGroupOrderAnnotation ;
69
71
private final boolean shouldGenerateInterfaces ;
70
72
private final boolean shouldDecodeUnknownEnumValues ;
73
+ private final boolean shouldSupportTypePackages ;
74
+ private final Set <String > typePackages = new HashSet <>();
75
+
76
+ /**
77
+ * Create a new Java language {@link CodeGenerator}. Generator support for types in their own package is disabled.
78
+ *
79
+ * @param ir for the messages and types.
80
+ * @param mutableBuffer implementation used for mutating underlying buffers.
81
+ * @param readOnlyBuffer implementation used for reading underlying buffers.
82
+ * @param shouldGenerateGroupOrderAnnotation in the codecs.
83
+ * @param shouldGenerateInterfaces for common methods.
84
+ * @param shouldDecodeUnknownEnumValues generate support for unknown enum values when decoding.
85
+ * @param outputManager for generating the codecs to.
86
+ */
87
+ public JavaGenerator (
88
+ final Ir ir ,
89
+ final String mutableBuffer ,
90
+ final String readOnlyBuffer ,
91
+ final boolean shouldGenerateGroupOrderAnnotation ,
92
+ final boolean shouldGenerateInterfaces ,
93
+ final boolean shouldDecodeUnknownEnumValues ,
94
+ final DynamicPackageOutputManager outputManager )
95
+ {
96
+ this (ir , mutableBuffer , readOnlyBuffer , shouldGenerateGroupOrderAnnotation , shouldGenerateInterfaces ,
97
+ shouldDecodeUnknownEnumValues , false , outputManager );
98
+ }
71
99
72
100
/**
73
101
* Create a new Java language {@link CodeGenerator}.
@@ -78,6 +106,7 @@ enum CodecType
78
106
* @param shouldGenerateGroupOrderAnnotation in the codecs.
79
107
* @param shouldGenerateInterfaces for common methods.
80
108
* @param shouldDecodeUnknownEnumValues generate support for unknown enum values when decoding.
109
+ * @param shouldSupportTypePackages generator support for types in their own package
81
110
* @param outputManager for generating the codecs to.
82
111
*/
83
112
public JavaGenerator (
@@ -87,12 +116,14 @@ public JavaGenerator(
87
116
final boolean shouldGenerateGroupOrderAnnotation ,
88
117
final boolean shouldGenerateInterfaces ,
89
118
final boolean shouldDecodeUnknownEnumValues ,
90
- final OutputManager outputManager )
119
+ final boolean shouldSupportTypePackages ,
120
+ final DynamicPackageOutputManager outputManager )
91
121
{
92
122
Verify .notNull (ir , "ir" );
93
123
Verify .notNull (outputManager , "outputManager" );
94
124
95
125
this .ir = ir ;
126
+ this .shouldSupportTypePackages = shouldSupportTypePackages ;
96
127
this .outputManager = outputManager ;
97
128
98
129
this .mutableBuffer = validateBufferImplementation (mutableBuffer , MutableDirectBuffer .class );
@@ -144,11 +175,30 @@ public void generateTypeStubs() throws IOException
144
175
}
145
176
}
146
177
178
+ /**
179
+ * Register the the type's explicit package - if it's set and should be supported.
180
+ *
181
+ * @param token the 0-th token of the type
182
+ * @param ir the intermediate representation
183
+ * @return the overriden package name of the type if set and supported, or {@link Ir#applicableNamespace() }
184
+ */
185
+ private String registerTypePackage (final Token token , final Ir ir )
186
+ {
187
+ if (shouldSupportTypePackages && token .packageName () != null )
188
+ {
189
+ typePackages .add (token .packageName ());
190
+ outputManager .setPackageName (token .packageName ());
191
+ return token .packageName ();
192
+ }
193
+ return ir .applicableNamespace ();
194
+ }
195
+
147
196
/**
148
197
* {@inheritDoc}
149
198
*/
150
199
public void generate () throws IOException
151
200
{
201
+ typePackages .clear ();
152
202
generatePackageInfo ();
153
203
generateTypeStubs ();
154
204
generateMessageHeaderStub ();
@@ -1188,6 +1238,7 @@ private void generateBitSet(final List<Token> tokens) throws IOException
1188
1238
final List <Token > choiceList = tokens .subList (1 , tokens .size () - 1 );
1189
1239
final String implementsString = implementsInterface (Flyweight .class .getSimpleName ());
1190
1240
1241
+ registerTypePackage (token , ir );
1191
1242
try (Writer out = outputManager .createOutput (decoderName ))
1192
1243
{
1193
1244
final Encoding encoding = token .encoding ();
@@ -1208,6 +1259,7 @@ private void generateBitSet(final List<Token> tokens) throws IOException
1208
1259
out .append ("}\n " );
1209
1260
}
1210
1261
1262
+ registerTypePackage (token , ir );
1211
1263
try (Writer out = outputManager .createOutput (encoderName ))
1212
1264
{
1213
1265
generateFixedFlyweightHeader (out , token , encoderName , implementsString , mutableBuffer , fqMutableBuffer );
@@ -1225,7 +1277,8 @@ private void generateFixedFlyweightHeader(
1225
1277
final String buffer ,
1226
1278
final String fqBuffer ) throws IOException
1227
1279
{
1228
- out .append (generateFileHeader (ir .applicableNamespace (), fqBuffer ));
1280
+ final String packageName = registerTypePackage (token , ir );
1281
+ out .append (generateFileHeader (packageName , fqBuffer ));
1229
1282
out .append (generateDeclaration (typeName , implementsString , token ));
1230
1283
out .append (generateFixedFlyweightCode (typeName , token .encodedLength (), buffer ));
1231
1284
}
@@ -1238,7 +1291,8 @@ private void generateCompositeFlyweightHeader(
1238
1291
final String fqBuffer ,
1239
1292
final String implementsString ) throws IOException
1240
1293
{
1241
- out .append (generateFileHeader (ir .applicableNamespace (), fqBuffer ));
1294
+ final String packageName = registerTypePackage (token , ir );
1295
+ out .append (generateFileHeader (packageName , fqBuffer ));
1242
1296
out .append (generateDeclaration (typeName , implementsString , token ));
1243
1297
out .append (generateFixedFlyweightCode (typeName , token .encodedLength (), buffer ));
1244
1298
}
@@ -1250,9 +1304,10 @@ private void generateEnum(final List<Token> tokens) throws IOException
1250
1304
final Encoding encoding = enumToken .encoding ();
1251
1305
final String nullVal = encoding .applicableNullValue ().toString ();
1252
1306
1307
+ final String packageName = registerTypePackage (enumToken , ir );
1253
1308
try (Writer out = outputManager .createOutput (enumName ))
1254
1309
{
1255
- out .append (generateEnumFileHeader (ir . applicableNamespace () ));
1310
+ out .append (generateEnumFileHeader (packageName ));
1256
1311
out .append (generateEnumDeclaration (enumName , enumToken ));
1257
1312
1258
1313
final List <Token > valuesList = tokens .subList (1 , tokens .size () - 1 );
@@ -1272,6 +1327,7 @@ private void generateComposite(final List<Token> tokens) throws IOException
1272
1327
final String decoderName = decoderName (compositeName );
1273
1328
final String encoderName = encoderName (compositeName );
1274
1329
1330
+ registerTypePackage (token , ir );
1275
1331
try (Writer out = outputManager .createOutput (decoderName ))
1276
1332
{
1277
1333
final String implementsString = implementsInterface (CompositeDecoderFlyweight .class .getSimpleName ());
@@ -1320,6 +1376,7 @@ private void generateComposite(final List<Token> tokens) throws IOException
1320
1376
out .append ("}\n " );
1321
1377
}
1322
1378
1379
+ registerTypePackage (token , ir );
1323
1380
try (Writer out = outputManager .createOutput (encoderName ))
1324
1381
{
1325
1382
final String implementsString = implementsInterface (CompositeEncoderFlyweight .class .getSimpleName ());
@@ -1572,13 +1629,22 @@ private CharSequence generateFileHeader(final String packageName, final String f
1572
1629
private CharSequence generateMainHeader (
1573
1630
final String packageName , final CodecType codecType , final boolean hasVarData )
1574
1631
{
1632
+ final StringBuffer packageImports = new StringBuffer ();
1633
+ for (final String typePackage : typePackages )
1634
+ {
1635
+ packageImports .append ("import " );
1636
+ packageImports .append (typePackage );
1637
+ packageImports .append (".*;\n " );
1638
+ }
1639
+
1575
1640
if (fqMutableBuffer .equals (fqReadOnlyBuffer ))
1576
1641
{
1577
1642
return
1578
1643
"/* Generated SBE (Simple Binary Encoding) message codec. */\n " +
1579
1644
"package " + packageName + ";\n \n " +
1580
1645
"import " + fqMutableBuffer + ";\n " +
1581
- interfaceImportLine ();
1646
+ interfaceImportLine () +
1647
+ packageImports .toString ();
1582
1648
}
1583
1649
else
1584
1650
{
@@ -1590,7 +1656,8 @@ private CharSequence generateMainHeader(
1590
1656
"package " + packageName + ";\n \n " +
1591
1657
(hasMutableBuffer ? "import " + fqMutableBuffer + ";\n " : "" ) +
1592
1658
(hasReadOnlyBuffer ? "import " + fqReadOnlyBuffer + ";\n " : "" ) +
1593
- interfaceImportLine ();
1659
+ interfaceImportLine () +
1660
+ packageImports .toString ();
1594
1661
}
1595
1662
}
1596
1663
0 commit comments