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 );
         }
     }