2929import  java .io .IOException ;
3030import  java .io .Writer ;
3131import  java .util .ArrayList ;
32+ import  java .util .Collections ;
3233import  java .util .Formatter ;
3334import  java .util .HashSet ;
3435import  java .util .List ;
@@ -60,6 +61,7 @@ enum CodecType
6061 private  static  final  String  PACKAGE_INFO  = "package-info" ;
6162 private  static  final  String  BASE_INDENT  = "" ;
6263 private  static  final  String  INDENT  = " " ;
64+  private  static  final  Set <String > NO_PACKAGES  = Collections .emptySet ();
6365
6466 private  final  Ir  ir ;
6567 private  final  DynamicPackageOutputManager  outputManager ;
@@ -184,11 +186,15 @@ public void generateTypeStubs() throws IOException
184186 */ 
185187 private  String  registerTypesPackageName (final  Token  token , final  Ir  ir )
186188 {
187-  if  (shouldSupportTypesPackageNames  && token .packageName () != null )
189+ 
190+  if  (!shouldSupportTypesPackageNames )
191+  {
192+  return  ir .applicableNamespace ();
193+  }
194+  if  (token .packageName () != null )
188195 {
189196 packageNameByTypes .add (token .packageName ());
190197 outputManager .setPackageName (token .packageName ());
191- 
192198 return  token .packageName ();
193199 }
194200 return  ir .applicableNamespace ();
@@ -1243,7 +1249,8 @@ private void generateBitSet(final List<Token> tokens) throws IOException
12431249 try  (Writer  out  = outputManager .createOutput (decoderName ))
12441250 {
12451251 final  Encoding  encoding  = token .encoding ();
1246-  generateFixedFlyweightHeader (out , token , decoderName , implementsString , readOnlyBuffer , fqReadOnlyBuffer );
1252+  generateFixedFlyweightHeader (out , token , decoderName , implementsString , readOnlyBuffer , fqReadOnlyBuffer ,
1253+  NO_PACKAGES );
12471254 out .append (generateChoiceIsEmpty (encoding .primitiveType ()));
12481255
12491256 new  Formatter (out ).format (
@@ -1263,7 +1270,8 @@ private void generateBitSet(final List<Token> tokens) throws IOException
12631270 registerTypesPackageName (token , ir );
12641271 try  (Writer  out  = outputManager .createOutput (encoderName ))
12651272 {
1266-  generateFixedFlyweightHeader (out , token , encoderName , implementsString , mutableBuffer , fqMutableBuffer );
1273+  generateFixedFlyweightHeader (out , token , encoderName , implementsString , mutableBuffer , fqMutableBuffer ,
1274+  NO_PACKAGES );
12671275 generateChoiceClear (out , encoderName , token );
12681276 generateChoiceEncoders (out , encoderName , choiceList );
12691277 out .append ("}\n " );
@@ -1276,10 +1284,11 @@ private void generateFixedFlyweightHeader(
12761284 final  String  typeName ,
12771285 final  String  implementsString ,
12781286 final  String  buffer ,
1279-  final  String  fqBuffer ) throws  IOException 
1287+  final  String  fqBuffer ,
1288+  final  Set <String > importedTypesPackages ) throws  IOException 
12801289 {
12811290 final  String  packageName  = registerTypesPackageName (token , ir );
1282-  out .append (generateFileHeader (packageName , fqBuffer ));
1291+  out .append (generateFileHeader (packageName , importedTypesPackages ,  fqBuffer ));
12831292 out .append (generateDeclaration (typeName , implementsString , token ));
12841293 out .append (generateFixedFlyweightCode (typeName , token .encodedLength (), buffer ));
12851294 }
@@ -1290,10 +1299,11 @@ private void generateCompositeFlyweightHeader(
12901299 final  Writer  out ,
12911300 final  String  buffer ,
12921301 final  String  fqBuffer ,
1293-  final  String  implementsString ) throws  IOException 
1302+  final  String  implementsString ,
1303+  final  Set <String > importedTypesPackages ) throws  IOException 
12941304 {
12951305 final  String  packageName  = registerTypesPackageName (token , ir );
1296-  out .append (generateFileHeader (packageName , fqBuffer ));
1306+  out .append (generateFileHeader (packageName , importedTypesPackages ,  fqBuffer ));
12971307 out .append (generateDeclaration (typeName , implementsString , token ));
12981308 out .append (generateFixedFlyweightCode (typeName , token .encodedLength (), buffer ));
12991309 }
@@ -1329,11 +1339,12 @@ private void generateComposite(final List<Token> tokens) throws IOException
13291339 final  String  encoderName  = encoderName (compositeName );
13301340
13311341 registerTypesPackageName (token , ir );
1342+  final  Set <String > importedTypesPackages  = scanPackagesToImport (tokens );
13321343 try  (Writer  out  = outputManager .createOutput (decoderName ))
13331344 {
13341345 final  String  implementsString  = implementsInterface (CompositeDecoderFlyweight .class .getSimpleName ());
13351346 generateCompositeFlyweightHeader (
1336-  token , decoderName , out , readOnlyBuffer , fqReadOnlyBuffer , implementsString );
1347+  token , decoderName , out , readOnlyBuffer , fqReadOnlyBuffer , implementsString ,  importedTypesPackages );
13371348
13381349 for  (int  i  = 1 , end  = tokens .size () - 1 ; i  < end ;)
13391350 {
@@ -1381,7 +1392,8 @@ private void generateComposite(final List<Token> tokens) throws IOException
13811392 try  (Writer  out  = outputManager .createOutput (encoderName ))
13821393 {
13831394 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 );
13851397
13861398 for  (int  i  = 1 , end  = tokens .size () - 1 ; i  < end ;)
13871399 {
@@ -1423,6 +1435,30 @@ private void generateComposite(final List<Token> tokens) throws IOException
14231435 }
14241436 }
14251437
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+ 
14261462 private  void  generateChoiceClear (final  Appendable  out , final  String  bitSetClassName , final  Token  token )
14271463 throws  IOException 
14281464 {
@@ -1608,6 +1644,23 @@ private CharSequence generateEnumLookupMethod(final List<Token> tokens, final St
16081644 return  sb ;
16091645 }
16101646
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+ 
16111664 private  String  interfaceImportLine ()
16121665 {
16131666 if  (!shouldGenerateInterfaces )
@@ -1618,25 +1671,23 @@ private String interfaceImportLine()
16181671 return  "import "  + JAVA_INTERFACE_PACKAGE  + ".*;\n \n " ;
16191672 }
16201673
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 )
16221677 {
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 "  +
16251681 "package "  + packageName  + ";\n \n "  +
16261682 "import "  + fqBuffer  + ";\n "  +
1627-  interfaceImportLine ();
1683+  interfaceImportLine () +
1684+  importStatements ;
16281685 }
16291686
16301687 private  CharSequence  generateMainHeader (
16311688 final  String  packageName , final  CodecType  codecType , final  boolean  hasVarData )
16321689 {
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 );
16401691
16411692 if  (fqMutableBuffer .equals (fqReadOnlyBuffer ))
16421693 {
@@ -1645,7 +1696,7 @@ private CharSequence generateMainHeader(
16451696 "package "  + packageName  + ";\n \n "  +
16461697 "import "  + fqMutableBuffer  + ";\n "  +
16471698 interfaceImportLine () +
1648-  packageImports ;
1699+  importStatements ;
16491700 }
16501701 else 
16511702 {
@@ -1658,7 +1709,7 @@ private CharSequence generateMainHeader(
16581709 (hasMutableBuffer  ? "import "  + fqMutableBuffer  + ";\n "  : "" ) +
16591710 (hasReadOnlyBuffer  ? "import "  + fqReadOnlyBuffer  + ";\n "  : "" ) +
16601711 interfaceImportLine () +
1661-  packageImports ;
1712+  importStatements ;
16621713 }
16631714 }
16641715
0 commit comments