Repository: karaf
Updated Branches:
  refs/heads/master 539540cde -> 9167d3d04


[KARAF-3994] Only copy the selected feature version


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

Branch: refs/heads/master
Commit: 9167d3d0488a5973c718f3bb00582f6d22ebd638
Parents: 539540c
Author: Christian Schneider <[email protected]>
Authored: Wed Oct 14 15:23:31 2015 +0200
Committer: Christian Schneider <[email protected]>
Committed: Wed Oct 14 15:23:31 2015 +0200

----------------------------------------------------------------------
 .../apache/karaf/profile/assembly/Builder.java  | 154 +++++++++++--------
 1 file changed, 90 insertions(+), 64 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/karaf/blob/9167d3d0/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 d1407db..624820a 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
@@ -760,12 +760,7 @@ public class Builder {
         for (String dependency : bootEffective.getFeatures()) {
             Dependency dep = generatedDep.get(dependency);
             if (dep == null) {
-                dep = new Dependency();
-                String[] split = dependency.split("/");
-                dep.setName(split[0]);
-                if (split.length > 1) {
-                    dep.setVersion(split[1]);
-                }
+                dep = createDependency(dependency);
                 generated.getFeature().add(dep);
                 generatedDep.put(dep.getName(), dep);
             }
@@ -893,48 +888,12 @@ public class Builder {
             featuresProperties.save();
         }
         else {
-            StringBuilder boot = new StringBuilder();
-            for (Dependency dep : generatedDep.values()) {
-                if (dep.isPrerequisite()) {
-                    if (boot.length() == 0) {
-                        boot.append("(");
-                    } else {
-                        boot.append(",");
-                    }
-                    boot.append(dep.getName());
-                }
-            }
-            if (boot.length() > 0) {
-                boot.append(")");
-            }
-            // TODO: for dependencies, we'd need to resolve the features 
completely
-            for (Dependency dep : generatedDep.values()) {
-                if (!dep.isPrerequisite() && !dep.isDependency()) {
-                    if (boot.length() > 0) {
-                        boot.append(",");
-                    }
-                    boot.append(dep.getName());
-                    if (!Feature.DEFAULT_VERSION.equals(dep.getVersion())) {
-                        if (karafVersion == KarafVersion.v4x) {
-                            boot.append("/");
-                        } else {
-                            boot.append(";version=");
-                        }
-                        boot.append(dep.getVersion());
-                    }
-                }
-            }
-            StringBuilder repos = new StringBuilder();
-            for (String repo : new HashSet<>(rep.getRepository())) {
-                if (repos.length() > 0) {
-                    repos.append(",");
-                }
-                repos.append(repo);
-            }
+            String repos = getRepos(rep);
+            String boot = getBootFeatures(generatedDep);
 
             Properties featuresProperties = new 
Properties(featuresCfgFile.toFile());
-            featuresProperties.put(FEATURES_REPOSITORIES, repos.toString());
-            featuresProperties.put(FEATURES_BOOT, boot.toString());
+            featuresProperties.put(FEATURES_REPOSITORIES, repos);
+            featuresProperties.put(FEATURES_BOOT, boot);
             reformatClauses(featuresProperties, FEATURES_REPOSITORIES);
             reformatClauses(featuresProperties, FEATURES_BOOT);
             featuresProperties.save();
@@ -943,6 +902,63 @@ public class Builder {
         return allBootFeatures;
     }
 
+    private String getRepos(Features rep) {
+        StringBuilder repos = new StringBuilder();
+        for (String repo : new HashSet<>(rep.getRepository())) {
+            if (repos.length() > 0) {
+                repos.append(",");
+            }
+            repos.append(repo);
+        }
+        return repos.toString();
+    }
+
+    private String getBootFeatures(Map<String, Dependency> generatedDep) {
+        StringBuilder boot = new StringBuilder();
+        for (Dependency dep : generatedDep.values()) {
+            if (dep.isPrerequisite()) {
+                if (boot.length() == 0) {
+                    boot.append("(");
+                } else {
+                    boot.append(",");
+                }
+                boot.append(dep.getName());
+            }
+        }
+        if (boot.length() > 0) {
+            boot.append(")");
+        }
+        // TODO: for dependencies, we'd need to resolve the features completely
+        for (Dependency dep : generatedDep.values()) {
+            if (!dep.isPrerequisite() && !dep.isDependency()) {
+                if (boot.length() > 0) {
+                    boot.append(",");
+                }
+                boot.append(dep.getName());
+                if (!Feature.DEFAULT_VERSION.equals(dep.getVersion())) {
+                    if (karafVersion == KarafVersion.v4x) {
+                        boot.append("/");
+                    } else {
+                        boot.append(";version=");
+                    }
+                    boot.append(dep.getVersion());
+                }
+            }
+        }
+        return boot.toString();
+    }
+
+    private Dependency createDependency(String dependency) {
+        Dependency dep;
+        dep = new Dependency();
+        String[] split = dependency.split("/");
+        dep.setName(split[0]);
+        if (split.length > 1) {
+            dep.setVersion(split[1]);
+        }
+        return dep;
+    }
+
     private Profile startupStage(Profile startupProfile) throws Exception {
         //
         // Compute startup
@@ -1021,33 +1037,43 @@ public class Builder {
         }
     }
 
-    private void addFeatures(Set<Feature> startupFeatures, Set<Feature> 
features, String feature) {
+    private void addFeatures(Set<Feature> startupFeatures, Set<Feature> 
features, String featureSt) {
         int nbFound = 0;
+        Dependency featureRef = createDependency(featureSt);
         for (Feature f : features) {
-            String[] split = feature.split("/");
-            if (split.length == 2) {
-                if (f.getName().equals(split[0]) && 
f.getVersion().equals(split[1])) {
-                    for (Dependency dep : f.getFeature()) {
-                        addFeatures(startupFeatures, features, dep.getName());
-                    }
-                    startupFeatures.add(f);
-                    nbFound++;
-                }
-            } else {
-                if (feature.equals(f.getName())) {
-                    for (Dependency dep : f.getFeature()) {
-                        addFeatures(startupFeatures, features, dep.getName());
-                    }
-                    startupFeatures.add(f);
-                    nbFound++;
+            if (matches(f, featureRef)) {
+                for (Dependency dep : f.getFeature()) {
+                    addFeatures(startupFeatures, features, getFeatureSt(dep));
                 }
+                startupFeatures.add(f);
+                nbFound++;
             }
         }
         if (nbFound == 0) {
-            throw new IllegalStateException("Could not find matching feature 
for " + feature);
+            throw new IllegalStateException("Could not find matching feature 
for " + featureSt);
         }
     }
 
+    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) {
         List<String> staged = new ArrayList<>();
         for (String s : data.keySet()) {

Reply via email to