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 2ac9ea0ebfa8..4a9e36c54752 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 @@ -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; 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 33fa797db4b6..91a84a699302 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 @@ -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); } diff --git a/plugins/maven/maven2-server-impl/src/org/jetbrains/maven/embedder/MavenEmbedder.java b/plugins/maven/maven2-server-impl/src/org/jetbrains/maven/embedder/MavenEmbedder.java index 70a6e470926c..84fc9f791588 100644 --- a/plugins/maven/maven2-server-impl/src/org/jetbrains/maven/embedder/MavenEmbedder.java +++ b/plugins/maven/maven2-server-impl/src/org/jetbrains/maven/embedder/MavenEmbedder.java @@ -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; + } } 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 5116e49045a3..10a16cdfdd15 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 @@ -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); 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 969b524fa3d1..b3b838a901d7 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 @@ -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); diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/MavenImporter.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/MavenImporter.java index 21f8af43ada1..7ba344fe42b4 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/MavenImporter.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/MavenImporter.java @@ -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) { + } } diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectsTree.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectsTree.java index eff041bf6562..1f081e7dbd6a 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectsTree.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectsTree.java @@ -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 { 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 0ea1e60c8f67..c8e1e4b52cc2 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 @@ -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 { private Customization myCustomization; @@ -50,7 +51,7 @@ public abstract class MavenEmbedderWrapper extends RemoteObjectWrapper() { @Override public Object execute() throws RemoteException { @@ -61,7 +62,12 @@ public abstract class MavenEmbedderWrapper extends RemoteObjectWrapper() { @Override public Object execute() throws RemoteException { @@ -74,7 +80,7 @@ public abstract class MavenEmbedderWrapper extends RemoteObjectWrapper() { @Override public Object execute() throws RemoteException { @@ -103,7 +109,8 @@ public abstract class MavenEmbedderWrapper extends RemoteObjectWrapper extensionPoint = Extensions.getRootArea().getExtensionPoint(MavenImporter.EXTENSION_POINT_NAME); + extensionPoint.registerExtension(extension); + + try { + importProjectWithMaven3("test" + + "project" + + "1" + + "${myName}"); + } + 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 extensionPoint = Extensions.getRootArea().getExtensionPoint(MavenImporter.EXTENSION_POINT_NAME); + extensionPoint.registerExtension(extension); + + try { + importProject("test" + + "project" + + "1" + + "${myName}"); + } + 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 mavenProjectToModuleName, + List postTasks) { + } + } }