FELIX-2001 - Add more info to log and console when feature bundles fail to resolve
git-svn-id: https://svn.apache.org/repos/asf/felix/trunk@904602 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 128a383..2e0fe64 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
@@ -61,6 +61,7 @@
import org.osgi.service.startlevel.StartLevel;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import org.slf4j.helpers.MessageFormatter;
import static java.lang.String.format;
@@ -289,7 +290,17 @@
if (state.installed.contains(b)
|| (b.getState() != Bundle.STARTING && b.getState() != Bundle.ACTIVE
&& getStartLevel().isBundlePersistentlyStarted(b))) {
- b.start();
+ try {
+ b.start();
+ } catch (BundleException be) {
+ String[] msgdata = new String[]{
+ b.getLocation(),
+ getFeaturesContainingBundleList(b),
+ be.getMessage()
+ };
+ String msg = MessageFormatter.arrayFormat("Could not start bundle {} in feature(s) {}: {}", msgdata);
+ throw new Exception(msg, be);
+ }
}
}
}
@@ -883,4 +894,29 @@
}
}
+ public Set<Feature> getFeaturesContainingBundle (Bundle bundle) {
+ Set<Feature> features = new HashSet<Feature>();
+ for (Map<String, Feature> featureMap : this.features.values()) {
+ for (Feature f : featureMap.values()) {
+ if (f.getBundles().contains(bundle.getLocation())) {
+ features.add(f);
+ }
+ }
+ }
+ return features;
+ }
+
+ private String getFeaturesContainingBundleList(Bundle bundle) {
+ Set<Feature> features = getFeaturesContainingBundle(bundle);
+ StringBuilder buffer = new StringBuilder();
+ Iterator<Feature> iter = features.iterator();
+ while (iter.hasNext()) {
+ Feature feature= iter.next();
+ buffer.append(feature.getId());
+ if (iter.hasNext()) {
+ buffer.append(", ");
+ }
+ }
+ return buffer.toString();
+ }
}