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 2014/04/22 14:32:20 UTC

[2/6] git commit: [KARAF-2923] Add back overrides support

[KARAF-2923] Add back overrides support


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

Branch: refs/heads/master
Commit: fabd10e2b33aa656ae30b35566e1642bb120875c
Parents: e8023c6
Author: Guillaume Nodet <gn...@gmail.com>
Authored: Tue Apr 22 10:36:45 2014 +0200
Committer: Guillaume Nodet <gn...@gmail.com>
Committed: Tue Apr 22 14:31:49 2014 +0200

----------------------------------------------------------------------
 .../features/internal/region/Subsystem.java     | 36 +++++++++++++++-----
 .../internal/region/SubsystemResolver.java      |  4 +--
 .../internal/resolver/FeatureResource.java      |  4 +--
 .../internal/service/FeaturesServiceImpl.java   |  2 +-
 .../features/internal/service/Overrides.java    |  4 +--
 .../features/internal/region/SubsystemTest.java | 22 ++++++++++++
 .../karaf/features/internal/region/data3/a.mf   |  5 +++
 .../karaf/features/internal/region/data3/b.mf   |  5 +++
 .../features/internal/region/data3/features.xml | 25 ++++++++++++++
 9 files changed, 91 insertions(+), 16 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/karaf/blob/fabd10e2/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 8d55317..98d5f60 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
@@ -42,6 +42,7 @@ import org.apache.karaf.features.internal.resolver.RequirementImpl;
 import org.apache.karaf.features.internal.resolver.ResourceBuilder;
 import org.apache.karaf.features.internal.resolver.ResourceImpl;
 import org.apache.karaf.features.internal.resolver.ResourceUtils;
+import org.apache.karaf.features.internal.service.Overrides;
 import org.eclipse.equinox.region.RegionFilter;
 import org.osgi.framework.BundleException;
 import org.osgi.framework.Version;
@@ -205,9 +206,10 @@ public class Subsystem extends ResourceImpl {
     @SuppressWarnings("InfiniteLoopStatement")
     public void preResolve(Collection<Feature> features,
                            DownloadManager manager,
+                           Set<String> overrides,
                            String featureResolutionRange) throws Exception {
         for (Subsystem child : children) {
-            child.preResolve(features, manager, featureResolutionRange);
+            child.preResolve(features, manager, overrides, featureResolutionRange);
         }
         List<Requirement> processed = new ArrayList<Requirement>();
         while (true) {
@@ -229,7 +231,7 @@ public class Subsystem extends ResourceImpl {
                                 Subsystem fs = getChild(ssName);
                                 if (fs == null) {
                                     fs = new Subsystem(ssName, feature, this);
-                                    fs.preResolve(features, manager, featureResolutionRange);
+                                    fs.preResolve(features, manager, overrides, featureResolutionRange);
                                     installable.add(fs);
                                     children.add(fs);
                                 }
@@ -241,7 +243,7 @@ public class Subsystem extends ResourceImpl {
             }
         }
         if (feature != null) {
-            final Map<String, Resource> bundles = new ConcurrentHashMap<String, Resource>();
+            final Map<String, ResourceImpl> bundles = new ConcurrentHashMap<String, ResourceImpl>();
             final Downloader downloader = manager.createDownloader();
             final Map<BundleInfo, Boolean> infos = new HashMap<BundleInfo, Boolean>();
             for (Conditional cond : feature.getConditional()) {
@@ -255,21 +257,37 @@ public class Subsystem extends ResourceImpl {
             for (Map.Entry<BundleInfo, Boolean> entry : infos.entrySet()) {
                 final BundleInfo bi = entry.getKey();
                 final String loc = bi.getLocation();
-                final boolean mandatory = entry.getValue();
                 downloader.download(loc, new DownloadCallback() {
                     @Override
                     public void downloaded(StreamProvider provider) throws Exception {
                         ResourceImpl res = createResource(loc, provider.getMetadata());
                         bundles.put(loc, res);
-                        if (bi.isDependency()) {
-                            addDependency(res, false);
-                        } else {
-                            doAddDependency(res, mandatory);
-                        }
+                    }
+                });
+            }
+            for (String override : overrides) {
+                final String loc = Overrides.extractUrl(override);
+                downloader.download(loc, new DownloadCallback() {
+                    @Override
+                    public void downloaded(StreamProvider provider) throws Exception {
+                        ResourceImpl res = createResource(loc, provider.getMetadata());
+                        bundles.put(loc, res);
                     }
                 });
             }
             downloader.await();
+            Overrides.override(bundles, overrides);
+            for (Map.Entry<BundleInfo, Boolean> entry : infos.entrySet()) {
+                final BundleInfo bi = entry.getKey();
+                final String loc = bi.getLocation();
+                final boolean mandatory = entry.getValue();
+                ResourceImpl res = bundles.get(loc);
+                if (bi.isDependency()) {
+                    addDependency(res, false);
+                } else {
+                    doAddDependency(res, mandatory);
+                }
+            }
             for (Dependency dep : feature.getDependencies()) {
                 Subsystem ss = this;
                 while (!ss.isAcceptDependencies()) {

http://git-wip-us.apache.org/repos/asf/karaf/blob/fabd10e2/features/core/src/main/java/org/apache/karaf/features/internal/region/SubsystemResolver.java
----------------------------------------------------------------------
diff --git a/features/core/src/main/java/org/apache/karaf/features/internal/region/SubsystemResolver.java b/features/core/src/main/java/org/apache/karaf/features/internal/region/SubsystemResolver.java
index 8a98328..6387023 100644
--- a/features/core/src/main/java/org/apache/karaf/features/internal/region/SubsystemResolver.java
+++ b/features/core/src/main/java/org/apache/karaf/features/internal/region/SubsystemResolver.java
@@ -24,7 +24,6 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
-import java.util.TreeMap;
 
 import org.apache.felix.resolver.ResolverImpl;
 import org.apache.felix.resolver.Util;
@@ -79,6 +78,7 @@ public class SubsystemResolver {
             List<Repository> repositories,
             Map<String, Set<String>> features,
             Collection<? extends Resource> system,
+            Set<String> overrides,
             String featureResolutionRange
     ) throws Exception {
         // Build subsystems on the fly
@@ -114,7 +114,7 @@ public class SubsystemResolver {
         for (Repository repo : repositories) {
             allFeatures.addAll(Arrays.asList(repo.getFeatures()));
         }
-        root.preResolve(allFeatures, manager, featureResolutionRange);
+        root.preResolve(allFeatures, manager, overrides, featureResolutionRange);
 
         // Add system resources
         for (Resource res : system) {

http://git-wip-us.apache.org/repos/asf/karaf/blob/fabd10e2/features/core/src/main/java/org/apache/karaf/features/internal/resolver/FeatureResource.java
----------------------------------------------------------------------
diff --git a/features/core/src/main/java/org/apache/karaf/features/internal/resolver/FeatureResource.java b/features/core/src/main/java/org/apache/karaf/features/internal/resolver/FeatureResource.java
index 99e1253..707a213 100644
--- a/features/core/src/main/java/org/apache/karaf/features/internal/resolver/FeatureResource.java
+++ b/features/core/src/main/java/org/apache/karaf/features/internal/resolver/FeatureResource.java
@@ -38,7 +38,7 @@ public class FeatureResource extends ResourceImpl {
 
     private final Feature feature;
 
-    public static FeatureResource build(Feature feature, Conditional conditional, String featureRange, Map<String, Resource> locToRes) throws BundleException {
+    public static FeatureResource build(Feature feature, Conditional conditional, String featureRange, Map<String, ? extends Resource> locToRes) throws BundleException {
         Feature fcond = conditional.asFeature(feature.getName(), feature.getVersion());
         FeatureResource resource = build(fcond, featureRange, locToRes);
         for (String cond : conditional.getCondition()) {
@@ -63,7 +63,7 @@ public class FeatureResource extends ResourceImpl {
         return resource;
     }
 
-    public static FeatureResource build(Feature feature, String featureRange, Map<String, Resource> locToRes) throws BundleException {
+    public static FeatureResource build(Feature feature, String featureRange, Map<String, ? extends Resource> locToRes) throws BundleException {
         FeatureResource resource = new FeatureResource(feature);
         for (BundleInfo info : feature.getBundles()) {
             if (!info.isDependency()) {

http://git-wip-us.apache.org/repos/asf/karaf/blob/fabd10e2/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 ec5b55d..b7b3d13 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
@@ -831,7 +831,6 @@ public class FeaturesServiceImpl implements FeaturesService {
         // Resolve
         // TODO: requirements
         // TODO: bundles
-        // TODO: overrides
         Set<String>  overrides    = Overrides.loadOverrides(this.overrides);
         Repository[] repositories = listRepositories();
 
@@ -844,6 +843,7 @@ public class FeaturesServiceImpl implements FeaturesService {
                 Arrays.asList(repositories),
                 features,
                 systemBundles,
+                overrides,
                 featureResolutionRange);
         Collection<Resource> allResources = resolution.keySet();
         Map<String, StreamProvider> providers = resolver.getProviders();

http://git-wip-us.apache.org/repos/asf/karaf/blob/fabd10e2/features/core/src/main/java/org/apache/karaf/features/internal/service/Overrides.java
----------------------------------------------------------------------
diff --git a/features/core/src/main/java/org/apache/karaf/features/internal/service/Overrides.java b/features/core/src/main/java/org/apache/karaf/features/internal/service/Overrides.java
index 233a8a2..238b007 100644
--- a/features/core/src/main/java/org/apache/karaf/features/internal/service/Overrides.java
+++ b/features/core/src/main/java/org/apache/karaf/features/internal/service/Overrides.java
@@ -65,12 +65,12 @@ public class Overrides {
      * @param resources the list of resources to resolve
      * @param overrides list of bundle overrides
      */
-    public static void override(Map<String, Resource> resources, Collection<String> overrides) {
+    public static <T extends Resource> void override(Map<String, T> resources, Collection<String> overrides) {
         // Do override replacement
         for (Clause override : Parser.parseClauses(overrides.toArray(new String[overrides.size()]))) {
             String url = override.getName();
             String vr  = override.getAttribute(OVERRIDE_RANGE);
-            Resource over = resources.get(url);
+            T over = resources.get(url);
             if (over == null) {
                 // Ignore invalid overrides
                 continue;

http://git-wip-us.apache.org/repos/asf/karaf/blob/fabd10e2/features/core/src/test/java/org/apache/karaf/features/internal/region/SubsystemTest.java
----------------------------------------------------------------------
diff --git a/features/core/src/test/java/org/apache/karaf/features/internal/region/SubsystemTest.java b/features/core/src/test/java/org/apache/karaf/features/internal/region/SubsystemTest.java
index 0ef26cb..c16de51 100644
--- a/features/core/src/test/java/org/apache/karaf/features/internal/region/SubsystemTest.java
+++ b/features/core/src/test/java/org/apache/karaf/features/internal/region/SubsystemTest.java
@@ -64,6 +64,7 @@ public class SubsystemTest {
         resolver.resolve(Collections.<Repository>singletonList(repo),
                          features,
                          Collections.<Resource>emptyList(),
+                         Collections.<String>emptySet(),
                          FeaturesServiceImpl.DEFAULT_FEATURE_RESOLUTION_RANGE);
 
         verify(resolver, expected);
@@ -93,11 +94,32 @@ public class SubsystemTest {
         resolver.resolve(Collections.<Repository>singletonList(repo),
                          features,
                          Collections.<Resource>emptyList(),
+                         Collections.<String>emptySet(),
                          FeaturesServiceImpl.DEFAULT_FEATURE_RESOLUTION_RANGE);
 
         verify(resolver, expected);
     }
 
+    @Test
+    public void testOverrides() throws Exception {
+        RepositoryImpl repo = new RepositoryImpl(getClass().getResource("data3/features.xml").toURI());
+
+        Map<String, Set<String>> features = new HashMap<String, Set<String>>();
+        addToMapSet(features, "root/apps1", "f1");
+
+        Map<String, Set<String>> expected = new HashMap<String, Set<String>>();
+        addToMapSet(expected, "root/apps1", "a/1.0.1");
+
+        SubsystemResolver resolver = new SubsystemResolver(new TestDownloadManager("data3"));
+        resolver.resolve(Collections.<Repository>singletonList(repo),
+                features,
+                Collections.<Resource>emptyList(),
+                Collections.singleton("b"),
+                FeaturesServiceImpl.DEFAULT_FEATURE_RESOLUTION_RANGE);
+
+        verify(resolver, expected);
+    }
+
     private void verify(SubsystemResolver resolver, Map<String, Set<String>> expected) {
         Map<String, Set<String>> mapping = getBundleNamesPerRegions(resolver);
         if (!expected.equals(mapping)) {

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

http://git-wip-us.apache.org/repos/asf/karaf/blob/fabd10e2/features/core/src/test/resources/org/apache/karaf/features/internal/region/data3/b.mf
----------------------------------------------------------------------
diff --git a/features/core/src/test/resources/org/apache/karaf/features/internal/region/data3/b.mf b/features/core/src/test/resources/org/apache/karaf/features/internal/region/data3/b.mf
new file mode 100644
index 0000000..a5439b0
--- /dev/null
+++ b/features/core/src/test/resources/org/apache/karaf/features/internal/region/data3/b.mf
@@ -0,0 +1,5 @@
+Manifest-Version: 1
+Bundle-ManifestVersion: 2
+Bundle-SymbolicName: a
+Bundle-Version: 1.0.1
+

http://git-wip-us.apache.org/repos/asf/karaf/blob/fabd10e2/features/core/src/test/resources/org/apache/karaf/features/internal/region/data3/features.xml
----------------------------------------------------------------------
diff --git a/features/core/src/test/resources/org/apache/karaf/features/internal/region/data3/features.xml b/features/core/src/test/resources/org/apache/karaf/features/internal/region/data3/features.xml
new file mode 100644
index 0000000..575f957
--- /dev/null
+++ b/features/core/src/test/resources/org/apache/karaf/features/internal/region/data3/features.xml
@@ -0,0 +1,25 @@
+<?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">
+        <bundle>a</bundle>
+    </feature>
+
+</features>
\ No newline at end of file