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 <[email protected]> Authored: Thu Nov 10 13:33:16 2016 +0100 Committer: Guillaume Nodet <[email protected]> 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
