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