This is an automated email from the ASF dual-hosted git repository. ggrzybek pushed a commit to branch KARAF-5376-overrides_v2 in repository https://gitbox.apache.org/repos/asf/karaf.git
commit bdfcf649d7b4de1a39643ae4ed779d804ba44f1e Author: Grzegorz Grzybek <[email protected]> AuthorDate: Wed Dec 6 13:25:15 2017 +0100 [KARAF-5273] Allow to use feature identifiers in karaf-maven-plugin:assembly config, profiles and profile builder --- .../org/apache/karaf/profile/assembly/Builder.java | 24 +++++---- .../karaf/profile/assembly/FeatureSelector.java | 58 +++++++++++++++++++--- 2 files changed, 67 insertions(+), 15 deletions(-) diff --git a/profile/src/main/java/org/apache/karaf/profile/assembly/Builder.java b/profile/src/main/java/org/apache/karaf/profile/assembly/Builder.java index 413eaec..bc19b61 100644 --- a/profile/src/main/java/org/apache/karaf/profile/assembly/Builder.java +++ b/profile/src/main/java/org/apache/karaf/profile/assembly/Builder.java @@ -1426,14 +1426,17 @@ public class Builder { Feature generated = new Feature(); generated.setName(UUID.randomUUID().toString()); // Add feature dependencies - for (String dependency : bootEffective.getFeatures()) { - Dependency dep = generatedDep.get(dependency); - if (dep == null) { - dep = createDependency(dependency); - generated.getFeature().add(dep); - generatedDep.put(dep.getName(), dep); + for (String nameOrPattern : bootEffective.getFeatures()) { + // KARAF-5273: feature may be a pattern + for (String dependency : FeatureSelector.getMatchingFeatures(nameOrPattern, bootRepositories.values())) { + Dependency dep = generatedDep.get(dependency); + if (dep == null) { + dep = createDependency(dependency); + generated.getFeature().add(dep); + generatedDep.put(dep.getName(), dep); + } + dep.setDependency(false); } - dep.setDependency(false); } // Add bundles for (String location : bootEffective.getBundles()) { @@ -1819,9 +1822,12 @@ public class Builder { // Add optional resources available through OSGi resource repository request.globalRepository = repositoryOfOptionalResources(manager, optionals); - // Specify feature requirements (already prefixed with "feature:") + // Specify feature requirements for (String feature : features) { - MapUtils.addToMapSet(request.requirements, FeaturesService.ROOT_REGION, feature); + // KARAF-5273: feature may be a pattern + for (String featureName : FeatureSelector.getMatchingFeatures(feature, repositories)) { + MapUtils.addToMapSet(request.requirements, FeaturesService.ROOT_REGION, featureName); + } } // Specify bundle requirements for (String bundle : bundles) { diff --git a/profile/src/main/java/org/apache/karaf/profile/assembly/FeatureSelector.java b/profile/src/main/java/org/apache/karaf/profile/assembly/FeatureSelector.java index 2735592..9ab8b4f 100644 --- a/profile/src/main/java/org/apache/karaf/profile/assembly/FeatureSelector.java +++ b/profile/src/main/java/org/apache/karaf/profile/assembly/FeatureSelector.java @@ -16,45 +16,91 @@ */ package org.apache.karaf.profile.assembly; +import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; +import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Set; import java.util.stream.Collectors; import org.apache.felix.utils.version.VersionTable; +import org.apache.karaf.features.FeaturePattern; import org.apache.karaf.features.internal.model.Dependency; import org.apache.karaf.features.internal.model.Feature; +import org.apache.karaf.features.internal.model.Features; import org.apache.karaf.features.internal.service.FeatureReq; public class FeatureSelector { + + private final Set<Feature> allFeatures; Map<String, Set<Feature>> featuresCache; public FeatureSelector(Set<Feature> features) { + allFeatures = features; featuresCache = new HashMap<>(); for (Feature feature : features) { featuresCache.computeIfAbsent(feature.getName(), fn -> new HashSet<>()) .add(feature); } } - + + /** + * Assuming <code>idOrPattern</code> may be a pattern (with glob and version range), get all matching features + * @param idOrPattern + * @param repositories + * @return + */ + public static Collection<String> getMatchingFeatures(String idOrPattern, Collection<Features> repositories) { + List<String> result = new LinkedList<>(); + FeaturePattern pattern = new FeaturePattern(idOrPattern); + for (Features features : repositories) { + for (Feature feature : features.getFeature()) { + // blacklisting will be applied anyway, so no need to do it here + if (/*!feature.isBlacklisted() && */pattern.matches(feature.getName(), feature.getVersion())) { + result.add(feature.getId()); + } + } + } + return result; + } + + /** + * Get all matching features + * @param idOrPattern + * @param features + * @return + */ + public static Collection<String> getMatchingFeatures(FeaturePattern idOrPattern, Collection<Feature> features) { + List<String> result = new LinkedList<>(); + for (Feature feature : features) { + // blacklisting will be applied anyway, so no need to do it here + if (/*!feature.isBlacklisted() && */idOrPattern.matches(feature.getName(), feature.getVersion())) { + result.add(feature.getId()); + } + } + return result; + } + /** * Features matching the given feature selectors including dependent features - * + * * @param features feature selector name, name/version, name/version-range - * - * @return matching features + * + * @return matching features */ public Set<Feature> getMatching(List<String> features) { Set<Feature> selected = new HashSet<>(); for (String feature : features) { - addFeatures(feature, selected, true); + for (String featureId : getMatchingFeatures(new FeaturePattern(feature), allFeatures)) { + addFeatures(featureId, selected, true); + } } return selected; } - + private void addFeatures(String feature, Set<Feature> features, boolean mandatory) { Set<Feature> set = getMatching(feature); if (mandatory && set.isEmpty()) { -- To stop receiving notification emails like this one, please contact "[email protected]" <[email protected]>.
