[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 <gno...@gmail.com> Authored: Tue Apr 22 10:36:45 2014 +0200 Committer: Guillaume Nodet <gno...@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