[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 <gno...@gmail.com> Authored: Fri Apr 11 17:04:09 2014 +0200 Committer: Guillaume Nodet <gno...@gmail.com> 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 @@ </config> <feature>shell</feature> <feature>jaas</feature> - <bundle start="true" start-level="30">mvn:org.apache.mina/mina-core/${mina.version}</bundle> + <conditional> + <condition>req:osgi.ee;filter:="(&(osgi.ee=JavaSE)(!(version>=1.7)))"</condition> + <bundle start="true" start-level="30">mvn:org.apache.mina/mina-core/${mina.version}</bundle> + </conditional> <bundle start="true" start-level="30">mvn:org.apache.sshd/sshd-core/${sshd.version}</bundle> <bundle start="true" start-level="30">mvn:org.apache.karaf.shell/org.apache.karaf.shell.ssh/${project.version}</bundle> </feature> 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<? extends Dependency> getCondition(); + List<String> getCondition(); List<Dependency> 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<? extends Dependency> condition = cond.getCondition(); + List<String> condition = cond.getCondition(); List<BundleInfo> 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<? extends Dependency> 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<Resource, List<Wire>> resolve(List<Resource> systemBundles, - boolean resolveOptionalImports) throws ResolutionException { + public Map<Resource, List<Wire>> resolve(List<Resource> 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.<Resource>singleton(requirements), - this.optionals, + Collections.<Resource>emptySet(), new AggregateRepository(repos), - resolveOptionalImports); + false); + Map<Resource, List<Wire>> 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<Resource> resources = new HashSet<Resource>(); + resources.add(requirements); + for (Resource optional : optionals) { + try { + Set<Resource> newSet = new HashSet<Resource>(resources); + newSet.add(optional); + context = new ResolveContextImpl( + newSet, + Collections.<Resource>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<Dependency> condition; + protected List<String> condition; - public List<Dependency> getCondition() { + public List<String> getCondition() { if (condition == null) { - this.condition = new ArrayList<Dependency>(); + this.condition = new ArrayList<String>(); } 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<Dependency> 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<String, Resource> 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<Requirement> 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.<String>emptySet(), overrides, Collections.<String>emptySet()); - Map<Resource, List<Wire>> resolution = builder.resolve(systemBundles, true); + Map<Resource, List<Wire>> resolution = builder.resolve(systemBundles); Collection<Resource> allResources = resolution.keySet(); Map<String, StreamProvider> 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 @@ <condition>http</condition> <bundle>mvn:org.springframework/spring-web/2.5.6.SEC02</bundle> </conditional> + <conditional> + <condition>req:osgi.ee;filter:="(&(osgi.ee=JavaSE)(!(version>=1.7)))"</condition> + <bundle start="true" start-level="30">mvn:org.apache.mina/mina-core/${mina.version}</bundle> + </conditional> </feature> </features>