FELIX-3973: postpone bnd macro evaluation until after {local-packages} has been substituted
git-svn-id: https://svn.apache.org/repos/asf/felix/trunk@1490854 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/bundleplugin/src/main/java/org/apache/felix/bundleplugin/BundlePlugin.java b/bundleplugin/src/main/java/org/apache/felix/bundleplugin/BundlePlugin.java
index 2f1947a..b3a669d 100644
--- a/bundleplugin/src/main/java/org/apache/felix/bundleplugin/BundlePlugin.java
+++ b/bundleplugin/src/main/java/org/apache/felix/bundleplugin/BundlePlugin.java
@@ -40,7 +40,6 @@
import java.util.Map;
import java.util.Properties;
import java.util.Set;
-import java.util.TreeSet;
import java.util.jar.Attributes;
import java.util.jar.Manifest;
@@ -68,12 +67,15 @@
import org.codehaus.plexus.util.PropertyUtils;
import org.codehaus.plexus.util.StringUtils;
+import aQute.bnd.header.Attrs;
import aQute.bnd.osgi.Analyzer;
import aQute.bnd.osgi.Builder;
import aQute.bnd.osgi.Constants;
+import aQute.bnd.osgi.Descriptors.PackageRef;
import aQute.bnd.osgi.EmbeddedResource;
import aQute.bnd.osgi.FileResource;
import aQute.bnd.osgi.Jar;
+import aQute.bnd.osgi.Packages;
import aQute.bnd.osgi.Processor;
import aQute.lib.spring.SpringXMLType;
@@ -1283,9 +1285,9 @@
}
- private static void addLocalPackages( File outputDirectory, Analyzer analyzer )
+ private static void addLocalPackages( File outputDirectory, Analyzer analyzer ) throws IOException
{
- Collection packages = new TreeSet();
+ Packages packages = new Packages();
if ( outputDirectory != null && outputDirectory.isDirectory() )
{
@@ -1301,78 +1303,74 @@
String[] paths = scanner.getIncludedFiles();
for ( int i = 0; i < paths.length; i++ )
{
- packages.add( getPackageName( paths[i] ) );
+ packages.put( analyzer.getPackageRef( getPackageName( paths[i] ) ) );
}
}
- StringBuffer exportedPkgs = new StringBuffer();
- StringBuffer privatePkgs = new StringBuffer();
+ Packages exportedPkgs = new Packages();
+ Packages privatePkgs = new Packages();
boolean noprivatePackages = "!*".equals( analyzer.getProperty( Analyzer.PRIVATE_PACKAGE ) );
- for ( Iterator i = packages.iterator(); i.hasNext(); )
+ for ( PackageRef pkg : packages.keySet() )
{
- String pkg = ( String ) i.next();
-
// mark all source packages as private by default (can be overridden by export list)
- if ( privatePkgs.length() > 0 )
- {
- privatePkgs.append( ';' );
- }
- privatePkgs.append( pkg );
+ privatePkgs.put( pkg );
// we can't export the default package (".") and we shouldn't export internal packages
- if ( noprivatePackages || !( ".".equals( pkg ) || pkg.contains( ".internal" ) || pkg.contains( ".impl" ) ) )
+ String fqn = pkg.getFQN();
+ if ( noprivatePackages || !( ".".equals( fqn ) || fqn.contains( ".internal" ) || fqn.contains( ".impl" ) ) )
{
- if ( exportedPkgs.length() > 0 )
- {
- exportedPkgs.append( ';' );
- }
- exportedPkgs.append( pkg );
+ exportedPkgs.put( pkg );
}
}
- if ( analyzer.getProperty( Analyzer.EXPORT_PACKAGE ) == null )
+ Properties properties = analyzer.getProperties();
+ String exported = properties.getProperty( Analyzer.EXPORT_PACKAGE );
+ if ( exported == null )
{
- if ( analyzer.getProperty( Analyzer.EXPORT_CONTENTS ) == null )
+ if ( !properties.containsKey( Analyzer.EXPORT_CONTENTS ) )
{
// no -exportcontents overriding the exports, so use our computed list
- analyzer.setProperty( Analyzer.EXPORT_PACKAGE, exportedPkgs + ";-split-package:=merge-first" );
+ 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
- analyzer.setProperty( Analyzer.EXPORT_PACKAGE, "" );
+ properties.setProperty( Analyzer.EXPORT_PACKAGE, "" );
}
}
- else
+ else if ( exported.indexOf( LOCAL_PACKAGES ) >= 0 )
{
- String exported = analyzer.getProperty( Analyzer.EXPORT_PACKAGE );
- if ( exported.indexOf( LOCAL_PACKAGES ) >= 0 )
- {
- String newExported = StringUtils.replace( exported, LOCAL_PACKAGES, exportedPkgs.toString() );
- analyzer.setProperty( Analyzer.EXPORT_PACKAGE, newExported );
-
- }
+ String newExported = StringUtils.replace( exported, LOCAL_PACKAGES, Processor.printClauses( exportedPkgs ) );
+ properties.setProperty( Analyzer.EXPORT_PACKAGE, newExported );
}
- String internal = analyzer.getProperty( Analyzer.PRIVATE_PACKAGE );
+ String internal = properties.getProperty( Analyzer.PRIVATE_PACKAGE );
if ( internal == null )
{
- if ( privatePkgs.length() > 0 )
+ if ( !privatePkgs.isEmpty() )
{
- analyzer.setProperty( Analyzer.PRIVATE_PACKAGE, privatePkgs + ";-split-package:=merge-first" );
+ for ( Attrs attrs : privatePkgs.values() )
+ {
+ attrs.put( Constants.SPLIT_PACKAGE_DIRECTIVE, "merge-first" );
+ }
+ properties.setProperty( Analyzer.PRIVATE_PACKAGE, Processor.printClauses( privatePkgs ) );
}
else
{
// if there are really no private packages then use "!*" as this will keep the Bnd Tool happy
- analyzer.setProperty( Analyzer.PRIVATE_PACKAGE, "!*" );
+ properties.setProperty( Analyzer.PRIVATE_PACKAGE, "!*" );
}
}
else if ( internal.indexOf( LOCAL_PACKAGES ) >= 0 )
{
- String newInternal = StringUtils.replace( internal, LOCAL_PACKAGES, privatePkgs.toString() );
- analyzer.setProperty( Analyzer.PRIVATE_PACKAGE, newInternal );
+ String newInternal = StringUtils.replace( internal, LOCAL_PACKAGES, Processor.printClauses( privatePkgs ) );
+ properties.setProperty( Analyzer.PRIVATE_PACKAGE, newInternal );
}
}