diff --git a/plugins/maven/maven3-server-impl/src/org/jetbrains/idea/maven/server/Maven3ServerEmbedderImpl.java b/plugins/maven/maven3-server-impl/src/org/jetbrains/idea/maven/server/Maven3ServerEmbedderImpl.java index 385c310a6ed3..0a4b52e81706 100644 --- a/plugins/maven/maven3-server-impl/src/org/jetbrains/idea/maven/server/Maven3ServerEmbedderImpl.java +++ b/plugins/maven/maven3-server-impl/src/org/jetbrains/idea/maven/server/Maven3ServerEmbedderImpl.java @@ -350,17 +350,23 @@ public class Maven3ServerEmbedderImpl extends MavenRemoteObject implements Maven MavenProject project = buildingResult.getProject(); - // copied from DefaultLifecycleExecutor.execute - loadExtensions(project); - //findExtensions(project); - // end copied from DefaultLifecycleExecutor.execute + RepositorySystemSession repositorySession = getComponent(LegacySupport.class).getRepositorySession(); + if (repositorySession instanceof DefaultRepositorySystemSession) { + ((DefaultRepositorySystemSession)repositorySession).setTransferListener(new TransferListenerAdapter(myCurrentIndicator)); + + if (myWorkspaceMap != null) { + ((DefaultRepositorySystemSession)repositorySession).setWorkspaceReader(new Maven3WorkspaceReader(myWorkspaceMap)); + } + } + + List exceptions = new ArrayList(); + loadExtensions(project, exceptions); //Artifact projectArtifact = project.getArtifact(); //Map managedVersions = project.getManagedVersionMap(); //ArtifactMetadataSource metadataSource = getComponent(ArtifactMetadataSource.class); project.setDependencyArtifacts(project.createArtifacts(getComponent(ArtifactFactory.class), null, null)); // - ArtifactResolver resolver = getComponent(ArtifactResolver.class); ArtifactResolutionRequest resolutionRequest = new ArtifactResolutionRequest(); resolutionRequest.setArtifactDependencies(project.getDependencyArtifacts()); @@ -373,20 +379,12 @@ public class Maven3ServerEmbedderImpl extends MavenRemoteObject implements Maven resolutionRequest.setResolveRoot(false); resolutionRequest.setResolveTransitively(true); - RepositorySystemSession repositorySession = getComponent(LegacySupport.class).getRepositorySession(); - if (repositorySession instanceof DefaultRepositorySystemSession) { - ((DefaultRepositorySystemSession)repositorySession).setTransferListener(new TransferListenerAdapter(myCurrentIndicator)); - - if (myWorkspaceMap != null) { - ((DefaultRepositorySystemSession)repositorySession).setWorkspaceReader(new Maven3WorkspaceReader(myWorkspaceMap)); - } - } - + ArtifactResolver resolver = getComponent(ArtifactResolver.class); ArtifactResolutionResult result = resolver.resolve(resolutionRequest); project.setArtifacts(result.getArtifacts()); // end copied from DefaultMavenProjectBuilder.buildWithDependencies - ref.set(new MavenExecutionResult(project, new ArrayList())); + ref.set(new MavenExecutionResult(project, exceptions)); } catch (Exception e) { ref.set(handleException(e)); @@ -398,7 +396,7 @@ public class Maven3ServerEmbedderImpl extends MavenRemoteObject implements Maven } /** adapted from {@link org.apache.maven.DefaultMaven#doExecute(org.apache.maven.execution.MavenExecutionRequest)} */ - private void loadExtensions(MavenProject project) { + private void loadExtensions(MavenProject project, List exceptions) { ClassLoader originalClassLoader = Thread.currentThread().getContextClassLoader(); Collection lifecycleParticipants = getLifecycleParticipants(Arrays.asList(project)); if (!lifecycleParticipants.isEmpty()) { @@ -407,17 +405,17 @@ public class Maven3ServerEmbedderImpl extends MavenRemoteObject implements Maven session.setCurrentProject(project); session.setProjects(Arrays.asList(project)); - try { - for (AbstractMavenLifecycleParticipant listener : lifecycleParticipants) { - Thread.currentThread().setContextClassLoader(listener.getClass().getClassLoader()); + for (AbstractMavenLifecycleParticipant listener : lifecycleParticipants) { + Thread.currentThread().setContextClassLoader(listener.getClass().getClassLoader()); + try { listener.afterProjectsRead(session); } - } - catch (MavenExecutionException e) { - throw new RuntimeException(e); - } - finally { - Thread.currentThread().setContextClassLoader(originalClassLoader); + catch (MavenExecutionException e) { + exceptions.add(e); + } + finally { + Thread.currentThread().setContextClassLoader(originalClassLoader); + } } } } diff --git a/plugins/maven/src/test/data/plugins/intellij/test/maven-extension/1.0/maven-extension-1.0-sources.jar b/plugins/maven/src/test/data/plugins/intellij/test/maven-extension/1.0/maven-extension-1.0-sources.jar new file mode 100644 index 000000000000..15b3b6cc5e7c Binary files /dev/null and b/plugins/maven/src/test/data/plugins/intellij/test/maven-extension/1.0/maven-extension-1.0-sources.jar differ diff --git a/plugins/maven/src/test/data/plugins/intellij/test/maven-extension/1.0/maven-extension-1.0.jar b/plugins/maven/src/test/data/plugins/intellij/test/maven-extension/1.0/maven-extension-1.0.jar new file mode 100644 index 000000000000..f9c570b154e9 Binary files /dev/null and b/plugins/maven/src/test/data/plugins/intellij/test/maven-extension/1.0/maven-extension-1.0.jar differ diff --git a/plugins/maven/src/test/data/plugins/intellij/test/maven-extension/1.0/maven-extension-1.0.pom b/plugins/maven/src/test/data/plugins/intellij/test/maven-extension/1.0/maven-extension-1.0.pom new file mode 100644 index 000000000000..510cdec7dff2 --- /dev/null +++ b/plugins/maven/src/test/data/plugins/intellij/test/maven-extension/1.0/maven-extension-1.0.pom @@ -0,0 +1,40 @@ + + 4.0.0 + + intellij.test + maven-extension + 1.0 + jar + + + + + org.codehaus.plexus + plexus-component-metadata + 1.5.5 + + + + generate-metadata + + + + + + + + + + org.apache.maven + maven-core + 3.0.3 + provided + + + org.codehaus.plexus + plexus-component-annotations + 1.5.5 + provided + + + diff --git a/plugins/maven/src/test/data/plugins/org/codehaus/plexus/plexus-utils/1.1/plexus-utils-1.1.jar b/plugins/maven/src/test/data/plugins/org/codehaus/plexus/plexus-utils/1.1/plexus-utils-1.1.jar new file mode 100644 index 000000000000..5c50e1779f7e Binary files /dev/null and b/plugins/maven/src/test/data/plugins/org/codehaus/plexus/plexus-utils/1.1/plexus-utils-1.1.jar differ diff --git a/plugins/maven/src/test/data/plugins/org/codehaus/plexus/plexus-utils/1.1/plexus-utils-1.1.pom b/plugins/maven/src/test/data/plugins/org/codehaus/plexus/plexus-utils/1.1/plexus-utils-1.1.pom new file mode 100644 index 000000000000..6cf9079989bf --- /dev/null +++ b/plugins/maven/src/test/data/plugins/org/codehaus/plexus/plexus-utils/1.1/plexus-utils-1.1.pom @@ -0,0 +1,27 @@ + + + plexus + org.codehaus.plexus + 1.0.4 + + 4.0.0 + plexus-utils + Plexus Common Utilities + 1.1 + + + + maven-surefire-plugin + + + org/codehaus/plexus/util/FileBasedTestCase.java + **/Test*.java + + + + + + + deployed + + \ No newline at end of file diff --git a/plugins/maven/src/test/java/org/jetbrains/idea/maven/importing/MiscImportingTest.java b/plugins/maven/src/test/java/org/jetbrains/idea/maven/importing/MiscImportingTest.java index bb842bae76ea..3ef946c1cad3 100644 --- a/plugins/maven/src/test/java/org/jetbrains/idea/maven/importing/MiscImportingTest.java +++ b/plugins/maven/src/test/java/org/jetbrains/idea/maven/importing/MiscImportingTest.java @@ -24,7 +24,9 @@ import com.intellij.openapi.roots.ModuleRootListener; import org.jetbrains.idea.maven.MavenCustomRepositoryHelper; import org.jetbrains.idea.maven.MavenImportingTestCase; import org.jetbrains.idea.maven.model.MavenProjectProblem; +import org.jetbrains.idea.maven.project.MavenProject; import org.jetbrains.idea.maven.server.MavenServerManager; +import org.jetbrains.idea.maven.server.MavenServerManagerHelper; import java.io.File; import java.util.List; @@ -270,6 +272,61 @@ public class MiscImportingTest extends MavenImportingTestCase { assertEquals(0, myProjectsTree.getRootProjects().get(0).getProblems().size()); } + public void testMavenExtensionsAreLoadedAndAfterProjectsReadIsCalled() throws Exception { + MavenCustomRepositoryHelper helper = new MavenCustomRepositoryHelper(myDir, "plugins"); + setRepositoryPath(helper.getTestDataPath("plugins")); + getMavenGeneralSettings().setWorkOffline(true); + MavenServerManagerHelper.connectToMaven3Server(); + + importProjectWithMaven3("test" + + "project" + + "1" + + "" + + "" + + " " + + " " + + " intellij.test" + + " maven-extension" + + " 1.0" + + " " + + " " + + ""); + + List projects = myProjectsTree.getProjects(); + assertEquals(1, projects.size()); + MavenProject mavenProject = projects.get(0); + assertEquals("Name for test:project generated by MyMavenExtension.", mavenProject.getFinalName()); + + assertEquals(myProjectPom.getPath(), mavenProject.getProperties().getProperty("workspace-info")); + } + + public void testExceptionsFromMavenExtensionsAreReportedAsProblems() throws Exception { + MavenCustomRepositoryHelper helper = new MavenCustomRepositoryHelper(myDir, "plugins"); + setRepositoryPath(helper.getTestDataPath("plugins")); + getMavenGeneralSettings().setWorkOffline(true); + + importProjectWithMaven3("test" + + "project" + + "1" + + "throw!" + + "" + + "" + + " " + + " " + + " intellij.test" + + " maven-extension" + + " 1.0" + + " " + + " " + + ""); + + List projects = myProjectsTree.getProjects(); + assertEquals(1, projects.size()); + MavenProject mavenProject = projects.get(0); + assertEquals(1, mavenProject.getProblems().size()); + assertEquals("throw!", mavenProject.getProblems().get(0).getDescription()); + } + public void testCheckingIfModuleIsNotDisposedBeforeCommitOnImport() throws Exception { if (ignore()) return; @@ -312,4 +369,14 @@ public class MiscImportingTest extends MavenImportingTestCase { assertEquals(count, rootsChangedCount); assertEquals(rootsChangedCount, beforeRootsChangedCount); } + + private void importProjectWithMaven3(String xml) throws Exception { + MavenServerManagerHelper.connectToMaven3Server(); + try { + importProject(xml); + } + finally { + MavenServerManagerHelper.disconnectFromServer(); + } + } } diff --git a/plugins/maven/src/test/java/org/jetbrains/idea/maven/server/MavenServerManagerHelper.java b/plugins/maven/src/test/java/org/jetbrains/idea/maven/server/MavenServerManagerHelper.java new file mode 100644 index 000000000000..07478ea96aec --- /dev/null +++ b/plugins/maven/src/test/java/org/jetbrains/idea/maven/server/MavenServerManagerHelper.java @@ -0,0 +1,45 @@ +/* + * Copyright 2000-2014 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 com.intellij.openapi.application.ApplicationManager; +import com.intellij.openapi.application.impl.ApplicationImpl; + +import java.rmi.RemoteException; + +public class MavenServerManagerHelper { + /** {@link MavenServerManager#collectClassPathAndLibsFolder()} forces maven2 in test mode; we want maven3. */ + public static MavenServer connectToMaven3Server() throws RemoteException { + ApplicationImpl application = (ApplicationImpl)ApplicationManager.getApplication(); + MavenServerManager msm = MavenServerManager.getInstance(); // do this first, it won't work outside of unit test mode + + msm.cleanup(); // in case we were previously connected to maven2 + + boolean oldUnitTestMode = application.isUnitTestMode(); + application.setUnitTestMode(false); + try { + return msm.getOrCreateWrappee(); + } + finally { + application.setUnitTestMode(oldUnitTestMode); + } + } + + public static void disconnectFromServer() { + MavenServerManager msm = MavenServerManager.getInstance(); + msm.cleanup(); + } +}