From db33ae0dcc0aef0912978ad8a65ddb0b2ac44979 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christoph=20L=C3=A4ubrich?= Date: Fri, 31 Dec 2021 20:52:09 +0100 Subject: [PATCH] #462 - Delay Pom considered items to the final Target Platform calculation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Christoph Läubrich --- .../tycho/target/TargetPlatformMojo.java | 21 ++++- .../manager/ReactorRepositoryManagerTest.java | 6 +- .../tycho/p2/resolver/P2ResolverTest.java | 6 +- .../p2/target/PomDependencyCollectorTest.java | 4 +- .../p2/target/TargetPlatformFactoryTest.java | 58 +++++------- .../ee/CustomEEResolutionHandlerTest.java | 4 +- .../resolution/DependencyCollectorTest.java | 4 +- .../manager/ReactorRepositoryManagerImpl.java | 18 ++-- .../p2/resolver/InstallableUnitResolver.java | 10 +- .../tycho/p2/resolver/P2ResolverImpl.java | 10 +- .../p2/target/PomDependencyCollectorImpl.java | 26 +++++- .../target/PreliminaryTargetPlatformImpl.java | 12 +-- .../p2/target/TargetPlatformFactoryImpl.java | 92 ++++++++++--------- .../AbstractResolutionStrategy.java | 16 ++-- .../AbstractSlicerResolutionStrategy.java | 39 +++++++- .../util/resolution/DependencyCollector.java | 5 +- .../ProjectorResolutionStrategy.java | 61 +++++++++--- .../resolution/SlicerResolutionStrategy.java | 16 ++-- .../target/facade/PomDependencyCollector.java | 8 ++ .../target/facade/TargetPlatformFactory.java | 9 +- .../ReactorRepositoryManagerFacade.java | 8 +- .../tycho/core/DependencyResolver.java | 6 +- .../LocalDependencyResolver.java | 8 +- .../extras/eclipserun/EclipseRunMojo.java | 2 +- .../p2/extras/CompareWithBaselineMojo.java | 2 +- .../p2/resolver/P2DependencyResolver.java | 53 ++++++++--- 26 files changed, 328 insertions(+), 176 deletions(-) diff --git a/target-platform-configuration/src/main/java/org/eclipse/tycho/target/TargetPlatformMojo.java b/target-platform-configuration/src/main/java/org/eclipse/tycho/target/TargetPlatformMojo.java index 34fac3b860..9f5a41e46c 100644 --- a/target-platform-configuration/src/main/java/org/eclipse/tycho/target/TargetPlatformMojo.java +++ b/target-platform-configuration/src/main/java/org/eclipse/tycho/target/TargetPlatformMojo.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2013 SAP AG and others. + * Copyright (c) 2013, 2021 SAP AG and others. * This program and the accompanying materials * are made available under the terms of the Eclipse Public License 2.0 * which accompanies this distribution, and is available at @@ -9,6 +9,7 @@ * * Contributors: * SAP AG - initial API and implementation + * Christoph Läubrich - Issue #462 - Delay Pom considered items to the final Target Platform calculation *******************************************************************************/ package org.eclipse.tycho.target; @@ -19,7 +20,9 @@ import java.util.List; import org.apache.maven.artifact.Artifact; +import org.apache.maven.execution.MavenSession; import org.apache.maven.plugin.AbstractMojo; +import org.apache.maven.plugin.LegacySupport; import org.apache.maven.plugin.MojoExecutionException; import org.apache.maven.plugin.MojoFailureException; import org.apache.maven.plugins.annotations.Component; @@ -30,9 +33,12 @@ import org.eclipse.sisu.equinox.EquinoxServiceFactory; import org.eclipse.tycho.ReactorProject; import org.eclipse.tycho.ReactorProjectIdentities; +import org.eclipse.tycho.core.DependencyResolver; import org.eclipse.tycho.core.osgitools.DefaultReactorProject; +import org.eclipse.tycho.core.resolver.DefaultDependencyResolverFactory; import org.eclipse.tycho.p2.repository.GAV; import org.eclipse.tycho.p2.repository.RepositoryLayoutHelper; +import org.eclipse.tycho.p2.target.facade.PomDependencyCollector; import org.eclipse.tycho.repository.registry.facade.ReactorRepositoryManagerFacade; @Mojo(name = "target-platform", threadSafe = true) @@ -49,13 +55,24 @@ public class TargetPlatformMojo extends AbstractMojo { @Component private Logger logger; + @Component + private LegacySupport legacySupport; + + @Component + private DefaultDependencyResolverFactory dependencyResolverLocator; + @Override public void execute() throws MojoExecutionException, MojoFailureException { synchronized (LOCK) { ReactorRepositoryManagerFacade repositoryManager = osgiServices .getService(ReactorRepositoryManagerFacade.class); List upstreamProjects = getReferencedTychoProjects(); - repositoryManager.computeFinalTargetPlatform(DefaultReactorProject.adapt(project), upstreamProjects); + ReactorProject reactorProject = DefaultReactorProject.adapt(project); + MavenSession session = legacySupport.getSession(); + DependencyResolver dependencyResolver = dependencyResolverLocator.lookupDependencyResolver(project); + PomDependencyCollector pomDependenciesCollector = dependencyResolver.resolvePomDependencies(session, + project); + repositoryManager.computeFinalTargetPlatform(reactorProject, upstreamProjects, pomDependenciesCollector); } } diff --git a/tycho-bundles/org.eclipse.tycho.p2.resolver.impl.test/src/test/java/org/eclipse/tycho/p2/manager/ReactorRepositoryManagerTest.java b/tycho-bundles/org.eclipse.tycho.p2.resolver.impl.test/src/test/java/org/eclipse/tycho/p2/manager/ReactorRepositoryManagerTest.java index 53709fa479..1a583a6ed9 100644 --- a/tycho-bundles/org.eclipse.tycho.p2.resolver.impl.test/src/test/java/org/eclipse/tycho/p2/manager/ReactorRepositoryManagerTest.java +++ b/tycho-bundles/org.eclipse.tycho.p2.resolver.impl.test/src/test/java/org/eclipse/tycho/p2/manager/ReactorRepositoryManagerTest.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2013, 2020 SAP SE and others. + * Copyright (c) 2013, 2021 SAP SE and others. * This program and the accompanying materials * are made available under the terms of the Eclipse Public License 2.0 * which accompanies this distribution, and is available at @@ -84,12 +84,12 @@ public void testTargetPlatformComputationInIntegration() throws Exception { tpConfig.addP2Repository( new MavenRepositoryLocation(null, ResourceUtil.resourceFile("repositories/launchers").toURI())); subject.computePreliminaryTargetPlatform(currentProject, tpConfig, - new ExecutionEnvironmentConfigurationStub("JavaSE-1.7"), null, pomDependencyCollector); + new ExecutionEnvironmentConfigurationStub("JavaSE-1.7"), null); ReactorProjectIdentities upstreamProject = new ReactorProjectIdentitiesStub( ResourceUtil.resourceFile("projectresult")); - subject.computeFinalTargetPlatform(currentProject, Arrays.asList(upstreamProject)); + subject.computeFinalTargetPlatform(currentProject, Arrays.asList(upstreamProject), pomDependencyCollector); P2TargetPlatform finalTP = (P2TargetPlatform) currentProject .getContextValue("org.eclipse.tycho.core.TychoConstants/targetPlatform"); diff --git a/tycho-bundles/org.eclipse.tycho.p2.resolver.impl.test/src/test/java/org/eclipse/tycho/p2/resolver/P2ResolverTest.java b/tycho-bundles/org.eclipse.tycho.p2.resolver.impl.test/src/test/java/org/eclipse/tycho/p2/resolver/P2ResolverTest.java index 12b29e7e05..d16045499e 100644 --- a/tycho-bundles/org.eclipse.tycho.p2.resolver.impl.test/src/test/java/org/eclipse/tycho/p2/resolver/P2ResolverTest.java +++ b/tycho-bundles/org.eclipse.tycho.p2.resolver.impl.test/src/test/java/org/eclipse/tycho/p2/resolver/P2ResolverTest.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2008, 2020 Sonatype Inc. and others. + * Copyright (c) 2008, 2021 Sonatype Inc. and others. * This program and the accompanying materials * are made available under the terms of the Eclipse Public License 2.0 * which accompanies this distribution, and is available at @@ -506,11 +506,11 @@ public void testResolveWithoutProject() throws Exception { } private P2TargetPlatform getTargetPlatform() { - return tpFactory.createTargetPlatform(tpConfig, NOOP_EE_RESOLUTION_HANDLER, reactorProjects, pomDependencies); + return tpFactory.createTargetPlatform(tpConfig, NOOP_EE_RESOLUTION_HANDLER, reactorProjects); } private P2TargetPlatform getTargetPlatform(ExecutionEnvironmentResolutionHandler eeResolutionHandler) { - return tpFactory.createTargetPlatform(tpConfig, eeResolutionHandler, reactorProjects, pomDependencies); + return tpFactory.createTargetPlatform(tpConfig, eeResolutionHandler, reactorProjects); } private static P2ResolutionResult singleEnv(Map map) { diff --git a/tycho-bundles/org.eclipse.tycho.p2.resolver.impl.test/src/test/java/org/eclipse/tycho/p2/target/PomDependencyCollectorTest.java b/tycho-bundles/org.eclipse.tycho.p2.resolver.impl.test/src/test/java/org/eclipse/tycho/p2/target/PomDependencyCollectorTest.java index 83e932da49..aee78cbca1 100644 --- a/tycho-bundles/org.eclipse.tycho.p2.resolver.impl.test/src/test/java/org/eclipse/tycho/p2/target/PomDependencyCollectorTest.java +++ b/tycho-bundles/org.eclipse.tycho.p2.resolver.impl.test/src/test/java/org/eclipse/tycho/p2/target/PomDependencyCollectorTest.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2011, 2020 Sonatype Inc. and others. + * Copyright (c) 2011, 2021 Sonatype Inc. and others. * This program and the accompanying materials * are made available under the terms of the Eclipse Public License 2.0 * which accompanies this distribution, and is available at @@ -103,7 +103,7 @@ static ArtifactMock existingMetadata() { private Collection getTargetPlatformUnits() { TestResolverFactory resolverFactory = new TestResolverFactory(logVerifier.getLogger()); P2TargetPlatform platform = resolverFactory.getTargetPlatformFactoryImpl() - .createTargetPlatform(new TargetPlatformConfigurationStub(), NOOP_EE_RESOLUTION_HANDLER, null, subject); + .createTargetPlatform(new TargetPlatformConfigurationStub(), NOOP_EE_RESOLUTION_HANDLER, null); return platform.getInstallableUnits(); } } diff --git a/tycho-bundles/org.eclipse.tycho.p2.resolver.impl.test/src/test/java/org/eclipse/tycho/p2/target/TargetPlatformFactoryTest.java b/tycho-bundles/org.eclipse.tycho.p2.resolver.impl.test/src/test/java/org/eclipse/tycho/p2/target/TargetPlatformFactoryTest.java index c614f3051e..14d1c90309 100644 --- a/tycho-bundles/org.eclipse.tycho.p2.resolver.impl.test/src/test/java/org/eclipse/tycho/p2/target/TargetPlatformFactoryTest.java +++ b/tycho-bundles/org.eclipse.tycho.p2.resolver.impl.test/src/test/java/org/eclipse/tycho/p2/target/TargetPlatformFactoryTest.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2008, 2020 SAP SE and others. + * Copyright (c) 2008, 2021 SAP SE and others. * This program and the accompanying materials * are made available under the terms of the Eclipse Public License 2.0 * which accompanies this distribution, and is available at @@ -98,11 +98,11 @@ public void setUpSubjectAndContext() throws Exception { public void testFinalTargetPlatformNotContainsPreliminaryReactorIU() throws Exception { List preliminaryReactor = Arrays.asList(createReactorProject("artifactId", "reactor.id", null)); P2TargetPlatform preliminaryTP = subject.createTargetPlatform(tpConfig, NOOP_EE_RESOLUTION_HANDLER, - preliminaryReactor, pomDependencyCollector); + preliminaryReactor); // final TP without any reactor content P2TargetPlatform finalTP = subject.createTargetPlatformWithUpdatedReactorUnits(preliminaryTP, null, - REACTOR_ARTIFACTS); + REACTOR_ARTIFACTS, pomDependencyCollector); assertThat(finalTP.getInstallableUnits(), not(hasItem(unitWithId("reactor.id")))); } @@ -110,11 +110,10 @@ public void testFinalTargetPlatformNotContainsPreliminaryReactorIU() throws Exce @Test public void testFinalTargetPlatformContainsExternalRepoIU() throws Exception { tpConfig.addP2Repository(ResourceUtil.resourceFile("repositories/launchers").toURI()); - P2TargetPlatform preliminaryTP = subject.createTargetPlatform(tpConfig, NOOP_EE_RESOLUTION_HANDLER, null, - pomDependencyCollector); + P2TargetPlatform preliminaryTP = subject.createTargetPlatform(tpConfig, NOOP_EE_RESOLUTION_HANDLER, null); P2TargetPlatform finalTP = subject.createTargetPlatformWithUpdatedReactorUnits(preliminaryTP, null, - REACTOR_ARTIFACTS); + REACTOR_ARTIFACTS, pomDependencyCollector); assertThat(finalTP.getInstallableUnits(), hasItem(unitWithId("org.eclipse.equinox.launcher"))); } @@ -122,11 +121,10 @@ public void testFinalTargetPlatformContainsExternalRepoIU() throws Exception { @Test public void testFinalTargetPlatformContainsTargetFileIU() { tpConfig.addTargetDefinition(targetDefinition(TestRepositories.V1_AND_V2, MAIN_BUNDLE)); - P2TargetPlatform preliminaryTP = subject.createTargetPlatform(tpConfig, NOOP_EE_RESOLUTION_HANDLER, null, - pomDependencyCollector); + P2TargetPlatform preliminaryTP = subject.createTargetPlatform(tpConfig, NOOP_EE_RESOLUTION_HANDLER, null); P2TargetPlatform finalTP = subject.createTargetPlatformWithUpdatedReactorUnits(preliminaryTP, null, - REACTOR_ARTIFACTS); + REACTOR_ARTIFACTS, pomDependencyCollector); assertThat(finalTP.getInstallableUnits(), hasItem(unit(MAIN_BUNDLE.getId(), MAIN_BUNDLE.getVersion().toString()))); @@ -136,11 +134,10 @@ public void testFinalTargetPlatformContainsTargetFileIU() { public void testFinalTargetPlatformContainsPomDependencyIU() throws Exception { pomDependencyCollector.addArtifactWithExistingMetadata(PomDependencyCollectorTest.artifactWithClassifier(null), PomDependencyCollectorTest.existingMetadata()); - P2TargetPlatform preliminaryTP = subject.createTargetPlatform(tpConfig, NOOP_EE_RESOLUTION_HANDLER, null, - pomDependencyCollector); + P2TargetPlatform preliminaryTP = subject.createTargetPlatform(tpConfig, NOOP_EE_RESOLUTION_HANDLER, null); P2TargetPlatform finalTP = subject.createTargetPlatformWithUpdatedReactorUnits(preliminaryTP, null, - REACTOR_ARTIFACTS); + REACTOR_ARTIFACTS, pomDependencyCollector); assertThat(finalTP.getInstallableUnits(), hasItem(unitWithId("test.unit"))); } @@ -148,24 +145,22 @@ public void testFinalTargetPlatformContainsPomDependencyIU() throws Exception { @Test public void testFinalTargetPlatformContainsExecutionEnvironmentIU() throws Exception { P2TargetPlatform preliminaryTP = subject.createTargetPlatform(tpConfig, ExecutionEnvironmentTestUtils - .standardEEResolutionHintProvider(new ExecutionEnvironmentStub("J2SE-1.4")), null, - pomDependencyCollector); + .standardEEResolutionHintProvider(new ExecutionEnvironmentStub("J2SE-1.4")), null); P2TargetPlatform finalTP = subject.createTargetPlatformWithUpdatedReactorUnits(preliminaryTP, null, - REACTOR_ARTIFACTS); + REACTOR_ARTIFACTS, pomDependencyCollector); assertThat(finalTP.getInstallableUnits(), hasItem(unit("a.jre.j2se", "1.4.0"))); } @Test public void testFinalTargetPlatformContainsFinalReactorIU() throws Exception { - P2TargetPlatform preliminaryTP = subject.createTargetPlatform(tpConfig, NOOP_EE_RESOLUTION_HANDLER, null, - pomDependencyCollector); + P2TargetPlatform preliminaryTP = subject.createTargetPlatform(tpConfig, NOOP_EE_RESOLUTION_HANDLER, null); Map finalUnits = Collections .singletonMap(InstallableUnitUtil.createIU("bundle", "1.2.0"), DUMMY_PROJECT); P2TargetPlatform finalTP = subject.createTargetPlatformWithUpdatedReactorUnits(preliminaryTP, finalUnits, - REACTOR_ARTIFACTS); + REACTOR_ARTIFACTS, pomDependencyCollector); assertThat(finalTP.getInstallableUnits(), hasItem(unit("bundle", "1.2.0"))); } @@ -180,7 +175,7 @@ public void testConfiguredFiltersOnReactorIUsInPreliminaryTP() throws Exception ReactorProject reactorProject = createReactorProject("artifactId", "test.feature.feature.group", "iu.p2.inf"); P2TargetPlatform preliminaryTP = subject.createTargetPlatform(tpConfig, NOOP_EE_RESOLUTION_HANDLER, - Collections.singletonList(reactorProject), pomDependencyCollector); + Collections.singletonList(reactorProject)); assertThat(preliminaryTP.getInstallableUnits(), hasItem(unitWithId("test.feature.feature.group"))); assertThat(preliminaryTP.getInstallableUnits(), not(hasItem(unitWithId("iu.p2.inf")))); @@ -191,14 +186,13 @@ public void testConfiguredFiltersOnReactorIUsInFinalTP() throws Exception { TargetPlatformFilter filter = TargetPlatformFilter.removeAllFilter( CapabilityPattern.patternWithoutVersion(CapabilityType.P2_INSTALLABLE_UNIT, "iu.p2.inf")); tpConfig.addFilters(Arrays.asList(filter)); - P2TargetPlatform preliminaryTP = subject.createTargetPlatform(tpConfig, NOOP_EE_RESOLUTION_HANDLER, null, - pomDependencyCollector); + P2TargetPlatform preliminaryTP = subject.createTargetPlatform(tpConfig, NOOP_EE_RESOLUTION_HANDLER, null); Map finalUnits = new HashMap<>(); finalUnits.put(InstallableUnitUtil.createIU("test.feature.feature.group"), DUMMY_PROJECT); finalUnits.put(InstallableUnitUtil.createIU("iu.p2.inf"), DUMMY_PROJECT); P2TargetPlatform finalTP = subject.createTargetPlatformWithUpdatedReactorUnits(preliminaryTP, finalUnits, - REACTOR_ARTIFACTS); + REACTOR_ARTIFACTS, pomDependencyCollector); assertThat(finalTP.getInstallableUnits(), hasItem(unitWithId("test.feature.feature.group"))); assertThat(finalTP.getInstallableUnits(), not(hasItem(unitWithId("iu.p2.inf")))); @@ -213,12 +207,11 @@ public void testConfiguredFiltersOnPomDependencies() throws Exception { CapabilityPattern.patternWithoutVersion(CapabilityType.P2_INSTALLABLE_UNIT, "test.unit")); tpConfig.addFilters(Arrays.asList(filter)); - P2TargetPlatform preliminaryTP = subject.createTargetPlatform(tpConfig, NOOP_EE_RESOLUTION_HANDLER, null, - pomDependencyCollector); + P2TargetPlatform preliminaryTP = subject.createTargetPlatform(tpConfig, NOOP_EE_RESOLUTION_HANDLER, null); assertThat(preliminaryTP.getInstallableUnits(), not(hasItem(unitWithId("test.unit")))); P2TargetPlatform finalTP = subject.createTargetPlatformWithUpdatedReactorUnits(preliminaryTP, null, - REACTOR_ARTIFACTS); + REACTOR_ARTIFACTS, pomDependencyCollector); assertThat(finalTP.getInstallableUnits(), not(hasItem(unitWithId("test.unit")))); } @@ -230,7 +223,7 @@ public void testOtherVersionsOfReactorIUsAreFilteredFromExternalContent() throws // reactor artifact produces a unit with same ID ReactorProject reactorProject = createReactorProject("artifactId", "trt.bundle/1.5.5.qualifier", null); P2TargetPlatform preliminaryTP = subject.createTargetPlatform(tpConfig, NOOP_EE_RESOLUTION_HANDLER, - Collections.singletonList(reactorProject), pomDependencyCollector); + Collections.singletonList(reactorProject)); assertThat(preliminaryTP.getInstallableUnits(), hasItem(unit("trt.bundle", "1.5.5.qualifier"))); assertThat(preliminaryTP.getInstallableUnits(), not(hasItem(unit("trt.bundle", "1.0.0.201108051343")))); @@ -238,7 +231,7 @@ public void testOtherVersionsOfReactorIUsAreFilteredFromExternalContent() throws Map finalUnits = Collections.singletonMap( InstallableUnitUtil.createIU("trt.bundle", "1.5.5.20140216"), reactorProject.getIdentities()); P2TargetPlatform finalTP = subject.createTargetPlatformWithUpdatedReactorUnits(preliminaryTP, finalUnits, - REACTOR_ARTIFACTS); + REACTOR_ARTIFACTS, pomDependencyCollector); assertThat(finalTP.getInstallableUnits(), hasItem(unit("trt.bundle", "1.5.5.20140216"))); assertThat(finalTP.getInstallableUnits(), not(hasItem(unit("trt.bundle", "1.0.0.201108051343")))); @@ -253,12 +246,10 @@ public void testIncludeLocalMavenRepo() throws Exception { new GAV("test", "foo", "1.0.0")); subject = factory.getTargetPlatformFactoryImpl(); Collection iusIncludingLocalRepo = subject - .createTargetPlatform(tpConfig, NOOP_EE_RESOLUTION_HANDLER, null, pomDependencyCollector) - .getInstallableUnits(); + .createTargetPlatform(tpConfig, NOOP_EE_RESOLUTION_HANDLER, null).getInstallableUnits(); tpConfig.setForceIgnoreLocalArtifacts(true); Collection iusWithoutLocalRepo = subject - .createTargetPlatform(tpConfig, NOOP_EE_RESOLUTION_HANDLER, null, pomDependencyCollector) - .getInstallableUnits(); + .createTargetPlatform(tpConfig, NOOP_EE_RESOLUTION_HANDLER, null).getInstallableUnits(); Set retainedIUs = new HashSet<>(iusIncludingLocalRepo); retainedIUs.removeAll(iusWithoutLocalRepo); assertEquals(1, retainedIUs.size()); @@ -269,8 +260,7 @@ public void testIncludeLocalMavenRepo() throws Exception { public void testMultipleIndependentlyResolvedTargetFiles() throws Exception { tpConfig.addTargetDefinition(plannerTargetDefinition(TestRepositories.V1, REFERENCED_BUNDLE_V1)); tpConfig.addTargetDefinition(plannerTargetDefinition(TestRepositories.V2, REFERENCED_BUNDLE_V2)); - P2TargetPlatform tp = subject.createTargetPlatform(tpConfig, NOOP_EE_RESOLUTION_HANDLER, null, - pomDependencyCollector); + P2TargetPlatform tp = subject.createTargetPlatform(tpConfig, NOOP_EE_RESOLUTION_HANDLER, null); // platforms must have been resolved in two planner calls because otherwise the singleton bundles would have collided assertThat(tp.getInstallableUnits(), hasItem(unitWithIdAndVersion(REFERENCED_BUNDLE_V1))); @@ -282,7 +272,7 @@ public void testDuplicateReactorUnits() throws Exception { List reactorProjects = new ArrayList<>(); reactorProjects.add(createReactorProject("project1", "unit.a", "unit.b")); reactorProjects.add(createReactorProject("project2", "unit.b", null)); - subject.createTargetPlatform(tpConfig, NOOP_EE_RESOLUTION_HANDLER, reactorProjects, pomDependencyCollector); + subject.createTargetPlatform(tpConfig, NOOP_EE_RESOLUTION_HANDLER, reactorProjects); } private static TargetDefinition plannerTargetDefinition(TestRepositories repository, IVersionedId unit) { diff --git a/tycho-bundles/org.eclipse.tycho.p2.resolver.impl.test/src/test/java/org/eclipse/tycho/p2/target/ee/CustomEEResolutionHandlerTest.java b/tycho-bundles/org.eclipse.tycho.p2.resolver.impl.test/src/test/java/org/eclipse/tycho/p2/target/ee/CustomEEResolutionHandlerTest.java index 225a26fba6..784cee5a27 100644 --- a/tycho-bundles/org.eclipse.tycho.p2.resolver.impl.test/src/test/java/org/eclipse/tycho/p2/target/ee/CustomEEResolutionHandlerTest.java +++ b/tycho-bundles/org.eclipse.tycho.p2.resolver.impl.test/src/test/java/org/eclipse/tycho/p2/target/ee/CustomEEResolutionHandlerTest.java @@ -76,7 +76,7 @@ public void testReadFullSpecificationFromTargetPlatform() throws Exception { * (which is wrapped around the eeConfigurationCapture argument by the called method) * correctly reads the custom profile specification from the target platform. */ - tpFactory.createTargetPlatform(tpConfig, eeConfigurationCapture, null, pomDependencyCollector); + tpFactory.createTargetPlatform(tpConfig, eeConfigurationCapture, null); List result = eeConfigurationCapture.capturedSystemCapabilities; @@ -95,7 +95,7 @@ public void testMissingSpecificationInTargetPlatform() throws Exception { "MissingProfile-1.2.3"); Exception e = assertThrows(Exception.class, - () -> tpFactory.createTargetPlatform(tpConfig, eeConfigurationCapture, null, pomDependencyCollector)); + () -> tpFactory.createTargetPlatform(tpConfig, eeConfigurationCapture, null)); assertTrue(e.getMessage().contains( "Could not find specification for custom execution environment profile 'MissingProfile-1.2.3'")); } diff --git a/tycho-bundles/org.eclipse.tycho.p2.resolver.impl.test/src/test/java/org/eclipse/tycho/p2/util/resolution/DependencyCollectorTest.java b/tycho-bundles/org.eclipse.tycho.p2.resolver.impl.test/src/test/java/org/eclipse/tycho/p2/util/resolution/DependencyCollectorTest.java index 60f8ff8309..82124cd276 100644 --- a/tycho-bundles/org.eclipse.tycho.p2.resolver.impl.test/src/test/java/org/eclipse/tycho/p2/util/resolution/DependencyCollectorTest.java +++ b/tycho-bundles/org.eclipse.tycho.p2.resolver.impl.test/src/test/java/org/eclipse/tycho/p2/util/resolution/DependencyCollectorTest.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2008, 2012 Sonatype Inc. and others. + * Copyright (c) 2008, 2021 Sonatype Inc. and others. * This program and the accompanying materials * are made available under the terms of the Eclipse Public License 2.0 * which accompanies this distribution, and is available at @@ -62,7 +62,7 @@ public void missingDependencies() { DependencyCollector dc = new DependencyCollector(logVerifier.getLogger()); dc.setData(data); try { - dc.resolve(Collections. emptyMap(), new NullProgressMonitor()); + dc.resolve(Collections. emptyMap(), false, new NullProgressMonitor()); Assert.fail(); } catch (RuntimeException e) { Throwable cause = e.getCause(); diff --git a/tycho-bundles/org.eclipse.tycho.p2.resolver.impl/src/main/java/org/eclipse/tycho/p2/manager/ReactorRepositoryManagerImpl.java b/tycho-bundles/org.eclipse.tycho.p2.resolver.impl/src/main/java/org/eclipse/tycho/p2/manager/ReactorRepositoryManagerImpl.java index 407b5d3f8d..e9cd9893bc 100644 --- a/tycho-bundles/org.eclipse.tycho.p2.resolver.impl/src/main/java/org/eclipse/tycho/p2/manager/ReactorRepositoryManagerImpl.java +++ b/tycho-bundles/org.eclipse.tycho.p2.resolver.impl/src/main/java/org/eclipse/tycho/p2/manager/ReactorRepositoryManagerImpl.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2012, 2015 SAP SE and others. + * Copyright (c) 2012, 2021 SAP SE and others. * This program and the accompanying materials * are made available under the terms of the Eclipse Public License 2.0 * which accompanies this distribution, and is available at @@ -9,6 +9,7 @@ * * Contributors: * SAP SE - initial API and implementation + * Christoph Läubrich - Adjust to new API *******************************************************************************/ package org.eclipse.tycho.p2.manager; @@ -26,9 +27,7 @@ import org.eclipse.tycho.artifacts.TargetPlatform; import org.eclipse.tycho.core.ee.shared.ExecutionEnvironmentConfiguration; import org.eclipse.tycho.p2.resolver.facade.P2ResolverFactory; -import org.eclipse.tycho.p2.target.P2TargetPlatform; import org.eclipse.tycho.p2.target.PreliminaryTargetPlatformImpl; -import org.eclipse.tycho.p2.target.TargetPlatformFactoryImpl; import org.eclipse.tycho.p2.target.facade.PomDependencyCollector; import org.eclipse.tycho.p2.target.facade.TargetPlatformConfigurationStub; import org.eclipse.tycho.p2.target.facade.TargetPlatformFactory; @@ -81,26 +80,25 @@ public PublishingRepository getPublishingRepository(ReactorProjectIdentities pro @Override public TargetPlatform computePreliminaryTargetPlatform(ReactorProject project, TargetPlatformConfigurationStub tpConfiguration, ExecutionEnvironmentConfiguration eeConfiguration, - List reactorProjects, PomDependencyCollector pomDependencies) { + List reactorProjects) { + // // at this point, there is only incomplete ("dependency-only") metadata for the reactor projects - TargetPlatform result = tpFactory.createTargetPlatform(tpConfiguration, eeConfiguration, reactorProjects, - pomDependencies); + TargetPlatform result = tpFactory.createTargetPlatform(tpConfiguration, eeConfiguration, reactorProjects); project.setContextValue(PRELIMINARY_TARGET_PLATFORM_KEY, result); return result; } @Override public void computeFinalTargetPlatform(ReactorProject project, - List upstreamProjects) { + List upstreamProjects, PomDependencyCollector pomDependencyCollector) { PreliminaryTargetPlatformImpl preliminaryTargetPlatform = getRegisteredPreliminaryTargetPlatform(project); if (preliminaryTargetPlatform == null) { // project doesn't seem to use resolver=p2 return; } - List upstreamProjectResults = getBuildResults(upstreamProjects); - P2TargetPlatform result = ((TargetPlatformFactoryImpl) tpFactory) - .createTargetPlatformWithUpdatedReactorContent(preliminaryTargetPlatform, upstreamProjectResults); + TargetPlatform result = tpFactory.createTargetPlatformWithUpdatedReactorContent(preliminaryTargetPlatform, + upstreamProjectResults, pomDependencyCollector); project.setContextValue(FINAL_TARGET_PLATFORM_KEY, result); } diff --git a/tycho-bundles/org.eclipse.tycho.p2.resolver.impl/src/main/java/org/eclipse/tycho/p2/resolver/InstallableUnitResolver.java b/tycho-bundles/org.eclipse.tycho.p2.resolver.impl/src/main/java/org/eclipse/tycho/p2/resolver/InstallableUnitResolver.java index 02ddd24c1a..13827961ff 100644 --- a/tycho-bundles/org.eclipse.tycho.p2.resolver.impl/src/main/java/org/eclipse/tycho/p2/resolver/InstallableUnitResolver.java +++ b/tycho-bundles/org.eclipse.tycho.p2.resolver.impl/src/main/java/org/eclipse/tycho/p2/resolver/InstallableUnitResolver.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2011, 2020 SAP SE and others. + * Copyright (c) 2011, 2021 SAP SE and others. * This program and the accompanying materials * are made available under the terms of the Eclipse Public License 2.0 * which accompanies this distribution, and is available at @@ -141,8 +141,8 @@ public IQueryResult resolve(IQueryable allUn ResolutionDataImpl data = new ResolutionDataImpl(executionEnvironment); data.setRootIUs(allRoots); data.setAvailableIUsAndFilter(allUnits); - Collection resolve = getPlannerResolutionStrategy(data) - .multiPlatformResolve(environments, new DuplicateFilteringLoggingProgressMonitor(logger)); + Collection resolve = getPlannerResolutionStrategy(data).multiPlatformResolve( + environments, false, new DuplicateFilteringLoggingProgressMonitor(logger)); if (!resolve.isEmpty()) { collector.addAll(resolve); if (includeSource) { @@ -157,7 +157,7 @@ public IQueryResult resolve(IQueryable allUn data.setRootIUs(root.rootIUs); data.setAvailableIUsAndFilter(root.localUnits); SlicerResolutionStrategy strategy = getSlicerResolutionStrategy(data); - Collection resolve = strategy.multiPlatformResolve(environments, + Collection resolve = strategy.multiPlatformResolve(environments, false, new DuplicateFilteringLoggingProgressMonitor(logger)); if (!resolve.isEmpty()) { collector.addAll(resolve); @@ -251,7 +251,7 @@ private static Collection addSourceBundleUnits(ResolutionDataI data.setRootIUs(Collections.singleton(sourceIU)); final TargetEnvironment nonFilteringEnvironment = new TargetEnvironment(); Collection sourceUnits = strategySupplier.apply(data).resolve(nonFilteringEnvironment, - progressMonitor); + false, progressMonitor); sourceUnits.remove(sourceIU); // nobody wants to see our artificial IU return sourceUnits; // TODO: remove duplicates? } finally { diff --git a/tycho-bundles/org.eclipse.tycho.p2.resolver.impl/src/main/java/org/eclipse/tycho/p2/resolver/P2ResolverImpl.java b/tycho-bundles/org.eclipse.tycho.p2.resolver.impl/src/main/java/org/eclipse/tycho/p2/resolver/P2ResolverImpl.java index 0657a6d5ba..c3c72ac61d 100644 --- a/tycho-bundles/org.eclipse.tycho.p2.resolver.impl/src/main/java/org/eclipse/tycho/p2/resolver/P2ResolverImpl.java +++ b/tycho-bundles/org.eclipse.tycho.p2.resolver.impl/src/main/java/org/eclipse/tycho/p2/resolver/P2ResolverImpl.java @@ -167,8 +167,7 @@ public P2ResolutionResult collectProjectDependencies(TargetPlatform context, Rea @Override public P2ResolutionResult resolveMetadata(TargetPlatformConfigurationStub tpConfiguration, ExecutionEnvironmentConfiguration eeConfig) { - P2TargetPlatform contextImpl = targetPlatformFactory.createTargetPlatform(tpConfiguration, eeConfig, null, - null); + P2TargetPlatform contextImpl = targetPlatformFactory.createTargetPlatform(tpConfiguration, eeConfig, null); ResolutionDataImpl data = new ResolutionDataImpl(contextImpl.getEEResolutionHints()); data.setAvailableIUs(contextImpl.getInstallableUnits()); @@ -180,7 +179,7 @@ public P2ResolutionResult resolveMetadata(TargetPlatformConfigurationStub tpConf MetadataOnlyP2ResolutionResult result = new MetadataOnlyP2ResolutionResult(); try { - for (IInstallableUnit iu : strategy.multiPlatformResolve(environments, monitor)) { + for (IInstallableUnit iu : strategy.multiPlatformResolve(environments, false, monitor)) { result.addArtifact(ArtifactType.TYPE_INSTALLABLE_UNIT, iu.getId(), iu.getVersion().toString(), iu); } } catch (ResolverException e) { @@ -196,7 +195,7 @@ public P2ResolutionResult resolveMetadata(TargetPlatformConfigurationStub tpConf public P2ResolutionResult getTargetPlatformAsResolutionResult(TargetPlatformConfigurationStub tpConfiguration, String eeName) { P2TargetPlatform targetPlatform = targetPlatformFactory.createTargetPlatform(tpConfiguration, - new ExecutionEnvironmentConfigurationStub(eeName), null, null); + new ExecutionEnvironmentConfigurationStub(eeName), null); MetadataOnlyP2ResolutionResult result = new MetadataOnlyP2ResolutionResult(); for (IInstallableUnit iu : targetPlatform.getInstallableUnits()) { @@ -229,7 +228,8 @@ protected P2ResolutionResult resolveDependencies(Collection ro strategy.setData(data); Collection newState; try { - newState = strategy.resolve(environment, monitor); + //FIXME must be determined according to the pomDependecies=considered! + newState = strategy.resolve(environment, true, monitor); } catch (ResolverException e) { logger.info(e.getSelectionContext()); logger.error("Cannot resolve project dependencies:"); diff --git a/tycho-bundles/org.eclipse.tycho.p2.resolver.impl/src/main/java/org/eclipse/tycho/p2/target/PomDependencyCollectorImpl.java b/tycho-bundles/org.eclipse.tycho.p2.resolver.impl/src/main/java/org/eclipse/tycho/p2/target/PomDependencyCollectorImpl.java index 589418e1e7..144550b7ab 100644 --- a/tycho-bundles/org.eclipse.tycho.p2.resolver.impl/src/main/java/org/eclipse/tycho/p2/target/PomDependencyCollectorImpl.java +++ b/tycho-bundles/org.eclipse.tycho.p2.resolver.impl/src/main/java/org/eclipse/tycho/p2/target/PomDependencyCollectorImpl.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2011, 2020 SAP SE and others. + * Copyright (c) 2011, 2021 SAP SE and others. * This program and the accompanying materials * are made available under the terms of the Eclipse Public License 2.0 * which accompanies this distribution, and is available at @@ -10,6 +10,7 @@ * Contributors: * SAP SE - initial API and implementation * Christoph Läubrich - Bug 567098 - pomDependencies=consider should wrap non-osgi jars + * - Issue #462 - Delay Pom considered items to the final Target Platform calculation *******************************************************************************/ package org.eclipse.tycho.p2.target; @@ -23,8 +24,13 @@ import java.util.Objects; import java.util.Set; +import org.eclipse.equinox.p2.metadata.IArtifactKey; import org.eclipse.equinox.p2.metadata.IInstallableUnit; import org.eclipse.equinox.p2.metadata.VersionedId; +import org.eclipse.equinox.p2.repository.artifact.IArtifactDescriptor; +import org.eclipse.tycho.ArtifactKey; +import org.eclipse.tycho.ArtifactType; +import org.eclipse.tycho.DefaultArtifactKey; import org.eclipse.tycho.ReactorProject; import org.eclipse.tycho.core.shared.MavenContext; import org.eclipse.tycho.core.shared.MavenLogger; @@ -41,6 +47,8 @@ public class PomDependencyCollectorImpl implements PomDependencyCollector { private final MavenLogger logger; private Map mavenInstallableUnits = new HashMap<>(); + + private Map descriptorMap = new HashMap<>(); private ReactorProject project; public PomDependencyCollectorImpl(MavenContext mavenContext, ReactorProject project) { @@ -64,6 +72,7 @@ public void addMavenArtifact(IArtifactFacade artifact, boolean allowGenerateOSGi MavenBundleInfo bundleIU = bundlesPublisher.attemptToPublishBundle(artifact, allowGenerateOSGiBundle); if (bundleIU != null) { addMavenArtifact(bundleIU.getArtifact(), Collections.singleton(bundleIU.getUnit())); + descriptorMap.put(bundleIU.getArtifact(), bundleIU.getDescriptor()); } } @@ -110,7 +119,8 @@ LinkedHashSet gatherMavenInstallableUnits() { return new LinkedHashSet<>(getMavenInstallableUnits().keySet()); } - Map getMavenInstallableUnits() { + @Override + public Map getMavenInstallableUnits() { return mavenInstallableUnits; } @@ -118,4 +128,16 @@ IRawArtifactFileProvider getArtifactRepoOfPublishedBundles() { return bundlesPublisher.getArtifactRepoOfPublishedBundles(); } + @Override + public ArtifactKey getArtifactKey(IArtifactFacade facade) { + IArtifactDescriptor artifactDescriptor = descriptorMap.get(facade); + if (artifactDescriptor == null) { + return new DefaultArtifactKey(ArtifactType.TYPE_ECLIPSE_PLUGIN, facade.getArtifactId(), + facade.getVersion()); + } + IArtifactKey artifactKey = artifactDescriptor.getArtifactKey(); + return new DefaultArtifactKey(ArtifactType.TYPE_ECLIPSE_PLUGIN, artifactKey.getId(), + artifactKey.getVersion().toString()); + } + } diff --git a/tycho-bundles/org.eclipse.tycho.p2.resolver.impl/src/main/java/org/eclipse/tycho/p2/target/PreliminaryTargetPlatformImpl.java b/tycho-bundles/org.eclipse.tycho.p2.resolver.impl/src/main/java/org/eclipse/tycho/p2/target/PreliminaryTargetPlatformImpl.java index 926459293a..d07bfc16d6 100644 --- a/tycho-bundles/org.eclipse.tycho.p2.resolver.impl/src/main/java/org/eclipse/tycho/p2/target/PreliminaryTargetPlatformImpl.java +++ b/tycho-bundles/org.eclipse.tycho.p2.resolver.impl/src/main/java/org/eclipse/tycho/p2/target/PreliminaryTargetPlatformImpl.java @@ -15,6 +15,7 @@ package org.eclipse.tycho.p2.target; import java.util.Collection; +import java.util.HashMap; import java.util.Iterator; import java.util.LinkedHashSet; import java.util.Map; @@ -25,7 +26,6 @@ import org.eclipse.equinox.p2.repository.metadata.IMetadataRepository; import org.eclipse.tycho.ReactorProjectIdentities; import org.eclipse.tycho.core.shared.MavenLogger; -import org.eclipse.tycho.p2.metadata.IArtifactFacade; import org.eclipse.tycho.p2.target.filters.TargetPlatformFilterEvaluator; import org.eclipse.tycho.p2.util.resolution.ExecutionEnvironmentResolutionHints; import org.eclipse.tycho.repository.local.LocalArtifactRepository; @@ -53,12 +53,12 @@ public class PreliminaryTargetPlatformImpl extends TargetPlatformBaseImpl { private final boolean includeLocalRepo; public PreliminaryTargetPlatformImpl(Map reactorProjectIUs, - Collection externalIUs, Map mavenArtifactIUs, - ExecutionEnvironmentResolutionHints executionEnvironment, TargetPlatformFilterEvaluator filter, - LocalMetadataRepository localMetadataRepository, IRawArtifactFileProvider externalArtifacts, - LocalArtifactRepository localArtifactRepository, boolean includeLocalRepo, MavenLogger logger) { + Collection externalIUs, ExecutionEnvironmentResolutionHints executionEnvironment, + TargetPlatformFilterEvaluator filter, LocalMetadataRepository localMetadataRepository, + IRawArtifactFileProvider externalArtifacts, LocalArtifactRepository localArtifactRepository, + boolean includeLocalRepo, MavenLogger logger) { super(collectAllInstallableUnits(reactorProjectIUs, externalIUs, executionEnvironment), executionEnvironment, - externalArtifacts, localArtifactRepository, reactorProjectIUs, mavenArtifactIUs); + externalArtifacts, localArtifactRepository, reactorProjectIUs, new HashMap<>()); this.externalIUs = externalIUs; this.filter = filter; this.localMetadataRepository = localMetadataRepository; diff --git a/tycho-bundles/org.eclipse.tycho.p2.resolver.impl/src/main/java/org/eclipse/tycho/p2/target/TargetPlatformFactoryImpl.java b/tycho-bundles/org.eclipse.tycho.p2.resolver.impl/src/main/java/org/eclipse/tycho/p2/target/TargetPlatformFactoryImpl.java index e5216d092d..978c5bbe2a 100644 --- a/tycho-bundles/org.eclipse.tycho.p2.resolver.impl/src/main/java/org/eclipse/tycho/p2/target/TargetPlatformFactoryImpl.java +++ b/tycho-bundles/org.eclipse.tycho.p2.resolver.impl/src/main/java/org/eclipse/tycho/p2/target/TargetPlatformFactoryImpl.java @@ -14,11 +14,13 @@ * Christoph Läubrich - [Bug 538144] Support other target locations (Directory, Features, Installations) * - [Bug 533747] Target file is read and parsed over and over again * - [Bug 567098] pomDependencies=consider should wrap non-osgi jars + * - [Issue #462] Delay Pom considered items to the final Target Platform calculation *******************************************************************************/ package org.eclipse.tycho.p2.target; import java.io.File; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.HashMap; @@ -122,10 +124,25 @@ public TargetPlatformFactoryImpl(MavenContext mavenContext, IProvisioningAgent r @Override public P2TargetPlatform createTargetPlatform(TargetPlatformConfigurationStub tpConfiguration, - ExecutionEnvironmentConfiguration eeConfiguration, List reactorProjects, - PomDependencyCollector pomDependencies) { + ExecutionEnvironmentConfiguration eeConfiguration, List reactorProjects) { return createTargetPlatform(tpConfiguration, ExecutionEnvironmentResolutionHandler.adapt(eeConfiguration), - reactorProjects, pomDependencies); + reactorProjects); + } + + @SuppressWarnings("unchecked") + @Override + public P2TargetPlatform createTargetPlatformWithUpdatedReactorContent(TargetPlatform baseTargetPlatform, + List results, PomDependencyCollector pomDependencies) { + PomDependencyCollectorImpl pomDependenciesContent; + if (pomDependencies instanceof PomDependencyCollectorImpl) { + pomDependenciesContent = (PomDependencyCollectorImpl) pomDependencies; + } else { + logger.debug("Using empty PomDependencyCollector instead of given = " + pomDependencies); + pomDependenciesContent = new PomDependencyCollectorImpl(mavenContext, null); + } + return createTargetPlatformWithUpdatedReactorUnits(baseTargetPlatform, + extractProjectResultIUs((List) results), + getProjectArtifactProviders((List) results), pomDependenciesContent); } /** @@ -149,31 +166,17 @@ public P2TargetPlatform createTargetPlatform(TargetPlatformConfigurationStub tpC * ExecutionEnvironmentConfiguration, List, PomDependencyCollector) */ public P2TargetPlatform createTargetPlatform(TargetPlatformConfigurationStub tpConfiguration, - ExecutionEnvironmentResolutionHandler eeResolutionHandler, List reactorProjects, - PomDependencyCollector pomDependencies) { - if (pomDependencies == null) { - pomDependencies = new PomDependencyCollectorImpl(mavenContext, null); - } + ExecutionEnvironmentResolutionHandler eeResolutionHandler, List reactorProjects) { + List targetFileContent = resolveTargetDefinitions(tpConfiguration, eeResolutionHandler.getResolutionHints()); - - PomDependencyCollectorImpl pomDependenciesContent = (PomDependencyCollectorImpl) pomDependencies; - - // TODO 372780 get rid of this special handling of pomDependency artifacts: there should be one p2 artifact repo view on the target platform - IRawArtifactFileProvider pomDependencyArtifactRepo = pomDependenciesContent.getArtifactRepoOfPublishedBundles(); - RepositoryBlackboardKey blackboardKey = RepositoryBlackboardKey - .forResolutionContextArtifacts(pomDependenciesContent.getProjectLocation()); - ArtifactRepositoryBlackboard.putRepository(blackboardKey, new ProviderOnlyArtifactRepository( - pomDependencyArtifactRepo, Activator.getProvisioningAgent(), blackboardKey.toURI())); - logger.debug("Registered artifact repository " + blackboardKey); - Set completeRepositories = tpConfiguration.getP2Repositories(); registerRepositoryIDs(completeRepositories); // collect & process metadata boolean includeLocalMavenRepo = shouldIncludeLocallyInstalledUnits(tpConfiguration); LinkedHashSet externalUIs = gatherExternalInstallableUnits(completeRepositories, - targetFileContent, pomDependenciesContent, includeLocalMavenRepo); + targetFileContent, includeLocalMavenRepo); Map reactorProjectUIs = getPreliminaryReactorProjectUIs( reactorProjects); @@ -188,11 +191,10 @@ public P2TargetPlatform createTargetPlatform(TargetPlatformConfigurationStub tpC PreliminaryTargetPlatformImpl targetPlatform = new PreliminaryTargetPlatformImpl(reactorProjectUIs, // externalUIs, // - pomDependenciesContent.getMavenInstallableUnits(), // eeResolutionHandler.getResolutionHints(), // filter, // localMetadataRepository, // - createExternalArtifactProvider(completeRepositories, targetFileContent, pomDependencyArtifactRepo, + createExternalArtifactProvider(completeRepositories, targetFileContent, tpConfiguration.getIncludePackedArtifacts()), // localArtifactRepository, // includeLocalMavenRepo, // @@ -260,7 +262,7 @@ private boolean shouldIncludeLocallyInstalledUnits(TargetPlatformConfigurationSt */ private LinkedHashSet gatherExternalInstallableUnits( Set completeRepositories, List targetDefinitionsContent, - PomDependencyCollectorImpl pomDependenciesContent, boolean includeLocalMavenRepo) { + boolean includeLocalMavenRepo) { LinkedHashSet result = new LinkedHashSet<>(); for (TargetDefinitionContent targetDefinitionContent : targetDefinitionsContent) { @@ -281,8 +283,6 @@ private LinkedHashSet gatherExternalInstallableUnits( result.addAll(matches.toUnmodifiableSet()); } - result.addAll(pomDependenciesContent.gatherMavenInstallableUnits()); - if (includeLocalMavenRepo && logger.isDebugEnabled()) { IQueryResult locallyInstalledIUs = localMetadataRepository.query(QueryUtil.ALL_UNITS, null); @@ -311,16 +311,14 @@ private IMetadataRepository loadMetadataRepository(MavenRepositoryLocation locat * Provider for all target platform artifacts from outside the reactor. */ private IRawArtifactFileProvider createExternalArtifactProvider(Set completeRepositories, - List targetDefinitionsContent, - IRawArtifactFileProvider pomDependencyArtifactRepository, boolean includePackedArtifacts) { + List targetDefinitionsContent, boolean includePackedArtifacts) { RepositoryArtifactProvider remoteArtifactProvider = createRemoteArtifactProvider(completeRepositories, targetDefinitionsContent); MirroringArtifactProvider remoteArtifactCache = MirroringArtifactProvider .createInstance(localArtifactRepository, remoteArtifactProvider, includePackedArtifacts, logger); - IRawArtifactFileProvider jointArtifactsProvider = new CompositeArtifactProvider(pomDependencyArtifactRepository, - remoteArtifactCache); + IRawArtifactFileProvider jointArtifactsProvider = new CompositeArtifactProvider(remoteArtifactCache); return jointArtifactsProvider; } @@ -426,27 +424,26 @@ static int countElements(Iterator iterator) { return result; } - public P2TargetPlatform createTargetPlatformWithUpdatedReactorContent(TargetPlatform baseTargetPlatform, - List upstreamProjectResults) { - return createTargetPlatformWithUpdatedReactorUnits(baseTargetPlatform, - extractProjectResultIUs(upstreamProjectResults), getProjectArtifactProviders(upstreamProjectResults)); - } - P2TargetPlatform createTargetPlatformWithUpdatedReactorUnits(TargetPlatform baseTargetPlatform, Map reactorUnits, - List reactorArtifacts) { + List reactorArtifacts, PomDependencyCollector pomDependencyCollector) { if (!(baseTargetPlatform instanceof PreliminaryTargetPlatformImpl)) { throw new IllegalArgumentException( "Base target platform must be an instance of PreliminaryTargetPlatformImpl; was: " + baseTargetPlatform); } + if (!(pomDependencyCollector instanceof PomDependencyCollectorImpl)) { + throw new IllegalArgumentException( + "PomDependencyCollector must be an instance of PomDependencyCollectorImpl; was: " + + pomDependencyCollector); + } return createTargetPlatformWithUpdatedReactorUnits((PreliminaryTargetPlatformImpl) baseTargetPlatform, - reactorUnits, reactorArtifacts); + reactorUnits, reactorArtifacts, (PomDependencyCollectorImpl) pomDependencyCollector); } - P2TargetPlatform createTargetPlatformWithUpdatedReactorUnits(PreliminaryTargetPlatformImpl preliminaryTP, + private P2TargetPlatform createTargetPlatformWithUpdatedReactorUnits(PreliminaryTargetPlatformImpl preliminaryTP, Map reactorUnitsMap, - List reactorArtifacts) { + List reactorArtifacts, PomDependencyCollectorImpl pomDependencyCollector) { LinkedHashSet allUnits = preliminaryTP.getExternalUnits(); @@ -461,17 +458,26 @@ P2TargetPlatform createTargetPlatformWithUpdatedReactorUnits(PreliminaryTargetPl allUnits.addAll(reactorUnits); } + // TODO 372780 get rid of this special handling of pomDependency artifacts: there should be one p2 artifact repo view on the target platform + IRawArtifactFileProvider pomDependencyArtifactRepo = pomDependencyCollector.getArtifactRepoOfPublishedBundles(); + RepositoryBlackboardKey blackboardKey = RepositoryBlackboardKey + .forResolutionContextArtifacts(pomDependencyCollector.getProjectLocation()); + ArtifactRepositoryBlackboard.putRepository(blackboardKey, new ProviderOnlyArtifactRepository( + pomDependencyArtifactRepo, Activator.getProvisioningAgent(), blackboardKey.toURI())); + logger.debug("Registered artifact repository " + blackboardKey); + allUnits.addAll(pomDependencyCollector.gatherMavenInstallableUnits()); IRawArtifactFileProvider jointArtifacts = createJointArtifactProvider(reactorArtifacts, - preliminaryTP.getExternalArtifacts()); + preliminaryTP.getExternalArtifacts(), pomDependencyArtifactRepo); return new FinalTargetPlatformImpl(allUnits, preliminaryTP.getEEResolutionHints(), jointArtifacts, - localArtifactRepository, preliminaryTP.getOriginalMavenArtifactMap(), reactorUnitsMap); + localArtifactRepository, pomDependencyCollector.getMavenInstallableUnits(), reactorUnitsMap); } private CompositeArtifactProvider createJointArtifactProvider(List reactorArtifacts, - IRawArtifactFileProvider externalArtifacts) { + IRawArtifactFileProvider externalArtifacts, IRawArtifactFileProvider pomDependencyArtifactRepo) { // prefer artifacts from the reactor - return new CompositeArtifactProvider(reactorArtifacts, Collections.singletonList(externalArtifacts)); + return new CompositeArtifactProvider(reactorArtifacts, + Arrays.asList(externalArtifacts, pomDependencyArtifactRepo)); } private static Map extractProjectResultIUs( diff --git a/tycho-bundles/org.eclipse.tycho.p2.resolver.impl/src/main/java/org/eclipse/tycho/p2/util/resolution/AbstractResolutionStrategy.java b/tycho-bundles/org.eclipse.tycho.p2.resolver.impl/src/main/java/org/eclipse/tycho/p2/util/resolution/AbstractResolutionStrategy.java index 6679088f78..01f9b6bb37 100644 --- a/tycho-bundles/org.eclipse.tycho.p2.resolver.impl/src/main/java/org/eclipse/tycho/p2/util/resolution/AbstractResolutionStrategy.java +++ b/tycho-bundles/org.eclipse.tycho.p2.resolver.impl/src/main/java/org/eclipse/tycho/p2/util/resolution/AbstractResolutionStrategy.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2008, 2014 Sonatype Inc. and others. + * Copyright (c) 2008, 2021 Sonatype Inc. and others. * This program and the accompanying materials * are made available under the terms of the Eclipse Public License 2.0 * which accompanies this distribution, and is available at @@ -39,24 +39,24 @@ public final void setData(ResolutionData data) { this.data = data; } - public final Collection resolve(TargetEnvironment environment, IProgressMonitor monitor) - throws ResolverException { - return resolve(getEffectiveFilterProperties(environment), monitor); + public final Collection resolve(TargetEnvironment environment, boolean allowIncompleteState, + IProgressMonitor monitor) throws ResolverException { + return resolve(getEffectiveFilterProperties(environment), allowIncompleteState, monitor); } public Collection multiPlatformResolve(List environments, - IProgressMonitor monitor) throws ResolverException { + boolean allowIncompleteState, IProgressMonitor monitor) throws ResolverException { Set result = new LinkedHashSet<>(); for (TargetEnvironment environment : environments) { - result.addAll(resolve(getEffectiveFilterProperties(environment), monitor)); + result.addAll(resolve(getEffectiveFilterProperties(environment), allowIncompleteState, monitor)); } return result; } - protected abstract Collection resolve(Map properties, IProgressMonitor monitor) - throws ResolverException; + protected abstract Collection resolve(Map properties, + boolean allowIncompleteState, IProgressMonitor monitor) throws ResolverException; private Map getEffectiveFilterProperties(TargetEnvironment environment) { Map result = environment.toFilterProperties(); diff --git a/tycho-bundles/org.eclipse.tycho.p2.resolver.impl/src/main/java/org/eclipse/tycho/p2/util/resolution/AbstractSlicerResolutionStrategy.java b/tycho-bundles/org.eclipse.tycho.p2.resolver.impl/src/main/java/org/eclipse/tycho/p2/util/resolution/AbstractSlicerResolutionStrategy.java index db73d03923..5e8532f03d 100644 --- a/tycho-bundles/org.eclipse.tycho.p2.resolver.impl/src/main/java/org/eclipse/tycho/p2/util/resolution/AbstractSlicerResolutionStrategy.java +++ b/tycho-bundles/org.eclipse.tycho.p2.resolver.impl/src/main/java/org/eclipse/tycho/p2/util/resolution/AbstractSlicerResolutionStrategy.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2008, 2011 Sonatype Inc. and others. + * Copyright (c) 2008, 2021 Sonatype Inc. and others. * This program and the accompanying materials * are made available under the terms of the Eclipse Public License 2.0 * which accompanies this distribution, and is available at @@ -9,6 +9,7 @@ * * Contributors: * Sonatype Inc. - initial API and implementation + * Christoph Läubrich - Issue #462 - Delay Pom considered items to the final Target Platform calculation *******************************************************************************/ package org.eclipse.tycho.p2.util.resolution; @@ -16,6 +17,7 @@ import java.util.ArrayList; import java.util.Collection; +import java.util.Collections; import java.util.LinkedHashSet; import java.util.Map; import java.util.Set; @@ -23,12 +25,16 @@ import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.MultiStatus; import org.eclipse.equinox.internal.p2.director.Slicer; +import org.eclipse.equinox.internal.p2.metadata.IRequiredCapability; +import org.eclipse.equinox.internal.p2.metadata.RequiredCapability; import org.eclipse.equinox.p2.metadata.IInstallableUnit; +import org.eclipse.equinox.p2.metadata.IProvidedCapability; import org.eclipse.equinox.p2.metadata.IRequirement; import org.eclipse.equinox.p2.metadata.MetadataFactory; import org.eclipse.equinox.p2.metadata.MetadataFactory.InstallableUnitDescription; import org.eclipse.equinox.p2.metadata.Version; import org.eclipse.equinox.p2.metadata.VersionRange; +import org.eclipse.equinox.p2.metadata.expression.IMatchExpression; import org.eclipse.equinox.p2.query.IQueryable; import org.eclipse.tycho.core.shared.MavenLogger; import org.eclipse.tycho.repository.p2base.metadata.QueryableCollection; @@ -43,6 +49,11 @@ protected AbstractSlicerResolutionStrategy(MavenLogger logger) { protected final IQueryable slice(Map properties, IProgressMonitor monitor) throws ResolverException { + return slice(properties, Collections.emptyList(), monitor); + } + + protected final IQueryable slice(Map properties, + Collection additionalUnits, IProgressMonitor monitor) throws ResolverException { if (logger.isExtendedDebugEnabled()) { logger.debug("Properties: " + properties.toString()); @@ -62,6 +73,7 @@ protected final IQueryable slice(Map propertie Set availableIUs = new LinkedHashSet<>(data.getAvailableIUs()); availableIUs.addAll(data.getEEResolutionHints().getTemporaryAdditions()); availableIUs.addAll(data.getEEResolutionHints().getMandatoryUnits()); + availableIUs.addAll(additionalUnits); Set seedIUs = new LinkedHashSet<>(data.getRootIUs()); if (data.getAdditionalRequirements() != null && !data.getAdditionalRequirements().isEmpty()) { @@ -115,6 +127,31 @@ protected static IInstallableUnit createUnitRequiring(String name, Collection requirements) { + + InstallableUnitDescription result = new MetadataFactory.InstallableUnitDescription(); + String time = Long.toString(System.currentTimeMillis()); + result.setId(name + "-" + time); + result.setVersion(Version.createOSGi(0, 0, 0, time)); + for (IRequirement requirement : requirements) { + if (requirement instanceof IRequiredCapability) { + try { + IRequiredCapability capability = (IRequiredCapability) requirement; + String namespace = capability.getNamespace(); + IMatchExpression matches = capability.getMatches(); + String extractName = RequiredCapability.extractName(matches); + Version version = RequiredCapability.extractRange(matches).getMinimum(); + IProvidedCapability providedCapability = MetadataFactory.createProvidedCapability(namespace, + extractName, version); + result.addProvidedCapabilities(Collections.singleton(providedCapability)); + } catch (RuntimeException e) { + e.printStackTrace(); + } + } + } + return MetadataFactory.createInstallableUnit(result); + } + private static IRequirement createStrictRequirementTo(IInstallableUnit unit) { VersionRange strictRange = new VersionRange(unit.getVersion(), true, unit.getVersion(), true); int min = 1; diff --git a/tycho-bundles/org.eclipse.tycho.p2.resolver.impl/src/main/java/org/eclipse/tycho/p2/util/resolution/DependencyCollector.java b/tycho-bundles/org.eclipse.tycho.p2.resolver.impl/src/main/java/org/eclipse/tycho/p2/util/resolution/DependencyCollector.java index 89056cf656..3b2d3bc7a3 100644 --- a/tycho-bundles/org.eclipse.tycho.p2.resolver.impl/src/main/java/org/eclipse/tycho/p2/util/resolution/DependencyCollector.java +++ b/tycho-bundles/org.eclipse.tycho.p2.resolver.impl/src/main/java/org/eclipse/tycho/p2/util/resolution/DependencyCollector.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2008, 2012 Sonatype Inc. and others. + * Copyright (c) 2008, 2021 Sonatype Inc. and others. * This program and the accompanying materials * are made available under the terms of the Eclipse Public License 2.0 * which accompanies this distribution, and is available at @@ -41,7 +41,8 @@ public DependencyCollector(MavenLogger logger) { } @Override - public Collection resolve(Map properties, IProgressMonitor monitor) { + public Collection resolve(Map properties, boolean allowIncompleteState, + IProgressMonitor monitor) { Set result = new LinkedHashSet<>(); LinkedHashSet errors = new LinkedHashSet<>(); diff --git a/tycho-bundles/org.eclipse.tycho.p2.resolver.impl/src/main/java/org/eclipse/tycho/p2/util/resolution/ProjectorResolutionStrategy.java b/tycho-bundles/org.eclipse.tycho.p2.resolver.impl/src/main/java/org/eclipse/tycho/p2/util/resolution/ProjectorResolutionStrategy.java index 71b26c97e0..9357c74a3a 100644 --- a/tycho-bundles/org.eclipse.tycho.p2.resolver.impl/src/main/java/org/eclipse/tycho/p2/util/resolution/ProjectorResolutionStrategy.java +++ b/tycho-bundles/org.eclipse.tycho.p2.resolver.impl/src/main/java/org/eclipse/tycho/p2/util/resolution/ProjectorResolutionStrategy.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2008, 2011 Sonatype Inc. and others. + * Copyright (c) 2008, 2021 Sonatype Inc. and others. * This program and the accompanying materials * are made available under the terms of the Eclipse Public License 2.0 * which accompanies this distribution, and is available at @@ -9,6 +9,7 @@ * * Contributors: * Sonatype Inc. - initial API and implementation + * Christoph Läubrich - Issue #462 - Delay Pom considered items to the final Target Platform calculation *******************************************************************************/ package org.eclipse.tycho.p2.util.resolution; @@ -27,6 +28,7 @@ import org.eclipse.core.runtime.MultiStatus; import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.equinox.internal.p2.director.Explanation; +import org.eclipse.equinox.internal.p2.director.Explanation.MissingIU; import org.eclipse.equinox.internal.p2.director.Projector; import org.eclipse.equinox.internal.p2.director.QueryableArray; import org.eclipse.equinox.internal.p2.director.SimplePlanner; @@ -61,12 +63,22 @@ protected boolean isSlicerError(MultiStatus slicerStatus) { } @Override - public Collection resolve(Map properties, IProgressMonitor monitor) - throws ResolverException { + public Collection resolve(Map properties, boolean allowIncompleteState, + IProgressMonitor monitor) throws ResolverException { + + List additionalUnits = new ArrayList<>(); + Collection resolved = resolveInternal(properties, additionalUnits, allowIncompleteState, + monitor); + resolved.removeAll(additionalUnits); //remove the tycho generated IUs if any + return resolved; + } + private Collection resolveInternal(Map properties, + Collection additionalUnits, boolean allowIncompleteState, IProgressMonitor monitor) + throws ResolverException { Map newSelectionContext = SimplePlanner.createSelectionContext(properties); - IQueryable slice = slice(properties, monitor); + IQueryable slice = slice(properties, additionalUnits, monitor); Set seedUnits = new LinkedHashSet<>(data.getRootIUs()); List seedRequires = new ArrayList<>(); @@ -77,17 +89,37 @@ public Collection resolve(Map properties, IPro // force profile UIs to be used during resolution seedUnits.addAll(data.getEEResolutionHints().getMandatoryUnits()); seedRequires.addAll(data.getEEResolutionHints().getMandatoryRequires()); - Projector projector = new Projector(slice, newSelectionContext, new HashSet(), false); projector.encode(createUnitRequiring("tycho", seedUnits, seedRequires), - EMPTY_IU_ARRAY /* alreadyExistingRoots */, new QueryableArray(EMPTY_IU_ARRAY) /* installedIUs */, - seedUnits /* newRoots */, monitor); + EMPTY_IU_ARRAY /* alreadyExistingRoots */, + new QueryableArray(EMPTY_IU_ARRAY) /* installedIUs */, seedUnits /* newRoots */, monitor); IStatus s = projector.invokeSolver(monitor); if (s.getSeverity() == IStatus.ERROR) { + Set explanation = projector.getExplanation(new NullProgressMonitor()); // suppress "Cannot complete the request. Generating details." + if (allowIncompleteState) { + //FIXME better log output + for (Explanation exp : explanation) { + if (exp instanceof MissingIU) { + MissingIU missingIU = (MissingIU) exp; + System.out.println("MissingIU: " + missingIU.iu); + System.out.println(" " + missingIU.req); + } else { + System.out.println(exp.getClass() + ": " + exp); + } + } + List requirements = explanation.stream().filter(MissingIU.class::isInstance) + .map(MissingIU.class::cast).map(miu -> miu.req).collect(Collectors.toList()); + if (requirements.size() > 0) { + IInstallableUnit providing = createUnitProviding("tycho.unresolved.requirements", requirements); + if (providing.getProvidedCapabilities().size() > 0) { + System.out.println("created a unit for missing requirements:" + providing); + additionalUnits.add(providing); + return resolveInternal(properties, additionalUnits, allowIncompleteState, monitor); + } + } + } // log all transitive requirements which cannot be satisfied; this doesn't print the dependency chain from the seed to the units with missing requirements, so this is less useful than the "explanation" logger.debug(StatusTool.collectProblems(s)); - - Set explanation = projector.getExplanation(new NullProgressMonitor()); // suppress "Cannot complete the request. Generating details." throw new ResolverException(explanation.stream().map(Object::toString).collect(Collectors.joining("\n")), newSelectionContext.toString(), StatusTool.findException(s)); } @@ -136,13 +168,14 @@ void fixSWT(Collection availableIUs, Collection iter = new QueryableCollection(availableIUs).query( - QueryUtil.ALL_UNITS, monitor).iterator(); iter.hasNext();) { + all_ius: for (Iterator iter = new QueryableCollection(availableIUs) + .query(QueryUtil.ALL_UNITS, monitor).iterator(); iter.hasNext();) { IInstallableUnit iu = iter.next(); if (iu.getId().startsWith("org.eclipse.swt") && isApplicable(newSelectionContext, iu.getFilter()) && providesJavaPackages(iu)) { for (IProvidedCapability provided : iu.getProvidedCapabilities()) { - if ("osgi.fragment".equals(provided.getNamespace()) && "org.eclipse.swt".equals(provided.getName())) { + if ("osgi.fragment".equals(provided.getNamespace()) + && "org.eclipse.swt".equals(provided.getName())) { if (swtFragment == null || swtFragment.getVersion().compareTo(iu.getVersion()) < 0) { swtFragment = iu; } @@ -153,8 +186,8 @@ && providesJavaPackages(iu)) { } if (swtFragment == null) { - throw new RuntimeException("Could not determine SWT implementation fragment bundle for environment " - + newSelectionContext); + throw new RuntimeException( + "Could not determine SWT implementation fragment bundle for environment " + newSelectionContext); } resolutionResult.add(swtFragment); diff --git a/tycho-bundles/org.eclipse.tycho.p2.resolver.impl/src/main/java/org/eclipse/tycho/p2/util/resolution/SlicerResolutionStrategy.java b/tycho-bundles/org.eclipse.tycho.p2.resolver.impl/src/main/java/org/eclipse/tycho/p2/util/resolution/SlicerResolutionStrategy.java index c03c9b5176..ce6fdeadc5 100644 --- a/tycho-bundles/org.eclipse.tycho.p2.resolver.impl/src/main/java/org/eclipse/tycho/p2/util/resolution/SlicerResolutionStrategy.java +++ b/tycho-bundles/org.eclipse.tycho.p2.resolver.impl/src/main/java/org/eclipse/tycho/p2/util/resolution/SlicerResolutionStrategy.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2008, 2012 Sonatype Inc. and others. + * Copyright (c) 2008, 2021 Sonatype Inc. and others. * This program and the accompanying materials * are made available under the terms of the Eclipse Public License 2.0 * which accompanies this distribution, and is available at @@ -71,22 +71,22 @@ protected boolean isSlicerError(MultiStatus slicerStatus) { @Override public Collection multiPlatformResolve(List environments, - IProgressMonitor monitor) throws ResolverException { + boolean allowIncomplete, IProgressMonitor monitor) throws ResolverException { if (ignoreFilters) { // short cut: properties would ignored for each single resolution, so resolve just once - return resolve(Collections. emptyMap(), monitor); + return resolve(Collections. emptyMap(), allowIncomplete, monitor); } - return super.multiPlatformResolve(environments, monitor); + return super.multiPlatformResolve(environments, allowIncomplete, monitor); } @Override - public Collection resolve(Map properties, IProgressMonitor monitor) - throws ResolverException { + public Collection resolve(Map properties, boolean allowIncomplete, + IProgressMonitor monitor) throws ResolverException { IQueryable slice = slice(properties, monitor); - Set result = new LinkedHashSet<>(slice.query(QueryUtil.ALL_UNITS, monitor) - .toUnmodifiableSet()); + Set result = new LinkedHashSet<>( + slice.query(QueryUtil.ALL_UNITS, monitor).toUnmodifiableSet()); result.removeAll(data.getEEResolutionHints().getTemporaryAdditions()); if (logger.isExtendedDebugEnabled()) { diff --git a/tycho-bundles/org.eclipse.tycho.p2.resolver.shared/src/main/java/org/eclipse/tycho/p2/target/facade/PomDependencyCollector.java b/tycho-bundles/org.eclipse.tycho.p2.resolver.shared/src/main/java/org/eclipse/tycho/p2/target/facade/PomDependencyCollector.java index c02b545325..aafa1d0d66 100644 --- a/tycho-bundles/org.eclipse.tycho.p2.resolver.shared/src/main/java/org/eclipse/tycho/p2/target/facade/PomDependencyCollector.java +++ b/tycho-bundles/org.eclipse.tycho.p2.resolver.shared/src/main/java/org/eclipse/tycho/p2/target/facade/PomDependencyCollector.java @@ -10,9 +10,13 @@ * Contributors: * SAP AG - initial API and implementation * Christoph Läubrich - Bug 567098 - pomDependencies=consider should wrap non-osgi jars + * - Issue #462 - Delay Pom considered items to the final Target Platform calculation *******************************************************************************/ package org.eclipse.tycho.p2.target.facade; +import java.util.Map; + +import org.eclipse.tycho.ArtifactKey; import org.eclipse.tycho.p2.metadata.IArtifactFacade; /** @@ -26,4 +30,8 @@ public interface PomDependencyCollector { public void addArtifactWithExistingMetadata(IArtifactFacade artifact, IArtifactFacade p2MetadataFile); + Map getMavenInstallableUnits(); + + ArtifactKey getArtifactKey(IArtifactFacade facade); + } diff --git a/tycho-bundles/org.eclipse.tycho.p2.resolver.shared/src/main/java/org/eclipse/tycho/p2/target/facade/TargetPlatformFactory.java b/tycho-bundles/org.eclipse.tycho.p2.resolver.shared/src/main/java/org/eclipse/tycho/p2/target/facade/TargetPlatformFactory.java index 2df205a87c..cec1089b98 100644 --- a/tycho-bundles/org.eclipse.tycho.p2.resolver.shared/src/main/java/org/eclipse/tycho/p2/target/facade/TargetPlatformFactory.java +++ b/tycho-bundles/org.eclipse.tycho.p2.resolver.shared/src/main/java/org/eclipse/tycho/p2/target/facade/TargetPlatformFactory.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2013 SAP AG and others. + * Copyright (c) 2013, 2021 SAP AG and others. * This program and the accompanying materials * are made available under the terms of the Eclipse Public License 2.0 * which accompanies this distribution, and is available at @@ -9,6 +9,7 @@ * * Contributors: * SAP AG - initial API and implementation + * Christoph Läubrich - Issue #462 - Delay Pom considered items to the final Target Platform calculation *******************************************************************************/ package org.eclipse.tycho.p2.target.facade; @@ -22,7 +23,9 @@ public interface TargetPlatformFactory { public TargetPlatform createTargetPlatform(TargetPlatformConfigurationStub tpConfiguration, - ExecutionEnvironmentConfiguration eeConfiguration, List reactorProjects, - PomDependencyCollector pomDependencies); + ExecutionEnvironmentConfiguration eeConfiguration, List reactorProjects); + + public TargetPlatform createTargetPlatformWithUpdatedReactorContent(TargetPlatform baseTargetPlatform, + List upstreamProjectResults, PomDependencyCollector pomDependencies); } diff --git a/tycho-bundles/org.eclipse.tycho.p2.resolver.shared/src/main/java/org/eclipse/tycho/repository/registry/facade/ReactorRepositoryManagerFacade.java b/tycho-bundles/org.eclipse.tycho.p2.resolver.shared/src/main/java/org/eclipse/tycho/repository/registry/facade/ReactorRepositoryManagerFacade.java index 3af77334bb..7cbfaa18dd 100644 --- a/tycho-bundles/org.eclipse.tycho.p2.resolver.shared/src/main/java/org/eclipse/tycho/repository/registry/facade/ReactorRepositoryManagerFacade.java +++ b/tycho-bundles/org.eclipse.tycho.p2.resolver.shared/src/main/java/org/eclipse/tycho/repository/registry/facade/ReactorRepositoryManagerFacade.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2012, 2015 SAP SE and others. + * Copyright (c) 2012, 2021 SAP SE and others. * This program and the accompanying materials * are made available under the terms of the Eclipse Public License 2.0 * which accompanies this distribution, and is available at @@ -9,6 +9,7 @@ * * Contributors: * SAP SE - initial API and implementation + * Christoph Läubrich - Adjust to new API *******************************************************************************/ package org.eclipse.tycho.repository.registry.facade; @@ -37,7 +38,7 @@ public interface ReactorRepositoryManagerFacade { */ TargetPlatform computePreliminaryTargetPlatform(ReactorProject project, TargetPlatformConfigurationStub tpConfiguration, ExecutionEnvironmentConfiguration eeConfiguration, - List reactorProjects, PomDependencyCollector pomDependencies); + List reactorProjects); /** * Computes the (immutable) target platform with final p2 metadata and attaches it to the given @@ -49,7 +50,8 @@ TargetPlatform computePreliminaryTargetPlatform(ReactorProject project, * Other projects in the reactor which have already been built and may be referenced * by the given project. */ - void computeFinalTargetPlatform(ReactorProject project, List upstreamProjects); + void computeFinalTargetPlatform(ReactorProject project, List upstreamProjects, + PomDependencyCollector pomDependencyCollector); /** * Returns the target platform with final p2 metadata for the given project. diff --git a/tycho-core/src/main/java/org/eclipse/tycho/core/DependencyResolver.java b/tycho-core/src/main/java/org/eclipse/tycho/core/DependencyResolver.java index 0f9d90e8f4..9aa9c36b15 100644 --- a/tycho-core/src/main/java/org/eclipse/tycho/core/DependencyResolver.java +++ b/tycho-core/src/main/java/org/eclipse/tycho/core/DependencyResolver.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2008, 2014 Sonatype Inc. and others. + * Copyright (c) 2008, 2021 Sonatype Inc. and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -7,6 +7,7 @@ * * Contributors: * Sonatype Inc. - initial API and implementation + * Christoph Läubrich - Issue #462 - Delay Pom considered items to the final Target Platform calculation *******************************************************************************/ package org.eclipse.tycho.core; @@ -19,6 +20,7 @@ import org.eclipse.tycho.artifacts.DependencyArtifacts; import org.eclipse.tycho.artifacts.TargetPlatform; import org.eclipse.tycho.core.osgitools.AbstractTychoProject; +import org.eclipse.tycho.p2.target.facade.PomDependencyCollector; /** * Resolves project dependencies against the content of the target platform. @@ -27,6 +29,8 @@ public interface DependencyResolver { public void setupProjects(MavenSession session, MavenProject project, ReactorProject reactorProject); + PomDependencyCollector resolvePomDependencies(MavenSession session, MavenProject project); + public TargetPlatform computePreliminaryTargetPlatform(MavenSession session, MavenProject project, List reactorProjects); diff --git a/tycho-core/src/main/java/org/eclipse/tycho/core/osgitools/targetplatform/LocalDependencyResolver.java b/tycho-core/src/main/java/org/eclipse/tycho/core/osgitools/targetplatform/LocalDependencyResolver.java index 112c94339a..4a386522d0 100644 --- a/tycho-core/src/main/java/org/eclipse/tycho/core/osgitools/targetplatform/LocalDependencyResolver.java +++ b/tycho-core/src/main/java/org/eclipse/tycho/core/osgitools/targetplatform/LocalDependencyResolver.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2008, 2011 Sonatype Inc. and others. + * Copyright (c) 2008, 2021 Sonatype Inc. and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -53,6 +53,7 @@ import org.eclipse.tycho.core.osgitools.OsgiManifest; import org.eclipse.tycho.core.osgitools.OsgiManifestParserException; import org.eclipse.tycho.model.Feature; +import org.eclipse.tycho.p2.target.facade.PomDependencyCollector; /** * Creates target platform based on local Eclipse installation. @@ -254,4 +255,9 @@ public void injectDependenciesIntoMavenModel(MavenProject project, AbstractTycho MavenDependencyCollector dependencyCollector = new MavenDependencyCollector(project, bundleReader, logger); projectType.getDependencyWalker(reactorProject).walk(dependencyCollector); } + + @Override + public PomDependencyCollector resolvePomDependencies(MavenSession session, MavenProject project) { + return null; + } } diff --git a/tycho-extras/tycho-eclipserun-plugin/src/main/java/org/eclipse/tycho/extras/eclipserun/EclipseRunMojo.java b/tycho-extras/tycho-eclipserun-plugin/src/main/java/org/eclipse/tycho/extras/eclipserun/EclipseRunMojo.java index 308820f3ce..6415626698 100644 --- a/tycho-extras/tycho-eclipserun-plugin/src/main/java/org/eclipse/tycho/extras/eclipserun/EclipseRunMojo.java +++ b/tycho-extras/tycho-eclipserun-plugin/src/main/java/org/eclipse/tycho/extras/eclipserun/EclipseRunMojo.java @@ -306,7 +306,7 @@ private EquinoxInstallation createEclipseInstallation() throws MojoFailureExcept ExecutionEnvironmentConfiguration eeConfiguration = new ExecutionEnvironmentConfigurationImpl(logger, false, toolchainManager, session); TargetPlatform targetPlatform = resolverFactory.getTargetPlatformFactory().createTargetPlatform(tpConfiguration, - eeConfiguration, null, null); + eeConfiguration, null); P2Resolver resolver = resolverFactory.createResolver(new MavenLoggerAdapter(logger, false)); for (Dependency dependency : dependencies) { try { diff --git a/tycho-extras/tycho-p2-extras-plugin/src/main/java/org/eclipse/tycho/plugins/p2/extras/CompareWithBaselineMojo.java b/tycho-extras/tycho-p2-extras-plugin/src/main/java/org/eclipse/tycho/plugins/p2/extras/CompareWithBaselineMojo.java index b71fe31b89..09067d9e69 100644 --- a/tycho-extras/tycho-p2-extras-plugin/src/main/java/org/eclipse/tycho/plugins/p2/extras/CompareWithBaselineMojo.java +++ b/tycho-extras/tycho-p2-extras-plugin/src/main/java/org/eclipse/tycho/plugins/p2/extras/CompareWithBaselineMojo.java @@ -133,7 +133,7 @@ public void execute() throws MojoExecutionException, MojoFailureException { baselineTPStub.addP2Repository(toRepoURI(baselineRepo)); } TargetPlatform baselineTP = resolverFactory.getTargetPlatformFactory().createTargetPlatform(baselineTPStub, - TychoProjectUtils.getExecutionEnvironmentConfiguration(reactorProject), null, null); + TychoProjectUtils.getExecutionEnvironmentConfiguration(reactorProject), null); for (Object item : dependencyMetadata) { try { diff --git a/tycho-p2/tycho-p2-facade/src/main/java/org/eclipse/tycho/p2/resolver/P2DependencyResolver.java b/tycho-p2/tycho-p2-facade/src/main/java/org/eclipse/tycho/p2/resolver/P2DependencyResolver.java index afe0f5a6af..7933518ae4 100644 --- a/tycho-p2/tycho-p2-facade/src/main/java/org/eclipse/tycho/p2/resolver/P2DependencyResolver.java +++ b/tycho-p2/tycho-p2-facade/src/main/java/org/eclipse/tycho/p2/resolver/P2DependencyResolver.java @@ -12,6 +12,7 @@ * Christoph Läubrich - Bug 551739, Bug 538144, Bug 533747 * - [Bug 567098] pomDependencies=consider should wrap non-osgi jars * - [Bug 572481] Tycho does not understand "additional.bundles" directive in build.properties + * - [Issue #462] Delay Pom considered items to the final Target Platform calculation *******************************************************************************/ package org.eclipse.tycho.p2.resolver; @@ -22,6 +23,7 @@ import java.net.URL; import java.util.ArrayList; import java.util.Collection; +import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; @@ -76,6 +78,7 @@ import org.eclipse.tycho.core.osgitools.BundleReader; import org.eclipse.tycho.core.osgitools.DebugUtils; import org.eclipse.tycho.core.osgitools.DefaultReactorProject; +import org.eclipse.tycho.core.osgitools.targetplatform.ArtifactCollection; import org.eclipse.tycho.core.osgitools.targetplatform.DefaultDependencyArtifacts; import org.eclipse.tycho.core.osgitools.targetplatform.MultiEnvironmentDependencyArtifacts; import org.eclipse.tycho.core.p2.P2ArtifactRepositoryLayout; @@ -89,6 +92,7 @@ import org.eclipse.tycho.osgi.adapters.MavenLoggerAdapter; import org.eclipse.tycho.p2.facade.internal.AttachedArtifact; import org.eclipse.tycho.p2.metadata.DependencyMetadataGenerator; +import org.eclipse.tycho.p2.metadata.IArtifactFacade; import org.eclipse.tycho.p2.metadata.PublisherOptions; import org.eclipse.tycho.p2.repository.LocalRepositoryP2Indices; import org.eclipse.tycho.p2.resolver.facade.P2ResolutionResult; @@ -116,9 +120,6 @@ public class P2DependencyResolver extends AbstractLogEnabled implements Dependen @Requirement private BuildPropertiesParser buildPropertiesParser; - @Requirement - private ProjectDependenciesResolver projectDependenciesResolver; - @Requirement(role = TychoProject.class) private Map projectTypes; @@ -134,6 +135,10 @@ public class P2DependencyResolver extends AbstractLogEnabled implements Dependen private ReactorRepositoryManagerFacade reactorRepositoryManager; + @SuppressWarnings("deprecation") + @Requirement + private ProjectDependenciesResolver projectDependenciesResolver; + @Override public void setupProjects(final MavenSession session, final MavenProject project, final ReactorProject reactorProject) { @@ -208,9 +213,6 @@ public TargetPlatform computePreliminaryTargetPlatform(MavenSession session, Mav TargetPlatformConfigurationStub tpConfiguration = new TargetPlatformConfigurationStub(); tpConfiguration.setIncludePackedArtifacts(configuration.isIncludePackedArtifacts()); - - PomDependencyCollector pomDependencies = collectPomDependencies(project, reactorProjects, session, - configuration.getPomDependencies()); for (ArtifactRepository repository : project.getRemoteArtifactRepositories()) { addEntireP2RepositoryToTargetPlatform(repository, tpConfiguration); } @@ -224,7 +226,7 @@ public TargetPlatform computePreliminaryTargetPlatform(MavenSession session, Mav tpConfiguration.setIncludeSourceMode(configuration.getTargetDefinitionIncludeSourceMode()); return reactorRepositoryManager.computePreliminaryTargetPlatform(reactorProject, tpConfiguration, ee, - reactorProjects, pomDependencies); + reactorProjects); } private ReactorProject getThisReactorProject(MavenSession session, MavenProject project, @@ -266,16 +268,25 @@ public void setContextValue(String key, Object value) { return reactorProjet; } - private PomDependencyCollector collectPomDependencies(MavenProject project, List reactorProjects, - MavenSession session, PomDependencies pomDependencies) { + @SuppressWarnings("deprecation") + @Override + public PomDependencyCollector resolvePomDependencies(MavenSession session, MavenProject project) { + + ReactorProject reactorProject = DefaultReactorProject.adapt(project); + TargetPlatformConfiguration configuration = TychoProjectUtils.getTargetPlatformConfiguration(reactorProject); + PomDependencies pomDependencies = configuration.getPomDependencies(); if (pomDependencies == PomDependencies.ignore) { - return resolverFactory.newPomDependencyCollector(DefaultReactorProject.adapt(project)); + return resolverFactory.newPomDependencyCollector(reactorProject); } + List reactorProjects = DefaultReactorProject.adapt(session); + Set projectIds = new HashSet<>(); for (ReactorProject p : reactorProjects) { - String key = ArtifactUtils.key(p.getGroupId(), p.getArtifactId(), p.getVersion()); - projectIds.add(key); + if (PackagingType.TYPE_ECLIPSE_PLUGIN.equals(p.getPackaging())) { + String key = ArtifactUtils.key(p.getGroupId(), p.getArtifactId(), p.getVersion()); + projectIds.add(key); + } } ArrayList scopes = new ArrayList<>(); @@ -314,8 +325,22 @@ private PomDependencyCollector collectPomDependencies(MavenProject project, List } PomDependencyProcessor pomDependencyProcessor = new PomDependencyProcessor(session, repositorySystem, resolverFactory, equinox.getService(LocalRepositoryP2Indices.class), getLogger()); - return pomDependencyProcessor.collectPomDependencies(project, externalArtifacts, - pomDependencies == PomDependencies.wrapAsBundle); + PomDependencyCollector dependencyCollector = pomDependencyProcessor.collectPomDependencies(project, + externalArtifacts, pomDependencies == PomDependencies.wrapAsBundle); + DependencyArtifacts dependencyArtifacts = TychoProjectUtils.getDependencyArtifacts(reactorProject); + if (dependencyArtifacts instanceof ArtifactCollection) { + //enhance the dependency set + ArtifactCollection collection = (ArtifactCollection) dependencyArtifacts; + Map mavenInstallableUnits = dependencyCollector.getMavenInstallableUnits(); + for (var entry : mavenInstallableUnits.entrySet()) { + Object key = entry.getKey(); + IArtifactFacade val = entry.getValue(); + ArtifactKey artifactKey = dependencyCollector.getArtifactKey(val); + File location = val.getLocation(); + collection.addArtifactFile(artifactKey, location, Collections.singleton(key)); + } + } + return dependencyCollector; } private void addEntireP2RepositoryToTargetPlatform(ArtifactRepository repository,