[maven] IDEA-285623 Maven import does not handle annotationProcessorPaths

fixed error handler for transitive resolve

GitOrigin-RevId: 9c38777d87edb4b7cdfc190d2c53bc98b9c4de7b
This commit is contained in:
grigoriy.myasoedov
2022-03-05 10:18:52 +00:00
committed by intellij-monorepo-bot
parent acabf004fc
commit 51260046c1
9 changed files with 188 additions and 6 deletions
@@ -0,0 +1,34 @@
/*
* Copyright 2000-2009 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jetbrains.idea.maven.server;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.idea.maven.model.MavenArtifact;
import org.jetbrains.idea.maven.model.MavenProjectProblem;
import java.io.Serializable;
import java.util.List;
public class MavenArtifactResolveResult implements Serializable {
@NotNull public final List<MavenArtifact> mavenResolvedArtifacts;
@Nullable public final MavenProjectProblem problem;
public MavenArtifactResolveResult(@NotNull List<MavenArtifact> artifacts, @Nullable MavenProjectProblem problem) {
this.mavenResolvedArtifacts = artifacts;
this.problem = problem;
}
}
@@ -65,7 +65,10 @@ public interface MavenServerEmbedder extends Remote {
MavenArtifact resolve(@NotNull MavenArtifactInfo info,
@NotNull List<MavenRemoteRepository> remoteRepositories, MavenToken token) throws RemoteException,
MavenServerProcessCanceledException;
/**
* @deprecated use {@link Maven3XServerEmbedder#resolveArtifactTransitively()}
*/
@Deprecated
@NotNull
List<MavenArtifact> resolveTransitively(@NotNull List<MavenArtifactInfo> artifacts,
@NotNull List<MavenRemoteRepository> remoteRepositories, MavenToken token) throws
@@ -111,4 +114,10 @@ public interface MavenServerEmbedder extends Remote {
Map<String, String> resolveAndGetArchetypeDescriptor(@NotNull String groupId, @NotNull String artifactId, @NotNull String version,
@NotNull List<MavenRemoteRepository> repositories,
@Nullable String url, MavenToken token) throws RemoteException;
@NotNull
MavenArtifactResolveResult resolveArtifactTransitively(
@NotNull List<MavenArtifactInfo> artifacts,
@NotNull List<MavenRemoteRepository> remoteRepositories,
MavenToken token) throws RemoteException;
}
@@ -405,6 +405,35 @@ public final class Maven2ServerEmbedderImpl extends MavenRemoteObject implements
return Collections.emptyList();
}
@NotNull
@Override
public MavenArtifactResolveResult resolveArtifactTransitively(@NotNull List<MavenArtifactInfo> artifacts,
@NotNull List<MavenRemoteRepository> remoteRepositories,
MavenToken token) throws RemoteException {
MavenServerUtil.checkToken(token);
try {
Set<Artifact> toResolve = new LinkedHashSet<Artifact>();
for (MavenArtifactInfo each : artifacts) {
toResolve.add(createArtifact(each));
}
return new MavenArtifactResolveResult(
Maven2ModelConverter.convertArtifacts(myImpl.resolveTransitively(toResolve, convertRepositories(remoteRepositories)),
new HashMap<Artifact, MavenArtifact>(), getLocalRepositoryFile())
, null);
}
catch (ArtifactResolutionException e) {
Maven2ServerGlobals.getLogger().info(e);
}
catch (ArtifactNotFoundException e) {
Maven2ServerGlobals.getLogger().info(e);
}
catch (Exception e) {
throw rethrowException(e);
}
return new MavenArtifactResolveResult(Collections.<MavenArtifact>emptyList(), null);
}
@NotNull
private MavenArtifact doResolve(MavenArtifactInfo info, List<MavenRemoteRepository> remoteRepositories) throws RemoteException {
Artifact resolved = doResolve(createArtifact(info), convertRepositories(remoteRepositories));
@@ -1321,6 +1321,7 @@ public abstract class Maven3XServerEmbedder extends Maven3ServerEmbedder {
return doResolve(info, remoteRepositories);
}
@Deprecated
@NotNull
@Override
public List<MavenArtifact> resolveTransitively(@NotNull final List<MavenArtifactInfo> artifacts,
@@ -1346,6 +1347,46 @@ public abstract class Maven3XServerEmbedder extends Maven3ServerEmbedder {
}
}
@NotNull
@Override
public MavenArtifactResolveResult resolveArtifactTransitively(
@NotNull final List<MavenArtifactInfo> artifacts,
@NotNull final List<MavenRemoteRepository> remoteRepositories,
MavenToken token) throws RemoteException {
MavenServerUtil.checkToken(token);
try {
final MavenExecutionRequest request = createRequest(null, null, null, null);
final List<MavenArtifact>[] mavenArtifacts = new List[]{null};
executeWithMavenSession(request, new Runnable() {
@Override
public void run() {
try {
mavenArtifacts[0] = Maven3XServerEmbedder.this.doResolveTransitivelyWithError(artifacts, remoteRepositories);
}
catch (Exception e) {
throw new RuntimeException(e);
}
}
});
return new MavenArtifactResolveResult(mavenArtifacts[0], null);
}
catch (Exception e) {
Maven3ServerGlobals.getLogger().error(e);
Artifact transferArtifact = getProblemTransferArtifact(e);
String message = getRootMessage(e);
MavenProjectProblem problem;
if (transferArtifact != null) {
MavenArtifact mavenArtifact = MavenModelConverter.convertArtifact(transferArtifact, getLocalRepositoryFile());
problem = MavenProjectProblem.createRepositoryProblem("", message, true, mavenArtifact);
} else {
problem = MavenProjectProblem.createStructureProblem("", message);
}
return new MavenArtifactResolveResult(Collections.<MavenArtifact>emptyList(), problem);
}
}
@NotNull
private List<MavenArtifact> doResolveTransitively(@NotNull List<MavenArtifactInfo> artifacts,
@NotNull List<MavenRemoteRepository> remoteRepositories) throws RemoteException {
@@ -1370,6 +1411,24 @@ public abstract class Maven3XServerEmbedder extends Maven3ServerEmbedder {
}
}
@NotNull
private List<MavenArtifact> doResolveTransitivelyWithError(@NotNull List<MavenArtifactInfo> artifacts,
@NotNull List<MavenRemoteRepository> remoteRepositories)
throws RemoteException, ArtifactResolutionException, ArtifactNotFoundException {
Set<Artifact> toResolve = new LinkedHashSet<Artifact>();
for (MavenArtifactInfo each : artifacts) {
toResolve.add(createArtifact(each));
}
Artifact project = getComponent(ArtifactFactory.class).createBuildArtifact("temp", "temp", "666", "pom");
Set<Artifact> res = getComponent(ArtifactResolver.class)
.resolveTransitively(toResolve, project, Collections.EMPTY_MAP, myLocalRepository, convertRepositories(remoteRepositories),
getComponent(ArtifactMetadataSource.class)).getArtifacts();
return MavenModelConverter.convertArtifacts(res, new HashMap<Artifact, MavenArtifact>(), getLocalRepositoryFile());
}
@Override
public Collection<MavenArtifact> resolvePlugin(@NotNull final MavenPlugin plugin,
@NotNull final List<MavenRemoteRepository> repositories,
@@ -1028,6 +1028,14 @@ public class Maven30ServerEmbedderImpl extends Maven3ServerEmbedder {
}
}
@NotNull
@Override
public MavenArtifactResolveResult resolveArtifactTransitively(@NotNull List<MavenArtifactInfo> artifacts,
@NotNull List<MavenRemoteRepository> remoteRepositories,
MavenToken token) throws RemoteException {
return new MavenArtifactResolveResult(resolveTransitively(artifacts, remoteRepositories, token), null);
}
@Override
public Collection<MavenArtifact> resolvePlugin(@NotNull final MavenPlugin plugin,
@NotNull final List<MavenRemoteRepository> repositories,
@@ -11,10 +11,10 @@ import com.intellij.util.containers.ContainerUtil;
import org.jdom.Element;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.idea.maven.execution.SyncBundle;
import org.jetbrains.idea.maven.model.MavenArtifact;
import org.jetbrains.idea.maven.model.MavenArtifactInfo;
import org.jetbrains.idea.maven.model.MavenId;
import org.jetbrains.idea.maven.project.*;
import org.jetbrains.idea.maven.server.MavenArtifactResolveResult;
import org.jetbrains.idea.maven.server.MavenEmbedderWrapper;
import org.jetbrains.idea.maven.server.NativeMavenProjectHolder;
import org.jetbrains.idea.maven.utils.MavenProcessCanceledException;
@@ -105,8 +105,13 @@ public class MavenCompilerAnnotationProcessorPathsImporter extends MavenImporter
}
try {
List<MavenArtifact> annotationProcessors = embedder.resolveTransitively(externalArtifacts, mavenProject.getRemoteRepositories());
mavenProject.addAnnotationProcessors(annotationProcessors);
MavenArtifactResolveResult annotationProcessors = embedder
.resolveArtifactTransitively(externalArtifacts, mavenProject.getRemoteRepositories());
if (annotationProcessors.problem != null) {
MavenResolveResultProblemProcessor.notifySyncForProblem(project, annotationProcessors.problem);
} else {
mavenProject.addAnnotationProcessors(annotationProcessors.mavenResolvedArtifacts);
}
}
catch (Exception e) {
String message = e.getMessage() != null ? e.getMessage() : ExceptionUtil.getThrowableText(e);
@@ -6,6 +6,7 @@ import com.intellij.openapi.project.Project;
import org.jetbrains.annotations.ApiStatus;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.idea.maven.buildtool.MavenSyncConsole;
import org.jetbrains.idea.maven.execution.SyncBundle;
import org.jetbrains.idea.maven.externalSystemIntegration.output.importproject.quickfixes.RepositoryBlockedSyncIssue;
import org.jetbrains.idea.maven.model.MavenArtifact;
import org.jetbrains.idea.maven.model.MavenProjectProblem;
@@ -21,7 +22,7 @@ public class MavenResolveResultProblemProcessor {
private static final String BLOCKED_MIRROR_FOR_REPOSITORIES = "Blocked mirror for repositories:";
public static void notifySyncForProblem(@NotNull Project project,
@NotNull MavenResolveResultProblemProcessor.MavenResolveProblemHolder problem) {
@NotNull MavenResolveProblemHolder problem) {
if (problem.isEmpty()) return;
MavenSyncConsole syncConsole = MavenProjectsManager.getInstance(project).getSyncConsole();
@@ -39,6 +40,26 @@ public class MavenResolveResultProblemProcessor {
}
}
public static void notifySyncForProblem(@NotNull Project project, @NotNull MavenProjectProblem problem) {
MavenSyncConsole syncConsole = MavenProjectsManager.getInstance(project).getSyncConsole();
String message = problem.getDescription();
if (message == null) return;
if (message.contains(BLOCKED_MIRROR_FOR_REPOSITORIES)) {
BuildIssue buildIssue = RepositoryBlockedSyncIssue.getIssue(project, problem.getDescription());
syncConsole.getListener(MavenServerProgressIndicator.ResolveType.DEPENDENCY)
.showBuildIssue(buildIssue.getTitle(), buildIssue);
} else if (problem.getMavenArtifact() == null) {
MavenProjectsManager.getInstance(project).getSyncConsole()
.addWarning(SyncBundle.message("maven.sync.annotation.processor.problem"), message);
}
if (problem.getMavenArtifact() != null) {
syncConsole.getListener(MavenServerProgressIndicator.ResolveType.DEPENDENCY)
.showArtifactBuildIssue(problem.getMavenArtifact().getMavenId().getKey(), message);
}
}
public static void notifyMavenProblems(@NotNull Project project) {
MavenProjectsManager projectsManager = MavenProjectsManager.getInstance(project);
MavenSyncConsole syncConsole = projectsManager.getSyncConsole();
@@ -50,7 +71,7 @@ public class MavenResolveResultProblemProcessor {
}
@NotNull
public static MavenResolveResultProblemProcessor.MavenResolveProblemHolder getProblems(@NotNull Collection<MavenProjectReaderResult> results) {
public static MavenResolveProblemHolder getProblems(@NotNull Collection<MavenProjectReaderResult> results) {
Set<MavenProjectProblem> repositoryBlockedProblems = new HashSet<>();
Set<MavenProjectProblem> unresolvedArtifactProblems = new HashSet<>();
Set<MavenArtifact> unresolvedArtifacts = new HashSet<>();
@@ -216,6 +216,12 @@ class DummyEmbedder(val myProject: Project) : MavenServerEmbedder {
return emptyList()
}
override fun resolveArtifactTransitively(artifacts: MutableList<MavenArtifactInfo>,
remoteRepositories: MutableList<MavenRemoteRepository>,
token: MavenToken?): MavenArtifactResolveResult {
return MavenArtifactResolveResult(emptyList(), null)
}
override fun resolvePlugin(plugin: MavenPlugin,
repositories: List<MavenRemoteRepository>,
nativeMavenProjectId: Int,
@@ -227,6 +227,10 @@ public abstract class MavenEmbedderWrapper extends MavenRemoteObjectWrapper<Mave
return performCancelable(() -> getOrCreateWrappee().resolve(info, remoteRepositories, ourToken));
}
/**
* @deprecated use {@link MavenEmbedderWrapper#resolveArtifactTransitively()}
*/
@Deprecated
@NotNull
public List<MavenArtifact> resolveTransitively(
@NotNull final List<MavenArtifactInfo> artifacts,
@@ -235,6 +239,13 @@ public abstract class MavenEmbedderWrapper extends MavenRemoteObjectWrapper<Mave
return performCancelable(() -> getOrCreateWrappee().resolveTransitively(artifacts, remoteRepositories, ourToken));
}
@NotNull
public MavenArtifactResolveResult resolveArtifactTransitively(
@NotNull final List<MavenArtifactInfo> artifacts,
@NotNull final List<MavenRemoteRepository> remoteRepositories) throws MavenProcessCanceledException {
return performCancelable(() -> getOrCreateWrappee().resolveArtifactTransitively(artifacts, remoteRepositories, ourToken));
}
@NotNull
public List<String> retrieveVersions(@NotNull final String groupId,
@NotNull final String artifactId,