diff --git a/plugins/maven/maven-server-api/src/org/jetbrains/idea/maven/server/MavenArtifactResolveResult.java b/plugins/maven/maven-server-api/src/org/jetbrains/idea/maven/server/MavenArtifactResolveResult.java new file mode 100644 index 000000000000..9478900b99d6 --- /dev/null +++ b/plugins/maven/maven-server-api/src/org/jetbrains/idea/maven/server/MavenArtifactResolveResult.java @@ -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 mavenResolvedArtifacts; + @Nullable public final MavenProjectProblem problem; + + public MavenArtifactResolveResult(@NotNull List artifacts, @Nullable MavenProjectProblem problem) { + this.mavenResolvedArtifacts = artifacts; + this.problem = problem; + } +} diff --git a/plugins/maven/maven-server-api/src/org/jetbrains/idea/maven/server/MavenServerEmbedder.java b/plugins/maven/maven-server-api/src/org/jetbrains/idea/maven/server/MavenServerEmbedder.java index fb481fde34ad..ca897ce753c1 100644 --- a/plugins/maven/maven-server-api/src/org/jetbrains/idea/maven/server/MavenServerEmbedder.java +++ b/plugins/maven/maven-server-api/src/org/jetbrains/idea/maven/server/MavenServerEmbedder.java @@ -65,7 +65,10 @@ public interface MavenServerEmbedder extends Remote { MavenArtifact resolve(@NotNull MavenArtifactInfo info, @NotNull List remoteRepositories, MavenToken token) throws RemoteException, MavenServerProcessCanceledException; - + /** + * @deprecated use {@link Maven3XServerEmbedder#resolveArtifactTransitively()} + */ + @Deprecated @NotNull List resolveTransitively(@NotNull List artifacts, @NotNull List remoteRepositories, MavenToken token) throws @@ -111,4 +114,10 @@ public interface MavenServerEmbedder extends Remote { Map resolveAndGetArchetypeDescriptor(@NotNull String groupId, @NotNull String artifactId, @NotNull String version, @NotNull List repositories, @Nullable String url, MavenToken token) throws RemoteException; + + @NotNull + MavenArtifactResolveResult resolveArtifactTransitively( + @NotNull List artifacts, + @NotNull List remoteRepositories, + MavenToken token) throws RemoteException; } diff --git a/plugins/maven/maven2-server-impl/src/org/jetbrains/idea/maven/server/embedder/Maven2ServerEmbedderImpl.java b/plugins/maven/maven2-server-impl/src/org/jetbrains/idea/maven/server/embedder/Maven2ServerEmbedderImpl.java index bb4d965380b3..5aecd658197f 100644 --- a/plugins/maven/maven2-server-impl/src/org/jetbrains/idea/maven/server/embedder/Maven2ServerEmbedderImpl.java +++ b/plugins/maven/maven2-server-impl/src/org/jetbrains/idea/maven/server/embedder/Maven2ServerEmbedderImpl.java @@ -405,6 +405,35 @@ public final class Maven2ServerEmbedderImpl extends MavenRemoteObject implements return Collections.emptyList(); } + @NotNull + @Override + public MavenArtifactResolveResult resolveArtifactTransitively(@NotNull List artifacts, + @NotNull List remoteRepositories, + MavenToken token) throws RemoteException { + MavenServerUtil.checkToken(token); + try { + Set toResolve = new LinkedHashSet(); + for (MavenArtifactInfo each : artifacts) { + toResolve.add(createArtifact(each)); + } + + return new MavenArtifactResolveResult( + Maven2ModelConverter.convertArtifacts(myImpl.resolveTransitively(toResolve, convertRepositories(remoteRepositories)), + new HashMap(), 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.emptyList(), null); + } + @NotNull private MavenArtifact doResolve(MavenArtifactInfo info, List remoteRepositories) throws RemoteException { Artifact resolved = doResolve(createArtifact(info), convertRepositories(remoteRepositories)); diff --git a/plugins/maven/maven3-server-impl/src/org/jetbrains/idea/maven/server/Maven3XServerEmbedder.java b/plugins/maven/maven3-server-impl/src/org/jetbrains/idea/maven/server/Maven3XServerEmbedder.java index e83f9c423850..34db7d9d94b0 100644 --- a/plugins/maven/maven3-server-impl/src/org/jetbrains/idea/maven/server/Maven3XServerEmbedder.java +++ b/plugins/maven/maven3-server-impl/src/org/jetbrains/idea/maven/server/Maven3XServerEmbedder.java @@ -1321,6 +1321,7 @@ public abstract class Maven3XServerEmbedder extends Maven3ServerEmbedder { return doResolve(info, remoteRepositories); } + @Deprecated @NotNull @Override public List resolveTransitively(@NotNull final List artifacts, @@ -1346,6 +1347,46 @@ public abstract class Maven3XServerEmbedder extends Maven3ServerEmbedder { } } + @NotNull + @Override + public MavenArtifactResolveResult resolveArtifactTransitively( + @NotNull final List artifacts, + @NotNull final List remoteRepositories, + MavenToken token) throws RemoteException { + MavenServerUtil.checkToken(token); + + try { + final MavenExecutionRequest request = createRequest(null, null, null, null); + + final List[] 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.emptyList(), problem); + } + } + @NotNull private List doResolveTransitively(@NotNull List artifacts, @NotNull List remoteRepositories) throws RemoteException { @@ -1370,6 +1411,24 @@ public abstract class Maven3XServerEmbedder extends Maven3ServerEmbedder { } } + @NotNull + private List doResolveTransitivelyWithError(@NotNull List artifacts, + @NotNull List remoteRepositories) + throws RemoteException, ArtifactResolutionException, ArtifactNotFoundException { + Set toResolve = new LinkedHashSet(); + for (MavenArtifactInfo each : artifacts) { + toResolve.add(createArtifact(each)); + } + + Artifact project = getComponent(ArtifactFactory.class).createBuildArtifact("temp", "temp", "666", "pom"); + + Set res = getComponent(ArtifactResolver.class) + .resolveTransitively(toResolve, project, Collections.EMPTY_MAP, myLocalRepository, convertRepositories(remoteRepositories), + getComponent(ArtifactMetadataSource.class)).getArtifacts(); + + return MavenModelConverter.convertArtifacts(res, new HashMap(), getLocalRepositoryFile()); + } + @Override public Collection resolvePlugin(@NotNull final MavenPlugin plugin, @NotNull final List repositories, diff --git a/plugins/maven/maven30-server-impl/src/org/jetbrains/idea/maven/server/Maven30ServerEmbedderImpl.java b/plugins/maven/maven30-server-impl/src/org/jetbrains/idea/maven/server/Maven30ServerEmbedderImpl.java index 5931fbde0aea..ec8d056ff64f 100644 --- a/plugins/maven/maven30-server-impl/src/org/jetbrains/idea/maven/server/Maven30ServerEmbedderImpl.java +++ b/plugins/maven/maven30-server-impl/src/org/jetbrains/idea/maven/server/Maven30ServerEmbedderImpl.java @@ -1028,6 +1028,14 @@ public class Maven30ServerEmbedderImpl extends Maven3ServerEmbedder { } } + @NotNull + @Override + public MavenArtifactResolveResult resolveArtifactTransitively(@NotNull List artifacts, + @NotNull List remoteRepositories, + MavenToken token) throws RemoteException { + return new MavenArtifactResolveResult(resolveTransitively(artifacts, remoteRepositories, token), null); + } + @Override public Collection resolvePlugin(@NotNull final MavenPlugin plugin, @NotNull final List repositories, diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/MavenCompilerAnnotationProcessorPathsImporter.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/MavenCompilerAnnotationProcessorPathsImporter.java index 678a5d247c43..5a28150e00bc 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/MavenCompilerAnnotationProcessorPathsImporter.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/MavenCompilerAnnotationProcessorPathsImporter.java @@ -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 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); diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenResolveResultProblemProcessor.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenResolveResultProblemProcessor.java index f6a3840667a4..a5ca5001678e 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenResolveResultProblemProcessor.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenResolveResultProblemProcessor.java @@ -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 results) { + public static MavenResolveProblemHolder getProblems(@NotNull Collection results) { Set repositoryBlockedProblems = new HashSet<>(); Set unresolvedArtifactProblems = new HashSet<>(); Set unresolvedArtifacts = new HashSet<>(); diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/server/DummyMavenServerConnector.kt b/plugins/maven/src/main/java/org/jetbrains/idea/maven/server/DummyMavenServerConnector.kt index 59fff36e47b3..bf7cad1448e2 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/server/DummyMavenServerConnector.kt +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/server/DummyMavenServerConnector.kt @@ -216,6 +216,12 @@ class DummyEmbedder(val myProject: Project) : MavenServerEmbedder { return emptyList() } + override fun resolveArtifactTransitively(artifacts: MutableList, + remoteRepositories: MutableList, + token: MavenToken?): MavenArtifactResolveResult { + return MavenArtifactResolveResult(emptyList(), null) + } + override fun resolvePlugin(plugin: MavenPlugin, repositories: List, nativeMavenProjectId: Int, diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/server/MavenEmbedderWrapper.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/server/MavenEmbedderWrapper.java index d53314d4c5b7..1ef7cdcdd131 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/server/MavenEmbedderWrapper.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/server/MavenEmbedderWrapper.java @@ -227,6 +227,10 @@ public abstract class MavenEmbedderWrapper extends MavenRemoteObjectWrapper getOrCreateWrappee().resolve(info, remoteRepositories, ourToken)); } + /** + * @deprecated use {@link MavenEmbedderWrapper#resolveArtifactTransitively()} + */ + @Deprecated @NotNull public List resolveTransitively( @NotNull final List artifacts, @@ -235,6 +239,13 @@ public abstract class MavenEmbedderWrapper extends MavenRemoteObjectWrapper getOrCreateWrappee().resolveTransitively(artifacts, remoteRepositories, ourToken)); } + @NotNull + public MavenArtifactResolveResult resolveArtifactTransitively( + @NotNull final List artifacts, + @NotNull final List remoteRepositories) throws MavenProcessCanceledException { + return performCancelable(() -> getOrCreateWrappee().resolveArtifactTransitively(artifacts, remoteRepositories, ourToken)); + } + @NotNull public List retrieveVersions(@NotNull final String groupId, @NotNull final String artifactId,