}
private static void addLocalPackages( File outputDirectory, Analyzer analyzer ) throws IOException
{
Packages packages = new Packages();
if ( outputDirectory != null && outputDirectory.isDirectory() )
{
// scan classes directory for potential packages
DirectoryScanner scanner = new DirectoryScanner();
scanner.setBasedir( outputDirectory );
scanner.setIncludes( new String[]
{ "**/*.class" } );
scanner.addDefaultExcludes();
scanner.scan();
String[] paths = scanner.getIncludedFiles();
for ( int i = 0; i < paths.length; i++ )
{
packages.put( analyzer.getPackageRef( getPackageName( paths[i] ) ) );
}
}
Packages exportedPkgs = new Packages();
Packages privatePkgs = new Packages();
boolean noprivatePackages = "!*".equals( analyzer.getProperty( Analyzer.PRIVATE_PACKAGE ) );
for ( PackageRef pkg : packages.keySet() )
{
// mark all source packages as private by default (can be overridden by export list)
privatePkgs.put( pkg );
// we can't export the default package (".") and we shouldn't export internal packages
String fqn = pkg.getFQN();
if ( noprivatePackages || !( ".".equals( fqn ) || fqn.contains( ".internal" ) || fqn.contains( ".impl" ) ) )
{
exportedPkgs.put( pkg );
}
}
Properties properties = analyzer.getProperties();
String exported = properties.getProperty( Analyzer.EXPORT_PACKAGE );
if ( exported == null )
{
if ( !properties.containsKey( Analyzer.EXPORT_CONTENTS ) )
{
// no -exportcontents overriding the exports, so use our computed list
for ( Attrs attrs : exportedPkgs.values() )
{
attrs.put( Constants.SPLIT_PACKAGE_DIRECTIVE, "merge-first" );
}
properties.setProperty( Analyzer.EXPORT_PACKAGE, Processor.printClauses( exportedPkgs ) );
}
else
{
// leave Export-Package empty (but non-null) as we have -exportcontents
properties.setProperty( Analyzer.EXPORT_PACKAGE, "" );
}
}
else if ( exported.indexOf( LOCAL_PACKAGES ) >= 0 )
{
String newExported = StringUtils.replace( exported, LOCAL_PACKAGES, Processor.printClauses( exportedPkgs ) );
properties.setProperty( Analyzer.EXPORT_PACKAGE, newExported );
}
String internal = properties.getProperty( Analyzer.PRIVATE_PACKAGE );
if ( internal == null )
{
if ( !privatePkgs.isEmpty() )
{
for ( Attrs attrs : privatePkgs.values() )
{
attrs.put( Constants.SPLIT_PACKAGE_DIRECTIVE, "merge-first" );
}
properties.setProperty( Analyzer.PRIVATE_PACKAGE, Processor.printClauses( privatePkgs ) );
}