Maven: user properties can be customized by MavenImporters. It's the merge of the PR at https://github.com/JetBrains/intellij-community/pull/167

This commit is contained in:
Vladislav.Soroka
2017-06-22 11:17:15 +03:00
parent fdf4ac9b80
commit 9fc5d9dedc
9 changed files with 146 additions and 13 deletions
@@ -24,6 +24,7 @@ import java.rmi.Remote;
import java.rmi.RemoteException;
import java.util.Collection;
import java.util.List;
import java.util.Properties;
public interface MavenServerEmbedder extends Remote {
String MAVEN_EMBEDDER_VERSION = "idea.maven.embedder.version";
@@ -33,7 +34,8 @@ public interface MavenServerEmbedder extends Remote {
boolean failOnUnresolvedDependency,
@NotNull MavenServerConsole console,
@NotNull MavenServerProgressIndicator indicator,
boolean alwaysUpdateSnapshots) throws RemoteException;
boolean alwaysUpdateSnapshots,
@Nullable Properties userProperties) throws RemoteException;
void customizeComponents() throws RemoteException;
@@ -631,13 +631,15 @@ public class Maven2ServerEmbedderImpl extends MavenRemoteObject implements Maven
boolean failOnUnresolvedDependency,
@NotNull MavenServerConsole console,
@NotNull MavenServerProgressIndicator indicator,
boolean alwaysUpdateSnapshots) {
boolean alwaysUpdateSnapshots,
@Nullable Properties userProperties) {
try {
((CustomArtifactFactory)getComponent(ArtifactFactory.class)).customize();
((CustomArtifactFactory)getComponent(ProjectArtifactFactory.class)).customize();
((CustomArtifactResolver)getComponent(ArtifactResolver.class)).customize(workspaceMap, failOnUnresolvedDependency);
((CustomRepositoryMetadataManager)getComponent(RepositoryMetadataManager.class)).customize(workspaceMap);
((CustomWagonManager)getComponent(WagonManager.class)).customize(failOnUnresolvedDependency);
myImpl.setUserProperties(userProperties);
setConsoleAndIndicator(console, indicator);
}
@@ -58,6 +58,7 @@ import org.codehaus.plexus.logging.Logger;
import org.codehaus.plexus.util.xml.Xpp3Dom;
import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.sonatype.plexus.components.sec.dispatcher.SecDispatcher;
import org.sonatype.plexus.components.sec.dispatcher.SecDispatcherException;
@@ -76,6 +77,7 @@ public class MavenEmbedder {
private final Logger myLogger;
private final MavenEmbedderSettings myEmbedderSettings;
private final ArtifactRepository myLocalRepository;
private Properties myUserProperties = new Properties();
private MavenEmbedder(@NotNull DefaultPlexusContainer container,
@NotNull Settings settings,
@@ -418,7 +420,7 @@ public class MavenEmbedder {
MavenExecutionRequest result = new DefaultMavenExecutionRequest(myLocalRepository, mySettings, dispatcher, goals, file.getParent(),
createProfileManager(activeProfiles, inactiveProfiles,
executionProperties), executionProperties,
new Properties(), true) {
myUserProperties, true) {
private boolean myIsRecursive;
@Override
@@ -595,5 +597,9 @@ public class MavenEmbedder {
ComponentDescriptor d = container.getComponentDescriptor(componentClass.getName());
d.setImplementation(implementationClass.getName());
}
public void setUserProperties(@Nullable Properties userProperties) {
myUserProperties = userProperties == null ? new Properties() : userProperties;
}
}
@@ -136,6 +136,8 @@ public class Maven3ServerEmbedderImpl extends Maven3ServerEmbedder {
private boolean myAlwaysUpdateSnapshots;
@Nullable private Properties myUserProperties;
public Maven3ServerEmbedderImpl(MavenEmbedderSettings settings) throws RemoteException {
super(settings.getSettings());
@@ -523,7 +525,8 @@ public class Maven3ServerEmbedderImpl extends Maven3ServerEmbedder {
boolean failOnUnresolvedDependency,
@NotNull MavenServerConsole console,
@NotNull MavenServerProgressIndicator indicator,
boolean alwaysUpdateSnapshots) throws RemoteException {
boolean alwaysUpdateSnapshots,
@Nullable Properties userProperties) throws RemoteException {
try {
customizeComponents();
@@ -540,6 +543,8 @@ public class Maven3ServerEmbedderImpl extends Maven3ServerEmbedder {
myAlwaysUpdateSnapshots = myAlwaysUpdateSnapshots || alwaysUpdateSnapshots;
setConsoleAndIndicator(console, new MavenServerProgressIndicatorWrapper(indicator));
myUserProperties = userProperties;
}
catch (Exception e) {
throw rethrowException(e);
@@ -877,6 +882,7 @@ public class Maven3ServerEmbedderImpl extends Maven3ServerEmbedder {
getComponent(MavenExecutionRequestPopulator.class).populateDefaults(result);
result.setSystemProperties(mySystemProperties);
result.setUserProperties(myUserProperties);
if (activeProfiles != null) {
result.setActiveProfiles(activeProfiles);
@@ -130,6 +130,8 @@ public class Maven30ServerEmbedderImpl extends Maven3ServerEmbedder {
private boolean myAlwaysUpdateSnapshots;
@Nullable private Properties myUserProperties;
public Maven30ServerEmbedderImpl(MavenServerSettings settings) throws RemoteException {
super(settings);
@@ -494,7 +496,8 @@ public class Maven30ServerEmbedderImpl extends Maven3ServerEmbedder {
boolean failOnUnresolvedDependency,
@NotNull MavenServerConsole console,
@NotNull MavenServerProgressIndicator indicator,
boolean alwaysUpdateSnapshots) throws RemoteException {
boolean alwaysUpdateSnapshots,
@Nullable Properties userProperties) throws RemoteException {
try {
customizeComponents();
@@ -511,6 +514,8 @@ public class Maven30ServerEmbedderImpl extends Maven3ServerEmbedder {
myAlwaysUpdateSnapshots = myAlwaysUpdateSnapshots || alwaysUpdateSnapshots;
setConsoleAndIndicator(console, new MavenServerProgressIndicatorWrapper(indicator));
myUserProperties = userProperties;
}
catch (Exception e) {
throw rethrowException(e);
@@ -821,6 +826,7 @@ public class Maven30ServerEmbedderImpl extends Maven3ServerEmbedder {
getComponent(MavenExecutionRequestPopulator.class).populateDefaults(result);
result.setSystemProperties(mySystemProperties);
result.setUserProperties(myUserProperties);
if (activeProfiles != null) {
result.setActiveProfiles(activeProfiles);
@@ -213,4 +213,10 @@ public abstract class MavenImporter {
protected String findGoalConfigValue(MavenProject p, String goal, String path) {
return MavenJDOMUtil.findChildValueByPath(getGoalConfig(p, goal), path);
}
/**
* Override this method if you'd like control over properties used by Maven, e.g. for pom interpolation.
*/
public void customizeUserProperties(Project project, MavenProject mavenProject, Properties properties) {
}
}
@@ -1244,7 +1244,13 @@ public class MavenProjectsTree {
String baseDir = entry.getKey().getPath();
MavenEmbedderWrapper embedder = embeddersManager.getEmbedder(MavenEmbeddersManager.FOR_DEPENDENCIES_RESOLVE, baseDir, baseDir);
try {
embedder.customizeForResolve(getWorkspaceMap(), console, process, generalSettings.isAlwaysUpdateSnapshots());
Properties userProperties = new Properties();
for (MavenProject mavenProject : mavenProjects) {
for (MavenImporter mavenImporter : mavenProject.getSuitableImporters()) {
mavenImporter.customizeUserProperties(project, mavenProject, userProperties);
}
}
embedder.customizeForResolve(getWorkspaceMap(), console, process, generalSettings.isAlwaysUpdateSnapshots(), userProperties);
doResolve(project, entry.getValue(), generalSettings, embedder, context, process);
}
finally {
@@ -33,6 +33,7 @@ import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.Properties;
public abstract class MavenEmbedderWrapper extends RemoteObjectWrapper<MavenServerEmbedder> {
private Customization myCustomization;
@@ -50,7 +51,7 @@ public abstract class MavenEmbedderWrapper extends RemoteObjectWrapper<MavenServ
}
public void customizeForResolve(MavenConsole console, MavenProgressIndicator indicator) {
setCustomization(console, indicator, null, false, false);
setCustomization(console, indicator, null, false, false, null);
perform(new Retriable<Object>() {
@Override
public Object execute() throws RemoteException {
@@ -61,7 +62,12 @@ public abstract class MavenEmbedderWrapper extends RemoteObjectWrapper<MavenServ
}
public void customizeForResolve(MavenWorkspaceMap workspaceMap, MavenConsole console, MavenProgressIndicator indicator, boolean alwaysUpdateSnapshot) {
setCustomization(console, indicator, workspaceMap, false, alwaysUpdateSnapshot);
customizeForResolve(workspaceMap, console, indicator, alwaysUpdateSnapshot, null);
}
public void customizeForResolve(MavenWorkspaceMap workspaceMap, MavenConsole console, MavenProgressIndicator indicator,
boolean alwaysUpdateSnapshot, @Nullable Properties userProperties) {
setCustomization(console, indicator, workspaceMap, false, alwaysUpdateSnapshot, userProperties);
perform(new Retriable<Object>() {
@Override
public Object execute() throws RemoteException {
@@ -74,7 +80,7 @@ public abstract class MavenEmbedderWrapper extends RemoteObjectWrapper<MavenServ
public void customizeForStrictResolve(MavenWorkspaceMap workspaceMap,
MavenConsole console,
MavenProgressIndicator indicator) {
setCustomization(console, indicator, workspaceMap, true, false);
setCustomization(console, indicator, workspaceMap, true, false, null);
perform(new Retriable<Object>() {
@Override
public Object execute() throws RemoteException {
@@ -103,7 +109,8 @@ public abstract class MavenEmbedderWrapper extends RemoteObjectWrapper<MavenServ
myCustomization.failOnUnresolvedDependency,
myCustomization.console,
myCustomization.indicator,
myCustomization.alwaysUpdateSnapshot);
myCustomization.alwaysUpdateSnapshot,
myCustomization.userProperties);
}
public MavenServerExecutionResult resolveProject(@NotNull final VirtualFile file,
@@ -294,13 +301,15 @@ public abstract class MavenEmbedderWrapper extends RemoteObjectWrapper<MavenServ
MavenProgressIndicator indicator,
MavenWorkspaceMap workspaceMap,
boolean failOnUnresolvedDependency,
boolean alwaysUpdateSnapshot) {
boolean alwaysUpdateSnapshot,
@Nullable Properties userProperties) {
resetCustomization();
myCustomization = new Customization(MavenServerManager.wrapAndExport(console),
MavenServerManager.wrapAndExport(indicator),
workspaceMap,
failOnUnresolvedDependency,
alwaysUpdateSnapshot);
alwaysUpdateSnapshot,
userProperties);
}
private synchronized void resetCustomization() {
@@ -329,17 +338,20 @@ public abstract class MavenEmbedderWrapper extends RemoteObjectWrapper<MavenServ
private final MavenWorkspaceMap workspaceMap;
private final boolean failOnUnresolvedDependency;
private final boolean alwaysUpdateSnapshot;
private final Properties userProperties;
private Customization(MavenServerConsole console,
MavenServerProgressIndicator indicator,
MavenWorkspaceMap workspaceMap,
boolean failOnUnresolvedDependency,
boolean alwaysUpdateSnapshot) {
boolean alwaysUpdateSnapshot,
@Nullable Properties userProperties) {
this.console = console;
this.indicator = indicator;
this.workspaceMap = workspaceMap;
this.failOnUnresolvedDependency = failOnUnresolvedDependency;
this.alwaysUpdateSnapshot = alwaysUpdateSnapshot;
this.userProperties = userProperties;
}
}
}
@@ -16,21 +16,31 @@
package org.jetbrains.idea.maven.importing;
import com.intellij.ProjectTopics;
import com.intellij.openapi.extensions.ExtensionPoint;
import com.intellij.openapi.extensions.Extensions;
import com.intellij.openapi.externalSystem.service.project.IdeModifiableModelsProvider;
import com.intellij.openapi.externalSystem.service.project.IdeModifiableModelsProviderImpl;
import com.intellij.openapi.module.ModifiableModuleModel;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.module.ModuleManager;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.roots.ModuleRootEvent;
import com.intellij.openapi.roots.ModuleRootListener;
import com.intellij.testFramework.PlatformTestUtil;
import org.jetbrains.idea.maven.MavenCustomRepositoryHelper;
import org.jetbrains.idea.maven.MavenImportingTestCase;
import org.jetbrains.idea.maven.model.MavenId;
import org.jetbrains.idea.maven.model.MavenProjectProblem;
import org.jetbrains.idea.maven.project.MavenProject;
import org.jetbrains.idea.maven.project.MavenProjectChanges;
import org.jetbrains.idea.maven.project.MavenProjectsProcessorTask;
import org.jetbrains.idea.maven.project.MavenProjectsTree;
import org.jetbrains.idea.maven.server.MavenServerManager;
import java.io.File;
import java.util.List;
import java.util.Map;
import java.util.Properties;
public class MiscImportingTest extends MavenImportingTestCase {
private int beforeRootsChangedCount;
@@ -380,8 +390,85 @@ public class MiscImportingTest extends MavenImportingTestCase {
});
}
public void testUserPropertiesCanBeCustomizedByMavenImportersForMaven3() throws Exception {
NameSettingMavenImporter extension = new NameSettingMavenImporter("name-from-properties");
ExtensionPoint<MavenImporter> extensionPoint = Extensions.getRootArea().getExtensionPoint(MavenImporter.EXTENSION_POINT_NAME);
extensionPoint.registerExtension(extension);
try {
importProjectWithMaven3("<groupId>test</groupId>" +
"<artifactId>project</artifactId>" +
"<version>1</version>" +
"<name>${myName}</name>");
}
finally {
extensionPoint.unregisterExtension(extension);
}
MavenProject project = myProjectsManager.findProject(new MavenId("test", "project", "1"));
assertNotNull(project);
assertEquals("name-from-properties", project.getName());
}
public void testUserPropertiesCanBeCustomizedByMavenImportersForMaven2() throws Exception {
NameSettingMavenImporter extension = new NameSettingMavenImporter("name-from-properties");
ExtensionPoint<MavenImporter> extensionPoint = Extensions.getRootArea().getExtensionPoint(MavenImporter.EXTENSION_POINT_NAME);
extensionPoint.registerExtension(extension);
try {
importProject("<groupId>test</groupId>" +
"<artifactId>project</artifactId>" +
"<version>1</version>" +
"<name>${myName}</name>");
}
finally {
extensionPoint.unregisterExtension(extension);
}
MavenProject project = myProjectsManager.findProject(new MavenId("test", "project", "1"));
assertNotNull(project);
assertEquals("name-from-properties", project.getName());
}
private void assertRootsChanged(int count) {
assertEquals(count, rootsChangedCount);
assertEquals(rootsChangedCount, beforeRootsChangedCount);
}
private static class NameSettingMavenImporter extends MavenImporter {
private final String myName;
public NameSettingMavenImporter(String name) {
super("gid", "id");
myName = name;
}
@Override
public void customizeUserProperties(Project project, MavenProject mavenProject, Properties properties) {
properties.setProperty("myName", myName);
}
@Override
public boolean isApplicable(MavenProject mavenProject) {
return true;
}
@Override
public void preProcess(Module module,
MavenProject mavenProject,
MavenProjectChanges changes,
IdeModifiableModelsProvider modifiableModelsProvider) {
}
@Override
public void process(IdeModifiableModelsProvider modifiableModelsProvider,
Module module,
MavenRootModelAdapter rootModel,
MavenProjectsTree mavenModel,
MavenProject mavenProject,
MavenProjectChanges changes,
Map<MavenProject, String> mavenProjectToModuleName,
List<MavenProjectsProcessorTask> postTasks) {
}
}
}