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/04/01 17:13:23 UTC

karaf git commit: [KARAF-4411] FeatureResolver: spring-dm-web feature installs Spring ver 3.1.4 and 3.2.14 at the same time

Repository: karaf
Updated Branches:
  refs/heads/master 23023e72d -> 41fc57fdc


[KARAF-4411] FeatureResolver: spring-dm-web feature installs Spring ver 3.1.4 and 3.2.14 at the same time

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

Branch: refs/heads/master
Commit: 41fc57fdcd0697d5dad3a49a56779c310b6c629b
Parents: 23023e7
Author: Guillaume Nodet <gn...@apache.org>
Authored: Wed Mar 16 09:53:55 2016 +0100
Committer: Guillaume Nodet <gn...@apache.org>
Committed: Fri Apr 1 17:12:54 2016 +0200

----------------------------------------------------------------------
 .../features/internal/region/Subsystem.java     |   2 +-
 .../region/FeaturesDependenciesTest.java        | 212 +++++++++++++++++++
 .../karaf/features/internal/region/data8/a1.mf  |   5 +
 .../karaf/features/internal/region/data8/a2.mf  |   4 +
 .../karaf/features/internal/region/data8/b1.mf  |   6 +
 .../karaf/features/internal/region/data8/b2.mf  |   6 +
 .../features/internal/region/data8/features.xml |  91 ++++++++
 .../internal/region/data8/spring-core-3.1.4.mf  |   5 +
 .../internal/region/data8/spring-core-3.2.14.mf |   5 +
 .../internal/region/data8/spring-core-4.0.7.mf  |   5 +
 .../region/data8/spring-osgi-core-1.2.1.mf      |   5 +
 11 files changed, 345 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/karaf/blob/41fc57fd/features/core/src/main/java/org/apache/karaf/features/internal/region/Subsystem.java
----------------------------------------------------------------------
diff --git a/features/core/src/main/java/org/apache/karaf/features/internal/region/Subsystem.java b/features/core/src/main/java/org/apache/karaf/features/internal/region/Subsystem.java
index 09cae6b..d8863e5 100644
--- a/features/core/src/main/java/org/apache/karaf/features/internal/region/Subsystem.java
+++ b/features/core/src/main/java/org/apache/karaf/features/internal/region/Subsystem.java
@@ -284,7 +284,7 @@ public class Subsystem extends ResourceImpl {
                 while (!ss.isAcceptDependencies()) {
                     ss = ss.getParent();
                 }
-                ss.requireFeature(dep.getName(), dep.getVersion(), this.mandatory && (mandatory && !dep.isDependency()));
+                ss.requireFeature(dep.getName(), dep.getVersion(), false);
             }
             for (Conditional cond : feature.getConditional()) {
                 Feature fcond = cond.asFeature();

http://git-wip-us.apache.org/repos/asf/karaf/blob/41fc57fd/features/core/src/test/java/org/apache/karaf/features/internal/region/FeaturesDependenciesTest.java
----------------------------------------------------------------------
diff --git a/features/core/src/test/java/org/apache/karaf/features/internal/region/FeaturesDependenciesTest.java b/features/core/src/test/java/org/apache/karaf/features/internal/region/FeaturesDependenciesTest.java
new file mode 100644
index 0000000..db990bd
--- /dev/null
+++ b/features/core/src/test/java/org/apache/karaf/features/internal/region/FeaturesDependenciesTest.java
@@ -0,0 +1,212 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.karaf.features.internal.region;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.felix.resolver.ResolverImpl;
+import org.apache.karaf.features.FeaturesService;
+import org.apache.karaf.features.Slf4jResolverLog;
+import org.apache.karaf.features.internal.service.RepositoryImpl;
+import org.apache.karaf.features.internal.support.TestDownloadManager;
+import org.junit.Test;
+import org.osgi.framework.namespace.IdentityNamespace;
+import org.osgi.framework.wiring.BundleRevision;
+import org.osgi.resource.Capability;
+import org.osgi.resource.Resource;
+import org.osgi.resource.Wire;
+import org.osgi.service.resolver.Resolver;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import static org.apache.karaf.features.internal.util.MapUtils.addToMapSet;
+import static org.junit.Assert.assertEquals;
+
+public class FeaturesDependenciesTest {
+
+    Logger logger = LoggerFactory.getLogger(FeaturesDependenciesTest.class);;
+    Resolver resolver = new ResolverImpl(new Slf4jResolverLog(logger));
+
+    @Test
+    public void testFeatureDependency1() throws Exception {
+        doTestFeatureDependency(
+                new String[] { "f1" },
+                new String[] { "a1/1.0.0", "b/2.0.0" }
+        );
+    }
+
+    @Test
+    public void testFeatureDependency1b() throws Exception {
+        doTestFeatureDependency(
+                new String[] { "f1", "dep/[1.0,2.0)"},
+                new String[] { "a1/1.0.0", "b/1.0.0" }
+        );
+    }
+
+    @Test
+    public void testFeatureDependency2() throws Exception {
+        doTestFeatureDependency(
+                new String[] { "f2" },
+                new String[] { "a1/1.0.0", "b/2.0.0" }
+        );
+    }
+
+    @Test
+    public void testFeatureDependency2b() throws Exception {
+        doTestFeatureDependency(
+                new String[] { "f2", "dep/[1.0,2.0)"},
+                new String[] { "a1/1.0.0", "b/1.0.0" }
+        );
+    }
+
+    @Test
+    public void testFeatureDependency3() throws Exception {
+        doTestFeatureDependency(
+                new String[] { "f3" },
+                new String[] { "a2/1.0.0" }
+        );
+    }
+
+    @Test
+    public void testFeatureDependency3b() throws Exception {
+        doTestFeatureDependency(
+                new String[] { "f3", "dep/[1.0,2.0)"},
+                new String[] { "a2/1.0.0", "b/1.0.0" }
+        );
+    }
+
+    @Test
+    public void testFeatureDependency4() throws Exception {
+        doTestFeatureDependency(
+                new String[] { "f4" },
+                new String[] { "a2/1.0.0", "b/2.0.0" }
+        );
+    }
+
+    @Test
+    public void testFeatureDependency4b() throws Exception {
+        doTestFeatureDependency(
+                new String[] { "f4", "dep/[1.0,2.0)"},
+                new String[] { "a2/1.0.0", "b/1.0.0" }
+        );
+    }
+
+    @Test
+    public void testSpring() throws Exception {
+        doTestFeatureDependency(
+                new String[] { "spring-dm-web"},
+                new String[] { "spring-osgi-core/1.2.1", "spring-core/3.2.14" }
+        );
+    }
+
+    @Test
+    public void testFeatureDependencyLevel() throws Exception {
+        doTestFeatureDependency(
+                new String[] { "tf1" },
+                new String[] { "a2/1.0.0" }
+        );
+    }
+
+    private void doTestFeatureDependency(String[] features, String[] bundles) throws Exception {
+        RepositoryImpl repo = new RepositoryImpl(getClass().getResource("data8/features.xml").toURI());
+
+        Map<String, Set<String>> requirements = new HashMap<String, Set<String>>();
+        for (String feature : features) {
+            addToMapSet(requirements, "root", feature);
+        }
+
+        Map<String, Set<String>> expected = new HashMap<String, Set<String>>();
+        for (String bundle : bundles) {
+            addToMapSet(expected, "root", bundle);
+        }
+
+        SubsystemResolver resolver = new SubsystemResolver(this.resolver, new TestDownloadManager(getClass(), "data8"));
+        resolver.prepare(Arrays.asList(repo.getFeatures()),
+                requirements,
+                Collections.<String, Set<BundleRevision>>emptyMap());
+        resolver.resolve(Collections.<String>emptySet(),
+                FeaturesService.DEFAULT_FEATURE_RESOLUTION_RANGE,
+                null, null, null);
+
+        verify(resolver, expected);
+    }
+
+    private void verify(SubsystemResolver resolver, Map<String, Set<String>> expected) {
+        Map<String, Set<String>> mapping = getBundleNamesPerRegions(resolver);
+        if (!expected.equals(mapping)) {
+            dumpBundles(resolver);
+            dumpWiring(resolver);
+            assertEquals("Resolution failed", expected, mapping);
+        }
+    }
+
+    private void dumpBundles(SubsystemResolver resolver) {
+        System.out.println("Bundle mapping");
+        Map<String, Set<Resource>> bundles = resolver.getBundlesPerRegions();
+        for (Map.Entry<String, Set<Resource>> entry : bundles.entrySet()) {
+            System.out.println("    " + entry.getKey());
+            for (Resource b : entry.getValue()) {
+                System.out.println("        " + b);
+            }
+        }
+    }
+
+    private Map<String, Set<String>> getBundleNamesPerRegions(SubsystemResolver resolver) {
+        Map<String, Set<String>> mapping = new HashMap<String, Set<String>>();
+        Map<String, Set<Resource>> bundles = resolver.getBundlesPerRegions();
+        for (Map.Entry<String,Set<Resource>> entry : bundles.entrySet()) {
+            for (Resource r : entry.getValue()) {
+                addToMapSet(mapping, entry.getKey(), r.toString());
+            }
+        }
+        return mapping;
+    }
+
+
+    private void dumpWiring(SubsystemResolver resolver) {
+        System.out.println("Wiring");
+        Map<Resource, List<Wire>> wiring = resolver.getWiring();
+        List<Resource> resources = new ArrayList<Resource>(wiring.keySet());
+        Collections.sort(resources, new Comparator<Resource>() {
+            @Override
+            public int compare(Resource o1, Resource o2) {
+                return getName(o1).compareTo(getName(o2));
+            }
+        });
+        for (Resource resource : resources) {
+            System.out.println("    " + getName(resource));
+            for (Wire wire : wiring.get(resource)) {
+                System.out.println("        " + wire);
+            }
+        }
+    }
+
+    private String getName(Resource resource) {
+        Capability cap = resource.getCapabilities(IdentityNamespace.IDENTITY_NAMESPACE).get(0);
+        return cap.getAttributes().get(IdentityNamespace.CAPABILITY_TYPE_ATTRIBUTE) + ": "
+                + cap.getAttributes().get(IdentityNamespace.IDENTITY_NAMESPACE) + "/"
+                + cap.getAttributes().get(IdentityNamespace.CAPABILITY_VERSION_ATTRIBUTE);
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/karaf/blob/41fc57fd/features/core/src/test/resources/org/apache/karaf/features/internal/region/data8/a1.mf
----------------------------------------------------------------------
diff --git a/features/core/src/test/resources/org/apache/karaf/features/internal/region/data8/a1.mf b/features/core/src/test/resources/org/apache/karaf/features/internal/region/data8/a1.mf
new file mode 100644
index 0000000..743582a
--- /dev/null
+++ b/features/core/src/test/resources/org/apache/karaf/features/internal/region/data8/a1.mf
@@ -0,0 +1,5 @@
+Manifest-Version: 1
+Bundle-ManifestVersion: 2
+Bundle-SymbolicName: a1
+Bundle-Version: 1.0.0
+Import-Package: b

http://git-wip-us.apache.org/repos/asf/karaf/blob/41fc57fd/features/core/src/test/resources/org/apache/karaf/features/internal/region/data8/a2.mf
----------------------------------------------------------------------
diff --git a/features/core/src/test/resources/org/apache/karaf/features/internal/region/data8/a2.mf b/features/core/src/test/resources/org/apache/karaf/features/internal/region/data8/a2.mf
new file mode 100644
index 0000000..87199d5
--- /dev/null
+++ b/features/core/src/test/resources/org/apache/karaf/features/internal/region/data8/a2.mf
@@ -0,0 +1,4 @@
+Manifest-Version: 1
+Bundle-ManifestVersion: 2
+Bundle-SymbolicName: a2
+Bundle-Version: 1.0.0

http://git-wip-us.apache.org/repos/asf/karaf/blob/41fc57fd/features/core/src/test/resources/org/apache/karaf/features/internal/region/data8/b1.mf
----------------------------------------------------------------------
diff --git a/features/core/src/test/resources/org/apache/karaf/features/internal/region/data8/b1.mf b/features/core/src/test/resources/org/apache/karaf/features/internal/region/data8/b1.mf
new file mode 100644
index 0000000..4dd6873
--- /dev/null
+++ b/features/core/src/test/resources/org/apache/karaf/features/internal/region/data8/b1.mf
@@ -0,0 +1,6 @@
+Manifest-Version: 1
+Bundle-ManifestVersion: 2
+Bundle-SymbolicName: b
+Bundle-Version: 1.0.0
+Export-Package: b;version=1.0
+

http://git-wip-us.apache.org/repos/asf/karaf/blob/41fc57fd/features/core/src/test/resources/org/apache/karaf/features/internal/region/data8/b2.mf
----------------------------------------------------------------------
diff --git a/features/core/src/test/resources/org/apache/karaf/features/internal/region/data8/b2.mf b/features/core/src/test/resources/org/apache/karaf/features/internal/region/data8/b2.mf
new file mode 100644
index 0000000..9d78fc7
--- /dev/null
+++ b/features/core/src/test/resources/org/apache/karaf/features/internal/region/data8/b2.mf
@@ -0,0 +1,6 @@
+Manifest-Version: 1
+Bundle-ManifestVersion: 2
+Bundle-SymbolicName: b
+Bundle-Version: 2.0.0
+Export-Package: b;version=2.0
+

http://git-wip-us.apache.org/repos/asf/karaf/blob/41fc57fd/features/core/src/test/resources/org/apache/karaf/features/internal/region/data8/features.xml
----------------------------------------------------------------------
diff --git a/features/core/src/test/resources/org/apache/karaf/features/internal/region/data8/features.xml b/features/core/src/test/resources/org/apache/karaf/features/internal/region/data8/features.xml
new file mode 100644
index 0000000..5794994
--- /dev/null
+++ b/features/core/src/test/resources/org/apache/karaf/features/internal/region/data8/features.xml
@@ -0,0 +1,91 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+    Licensed to the Apache Software Foundation (ASF) under one or more
+    contributor license agreements. See the NOTICE file distributed with
+    this work for additional information regarding copyright ownership.
+    The ASF licenses this file to You under the Apache License, Version 2.0
+    (the "License"); you may not use this file except in compliance with
+    the License. You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+
+-->
+<features name="test" xmlns="http://karaf.apache.org/xmlns/features/v1.3.0">
+
+    <feature name="f1">
+        <feature dependency="true">dep</feature>
+        <bundle>a1</bundle>
+    </feature>
+
+    <feature name="f2">
+        <feature dependency="false">dep</feature>
+        <bundle>a1</bundle>
+    </feature>
+
+    <feature name="f3">
+        <feature dependency="true">dep</feature>
+        <bundle>a2</bundle>
+    </feature>
+
+    <feature name="f4">
+        <feature dependency="false">dep</feature>
+        <bundle>a2</bundle>
+    </feature>
+
+    <feature name="dep" version="1.0">
+        <bundle>b1</bundle>
+    </feature>
+
+    <feature name="dep" version="2.0">
+        <bundle>b2</bundle>
+    </feature>
+
+    <feature name="spring-dm-web" version="1.2.1">
+        <feature>spring-dm</feature>
+        <feature version="[2.5.6,4)">spring-web</feature>
+    </feature>
+
+    <feature name="spring-dm" version="1.2.1">
+        <feature version="[2.5.6,4)">spring</feature>
+        <bundle>spring-osgi-core-1.2.1</bundle>
+    </feature>
+
+    <feature name="spring-web" version="3.1.4">
+        <feature version="[3.1.4,3.2)">spring</feature>
+    </feature>
+    <feature name="spring" version="3.1.4">
+        <bundle>spring-core-3.1.4</bundle>
+    </feature>
+
+    <feature name="spring-web" version="3.2.14">
+        <feature version="[3.2.14,3.3)">spring</feature>
+    </feature>
+    <feature name="spring" version="3.2.14">
+        <bundle>spring-core-3.2.14</bundle>
+    </feature>
+
+    <feature name="spring-web" version="4.0.7">
+        <feature version="[4.0.7,4.1)">spring</feature>
+    </feature>
+    <feature name="spring" version="4.0.7">
+        <bundle>spring-core-4.0.7</bundle>
+    </feature>
+
+    <feature name="tf1">
+        <feature>tf2</feature>
+    </feature>
+    <feature name="tf2">
+        <feature>tf3</feature>
+    </feature>
+    <feature name="tf3">
+        <bundle>a2</bundle>
+    </feature>
+
+
+</features>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/karaf/blob/41fc57fd/features/core/src/test/resources/org/apache/karaf/features/internal/region/data8/spring-core-3.1.4.mf
----------------------------------------------------------------------
diff --git a/features/core/src/test/resources/org/apache/karaf/features/internal/region/data8/spring-core-3.1.4.mf b/features/core/src/test/resources/org/apache/karaf/features/internal/region/data8/spring-core-3.1.4.mf
new file mode 100644
index 0000000..e996aa6
--- /dev/null
+++ b/features/core/src/test/resources/org/apache/karaf/features/internal/region/data8/spring-core-3.1.4.mf
@@ -0,0 +1,5 @@
+Manifest-Version: 1
+Bundle-ManifestVersion: 2
+Bundle-SymbolicName: spring-core
+Bundle-Version: 3.1.4
+Export-Package: org.springframework.beans;version=3.1.4

http://git-wip-us.apache.org/repos/asf/karaf/blob/41fc57fd/features/core/src/test/resources/org/apache/karaf/features/internal/region/data8/spring-core-3.2.14.mf
----------------------------------------------------------------------
diff --git a/features/core/src/test/resources/org/apache/karaf/features/internal/region/data8/spring-core-3.2.14.mf b/features/core/src/test/resources/org/apache/karaf/features/internal/region/data8/spring-core-3.2.14.mf
new file mode 100644
index 0000000..89139c6
--- /dev/null
+++ b/features/core/src/test/resources/org/apache/karaf/features/internal/region/data8/spring-core-3.2.14.mf
@@ -0,0 +1,5 @@
+Manifest-Version: 1
+Bundle-ManifestVersion: 2
+Bundle-SymbolicName: spring-core
+Bundle-Version: 3.2.14
+Export-Package: org.springframework.beans;version=3.2.14

http://git-wip-us.apache.org/repos/asf/karaf/blob/41fc57fd/features/core/src/test/resources/org/apache/karaf/features/internal/region/data8/spring-core-4.0.7.mf
----------------------------------------------------------------------
diff --git a/features/core/src/test/resources/org/apache/karaf/features/internal/region/data8/spring-core-4.0.7.mf b/features/core/src/test/resources/org/apache/karaf/features/internal/region/data8/spring-core-4.0.7.mf
new file mode 100644
index 0000000..8af8738
--- /dev/null
+++ b/features/core/src/test/resources/org/apache/karaf/features/internal/region/data8/spring-core-4.0.7.mf
@@ -0,0 +1,5 @@
+Manifest-Version: 1
+Bundle-ManifestVersion: 2
+Bundle-SymbolicName: spring-core
+Bundle-Version: 4.0.7
+Export-Package: org.springframework.beans;version=4.0.7

http://git-wip-us.apache.org/repos/asf/karaf/blob/41fc57fd/features/core/src/test/resources/org/apache/karaf/features/internal/region/data8/spring-osgi-core-1.2.1.mf
----------------------------------------------------------------------
diff --git a/features/core/src/test/resources/org/apache/karaf/features/internal/region/data8/spring-osgi-core-1.2.1.mf b/features/core/src/test/resources/org/apache/karaf/features/internal/region/data8/spring-osgi-core-1.2.1.mf
new file mode 100644
index 0000000..d3cd8b2
--- /dev/null
+++ b/features/core/src/test/resources/org/apache/karaf/features/internal/region/data8/spring-osgi-core-1.2.1.mf
@@ -0,0 +1,5 @@
+Manifest-Version: 1
+Bundle-ManifestVersion: 2
+Bundle-SymbolicName: spring-osgi-core
+Bundle-Version: 1.2.1
+Import-Package: org.springframework.beans;version="[2.5.6,4.0)"