FELIX-2419: UnsupportedOperationException while installing features

git-svn-id: https://svn.apache.org/repos/asf/felix/trunk@955727 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/karaf/features/core/src/main/java/org/apache/felix/karaf/features/internal/FeaturesServiceImpl.java b/karaf/features/core/src/main/java/org/apache/felix/karaf/features/internal/FeaturesServiceImpl.java
index 16e2a5e..3433b50 100644
--- a/karaf/features/core/src/main/java/org/apache/felix/karaf/features/internal/FeaturesServiceImpl.java
+++ b/karaf/features/core/src/main/java/org/apache/felix/karaf/features/internal/FeaturesServiceImpl.java
@@ -434,22 +434,11 @@
         for (Iterator<Bundle> it = bundles.iterator(); it.hasNext();) {
             Bundle b = it.next();
             String importsStr = (String) b.getHeaders().get(Constants.IMPORT_PACKAGE);
-            if (importsStr == null) {
+            List<Clause> importsList = getOptionalImports(importsStr);
+            if (importsList.isEmpty()) {
                 it.remove();
             } else {
-                List<Clause> importsList = Arrays.asList(Parser.parseHeader(importsStr));
-                for (Iterator<Clause> itp = importsList.iterator(); itp.hasNext();) {
-                    Clause p = itp.next();
-                    String resolution = p.getDirective(Constants.RESOLUTION_DIRECTIVE);
-                    if (!Constants.RESOLUTION_OPTIONAL.equals(resolution)) {
-                        itp.remove();
-                    }
-                }
-                if (importsList.isEmpty()) {
-                    it.remove();
-                } else {
-                    imports.put(b, importsList);
-                }
+                imports.put(b, importsList);
             }
         }
         if (bundles.isEmpty()) {
@@ -500,6 +489,21 @@
         return bundles;
     }
 
+    /*
+     * Get the list of optional imports from an OSGi Import-Package string
+     */
+    protected List<Clause> getOptionalImports(String importsStr) {
+        Clause[] imports = Parser.parseHeader(importsStr);
+        List<Clause> result = new LinkedList<Clause>();
+        for (int i = 0; i < imports.length; i++) {
+            String resolution = imports[i].getDirective(Constants.RESOLUTION_DIRECTIVE);
+            if (Constants.RESOLUTION_OPTIONAL.equals(resolution)) {
+                result.add(imports[i]);
+            }
+        }
+        return result;
+    }
+
     protected Bundle installBundleIfNeeded(InstallationState state, String bundleLocation) throws IOException, BundleException {
         LOGGER.debug("Checking " + bundleLocation);
         InputStream is;
diff --git a/karaf/features/core/src/test/java/org/apache/felix/karaf/features/internal/FeaturesServiceImplTest.java b/karaf/features/core/src/test/java/org/apache/felix/karaf/features/internal/FeaturesServiceImplTest.java
index 79e050a..7775d3f 100644
--- a/karaf/features/core/src/test/java/org/apache/felix/karaf/features/internal/FeaturesServiceImplTest.java
+++ b/karaf/features/core/src/test/java/org/apache/felix/karaf/features/internal/FeaturesServiceImplTest.java
@@ -17,10 +17,12 @@
 package org.apache.felix.karaf.features.internal;
 
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 
 import junit.framework.TestCase;
 import org.apache.felix.karaf.features.Feature;
+import org.apache.felix.utils.manifest.Clause;
 import org.osgi.service.prefs.BackingStoreException;
 import org.osgi.service.prefs.Preferences;
 import org.osgi.service.prefs.PreferencesService;
@@ -111,4 +113,16 @@
             fail(String.format("Service should not throw start-up exception but log the error instead: %s", e));
         }
     }
+
+    public void testGetOptionalImportsOnly() {
+        FeaturesServiceImpl service = new FeaturesServiceImpl();
+
+        List<Clause> result = service.getOptionalImports("org.apache.felix.karaf,org.apache.felix.karaf.optional;resolution:=optional");
+        assertEquals("One optional import expected", 1, result.size());
+        assertEquals("org.apache.felix.karaf.optional", result.get(0).getName());
+
+        result = service.getOptionalImports(null);
+        assertNotNull(result);
+        assertEquals("No optional imports expected", 0, result.size());
+    }
 }