Return-Path: X-Original-To: apmail-karaf-commits-archive@minotaur.apache.org Delivered-To: apmail-karaf-commits-archive@minotaur.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id CA64D105FA for ; Fri, 11 Apr 2014 17:21:22 +0000 (UTC) Received: (qmail 54897 invoked by uid 500); 11 Apr 2014 17:20:58 -0000 Delivered-To: apmail-karaf-commits-archive@karaf.apache.org Received: (qmail 54353 invoked by uid 500); 11 Apr 2014 17:20:47 -0000 Mailing-List: contact commits-help@karaf.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@karaf.apache.org Delivered-To: mailing list commits@karaf.apache.org Received: (qmail 51155 invoked by uid 99); 11 Apr 2014 17:20:25 -0000 Received: from tyr.zones.apache.org (HELO tyr.zones.apache.org) (140.211.11.114) by apache.org (qpsmtpd/0.29) with ESMTP; Fri, 11 Apr 2014 17:20:25 +0000 Received: by tyr.zones.apache.org (Postfix, from userid 65534) id 00D4398AF25; Fri, 11 Apr 2014 17:20:23 +0000 (UTC) Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: gnodet@apache.org To: commits@karaf.apache.org Date: Fri, 11 Apr 2014 17:20:33 -0000 Message-Id: In-Reply-To: References: X-Mailer: ASF-Git Admin Mailer Subject: [11/33] git commit: [KARAF-2900] Allow generic requirements as condition to features [KARAF-2900] Allow generic requirements as condition to features Project: http://git-wip-us.apache.org/repos/asf/karaf/repo Commit: http://git-wip-us.apache.org/repos/asf/karaf/commit/f2669e1d Tree: http://git-wip-us.apache.org/repos/asf/karaf/tree/f2669e1d Diff: http://git-wip-us.apache.org/repos/asf/karaf/diff/f2669e1d Branch: refs/heads/master Commit: f2669e1d709da292b679307f523a771769129e8b Parents: fc37f55 Author: Guillaume Nodet Authored: Fri Apr 11 17:04:09 2014 +0200 Committer: Guillaume Nodet Committed: Fri Apr 11 19:20:03 2014 +0200 ---------------------------------------------------------------------- .../standard/src/main/feature/feature.xml | 5 +++- .../org/apache/karaf/features/Conditional.java | 2 +- .../features/command/InfoFeatureCommand.java | 10 +++---- .../internal/deployment/DeploymentBuilder.java | 30 ++++++++++++++++---- .../features/internal/model/Conditional.java | 14 ++++----- .../internal/resolver/FeatureResource.java | 16 +++++++++-- .../internal/service/FeaturesServiceImpl.java | 2 +- .../apache/karaf/features/ConditionalTest.java | 13 +++++++-- .../karaf/features/internal/service/f06.xml | 4 +++ 9 files changed, 69 insertions(+), 27 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/karaf/blob/f2669e1d/assemblies/features/standard/src/main/feature/feature.xml ---------------------------------------------------------------------- diff --git a/assemblies/features/standard/src/main/feature/feature.xml b/assemblies/features/standard/src/main/feature/feature.xml index 4d06455..86f8270 100644 --- a/assemblies/features/standard/src/main/feature/feature.xml +++ b/assemblies/features/standard/src/main/feature/feature.xml @@ -222,7 +222,10 @@ shell jaas - mvn:org.apache.mina/mina-core/${mina.version} + + req:osgi.ee;filter:="(&(osgi.ee=JavaSE)(!(version>=1.7)))" + mvn:org.apache.mina/mina-core/${mina.version} + mvn:org.apache.sshd/sshd-core/${sshd.version} mvn:org.apache.karaf.shell/org.apache.karaf.shell.ssh/${project.version} http://git-wip-us.apache.org/repos/asf/karaf/blob/f2669e1d/features/src/main/java/org/apache/karaf/features/Conditional.java ---------------------------------------------------------------------- diff --git a/features/src/main/java/org/apache/karaf/features/Conditional.java b/features/src/main/java/org/apache/karaf/features/Conditional.java index c0e4d59..fdc9261 100644 --- a/features/src/main/java/org/apache/karaf/features/Conditional.java +++ b/features/src/main/java/org/apache/karaf/features/Conditional.java @@ -21,7 +21,7 @@ import java.util.Map; public interface Conditional { - List getCondition(); + List getCondition(); List getDependencies(); http://git-wip-us.apache.org/repos/asf/karaf/blob/f2669e1d/features/src/main/java/org/apache/karaf/features/command/InfoFeatureCommand.java ---------------------------------------------------------------------- diff --git a/features/src/main/java/org/apache/karaf/features/command/InfoFeatureCommand.java b/features/src/main/java/org/apache/karaf/features/command/InfoFeatureCommand.java index 7084a6e..5ad855c 100644 --- a/features/src/main/java/org/apache/karaf/features/command/InfoFeatureCommand.java +++ b/features/src/main/java/org/apache/karaf/features/command/InfoFeatureCommand.java @@ -219,7 +219,7 @@ public class InfoFeatureCommand extends FeaturesCommandSupport { if (conditional) { for (Conditional cond : resolved.getConditional()) { - List condition = cond.getCondition(); + List condition = cond.getCondition(); List conditionalBundles = cond.getBundles(); for (BundleInfo bundleInfo : conditionalBundles) { bundleLocation.add(bundleInfo.getLocation() + "(condition:"+condition+")"); @@ -278,13 +278,11 @@ public class InfoFeatureCommand extends FeaturesCommandSupport { private String getConditionDescription(Conditional cond) { StringBuffer sb = new StringBuffer(); - Iterator di = cond.getCondition().iterator(); - while (di.hasNext()) { - Dependency dep = di.next(); - sb.append(dep.getName()).append("/").append(dep.getVersion()); - if (di.hasNext()) { + for (String dep : cond.getCondition()) { + if (sb.length() > 0) { sb.append(" "); } + sb.append(dep); } return sb.toString(); } http://git-wip-us.apache.org/repos/asf/karaf/blob/f2669e1d/features/src/main/java/org/apache/karaf/features/internal/deployment/DeploymentBuilder.java ---------------------------------------------------------------------- diff --git a/features/src/main/java/org/apache/karaf/features/internal/deployment/DeploymentBuilder.java b/features/src/main/java/org/apache/karaf/features/internal/deployment/DeploymentBuilder.java index 00a91c4..c3ac2b7 100644 --- a/features/src/main/java/org/apache/karaf/features/internal/deployment/DeploymentBuilder.java +++ b/features/src/main/java/org/apache/karaf/features/internal/deployment/DeploymentBuilder.java @@ -158,8 +158,7 @@ public class DeploymentBuilder { return resources; } - public Map> resolve(List systemBundles, - boolean resolveOptionalImports) throws ResolutionException { + public Map> resolve(List systemBundles) throws ResolutionException { // Resolve for (int i = 0; i < systemBundles.size(); i++) { resources.put("system-bundle-" + i, systemBundles.get(i)); @@ -172,11 +171,32 @@ public class DeploymentBuilder { ResolverImpl resolver = new ResolverImpl(new Slf4jResolverLog(LOGGER)); ResolveContext context = new ResolveContextImpl( Collections.singleton(requirements), - this.optionals, + Collections.emptySet(), new AggregateRepository(repos), - resolveOptionalImports); + false); + Map> best = resolver.resolve(context); - return resolver.resolve(context); + // TODO: we actually need to use multiple passes for conditionals + // TODO: but it may be optimized by passing the old wiring instead + // TODO: of computing everything again + Set resources = new HashSet(); + resources.add(requirements); + for (Resource optional : optionals) { + try { + Set newSet = new HashSet(resources); + newSet.add(optional); + context = new ResolveContextImpl( + newSet, + Collections.emptySet(), + new AggregateRepository(repos), + false); + best = resolver.resolve(context); + resources = newSet; + } catch (ResolutionException e) { + // Ignore this resource + } + } + return best; } public void requireFeature(String feature) throws IOException { http://git-wip-us.apache.org/repos/asf/karaf/blob/f2669e1d/features/src/main/java/org/apache/karaf/features/internal/model/Conditional.java ---------------------------------------------------------------------- diff --git a/features/src/main/java/org/apache/karaf/features/internal/model/Conditional.java b/features/src/main/java/org/apache/karaf/features/internal/model/Conditional.java index 5bc0b95..ed0e8ff 100644 --- a/features/src/main/java/org/apache/karaf/features/internal/model/Conditional.java +++ b/features/src/main/java/org/apache/karaf/features/internal/model/Conditional.java @@ -36,11 +36,11 @@ import org.apache.karaf.features.Feature; public class Conditional extends Content implements org.apache.karaf.features.Conditional { @XmlElement(name = "condition") - protected List condition; + protected List condition; - public List getCondition() { + public List getCondition() { if (condition == null) { - this.condition = new ArrayList(); + this.condition = new ArrayList(); } return condition; } @@ -58,13 +58,11 @@ public class Conditional extends Content implements org.apache.karaf.features.Co private String getConditionId() { StringBuffer sb = new StringBuffer(); - Iterator di = getCondition().iterator(); - while (di.hasNext()) { - Dependency dependency = di.next(); - sb.append(dependency.getName() + "_" + dependency.getVersion()); - if (di.hasNext()) { + for (String cond : getCondition()) { + if (sb.length() > 0) { sb.append("_"); } + sb.append(cond); } return sb.toString(); } http://git-wip-us.apache.org/repos/asf/karaf/blob/f2669e1d/features/src/main/java/org/apache/karaf/features/internal/resolver/FeatureResource.java ---------------------------------------------------------------------- diff --git a/features/src/main/java/org/apache/karaf/features/internal/resolver/FeatureResource.java b/features/src/main/java/org/apache/karaf/features/internal/resolver/FeatureResource.java index 88f08ae..e3b0101 100644 --- a/features/src/main/java/org/apache/karaf/features/internal/resolver/FeatureResource.java +++ b/features/src/main/java/org/apache/karaf/features/internal/resolver/FeatureResource.java @@ -44,8 +44,20 @@ public class FeatureResource extends ResourceImpl { public static Resource build(Feature feature, Conditional conditional, String featureRange, Map locToRes) throws BundleException { Feature fcond = conditional.asFeature(feature.getName(), feature.getVersion()); FeatureResource resource = (FeatureResource) build(fcond, featureRange, locToRes); - for (Dependency dep : conditional.getCondition()) { - addDependency(resource, dep, featureRange); + for (String cond : conditional.getCondition()) { + if (cond.startsWith("req:")) { + cond = cond.substring("req:".length()); + List reqs = ResourceBuilder.parseRequirement(resource, cond); + resource.addRequirements(reqs); + } else { + org.apache.karaf.features.internal.model.Dependency dep = new org.apache.karaf.features.internal.model.Dependency(); + String[] p = cond.split("/"); + dep.setName(p[0]); + if (p.length > 1) { + dep.setVersion(p[1]); + } + addDependency(resource, dep, featureRange); + } } org.apache.karaf.features.internal.model.Dependency dep = new org.apache.karaf.features.internal.model.Dependency(); dep.setName(feature.getName()); http://git-wip-us.apache.org/repos/asf/karaf/blob/f2669e1d/features/src/main/java/org/apache/karaf/features/internal/service/FeaturesServiceImpl.java ---------------------------------------------------------------------- diff --git a/features/src/main/java/org/apache/karaf/features/internal/service/FeaturesServiceImpl.java b/features/src/main/java/org/apache/karaf/features/internal/service/FeaturesServiceImpl.java index 7008ef6..0243dc0 100644 --- a/features/src/main/java/org/apache/karaf/features/internal/service/FeaturesServiceImpl.java +++ b/features/src/main/java/org/apache/karaf/features/internal/service/FeaturesServiceImpl.java @@ -790,7 +790,7 @@ public class FeaturesServiceImpl implements FeaturesService { Collections.emptySet(), overrides, Collections.emptySet()); - Map> resolution = builder.resolve(systemBundles, true); + Map> resolution = builder.resolve(systemBundles); Collection allResources = resolution.keySet(); Map providers = builder.getProviders(); http://git-wip-us.apache.org/repos/asf/karaf/blob/f2669e1d/features/src/test/java/org/apache/karaf/features/ConditionalTest.java ---------------------------------------------------------------------- diff --git a/features/src/test/java/org/apache/karaf/features/ConditionalTest.java b/features/src/test/java/org/apache/karaf/features/ConditionalTest.java index d5e7e46..b103683 100644 --- a/features/src/test/java/org/apache/karaf/features/ConditionalTest.java +++ b/features/src/test/java/org/apache/karaf/features/ConditionalTest.java @@ -31,17 +31,24 @@ public class ConditionalTest extends TestCase { Feature feature = features[0]; assertNotNull(feature.getConditional()); - assertEquals(1,feature.getConditional().size()); + assertEquals(2,feature.getConditional().size()); Conditional conditional = feature.getConditional().get(0); assertNotNull(conditional.getCondition()); assertEquals(1,conditional.getCondition().size()); - Dependency dependency = conditional.getCondition().get(0); + String dependency = conditional.getCondition().get(0); assertNotNull(dependency); - assertEquals(dependency.getName(),"http"); + assertEquals("http", dependency); assertNotNull(conditional.getBundles()); assertEquals(1, feature.getConditional().get(0).getBundles().size()); + conditional = feature.getConditional().get(1); + assertNotNull(conditional.getCondition()); + assertEquals(1,conditional.getCondition().size()); + dependency = conditional.getCondition().get(0); + assertNotNull(dependency); + assertEquals("req:osgi.ee;filter:=\"(&(osgi.ee=JavaSE)(!(version>=1.7)))\"", dependency); + String wrapperName = "my6/1.5.3-beta-3".replaceAll("[^A-Za-z0-9 ]", "_"); } } http://git-wip-us.apache.org/repos/asf/karaf/blob/f2669e1d/features/src/test/resources/org/apache/karaf/features/internal/service/f06.xml ---------------------------------------------------------------------- diff --git a/features/src/test/resources/org/apache/karaf/features/internal/service/f06.xml b/features/src/test/resources/org/apache/karaf/features/internal/service/f06.xml index 496cbdb..51e78f1 100644 --- a/features/src/test/resources/org/apache/karaf/features/internal/service/f06.xml +++ b/features/src/test/resources/org/apache/karaf/features/internal/service/f06.xml @@ -27,6 +27,10 @@ http mvn:org.springframework/spring-web/2.5.6.SEC02 + + req:osgi.ee;filter:="(&(osgi.ee=JavaSE)(!(version>=1.7)))" + mvn:org.apache.mina/mina-core/${mina.version} +