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