diff --git a/m2e-core-tests b/m2e-core-tests index c153faa8aa..da85ee3a2e 160000 --- a/m2e-core-tests +++ b/m2e-core-tests @@ -1 +1 @@ -Subproject commit c153faa8aa9286f51fa35b7123718a96fc3a7bd5 +Subproject commit da85ee3a2ebb7f3ab6de48da8c5cd11539daef68 diff --git a/org.eclipse.m2e.core.ui/META-INF/MANIFEST.MF b/org.eclipse.m2e.core.ui/META-INF/MANIFEST.MF index 5abf9d3ddf..b3a2a2bfcc 100644 --- a/org.eclipse.m2e.core.ui/META-INF/MANIFEST.MF +++ b/org.eclipse.m2e.core.ui/META-INF/MANIFEST.MF @@ -44,12 +44,12 @@ Require-Bundle: org.eclipse.m2e.core;bundle-version="[2.0.0,3.0.0)", org.eclipse.ui.navigator, org.eclipse.debug.ui Import-Package: org.apache.maven.archetype.catalog;provider=m2e;version="[3.2.1,4.0.0)", - org.apache.maven.archetype.catalog.io.xpp3;provider=m2e;version="[3.2.1,4.0.0)", - org.apache.maven.archetype.common;provider=m2e;version="[3.2.1,4.0.0)", - org.apache.maven.archetype.exception;provider=m2e;version="[3.2.1,4.0.0)", - org.apache.maven.archetype.metadata;provider=m2e;version="[3.2.1,4.0.0)", - org.apache.maven.archetype.source;provider=m2e;version="[3.2.1,4.0.0)", - org.apache.maven.shared.transfer.artifact;provider=m2e;version="[0.13.1,1.0.0)", + org.apache.maven.archetype.catalog.io.xpp3;provider=m2e;version="[3.3.0,4.0.0)", + org.apache.maven.archetype.common;provider=m2e;version="[3.3.0,4.0.0)", + org.apache.maven.archetype.downloader;provider=m2e;version="[3.3.0,4.0.0)", + org.apache.maven.archetype.exception;provider=m2e;version="[3.3.0,4.0.0)", + org.apache.maven.archetype.metadata;provider=m2e;version="[3.3.0,4.0.0)", + org.apache.maven.archetype.source;provider=m2e;version="[3.3.0,4.0.0)", org.eclipse.compare.rangedifferencer, org.eclipse.ltk.core.refactoring, org.slf4j;version="[1.7.0,3.0.0)" @@ -57,4 +57,3 @@ Service-Component: OSGI-INF/component.xml, OSGI-INF/org.eclipse.m2e.core.ui.internal.archetype.ArchetypeGenerator.xml, OSGI-INF/org.eclipse.m2e.core.ui.internal.archetype.ArchetypePlugin.xml Automatic-Module-Name: org.eclipse.m2e.core.ui - diff --git a/org.eclipse.m2e.core.ui/src/org/eclipse/m2e/core/ui/internal/archetype/ArchetypeCatalogFactory.java b/org.eclipse.m2e.core.ui/src/org/eclipse/m2e/core/ui/internal/archetype/ArchetypeCatalogFactory.java index 41de8cd4b6..1924eb31d7 100644 --- a/org.eclipse.m2e.core.ui/src/org/eclipse/m2e/core/ui/internal/archetype/ArchetypeCatalogFactory.java +++ b/org.eclipse.m2e.core.ui/src/org/eclipse/m2e/core/ui/internal/archetype/ArchetypeCatalogFactory.java @@ -13,6 +13,7 @@ package org.eclipse.m2e.core.ui.internal.archetype; +import java.io.File; import java.io.InputStream; import java.net.URI; import java.net.URL; @@ -24,6 +25,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.eclipse.aether.repository.RemoteRepository; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.Status; import org.eclipse.osgi.util.NLS; @@ -34,9 +36,6 @@ import org.apache.maven.archetype.source.ArchetypeDataSource; import org.apache.maven.archetype.source.ArchetypeDataSourceException; import org.apache.maven.archetype.source.RemoteCatalogArchetypeDataSource; -import org.apache.maven.artifact.repository.ArtifactRepository; -import org.apache.maven.artifact.repository.MavenArtifactRepository; -import org.apache.maven.project.ProjectBuildingRequest; import org.eclipse.m2e.core.embedder.IMaven; import org.eclipse.m2e.core.embedder.IMavenExecutionContext; @@ -111,7 +110,7 @@ public static class InternalCatalogFactory extends ArchetypeCatalogFactory { @Override public ArchetypeCatalog getArchetypeCatalog() { try { - return source.getArchetypeCatalog(null); + return source.getArchetypeCatalog(null, null); } catch(ArchetypeDataSourceException e) { return new ArchetypeCatalog(); } @@ -137,9 +136,8 @@ public static class DefaultLocalCatalogFactory extends ArchetypeCatalogFactory { @Override public ArchetypeCatalog getArchetypeCatalog() throws CoreException { return maven.createExecutionContext().execute((ctx, m) -> { - ProjectBuildingRequest buildingRequest = ctx.newProjectBuildingRequest(); try { - return source.getArchetypeCatalog(buildingRequest); + return source.getArchetypeCatalog(ctx.getRepositorySession(), ArchetypePlugin.getRemoteRepositories(ctx)); } catch(ArchetypeDataSourceException e) { return new ArchetypeCatalog(); } @@ -173,14 +171,10 @@ public ArchetypeCatalog getArchetypeCatalog() throws CoreException { if(catalog == null) { //local but not embedded catalog IMavenExecutionContext context = maven.createExecutionContext(); - ArtifactRepository localRepository = new MavenArtifactRepository(); - localRepository.setUrl(getLocalRepositoryURL()); - context.getExecutionRequest().setLocalRepository(localRepository); + context.getExecutionRequest().setLocalRepositoryPath(getLocalRepositoryPath()); return context.execute((ctx, m) -> { - ProjectBuildingRequest buildingRequest = ctx.newProjectBuildingRequest(); - buildingRequest.setLocalRepository(localRepository); try { - return source.getArchetypeCatalog(buildingRequest); + return source.getArchetypeCatalog(ctx.getRepositorySession(), ArchetypePlugin.getRemoteRepositories(ctx)); } catch(ArchetypeDataSourceException e) { return new ArchetypeCatalog(); } @@ -189,7 +183,7 @@ public ArchetypeCatalog getArchetypeCatalog() throws CoreException { return catalog; } - private String getLocalRepositoryURL() { + private File getLocalRepositoryPath() { Path path; try { // First try to use the id as a path, then as a URI else as it is path = Path.of(getId()); @@ -197,14 +191,14 @@ private String getLocalRepositoryURL() { try { path = Path.of(new URI(getId())); } catch(Exception e2) { - return getId(); + throw new IllegalStateException("Illegal repository path: " + getId()); } } path = path.toAbsolutePath(); if(Files.isRegularFile(path)) { path = path.getParent(); } - return path.toUri().toString(); + return path.toFile(); } private ArchetypeCatalog getEmbeddedCatalog() throws CoreException { @@ -281,13 +275,12 @@ public ArchetypeCatalog getArchetypeCatalog() throws CoreException { final String remoteUrl = url; ArchetypeCatalog catalog = maven.createExecutionContext().execute((ctx, m) -> { - ProjectBuildingRequest buildingRequest = ctx.newProjectBuildingRequest(); try { - ArtifactRepository archeTypeRepo = new MavenArtifactRepository(); - archeTypeRepo.setUrl(remoteUrl); - archeTypeRepo.setId(RemoteCatalogArchetypeDataSource.ARCHETYPE_REPOSITORY_ID); - buildingRequest.getRemoteRepositories().add(archeTypeRepo); - return source.getArchetypeCatalog(buildingRequest); + RemoteRepository archeTypeRepo = new RemoteRepository.Builder( + RemoteCatalogArchetypeDataSource.ARCHETYPE_REPOSITORY_ID, "", remoteUrl).build(); + List remoteRepositories = new ArrayList<>(ArchetypePlugin.getRemoteRepositories(ctx)); + remoteRepositories.add(archeTypeRepo); + return source.getArchetypeCatalog(ctx.getRepositorySession(), remoteRepositories); } catch(ArchetypeDataSourceException e) { return new ArchetypeCatalog(); } diff --git a/org.eclipse.m2e.core.ui/src/org/eclipse/m2e/core/ui/internal/archetype/ArchetypePlugin.java b/org.eclipse.m2e.core.ui/src/org/eclipse/m2e/core/ui/internal/archetype/ArchetypePlugin.java index 24a349d31e..13597ef6b6 100644 --- a/org.eclipse.m2e.core.ui/src/org/eclipse/m2e/core/ui/internal/archetype/ArchetypePlugin.java +++ b/org.eclipse.m2e.core.ui/src/org/eclipse/m2e/core/ui/internal/archetype/ArchetypePlugin.java @@ -26,6 +26,7 @@ import java.util.Map; import java.util.stream.Collectors; +import org.osgi.framework.FrameworkUtil; import org.osgi.service.component.annotations.Activate; import org.osgi.service.component.annotations.Component; import org.osgi.service.component.annotations.Deactivate; @@ -34,33 +35,39 @@ import org.slf4j.LoggerFactory; import com.google.inject.AbstractModule; +import com.google.inject.Guice; +import com.google.inject.Injector; import com.google.inject.Module; +import org.eclipse.aether.RepositorySystem; +import org.eclipse.aether.repository.RemoteRepository; import org.eclipse.core.runtime.Assert; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.core.runtime.Status; +import org.eclipse.sisu.space.BeanScanning; +import org.eclipse.sisu.space.BundleClassSpace; +import org.eclipse.sisu.space.ClassSpace; +import org.eclipse.sisu.space.SpaceModule; +import org.eclipse.sisu.wire.WireModule; -import org.codehaus.plexus.ContainerConfiguration; -import org.codehaus.plexus.DefaultContainerConfiguration; -import org.codehaus.plexus.DefaultPlexusContainer; -import org.codehaus.plexus.PlexusConstants; -import org.codehaus.plexus.PlexusContainerException; -import org.codehaus.plexus.classworlds.ClassWorld; -import org.codehaus.plexus.component.repository.exception.ComponentLookupException; +import org.codehaus.plexus.logging.LogEnabled; +import org.apache.maven.RepositoryUtils; import org.apache.maven.archetype.catalog.Archetype; import org.apache.maven.archetype.common.ArchetypeArtifactManager; import org.apache.maven.archetype.exception.UnknownArchetype; import org.apache.maven.archetype.metadata.ArchetypeDescriptor; import org.apache.maven.archetype.metadata.RequiredProperty; -import org.apache.maven.archetype.source.ArchetypeDataSource; import org.apache.maven.archetype.source.ArchetypeDataSourceException; -import org.apache.maven.artifact.repository.ArtifactRepository; -import org.apache.maven.project.ProjectBuildingRequest; +import org.apache.maven.archetype.source.InternalCatalogArchetypeDataSource; +import org.apache.maven.archetype.source.LocalCatalogArchetypeDataSource; +import org.apache.maven.archetype.source.RemoteCatalogArchetypeDataSource; +import org.apache.maven.cli.logging.Slf4jLogger; import org.eclipse.m2e.core.embedder.IMaven; +import org.eclipse.m2e.core.embedder.IMavenExecutionContext; import org.eclipse.m2e.core.internal.MavenPluginActivator; import org.eclipse.m2e.core.project.IArchetype; import org.eclipse.m2e.core.ui.internal.M2EUIPluginActivator; @@ -76,6 +83,10 @@ @Component(service = ArchetypePlugin.class) public class ArchetypePlugin { + private static final InternalCatalogArchetypeDataSource INTERNAL_CATALOG = new InternalCatalogArchetypeDataSource(); + + private static final LocalCatalogArchetypeDataSource LOCAL_CATALOG = new LocalCatalogArchetypeDataSource(); + public static final String ARCHETYPE_PREFIX = "archetype"; private final Map catalogs = new LinkedHashMap<>(); @@ -92,9 +103,7 @@ public class ArchetypePlugin { private ArchetypeArtifactManager archetypeArtifactManager; - private Map archetypeDataSourceMap; - - private DefaultPlexusContainer container; + private RemoteCatalogArchetypeDataSource remoteCatalog; public ArchetypePlugin() { this.configFile = new File(MavenPluginActivator.getDefault().getStateLocation().toFile(), @@ -103,25 +112,40 @@ public ArchetypePlugin() { } @Activate - void activate() throws PlexusContainerException, ComponentLookupException { + void activate() { final Module logginModule = new AbstractModule() { @Override protected void configure() { bind(ILoggerFactory.class).toInstance(LoggerFactory.getILoggerFactory()); } }; - final ContainerConfiguration cc = new DefaultContainerConfiguration() // - .setClassWorld(new ClassWorld("plexus.core", ArchetypeArtifactManager.class.getClassLoader())) //$NON-NLS-1$ - .setClassPathScanning(PlexusConstants.SCANNING_INDEX) // - .setAutoWiring(true) // - .setName("plexus"); //$NON-NLS-1$ - container = new DefaultPlexusContainer(cc, logginModule); - archetypeArtifactManager = container.lookup(ArchetypeArtifactManager.class); - archetypeDataSourceMap = container.lookupMap(ArchetypeDataSource.class); - addArchetypeCatalogFactory( - new ArchetypeCatalogFactory.InternalCatalogFactory(archetypeDataSourceMap.get("internal-catalog"))); + Slf4jLogger logger = new Slf4jLogger(LoggerFactory.getILoggerFactory().getLogger("catalog")); + INTERNAL_CATALOG.enableLogging(logger); + LOCAL_CATALOG.enableLogging(logger); + ClassSpace space = new BundleClassSpace(FrameworkUtil.getBundle(ArchetypeArtifactManager.class)); + final Module repositorySystemModule = new AbstractModule() { + @Override + protected void configure() { + try { + bind(RepositorySystem.class).toInstance(MavenPluginActivator.getDefault().getRepositorySystem()); + } catch(CoreException ex) { + ex.printStackTrace(); + } + } + }; + Injector injector = Guice.createInjector( + new WireModule(logginModule, repositorySystemModule, new SpaceModule(space, BeanScanning.INDEX))); + archetypeArtifactManager = injector.getInstance(ArchetypeArtifactManager.class); + if(archetypeArtifactManager instanceof LogEnabled le) { + le.enableLogging(logger); + } + this.remoteCatalog = injector.getInstance(RemoteCatalogArchetypeDataSource.class); + if(remoteCatalog instanceof LogEnabled le) { + le.enableLogging(logger); + } addArchetypeCatalogFactory( - new ArchetypeCatalogFactory.DefaultLocalCatalogFactory(maven, archetypeDataSourceMap.get("catalog"))); + new ArchetypeCatalogFactory.InternalCatalogFactory(INTERNAL_CATALOG)); + addArchetypeCatalogFactory(new ArchetypeCatalogFactory.DefaultLocalCatalogFactory(maven, LOCAL_CATALOG)); for(ArchetypeCatalogFactory archetypeCatalogFactory : ExtensionReader.readArchetypeExtensions(this)) { addArchetypeCatalogFactory(archetypeCatalogFactory); } @@ -135,18 +159,16 @@ protected void configure() { @Deactivate void shutdown() throws IOException { saveCatalogs(); - container.dispose(); } public LocalCatalogFactory newLocalCatalogFactory(String path, String description, boolean editable, boolean enabled) { - return new LocalCatalogFactory(path, description, editable, enabled, maven, archetypeDataSourceMap.get("catalog")); + return new LocalCatalogFactory(path, description, editable, enabled, maven, LOCAL_CATALOG); } public RemoteCatalogFactory newRemoteCatalogFactory(String url, String description, boolean editable, boolean enabled) { - return new RemoteCatalogFactory(url, description, editable, enabled, maven, - archetypeDataSourceMap.get("remote-catalog")); + return new RemoteCatalogFactory(url, description, editable, enabled, maven, remoteCatalog); } public ArchetypeGenerator getGenerator() { @@ -219,36 +241,32 @@ public List getRequiredProperties(IArchetype archetype, IProgr final String artifactId = archetype.getArtifactId(); final String version = archetype.getVersion(); - final List repositories = new ArrayList<>(maven.getArtifactRepositories()); - return maven.createExecutionContext().execute((context, monitor1) -> { - ArtifactRepository localRepository = context.getLocalRepository(); - if(archetypeArtifactManager.isFileSetArchetype(groupId, artifactId, version, null, localRepository, repositories, - context.newProjectBuildingRequest())) { - ArchetypeDescriptor descriptor; - try { - descriptor = archetypeArtifactManager.getFileSetArchetypeDescriptor(groupId, artifactId, version, null, - localRepository, repositories, context.newProjectBuildingRequest()); - } catch(UnknownArchetype ex) { - throw new CoreException(Status.error("UnknownArchetype", ex)); + try { + File archetypeFile = archetypeArtifactManager.getArchetypeFile(groupId, artifactId, version, + getRemoteRepositories(context), context.getRepositorySession()); + if(archetypeArtifactManager.isFileSetArchetype(archetypeFile)) { + ArchetypeDescriptor descriptor = archetypeArtifactManager.getFileSetArchetypeDescriptor(archetypeFile); + return descriptor.getRequiredProperties(); } - return descriptor.getRequiredProperties(); + return null; + } catch(UnknownArchetype ex) { + throw new CoreException(Status.error("UnknownArchetype", ex)); } - return null; }, monitor); } public void updateLocalCatalog(Archetype archetype) throws CoreException { maven.createExecutionContext().execute((ctx, m) -> { - ProjectBuildingRequest request = ctx.newProjectBuildingRequest(); try { - ArchetypeDataSource source = archetypeDataSourceMap.get("catalog"); - - source.updateCatalog(request, archetype); + LOCAL_CATALOG.updateCatalog(ctx.getRepositorySession(), archetype); } catch(ArchetypeDataSourceException e) { } return null; }, null); } + static List getRemoteRepositories(IMavenExecutionContext ctx) throws CoreException { + return RepositoryUtils.toRepos(ctx.getExecutionRequest().getRemoteRepositories()); + } } diff --git a/org.eclipse.m2e.feature/feature.xml b/org.eclipse.m2e.feature/feature.xml index c5adf59544..87cbad0e4c 100644 --- a/org.eclipse.m2e.feature/feature.xml +++ b/org.eclipse.m2e.feature/feature.xml @@ -34,10 +34,6 @@ id="org.eclipse.m2e.archetype.descriptor" version="0.0.0"/> - - diff --git a/org.eclipse.m2e.maven.runtime/pom.xml b/org.eclipse.m2e.maven.runtime/pom.xml index 8c9c800819..132d8d893a 100644 --- a/org.eclipse.m2e.maven.runtime/pom.xml +++ b/org.eclipse.m2e.maven.runtime/pom.xml @@ -21,7 +21,7 @@ org.eclipse.m2e.maven.runtime - 3.9.900-SNAPSHOT + 3.9.901-SNAPSHOT jar M2E Embedded Maven Runtime (includes Incubating components) @@ -202,8 +202,10 @@ org.slf4j.*;version="[1.7.31,3.0.0)",\ javax.inject;version="[1.0.0,2.0.0)",\ javax.annotation;version="[1.2.0,2.0.0)", \ - org.apache.commons.cli;version="[1.4.0,2.0.0)", \ - org.apache.commons.codec* + org.apache.commons.cli;version="[1.4.0,2.0.0)",\ + org.apache.commons.codec*,\ + org.osgi.*,\ + Require-Bundle: \ com.google.guava;bundle-version="32.2.1" diff --git a/pom.xml b/pom.xml index 3ffe83e7c3..e44d1cb5e5 100644 --- a/pom.xml +++ b/pom.xml @@ -99,7 +99,7 @@ org.eclipse.m2e org.eclipse.m2e.maven.runtime - 3.9.900-SNAPSHOT + 3.9.901-SNAPSHOT diff --git a/target-platform/target-platform.target b/target-platform/target-platform.target index 6abfaaaefe..85fbea2631 100644 --- a/target-platform/target-platform.target +++ b/target-platform/target-platform.target @@ -133,60 +133,46 @@ - + org.apache.maven.archetype archetype-common - 3.2.1 + 3.3.1 jar - - - - - org.apache.maven.archetype archetype-catalog - 3.2.1 + 3.3.1 jar org.apache.maven.archetype archetype-descriptor - 3.2.1 - jar - - - org.apache.maven.shared - maven-artifact-transfer - 0.13.1 + 3.3.1 jar