You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@karaf.apache.org by gn...@apache.org on 2016/11/10 12:33:56 UTC

karaf git commit: [KARAF-4271][KARAF-4272] Fix repository loading to avoid endless loops in some cases

Repository: karaf
Updated Branches:
  refs/heads/master a2a7d62da -> d6c3fcf31


[KARAF-4271][KARAF-4272] Fix repository loading to avoid endless loops in some cases

Project: http://git-wip-us.apache.org/repos/asf/karaf/repo
Commit: http://git-wip-us.apache.org/repos/asf/karaf/commit/d6c3fcf3
Tree: http://git-wip-us.apache.org/repos/asf/karaf/tree/d6c3fcf3
Diff: http://git-wip-us.apache.org/repos/asf/karaf/diff/d6c3fcf3

Branch: refs/heads/master
Commit: d6c3fcf31142b6e0e85409dca96f4b787b4e83f9
Parents: a2a7d62
Author: Guillaume Nodet <gn...@apache.org>
Authored: Thu Nov 10 13:33:16 2016 +0100
Committer: Guillaume Nodet <gn...@apache.org>
Committed: Thu Nov 10 13:33:23 2016 +0100

----------------------------------------------------------------------
 .../internal/service/FeaturesServiceImpl.java   |  5 +++--
 .../service/FeaturesServiceImplTest.java        | 21 ++++++++++++++++++++
 .../internal/service/cycle/a-references-b.xml   |  7 +++++++
 .../internal/service/cycle/b-references-c.xml   |  7 +++++++
 .../internal/service/cycle/c-references-a.xml   |  7 +++++++
 5 files changed, 45 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/karaf/blob/d6c3fcf3/features/core/src/main/java/org/apache/karaf/features/internal/service/FeaturesServiceImpl.java
----------------------------------------------------------------------
diff --git a/features/core/src/main/java/org/apache/karaf/features/internal/service/FeaturesServiceImpl.java b/features/core/src/main/java/org/apache/karaf/features/internal/service/FeaturesServiceImpl.java
index aa4050d..37b25ed 100644
--- a/features/core/src/main/java/org/apache/karaf/features/internal/service/FeaturesServiceImpl.java
+++ b/features/core/src/main/java/org/apache/karaf/features/internal/service/FeaturesServiceImpl.java
@@ -684,6 +684,7 @@ public class FeaturesServiceImpl implements FeaturesService, Deployer.DeployCall
         Map<String, Map<String, Feature>> map = new HashMap<>();
         // Two phase load:
         // * first load dependent repositories
+        Set<String> loaded = new HashSet<>();
         List<String> toLoad = new ArrayList<>(uris);
         while (!toLoad.isEmpty()) {
             String uri = toLoad.remove(0);
@@ -700,8 +701,8 @@ public class FeaturesServiceImpl implements FeaturesService, Deployer.DeployCall
                         repositoryCache.put(uri, repo);
                     }
                 }
-                for (URI u : repo.getRepositories()) {
-                    if (!toLoad.contains(u.toString())) {
+                if (loaded.add(uri)) {
+                    for (URI u : repo.getRepositories()) {
                         toLoad.add(u.toString());
                     }
                 }

http://git-wip-us.apache.org/repos/asf/karaf/blob/d6c3fcf3/features/core/src/test/java/org/apache/karaf/features/internal/service/FeaturesServiceImplTest.java
----------------------------------------------------------------------
diff --git a/features/core/src/test/java/org/apache/karaf/features/internal/service/FeaturesServiceImplTest.java b/features/core/src/test/java/org/apache/karaf/features/internal/service/FeaturesServiceImplTest.java
index 8e3cdfe..7ef79d1 100644
--- a/features/core/src/test/java/org/apache/karaf/features/internal/service/FeaturesServiceImplTest.java
+++ b/features/core/src/test/java/org/apache/karaf/features/internal/service/FeaturesServiceImplTest.java
@@ -20,6 +20,8 @@ import java.io.File;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
+import java.lang.reflect.Field;
+import java.net.*;
 import java.util.Map;
 
 import org.apache.felix.resolver.ResolverImpl;
@@ -102,6 +104,25 @@ public class FeaturesServiceImplTest extends TestBase {
         assertEquals("2.0.0", impl.getFeatures("transaction", org.apache.karaf.features.internal.model.Feature.DEFAULT_VERSION)[0].getVersion());
     }
 
+    @Test
+    public void testCyclicFeatures() throws Exception {
+        URL.setURLStreamHandlerFactory(protocol -> protocol.equals("custom") ? new URLStreamHandler() {
+            @Override
+            protected URLConnection openConnection(URL u) throws IOException {
+                return getClass().getResource(u.getPath()).openConnection();
+            }
+        } : null);
+        try {
+            final FeaturesServiceImpl impl = new FeaturesServiceImpl(null, null, null, new Storage(), null, null, null, this.resolver, null, "", null, null, null, null, null, 0, 0, 0, null);
+            impl.addRepository(URI.create("custom:cycle/a-references-b.xml"));
+            impl.getFeatures();
+        } finally {
+            Field field = URL.class.getDeclaredField("factory");
+            field.setAccessible(true);
+            field.set(null, null);
+        }
+    }
+
     /**
      * This test ensures that every feature get installed only once, even if it appears multiple times in the list
      * of transitive feature dependencies (KARAF-1600)

http://git-wip-us.apache.org/repos/asf/karaf/blob/d6c3fcf3/features/core/src/test/resources/org/apache/karaf/features/internal/service/cycle/a-references-b.xml
----------------------------------------------------------------------
diff --git a/features/core/src/test/resources/org/apache/karaf/features/internal/service/cycle/a-references-b.xml b/features/core/src/test/resources/org/apache/karaf/features/internal/service/cycle/a-references-b.xml
new file mode 100644
index 0000000..aaa0a7f
--- /dev/null
+++ b/features/core/src/test/resources/org/apache/karaf/features/internal/service/cycle/a-references-b.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<features xmlns="http://karaf.apache.org/xmlns/features/v1.3.0" name="a-references-b">
+    <repository>custom:cycle/b-references-c.xml</repository>
+    <feature name="a-references-b" description="a-references-b" version="1.0.0.SNAPSHOT">
+        <feature>b-references-c</feature>
+    </feature>
+</features>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/karaf/blob/d6c3fcf3/features/core/src/test/resources/org/apache/karaf/features/internal/service/cycle/b-references-c.xml
----------------------------------------------------------------------
diff --git a/features/core/src/test/resources/org/apache/karaf/features/internal/service/cycle/b-references-c.xml b/features/core/src/test/resources/org/apache/karaf/features/internal/service/cycle/b-references-c.xml
new file mode 100644
index 0000000..2b11414
--- /dev/null
+++ b/features/core/src/test/resources/org/apache/karaf/features/internal/service/cycle/b-references-c.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<features xmlns="http://karaf.apache.org/xmlns/features/v1.3.0" name="b-references-c">
+    <repository>custom:cycle/c-references-a.xml</repository>
+    <feature name="b-references-c" description="b-references-c" version="1.0.0.SNAPSHOT">
+        <feature>c-references-a</feature>
+    </feature>
+</features>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/karaf/blob/d6c3fcf3/features/core/src/test/resources/org/apache/karaf/features/internal/service/cycle/c-references-a.xml
----------------------------------------------------------------------
diff --git a/features/core/src/test/resources/org/apache/karaf/features/internal/service/cycle/c-references-a.xml b/features/core/src/test/resources/org/apache/karaf/features/internal/service/cycle/c-references-a.xml
new file mode 100644
index 0000000..b1293c9
--- /dev/null
+++ b/features/core/src/test/resources/org/apache/karaf/features/internal/service/cycle/c-references-a.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<features xmlns="http://karaf.apache.org/xmlns/features/v1.3.0" name="c-references-a">
+    <repository>custom:cycle/a-references-b.xml</repository>
+    <feature name="c-references-a" description="c-references-a" version="1.0.0.SNAPSHOT">
+        <feature>a-references-b</feature>
+    </feature>
+</features>
\ No newline at end of file