[maven] [IDEA-356114] use maven core extendable ArtifactTypeRegistry in maven 4 server

GitOrigin-RevId: fcf949ea4b6cb097f7ff714b117576a9ef64c9fb
This commit is contained in:
Alexander Bubenchikov
2024-09-18 15:58:46 +02:00
committed by intellij-monorepo-bot
parent d1fa4c9739
commit 11c1678a20
3 changed files with 90 additions and 2 deletions

View File

@@ -3,10 +3,16 @@ package com.intellij.maven.server.m40;
import com.intellij.maven.server.m40.utils.Maven40TransferListenerAdapter;
import com.intellij.maven.server.m40.utils.Maven40WorkspaceMapReader;
import org.apache.maven.api.PathType;
import org.apache.maven.api.Type;
import org.apache.maven.api.services.TypeRegistry;
import org.apache.maven.execution.MavenExecutionRequest;
import org.apache.maven.repository.internal.MavenSessionBuilderSupplier;
import org.apache.maven.repository.internal.type.DefaultType;
import org.eclipse.aether.RepositorySystem;
import org.eclipse.aether.RepositorySystemSession;
import org.eclipse.aether.artifact.ArtifactType;
import org.eclipse.aether.artifact.ArtifactTypeRegistry;
import org.eclipse.aether.repository.LocalRepository;
import org.eclipse.aether.repository.RepositoryPolicy;
import org.eclipse.aether.util.graph.manager.DependencyManagerUtils;
@@ -25,6 +31,7 @@ public class IdeaMavenSessionBuilderSupplier extends MavenSessionBuilderSupplier
private final MavenWorkspaceMap myWorkspaceMap;
private final MavenServerConsoleIndicatorImpl myIndicator;
private final Path myLocalRepoPath;
@NotNull private final TypeRegistry myTypeRegistry;
private final Map<String, String> mySystemProperties = new HashMap<>();
private final Map<String, String> myUserProperties = new HashMap<>();
private final boolean myUpdateSnapshots;
@@ -32,11 +39,13 @@ public class IdeaMavenSessionBuilderSupplier extends MavenSessionBuilderSupplier
public IdeaMavenSessionBuilderSupplier(RepositorySystem repositorySystem,
MavenWorkspaceMap map,
MavenServerConsoleIndicatorImpl indicator,
@NotNull MavenExecutionRequest request) {
@NotNull MavenExecutionRequest request,
@NotNull TypeRegistry typeRegistry) {
super(repositorySystem);
myWorkspaceMap = map;
myIndicator = indicator;
myLocalRepoPath = request.getLocalRepositoryPath().toPath();
myTypeRegistry = typeRegistry;
putAll(request.getSystemProperties(), mySystemProperties);
putAll(request.getUserProperties(), myUserProperties);
myUpdateSnapshots = request.isUpdateSnapshots();
@@ -62,4 +71,30 @@ public class IdeaMavenSessionBuilderSupplier extends MavenSessionBuilderSupplier
session.setMetadataUpdatePolicy(RepositoryPolicy.UPDATE_POLICY_ALWAYS);
}
}
@Override
protected ArtifactTypeRegistry getArtifactTypeRegistry() {
return new TypeRegistryWrapper();
}
private class TypeRegistryWrapper implements ArtifactTypeRegistry {
@Override
public ArtifactType get(String typeId) {
Type type = myTypeRegistry.require(typeId);
if (type instanceof ArtifactType) {
return (ArtifactType)type;
}
if (type != null) {
return new DefaultType(
type.id(),
type.getLanguage(),
type.getExtension(),
type.getClassifier(),
type.isIncludesDependencies(),
type.getPathTypes().toArray(new PathType[0]));
}
return null;
}
}
}

View File

@@ -12,6 +12,7 @@ import org.apache.maven.*;
import org.apache.maven.api.*;
import org.apache.maven.api.services.ArtifactResolver;
import org.apache.maven.api.services.ArtifactResolverResult;
import org.apache.maven.api.services.TypeRegistry;
import org.apache.maven.artifact.Artifact;
import org.apache.maven.artifact.InvalidRepositoryException;
import org.apache.maven.artifact.factory.ArtifactFactory;
@@ -582,7 +583,7 @@ public class Maven40ServerEmbedderImpl extends MavenServerEmbeddedBase {
DefaultSessionFactory factory = getComponent(DefaultSessionFactory.class);
IdeaMavenSessionBuilderSupplier sessionBuilderSupplier =
new IdeaMavenSessionBuilderSupplier(repositorySystem, workspaceMap, indicator, request);
new IdeaMavenSessionBuilderSupplier(repositorySystem, workspaceMap, indicator, request, getComponent(TypeRegistry.class));
try (RepositorySystemSession.CloseableSession repositorySystemSession = sessionBuilderSupplier.get().build()) {
MavenSession mavenSession = new MavenSession(repositorySystemSession, request, result);
InternalSession internalSession = factory.newSession(mavenSession);

View File

@@ -0,0 +1,52 @@
// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package org.jetbrains.idea.maven.importing
import com.intellij.maven.testFramework.MavenMultiVersionImportingTestCase
import kotlinx.coroutines.runBlocking
import org.junit.Test
class MavenCustomArtifactTypeImportingTest : MavenMultiVersionImportingTestCase() {
@Test
fun `should import dependency with custom plugin type`() = runBlocking {
importProjectAsync("""
<groupId>test</groupId>
<artifactId>project</artifactId>
<version>1.0</version>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>org.sonarsource.java</groupId>
<artifactId>sonar-java-plugin</artifactId>
<version>8.1.0.36477</version>
<scope>provided</scope>
<type>sonar-plugin</type>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.sonarsource.sonar-packaging-maven-plugin</groupId>
<artifactId>sonar-packaging-maven-plugin</artifactId>
<version>1.23.0.740</version>
<extensions>true</extensions>
</plugin>
</plugins>
</build>
""")
assertModules("project")
val project = projectsManager.findProject(projectPom)
assertNotNull(project)
assertEmpty(project!!.problems)
}
}