Make WorkspaceReader available to extensions.

Add unit tests.
This commit is contained in:
Christian Williams
2014-01-29 19:55:22 +04:00
committed by Sergey Evdokimov
parent 217a6ba514
commit 447fa054ff
8 changed files with 202 additions and 25 deletions
@@ -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<Exception> exceptions = new ArrayList<Exception>();
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<Exception>()));
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<Exception> exceptions) {
ClassLoader originalClassLoader = Thread.currentThread().getContextClassLoader();
Collection<AbstractMavenLifecycleParticipant> 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);
}
}
}
}
@@ -0,0 +1,40 @@
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>intellij.test</groupId>
<artifactId>maven-extension</artifactId>
<version>1.0</version>
<packaging>jar</packaging>
<build>
<plugins>
<plugin>
<groupId>org.codehaus.plexus</groupId>
<artifactId>plexus-component-metadata</artifactId>
<version>1.5.5</version>
<executions>
<execution>
<goals>
<goal>generate-metadata</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-core</artifactId>
<version>3.0.3</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.codehaus.plexus</groupId>
<artifactId>plexus-component-annotations</artifactId>
<version>1.5.5</version>
<scope>provided</scope>
</dependency>
</dependencies>
</project>
@@ -0,0 +1,27 @@
<?xml version="1.0" encoding="UTF-8"?><project>
<parent>
<artifactId>plexus</artifactId>
<groupId>org.codehaus.plexus</groupId>
<version>1.0.4</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>plexus-utils</artifactId>
<name>Plexus Common Utilities</name>
<version>1.1</version>
<build>
<plugins>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<excludes>
<exclude>org/codehaus/plexus/util/FileBasedTestCase.java</exclude>
<exclude>**/Test*.java</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
<distributionManagement>
<status>deployed</status>
</distributionManagement>
</project>
@@ -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("<groupId>test</groupId>" +
"<artifactId>project</artifactId>" +
"<version>1</version>" +
"" +
"<build>" +
" <extensions>" +
" <extension>" +
" <groupId>intellij.test</groupId>" +
" <artifactId>maven-extension</artifactId>" +
" <version>1.0</version>" +
" </extension>" +
" </extensions>" +
"</build>");
List<MavenProject> 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("<groupId>test</groupId>" +
"<artifactId>project</artifactId>" +
"<version>1</version>" +
"<description>throw!</description>" +
"" +
"<build>" +
" <extensions>" +
" <extension>" +
" <groupId>intellij.test</groupId>" +
" <artifactId>maven-extension</artifactId>" +
" <version>1.0</version>" +
" </extension>" +
" </extensions>" +
"</build>");
List<MavenProject> 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();
}
}
}
@@ -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();
}
}