diff --git a/tycho-its/projects/pomDependencyConsider.p2Data.generate/feature/build.properties b/tycho-its/projects/pomDependencyConsider.p2Data.generate/feature/build.properties new file mode 100644 index 00000000..64f93a9f --- /dev/null +++ b/tycho-its/projects/pomDependencyConsider.p2Data.generate/feature/build.properties @@ -0,0 +1 @@ +bin.includes = feature.xml diff --git a/tycho-its/projects/pomDependencyConsider.p2Data.generate/feature/feature.xml b/tycho-its/projects/pomDependencyConsider.p2Data.generate/feature/feature.xml new file mode 100644 index 00000000..9ac4ed4f --- /dev/null +++ b/tycho-its/projects/pomDependencyConsider.p2Data.generate/feature/feature.xml @@ -0,0 +1,26 @@ + + + + + [Enter Feature Description here.] + + + + [Enter Copyright Description here.] + + + + [Enter License Description here.] + + + + + diff --git a/tycho-its/projects/pomDependencyConsider.p2Data.generate/feature/pom.xml b/tycho-its/projects/pomDependencyConsider.p2Data.generate/feature/pom.xml new file mode 100644 index 00000000..e8469cd7 --- /dev/null +++ b/tycho-its/projects/pomDependencyConsider.p2Data.generate/feature/pom.xml @@ -0,0 +1,13 @@ + + + 4.0.0 + + + tycho-its-project.pomDependencyConsider.p2Data.generate + parent + 0.0.1-SNAPSHOT + + pomDependencyConsider.p2Data.generate.feature + eclipse-feature + + diff --git a/tycho-its/projects/pomDependencyConsider.p2Data.generate/pom.xml b/tycho-its/projects/pomDependencyConsider.p2Data.generate/pom.xml new file mode 100644 index 00000000..e86b400d --- /dev/null +++ b/tycho-its/projects/pomDependencyConsider.p2Data.generate/pom.xml @@ -0,0 +1,46 @@ + + + 4.0.0 + + tycho-its-project.pomDependencyConsider.p2Data.generate + parent + 0.0.1-SNAPSHOT + pom + + + feature + repository + + + + + + com.google.code.gson + gson + 1.6 + + + + + + + org.eclipse.tycho + tycho-maven-plugin + ${tycho-version} + true + + + org.eclipse.tycho + target-platform-configuration + ${tycho-version} + + consider + + + + + diff --git a/tycho-its/projects/pomDependencyConsider.p2Data.generate/repository/category.xml b/tycho-its/projects/pomDependencyConsider.p2Data.generate/repository/category.xml new file mode 100644 index 00000000..c3223eb6 --- /dev/null +++ b/tycho-its/projects/pomDependencyConsider.p2Data.generate/repository/category.xml @@ -0,0 +1,6 @@ + + + + diff --git a/tycho-its/projects/pomDependencyConsider.p2Data.generate/repository/pom.xml b/tycho-its/projects/pomDependencyConsider.p2Data.generate/repository/pom.xml new file mode 100644 index 00000000..69d9d494 --- /dev/null +++ b/tycho-its/projects/pomDependencyConsider.p2Data.generate/repository/pom.xml @@ -0,0 +1,13 @@ + + + 4.0.0 + + + tycho-its-project.pomDependencyConsider.p2Data.generate + parent + 0.0.1-SNAPSHOT + + repository + eclipse-repository + + diff --git a/tycho-its/src/test/java/org/eclipse/tycho/test/pomDependencyConsider/p2Data/generate/PomDependencyOnNonTychoArtifactTest.java b/tycho-its/src/test/java/org/eclipse/tycho/test/pomDependencyConsider/p2Data/generate/PomDependencyOnNonTychoArtifactTest.java new file mode 100644 index 00000000..493e8fb5 --- /dev/null +++ b/tycho-its/src/test/java/org/eclipse/tycho/test/pomDependencyConsider/p2Data/generate/PomDependencyOnNonTychoArtifactTest.java @@ -0,0 +1,40 @@ +/******************************************************************************* + * Copyright (c) 2011 SAP AG 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 + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * SAP AG - initial API and implementation + *******************************************************************************/ +package org.eclipse.tycho.test.pomDependencyConsider.p2Data.generate; + +import java.io.File; + +import org.apache.maven.it.Verifier; +import org.eclipse.tycho.test.AbstractTychoIntegrationTest; +import org.eclipse.tycho.test.util.P2RepositoryTool; +import org.junit.Assert; +import org.junit.Test; + +public class PomDependencyOnNonTychoArtifactTest extends AbstractTychoIntegrationTest { + private static final String POM_DEPENDENCY_BUNDLE_ID = "com.google.gson"; + private static final String POM_DEPENDENCY_BUNDLE_VERSION = "1.6.0"; + + @Test + public void testP2DataGeneratedForPomDependency() throws Exception { + // project with a POM dependency on a bundle not built by Tycho + Verifier verifier = getVerifier("pomDependencyConsider.p2Data.generate", false); + + verifier.executeGoal("verify"); + verifier.verifyErrorFreeLog(); + + String testProjectRoot = verifier.getBasedir(); + P2RepositoryTool p2Repo = P2RepositoryTool.forEclipseRepositoryModule(new File(testProjectRoot, "repository")); + + // this was bug TYCHO-570: the build passed, but the POM dependency bundle was missing + File expectedBundle = p2Repo.getBundleArtifact(POM_DEPENDENCY_BUNDLE_ID, POM_DEPENDENCY_BUNDLE_VERSION); + Assert.assertTrue(expectedBundle.isFile()); + } +} diff --git a/tycho-p2-resolver/org.eclipse.tycho.p2.resolver.facade/META-INF/MANIFEST.MF b/tycho-p2-resolver/org.eclipse.tycho.p2.resolver.facade/META-INF/MANIFEST.MF index e3eec567..b6d74376 100644 --- a/tycho-p2-resolver/org.eclipse.tycho.p2.resolver.facade/META-INF/MANIFEST.MF +++ b/tycho-p2-resolver/org.eclipse.tycho.p2.resolver.facade/META-INF/MANIFEST.MF @@ -2,7 +2,8 @@ Manifest-Version: 1.0 Export-Package: org.eclipse.tycho.core.facade, org.eclipse.tycho.p2.metadata, org.eclipse.tycho.p2.repository, - org.eclipse.tycho.p2.resolver.facade + org.eclipse.tycho.p2.resolver.facade, + org.eclipse.tycho.repository.registry.facade Bundle-Version: 0.13.0.qualifier Bundle-Name: Tycho p2 Resolver Maven/OSGi Facade (Incubation) Bundle-ManifestVersion: 2 diff --git a/tycho-p2-resolver/org.eclipse.tycho.p2.resolver.facade/src/main/java/org/eclipse/tycho/repository/registry/facade/RepositoryBlackboardKey.java b/tycho-p2-resolver/org.eclipse.tycho.p2.resolver.facade/src/main/java/org/eclipse/tycho/repository/registry/facade/RepositoryBlackboardKey.java new file mode 100644 index 00000000..fa692ead --- /dev/null +++ b/tycho-p2-resolver/org.eclipse.tycho.p2.resolver.facade/src/main/java/org/eclipse/tycho/repository/registry/facade/RepositoryBlackboardKey.java @@ -0,0 +1,51 @@ +/******************************************************************************* + * Copyright (c) 2011 SAP AG 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 + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * SAP AG - initial API and implementation + *******************************************************************************/ +package org.eclipse.tycho.repository.registry.facade; + +import java.io.File; +import java.net.URI; +import java.net.URISyntaxException; + +public class RepositoryBlackboardKey { + + // TODO p2 bug 347319 prevents using a special scheme, that will ensure that only our p2 repository factory load the blackboard key URIs + //public static String SCHEME = "registry"; + public static String SCHEME = "file"; + + private final URI uri; + + private RepositoryBlackboardKey(URI uri) { + this.uri = uri; + } + + public URI toURI() { + return uri; + } + + /** + * Creates a key under which the POM dependency artifacts of the resolution context (which is a + * superset of the target platform) of a project are available as p2 repository. + */ + public static RepositoryBlackboardKey forResolutionContextArtifacts(File projectLocation) { + try { + return new RepositoryBlackboardKey( + new URI(SCHEME, "/resolution-context-artifacts@" + projectLocation, null)); + } catch (URISyntaxException e) { + // the used constructor escapes invalid characters, so I don't see this happening + throw new RuntimeException(e); + } + } + + @Override + public String toString() { + return getClass().getName() + "(uri=" + uri + ")"; + } +} diff --git a/tycho-p2-resolver/org.eclipse.tycho.p2.tools.facade/META-INF/MANIFEST.MF b/tycho-p2-resolver/org.eclipse.tycho.p2.tools.facade/META-INF/MANIFEST.MF index ea835575..d483aad9 100644 --- a/tycho-p2-resolver/org.eclipse.tycho.p2.tools.facade/META-INF/MANIFEST.MF +++ b/tycho-p2-resolver/org.eclipse.tycho.p2.tools.facade/META-INF/MANIFEST.MF @@ -9,5 +9,6 @@ Export-Package: org.eclipse.tycho.p2.tools, org.eclipse.tycho.p2.tools.director, org.eclipse.tycho.p2.tools.mirroring, org.eclipse.tycho.p2.tools.publisher -Import-Package: org.eclipse.tycho.p2.repository +Import-Package: org.eclipse.tycho.p2.repository, + org.eclipse.tycho.repository.registry.facade Bundle-Vendor: %providerName diff --git a/tycho-p2-resolver/org.eclipse.tycho.p2.tools.facade/src/main/java/org/eclipse/tycho/p2/tools/RepositoryReferences.java b/tycho-p2-resolver/org.eclipse.tycho.p2.tools.facade/src/main/java/org/eclipse/tycho/p2/tools/RepositoryReferences.java index 333f4683..66ecdb6b 100644 --- a/tycho-p2-resolver/org.eclipse.tycho.p2.tools.facade/src/main/java/org/eclipse/tycho/p2/tools/RepositoryReferences.java +++ b/tycho-p2-resolver/org.eclipse.tycho.p2.tools.facade/src/main/java/org/eclipse/tycho/p2/tools/RepositoryReferences.java @@ -16,6 +16,8 @@ import java.util.Collections; import java.util.List; +import org.eclipse.tycho.repository.registry.facade.RepositoryBlackboardKey; + /** * List of p2 repositories for a p2 operation. Instances of this class store a list of metadata and * artifact repositories each, preserving the order in which the repositories were added. @@ -46,6 +48,16 @@ public void addArtifactRepository(File artifactRepositoryLocation) { artifactRepos.add(artifactRepositoryLocation.toURI()); } + /** + * Adds the artifact repository which is stored in memory under the given key. + * + * @param artifactRepositoryLocation + * A key identifying a repository registered on the artifact repository blackboard. + */ + public void addArtifactRepository(RepositoryBlackboardKey blackboardKey) { + artifactRepos.add(blackboardKey.toURI()); + } + /** * Returns the list of metadata repositories in the order in which they were added. * diff --git a/tycho-p2-resolver/tycho-p2-resolver-impl/org.eclipse.tycho.p2.maven.repository/META-INF/MANIFEST.MF b/tycho-p2-resolver/tycho-p2-resolver-impl/org.eclipse.tycho.p2.maven.repository/META-INF/MANIFEST.MF index c26de0b0..99e92dc3 100644 --- a/tycho-p2-resolver/tycho-p2-resolver-impl/org.eclipse.tycho.p2.maven.repository/META-INF/MANIFEST.MF +++ b/tycho-p2-resolver/tycho-p2-resolver-impl/org.eclipse.tycho.p2.maven.repository/META-INF/MANIFEST.MF @@ -14,8 +14,10 @@ Require-Bundle: org.eclipse.equinox.common;bundle-version="3.5.0", org.eclipse.equinox.p2.artifact.repository;bundle-version="1.1.0" Export-Package: org.eclipse.tycho.p2.maven.repository, org.eclipse.tycho.p2.maven.repository.xmlio;x-friends:="org.eclipse.tycho.p2.maven.repository.tests", - org.eclipse.tycho.p2.util + org.eclipse.tycho.p2.util, + org.eclipse.tycho.repository.registry.impl Import-Package: org.eclipse.osgi.util, org.eclipse.tycho.p2.repository, + org.eclipse.tycho.repository.registry.facade, org.osgi.framework Bundle-Activator: org.eclipse.tycho.p2.maven.repository.Activator diff --git a/tycho-p2-resolver/tycho-p2-resolver-impl/org.eclipse.tycho.p2.maven.repository/plugin.xml b/tycho-p2-resolver/tycho-p2-resolver-impl/org.eclipse.tycho.p2.maven.repository/plugin.xml index 32992e0c..c40fdbb0 100644 --- a/tycho-p2-resolver/tycho-p2-resolver-impl/org.eclipse.tycho.p2.maven.repository/plugin.xml +++ b/tycho-p2-resolver/tycho-p2-resolver-impl/org.eclipse.tycho.p2.maven.repository/plugin.xml @@ -30,6 +30,15 @@ suffix="p2artifacts.xml"> + + + + + diff --git a/tycho-p2-resolver/tycho-p2-resolver-impl/org.eclipse.tycho.p2.maven.repository/src/main/java/org/eclipse/tycho/repository/registry/impl/ArtifactRepositoryBlackboard.java b/tycho-p2-resolver/tycho-p2-resolver-impl/org.eclipse.tycho.p2.maven.repository/src/main/java/org/eclipse/tycho/repository/registry/impl/ArtifactRepositoryBlackboard.java new file mode 100644 index 00000000..e26af611 --- /dev/null +++ b/tycho-p2-resolver/tycho-p2-resolver-impl/org.eclipse.tycho.p2.maven.repository/src/main/java/org/eclipse/tycho/repository/registry/impl/ArtifactRepositoryBlackboard.java @@ -0,0 +1,52 @@ +/******************************************************************************* + * Copyright (c) 2011 SAP AG 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 + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * SAP AG - initial API and implementation + *******************************************************************************/ +package org.eclipse.tycho.repository.registry.impl; + +import java.net.URI; +import java.util.HashMap; +import java.util.Map; + +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.equinox.p2.core.IProvisioningAgent; +import org.eclipse.equinox.p2.core.ProvisionException; +import org.eclipse.equinox.p2.repository.artifact.IArtifactRepository; +import org.eclipse.equinox.p2.repository.artifact.spi.ArtifactRepositoryFactory; +import org.eclipse.tycho.repository.registry.facade.RepositoryBlackboardKey; +import org.eclipse.tycho.repository.util.RepositoryFactoryTools; + +public class ArtifactRepositoryBlackboard extends ArtifactRepositoryFactory { + + private static HashMap registry = new HashMap(); + + public static synchronized void putRepository(RepositoryBlackboardKey key, IArtifactRepository repository) { + registry.put(key.toURI(), repository); + } + + @Override + public IArtifactRepository create(URI location, String name, String type, Map properties) + throws ProvisionException { + throw RepositoryFactoryTools.unsupportedCreation(getClass()); + } + + @Override + public IArtifactRepository load(URI location, int flags, IProgressMonitor monitor) throws ProvisionException { + if (RepositoryBlackboardKey.SCHEME.equals(location.getScheme())) { + return getRegisteredRepositoryOrNull(location, getAgent()); + } + return null; + } + + private static synchronized IArtifactRepository getRegisteredRepositoryOrNull(URI location, IProvisioningAgent agent) + throws ProvisionException { + return registry.get(location); + } + +} diff --git a/tycho-p2-resolver/tycho-p2-resolver-impl/org.eclipse.tycho.p2.maven.repository/src/main/java/org/eclipse/tycho/repository/util/RepositoryFactoryTools.java b/tycho-p2-resolver/tycho-p2-resolver-impl/org.eclipse.tycho.p2.maven.repository/src/main/java/org/eclipse/tycho/repository/util/RepositoryFactoryTools.java index 28ecfa78..966d5b8b 100644 --- a/tycho-p2-resolver/tycho-p2-resolver-impl/org.eclipse.tycho.p2.maven.repository/src/main/java/org/eclipse/tycho/repository/util/RepositoryFactoryTools.java +++ b/tycho-p2-resolver/tycho-p2-resolver-impl/org.eclipse.tycho.p2.maven.repository/src/main/java/org/eclipse/tycho/repository/util/RepositoryFactoryTools.java @@ -41,10 +41,18 @@ public static void verifyModifiableNotRequested(int flags, String repositoryType } public static ProvisionException unsupportedCreation(String repositoryType) { + String message = "Cannot create repositories of type " + repositoryType; + return new ProvisionException(newUnsupportedCreationStatus(message)); + } + + public static ProvisionException unsupportedCreation(Class factoryClass) { + String message = "The factory " + factoryClass.getName() + " cannot create repositories"; + return new ProvisionException(newUnsupportedCreationStatus(message)); + } + + private static Status newUnsupportedCreationStatus(String message) { // none of the codes defined in ProvisionException really fit int errorCode = 0; - Status errorStatus = new Status(IStatus.ERROR, Activator.ID, errorCode, "Cannot create repositories of type " - + repositoryType, null); - return new ProvisionException(errorStatus); + return new Status(IStatus.ERROR, Activator.ID, errorCode, message, null); } } diff --git a/tycho-p2-resolver/tycho-p2-resolver-impl/org.eclipse.tycho.p2.resolver.impl/META-INF/MANIFEST.MF b/tycho-p2-resolver/tycho-p2-resolver-impl/org.eclipse.tycho.p2.resolver.impl/META-INF/MANIFEST.MF index f2874e65..d82f47bc 100644 --- a/tycho-p2-resolver/tycho-p2-resolver-impl/org.eclipse.tycho.p2.resolver.impl/META-INF/MANIFEST.MF +++ b/tycho-p2-resolver/tycho-p2-resolver-impl/org.eclipse.tycho.p2.resolver.impl/META-INF/MANIFEST.MF @@ -32,7 +32,8 @@ Export-Package: org.eclipse.tycho.p2.impl;x-friends:="org.eclipse.tycho.p2.impl. Import-Package: org.eclipse.tycho.core.facade, org.eclipse.tycho.p2.metadata, org.eclipse.tycho.p2.repository, - org.eclipse.tycho.p2.resolver.facade + org.eclipse.tycho.p2.resolver.facade, + org.eclipse.tycho.repository.registry.facade Service-Component: OSGI-INF/generator.xml, OSGI-INF/metadataserializable.xml, OSGI-INF/proxyfacade.xml, diff --git a/tycho-p2-resolver/tycho-p2-resolver-impl/org.eclipse.tycho.p2.resolver.impl/src/main/java/org/eclipse/tycho/p2/impl/resolver/P2ResolverImpl.java b/tycho-p2-resolver/tycho-p2-resolver-impl/org.eclipse.tycho.p2.resolver.impl/src/main/java/org/eclipse/tycho/p2/impl/resolver/P2ResolverImpl.java index d38419f8..3ee5a2d8 100644 --- a/tycho-p2-resolver/tycho-p2-resolver-impl/org.eclipse.tycho.p2.resolver.impl/src/main/java/org/eclipse/tycho/p2/impl/resolver/P2ResolverImpl.java +++ b/tycho-p2-resolver/tycho-p2-resolver-impl/org.eclipse.tycho.p2.resolver.impl/src/main/java/org/eclipse/tycho/p2/impl/resolver/P2ResolverImpl.java @@ -25,6 +25,7 @@ import org.eclipse.equinox.p2.metadata.IRequirement; import org.eclipse.equinox.p2.metadata.MetadataFactory; import org.eclipse.equinox.p2.metadata.VersionRange; +import org.eclipse.equinox.p2.repository.artifact.IArtifactRepository; import org.eclipse.equinox.spi.p2.publisher.PublisherHelper; import org.eclipse.tycho.core.facade.MavenLogger; import org.eclipse.tycho.p2.metadata.IArtifactFacade; @@ -33,6 +34,8 @@ import org.eclipse.tycho.p2.resolver.facade.P2Resolver; import org.eclipse.tycho.p2.resolver.facade.ResolutionContext; import org.eclipse.tycho.p2.resolver.impl.ResolutionContextImpl; +import org.eclipse.tycho.repository.registry.facade.RepositoryBlackboardKey; +import org.eclipse.tycho.repository.registry.impl.ArtifactRepositoryBlackboard; @SuppressWarnings("restriction") public class P2ResolverImpl implements P2Resolver { @@ -101,6 +104,12 @@ protected P2ResolutionResult resolveProject(File projectLocation, ResolutionStra context.downloadArtifacts(newState); + // TODO check if needed by all callers + IArtifactRepository resolutionContextArtifactRepo = context.getSupplementaryArtifactRepository(); + RepositoryBlackboardKey blackboardKey = RepositoryBlackboardKey.forResolutionContextArtifacts(projectLocation); + ArtifactRepositoryBlackboard.putRepository(blackboardKey, resolutionContextArtifactRepo); + logger.debug("Registered artifact repository " + blackboardKey); + return toResolutionResult(newState); } @@ -117,6 +126,7 @@ private P2ResolutionResult toResolutionResult(Collection newSt } } + // TODO instead of adding them to the TP, we could also register it in memory as metadata repo collectNonReactorIUs(result, newState); return result; } diff --git a/tycho-p2-resolver/tycho-p2-resolver-impl/org.eclipse.tycho.p2.resolver.impl/src/main/java/org/eclipse/tycho/p2/resolver/impl/ResolutionContextImpl.java b/tycho-p2-resolver/tycho-p2-resolver-impl/org.eclipse.tycho.p2.resolver.impl/src/main/java/org/eclipse/tycho/p2/resolver/impl/ResolutionContextImpl.java index d7b089e8..3f25c86f 100644 --- a/tycho-p2-resolver/tycho-p2-resolver-impl/org.eclipse.tycho.p2.resolver.impl/src/main/java/org/eclipse/tycho/p2/resolver/impl/ResolutionContextImpl.java +++ b/tycho-p2-resolver/tycho-p2-resolver-impl/org.eclipse.tycho.p2.resolver.impl/src/main/java/org/eclipse/tycho/p2/resolver/impl/ResolutionContextImpl.java @@ -97,6 +97,7 @@ public ResolutionContextImpl(File localMavenRepositoryRoot, MavenLogger logger) this.monitor = new LoggingProgressMonitor(logger); this.localMavenRepositoryRoot = localMavenRepositoryRoot; + this.bundlesPublisher = new ResolutionContextBundlePublisher(localMavenRepositoryRoot, logger); } // --------------------------------------------------------------------- @@ -167,20 +168,19 @@ void addMavenArtifact(ClassifiedLocation key, IArtifactFacade artifact, Set