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()) {
