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/09/14 11:48:53 UTC
karaf git commit: [KARAF-4712] Karaf assembly builder does not handle
versions correctly
Repository: karaf
Updated Branches:
refs/heads/master a7d876274 -> 6a012b053
[KARAF-4712] Karaf assembly builder does not handle versions correctly
Project: http://git-wip-us.apache.org/repos/asf/karaf/repo
Commit: http://git-wip-us.apache.org/repos/asf/karaf/commit/6a012b05
Tree: http://git-wip-us.apache.org/repos/asf/karaf/tree/6a012b05
Diff: http://git-wip-us.apache.org/repos/asf/karaf/diff/6a012b05
Branch: refs/heads/master
Commit: 6a012b05352e8f630c9bf5d2457583a17e080243
Parents: a7d8762
Author: Guillaume Nodet <gn...@apache.org>
Authored: Wed Sep 14 13:48:42 2016 +0200
Committer: Guillaume Nodet <gn...@apache.org>
Committed: Wed Sep 14 13:48:42 2016 +0200
----------------------------------------------------------------------
.../apache/karaf/profile/assembly/Builder.java | 66 ++++++++++----------
1 file changed, 32 insertions(+), 34 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/karaf/blob/6a012b05/profile/src/main/java/org/apache/karaf/profile/assembly/Builder.java
----------------------------------------------------------------------
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 5efe378..033714b 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
@@ -45,6 +45,7 @@ import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.jar.Attributes;
import java.util.jar.Manifest;
+import java.util.stream.Collectors;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
@@ -52,6 +53,8 @@ import org.apache.felix.resolver.ResolverImpl;
import org.apache.felix.utils.manifest.Clause;
import org.apache.felix.utils.properties.InterpolationHelper;
import org.apache.felix.utils.properties.Properties;
+import org.apache.felix.utils.version.VersionRange;
+import org.apache.felix.utils.version.VersionTable;
import org.apache.karaf.features.FeaturesService;
import org.apache.karaf.features.Library;
import org.apache.karaf.features.internal.download.DownloadCallback;
@@ -83,6 +86,7 @@ import org.apache.karaf.util.maven.Parser;
import org.ops4j.pax.url.mvn.MavenResolver;
import org.ops4j.pax.url.mvn.MavenResolvers;
import org.osgi.framework.Constants;
+import org.osgi.framework.Version;
import org.osgi.framework.wiring.BundleRevision;
import org.osgi.resource.Resource;
import org.osgi.service.resolver.Resolver;
@@ -754,7 +758,7 @@ public class Builder {
// Add boot features for search
allInstalledFeatures.addAll(allBootFeatures);
for (String feature : installedEffective.getFeatures()) {
- addFeatures(installedFeatures, allInstalledFeatures, feature);
+ addFeatures(allInstalledFeatures, feature, installedFeatures, true);
}
for (Feature feature : installedFeatures) {
for (Bundle bundle : feature.getBundle()) {
@@ -820,7 +824,7 @@ public class Builder {
// Compute startup feature dependencies
Set<Feature> bootFeatures = new HashSet<>();
- addFeatures(bootFeatures, allBootFeatures, generated.getName());
+ addFeatures(allBootFeatures, generated.getName(), bootFeatures, true);
for (Feature feature : bootFeatures) {
// the feature is a startup feature, updating startup.properties file
LOGGER.info("Feature " + feature.getName() + " is defined as a boot feature");
@@ -1074,41 +1078,35 @@ public class Builder {
}
}
- private void addFeatures(Set<Feature> startupFeatures, Set<Feature> features, String featureSt) {
- int nbFound = 0;
- Dependency featureRef = createDependency(featureSt);
- for (Feature f : features) {
- if (matches(f, featureRef)) {
- for (Dependency dep : f.getFeature()) {
- addFeatures(startupFeatures, features, getFeatureSt(dep));
- }
- startupFeatures.add(f);
- nbFound++;
+ private void addFeatures(Set<Feature> allFeatures, String feature, Set<Feature> features, boolean mandatory) {
+ String name;
+ VersionRange range;
+ int idx = feature.indexOf('/');
+ if (idx > 0) {
+ name = feature.substring(0, idx);
+ String version = feature.substring(idx + 1);
+ version = version.trim();
+ if (version.equals(org.apache.karaf.features.internal.model.Feature.DEFAULT_VERSION)) {
+ range = new VersionRange(Version.emptyVersion);
+ } else {
+ range = new VersionRange(version, true, true);
}
+ } else {
+ name = feature;
+ range = new VersionRange(Version.emptyVersion);
}
- if (nbFound == 0) {
- throw new IllegalStateException("Could not find matching feature for " + featureSt);
+ Set<Feature> set = allFeatures.stream()
+ .filter(f -> f.getName().equals(name) && range.contains(VersionTable.getVersion(f.getVersion())))
+ .collect(Collectors.toSet());
+ if (mandatory && set.isEmpty()) {
+ throw new IllegalStateException("Could not find matching feature for " + feature);
+ }
+ for (Feature f : set) {
+ features.add(f);
+ for (Dependency dep : f.getFeature()) {
+ addFeatures(allFeatures, dep.toString(), features, !dep.isDependency() && !dep.isPrerequisite());
+ }
}
- }
-
- private String getFeatureSt(Dependency dep) {
- String version = dep.getVersion() == null || "0.0.0".equals(dep.getVersion()) ? "" : "/" + dep.getVersion();
- return dep.getName() + version;
- }
-
- /**
- * Checks if a given feature f matches the featureRef.
- * TODO Need to also check for version ranges. Currently ranges are ignored and all features matching the name
- * are copied in that case.
- *
- * @param f
- * @param featureRef
- * @return
- */
- private boolean matches(Feature f, Dependency featureRef) {
- String version = featureRef.getVersion();
- return f.getName().equals(featureRef.getName())
- && (version == null || version.equals("0.0.0")|| version.startsWith("[") || f.getVersion().equals(version));
}
private List<String> getStaged(Stage stage, Map<String, Stage> data) {