FELIX-1768 - should catch exception for FeaturesServiceImpl.internalAddRepository per uri
- Fix for FELIX-1869 broke this again.


git-svn-id: https://svn.apache.org/repos/asf/felix/trunk@889745 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 07e9199..128a383 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
@@ -62,6 +62,8 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import static java.lang.String.format;
+
 /**
  * The Features service implementation.
  * Adding a repository url will load the features contained in this repository and
@@ -630,7 +632,11 @@
         if (!loadState()) {
             if (uris != null) {
                 for (URI uri : uris) {
-                    internalAddRepository(uri);
+                    try {
+                        internalAddRepository(uri);
+                    } catch (Exception e) {
+                        LOGGER.warn(format("Unable to add features repository %s at startup", uri), e);    
+                    }
                 }
             }
             saveState();
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 8c8cb10..6728358 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
@@ -21,6 +21,14 @@
 
 import junit.framework.TestCase;
 import org.apache.felix.karaf.features.Feature;
+import org.easymock.EasyMock;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+import org.osgi.service.prefs.BackingStoreException;
+import org.osgi.service.prefs.Preferences;
+import org.osgi.service.prefs.PreferencesService;
+
+import static org.easymock.EasyMock.*;
 
 /**
  * Test cases for {@link FeaturesServiceImpl}
@@ -85,4 +93,25 @@
         assertSame("2.0.0", impl.getFeature("transaction", FeatureImpl.DEFAULT_VERSION).getVersion());
     }
 
+    public void testStartDoesNotFailWithOneInvalidUri() throws BackingStoreException {
+        PreferencesService preferencesService = createNiceMock(PreferencesService.class);
+        Preferences prefs = createNiceMock(Preferences.class);
+        Preferences emptyPrefs = createNiceMock(Preferences.class);
+        expect(preferencesService.getUserPreferences("FeaturesServiceState")).andStubReturn(prefs);
+        replay(preferencesService);
+
+        expect(prefs.node("repositories")).andReturn(emptyPrefs);
+        expect(prefs.node("features")).andReturn(emptyPrefs);
+        replay(prefs);
+
+        FeaturesServiceImpl service = new FeaturesServiceImpl();
+        service.setPreferences(preferencesService);
+
+        try {
+            service.setUrls("mvn:inexistent/features/1.0/xml/features");
+            service.start();
+        } catch (Exception e) {
+            fail(String.format("Service should not throw start-up exception but log the error instead: %s", e));
+        }
+    }
 }