diff --git a/tycho-api/src/main/java/org/eclipse/tycho/TargetEnvironment.java b/tycho-api/src/main/java/org/eclipse/tycho/TargetEnvironment.java index d5e2a81384..8c03b971a3 100644 --- a/tycho-api/src/main/java/org/eclipse/tycho/TargetEnvironment.java +++ b/tycho-api/src/main/java/org/eclipse/tycho/TargetEnvironment.java @@ -21,6 +21,7 @@ import org.eclipse.equinox.internal.p2.metadata.InstallableUnit; import org.eclipse.equinox.p2.metadata.IInstallableUnit; import org.eclipse.equinox.p2.metadata.expression.IMatchExpression; +import org.osgi.framework.Filter; public final class TargetEnvironment { private static final Properties EMPTY_PROPERTIES = new Properties(); @@ -70,6 +71,13 @@ public boolean match(String os, String ws, String arch) { (arch == null || arch.equals(this.arch)); } + public boolean match(Filter filter) { + if (filter != null) { + return filter.matches(toFilterProperties()); + } + return true; + } + /** * Returns the target environment as string of the form ws.os.arch. This format is * used by the p2 publishers and in that context called "configuration" or "config spec". diff --git a/tycho-apitools-plugin/src/main/java/org/eclipse/tycho/apitools/ApiAnalysisMojo.java b/tycho-apitools-plugin/src/main/java/org/eclipse/tycho/apitools/ApiAnalysisMojo.java index bf67f52071..f6f711ba68 100644 --- a/tycho-apitools-plugin/src/main/java/org/eclipse/tycho/apitools/ApiAnalysisMojo.java +++ b/tycho-apitools-plugin/src/main/java/org/eclipse/tycho/apitools/ApiAnalysisMojo.java @@ -45,6 +45,7 @@ import org.eclipse.tycho.DependencyResolutionException; import org.eclipse.tycho.IllegalArtifactReferenceException; import org.eclipse.tycho.MavenRepositoryLocation; +import org.eclipse.tycho.TargetEnvironment; import org.eclipse.tycho.TychoConstants; import org.eclipse.tycho.core.TychoProjectManager; import org.eclipse.tycho.core.osgitools.DefaultReactorProject; @@ -134,9 +135,6 @@ public class ApiAnalysisMojo extends AbstractMojo { @Component private TychoProjectManager projectManager; - @Component - private ApiApplicationResolver resolver; - @Component private ApiApplicationResolver applicationResolver; @@ -145,8 +143,8 @@ public void execute() throws MojoExecutionException, MojoFailureException { if (skip) { return; } - Optional eclipseProject = projectManager.getEclipseProject(project); - if (eclipseProject.isEmpty() || !eclipseProject.get().hasNature(ApiPlugin.NATURE_ID)) { + Optional eclipseProjectValue = projectManager.getEclipseProject(project); + if (eclipseProjectValue.isEmpty() || !eclipseProjectValue.get().hasNature(ApiPlugin.NATURE_ID)) { return; } @@ -293,12 +291,14 @@ private Collection getBaselineBundles() throws MojoFailureException { long start = System.currentTimeMillis(); Collection baselineBundles; try { + Collection targetEnvironments = projectManager.getTargetEnvironments(project); Optional artifactKey = projectManager.getArtifactKey(project); - getLog().info("Resolve API baseline for " + project.getId()); - baselineBundles = resolver.getApiBaselineBundles( + getLog().info("Resolve API baseline for " + project.getId() + " with " + + targetEnvironments.stream().map(String::valueOf).collect(Collectors.joining(", "))); + baselineBundles = applicationResolver.getApiBaselineBundles( baselines.stream().filter(repo -> repo.getUrl() != null) .map(repo -> new MavenRepositoryLocation(repo.getId(), URI.create(repo.getUrl()))).toList(), - artifactKey.get()); + artifactKey.get(), targetEnvironments); getLog().debug("API baseline contains " + baselineBundles.size() + " bundles (resolve takes " + time(start) + ")."); } catch (IllegalArtifactReferenceException e) { diff --git a/tycho-apitools-plugin/src/main/java/org/eclipse/tycho/apitools/ApiApplicationResolver.java b/tycho-apitools-plugin/src/main/java/org/eclipse/tycho/apitools/ApiApplicationResolver.java index 57cf919f2b..b0034964db 100644 --- a/tycho-apitools-plugin/src/main/java/org/eclipse/tycho/apitools/ApiApplicationResolver.java +++ b/tycho-apitools-plugin/src/main/java/org/eclipse/tycho/apitools/ApiApplicationResolver.java @@ -28,6 +28,7 @@ import org.eclipse.tycho.ArtifactType; import org.eclipse.tycho.IllegalArtifactReferenceException; import org.eclipse.tycho.MavenRepositoryLocation; +import org.eclipse.tycho.TargetEnvironment; import org.eclipse.tycho.TargetPlatform; import org.eclipse.tycho.core.resolver.P2ResolutionResult; import org.eclipse.tycho.core.resolver.P2ResolutionResult.Entry; @@ -59,8 +60,9 @@ public class ApiApplicationResolver { private EclipseApplicationManager applicationManager; public Collection getApiBaselineBundles(Collection baselineRepoLocations, - ArtifactKey artifactKey) throws IllegalArtifactReferenceException { - P2Resolver resolver = applicationFactory.createResolver(); + ArtifactKey artifactKey, Collection environment) + throws IllegalArtifactReferenceException { + P2Resolver resolver = applicationFactory.createResolver(environment); resolver.addDependency(ArtifactType.TYPE_INSTALLABLE_UNIT, artifactKey.getId(), "0.0.0"); List resolvedBundles = new ArrayList<>(); TargetPlatform targetPlatform = applicationFactory.createTargetPlatform(baselineRepoLocations); diff --git a/tycho-core/src/main/java/org/eclipse/tycho/core/TychoProjectManager.java b/tycho-core/src/main/java/org/eclipse/tycho/core/TychoProjectManager.java index 5abc26e29e..3b63b88442 100644 --- a/tycho-core/src/main/java/org/eclipse/tycho/core/TychoProjectManager.java +++ b/tycho-core/src/main/java/org/eclipse/tycho/core/TychoProjectManager.java @@ -62,6 +62,7 @@ import org.eclipse.tycho.helper.PluginRealmHelper; import org.eclipse.tycho.model.project.EclipseProject; import org.eclipse.tycho.targetplatform.TargetDefinition; +import org.osgi.framework.Filter; import aQute.bnd.osgi.Processor; @@ -176,6 +177,16 @@ public TargetPlatformConfiguration getTargetPlatformConfiguration(ReactorProject return getTargetPlatformConfiguration(project.adapt(MavenProject.class)); } + public Collection getTargetEnvironments(MavenProject project) { + TychoProject tychoProject = projectTypes.get(project.getPackaging()); + if (tychoProject != null) { + Filter environmentFilter = tychoProject.getTargetEnvironmentFilter(project); + return getTargetPlatformConfiguration(project).getEnvironments().stream() + .filter(te -> te.match(environmentFilter)).toList(); + } + return List.of(TargetEnvironment.getRunningEnvironment()); + } + public Optional getTychoProject(MavenProject project) { if (project == null) { return Optional.empty(); diff --git a/tycho-core/src/main/java/org/eclipse/tycho/core/resolver/DefaultTargetPlatformConfigurationReader.java b/tycho-core/src/main/java/org/eclipse/tycho/core/resolver/DefaultTargetPlatformConfigurationReader.java index c9cd9d6863..cdfff6cb0b 100644 --- a/tycho-core/src/main/java/org/eclipse/tycho/core/resolver/DefaultTargetPlatformConfigurationReader.java +++ b/tycho-core/src/main/java/org/eclipse/tycho/core/resolver/DefaultTargetPlatformConfigurationReader.java @@ -375,10 +375,10 @@ private void addTargetEnvironments(TargetPlatformConfiguration result, MavenProj List skipped = new ArrayList<>(); for (Xpp3Dom environmentDom : environmentsDom.getChildren("environment")) { TargetEnvironment environment = newTargetEnvironment(environmentDom); - if (!matchFilter(environment, filter)) { - skipped.add(environment); - } else { + if (environment.match(filter)) { result.addEnvironment(environment); + } else { + skipped.add(environment); } } if (!skipped.isEmpty()) { @@ -394,13 +394,6 @@ private void addTargetEnvironments(TargetPlatformConfiguration result, MavenProj } } - private static boolean matchFilter(TargetEnvironment environment, Filter filter) { - if (filter != null) { - return filter.matches(environment.toFilterProperties()); - } - return true; - } - private static Filter getTargetEnvironmentFilter(TychoProject tychoProject, MavenProject project) { if (tychoProject != null) { return tychoProject.getTargetEnvironmentFilter(project); diff --git a/tycho-core/src/main/java/org/eclipse/tycho/osgi/framework/EclipseApplicationFactory.java b/tycho-core/src/main/java/org/eclipse/tycho/osgi/framework/EclipseApplicationFactory.java index 1cc18105ed..f0d893eb14 100644 --- a/tycho-core/src/main/java/org/eclipse/tycho/osgi/framework/EclipseApplicationFactory.java +++ b/tycho-core/src/main/java/org/eclipse/tycho/osgi/framework/EclipseApplicationFactory.java @@ -13,7 +13,6 @@ package org.eclipse.tycho.osgi.framework; import java.util.Collection; -import java.util.Collections; import java.util.List; import java.util.function.Function; import java.util.stream.Collectors; @@ -97,8 +96,11 @@ public TargetPlatform createTargetPlatform(Collection l } public P2Resolver createResolver() { - P2Resolver resolver = resolverFactory - .createResolver(Collections.singletonList(TargetEnvironment.getRunningEnvironment())); + return createResolver(List.of(TargetEnvironment.getRunningEnvironment())); + } + + public P2Resolver createResolver(Collection environments) { + P2Resolver resolver = resolverFactory.createResolver(environments); return resolver; }