29
29
import java .io .IOException ;
30
30
import java .io .Writer ;
31
31
import java .util .ArrayList ;
32
+ import java .util .Collections ;
32
33
import java .util .Formatter ;
33
34
import java .util .HashSet ;
34
35
import java .util .List ;
@@ -60,6 +61,7 @@ enum CodecType
60
61
private static final String PACKAGE_INFO = "package-info" ;
61
62
private static final String BASE_INDENT = "" ;
62
63
private static final String INDENT = " " ;
64
+ private static final Set <String > NO_PACKAGES = Collections .emptySet ();
63
65
64
66
private final Ir ir ;
65
67
private final DynamicPackageOutputManager outputManager ;
@@ -184,11 +186,15 @@ public void generateTypeStubs() throws IOException
184
186
*/
185
187
private String registerTypesPackageName (final Token token , final Ir ir )
186
188
{
187
- if (shouldSupportTypesPackageNames && token .packageName () != null )
189
+
190
+ if (!shouldSupportTypesPackageNames )
191
+ {
192
+ return ir .applicableNamespace ();
193
+ }
194
+ if (token .packageName () != null )
188
195
{
189
196
packageNameByTypes .add (token .packageName ());
190
197
outputManager .setPackageName (token .packageName ());
191
-
192
198
return token .packageName ();
193
199
}
194
200
return ir .applicableNamespace ();
@@ -1243,7 +1249,8 @@ private void generateBitSet(final List<Token> tokens) throws IOException
1243
1249
try (Writer out = outputManager .createOutput (decoderName ))
1244
1250
{
1245
1251
final Encoding encoding = token .encoding ();
1246
- generateFixedFlyweightHeader (out , token , decoderName , implementsString , readOnlyBuffer , fqReadOnlyBuffer );
1252
+ generateFixedFlyweightHeader (out , token , decoderName , implementsString , readOnlyBuffer , fqReadOnlyBuffer ,
1253
+ NO_PACKAGES );
1247
1254
out .append (generateChoiceIsEmpty (encoding .primitiveType ()));
1248
1255
1249
1256
new Formatter (out ).format (
@@ -1263,7 +1270,8 @@ private void generateBitSet(final List<Token> tokens) throws IOException
1263
1270
registerTypesPackageName (token , ir );
1264
1271
try (Writer out = outputManager .createOutput (encoderName ))
1265
1272
{
1266
- generateFixedFlyweightHeader (out , token , encoderName , implementsString , mutableBuffer , fqMutableBuffer );
1273
+ generateFixedFlyweightHeader (out , token , encoderName , implementsString , mutableBuffer , fqMutableBuffer ,
1274
+ NO_PACKAGES );
1267
1275
generateChoiceClear (out , encoderName , token );
1268
1276
generateChoiceEncoders (out , encoderName , choiceList );
1269
1277
out .append ("}\n " );
@@ -1276,10 +1284,11 @@ private void generateFixedFlyweightHeader(
1276
1284
final String typeName ,
1277
1285
final String implementsString ,
1278
1286
final String buffer ,
1279
- final String fqBuffer ) throws IOException
1287
+ final String fqBuffer ,
1288
+ final Set <String > importedTypesPackages ) throws IOException
1280
1289
{
1281
1290
final String packageName = registerTypesPackageName (token , ir );
1282
- out .append (generateFileHeader (packageName , fqBuffer ));
1291
+ out .append (generateFileHeader (packageName , importedTypesPackages , fqBuffer ));
1283
1292
out .append (generateDeclaration (typeName , implementsString , token ));
1284
1293
out .append (generateFixedFlyweightCode (typeName , token .encodedLength (), buffer ));
1285
1294
}
@@ -1290,10 +1299,11 @@ private void generateCompositeFlyweightHeader(
1290
1299
final Writer out ,
1291
1300
final String buffer ,
1292
1301
final String fqBuffer ,
1293
- final String implementsString ) throws IOException
1302
+ final String implementsString ,
1303
+ final Set <String > importedTypesPackages ) throws IOException
1294
1304
{
1295
1305
final String packageName = registerTypesPackageName (token , ir );
1296
- out .append (generateFileHeader (packageName , fqBuffer ));
1306
+ out .append (generateFileHeader (packageName , importedTypesPackages , fqBuffer ));
1297
1307
out .append (generateDeclaration (typeName , implementsString , token ));
1298
1308
out .append (generateFixedFlyweightCode (typeName , token .encodedLength (), buffer ));
1299
1309
}
@@ -1329,11 +1339,12 @@ private void generateComposite(final List<Token> tokens) throws IOException
1329
1339
final String encoderName = encoderName (compositeName );
1330
1340
1331
1341
registerTypesPackageName (token , ir );
1342
+ final Set <String > importedTypesPackages = scanPackagesToImport (tokens );
1332
1343
try (Writer out = outputManager .createOutput (decoderName ))
1333
1344
{
1334
1345
final String implementsString = implementsInterface (CompositeDecoderFlyweight .class .getSimpleName ());
1335
1346
generateCompositeFlyweightHeader (
1336
- token , decoderName , out , readOnlyBuffer , fqReadOnlyBuffer , implementsString );
1347
+ token , decoderName , out , readOnlyBuffer , fqReadOnlyBuffer , implementsString , importedTypesPackages );
1337
1348
1338
1349
for (int i = 1 , end = tokens .size () - 1 ; i < end ;)
1339
1350
{
@@ -1381,7 +1392,8 @@ private void generateComposite(final List<Token> tokens) throws IOException
1381
1392
try (Writer out = outputManager .createOutput (encoderName ))
1382
1393
{
1383
1394
final String implementsString = implementsInterface (CompositeEncoderFlyweight .class .getSimpleName ());
1384
- generateCompositeFlyweightHeader (token , encoderName , out , mutableBuffer , fqMutableBuffer , implementsString );
1395
+ generateCompositeFlyweightHeader (token , encoderName , out , mutableBuffer , fqMutableBuffer , implementsString ,
1396
+ importedTypesPackages );
1385
1397
1386
1398
for (int i = 1 , end = tokens .size () - 1 ; i < end ;)
1387
1399
{
@@ -1423,6 +1435,30 @@ private void generateComposite(final List<Token> tokens) throws IOException
1423
1435
}
1424
1436
}
1425
1437
1438
+ private Set <String > scanPackagesToImport (final List <Token > tokens )
1439
+ {
1440
+ if (!shouldSupportTypesPackageNames )
1441
+ {
1442
+ return NO_PACKAGES ;
1443
+ }
1444
+
1445
+ final Set <String > packagesToImport = new HashSet <>();
1446
+ for (int i = 1 ; i < tokens .size () - 1 ; i ++)
1447
+ {
1448
+ final Token typeToken = tokens .get (i );
1449
+ if (typeToken .signal () == Signal .BEGIN_ENUM ||
1450
+ typeToken .signal () == Signal .BEGIN_SET ||
1451
+ typeToken .signal () == Signal .BEGIN_COMPOSITE )
1452
+ {
1453
+ if (typeToken .packageName () != null )
1454
+ {
1455
+ packagesToImport .add (typeToken .packageName ());
1456
+ }
1457
+ }
1458
+ }
1459
+ return packagesToImport ;
1460
+ }
1461
+
1426
1462
private void generateChoiceClear (final Appendable out , final String bitSetClassName , final Token token )
1427
1463
throws IOException
1428
1464
{
@@ -1608,6 +1644,23 @@ private CharSequence generateEnumLookupMethod(final List<Token> tokens, final St
1608
1644
return sb ;
1609
1645
}
1610
1646
1647
+ private StringBuilder generateImportStatements (final Set <String > packages , final String currentPackage )
1648
+ {
1649
+ final StringBuilder importsStatements = new StringBuilder ();
1650
+ for (final String candidatePackage : packages )
1651
+ {
1652
+ if (!candidatePackage .equalsIgnoreCase (currentPackage ))
1653
+ {
1654
+ importsStatements .append ("import " ).append (candidatePackage ).append (".*;\n " );
1655
+ }
1656
+ }
1657
+ if (importsStatements .length () > 0 )
1658
+ {
1659
+ importsStatements .append ("\n \n " );
1660
+ }
1661
+ return importsStatements ;
1662
+ }
1663
+
1611
1664
private String interfaceImportLine ()
1612
1665
{
1613
1666
if (!shouldGenerateInterfaces )
@@ -1618,25 +1671,23 @@ private String interfaceImportLine()
1618
1671
return "import " + JAVA_INTERFACE_PACKAGE + ".*;\n \n " ;
1619
1672
}
1620
1673
1621
- private CharSequence generateFileHeader (final String packageName , final String fqBuffer )
1674
+
1675
+ private CharSequence generateFileHeader (final String packageName , final Set <String > importedTypesPackages ,
1676
+ final String fqBuffer )
1622
1677
{
1623
- return
1624
- "/* Generated SBE (Simple Binary Encoding) message codec. */\n " +
1678
+ final StringBuilder importStatements = generateImportStatements (importedTypesPackages , packageName );
1679
+
1680
+ return "/* Generated SBE (Simple Binary Encoding) message codec. */\n " +
1625
1681
"package " + packageName + ";\n \n " +
1626
1682
"import " + fqBuffer + ";\n " +
1627
- interfaceImportLine ();
1683
+ interfaceImportLine () +
1684
+ importStatements ;
1628
1685
}
1629
1686
1630
1687
private CharSequence generateMainHeader (
1631
1688
final String packageName , final CodecType codecType , final boolean hasVarData )
1632
1689
{
1633
- final StringBuilder packageImports = new StringBuilder ();
1634
- for (final String typePackage : packageNameByTypes )
1635
- {
1636
- packageImports .append ("import " );
1637
- packageImports .append (typePackage );
1638
- packageImports .append (".*;\n " );
1639
- }
1690
+ final StringBuilder importStatements = generateImportStatements (packageNameByTypes , packageName );
1640
1691
1641
1692
if (fqMutableBuffer .equals (fqReadOnlyBuffer ))
1642
1693
{
@@ -1645,7 +1696,7 @@ private CharSequence generateMainHeader(
1645
1696
"package " + packageName + ";\n \n " +
1646
1697
"import " + fqMutableBuffer + ";\n " +
1647
1698
interfaceImportLine () +
1648
- packageImports ;
1699
+ importStatements ;
1649
1700
}
1650
1701
else
1651
1702
{
@@ -1658,7 +1709,7 @@ private CharSequence generateMainHeader(
1658
1709
(hasMutableBuffer ? "import " + fqMutableBuffer + ";\n " : "" ) +
1659
1710
(hasReadOnlyBuffer ? "import " + fqReadOnlyBuffer + ";\n " : "" ) +
1660
1711
interfaceImportLine () +
1661
- packageImports ;
1712
+ importStatements ;
1662
1713
}
1663
1714
}
1664
1715
0 commit comments