Fixes FELIX-2809: maven-bundle-plugin should automatically add "resolution:=optional" to imported packages that are in optional maven dependencies.


git-svn-id: https://svn.apache.org/repos/asf/felix/trunk@1064300 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 96b1d17..7e74b29 100644
--- a/bundleplugin/src/main/java/org/apache/felix/bundleplugin/BundlePlugin.java
+++ b/bundleplugin/src/main/java/org/apache/felix/bundleplugin/BundlePlugin.java
@@ -25,21 +25,11 @@
 import java.io.IOException;
 import java.io.InputStream;
 import java.lang.reflect.Method;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Enumeration;
-import java.util.Iterator;
-import java.util.LinkedHashMap;
-import java.util.LinkedHashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Properties;
-import java.util.Set;
+import java.util.*;
 import java.util.jar.Attributes;
 import java.util.jar.Manifest;
 
+import aQute.lib.osgi.*;
 import org.apache.maven.archiver.ManifestSection;
 import org.apache.maven.archiver.MavenArchiveConfiguration;
 import org.apache.maven.archiver.MavenArchiver;
@@ -61,12 +51,6 @@
 import org.codehaus.plexus.util.StringInputStream;
 import org.codehaus.plexus.util.StringUtils;
 
-import aQute.lib.osgi.Analyzer;
-import aQute.lib.osgi.Builder;
-import aQute.lib.osgi.Constants;
-import aQute.lib.osgi.EmbeddedResource;
-import aQute.lib.osgi.FileResource;
-import aQute.lib.osgi.Jar;
 import aQute.lib.spring.SpringXMLType;
 
 
@@ -569,6 +553,25 @@
             Manifest bundleManifest = jar.getManifest();
             bundleManifest.getMainAttributes().putAll( mainMavenAttributes );
             bundleManifest.getEntries().putAll( mavenManifest.getEntries() );
+
+            // adjust the import package attributes so that optional dependencies use
+            // optional resolution.
+            String importPackages = bundleManifest.getMainAttributes().getValue("Import-Package");
+            if( importPackages!=null ) {
+                Set optionalPackages = getOptionalPackages(currentProject);
+
+                Map<String, Map<String, String>> values = new Analyzer().parseHeader(importPackages);
+                for (Map.Entry<String, Map<String, String>> entry: values.entrySet()) {
+                    String pkg = entry.getKey();
+                    Map<String, String> options = entry.getValue();
+                    if( !options.containsKey("resolution:") && optionalPackages.contains(pkg) ) {
+                        options.put("resolution:", "optional");
+                    }
+                }
+                String result = Processor.printClauses(values, "resolution:");
+                bundleManifest.getMainAttributes().putValue("Import-Package", result);
+            }
+
             jar.setManifest( bundleManifest );
         }
         catch ( Exception e )
@@ -583,6 +586,37 @@
     }
 
 
+    protected Set getOptionalPackages( MavenProject currentProject ) throws IOException, MojoExecutionException
+    {
+        HashSet required = new HashSet();
+        HashSet optional = new HashSet();
+        final Collection artifacts = getSelectedDependencies( currentProject.getArtifacts() );
+        for ( Iterator it = artifacts.iterator(); it.hasNext(); )
+        {
+            Artifact artifact = ( Artifact ) it.next();
+            if ( artifact.getArtifactHandler().isAddedToClasspath() )
+            {
+                if ( !Artifact.SCOPE_TEST.equals( artifact.getScope() ) )
+                {
+                    File file = getFile( artifact );
+                    if ( file == null )
+                    {
+                        continue;
+                    }
+                    Jar jar = new Jar( artifact.getArtifactId(), file );
+                    if( artifact.isOptional() ) {
+                        optional.addAll(jar.getPackages());
+                    } else {
+                        required.addAll(jar.getPackages());
+                    }
+                    jar.close();
+                }
+            }
+        }
+        optional.removeAll(required);
+        return optional;
+    }
+
     private void unpackBundle( File jarFile )
     {
         File outputDir = getOutputDirectory();