diff --git a/tycho-bundles/org.eclipse.tycho.p2.resolver.shared/src/main/java/org/eclipse/tycho/p2/metadata/IDependencyMetadata.java b/tycho-bundles/org.eclipse.tycho.embedder.shared/src/main/java/org/eclipse/tycho/IDependencyMetadata.java similarity index 62% rename from tycho-bundles/org.eclipse.tycho.p2.resolver.shared/src/main/java/org/eclipse/tycho/p2/metadata/IDependencyMetadata.java rename to tycho-bundles/org.eclipse.tycho.embedder.shared/src/main/java/org/eclipse/tycho/IDependencyMetadata.java index 245dfeb7e1..53c3375661 100644 --- a/tycho-bundles/org.eclipse.tycho.p2.resolver.shared/src/main/java/org/eclipse/tycho/p2/metadata/IDependencyMetadata.java +++ b/tycho-bundles/org.eclipse.tycho.embedder.shared/src/main/java/org/eclipse/tycho/IDependencyMetadata.java @@ -10,14 +10,21 @@ * Contributors: * Sonatype Inc. - initial API and implementation *******************************************************************************/ -package org.eclipse.tycho.p2.metadata; +package org.eclipse.tycho; +import java.util.Collection; import java.util.Set; public interface IDependencyMetadata { - Set getMetadata(boolean primary); + enum DependencyMetadataType { + SEED, RESOLVE; + } - Set getMetadata(); + Set getDependencyMetadata(DependencyMetadataType type); + + Set getDependencyMetadata(); + + void setDependencyMetadata(DependencyMetadataType type, Collection units); } diff --git a/tycho-bundles/org.eclipse.tycho.embedder.shared/src/main/java/org/eclipse/tycho/ReactorProject.java b/tycho-bundles/org.eclipse.tycho.embedder.shared/src/main/java/org/eclipse/tycho/ReactorProject.java index d6f6523ed3..9ea17b5024 100644 --- a/tycho-bundles/org.eclipse.tycho.embedder.shared/src/main/java/org/eclipse/tycho/ReactorProject.java +++ b/tycho-bundles/org.eclipse.tycho.embedder.shared/src/main/java/org/eclipse/tycho/ReactorProject.java @@ -14,26 +14,11 @@ package org.eclipse.tycho; import java.io.File; -import java.util.Set; /** * A Tycho project in the reactor. */ -public interface ReactorProject { - /** - * Conventional key used to store ReactorProject in MavenProject.context - */ - public static final String CTX_REACTOR_PROJECT = "tycho.reactor-project"; - - /** - * Conventional key used to store dependency metadata in MavenProject.context - */ - public static final String CTX_DEPENDENCY_METADATA = "tycho.dependency-metadata"; - - /** - * Conventional key used to store secondary dependency metadata in MavenProject.context - */ - public static final String CTX_SECONDARY_DEPENDENCY_METADATA = "tycho.secondary-dependency-metadata"; +public interface ReactorProject extends IDependencyMetadata { /** * Conventional sources jar Maven artifact classifier. @@ -76,22 +61,6 @@ public interface ReactorProject { public void setContextValue(String key, Object value); - // - - public void setDependencyMetadata(boolean primary, Set installableUnits); - - /** - * Returns set of p2 IInstallableUnits that describe requirements and provided - * capabilities of this project. - */ - public Set getDependencyMetadata(boolean primary); - - /** - * Returns project dependency metadata with both primary and secondary project installable - * units. - */ - public Set getDependencyMetadata(); - public String getBuildQualifier(); public String getExpandedVersion(); diff --git a/tycho-bundles/org.eclipse.tycho.p2.resolver.impl.test/src/test/java/org/eclipse/tycho/p2/impl/test/ArtifactMock.java b/tycho-bundles/org.eclipse.tycho.p2.resolver.impl.test/src/test/java/org/eclipse/tycho/p2/impl/test/ArtifactMock.java index 313d449709..bbc7c620dc 100644 --- a/tycho-bundles/org.eclipse.tycho.p2.resolver.impl.test/src/test/java/org/eclipse/tycho/p2/impl/test/ArtifactMock.java +++ b/tycho-bundles/org.eclipse.tycho.p2.resolver.impl.test/src/test/java/org/eclipse/tycho/p2/impl/test/ArtifactMock.java @@ -16,8 +16,9 @@ import java.util.LinkedHashSet; import java.util.Set; +import org.eclipse.tycho.IDependencyMetadata; +import org.eclipse.tycho.IDependencyMetadata.DependencyMetadataType; import org.eclipse.tycho.p2.metadata.IArtifactFacade; -import org.eclipse.tycho.p2.metadata.IDependencyMetadata; public class ArtifactMock implements IArtifactFacade { private File location; @@ -51,8 +52,8 @@ public ArtifactMock(File location, String groupId, String artifactId, String ver } public ArtifactMock(ReactorProjectStub project, String classifier) { - this(project.getBasedir(), project.getGroupId(), project.getArtifactId(), project.getVersion(), project - .getPackaging(), classifier); + this(project.getBasedir(), project.getGroupId(), project.getArtifactId(), project.getVersion(), + project.getPackaging(), classifier); } @Override @@ -94,7 +95,9 @@ public Set getDependencyMetadata(boolean primary) { } public void setDependencyMetadata(IDependencyMetadata dependencyMetadata) { - this.dependencyMetadata = new LinkedHashSet<>(dependencyMetadata.getMetadata(true)); - this.secondaryDependencyMetadata = new LinkedHashSet<>(dependencyMetadata.getMetadata(false)); + this.dependencyMetadata = new LinkedHashSet<>( + dependencyMetadata.getDependencyMetadata(DependencyMetadataType.SEED)); + this.secondaryDependencyMetadata = new LinkedHashSet<>( + dependencyMetadata.getDependencyMetadata(DependencyMetadataType.RESOLVE)); } } diff --git a/tycho-bundles/org.eclipse.tycho.p2.resolver.impl.test/src/test/java/org/eclipse/tycho/p2/impl/test/ReactorProjectStub.java b/tycho-bundles/org.eclipse.tycho.p2.resolver.impl.test/src/test/java/org/eclipse/tycho/p2/impl/test/ReactorProjectStub.java index eeb4a7de70..d7b0aaa1e9 100644 --- a/tycho-bundles/org.eclipse.tycho.p2.resolver.impl.test/src/test/java/org/eclipse/tycho/p2/impl/test/ReactorProjectStub.java +++ b/tycho-bundles/org.eclipse.tycho.p2.resolver.impl.test/src/test/java/org/eclipse/tycho/p2/impl/test/ReactorProjectStub.java @@ -14,6 +14,8 @@ package org.eclipse.tycho.p2.impl.test; import java.io.File; +import java.util.Collection; +import java.util.Collections; import java.util.HashMap; import java.util.LinkedHashSet; import java.util.Map; @@ -21,9 +23,9 @@ import org.eclipse.tycho.BuildDirectory; import org.eclipse.tycho.BuildOutputDirectory; +import org.eclipse.tycho.IDependencyMetadata; import org.eclipse.tycho.ReactorProject; import org.eclipse.tycho.ReactorProjectIdentities; -import org.eclipse.tycho.p2.metadata.IDependencyMetadata; // TODO use interface with a subset of methods to ease stubbing? public class ReactorProjectStub extends ReactorProjectIdentities implements ReactorProject { @@ -93,28 +95,37 @@ public String getPackaging() { } @Override - public Set getDependencyMetadata(boolean primary) { - return primary ? dependencyMetadata : secondaryDependencyMetadata; + public Set getDependencyMetadata(DependencyMetadataType type) { + switch (type) { + case SEED: + return dependencyMetadata; + case RESOLVE: + return secondaryDependencyMetadata; + default: + return Collections.emptySet(); + } } public void setDependencyMetadata(IDependencyMetadata dependencyMetadata) { - this.dependencyMetadata = new LinkedHashSet<>(dependencyMetadata.getMetadata(true)); - this.secondaryDependencyMetadata = new LinkedHashSet<>(dependencyMetadata.getMetadata(false)); + this.dependencyMetadata = new LinkedHashSet<>( + dependencyMetadata.getDependencyMetadata(DependencyMetadataType.SEED)); + this.secondaryDependencyMetadata = new LinkedHashSet<>( + dependencyMetadata.getDependencyMetadata(DependencyMetadataType.RESOLVE)); } @Override - public void setDependencyMetadata(boolean primary, Set installableUnits) { - if (primary) - this.dependencyMetadata = installableUnits; - else - this.secondaryDependencyMetadata = installableUnits; + public void setDependencyMetadata(DependencyMetadataType type, Collection units) { + if (type == DependencyMetadataType.SEED) + this.dependencyMetadata = new LinkedHashSet<>(units); + else if (type == DependencyMetadataType.RESOLVE) + this.secondaryDependencyMetadata = new LinkedHashSet<>(units); } // TODO share with real implementation? @Override public Set getDependencyMetadata() { - Set primary = getDependencyMetadata(true); - Set secondary = getDependencyMetadata(false); + Set primary = getDependencyMetadata(DependencyMetadataType.SEED); + Set secondary = getDependencyMetadata(DependencyMetadataType.RESOLVE); if (primary == null) { return secondary; @@ -185,4 +196,5 @@ public String getName() { // TODO implement throw new UnsupportedOperationException(); } + } diff --git a/tycho-bundles/org.eclipse.tycho.p2.resolver.impl.test/src/test/java/org/eclipse/tycho/p2/publisher/P2GeneratorImplTest.java b/tycho-bundles/org.eclipse.tycho.p2.resolver.impl.test/src/test/java/org/eclipse/tycho/p2/publisher/P2GeneratorImplTest.java index e10cf30a5c..6170322c8a 100644 --- a/tycho-bundles/org.eclipse.tycho.p2.resolver.impl.test/src/test/java/org/eclipse/tycho/p2/publisher/P2GeneratorImplTest.java +++ b/tycho-bundles/org.eclipse.tycho.p2.resolver.impl.test/src/test/java/org/eclipse/tycho/p2/publisher/P2GeneratorImplTest.java @@ -54,8 +54,9 @@ public void testGenerateSourceBundleMetadata() throws Exception { DependencyMetadataGenerator p2GeneratorImpl = new SourcesBundleDependencyMetadataGenerator(); File location = new File("resources/generator/bundle").getCanonicalFile(); ArtifactMock artifactMock = new ArtifactMock(location, "org.acme", "foo", "0.0.1", "eclipse-plugin"); - Set units = p2GeneratorImpl - .generateMetadata(artifactMock, getEnvironments(), null, new PublisherOptions(false)).getMetadata(); + Set units = p2GeneratorImpl + .generateMetadata(artifactMock, getEnvironments(), null, new PublisherOptions(false)) + .getDependencyMetadata(); assertEquals(1, units.size()); IInstallableUnit sourceBundleUnit = getUnit("foo.source", units); assertNotNull(sourceBundleUnit); @@ -76,8 +77,9 @@ public void generateSourceBundleMetadataForProjectWithP2Inf() throws Exception { DependencyMetadataGenerator p2GeneratorImpl = new SourcesBundleDependencyMetadataGenerator(); File location = new File("resources/generator/bundle-p2-inf").getCanonicalFile(); ArtifactMock artifactMock = new ArtifactMock(location, "org.acme", "foo", "0.0.1", "eclipse-plugin"); - Set units = p2GeneratorImpl - .generateMetadata(artifactMock, getEnvironments(), null, new PublisherOptions(false)).getMetadata(); + Set units = p2GeneratorImpl + .generateMetadata(artifactMock, getEnvironments(), null, new PublisherOptions(false)) + .getDependencyMetadata(); assertEquals(1, units.size()); @@ -85,7 +87,7 @@ public void generateSourceBundleMetadataForProjectWithP2Inf() throws Exception { assertEquals(0, unit.getRequirements().size()); } - private IInstallableUnit getUnit(String id, Set units) { + private IInstallableUnit getUnit(String id, Set units) { for (Object obj : units) { IInstallableUnit unit = (IInstallableUnit) obj; if (id.equals(unit.getId())) { @@ -106,7 +108,7 @@ public void testOptionalImportPackage_REQUIRE() throws Exception { ArtifactMock artifactMock = new ArtifactMock(location, "optional-import-package", "optional-import-package", "0.0.1", "eclipse-plugin"); Set units = generator.generateMetadata(artifactMock, getEnvironments(), - OptionalResolutionAction.REQUIRE, new PublisherOptions()).getMetadata(); + OptionalResolutionAction.REQUIRE, new PublisherOptions()).getDependencyMetadata(); assertEquals(1, units.size()); IInstallableUnit iu = getUnit("optional-import-package", units); assertNotNull(iu); @@ -132,8 +134,8 @@ public void testOptionalImportPackage_IGNORE() throws Exception { File location = new File("resources/generator/optional-import-package").getCanonicalFile(); ArtifactMock artifactMock = new ArtifactMock(location, "optional-import-package", "optional-import-package", "0.0.1", "eclipse-plugin"); - Set units = generator.generateMetadata(artifactMock, getEnvironments(), OptionalResolutionAction.IGNORE, - new PublisherOptions()).getMetadata(); + Set units = generator.generateMetadata(artifactMock, getEnvironments(), OptionalResolutionAction.IGNORE, + new PublisherOptions()).getDependencyMetadata(); assertEquals(1, units.size()); IInstallableUnit iu = getUnit("optional-import-package", units); assertNotNull(iu); @@ -147,8 +149,8 @@ public void testOptionalRequireBundle_REQUIRE() throws Exception { File location = new File("resources/generator/optional-require-bundle").getCanonicalFile(); ArtifactMock artifactMock = new ArtifactMock(location, "optional-require-bundle", "optional-require-bundle", "0.0.1", "eclipse-plugin"); - Set units = generator.generateMetadata(artifactMock, getEnvironments(), - OptionalResolutionAction.REQUIRE, new PublisherOptions()).getMetadata(); + Set units = generator.generateMetadata(artifactMock, getEnvironments(), OptionalResolutionAction.REQUIRE, + new PublisherOptions()).getDependencyMetadata(); assertEquals(1, units.size()); IInstallableUnit iu = getUnit("optional-require-bundle", units); assertNotNull(iu); @@ -168,8 +170,8 @@ public void testOptionalRequireBundle_OPTIONAL() throws Exception { File location = new File("resources/generator/optional-require-bundle").getCanonicalFile(); ArtifactMock artifactMock = new ArtifactMock(location, "optional-require-bundle", "optional-require-bundle", "0.0.1", "eclipse-plugin"); - Set units = generator.generateMetadata(artifactMock, getEnvironments(), - OptionalResolutionAction.OPTIONAL, new PublisherOptions()).getMetadata(); + Set units = generator.generateMetadata(artifactMock, getEnvironments(), OptionalResolutionAction.OPTIONAL, + new PublisherOptions()).getDependencyMetadata(); assertEquals(1, units.size()); IInstallableUnit iu = getUnit("optional-require-bundle", units); assertNotNull(iu); @@ -189,8 +191,8 @@ public void testOptionalRequireBundle_IGNORE() throws Exception { File location = new File("resources/generator/optional-require-bundle").getCanonicalFile(); ArtifactMock artifactMock = new ArtifactMock(location, "optional-require-bundle", "optional-require-bundle", "0.0.1", "eclipse-plugin"); - Set units = generator.generateMetadata(artifactMock, getEnvironments(), OptionalResolutionAction.IGNORE, - new PublisherOptions()).getMetadata(); + Set units = generator.generateMetadata(artifactMock, getEnvironments(), OptionalResolutionAction.IGNORE, + new PublisherOptions()).getDependencyMetadata(); assertEquals(1, units.size()); IInstallableUnit iu = getUnit("optional-require-bundle", units); assertNotNull(iu); @@ -204,8 +206,8 @@ public void testOptionalRequireBundleP2inf_REQUIRE() throws Exception { File location = new File("resources/generator/optional-reqiure-bundle-p2inf").getCanonicalFile(); ArtifactMock artifactMock = new ArtifactMock(location, "optional-reqiure-bundle-p2inf", "optional-reqiure-bundle-p2inf", "0.0.1", "eclipse-plugin"); - Set units = generator.generateMetadata(artifactMock, getEnvironments(), - OptionalResolutionAction.REQUIRE, new PublisherOptions()).getMetadata(); + Set units = generator.generateMetadata(artifactMock, getEnvironments(), OptionalResolutionAction.REQUIRE, + new PublisherOptions()).getDependencyMetadata(); assertEquals(1, units.size()); IInstallableUnit iu = getUnit("optional-reqiure-bundle-p2inf", units); assertNotNull(iu); diff --git a/tycho-bundles/org.eclipse.tycho.p2.resolver.impl.test/src/test/java/org/eclipse/tycho/p2/resolver/P2ResolverTestBase.java b/tycho-bundles/org.eclipse.tycho.p2.resolver.impl.test/src/test/java/org/eclipse/tycho/p2/resolver/P2ResolverTestBase.java index 7dd9af3979..b772f78f03 100644 --- a/tycho-bundles/org.eclipse.tycho.p2.resolver.impl.test/src/test/java/org/eclipse/tycho/p2/resolver/P2ResolverTestBase.java +++ b/tycho-bundles/org.eclipse.tycho.p2.resolver.impl.test/src/test/java/org/eclipse/tycho/p2/resolver/P2ResolverTestBase.java @@ -17,6 +17,7 @@ import java.util.ArrayList; import java.util.List; +import org.eclipse.tycho.IDependencyMetadata; import org.eclipse.tycho.ReactorProject; import org.eclipse.tycho.core.resolver.shared.OptionalResolutionAction; import org.eclipse.tycho.core.shared.TargetEnvironment; @@ -25,7 +26,6 @@ import org.eclipse.tycho.p2.impl.publisher.P2GeneratorImpl; import org.eclipse.tycho.p2.impl.test.ArtifactMock; import org.eclipse.tycho.p2.impl.test.ReactorProjectStub; -import org.eclipse.tycho.p2.metadata.IDependencyMetadata; import org.eclipse.tycho.p2.metadata.PublisherOptions; import org.eclipse.tycho.p2.resolver.facade.P2Resolver; import org.eclipse.tycho.p2.target.PomDependencyCollectorImpl; 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 3e998d7750..c614f3051e 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 @@ -38,6 +38,7 @@ import org.eclipse.equinox.p2.metadata.IInstallableUnit; import org.eclipse.equinox.p2.metadata.IVersionedId; +import org.eclipse.tycho.IDependencyMetadata.DependencyMetadataType; import org.eclipse.tycho.ReactorProject; import org.eclipse.tycho.ReactorProjectIdentities; import org.eclipse.tycho.artifacts.TargetPlatformFilter; @@ -308,8 +309,8 @@ private ReactorProject createReactorProject(String artifactId, String[] primaryU ReactorProjectStub result = new ReactorProjectStub(basedir, artifactId); DependencyMetadata dependencyMetadata = new DependencyMetadata(); - dependencyMetadata.setMetadata(true, createUnits(primaryUnitIds)); - dependencyMetadata.setMetadata(false, createUnits(secondaryUnitIds)); + dependencyMetadata.setDependencyMetadata(DependencyMetadataType.SEED, createUnits(primaryUnitIds)); + dependencyMetadata.setDependencyMetadata(DependencyMetadataType.RESOLVE, createUnits(secondaryUnitIds)); result.setDependencyMetadata(dependencyMetadata); return result; diff --git a/tycho-bundles/org.eclipse.tycho.p2.resolver.impl/src/main/java/org/eclipse/tycho/p2/impl/publisher/AbstractMetadataGenerator.java b/tycho-bundles/org.eclipse.tycho.p2.resolver.impl/src/main/java/org/eclipse/tycho/p2/impl/publisher/AbstractMetadataGenerator.java index f7533f5923..18ee05c886 100644 --- a/tycho-bundles/org.eclipse.tycho.p2.resolver.impl/src/main/java/org/eclipse/tycho/p2/impl/publisher/AbstractMetadataGenerator.java +++ b/tycho-bundles/org.eclipse.tycho.p2.resolver.impl/src/main/java/org/eclipse/tycho/p2/impl/publisher/AbstractMetadataGenerator.java @@ -36,6 +36,7 @@ import org.eclipse.equinox.p2.publisher.PublisherResult; import org.eclipse.equinox.p2.publisher.actions.ICapabilityAdvice; import org.eclipse.equinox.p2.repository.artifact.IArtifactRepository; +import org.eclipse.tycho.IDependencyMetadata.DependencyMetadataType; import org.eclipse.tycho.core.resolver.shared.OptionalResolutionAction; import org.eclipse.tycho.core.shared.BuildProperties; import org.eclipse.tycho.core.shared.BuildPropertiesParser; @@ -130,8 +131,8 @@ private DependencyMetadata publish(PublisherInfo publisherInfo, List metadata; - private Set secondaryMetadata; + private Map> typeMap = new TreeMap<>(); private Set artifacts; @Override - public Set getMetadata(boolean primary) { - return primary ? metadata : secondaryMetadata; + public Set getDependencyMetadata(DependencyMetadataType type) { + return typeMap.getOrDefault(type, Collections.emptySet()); } @Override - public Set getMetadata() { + public Set getDependencyMetadata() { LinkedHashSet result = new LinkedHashSet<>(); - result.addAll(metadata); - result.addAll(secondaryMetadata); + result.addAll(getDependencyMetadata(DependencyMetadataType.SEED)); + result.addAll(getDependencyMetadata(DependencyMetadataType.RESOLVE)); return result; } - public void setMetadata(boolean primary, Collection units) { - if (primary) { - metadata = new LinkedHashSet(units); - } else { - secondaryMetadata = new LinkedHashSet(units); - } + public void setDependencyMetadata(DependencyMetadataType type, Collection units) { + + typeMap.put(type, new LinkedHashSet(units)); } public void setArtifacts(Collection artifacts) { @@ -56,13 +56,7 @@ public Set getArtifactDescriptors() { } public Set getInstallableUnits() { - LinkedHashSet result = new LinkedHashSet<>(); - for (Object unit : metadata) { - result.add((IInstallableUnit) unit); - } - for (Object unit : secondaryMetadata) { - result.add((IInstallableUnit) unit); - } - return result; + return typeMap.values().stream().flatMap(Collection::stream).filter(IInstallableUnit.class::isInstance) + .map(IInstallableUnit.class::cast).distinct().collect(Collectors.toSet()); } } 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 c3ea0ad979..aed5ce50be 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 @@ -46,6 +46,7 @@ import org.eclipse.tycho.ArtifactKey; import org.eclipse.tycho.ArtifactType; import org.eclipse.tycho.DefaultArtifactKey; +import org.eclipse.tycho.IDependencyMetadata.DependencyMetadataType; import org.eclipse.tycho.PackagingType; import org.eclipse.tycho.ReactorProject; import org.eclipse.tycho.ReactorProjectIdentities; @@ -123,7 +124,8 @@ public Map resolveTargetDependencies(Targ // we need a linked hashmap to maintain iteration-order, some of the code relies on it! Map results = new LinkedHashMap<>(); usedTargetPlatformUnits = new LinkedHashSet<>(); - Set metadata = project != null ? project.getDependencyMetadata(true) : Collections.emptySet(); + Set metadata = project != null ? project.getDependencyMetadata(DependencyMetadataType.SEED) + : Collections.emptySet(); for (TargetEnvironment environment : environments) { if (isMatchingEnv(metadata, environment)) { results.put(environment, @@ -229,9 +231,9 @@ protected P2ResolutionResult resolveDependencies(ReactorProject project, Abstrac Set availableUnits = context.getInstallableUnits(); if (project != null) { - data.setRootIUs((Set) project.getDependencyMetadata(true)); + data.setRootIUs((Set) project.getDependencyMetadata(DependencyMetadataType.SEED)); Collection projectSecondaryIUs = (Collection) project - .getDependencyMetadata(false); + .getDependencyMetadata(DependencyMetadataType.RESOLVE); if (!projectSecondaryIUs.isEmpty()) { availableUnits = new LinkedHashSet<>(availableUnits); availableUnits.addAll(projectSecondaryIUs); diff --git a/tycho-bundles/org.eclipse.tycho.p2.resolver.shared/src/main/java/org/eclipse/tycho/p2/metadata/DependencyMetadataGenerator.java b/tycho-bundles/org.eclipse.tycho.p2.resolver.shared/src/main/java/org/eclipse/tycho/p2/metadata/DependencyMetadataGenerator.java index 8d8ff1e3a0..97d98b5d82 100644 --- a/tycho-bundles/org.eclipse.tycho.p2.resolver.shared/src/main/java/org/eclipse/tycho/p2/metadata/DependencyMetadataGenerator.java +++ b/tycho-bundles/org.eclipse.tycho.p2.resolver.shared/src/main/java/org/eclipse/tycho/p2/metadata/DependencyMetadataGenerator.java @@ -14,6 +14,7 @@ import java.util.List; +import org.eclipse.tycho.IDependencyMetadata; import org.eclipse.tycho.core.resolver.shared.OptionalResolutionAction; import org.eclipse.tycho.core.shared.TargetEnvironment; diff --git a/tycho-core/src/main/java/org/eclipse/tycho/core/osgitools/DefaultReactorProject.java b/tycho-core/src/main/java/org/eclipse/tycho/core/osgitools/DefaultReactorProject.java index e0517bf423..9a575b0a52 100644 --- a/tycho-core/src/main/java/org/eclipse/tycho/core/osgitools/DefaultReactorProject.java +++ b/tycho-core/src/main/java/org/eclipse/tycho/core/osgitools/DefaultReactorProject.java @@ -13,9 +13,12 @@ import java.io.File; import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; import java.util.LinkedHashSet; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; @@ -29,6 +32,17 @@ import org.eclipse.tycho.osgi.adapters.MavenReactorProjectIdentities; public class DefaultReactorProject implements ReactorProject { + + /** + * Conventional key used to store ReactorProject in MavenProject.context + */ + private static final String CTX_REACTOR_PROJECT = "tycho.reactor-project"; + + /** + * Conventional key used to store dependency metadata in MavenProject.context + */ + private static final String CTX_DEPENDENCY_METADATA_PREFIX = "tycho.dependency-metadata-"; + public final MavenProject project; private final Map context = new ConcurrentHashMap<>(); @@ -138,33 +152,25 @@ public void setContextValue(String key, Object value) { } @Override - public void setDependencyMetadata(boolean primary, Set installableUnits) { - setContextValue(getDependencyMetadataKey(primary), installableUnits); + public void setDependencyMetadata(DependencyMetadataType type, Collection units) { + setContextValue(getDependencyMetadataKey(type), units); } @Override public Set getDependencyMetadata() { - Set primary = getDependencyMetadata(true); - Set secondary = getDependencyMetadata(false); - - if (primary == null) { - return secondary; - } else if (secondary == null) { - return primary; - } - - LinkedHashSet result = new LinkedHashSet<>(primary); - result.addAll(secondary); + LinkedHashSet result = new LinkedHashSet<>(getDependencyMetadata(DependencyMetadataType.SEED)); + result.addAll(getDependencyMetadata(DependencyMetadataType.RESOLVE)); return result; } @Override - public Set getDependencyMetadata(boolean primary) { - return (Set) getContextValue(getDependencyMetadataKey(primary)); + public Set getDependencyMetadata(DependencyMetadataType type) { + return Objects.requireNonNullElse((Set) getContextValue(getDependencyMetadataKey(type)), + Collections.emptySet()); } - private static String getDependencyMetadataKey(boolean primary) { - return primary ? CTX_DEPENDENCY_METADATA : CTX_SECONDARY_DEPENDENCY_METADATA; + private static String getDependencyMetadataKey(DependencyMetadataType type) { + return CTX_DEPENDENCY_METADATA_PREFIX + type.name().toLowerCase(); } @Override diff --git a/tycho-extras/tycho-custom-bundle-plugin/pom.xml b/tycho-extras/tycho-custom-bundle-plugin/pom.xml index fa446c2719..ac4ccdf2a7 100644 --- a/tycho-extras/tycho-custom-bundle-plugin/pom.xml +++ b/tycho-extras/tycho-custom-bundle-plugin/pom.xml @@ -49,6 +49,10 @@ org.eclipse.tycho tycho-core + + org.eclipse.tycho + org.eclipse.tycho.core.shared + org.eclipse.tycho tycho-p2-facade @@ -57,7 +61,7 @@ - + org.codehaus.plexus plexus-component-metadata diff --git a/tycho-extras/tycho-custom-bundle-plugin/src/main/java/org/eclipse/tycho/extras/custombundle/CustomBundleP2MetadataProvider.java b/tycho-extras/tycho-custom-bundle-plugin/src/main/java/org/eclipse/tycho/extras/custombundle/CustomBundleP2MetadataProvider.java index ec00e796e8..3ec65231da 100644 --- a/tycho-extras/tycho-custom-bundle-plugin/src/main/java/org/eclipse/tycho/extras/custombundle/CustomBundleP2MetadataProvider.java +++ b/tycho-extras/tycho-custom-bundle-plugin/src/main/java/org/eclipse/tycho/extras/custombundle/CustomBundleP2MetadataProvider.java @@ -13,6 +13,7 @@ package org.eclipse.tycho.extras.custombundle; import java.io.File; +import java.util.Collection; import java.util.Collections; import java.util.LinkedHashMap; import java.util.List; @@ -29,12 +30,12 @@ import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException; import org.codehaus.plexus.util.xml.Xpp3Dom; import org.eclipse.sisu.equinox.EquinoxServiceFactory; +import org.eclipse.tycho.IDependencyMetadata; import org.eclipse.tycho.core.resolver.shared.OptionalResolutionAction; import org.eclipse.tycho.core.shared.TargetEnvironment; 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.IDependencyMetadata; import org.eclipse.tycho.p2.metadata.PublisherOptions; import org.eclipse.tycho.p2.resolver.P2MetadataProvider; @@ -102,15 +103,22 @@ private static class SecondaryDependencyMetadata implements IDependencyMetadata final Set metadata; public SecondaryDependencyMetadata(IDependencyMetadata original) { - metadata = Collections.unmodifiableSet(original.getMetadata()); + metadata = Collections.unmodifiableSet(original.getDependencyMetadata()); } - public Set getMetadata(boolean primary) { - return primary ? Collections.emptySet() : metadata; + @Override + public Set getDependencyMetadata() { + return metadata; } - public Set getMetadata() { - return metadata; + @Override + public Set getDependencyMetadata(DependencyMetadataType type) { + return type == DependencyMetadataType.RESOLVE ? metadata : Collections.emptySet(); + } + + @Override + public void setDependencyMetadata(DependencyMetadataType type, Collection units) { + throw new UnsupportedOperationException(); } } } 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 2076a42957..b71fe31b89 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 @@ -32,6 +32,7 @@ import org.codehaus.plexus.component.annotations.Requirement; import org.codehaus.plexus.logging.Logger; import org.eclipse.sisu.equinox.EquinoxServiceFactory; +import org.eclipse.tycho.IDependencyMetadata.DependencyMetadataType; import org.eclipse.tycho.ReactorProject; import org.eclipse.tycho.artifactcomparator.ArtifactComparator; import org.eclipse.tycho.artifactcomparator.ArtifactDelta; @@ -112,7 +113,7 @@ public void execute() throws MojoExecutionException, MojoFailureException { return; } ReactorProject reactorProject = DefaultReactorProject.adapt(project); - Set dependencyMetadata = reactorProject.getDependencyMetadata(true); + Set dependencyMetadata = reactorProject.getDependencyMetadata(DependencyMetadataType.SEED); if (dependencyMetadata == null || dependencyMetadata.isEmpty()) { getLog().debug("Skipping baseline version comparison, no p2 artifacts created in build."); return; diff --git a/tycho-extras/tycho-source-feature-plugin/src/main/java/org/eclipse/tycho/extras/sourcefeature/SourceFeatureP2MetadataProvider.java b/tycho-extras/tycho-source-feature-plugin/src/main/java/org/eclipse/tycho/extras/sourcefeature/SourceFeatureP2MetadataProvider.java index 54320d8a80..6edf183780 100644 --- a/tycho-extras/tycho-source-feature-plugin/src/main/java/org/eclipse/tycho/extras/sourcefeature/SourceFeatureP2MetadataProvider.java +++ b/tycho-extras/tycho-source-feature-plugin/src/main/java/org/eclipse/tycho/extras/sourcefeature/SourceFeatureP2MetadataProvider.java @@ -28,6 +28,7 @@ import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException; import org.codehaus.plexus.util.xml.Xpp3Dom; import org.eclipse.sisu.equinox.EquinoxServiceFactory; +import org.eclipse.tycho.IDependencyMetadata; import org.eclipse.tycho.PackagingType; import org.eclipse.tycho.core.resolver.shared.OptionalResolutionAction; import org.eclipse.tycho.core.shared.TargetEnvironment; @@ -36,7 +37,6 @@ 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.IDependencyMetadata; import org.eclipse.tycho.p2.metadata.PublisherOptions; import org.eclipse.tycho.p2.resolver.P2MetadataProvider; 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 82d5ad1f4f..3ecbca8326 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 @@ -31,6 +31,7 @@ import java.util.Map; import java.util.Map.Entry; import java.util.Set; +import java.util.TreeMap; import org.apache.maven.MavenExecutionException; import org.apache.maven.ProjectDependenciesResolver; @@ -56,6 +57,8 @@ import org.eclipse.sisu.equinox.EquinoxServiceFactory; import org.eclipse.tycho.ArtifactKey; import org.eclipse.tycho.DefaultArtifactKey; +import org.eclipse.tycho.IDependencyMetadata; +import org.eclipse.tycho.IDependencyMetadata.DependencyMetadataType; import org.eclipse.tycho.PackagingType; import org.eclipse.tycho.ReactorProject; import org.eclipse.tycho.artifacts.DependencyArtifacts; @@ -88,7 +91,6 @@ 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.IDependencyMetadata; import org.eclipse.tycho.p2.metadata.PublisherOptions; import org.eclipse.tycho.p2.repository.LocalRepositoryP2Indices; import org.eclipse.tycho.p2.resolver.facade.P2ResolutionResult; @@ -139,16 +141,20 @@ public void setupProjects(final MavenSession session, final MavenProject project TargetPlatformConfiguration configuration = (TargetPlatformConfiguration) reactorProject .getContextValue(TychoConstants.CTX_TARGET_PLATFORM_CONFIGURATION); List environments = configuration.getEnvironments(); - Map metadata = getDependencyMetadata(session, project, environments, + Map metadataMap = getDependencyMetadata(session, project, environments, OptionalResolutionAction.OPTIONAL); - Set primaryMetadata = new LinkedHashSet<>(); - Set secondaryMetadata = new LinkedHashSet<>(); - for (Map.Entry entry : metadata.entrySet()) { - primaryMetadata.addAll(entry.getValue().getMetadata(true)); - secondaryMetadata.addAll(entry.getValue().getMetadata(false)); + Map> typeMap = new TreeMap<>(); + for (DependencyMetadataType type : DependencyMetadataType.values()) { + typeMap.put(type, new LinkedHashSet()); + } + for (IDependencyMetadata metadata : metadataMap.values()) { + for (Entry> map : typeMap.entrySet()) { + map.getValue().addAll(metadata.getDependencyMetadata(map.getKey())); + } + } + for (Entry> entry : typeMap.entrySet()) { + reactorProject.setDependencyMetadata(entry.getKey(), entry.getValue()); } - reactorProject.setDependencyMetadata(true, primaryMetadata); - reactorProject.setDependencyMetadata(false, secondaryMetadata); } protected Map getDependencyMetadata(final MavenSession session, @@ -231,16 +237,17 @@ private ReactorProject getThisReactorProject(MavenSession session, MavenProject .getOptionalResolutionAction(); Map dependencyMetadata = getDependencyMetadata(session, project, environments, optionalAction); - final Set metadata = new LinkedHashSet<>(); - final Set secondaryMetadata = new LinkedHashSet<>(); + Map> typeMap = new TreeMap<>(); for (Map.Entry entry : dependencyMetadata.entrySet()) { - metadata.addAll(entry.getValue().getMetadata(true)); - secondaryMetadata.addAll(entry.getValue().getMetadata(false)); + IDependencyMetadata value = entry.getValue(); + for (DependencyMetadataType type : DependencyMetadataType.values()) { + typeMap.computeIfAbsent(type, t -> new LinkedHashSet<>()).addAll(value.getDependencyMetadata(type)); + } } ReactorProject reactorProjet = new DefaultReactorProject(project) { @Override - public Set getDependencyMetadata(boolean primary) { - return primary ? metadata : secondaryMetadata; + public Set getDependencyMetadata(DependencyMetadataType type) { + return typeMap.get(type); } }; return reactorProjet; diff --git a/tycho-p2/tycho-p2-facade/src/main/java/org/eclipse/tycho/p2/resolver/P2MetadataProvider.java b/tycho-p2/tycho-p2-facade/src/main/java/org/eclipse/tycho/p2/resolver/P2MetadataProvider.java index d824d5d6d1..ed1af82e2c 100644 --- a/tycho-p2/tycho-p2-facade/src/main/java/org/eclipse/tycho/p2/resolver/P2MetadataProvider.java +++ b/tycho-p2/tycho-p2-facade/src/main/java/org/eclipse/tycho/p2/resolver/P2MetadataProvider.java @@ -17,9 +17,9 @@ import org.apache.maven.execution.MavenSession; import org.apache.maven.project.MavenProject; +import org.eclipse.tycho.IDependencyMetadata; import org.eclipse.tycho.core.resolver.shared.OptionalResolutionAction; import org.eclipse.tycho.core.shared.TargetEnvironment; -import org.eclipse.tycho.p2.metadata.IDependencyMetadata; /** * Component interface that allows contribution of additional p2 metadata to reactor projects. diff --git a/tycho-p2/tycho-p2-plugin/src/main/java/org/eclipse/tycho/plugins/p2/P2MetadataMojo.java b/tycho-p2/tycho-p2-plugin/src/main/java/org/eclipse/tycho/plugins/p2/P2MetadataMojo.java index 7954509904..13d7315114 100644 --- a/tycho-p2/tycho-p2-plugin/src/main/java/org/eclipse/tycho/plugins/p2/P2MetadataMojo.java +++ b/tycho-p2/tycho-p2-plugin/src/main/java/org/eclipse/tycho/plugins/p2/P2MetadataMojo.java @@ -48,6 +48,7 @@ import org.apache.maven.project.MavenProjectHelper; import org.eclipse.sisu.equinox.EquinoxServiceFactory; import org.eclipse.tycho.ArtifactType; +import org.eclipse.tycho.IDependencyMetadata.DependencyMetadataType; import org.eclipse.tycho.ReactorProject; import org.eclipse.tycho.core.osgitools.DefaultReactorProject; import org.eclipse.tycho.p2.facade.internal.ArtifactFacade; @@ -209,8 +210,8 @@ protected void attachP2Metadata() throws MojoExecutionException { } // TODO 353889 distinguish between dependency resolution seed units ("primary") and other units of the project - reactorProject.setDependencyMetadata(true, installableUnits); - reactorProject.setDependencyMetadata(false, Collections.emptySet()); + reactorProject.setDependencyMetadata(DependencyMetadataType.SEED, installableUnits); + reactorProject.setDependencyMetadata(DependencyMetadataType.RESOLVE, Collections.emptySet()); } catch (IOException e) { throw new MojoExecutionException("Could not generate P2 metadata", e); } diff --git a/tycho-p2/tycho-p2-publisher-plugin/src/main/java/org/eclipse/tycho/plugins/p2/publisher/persistence/AttachPublishedArtifactsMojo.java b/tycho-p2/tycho-p2-publisher-plugin/src/main/java/org/eclipse/tycho/plugins/p2/publisher/persistence/AttachPublishedArtifactsMojo.java index 2a90e197f1..7ca6bc8658 100644 --- a/tycho-p2/tycho-p2-publisher-plugin/src/main/java/org/eclipse/tycho/plugins/p2/publisher/persistence/AttachPublishedArtifactsMojo.java +++ b/tycho-p2/tycho-p2-publisher-plugin/src/main/java/org/eclipse/tycho/plugins/p2/publisher/persistence/AttachPublishedArtifactsMojo.java @@ -24,6 +24,7 @@ import org.apache.maven.project.MavenProjectHelper; import org.codehaus.plexus.logging.Logger; import org.eclipse.sisu.equinox.EquinoxServiceFactory; +import org.eclipse.tycho.IDependencyMetadata.DependencyMetadataType; import org.eclipse.tycho.ReactorProject; import org.eclipse.tycho.core.maven.AbstractP2Mojo; import org.eclipse.tycho.repository.registry.facade.PublishingRepositoryFacade; @@ -71,8 +72,8 @@ public void execute() throws MojoExecutionException, MojoFailureException { } ReactorProject reactorProject = getReactorProject(); - reactorProject.setDependencyMetadata(true, publishingRepo.getInstallableUnits()); - reactorProject.setDependencyMetadata(false, Collections.emptySet()); + reactorProject.setDependencyMetadata(DependencyMetadataType.SEED, publishingRepo.getInstallableUnits()); + reactorProject.setDependencyMetadata(DependencyMetadataType.RESOLVE, Collections.emptySet()); } } diff --git a/tycho-source-plugin/src/main/java/org/eclipse/tycho/source/SourceFeatureP2MetadataProvider.java b/tycho-source-plugin/src/main/java/org/eclipse/tycho/source/SourceFeatureP2MetadataProvider.java index 56f131f706..0acc027a16 100644 --- a/tycho-source-plugin/src/main/java/org/eclipse/tycho/source/SourceFeatureP2MetadataProvider.java +++ b/tycho-source-plugin/src/main/java/org/eclipse/tycho/source/SourceFeatureP2MetadataProvider.java @@ -30,6 +30,7 @@ import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException; import org.codehaus.plexus.util.xml.Xpp3Dom; import org.eclipse.sisu.equinox.EquinoxServiceFactory; +import org.eclipse.tycho.IDependencyMetadata; import org.eclipse.tycho.PackagingType; import org.eclipse.tycho.core.resolver.shared.OptionalResolutionAction; import org.eclipse.tycho.core.shared.TargetEnvironment; @@ -38,7 +39,6 @@ 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.IDependencyMetadata; import org.eclipse.tycho.p2.metadata.PublisherOptions; import org.eclipse.tycho.p2.resolver.P2MetadataProvider; diff --git a/tycho-source-plugin/src/main/java/org/eclipse/tycho/source/SourcesP2MetadataProvider.java b/tycho-source-plugin/src/main/java/org/eclipse/tycho/source/SourcesP2MetadataProvider.java index 8589b925c0..7a7818355e 100644 --- a/tycho-source-plugin/src/main/java/org/eclipse/tycho/source/SourcesP2MetadataProvider.java +++ b/tycho-source-plugin/src/main/java/org/eclipse/tycho/source/SourcesP2MetadataProvider.java @@ -23,13 +23,13 @@ import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable; import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException; import org.eclipse.sisu.equinox.EquinoxServiceFactory; +import org.eclipse.tycho.IDependencyMetadata; import org.eclipse.tycho.core.resolver.shared.OptionalResolutionAction; import org.eclipse.tycho.core.shared.BuildPropertiesParser; import org.eclipse.tycho.core.shared.TargetEnvironment; 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.IDependencyMetadata; import org.eclipse.tycho.p2.metadata.PublisherOptions; import org.eclipse.tycho.p2.resolver.P2MetadataProvider;