Author: gertv
Date: Thu Jun 17 20:16:21 2010
New Revision: 955727

URL: http://svn.apache.org/viewvc?rev=955727&view=rev
Log:
FELIX-2419: UnsupportedOperationException while installing features

Modified:
    
felix/trunk/karaf/features/core/src/main/java/org/apache/felix/karaf/features/internal/FeaturesServiceImpl.java
    
felix/trunk/karaf/features/core/src/test/java/org/apache/felix/karaf/features/internal/FeaturesServiceImplTest.java

Modified: 
felix/trunk/karaf/features/core/src/main/java/org/apache/felix/karaf/features/internal/FeaturesServiceImpl.java
URL: 
http://svn.apache.org/viewvc/felix/trunk/karaf/features/core/src/main/java/org/apache/felix/karaf/features/internal/FeaturesServiceImpl.java?rev=955727&r1=955726&r2=955727&view=diff
==============================================================================
--- 
felix/trunk/karaf/features/core/src/main/java/org/apache/felix/karaf/features/internal/FeaturesServiceImpl.java
 (original)
+++ 
felix/trunk/karaf/features/core/src/main/java/org/apache/felix/karaf/features/internal/FeaturesServiceImpl.java
 Thu Jun 17 20:16:21 2010
@@ -434,22 +434,11 @@ public class FeaturesServiceImpl impleme
         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 @@ public class FeaturesServiceImpl impleme
         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;

Modified: 
felix/trunk/karaf/features/core/src/test/java/org/apache/felix/karaf/features/internal/FeaturesServiceImplTest.java
URL: 
http://svn.apache.org/viewvc/felix/trunk/karaf/features/core/src/test/java/org/apache/felix/karaf/features/internal/FeaturesServiceImplTest.java?rev=955727&r1=955726&r2=955727&view=diff
==============================================================================
--- 
felix/trunk/karaf/features/core/src/test/java/org/apache/felix/karaf/features/internal/FeaturesServiceImplTest.java
 (original)
+++ 
felix/trunk/karaf/features/core/src/test/java/org/apache/felix/karaf/features/internal/FeaturesServiceImplTest.java
 Thu Jun 17 20:16:21 2010
@@ -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 @@ public class FeaturesServiceImplTest ext
             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());
+    }
 }


Reply via email to