summaryrefslogtreecommitdiff
path: root/plugins/maven
diff options
context:
space:
mode:
authorTor Norbye <tnorbye@google.com>2013-08-07 11:11:08 -0700
committerTor Norbye <tnorbye@google.com>2013-08-07 11:11:08 -0700
commit6739a8f0977b70ddc8a8283b169902da3f2eecb3 (patch)
tree5c5573c2ac01544f02d9318671aa558769726289 /plugins/maven
parentc1ace1f7e1e49c81bb4b75377c99f07be340abfe (diff)
downloadidea-6739a8f0977b70ddc8a8283b169902da3f2eecb3.tar.gz
Snapshot af729d01433bb5bbd6ca93c0fdf9778b36d624ce from master branch of git://git.jetbrains.org/idea/community.git
Change-Id: I214dd066d0d27444a26166c0eae1a5aaf3705d49
Diffstat (limited to 'plugins/maven')
-rw-r--r--plugins/maven/jps-plugin/src/org/jetbrains/jps/maven/compiler/MavenBuilderService.java3
-rw-r--r--plugins/maven/maven-server-api/src/org/jetbrains/idea/maven/server/MavenServerEmbedder.java4
-rw-r--r--plugins/maven/maven2-server-impl/src/org/jetbrains/idea/maven/server/embedder/Maven2ServerEmbedderImpl.java5
-rw-r--r--plugins/maven/maven3-server-impl/src/org/jetbrains/idea/maven/server/Maven3ServerEmbedderImpl.java20
-rw-r--r--plugins/maven/maven3-server-impl/src/org/jetbrains/idea/maven/server/MavenEffectivePomDumper.java248
-rw-r--r--plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/MavenDomUtil.java14
-rw-r--r--plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/code/MavenTypedHandlerDelegate.java3
-rw-r--r--plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/generate/GenerateDependencyAction.java51
-rw-r--r--plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/generate/GenerateManagedDependencyAction.java34
-rw-r--r--plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/inspections/MavenDuplicateDependenciesInspection.java71
-rw-r--r--plugins/maven/src/main/java/org/jetbrains/idea/maven/execution/MavenResumeAction.java8
-rw-r--r--plugins/maven/src/main/java/org/jetbrains/idea/maven/execution/MavenRunConfiguration.java20
-rw-r--r--plugins/maven/src/main/java/org/jetbrains/idea/maven/execution/MavenRunConfigurationType.java7
-rw-r--r--plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/MavenModuleImporter.java1
-rw-r--r--plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/MavenProjectImporter.java11
-rw-r--r--plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/MavenRootModelAdapter.java50
-rw-r--r--plugins/maven/src/main/java/org/jetbrains/idea/maven/indices/MavenArtifactSearchDialog.java30
-rw-r--r--plugins/maven/src/main/java/org/jetbrains/idea/maven/indices/MavenArtifactSearchPanel.java75
-rw-r--r--plugins/maven/src/main/java/org/jetbrains/idea/maven/navigator/MavenProjectsNavigator.java24
-rw-r--r--plugins/maven/src/main/java/org/jetbrains/idea/maven/navigator/MavenProjectsNavigatorState.java3
-rw-r--r--plugins/maven/src/main/java/org/jetbrains/idea/maven/navigator/MavenProjectsStructure.java67
-rw-r--r--plugins/maven/src/main/java/org/jetbrains/idea/maven/navigator/actions/AlwaysShowArtifactIdAction.java30
-rw-r--r--plugins/maven/src/main/java/org/jetbrains/idea/maven/navigator/actions/MavenExecuteGoalAction.java10
-rw-r--r--plugins/maven/src/main/java/org/jetbrains/idea/maven/navigator/actions/ShowVersionsAction.java30
-rw-r--r--plugins/maven/src/main/java/org/jetbrains/idea/maven/plugins/groovy/MavenGroovyPomScriptMemberContributor.java9
-rw-r--r--plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenGeneralPanel.form1
-rw-r--r--plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenImportingSettingsForm.form3
-rw-r--r--plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenImportingSettingsForm.java2
-rw-r--r--plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectsManager.java37
-rw-r--r--plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectsManagerWatcher.java3
-rw-r--r--plugins/maven/src/main/java/org/jetbrains/idea/maven/project/actions/MavenShowEffectivePom.java126
-rw-r--r--plugins/maven/src/main/java/org/jetbrains/idea/maven/server/MavenEmbedderWrapper.java12
-rw-r--r--plugins/maven/src/main/java/org/jetbrains/idea/maven/tasks/MavenShortcutsManager.java2
-rw-r--r--plugins/maven/src/main/java/org/jetbrains/idea/maven/utils/MavenImportNotifier.java6
-rw-r--r--plugins/maven/src/main/java/org/jetbrains/idea/maven/utils/library/RepositoryLibrarySynchronizer.java2
-rw-r--r--plugins/maven/src/main/java/org/jetbrains/idea/maven/vfs/MavenGotoPropertyFileContributor.java2
-rw-r--r--plugins/maven/src/main/java/org/jetbrains/idea/maven/wizards/MavenModuleBuilder.java3
-rw-r--r--plugins/maven/src/main/java/org/jetbrains/idea/maven/wizards/MavenProjectImportProvider.java3
-rw-r--r--plugins/maven/src/main/resources/META-INF/groovy-support.xml6
-rw-r--r--plugins/maven/src/main/resources/META-INF/plugin.xml21
-rw-r--r--plugins/maven/src/main/resources/RunnerBundle.properties6
-rw-r--r--plugins/maven/src/test/java/org/jetbrains/idea/maven/importing/ArtifactsDownloadingTestCase.java4
-rw-r--r--plugins/maven/src/test/java/org/jetbrains/idea/maven/importing/DependenciesImportingTest.java120
-rw-r--r--plugins/maven/src/test/java/org/jetbrains/idea/maven/inspections/MavenDuplicatedInspectionTest.groovy36
-rw-r--r--plugins/maven/src/test/java/org/jetbrains/idea/maven/plugins/groovy/MavenGroovyInjectionTest.groovy38
45 files changed, 1106 insertions, 155 deletions
diff --git a/plugins/maven/jps-plugin/src/org/jetbrains/jps/maven/compiler/MavenBuilderService.java b/plugins/maven/jps-plugin/src/org/jetbrains/jps/maven/compiler/MavenBuilderService.java
index 32453a735a96..dcfca72a5432 100644
--- a/plugins/maven/jps-plugin/src/org/jetbrains/jps/maven/compiler/MavenBuilderService.java
+++ b/plugins/maven/jps-plugin/src/org/jetbrains/jps/maven/compiler/MavenBuilderService.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2000-2012 JetBrains s.r.o.
+ * Copyright 2000-2013 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.
@@ -30,6 +30,7 @@ import java.util.List;
* Date: 10/21/12
*/
public class MavenBuilderService extends BuilderService{
+ @NotNull
@Override
public List<? extends BuildTargetType<?>> getTargetTypes() {
return Arrays.asList(MavenResourcesTargetType.PRODUCTION, MavenResourcesTargetType.TEST);
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 37210de9ce84..dba0c44502b2 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
@@ -37,6 +37,10 @@ public interface MavenServerEmbedder extends Remote {
MavenServerProcessCanceledException;
@NotNull
+ String evaluateEffectivePom(@NotNull File file, @NotNull List<String> activeProfiles) throws RemoteException,
+ MavenServerProcessCanceledException;
+
+ @NotNull
MavenArtifact resolve(@NotNull MavenArtifactInfo info,
@NotNull List<MavenRemoteRepository> remoteRepositories) throws RemoteException,
MavenServerProcessCanceledException;
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 cae29c345b98..89f97f522910 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
@@ -199,6 +199,11 @@ public class Maven2ServerEmbedderImpl extends MavenRemoteObject implements Maven
}
@NotNull
+ public String evaluateEffectivePom(@NotNull File file, @NotNull List<String> activeProfiles) {
+ throw new UnsupportedOperationException();
+ }
+
+ @NotNull
public MavenArtifact resolve(@NotNull final MavenArtifactInfo info,
@NotNull final List<MavenRemoteRepository> remoteRepositories)
throws MavenServerProcessCanceledException, RemoteException {
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 ffb419c725a2..30027972395a 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
@@ -289,6 +289,13 @@ public class Maven3ServerEmbedderImpl extends MavenRemoteObject implements Maven
return createExecutionResult(file, result, listener.getRootNode());
}
+ @NotNull
+ @Override
+ public String evaluateEffectivePom(@NotNull File file, @NotNull List<String> activeProfiles)
+ throws RemoteException, MavenServerProcessCanceledException {
+ return MavenEffectivePomDumper.evaluateEffectivePom(this, file, activeProfiles);
+ }
+
public void executeWithMavenSession(MavenExecutionRequest request, Runnable runnable) {
DefaultMaven maven = (DefaultMaven)getComponent(Maven.class);
RepositorySystemSession repositorySession = maven.newRepositorySession(request);
@@ -624,7 +631,18 @@ public class Maven3ServerEmbedderImpl extends MavenRemoteObject implements Maven
public void resolve(@NotNull final Artifact artifact, @NotNull final List<ArtifactRepository> repos)
throws ArtifactResolutionException, ArtifactNotFoundException {
- getComponent(ArtifactResolver.class).resolve(artifact, repos, myLocalRepository);
+
+ MavenExecutionRequest request = new DefaultMavenExecutionRequest();
+ request.setRemoteRepositories(repos);
+ try {
+ getComponent(MavenExecutionRequestPopulator.class).populateFromSettings(request, myMavenSettings);
+ getComponent(MavenExecutionRequestPopulator.class).populateDefaults(request);
+ }
+ catch (MavenExecutionRequestPopulationException e) {
+ throw new RuntimeException(e);
+ }
+
+ getComponent(ArtifactResolver.class).resolve(artifact, request.getRemoteRepositories(), myLocalRepository);
}
private List<ArtifactRepository> convertRepositories(List<MavenRemoteRepository> repositories) throws RemoteException {
diff --git a/plugins/maven/maven3-server-impl/src/org/jetbrains/idea/maven/server/MavenEffectivePomDumper.java b/plugins/maven/maven3-server-impl/src/org/jetbrains/idea/maven/server/MavenEffectivePomDumper.java
new file mode 100644
index 000000000000..180fc0572822
--- /dev/null
+++ b/plugins/maven/maven3-server-impl/src/org/jetbrains/idea/maven/server/MavenEffectivePomDumper.java
@@ -0,0 +1,248 @@
+package org.jetbrains.idea.maven.server;
+
+import org.apache.maven.execution.MavenExecutionRequest;
+import org.apache.maven.model.Model;
+import org.apache.maven.model.io.xpp3.MavenXpp3Writer;
+import org.apache.maven.plugin.MojoExecutionException;
+import org.apache.maven.project.MavenProject;
+import org.apache.maven.project.ProjectBuilder;
+import org.apache.maven.project.ProjectBuildingResult;
+import org.codehaus.plexus.util.StringUtils;
+import org.codehaus.plexus.util.xml.PrettyPrintXMLWriter;
+import org.codehaus.plexus.util.xml.XMLWriter;
+import org.codehaus.plexus.util.xml.XmlWriterUtil;
+import org.jdom.*;
+import org.jdom.filter.ElementFilter;
+import org.jdom.input.SAXBuilder;
+import org.jdom.output.Format;
+import org.jdom.output.XMLOutputter;
+import org.jetbrains.annotations.NotNull;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.StringReader;
+import java.io.StringWriter;
+import java.rmi.RemoteException;
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.*;
+
+/**
+ * @author Sergey Evdokimov
+ */
+public class MavenEffectivePomDumper {
+
+ /**
+ * The POM XSD URL
+ */
+ private static final String POM_XSD_URL = "http://maven.apache.org/maven-v4_0_0.xsd";
+
+ /**
+ * The Settings XSD URL
+ */
+ private static final String SETTINGS_XSD_URL = "http://maven.apache.org/xsd/settings-1.0.0.xsd";
+
+ // See org.apache.maven.plugins.help.EffectivePomMojo#execute from maven-help-plugin
+
+ public static String evaluateEffectivePom(final Maven3ServerEmbedderImpl embedder,
+ @NotNull final File file,
+ @NotNull List<String> activeProfiles)
+ throws RemoteException, MavenServerProcessCanceledException {
+
+ final MavenExecutionRequest
+ request = embedder.createRequest(file, activeProfiles, Collections.<String>emptyList(), Collections.<String>emptyList());
+
+ final StringWriter w = new StringWriter();
+
+ embedder.executeWithMavenSession(request, new Runnable() {
+ @Override
+ public void run() {
+ try {
+ // copied from DefaultMavenProjectBuilder.buildWithDependencies
+ ProjectBuilder builder = embedder.getComponent(ProjectBuilder.class);
+ ProjectBuildingResult buildingResult = builder.build(new File(file.getPath()), request.getProjectBuildingRequest());
+
+ MavenProject project = buildingResult.getProject();
+
+ XMLWriter writer = new PrettyPrintXMLWriter(w, StringUtils.repeat(" ", XmlWriterUtil.DEFAULT_INDENTATION_SIZE));
+
+ writeHeader(writer);
+
+ writeEffectivePom(project, writer);
+ }
+ catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+ }
+ });
+
+ return w.toString();
+ }
+
+ /**
+ * org.apache.maven.plugins.help.EffectivePomMojo#writeEffectivePom
+ */
+ private static void writeEffectivePom(MavenProject project, XMLWriter writer)
+ throws MojoExecutionException {
+ Model pom = project.getModel();
+ cleanModel(pom);
+
+ String effectivePom;
+
+ StringWriter sWriter = new StringWriter();
+ MavenXpp3Writer pomWriter = new MavenXpp3Writer();
+ try {
+ pomWriter.write(sWriter, pom);
+ }
+ catch (IOException e) {
+ throw new MojoExecutionException("Cannot serialize POM to XML.", e);
+ }
+
+ effectivePom = addMavenNamespace(sWriter.toString(), true);
+
+ writeComment(writer, "Effective POM for project \'" + project.getId() + "\'");
+
+ writer.writeMarkup(effectivePom);
+ }
+
+ /**
+ * org.jetbrains.idea.maven.server.MavenEffectivePomDumper#cleanModel(org.apache.maven.model.Model)
+ */
+ private static void cleanModel(Model pom) {
+ Properties properties = new SortedProperties();
+ properties.putAll(pom.getProperties());
+ pom.setProperties(properties);
+ }
+
+
+ /**
+ * Copy/pasted from org.apache.maven.plugins.help.AbstractEffectiveMojo#writeHeader
+ */
+ protected static void writeHeader(XMLWriter writer) {
+ XmlWriterUtil.writeCommentLineBreak(writer);
+ XmlWriterUtil.writeComment(writer, " ");
+ // Use ISO8601-format for date and time
+ DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'hh:mm:ss");
+ XmlWriterUtil.writeComment(writer, "Generated on " + dateFormat.format(new Date(System.currentTimeMillis())));
+ XmlWriterUtil.writeComment(writer, " ");
+ XmlWriterUtil.writeCommentLineBreak(writer);
+
+ XmlWriterUtil.writeLineBreak(writer);
+ }
+
+ /**
+ * Copy/pasted from org.apache.maven.plugins.help.AbstractEffectiveMojo
+ */
+ protected static void writeComment(XMLWriter writer, String comment) {
+ XmlWriterUtil.writeCommentLineBreak(writer);
+ XmlWriterUtil.writeComment(writer, " ");
+ XmlWriterUtil.writeComment(writer, comment);
+ XmlWriterUtil.writeComment(writer, " ");
+ XmlWriterUtil.writeCommentLineBreak(writer);
+
+ XmlWriterUtil.writeLineBreak(writer);
+ }
+
+ private static boolean hasLineBreak(Element e) {
+ return !e.getChildren().isEmpty() || e.getText().contains("\n");
+ }
+
+ private static boolean isOneEOFText(String text) {
+ int eof = text.indexOf('\n');
+ return eof != -1 && eof == text.lastIndexOf('\n') && text.trim().isEmpty();
+ }
+
+ private static void addLineBreaks(Element element) {
+ List<Content> children = element.getContent();
+
+ for (int i = 0; i < children.size() - 2; i++) {
+ Content c1 = children.get(i);
+ Content c2 = children.get(i + 1);
+ Content c3 = children.get(i + 2);
+
+ if (c1 instanceof Element && c2 instanceof Text && c3 instanceof Element
+ && (hasLineBreak((Element)c1) || hasLineBreak((Element)c3))
+ && isOneEOFText(((Text)c2).getText())) {
+ element.setContent(i + 1, new Text(((Text)c2).getText().replace("\n", "\n\n")));
+ }
+ }
+
+ }
+
+ private static void addLineBreaks(Document pomXml, Namespace pomNamespace) {
+ Element rootElement = pomXml.getRootElement();
+
+ addLineBreaks(rootElement);
+
+ Element buildElement = rootElement.getChild("build", pomNamespace);
+ if (buildElement != null) {
+ addLineBreaks(buildElement);
+ }
+ }
+
+ /**
+ * Copy/pasted from org.apache.maven.plugins.help.AbstractEffectiveMojo
+ */
+ protected static String addMavenNamespace(String effectiveXml, boolean isPom) {
+ SAXBuilder builder = new SAXBuilder();
+
+ try {
+ Document document = builder.build(new StringReader(effectiveXml));
+ Element rootElement = document.getRootElement();
+
+ // added namespaces
+ Namespace pomNamespace = Namespace.getNamespace("", "http://maven.apache.org/POM/4.0.0");
+ rootElement.setNamespace(pomNamespace);
+
+ Namespace xsiNamespace = Namespace.getNamespace("xsi", "http://www.w3.org/2001/XMLSchema-instance");
+ rootElement.addNamespaceDeclaration(xsiNamespace);
+ if (rootElement.getAttribute("schemaLocation", xsiNamespace) == null) {
+ rootElement.setAttribute("schemaLocation", "http://maven.apache.org/POM/4.0.0 "
+ + (isPom ? POM_XSD_URL : SETTINGS_XSD_URL), xsiNamespace);
+ }
+
+ ElementFilter elementFilter = new ElementFilter(Namespace.getNamespace(""));
+ for (Iterator i = rootElement.getDescendants(elementFilter); i.hasNext(); ) {
+ Element e = (Element)i.next();
+ e.setNamespace(pomNamespace);
+ }
+
+ addLineBreaks(document, pomNamespace);
+
+ StringWriter w = new StringWriter();
+ Format format = Format.getRawFormat();
+ XMLOutputter out = new XMLOutputter(format);
+ out.output(document.getRootElement(), w);
+
+ return w.toString();
+ }
+ catch (JDOMException e) {
+ return effectiveXml;
+ }
+ catch (IOException e) {
+ return effectiveXml;
+ }
+ }
+
+ /**
+ * Properties which provides a sorted keySet().
+ */
+ protected static class SortedProperties
+ extends Properties {
+ /**
+ * serialVersionUID
+ */
+ static final long serialVersionUID = -8985316072702233744L;
+
+ /**
+ * {@inheritDoc}
+ */
+ public Set keySet() {
+ Set keynames = super.keySet();
+ Vector list = new Vector(keynames);
+ Collections.sort(list);
+
+ return new LinkedHashSet(list);
+ }
+ }
+}
diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/MavenDomUtil.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/MavenDomUtil.java
index d2eda4339bb0..69af10cc41bd 100644
--- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/MavenDomUtil.java
+++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/MavenDomUtil.java
@@ -398,7 +398,14 @@ public class MavenDomUtil {
public static MavenDomDependency createDomDependency(MavenDomProjectModel model,
@Nullable Editor editor,
@NotNull final MavenId id) {
- MavenDomDependency dep = createDomDependency(model, editor);
+ return createDomDependency(model.getDependencies(), editor, id);
+ }
+
+ @NotNull
+ public static MavenDomDependency createDomDependency(MavenDomDependencies dependencies,
+ @Nullable Editor editor,
+ @NotNull final MavenId id) {
+ MavenDomDependency dep = createDomDependency(dependencies, editor);
dep.getGroupId().setStringValue(id.getGroupId());
dep.getArtifactId().setStringValue(id.getArtifactId());
@@ -409,8 +416,11 @@ public class MavenDomUtil {
@NotNull
public static MavenDomDependency createDomDependency(@NotNull MavenDomProjectModel model, @Nullable Editor editor) {
- MavenDomDependencies dependencies = model.getDependencies();
+ return createDomDependency(model.getDependencies(), editor);
+ }
+ @NotNull
+ public static MavenDomDependency createDomDependency(@NotNull MavenDomDependencies dependencies, @Nullable Editor editor) {
int index = getCollectionIndex(dependencies, editor);
if (index >= 0) {
DomCollectionChildDescription childDescription = dependencies.getGenericInfo().getCollectionChildDescription("dependency");
diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/code/MavenTypedHandlerDelegate.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/code/MavenTypedHandlerDelegate.java
index 414f2b419400..72fb4ed6d7c1 100644
--- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/code/MavenTypedHandlerDelegate.java
+++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/code/MavenTypedHandlerDelegate.java
@@ -20,11 +20,12 @@ import com.intellij.codeInsight.editorActions.TypedHandlerDelegate;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.project.Project;
import com.intellij.psi.PsiFile;
+import org.jetbrains.annotations.NotNull;
import org.jetbrains.idea.maven.dom.MavenDomUtil;
public class MavenTypedHandlerDelegate extends TypedHandlerDelegate {
@Override
- public Result charTyped(char c, Project project, Editor editor, PsiFile file) {
+ public Result charTyped(char c, Project project, @NotNull Editor editor, @NotNull PsiFile file) {
if (!CodeInsightSettings.getInstance().AUTOINSERT_PAIR_BRACKET) return Result.CONTINUE;
if (c != '{') return Result.CONTINUE;
diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/generate/GenerateDependencyAction.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/generate/GenerateDependencyAction.java
index 78e59726d4f7..015029cab74e 100644
--- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/generate/GenerateDependencyAction.java
+++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/generate/GenerateDependencyAction.java
@@ -19,22 +19,26 @@ import com.intellij.icons.AllIcons;
import com.intellij.openapi.application.Result;
import com.intellij.openapi.command.WriteCommandAction;
import com.intellij.openapi.editor.Editor;
+import com.intellij.openapi.project.Project;
+import com.intellij.openapi.util.Comparing;
import com.intellij.psi.PsiDocumentManager;
+import com.intellij.psi.xml.XmlElement;
import com.intellij.psi.xml.XmlFile;
import com.intellij.util.xml.DomUtil;
import com.intellij.util.xml.ui.actions.generate.GenerateDomElementAction;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
+import org.jetbrains.idea.maven.dom.DependencyConflictId;
import org.jetbrains.idea.maven.dom.MavenDomBundle;
import org.jetbrains.idea.maven.dom.MavenDomUtil;
import org.jetbrains.idea.maven.dom.model.MavenDomDependency;
+import org.jetbrains.idea.maven.dom.model.MavenDomDependencyManagement;
import org.jetbrains.idea.maven.dom.model.MavenDomProjectModel;
import org.jetbrains.idea.maven.indices.MavenArtifactSearchDialog;
import org.jetbrains.idea.maven.model.MavenId;
-import org.jetbrains.idea.maven.project.MavenProject;
-import org.jetbrains.idea.maven.project.MavenProjectsManager;
import java.util.List;
+import java.util.Map;
public class GenerateDependencyAction extends GenerateDomElementAction {
public GenerateDependencyAction() {
@@ -42,21 +46,52 @@ public class GenerateDependencyAction extends GenerateDomElementAction {
@Nullable
@Override
protected MavenDomDependency doGenerate(@NotNull final MavenDomProjectModel mavenModel, final Editor editor) {
- MavenProjectsManager manager = MavenProjectsManager.getInstance(editor.getProject());
- MavenProject project = manager.findProject(mavenModel.getModule());
- if (project == null) return null;
+ Project project = mavenModel.getManager().getProject();
- final List<MavenId> ids = MavenArtifactSearchDialog.searchForArtifact(editor.getProject());
+ final Map<DependencyConflictId, MavenDomDependency> managedDependencies = GenerateManagedDependencyAction.collectManagingDependencies(mavenModel);
+
+ final List<MavenId> ids = MavenArtifactSearchDialog.searchForArtifact(project, managedDependencies.values());
if (ids.isEmpty()) return null;
- PsiDocumentManager.getInstance(mavenModel.getManager().getProject()).commitAllDocuments();
+ PsiDocumentManager.getInstance(project).commitAllDocuments();
XmlFile psiFile = DomUtil.getFile(mavenModel);
return new WriteCommandAction<MavenDomDependency>(psiFile.getProject(), "Generate Dependency", psiFile) {
@Override
protected void run(Result<MavenDomDependency> result) throws Throwable {
+ boolean isInsideManagedDependencies;
+
+ MavenDomDependencyManagement dependencyManagement = mavenModel.getDependencyManagement();
+ XmlElement managedDependencyXml = dependencyManagement.getXmlElement();
+ if (managedDependencyXml != null && managedDependencyXml.getTextRange().contains(editor.getCaretModel().getOffset())) {
+ isInsideManagedDependencies = true;
+ }
+ else {
+ isInsideManagedDependencies = false;
+ }
+
for (MavenId each : ids) {
- result.setResult(MavenDomUtil.createDomDependency(mavenModel, editor, each));
+ MavenDomDependency res;
+ if (isInsideManagedDependencies) {
+ res = MavenDomUtil.createDomDependency(dependencyManagement.getDependencies(), editor, each);
+ }
+ else {
+ DependencyConflictId conflictId = new DependencyConflictId(each.getGroupId(), each.getArtifactId(), null, null);
+ MavenDomDependency managedDependenciesDom = managedDependencies.get(conflictId);
+
+ if (managedDependenciesDom != null
+ && Comparing.equal(each.getVersion(), managedDependenciesDom.getVersion().getStringValue())) {
+ // Generate dependency without <version> tag
+ res = MavenDomUtil.createDomDependency(mavenModel.getDependencies(), editor);
+
+ res.getGroupId().setStringValue(conflictId.getGroupId());
+ res.getArtifactId().setStringValue(conflictId.getArtifactId());
+ }
+ else {
+ res = MavenDomUtil.createDomDependency(mavenModel.getDependencies(), editor, each);
+ }
+ }
+ result.setResult(res);
}
}
}.execute().getResultObject();
diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/generate/GenerateManagedDependencyAction.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/generate/GenerateManagedDependencyAction.java
index 4909a488bf38..18250c395ee5 100644
--- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/generate/GenerateManagedDependencyAction.java
+++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/generate/GenerateManagedDependencyAction.java
@@ -15,6 +15,8 @@
*/
package org.jetbrains.idea.maven.dom.generate;
+import com.google.common.base.Predicates;
+import com.google.common.collect.Maps;
import com.intellij.icons.AllIcons;
import com.intellij.openapi.application.Result;
import com.intellij.openapi.command.WriteCommandAction;
@@ -32,7 +34,6 @@ import org.jetbrains.idea.maven.dom.MavenDomUtil;
import org.jetbrains.idea.maven.dom.model.MavenDomDependency;
import org.jetbrains.idea.maven.dom.model.MavenDomProjectModel;
-import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Set;
@@ -54,10 +55,14 @@ public class GenerateManagedDependencyAction extends GenerateDomElementAction {
@Override
protected MavenDomDependency doGenerate(@NotNull final MavenDomProjectModel mavenModel, final Editor editor) {
- Collection<MavenDomDependency> managingDependencies = collectManagingDependencies(mavenModel);
+ Set<DependencyConflictId> existingDependencies = collectExistingDependencies(mavenModel);
+ Map<DependencyConflictId, MavenDomDependency> managingDependencies = collectManagingDependencies(mavenModel);
+
+ Map<DependencyConflictId, MavenDomDependency> unexistManagingDeps = Maps.filterKeys(managingDependencies,
+ Predicates.not(Predicates.in(existingDependencies)));
final List<MavenDomDependency> dependenciesToOverride =
- GenerateDependencyUtil.chooseDependencies(managingDependencies, mavenModel.getManager().getProject());
+ GenerateDependencyUtil.chooseDependencies(unexistManagingDeps.values(), mavenModel.getManager().getProject());
if (!dependenciesToOverride.isEmpty()) {
return new WriteCommandAction<MavenDomDependency>(editor.getProject(), mavenModel.getXmlTag().getContainingFile()) {
@@ -88,10 +93,7 @@ public class GenerateManagedDependencyAction extends GenerateDomElementAction {
}
}
- @NotNull
- public static Collection<MavenDomDependency> collectManagingDependencies(@NotNull final MavenDomProjectModel model) {
- final Map<DependencyConflictId, MavenDomDependency> dependencies = new HashMap<DependencyConflictId, MavenDomDependency>();
-
+ private static Set<DependencyConflictId> collectExistingDependencies(@NotNull final MavenDomProjectModel model) {
final Set<DependencyConflictId> existingDependencies = new HashSet<DependencyConflictId>();
for (MavenDomDependency dependency : model.getDependencies().getDependencies()) {
DependencyConflictId id = DependencyConflictId.create(dependency);
@@ -100,20 +102,26 @@ public class GenerateManagedDependencyAction extends GenerateDomElementAction {
}
}
+ return existingDependencies;
+ }
+
+ @NotNull
+ public static Map<DependencyConflictId, MavenDomDependency> collectManagingDependencies(@NotNull final MavenDomProjectModel model) {
+ final Map<DependencyConflictId, MavenDomDependency> dependencies = new HashMap<DependencyConflictId, MavenDomDependency>();
+
Processor<MavenDomDependency> collectProcessor = new Processor<MavenDomDependency>() {
public boolean process(MavenDomDependency dependency) {
- if (!model.equals(dependency.getParentOfType(MavenDomProjectModel.class, true))) {
- DependencyConflictId id = DependencyConflictId.create(dependency);
- if (id != null && !existingDependencies.contains(id) && !dependencies.containsKey(id)) {
- dependencies.put(id, dependency);
- }
+ DependencyConflictId id = DependencyConflictId.create(dependency);
+ if (id != null && !dependencies.containsKey(id)) {
+ dependencies.put(id, dependency);
}
+
return false;
}
};
MavenDomProjectProcessorUtils.processDependenciesInDependencyManagement(model, collectProcessor, model.getManager().getProject());
- return dependencies.values();
+ return dependencies;
}
}
diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/inspections/MavenDuplicateDependenciesInspection.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/inspections/MavenDuplicateDependenciesInspection.java
index ef79271a312d..134ac624f93e 100644
--- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/inspections/MavenDuplicateDependenciesInspection.java
+++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/inspections/MavenDuplicateDependenciesInspection.java
@@ -26,11 +26,14 @@ import com.intellij.util.containers.hash.HashSet;
import com.intellij.util.xml.DomFileElement;
import com.intellij.util.xml.highlighting.BasicDomElementsInspection;
import com.intellij.util.xml.highlighting.DomElementAnnotationHolder;
+import gnu.trove.THashMap;
+import gnu.trove.THashSet;
import org.jetbrains.annotations.NotNull;
-import org.jetbrains.annotations.Nullable;
+import org.jetbrains.idea.maven.dom.DependencyConflictId;
import org.jetbrains.idea.maven.dom.MavenDomBundle;
import org.jetbrains.idea.maven.dom.MavenDomProjectProcessorUtils;
import org.jetbrains.idea.maven.dom.MavenDomUtil;
+import org.jetbrains.idea.maven.dom.model.MavenDomDependencies;
import org.jetbrains.idea.maven.dom.model.MavenDomDependency;
import org.jetbrains.idea.maven.dom.model.MavenDomProjectModel;
import org.jetbrains.idea.maven.project.MavenProject;
@@ -47,15 +50,16 @@ public class MavenDuplicateDependenciesInspection extends BasicDomElementsInspec
DomElementAnnotationHolder holder) {
MavenDomProjectModel projectModel = domFileElement.getRootElement();
- checkMavenProjectModel(projectModel, holder);
+ checkManagedDependencies(projectModel, holder);
+ checkDependencies(projectModel, holder);
}
- private static void checkMavenProjectModel(@NotNull MavenDomProjectModel projectModel,
- @NotNull DomElementAnnotationHolder holder) {
- final Map<String, Set<MavenDomDependency>> allDuplicates = getDuplicateDependenciesMap(projectModel);
+ private static void checkDependencies(@NotNull MavenDomProjectModel projectModel,
+ @NotNull DomElementAnnotationHolder holder) {
+ final Map<DependencyConflictId, Set<MavenDomDependency>> allDuplicates = getDuplicateDependenciesMap(projectModel);
for (MavenDomDependency dependency : projectModel.getDependencies().getDependencies()) {
- String id = createId(dependency);
+ DependencyConflictId id = DependencyConflictId.create(dependency);
if (id != null) {
Set<MavenDomDependency> dependencies = allDuplicates.get(id);
if (dependencies != null && dependencies.size() > 1) {
@@ -66,12 +70,12 @@ public class MavenDuplicateDependenciesInspection extends BasicDomElementsInspec
if (d == dependency) continue;
if (d.getParent() == dependency.getParent()) {
- duplicatedDependencies.add(d); // Dependencies in same file must be unique by groupId:artifactId:type:classifier
+ duplicatedDependencies.add(d); // Dependencies in the same file must be unique by groupId:artifactId:type:classifier
}
else {
if (scope(d).equals(scope(dependency))
&& Comparing.equal(d.getVersion().getStringValue(), dependency.getVersion().getStringValue())) {
- duplicatedDependencies.add(d); // Dependencies in same file must be unique by groupId:artifactId:VERSION:type:classifier:SCOPE
+ duplicatedDependencies.add(d); // Dependencies in different files must not have same groupId:artifactId:VERSION:type:classifier:SCOPE
}
}
}
@@ -147,24 +151,12 @@ public class MavenDuplicateDependenciesInspection extends BasicDomElementsInspec
}
@NotNull
- private static Map<String, Set<MavenDomDependency>> getDuplicateDependenciesMap(MavenDomProjectModel projectModel) {
- final Map<String, Set<MavenDomDependency>> allDependencies = new HashMap<String, Set<MavenDomDependency>>();
+ private static Map<DependencyConflictId, Set<MavenDomDependency>> getDuplicateDependenciesMap(MavenDomProjectModel projectModel) {
+ final Map<DependencyConflictId, Set<MavenDomDependency>> allDependencies = new HashMap<DependencyConflictId, Set<MavenDomDependency>>();
Processor<MavenDomProjectModel> collectProcessor = new Processor<MavenDomProjectModel>() {
public boolean process(MavenDomProjectModel model) {
- for (MavenDomDependency dependency : model.getDependencies().getDependencies()) {
- String mavenId = createId(dependency);
- if (mavenId != null) {
- if (allDependencies.containsKey(mavenId)) {
- allDependencies.get(mavenId).add(dependency);
- }
- else {
- Set<MavenDomDependency> dependencies = new HashSet<MavenDomDependency>();
- dependencies.add(dependency);
- allDependencies.put(mavenId, dependencies);
- }
- }
- }
+ collect(allDependencies, model.getDependencies());
return false;
}
};
@@ -175,17 +167,34 @@ public class MavenDuplicateDependenciesInspection extends BasicDomElementsInspec
return allDependencies;
}
- @Nullable
- private static String createId(MavenDomDependency coordinates) {
- String groupId = coordinates.getGroupId().getStringValue();
- String artifactId = coordinates.getArtifactId().getStringValue();
+ private static void collect(Map<DependencyConflictId, Set<MavenDomDependency>> duplicates, @NotNull MavenDomDependencies dependencies) {
+ for (MavenDomDependency dependency : dependencies.getDependencies()) {
+ DependencyConflictId mavenId = DependencyConflictId.create(dependency);
+ if (mavenId == null) continue;
+
+ Set<MavenDomDependency> set = duplicates.get(mavenId);
+ if (set == null) {
+ set = new THashSet<MavenDomDependency>();
+ duplicates.put(mavenId, set);
+ }
+
+ set.add(dependency);
+ }
+ }
- if (StringUtil.isEmptyOrSpaces(groupId) || StringUtil.isEmptyOrSpaces(artifactId)) return null;
+ private static void checkManagedDependencies(@NotNull MavenDomProjectModel projectModel,
+ @NotNull DomElementAnnotationHolder holder) {
+ final Map<DependencyConflictId, Set<MavenDomDependency>> duplicates = new THashMap<DependencyConflictId, Set<MavenDomDependency>>();
+ collect(duplicates, projectModel.getDependencyManagement().getDependencies());
- String type = coordinates.getType().getStringValue();
- String classifier = coordinates.getClassifier().getStringValue();
+ for (Map.Entry<DependencyConflictId, Set<MavenDomDependency>> entry : duplicates.entrySet()) {
+ Set<MavenDomDependency> set = entry.getValue();
+ if (set.size() <= 1) continue;
- return groupId + ":" + artifactId + ":" + type + ":" + classifier;
+ for (MavenDomDependency dependency : set) {
+ holder.createProblem(dependency, HighlightSeverity.WARNING, "Duplicated dependency");
+ }
+ }
}
@NotNull
diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/execution/MavenResumeAction.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/execution/MavenResumeAction.java
index 9d0ae21b8ddd..25f10123db68 100644
--- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/execution/MavenResumeAction.java
+++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/execution/MavenResumeAction.java
@@ -17,7 +17,6 @@ package org.jetbrains.idea.maven.execution;
import com.intellij.execution.ExecutionBundle;
import com.intellij.execution.ExecutionException;
-import com.intellij.execution.Executor;
import com.intellij.execution.RunCanceledByUserException;
import com.intellij.execution.configurations.JavaParameters;
import com.intellij.execution.process.ProcessAdapter;
@@ -25,6 +24,7 @@ import com.intellij.execution.process.ProcessEvent;
import com.intellij.execution.process.ProcessHandler;
import com.intellij.execution.process.ProcessOutputTypes;
import com.intellij.execution.runners.ExecutionEnvironment;
+import com.intellij.execution.runners.ExecutionEnvironmentBuilder;
import com.intellij.execution.runners.ProgramRunner;
import com.intellij.icons.AllIcons;
import com.intellij.openapi.actionSystem.AnAction;
@@ -62,7 +62,6 @@ public class MavenResumeAction extends AnAction {
public static final int STATE_WTF = -1;
private final ProgramRunner myRunner;
- private final Executor myExecutor;
private final ExecutionEnvironment myEnvironment;
private int myState = STATE_INITIAL;
@@ -77,11 +76,9 @@ public class MavenResumeAction extends AnAction {
public MavenResumeAction(ProcessHandler processHandler,
ProgramRunner runner,
- Executor executor,
ExecutionEnvironment environment) {
super("Resume build from specified module", null, AllIcons.RunConfigurations.RerunFailedTests);
myRunner = runner;
- myExecutor = executor;
myEnvironment = environment;
final MavenRunConfiguration runConfiguration = (MavenRunConfiguration)environment.getRunProfile();
@@ -300,8 +297,7 @@ public class MavenResumeAction extends AnAction {
goals.add(myResumeModuleId);
}
- myRunner.execute(myExecutor, new ExecutionEnvironment(runConfiguration, project, myEnvironment.getRunnerSettings(),
- myEnvironment.getConfigurationSettings(), null));
+ myRunner.execute(new ExecutionEnvironmentBuilder(myEnvironment).setContentToReuse(null).build());
}
catch (RunCanceledByUserException ignore) {
}
diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/execution/MavenRunConfiguration.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/execution/MavenRunConfiguration.java
index 70daae803b91..d88600b731d9 100644
--- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/execution/MavenRunConfiguration.java
+++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/execution/MavenRunConfiguration.java
@@ -27,7 +27,6 @@ import com.intellij.openapi.module.Module;
import com.intellij.openapi.options.SettingsEditor;
import com.intellij.openapi.options.SettingsEditorGroup;
import com.intellij.openapi.project.Project;
-import com.intellij.openapi.util.Comparing;
import com.intellij.openapi.util.InvalidDataException;
import com.intellij.openapi.util.WriteExternalException;
import com.intellij.openapi.wm.ToolWindowId;
@@ -37,7 +36,7 @@ import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.idea.maven.project.*;
-public class MavenRunConfiguration extends RunConfigurationBase implements LocatableConfiguration, ModuleRunProfile {
+public class MavenRunConfiguration extends LocatableConfigurationBase implements ModuleRunProfile {
private MavenSettings mySettings;
protected MavenRunConfiguration(Project project, ConfigurationFactory factory, String name) {
@@ -52,6 +51,7 @@ public class MavenRunConfiguration extends RunConfigurationBase implements Locat
return clone;
}
+ @NotNull
@Override
public SettingsEditor<? extends RunConfiguration> getConfigurationEditor() {
SettingsEditorGroup<MavenRunConfiguration> group = new SettingsEditorGroup<MavenRunConfiguration>();
@@ -83,7 +83,7 @@ public class MavenRunConfiguration extends RunConfigurationBase implements Locat
DefaultExecutionResult res = (DefaultExecutionResult)super.execute(executor, runner);
if (executor.getId().equals(ToolWindowId.RUN)
&& MavenResumeAction.isApplicable(env.getProject(), getJavaParameters(), MavenRunConfiguration.this)) {
- MavenResumeAction resumeAction = new MavenResumeAction(res.getProcessHandler(), runner, executor, env);
+ MavenResumeAction resumeAction = new MavenResumeAction(res.getProcessHandler(), runner, env);
res.setRestartActions(resumeAction);
}
return res;
@@ -107,11 +107,6 @@ public class MavenRunConfiguration extends RunConfigurationBase implements Locat
return state;
}
- @Override
- public void checkConfiguration() throws RuntimeConfigurationException {
-
- }
-
private void updateProjectsFolders() {
MavenProjectsManager.getInstance(getProject()).updateProjectTargetFolders();
}
@@ -171,16 +166,7 @@ public class MavenRunConfiguration extends RunConfigurationBase implements Locat
}
@Override
- public boolean isGeneratedName() {
- return Comparing.equal(getName(), getGeneratedName());
- }
-
- @Override
public String suggestedName() {
- return getGeneratedName();
- }
-
- private String getGeneratedName() {
return MavenRunConfigurationType.generateName(getProject(), mySettings.myRunnerParameters);
}
diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/execution/MavenRunConfigurationType.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/execution/MavenRunConfigurationType.java
index 6dd8743a227e..3747107fb223 100644
--- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/execution/MavenRunConfigurationType.java
+++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/execution/MavenRunConfigurationType.java
@@ -23,6 +23,7 @@ import com.intellij.execution.configurations.ConfigurationType;
import com.intellij.execution.configurations.ConfigurationTypeUtil;
import com.intellij.execution.configurations.RunConfiguration;
import com.intellij.execution.executors.DefaultRunExecutor;
+import com.intellij.execution.impl.DefaultJavaProgramRunner;
import com.intellij.execution.runners.ExecutionEnvironment;
import com.intellij.execution.runners.ProgramRunner;
import com.intellij.openapi.project.Project;
@@ -184,12 +185,12 @@ public class MavenRunConfigurationType implements ConfigurationType {
params,
project);
- ProgramRunner runner = RunnerRegistry.getInstance().findRunnerById(DefaultRunExecutor.EXECUTOR_ID);
- ExecutionEnvironment env = new ExecutionEnvironment(runner, configSettings, project);
+ ProgramRunner runner = DefaultJavaProgramRunner.getInstance();
Executor executor = DefaultRunExecutor.getRunExecutorInstance();
+ ExecutionEnvironment env = new ExecutionEnvironment(executor, runner, configSettings, project);
try {
- runner.execute(executor, env, callback);
+ runner.execute(env, callback);
}
catch (ExecutionException e) {
MavenUtil.showError(project, "Failed to execute Maven goal", e);
diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/MavenModuleImporter.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/MavenModuleImporter.java
index 90f67438db2f..c628a6c01b28 100644
--- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/MavenModuleImporter.java
+++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/MavenModuleImporter.java
@@ -185,6 +185,7 @@ public class MavenModuleImporter {
}
if (artifact.getClassifier() != null
+ && !isTestJar
&& !"system".equals(artifact.getScope())
&& !"false".equals(System.getProperty("idea.maven.classifier.dep"))) {
MavenArtifact a = new MavenArtifact(
diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/MavenProjectImporter.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/MavenProjectImporter.java
index d6c0b1e4c51f..003ef09ce0fe 100644
--- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/MavenProjectImporter.java
+++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/MavenProjectImporter.java
@@ -25,6 +25,7 @@ import com.intellij.openapi.roots.LibraryOrderEntry;
import com.intellij.openapi.roots.ModifiableRootModel;
import com.intellij.openapi.roots.ModuleRootModel;
import com.intellij.openapi.roots.OrderEntry;
+import com.intellij.openapi.roots.impl.libraries.LibraryImpl;
import com.intellij.openapi.roots.libraries.Library;
import com.intellij.openapi.ui.Messages;
import com.intellij.openapi.util.Pair;
@@ -307,7 +308,9 @@ public class MavenProjectImporter {
if (result[0] == 1) return false;// NO
for (Module each : obsoleteModules) {
- myModuleModel.disposeModule(each);
+ if (!each.isDisposed()) {
+ myModuleModel.disposeModule(each);
+ }
}
return true;
@@ -559,7 +562,7 @@ public class MavenProjectImporter {
boolean removed = false;
for (Library each : unusedLibraries) {
- if (MavenRootModelAdapter.isMavenLibrary(each) && !MavenRootModelAdapter.isChangedByUser(each)) {
+ if (!isDisposed(each) && MavenRootModelAdapter.isMavenLibrary(each) && !MavenRootModelAdapter.isChangedByUser(each)) {
myModelsProvider.removeLibrary(each);
removed = true;
}
@@ -567,6 +570,10 @@ public class MavenProjectImporter {
return removed;
}
+ private static boolean isDisposed(Library library) {
+ return library instanceof LibraryImpl && ((LibraryImpl)library).isDisposed();
+ }
+
private Collection<ModuleRootModel> collectModuleModels() {
Map<Module, ModuleRootModel> rootModels = new THashMap<Module, ModuleRootModel>();
for (MavenProject each : myProjectsToImportWithChanges.keySet()) {
diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/MavenRootModelAdapter.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/MavenRootModelAdapter.java
index b0c6b64c9225..373161da1286 100644
--- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/MavenRootModelAdapter.java
+++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/MavenRootModelAdapter.java
@@ -30,6 +30,7 @@ import com.intellij.openapi.vfs.JarFileSystem;
import com.intellij.openapi.vfs.VirtualFileManager;
import com.intellij.pom.java.LanguageLevel;
import com.intellij.util.Processor;
+import gnu.trove.THashSet;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.idea.maven.model.MavenArtifact;
@@ -40,6 +41,7 @@ import org.jetbrains.idea.maven.utils.Path;
import org.jetbrains.idea.maven.utils.Url;
import java.io.File;
+import java.util.Set;
public class MavenRootModelAdapter {
@@ -47,6 +49,8 @@ public class MavenRootModelAdapter {
private final ModifiableModuleModel myModuleModel;
private final ModifiableRootModel myRootModel;
+ private final Set<String> myOrderEntriesBeforeJdk = new THashSet<String>();
+
public MavenRootModelAdapter(@NotNull MavenProject p, @NotNull Module module, final MavenModifiableModelsProvider rootModelsProvider) {
myMavenProject = p;
myModuleModel = rootModelsProvider.getModuleModel();
@@ -82,8 +86,14 @@ public class MavenRootModelAdapter {
}
private void initOrderEntries() {
+ boolean jdkProcessed = false;
+
for (OrderEntry e : myRootModel.getOrderEntries()) {
- if (e instanceof ModuleSourceOrderEntry || e instanceof JdkOrderEntry) continue;
+ if (e instanceof ModuleSourceOrderEntry || e instanceof JdkOrderEntry) {
+ jdkProcessed = true;
+ continue;
+ }
+
if (e instanceof LibraryOrderEntry) {
if (!isMavenLibrary(((LibraryOrderEntry)e).getLibrary())) continue;
}
@@ -91,6 +101,16 @@ public class MavenRootModelAdapter {
Module m = ((ModuleOrderEntry)e).getModule();
if (m != null && !MavenProjectsManager.getInstance(myRootModel.getProject()).isMavenizedModule(m)) continue;
}
+
+ if (!jdkProcessed) {
+ if (e instanceof ModuleOrderEntry) {
+ myOrderEntriesBeforeJdk.add(((ModuleOrderEntry)e).getModuleName());
+ }
+ else if (e instanceof LibraryOrderEntry) {
+ myOrderEntriesBeforeJdk.add(((LibraryOrderEntry)e).getLibraryName());
+ }
+ }
+
myRootModel.removeOrderEntry(e);
}
}
@@ -278,6 +298,10 @@ public class MavenRootModelAdapter {
if (testJar) {
((ModuleOrderEntryImpl)e).setProductionOnTestDependency(true);
}
+
+ if (myOrderEntriesBeforeJdk.contains(moduleName)) {
+ moveLastOrderEntryBeforeJdk();
+ }
}
@Nullable
@@ -302,6 +326,10 @@ public class MavenRootModelAdapter {
Library.ModifiableModel modifiableModel = library.getModifiableModel();
updateUrl(modifiableModel, OrderRootType.CLASSES, artifact, null, null, true);
modifiableModel.commit();
+
+ if (myOrderEntriesBeforeJdk.contains(libraryName)) {
+ moveLastOrderEntryBeforeJdk();
+ }
}
public void addLibraryDependency(MavenArtifact artifact,
@@ -324,6 +352,26 @@ public class MavenRootModelAdapter {
LibraryOrderEntry e = myRootModel.addLibraryEntry(library);
e.setScope(scope);
+
+ if (myOrderEntriesBeforeJdk.contains(libraryName)) {
+ moveLastOrderEntryBeforeJdk();
+ }
+ }
+
+ private void moveLastOrderEntryBeforeJdk() {
+ OrderEntry[] entries = myRootModel.getOrderEntries().clone();
+
+ int i = entries.length - 1;
+ while (i > 0 && (entries[i - 1] instanceof ModuleSourceOrderEntry || entries[i - 1] instanceof JdkOrderEntry)) {
+ OrderEntry e = entries[i - 1];
+ entries[i - 1] = entries[i];
+ entries[i] = e;
+ i--;
+ }
+
+ if (i < entries.length) {
+ myRootModel.rearrangeOrderEntries(entries);
+ }
}
private static void updateUrl(Library.ModifiableModel library,
diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/indices/MavenArtifactSearchDialog.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/indices/MavenArtifactSearchDialog.java
index cd951e106f48..d4926d66a405 100644
--- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/indices/MavenArtifactSearchDialog.java
+++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/indices/MavenArtifactSearchDialog.java
@@ -17,18 +17,20 @@ package org.jetbrains.idea.maven.indices;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.DialogWrapper;
+import com.intellij.openapi.util.Pair;
+import com.intellij.openapi.util.text.StringUtil;
import com.intellij.ui.TabbedPaneWrapper;
import gnu.trove.THashMap;
import org.jetbrains.annotations.NotNull;
+import org.jetbrains.idea.maven.dom.model.MavenDomDependency;
import org.jetbrains.idea.maven.model.MavenId;
import javax.swing.*;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import java.awt.*;
-import java.util.Collections;
+import java.util.*;
import java.util.List;
-import java.util.Map;
public class MavenArtifactSearchDialog extends DialogWrapper {
private List<MavenId> myResult = Collections.emptyList();
@@ -37,6 +39,8 @@ public class MavenArtifactSearchDialog extends DialogWrapper {
private MavenArtifactSearchPanel myArtifactsPanel;
private MavenArtifactSearchPanel myClassesPanel;
+ private final Map<Pair<String, String>, String> myManagedDependenciesMap = new HashMap<Pair<String, String>, String>();
+
private final Map<MavenArtifactSearchPanel, Boolean> myOkButtonStates = new THashMap<MavenArtifactSearchPanel, Boolean>();
@NotNull
@@ -49,14 +53,30 @@ public class MavenArtifactSearchDialog extends DialogWrapper {
}
@NotNull
- public static List<MavenId> searchForArtifact(Project project) {
+ public static List<MavenId> searchForArtifact(Project project, Collection<MavenDomDependency> managedDependencies) {
MavenArtifactSearchDialog d = new MavenArtifactSearchDialog(project, "", false);
+ d.setManagedDependencies(managedDependencies);
+
d.show();
if (!d.isOK()) return Collections.emptyList();
return d.getResult();
}
+ public void setManagedDependencies(Collection<MavenDomDependency> managedDependencies) {
+ myManagedDependenciesMap.clear();
+
+ for (MavenDomDependency dependency : managedDependencies) {
+ String groupId = dependency.getGroupId().getStringValue();
+ String artifactId = dependency.getArtifactId().getStringValue();
+ String version = dependency.getVersion().getStringValue();
+
+ if (StringUtil.isNotEmpty(groupId) && StringUtil.isNotEmpty(artifactId) && StringUtil.isNotEmpty(version)) {
+ myManagedDependenciesMap.put(Pair.create(groupId, artifactId), version);
+ }
+ }
+ }
+
private MavenArtifactSearchDialog(Project project, String initialText, boolean classMode) {
super(project, true);
@@ -84,8 +104,8 @@ public class MavenArtifactSearchDialog extends DialogWrapper {
}
};
- myArtifactsPanel = new MavenArtifactSearchPanel(project, !classMode ? initialText : "", false, listener, this);
- myClassesPanel = new MavenArtifactSearchPanel(project, classMode ? initialText : "", true, listener, this);
+ myArtifactsPanel = new MavenArtifactSearchPanel(project, !classMode ? initialText : "", false, listener, this, myManagedDependenciesMap);
+ myClassesPanel = new MavenArtifactSearchPanel(project, classMode ? initialText : "", true, listener, this, myManagedDependenciesMap);
myTabbedPane.addTab("Search for artifact", myArtifactsPanel);
myTabbedPane.addTab("Search for class", myClassesPanel);
diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/indices/MavenArtifactSearchPanel.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/indices/MavenArtifactSearchPanel.java
index 1eb0cd396a9e..de2de97c7051 100644
--- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/indices/MavenArtifactSearchPanel.java
+++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/indices/MavenArtifactSearchPanel.java
@@ -19,6 +19,8 @@ import com.intellij.icons.AllIcons;
import com.intellij.openapi.editor.colors.EditorColorsManager;
import com.intellij.openapi.editor.colors.EditorFontType;
import com.intellij.openapi.project.Project;
+import com.intellij.openapi.util.Comparing;
+import com.intellij.openapi.util.Pair;
import com.intellij.ui.*;
import com.intellij.ui.treeStructure.Tree;
import com.intellij.util.Alarm;
@@ -41,7 +43,7 @@ import java.awt.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseEvent;
-import java.util.ArrayList;
+import java.util.*;
import java.util.List;
public class MavenArtifactSearchPanel extends JPanel {
@@ -55,15 +57,18 @@ public class MavenArtifactSearchPanel extends JPanel {
private final Alarm myAlarm;
+ private final Map<Pair<String, String>, String> myManagedDependenciesMap;
+
public MavenArtifactSearchPanel(Project project,
String initialText,
boolean classMode,
Listener listener,
- MavenArtifactSearchDialog dialog) {
+ MavenArtifactSearchDialog dialog, Map<Pair<String, String>, String> managedDependenciesMap) {
myProject = project;
myDialog = dialog;
myClassMode = classMode;
myListener = listener;
+ myManagedDependenciesMap = managedDependenciesMap;
initComponents(initialText);
myAlarm = new Alarm(Alarm.ThreadToUse.POOLED_THREAD, dialog.getDisposable());
@@ -74,7 +79,6 @@ public class MavenArtifactSearchPanel extends JPanel {
}
private void initComponents(String initialText) {
- mySearchField = new JTextField(initialText);
myResultList = new Tree();
myResultList.getExpandableItemsHandler().setEnabled(false);
myResultList.getEmptyText().setText("Loading...");
@@ -86,6 +90,30 @@ public class MavenArtifactSearchPanel extends JPanel {
myResultList.setCellRenderer(renderer);
myResultList.setRowHeight(renderer.getPreferredSize().height);
+ mySearchField = new JTextField(initialText);
+ mySearchField.addKeyListener(new KeyAdapter() {
+ @Override
+ public void keyPressed(KeyEvent e) {
+ int d;
+ if (e.getKeyCode() == KeyEvent.VK_DOWN) {
+ d = 1;
+ }
+ else if (e.getKeyCode() == KeyEvent.VK_UP) {
+ d = -1;
+ }
+ else {
+ return;
+ }
+
+ int row = myResultList.getSelectionModel().getLeadSelectionRow();
+ row += d;
+
+ if (row >=0 && row < myResultList.getRowCount()) {
+ myResultList.setSelectionRow(row);
+ }
+ }
+ });
+
setLayout(new BorderLayout());
add(mySearchField, BorderLayout.NORTH);
JScrollPane pane = ScrollPaneFactory.createScrollPane(myResultList);
@@ -160,9 +188,34 @@ public class MavenArtifactSearchPanel extends JPanel {
}, 500);
}
+ private void resortUsingDependencyVersionMap(List<MavenArtifactSearchResult> result) {
+ for (MavenArtifactSearchResult searchResult : result) {
+ if (searchResult.versions.isEmpty()) continue;
+
+ MavenArtifactInfo artifactInfo = searchResult.versions.get(0);
+ final String managedVersion = myManagedDependenciesMap.get(Pair.create(artifactInfo.getGroupId(), artifactInfo.getArtifactId()));
+ if (managedVersion != null) {
+ Collections.sort(searchResult.versions, new Comparator<MavenArtifactInfo>() {
+ @Override
+ public int compare(MavenArtifactInfo o1, MavenArtifactInfo o2) {
+ String v1 = o1.getVersion();
+ String v2 = o2.getVersion();
+ if (Comparing.equal(v1, v2)) return 0;
+ if (managedVersion.equals(v1)) return -1;
+ if (managedVersion.equals(v2)) return 1;
+ return 0;
+ }
+ });
+ }
+ }
+ }
+
private void doSearch(String searchText) {
MavenSearcher searcher = myClassMode ? new MavenClassSearcher() : new MavenArtifactSearcher();
List<MavenArtifactSearchResult> result = searcher.search(myProject, searchText, 200);
+
+ resortUsingDependencyVersionMap(result);
+
final TreeModel model = new MyTreeModel(result);
SwingUtilities.invokeLater(new Runnable() {
@@ -250,7 +303,7 @@ public class MavenArtifactSearchPanel extends JPanel {
}
}
- private static class MyArtifactCellRenderer extends JPanel implements TreeCellRenderer {
+ private class MyArtifactCellRenderer extends JPanel implements TreeCellRenderer {
protected SimpleColoredComponent myLeftComponent = new SimpleColoredComponent();
protected SimpleColoredComponent myRightComponent = new SimpleColoredComponent();
@@ -327,7 +380,17 @@ public class MavenArtifactSearchPanel extends JPanel {
}
else if (value instanceof MavenArtifactInfo) {
MavenArtifactInfo info = (MavenArtifactInfo)value;
- myLeftComponent.append(info.getVersion(), SimpleTextAttributes.REGULAR_ATTRIBUTES);
+ String version = info.getVersion();
+
+ String managedVersion = myManagedDependenciesMap.get(Pair.create(info.getGroupId(), info.getArtifactId()));
+
+ if (managedVersion != null && managedVersion.equals(version)) {
+ myLeftComponent.append(version, SimpleTextAttributes.REGULAR_BOLD_ATTRIBUTES);
+ myLeftComponent.append(" (from <dependencyManagement>)", SimpleTextAttributes.GRAYED_ATTRIBUTES);
+ }
+ else {
+ myLeftComponent.append(version, SimpleTextAttributes.REGULAR_ATTRIBUTES);
+ }
}
return this;
@@ -350,7 +413,7 @@ public class MavenArtifactSearchPanel extends JPanel {
}
}
- private static class MyClassCellRenderer extends MyArtifactCellRenderer {
+ private class MyClassCellRenderer extends MyArtifactCellRenderer {
private MyClassCellRenderer(Tree tree) {
super(tree);
diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/navigator/MavenProjectsNavigator.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/navigator/MavenProjectsNavigator.java
index 34922dbdb138..8506387d0c9c 100644
--- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/navigator/MavenProjectsNavigator.java
+++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/navigator/MavenProjectsNavigator.java
@@ -141,6 +141,28 @@ public class MavenProjectsNavigator extends MavenSimpleProjectComponent implemen
}
}
+ public boolean getAlwaysShowArtifactId() {
+ return myState.alwaysShowArtifactId;
+ }
+
+ public void setAlwaysShowArtifactId(boolean value) {
+ if (myState.alwaysShowArtifactId != value) {
+ myState.alwaysShowArtifactId = value;
+ scheduleStructureUpdate();
+ }
+ }
+
+ public boolean getShowVersions() {
+ return myState.showVersions;
+ }
+
+ public void setShowVersions(boolean value) {
+ if (myState.showVersions != value) {
+ myState.showVersions = value;
+ scheduleStructureUpdate();
+ }
+ }
+
@Override
public void initComponent() {
if (!isNormalProject()) return;
@@ -242,6 +264,8 @@ public class MavenProjectsNavigator extends MavenSimpleProjectComponent implemen
group.add(actionManager.getAction("Maven.GroupProjects"));
group.add(actionManager.getAction("Maven.ShowIgnored"));
group.add(actionManager.getAction("Maven.ShowBasicPhasesOnly"));
+ group.add(actionManager.getAction("Maven.AlwaysShowArtifactId"));
+ group.add(actionManager.getAction("Maven.ShowVersions"));
myToolWindow.setAdditionalGearActions(group);
diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/navigator/MavenProjectsNavigatorState.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/navigator/MavenProjectsNavigatorState.java
index 172ca21e9682..9b0d33020e36 100644
--- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/navigator/MavenProjectsNavigatorState.java
+++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/navigator/MavenProjectsNavigatorState.java
@@ -23,6 +23,9 @@ public class MavenProjectsNavigatorState {
public boolean showIgnored = true;
public boolean showBasicPhasesOnly = true;
+ public boolean alwaysShowArtifactId = false;
+ public boolean showVersions = false;
+
@Tag("treeState")
public Element treeState;
} \ No newline at end of file
diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/navigator/MavenProjectsStructure.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/navigator/MavenProjectsStructure.java
index 4b4ad403e247..a19620df93a2 100644
--- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/navigator/MavenProjectsStructure.java
+++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/navigator/MavenProjectsStructure.java
@@ -710,7 +710,12 @@ public class MavenProjectsStructure extends SimpleTreeStructure {
@Override
public String getName() {
- return myMavenProject.getDisplayName();
+ if (myProjectsNavigator.getAlwaysShowArtifactId()) {
+ return myMavenProject.getMavenId().getArtifactId();
+ }
+ else {
+ return myMavenProject.getDisplayName();
+ }
}
@Override
@@ -736,26 +741,29 @@ public class MavenProjectsStructure extends SimpleTreeStructure {
private String makeDescription() {
StringBuilder desc = new StringBuilder();
- desc.append("<html>");
- desc.append("<table>");
- desc.append("<tr>");
- desc.append("<td nowrap>");
- desc.append("<table>");
- desc.append("<tr>");
- desc.append("<td nowrap>Project:</td>");
- desc.append("<td nowrap>").append(myMavenProject.getMavenId()).append("</td>");
- desc.append("</tr>");
- desc.append("<tr>");
- desc.append("<td nowrap>Location:</td>");
- desc.append("<td nowrap>").append(myMavenProject.getPath()).append("</td>");
- desc.append("</tr>");
- desc.append("</table>");
- desc.append("</td>");
- desc.append("</tr>");
+ desc.append("<html>" +
+ "<table>" +
+ "<tr>" +
+ "<td nowrap>" +
+ "<table>" +
+ "<tr>" +
+ "<td nowrap>Project:</td>" +
+ "<td nowrap>").append(myMavenProject.getMavenId())
+ .append("</td>" +
+ "</tr>" +
+ "<tr>" +
+ "<td nowrap>Location:</td>" +
+ "<td nowrap>").append(myMavenProject.getPath())
+ .append("</td>" +
+ "</tr>" +
+ "</table>" +
+ "</td>" +
+ "</tr>");
+
appendProblems(desc);
- desc.append("</table>");
- desc.append("</html>");
+ desc.append("</table></html>");
+
return desc.toString();
}
@@ -763,9 +771,10 @@ public class MavenProjectsStructure extends SimpleTreeStructure {
List<MavenProjectProblem> problems = myMavenProject.getProblems();
if (problems.isEmpty()) return;
- desc.append("<tr>");
- desc.append("<td nowrap>");
- desc.append("<table>");
+ desc.append("<tr>" +
+ "<td nowrap>" +
+ "<table>");
+
boolean first = true;
for (MavenProjectProblem each : problems) {
desc.append("<tr>");
@@ -780,9 +789,9 @@ public class MavenProjectsStructure extends SimpleTreeStructure {
desc.append("<td nowrap valign=top>").append(wrappedText(each)).append("</td>");
desc.append("</tr>");
}
- desc.append("</table>");
- desc.append("</td>");
- desc.append("</tr>");
+ desc.append("</table>" +
+ "</td>" +
+ "</tr>");
}
private String wrappedText(MavenProjectProblem each) {
@@ -808,6 +817,14 @@ public class MavenProjectsStructure extends SimpleTreeStructure {
return myMavenProject.getFile();
}
+ @Override
+ protected void setNameAndTooltip(String name, @Nullable String tooltip, SimpleTextAttributes attribs) {
+ super.setNameAndTooltip(name, tooltip, attribs);
+ if (myProjectsNavigator.getShowVersions()) {
+ addColoredFragment(":" + myMavenProject.getMavenId().getVersion(), new SimpleTextAttributes(SimpleTextAttributes.STYLE_PLAIN, JBColor.GRAY));
+ }
+ }
+
@Nullable
@NonNls
protected String getMenuId() {
diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/navigator/actions/AlwaysShowArtifactIdAction.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/navigator/actions/AlwaysShowArtifactIdAction.java
new file mode 100644
index 000000000000..c39f423062da
--- /dev/null
+++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/navigator/actions/AlwaysShowArtifactIdAction.java
@@ -0,0 +1,30 @@
+/*
+ * 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.navigator.actions;
+
+import org.jetbrains.idea.maven.navigator.MavenProjectsNavigator;
+
+public class AlwaysShowArtifactIdAction extends MavenProjectsNavigatorAction {
+ @Override
+ public boolean isSelected(MavenProjectsNavigator navigator) {
+ return navigator.getAlwaysShowArtifactId();
+ }
+
+ @Override
+ public void setSelected(MavenProjectsNavigator navigator, boolean value) {
+ navigator.setAlwaysShowArtifactId(value);
+ }
+} \ No newline at end of file
diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/navigator/actions/MavenExecuteGoalAction.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/navigator/actions/MavenExecuteGoalAction.java
index 55dd3e31fdec..0c32b906ee89 100644
--- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/navigator/actions/MavenExecuteGoalAction.java
+++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/navigator/actions/MavenExecuteGoalAction.java
@@ -87,13 +87,11 @@ public class MavenExecuteGoalAction extends DumbAwareAction {
Notification notification = new Notification(MavenUtil.MAVEN_NOTIFICATION_GROUP,
"Failed to execute goal",
RunnerBundle.message("external.maven.home.no.default.with.fix"), NotificationType.ERROR,
- new NotificationListener() {
+ new NotificationListener.Adapter() {
@Override
- public void hyperlinkUpdate(@NotNull Notification notification,
- @NotNull HyperlinkEvent event) {
- if (event.getEventType() == HyperlinkEvent.EventType.ACTIVATED) {
- ShowSettingsUtil.getInstance().showSettingsDialog(project, MavenSettings.DISPLAY_NAME);
- }
+ protected void hyperlinkActivated(@NotNull Notification notification,
+ @NotNull HyperlinkEvent e) {
+ ShowSettingsUtil.getInstance().showSettingsDialog(project, MavenSettings.DISPLAY_NAME);
}
});
diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/navigator/actions/ShowVersionsAction.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/navigator/actions/ShowVersionsAction.java
new file mode 100644
index 000000000000..b2ca05b0ac2f
--- /dev/null
+++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/navigator/actions/ShowVersionsAction.java
@@ -0,0 +1,30 @@
+/*
+ * 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.navigator.actions;
+
+import org.jetbrains.idea.maven.navigator.MavenProjectsNavigator;
+
+public class ShowVersionsAction extends MavenProjectsNavigatorAction {
+ @Override
+ public boolean isSelected(MavenProjectsNavigator navigator) {
+ return navigator.getShowVersions();
+ }
+
+ @Override
+ public void setSelected(MavenProjectsNavigator navigator, boolean value) {
+ navigator.setShowVersions(value);
+ }
+} \ No newline at end of file
diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/plugins/groovy/MavenGroovyPomScriptMemberContributor.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/plugins/groovy/MavenGroovyPomScriptMemberContributor.java
index 0fce635c335b..21e40a3087d5 100644
--- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/plugins/groovy/MavenGroovyPomScriptMemberContributor.java
+++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/plugins/groovy/MavenGroovyPomScriptMemberContributor.java
@@ -3,8 +3,10 @@ package org.jetbrains.idea.maven.plugins.groovy;
import com.intellij.psi.*;
import com.intellij.psi.scope.PsiScopeProcessor;
import com.intellij.psi.xml.XmlFile;
+import com.intellij.util.xml.DomManager;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
+import org.jetbrains.idea.maven.dom.MavenDomProjectModelDescription;
import org.jetbrains.plugins.groovy.lang.resolve.NonCodeMembersContributor;
import org.jetbrains.plugins.groovy.util.dynamicMembers.DynamicMemberUtils;
@@ -26,7 +28,7 @@ public class MavenGroovyPomScriptMemberContributor extends NonCodeMembersContrib
@Nullable
@Override
protected String getParentClassName() {
- return "GroovyMavenPomClassIdea";
+ return "pom";
}
@Override
@@ -41,6 +43,11 @@ public class MavenGroovyPomScriptMemberContributor extends NonCodeMembersContrib
PsiFile pomFile = pomElement.getContainingFile();
if (!(pomFile instanceof XmlFile)) return;
+ DomManager domManager = DomManager.getDomManager(pomElement.getProject());
+ if (!(domManager.getDomFileDescription((XmlFile)pomFile) instanceof MavenDomProjectModelDescription)) {
+ return;
+ }
+
DynamicMemberUtils.process(processor, false, place, CLASS_SOURCE);
}
}
diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenGeneralPanel.form b/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenGeneralPanel.form
index 30e57e55955a..5bfdc81b70d2 100644
--- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenGeneralPanel.form
+++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenGeneralPanel.form
@@ -142,6 +142,7 @@
<grid row="4" column="0" row-span="1" col-span="3" vsize-policy="0" hsize-policy="3" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
</constraints>
<properties>
+ <margin top="2" left="0" bottom="2" right="3"/>
<text value="Always update &amp;snapshots"/>
<toolTipText value="Forces a check for updated releases and snapshots on remote repositories"/>
</properties>
diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenImportingSettingsForm.form b/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenImportingSettingsForm.form
index 1be375b910c6..280176aa9282 100644
--- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenImportingSettingsForm.form
+++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenImportingSettingsForm.form
@@ -154,7 +154,7 @@
</hspacer>
</children>
</grid>
- <grid id="7fb78" binding="mySeparateModulesDirPanel" layout-manager="GridLayoutManager" row-count="1" column-count="2" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
+ <grid id="7fb78" layout-manager="GridLayoutManager" row-count="1" column-count="2" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
<margin top="0" left="0" bottom="10" right="0"/>
<constraints>
<grid row="3" column="0" row-span="1" col-span="2" vsize-policy="3" hsize-policy="3" anchor="0" fill="3" indent="0" use-parent-layout="false"/>
@@ -168,6 +168,7 @@
</constraints>
<properties>
<text value="&amp;Keep project files in:"/>
+ <toolTipText value="Keep IDEA specified files like *.iml / .idea in selected directory. By default *.iml files are stored beside the pom.xml "/>
</properties>
</component>
<component id="dd23c" class="com.intellij.openapi.ui.TextFieldWithBrowseButton" binding="mySeparateModulesDirChooser">
diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenImportingSettingsForm.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenImportingSettingsForm.java
index ea7e0f76f241..f242f3e6ea79 100644
--- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenImportingSettingsForm.java
+++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenImportingSettingsForm.java
@@ -50,7 +50,6 @@ public class MavenImportingSettingsForm {
private JCheckBox myDownloadDocsCheckBox;
private JPanel myAdditionalSettingsPanel;
- private JPanel mySeparateModulesDirPanel;
private JComboBox myGeneratedSourcesComboBox;
private JCheckBox myExcludeTargetFolderCheckBox;
private JTextField myDependencyTypes;
@@ -59,7 +58,6 @@ public class MavenImportingSettingsForm {
mySearchRecursivelyCheckBox.setVisible(isImportStep);
myProjectFormatLabel.setVisible(isImportStep && isCreatingNewProject);
myProjectFormatComboBox.setVisible(isImportStep && isCreatingNewProject);
- mySeparateModulesDirPanel.setVisible(isImportStep);
ActionListener listener = new ActionListener() {
public void actionPerformed(ActionEvent e) {
diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectsManager.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectsManager.java
index 00342683d535..5346407aa42b 100644
--- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectsManager.java
+++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectsManager.java
@@ -35,6 +35,7 @@ import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.openapi.vfs.VirtualFileManager;
import com.intellij.util.Alarm;
+import com.intellij.util.Consumer;
import com.intellij.util.EventDispatcher;
import com.intellij.util.containers.ContainerUtil;
import com.intellij.util.ui.UIUtil;
@@ -49,6 +50,7 @@ import org.jetbrains.idea.maven.importing.MavenFoldersImporter;
import org.jetbrains.idea.maven.importing.MavenModifiableModelsProvider;
import org.jetbrains.idea.maven.importing.MavenProjectImporter;
import org.jetbrains.idea.maven.model.*;
+import org.jetbrains.idea.maven.server.MavenEmbedderWrapper;
import org.jetbrains.idea.maven.server.NativeMavenProjectHolder;
import org.jetbrains.idea.maven.utils.*;
@@ -441,7 +443,7 @@ public class MavenProjectsManager extends MavenSimpleProjectComponent
public boolean isMavenizedModule(final Module m) {
AccessToken accessToken = ApplicationManager.getApplication().acquireReadActionLock();
try {
- return "true".equals(m.getOptionValue(getMavenizedModuleOptionName()));
+ return !m.isDisposed() && "true".equals(m.getOptionValue(getMavenizedModuleOptionName()));
}
finally {
accessToken.finish();
@@ -733,6 +735,39 @@ public class MavenProjectsManager extends MavenSimpleProjectComponent
});
}
+ public void evaluateEffectivePom(@NotNull final MavenProject mavenProject, @NotNull final Consumer<String> consumer) {
+ runWhenFullyOpen(new Runnable() {
+ @Override
+ public void run() {
+ myResolvingProcessor.scheduleTask(new MavenProjectsProcessorTask() {
+ @Override
+ public void perform(Project project,
+ MavenEmbeddersManager embeddersManager,
+ MavenConsole console,
+ MavenProgressIndicator indicator)
+ throws MavenProcessCanceledException {
+
+ indicator.setText("Evaluating effective POM");
+
+ myProjectsTree.executeWithEmbedder(mavenProject,
+ getEmbeddersManager(),
+ MavenEmbeddersManager.FOR_DEPENDENCIES_RESOLVE,
+ console,
+ indicator,
+ new MavenProjectsTree.EmbedderTask() {
+ @Override
+ public void run(MavenEmbedderWrapper embedder) throws MavenProcessCanceledException {
+ String res =
+ embedder.evaluateEffectivePom(mavenProject.getFile(), mavenProject.getActivatedProfilesIds());
+ consumer.consume(res);
+ }
+ });
+ }
+ });
+ }
+ });
+ }
+
@TestOnly
public void scheduleResolveInTests(Collection<MavenProject> projects) {
scheduleForNextResolve(projects);
diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectsManagerWatcher.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectsManagerWatcher.java
index 4a46293a50d5..721908c4870b 100644
--- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectsManagerWatcher.java
+++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectsManagerWatcher.java
@@ -24,6 +24,7 @@ import com.intellij.openapi.editor.EditorFactory;
import com.intellij.openapi.editor.event.DocumentAdapter;
import com.intellij.openapi.editor.event.DocumentEvent;
import com.intellij.openapi.fileEditor.FileDocumentManager;
+import com.intellij.openapi.fileEditor.impl.FileDocumentManagerImpl;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.project.ModuleAdapter;
import com.intellij.openapi.project.Project;
@@ -157,7 +158,7 @@ public class MavenProjectsManagerWatcher {
protected void run(Result result) throws Throwable {
for (Document each : copy) {
PsiDocumentManager.getInstance(myProject).commitDocument(each);
- FileDocumentManager.getInstance().saveDocument(each);
+ ((FileDocumentManagerImpl)FileDocumentManager.getInstance()).saveDocument(each, false);
}
}
}.execute();
diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/actions/MavenShowEffectivePom.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/actions/MavenShowEffectivePom.java
new file mode 100644
index 000000000000..1c1a39ceca80
--- /dev/null
+++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/actions/MavenShowEffectivePom.java
@@ -0,0 +1,126 @@
+package org.jetbrains.idea.maven.project.actions;
+
+import com.intellij.CommonBundle;
+import com.intellij.lang.xml.XMLLanguage;
+import com.intellij.notification.Notification;
+import com.intellij.notification.NotificationListener;
+import com.intellij.notification.NotificationType;
+import com.intellij.openapi.actionSystem.*;
+import com.intellij.openapi.application.ApplicationManager;
+import com.intellij.openapi.diagnostic.Logger;
+import com.intellij.openapi.project.DumbAware;
+import com.intellij.openapi.project.Project;
+import com.intellij.openapi.vfs.VirtualFile;
+import com.intellij.psi.PsiFile;
+import com.intellij.psi.PsiFileFactory;
+import com.intellij.util.Consumer;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+import org.jetbrains.idea.maven.project.MavenProject;
+import org.jetbrains.idea.maven.project.MavenProjectsManager;
+import org.jetbrains.idea.maven.server.MavenServerManager;
+import org.jetbrains.idea.maven.utils.MavenUtil;
+import org.jetbrains.idea.maven.utils.actions.MavenActionUtil;
+
+import javax.swing.event.HyperlinkEvent;
+import java.io.IOException;
+
+/**
+ * @author Sergey Evdokimov
+ */
+public class MavenShowEffectivePom extends AnAction implements DumbAware {
+
+ private static final Logger LOG = Logger.getInstance(MavenShowEffectivePom.class);
+
+ private static void showUnsupportedNotification(@NotNull final Project project, @NotNull final VirtualFile file) {
+ new Notification(MavenUtil.MAVEN_NOTIFICATION_GROUP,
+ "Unsupported action",
+ "<html>You have to <a href='#'>enable</a> <b>" + CommonBundle.settingsActionPath() + " | Maven | Importing | \"Use Maven3 to import project\"</b> option to use Show Effective POM action</html>",
+ NotificationType.ERROR,
+ new NotificationListener.Adapter() {
+ @Override
+ protected void hyperlinkActivated(@NotNull Notification notification, @NotNull HyperlinkEvent e) {
+ MavenServerManager.getInstance().setUseMaven2(false);
+ notification.expire();
+
+ new Notification(MavenUtil.MAVEN_NOTIFICATION_GROUP, "Option enabled", "Option \"Use Maven3 to import project\" has been enabled", NotificationType.INFORMATION)
+ .notify(project);
+
+ actionPerformed(project, file);
+ }
+ }).notify(project);
+ }
+
+ public static void actionPerformed(@NotNull final Project project, @NotNull VirtualFile file) {
+ final MavenProjectsManager manager = MavenProjectsManager.getInstance(project);
+
+ final MavenProject mavenProject = manager.findProject(file);
+ assert mavenProject != null;
+
+ manager.evaluateEffectivePom(mavenProject, new Consumer<String>() {
+ @Override
+ public void consume(final String s) {
+ ApplicationManager.getApplication().invokeLater(new Runnable() {
+ @Override
+ public void run() {
+ if (project.isDisposed()) return;
+
+ String fileName = mavenProject.getMavenId().getArtifactId() + "-effective-pom.xml";
+ PsiFile file = PsiFileFactory.getInstance(project).createFileFromText(fileName, XMLLanguage.INSTANCE, s);
+ try {
+ //noinspection ConstantConditions
+ file.getVirtualFile().setWritable(false);
+ }
+ catch (IOException e) {
+ LOG.error(e);
+ }
+
+ file.navigate(true);
+ }
+ });
+ }
+ });
+ }
+
+ @Nullable
+ private static VirtualFile findPomXml(@NotNull DataContext dataContext) {
+ VirtualFile file = PlatformDataKeys.VIRTUAL_FILE.getData(dataContext);
+ if (file == null) return null;
+
+ if (file.isDirectory()) {
+ file = file.findChild("pom.xml");
+ if (file == null) return null;
+ }
+
+ MavenProjectsManager manager = MavenActionUtil.getProjectsManager(dataContext);
+
+ MavenProject mavenProject = manager.findProject(file);
+ if (mavenProject == null) return null;
+
+ return file;
+ }
+
+ @Override
+ public void actionPerformed(AnActionEvent event) {
+ final Project project = MavenActionUtil.getProject(event.getDataContext());
+ final VirtualFile file = findPomXml(event.getDataContext());
+ if (file == null) return;
+
+ if (MavenServerManager.getInstance().isUseMaven2()) {
+ showUnsupportedNotification(project, file);
+ }
+ else {
+ actionPerformed(project, file);
+ }
+ }
+
+ @Override
+ public void update(AnActionEvent e) {
+ Presentation p = e.getPresentation();
+
+ boolean visible = findPomXml(e.getDataContext()) != null;
+
+ p.setVisible(visible);
+ }
+
+}
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 3686d6f7c0e7..fad0d0e5f467 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
@@ -28,6 +28,7 @@ import java.io.File;
import java.rmi.NoSuchObjectException;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
+import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
@@ -101,6 +102,17 @@ public abstract class MavenEmbedderWrapper extends RemoteObjectWrapper<MavenServ
}
@NotNull
+ public String evaluateEffectivePom(@NotNull final VirtualFile file, @NotNull final Collection<String> activeProfiles)
+ throws MavenProcessCanceledException {
+ return perform(new RetriableCancelable<String>() {
+ @Override
+ public String execute() throws RemoteException, MavenServerProcessCanceledException {
+ return getOrCreateWrappee().evaluateEffectivePom(new File(file.getPath()), new ArrayList<String>(activeProfiles));
+ }
+ });
+ }
+
+ @NotNull
public MavenArtifact resolve(@NotNull final MavenArtifactInfo info,
@NotNull final List<MavenRemoteRepository> remoteRepositories) throws MavenProcessCanceledException {
return perform(new RetriableCancelable<MavenArtifact>() {
diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/tasks/MavenShortcutsManager.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/tasks/MavenShortcutsManager.java
index 8dc1356801c9..357bd87bb1b9 100644
--- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/tasks/MavenShortcutsManager.java
+++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/tasks/MavenShortcutsManager.java
@@ -30,6 +30,7 @@ import com.intellij.util.containers.ContainerUtil;
import com.intellij.util.ui.update.MergingUpdateQueue;
import com.intellij.util.ui.update.Update;
import gnu.trove.THashMap;
+import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.annotations.TestOnly;
import org.jetbrains.idea.maven.execution.MavenRunner;
@@ -58,6 +59,7 @@ public class MavenShortcutsManager extends MavenSimpleProjectComponent {
private MyKeymapListener myKeymapListener;
private final List<Listener> myListeners = ContainerUtil.createLockFreeCopyOnWriteList();
+ @NotNull
public static MavenShortcutsManager getInstance(Project project) {
return project.getComponent(MavenShortcutsManager.class);
}
diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/utils/MavenImportNotifier.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/utils/MavenImportNotifier.java
index 52531094fc9a..98ae534d5898 100644
--- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/utils/MavenImportNotifier.java
+++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/utils/MavenImportNotifier.java
@@ -93,11 +93,9 @@ public class MavenImportNotifier extends MavenSimpleProjectComponent {
ProjectBundle.message("maven.project.changed"),
"<a href='reimport'>" + ProjectBundle.message("maven.project.importChanged") + "</a> " +
"<a href='autoImport'>" + ProjectBundle.message("maven.project.enableAutoImport") + "</a>",
- NotificationType.INFORMATION, new NotificationListener() {
+ NotificationType.INFORMATION, new NotificationListener.Adapter() {
@Override
- public void hyperlinkUpdate(@NotNull Notification notification, @NotNull HyperlinkEvent event) {
- if (event.getEventType() != HyperlinkEvent.EventType.ACTIVATED) return;
-
+ protected void hyperlinkActivated(@NotNull Notification notification, @NotNull HyperlinkEvent event) {
if (event.getDescription().equals("reimport")) {
myMavenProjectsManager.scheduleImportAndResolve();
}
diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/utils/library/RepositoryLibrarySynchronizer.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/utils/library/RepositoryLibrarySynchronizer.java
index a8e39b04b318..af17d42be16a 100644
--- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/utils/library/RepositoryLibrarySynchronizer.java
+++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/utils/library/RepositoryLibrarySynchronizer.java
@@ -66,7 +66,7 @@ import java.util.Map;
*/
public class RepositoryLibrarySynchronizer implements StartupActivity, DumbAware{
@Override
- public void runActivity(final Project project) {
+ public void runActivity(@NotNull final Project project) {
StartupManager.getInstance(project).registerPostStartupActivity(new DumbAwareRunnable() {
@Override
public void run() {
diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/vfs/MavenGotoPropertyFileContributor.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/vfs/MavenGotoPropertyFileContributor.java
index 756bd77f22d3..53afa9665b97 100644
--- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/vfs/MavenGotoPropertyFileContributor.java
+++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/vfs/MavenGotoPropertyFileContributor.java
@@ -27,12 +27,12 @@ import org.jetbrains.annotations.NotNull;
public class MavenGotoPropertyFileContributor implements ChooseByNameContributor {
@NotNull
public String[] getNames(Project project, boolean includeNonProjectItems) {
- if (!includeNonProjectItems) return ArrayUtil.EMPTY_STRING_ARRAY;
return MavenPropertiesVirtualFileSystem.PROPERTIES_FILES;
}
@NotNull
public NavigationItem[] getItemsByName(String name, String pattern, Project project, boolean includeNonProjectItems) {
+ if (!includeNonProjectItems) return NavigationItem.EMPTY_NAVIGATION_ITEM_ARRAY;
VirtualFile file = MavenPropertiesVirtualFileSystem.getInstance().findFileByPath(name);
if (file != null) {
PsiFile psiFile = PsiManager.getInstance(project).findFile(file);
diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/wizards/MavenModuleBuilder.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/wizards/MavenModuleBuilder.java
index 4933ee3469c1..6133b9e207d0 100644
--- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/wizards/MavenModuleBuilder.java
+++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/wizards/MavenModuleBuilder.java
@@ -35,6 +35,7 @@ import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.vfs.LocalFileSystem;
import com.intellij.openapi.vfs.VirtualFile;
import icons.MavenIcons;
+import org.jetbrains.annotations.NotNull;
import org.jetbrains.idea.maven.model.MavenArchetype;
import org.jetbrains.idea.maven.model.MavenId;
import org.jetbrains.idea.maven.project.MavenEnvironmentForm;
@@ -119,7 +120,7 @@ public class MavenModuleBuilder extends ModuleBuilder implements SourcePathsBuil
}
@Override
- public ModuleWizardStep[] createWizardSteps(WizardContext wizardContext, ModulesProvider modulesProvider) {
+ public ModuleWizardStep[] createWizardSteps(@NotNull WizardContext wizardContext, @NotNull ModulesProvider modulesProvider) {
return new ModuleWizardStep[]{
new MavenModuleWizardStep(wizardContext.getProject(), this, wizardContext),
new SelectPropertiesStep(wizardContext.getProject(), this)
diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/wizards/MavenProjectImportProvider.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/wizards/MavenProjectImportProvider.java
index a6445abb71fa..b54da50c1396 100644
--- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/wizards/MavenProjectImportProvider.java
+++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/wizards/MavenProjectImportProvider.java
@@ -20,6 +20,7 @@
*/
package org.jetbrains.idea.maven.wizards;
+import com.intellij.CommonBundle;
import com.intellij.ide.util.projectWizard.ModuleWizardStep;
import com.intellij.ide.util.projectWizard.ProjectWizardStepFactory;
import com.intellij.ide.util.projectWizard.WizardContext;
@@ -56,7 +57,7 @@ public class MavenProjectImportProvider extends ProjectImportProvider {
}
if (!isElementEnabled(project)) {
- stringBuilder.append(" (project is ignored. See Settings -> Maven -> Ignored Files)");
+ stringBuilder.append(" (project is ignored. See ").append(CommonBundle.settingsActionPath()).append(" | Maven | Ignored Files)");
}
return stringBuilder.toString();
diff --git a/plugins/maven/src/main/resources/META-INF/groovy-support.xml b/plugins/maven/src/main/resources/META-INF/groovy-support.xml
index 11a96b0a6187..a3b21c13bd42 100644
--- a/plugins/maven/src/main/resources/META-INF/groovy-support.xml
+++ b/plugins/maven/src/main/resources/META-INF/groovy-support.xml
@@ -4,13 +4,11 @@
<importer implementation="org.jetbrains.idea.maven.importing.Groovy_1_1_plus_Importer"/>
<pluginDescriptor mavenId="org.codehaus.groovy.maven:gmaven-plugin">
- <param name="source" languageProvider="org.jetbrains.idea.maven.plugins.groovy.MavenGroovyLanguageProvider"
- languageInjectionPrefix="class GroovyMavenPomClassIdea {{" languageInjectionSuffix="}}"/>
+ <param name="source" languageProvider="org.jetbrains.idea.maven.plugins.groovy.MavenGroovyLanguageProvider"/>
</pluginDescriptor>
<pluginDescriptor mavenId="org.codehaus.gmaven:gmaven-plugin">
- <param name="source" languageProvider="org.jetbrains.idea.maven.plugins.groovy.MavenGroovyLanguageProvider"
- languageInjectionPrefix="class GroovyMavenPomClassIdea {{" languageInjectionSuffix="}}"/>
+ <param name="source" languageProvider="org.jetbrains.idea.maven.plugins.groovy.MavenGroovyLanguageProvider"/>
</pluginDescriptor>
</extensions>
diff --git a/plugins/maven/src/main/resources/META-INF/plugin.xml b/plugins/maven/src/main/resources/META-INF/plugin.xml
index 416ecdcf62c0..07fb2430e032 100644
--- a/plugins/maven/src/main/resources/META-INF/plugin.xml
+++ b/plugins/maven/src/main/resources/META-INF/plugin.xml
@@ -192,6 +192,14 @@
<param name="filters/filter" refProvider="org.jetbrains.idea.maven.plugins.api.common.MavenCommonParamReferenceProviders$FilePath"/>
</pluginDescriptor>
+ <pluginDescriptor mavenId="org.apache.maven.plugins:maven-assembly-plugin">
+ <param name="descriptors/descriptor" refProvider="org.jetbrains.idea.maven.plugins.api.common.MavenCommonParamReferenceProviders$FilePath"/>
+ <param name="encoding" refProvider="org.jetbrains.idea.maven.plugins.api.common.MavenCommonParamReferenceProviders$Encoding"/>
+ <param name="filters/filter" refProvider="org.jetbrains.idea.maven.plugins.api.common.MavenCommonParamReferenceProviders$FilePath"/>
+ <param name="formats/format" values="dir, zip, tar, tar.gz, tar.bz2" soft="true" />
+ <param name="tarLongFileMode" values="warn, fail, truncate, gnu, omit" />
+ </pluginDescriptor>
+
<pluginDescriptor mavenId="org.apache.maven.plugins:maven-invoker-plugin">
<param name="extraArtifacts/extraArtifact" refProvider="org.jetbrains.idea.maven.dom.references.MavenDependencyReferenceProvider"/>
<param name="encoding" refProvider="org.jetbrains.idea.maven.plugins.api.common.MavenCommonParamReferenceProviders$Encoding"/>
@@ -300,6 +308,10 @@
icon="AllIcons.Actions.Refresh">
</action>
+ <action id="Maven.ShowEffectivePom" class="org.jetbrains.idea.maven.project.actions.MavenShowEffectivePom"
+ text="Show Effective POM" description="Generate and show effective POM">
+ </action>
+
<action id="Maven.UpdateFolders" class="org.jetbrains.idea.maven.project.actions.UpdateFoldersAction"
text="Generate Sources and Update Folders For All Projects"
icon="MavenIcons.UpdateFolders">
@@ -439,6 +451,14 @@
text="Show Basic Phases Only"
description="Show basic phases only"
icon="AllIcons.General.Filter"/>
+ <action id="Maven.AlwaysShowArtifactId"
+ class="org.jetbrains.idea.maven.navigator.actions.AlwaysShowArtifactIdAction"
+ text="Always Show ArtifactId"
+ description="Always Show ArtifactId instead of project name"/>
+ <action id="Maven.ShowVersions"
+ class="org.jetbrains.idea.maven.navigator.actions.ShowVersionsAction"
+ text="Show version"
+ description="Show version for Maven project"/>
<group id="Maven.TasksGroup">
<action id="Maven.BeforeCompile"
@@ -505,6 +525,7 @@
<separator/>
<reference id="Maven.DownloadAllGroup"/>
<separator/>
+ <reference id="Maven.ShowEffectivePom"/>
</group>
<group id="Maven.NavigatorProjectMenu" popup="true">
diff --git a/plugins/maven/src/main/resources/RunnerBundle.properties b/plugins/maven/src/main/resources/RunnerBundle.properties
index 58a010c924cb..a12ded3b17df 100644
--- a/plugins/maven/src/main/resources/RunnerBundle.properties
+++ b/plugins/maven/src/main/resources/RunnerBundle.properties
@@ -33,11 +33,9 @@ maven.java.home.env=Use JAVA_HOME
maven.java.home.undefined=JAVA_HOME environment variable not defined
maven.java.home.invalid=JAVA_HOME environment vairable does not point to valid JRE ({0})
maven.java.not.found=Cannot find JRE ''{0}''
-maven.java.not.found.default.config=Cannot find JRE ''{0}''. You can specify JRE to run maven goals in Settings -> Maven -> Runner
+maven.java.not.found.default.config=Cannot find JRE ''{0}''. You can specify JRE to run maven goals in Settings | Maven | Runner
maven.run.configuration.name=Maven
maven.run.configuration.description=Maven build
maven.select.maven.project.file=Select Maven project file
-maven.runner.parameters.title=Parameters
-
-maven.run.configuration.error.file.not.found=pom.xml not found in the specified working directory. \ No newline at end of file
+maven.runner.parameters.title=Parameters \ No newline at end of file
diff --git a/plugins/maven/src/test/java/org/jetbrains/idea/maven/importing/ArtifactsDownloadingTestCase.java b/plugins/maven/src/test/java/org/jetbrains/idea/maven/importing/ArtifactsDownloadingTestCase.java
index a94d1f294b9d..ecf48c16e991 100644
--- a/plugins/maven/src/test/java/org/jetbrains/idea/maven/importing/ArtifactsDownloadingTestCase.java
+++ b/plugins/maven/src/test/java/org/jetbrains/idea/maven/importing/ArtifactsDownloadingTestCase.java
@@ -16,6 +16,7 @@
package org.jetbrains.idea.maven.importing;
import com.intellij.openapi.util.io.FileUtil;
+import com.intellij.testFramework.PlatformTestUtil;
import org.jetbrains.idea.maven.MavenCustomRepositoryHelper;
import org.jetbrains.idea.maven.MavenImportingTestCase;
@@ -32,7 +33,8 @@ public abstract class ArtifactsDownloadingTestCase extends MavenImportingTestCas
}
protected void createDummyArtifact(String remoteRepo, String name) throws IOException {
- FileUtil.writeToFile(new File(remoteRepo, name), "111".getBytes());
+ FileUtil.writeToFile(new File(remoteRepo, name), PlatformTestUtil.EMPTY_JAR_BYTES);
+
FileUtil.writeToFile(new File(remoteRepo, name + ".sha1"), ("6216f8a75fd5bb3d5f22b6f9958cdede3fc086c2 " + name).getBytes());
}
}
diff --git a/plugins/maven/src/test/java/org/jetbrains/idea/maven/importing/DependenciesImportingTest.java b/plugins/maven/src/test/java/org/jetbrains/idea/maven/importing/DependenciesImportingTest.java
index 428f97842c67..390b8f817205 100644
--- a/plugins/maven/src/test/java/org/jetbrains/idea/maven/importing/DependenciesImportingTest.java
+++ b/plugins/maven/src/test/java/org/jetbrains/idea/maven/importing/DependenciesImportingTest.java
@@ -17,12 +17,10 @@ package org.jetbrains.idea.maven.importing;
import com.intellij.openapi.application.AccessToken;
import com.intellij.openapi.application.ApplicationManager;
+import com.intellij.openapi.application.Result;
import com.intellij.openapi.application.WriteAction;
import com.intellij.openapi.module.Module;
-import com.intellij.openapi.roots.DependencyScope;
-import com.intellij.openapi.roots.JavadocOrderRootType;
-import com.intellij.openapi.roots.ModuleRootModificationUtil;
-import com.intellij.openapi.roots.OrderRootType;
+import com.intellij.openapi.roots.*;
import com.intellij.openapi.roots.impl.libraries.ProjectLibraryTable;
import com.intellij.openapi.roots.libraries.Library;
import com.intellij.openapi.roots.libraries.LibraryTable;
@@ -2340,4 +2338,118 @@ public class DependenciesImportingTest extends MavenImportingTestCase {
assertModules("project", "m1");
assertModuleLibDeps("m1", "Maven: test:m2:2");
}
+
+ public void testSaveJdkPosition() throws Exception {
+ createProjectPom("<groupId>test</groupId>" +
+ "<artifactId>project</artifactId>" +
+ "<packaging>pom</packaging>" +
+ "<version>1</version>" +
+
+ "<modules>" +
+ " <module>m1</module>" +
+ " <module>m2</module>" +
+ "</modules>");
+
+ createModulePom("m1", "<groupId>test</groupId>" +
+ "<artifactId>m1</artifactId>" +
+ "<version>1</version>" +
+
+ "<dependencies>" +
+ " <dependency>" +
+ " <groupId>test</groupId>" +
+ " <artifactId>m2</artifactId>" +
+ " <version>1</version>" +
+ " </dependency>" +
+ " <dependency>" +
+ " <groupId>junit</groupId>" +
+ " <artifactId>junit</artifactId>" +
+ " <version>4.0</version>" +
+ " </dependency>" +
+
+ "</dependencies>");
+
+ createModulePom("m2", "<groupId>test</groupId>" +
+ "<artifactId>m2</artifactId>" +
+ "<version>1</version>");
+
+ importProject();
+
+ new WriteAction() {
+ @Override
+ protected void run(Result result) throws Throwable {
+ ModifiableRootModel rootModel = ModuleRootManager.getInstance(getModule("m1")).getModifiableModel();
+ OrderEntry[] orderEntries = rootModel.getOrderEntries().clone();
+ assert orderEntries.length == 4;
+ assert orderEntries[0] instanceof JdkOrderEntry;
+ assert orderEntries[1] instanceof ModuleSourceOrderEntry;
+ assert ((ModuleOrderEntry)orderEntries[2]).getModuleName().equals("m2");
+ assert "Maven: junit:junit:4.0".equals(((LibraryOrderEntry)orderEntries[3]).getLibraryName());
+
+ rootModel.rearrangeOrderEntries(new OrderEntry[]{orderEntries[2], orderEntries[3], orderEntries[0], orderEntries[1]});
+
+ rootModel.commit();
+ }
+ }.execute();
+
+ resolveDependenciesAndImport();
+
+ // JDK position was saved
+ OrderEntry[] orderEntries = ModuleRootManager.getInstance(getModule("m1")).getOrderEntries();
+ assert orderEntries.length == 4;
+ assert ((ModuleOrderEntry)orderEntries[0]).getModuleName().equals("m2");
+ assert "Maven: junit:junit:4.0".equals(((LibraryOrderEntry)orderEntries[1]).getLibraryName());
+ assert orderEntries[2] instanceof JdkOrderEntry;
+ assert orderEntries[3] instanceof ModuleSourceOrderEntry;
+ }
+
+ public void testSaveJdkPositionSystemDependency() throws Exception {
+ createProjectPom("<groupId>test</groupId>" +
+ "<artifactId>m1</artifactId>" +
+ "<version>1</version>" +
+
+ "<dependencies>" +
+ " <dependency>" +
+ " <groupId>test</groupId>" +
+ " <artifactId>systemDep</artifactId>" +
+ " <version>1</version>" +
+ " <scope>system</scope>" +
+ " <systemPath>${java.home}/lib/rt.jar</systemPath>" +
+ " </dependency>" +
+ " <dependency>" +
+ " <groupId>junit</groupId>" +
+ " <artifactId>junit</artifactId>" +
+ " <version>4.0</version>" +
+ " </dependency>" +
+
+ "</dependencies>");
+ importProject();
+
+ new WriteAction() {
+ @Override
+ protected void run(Result result) throws Throwable {
+ ModifiableRootModel rootModel = ModuleRootManager.getInstance(getModule("m1")).getModifiableModel();
+ OrderEntry[] orderEntries = rootModel.getOrderEntries().clone();
+ assert orderEntries.length == 4;
+ assert orderEntries[0] instanceof JdkOrderEntry;
+ assert orderEntries[1] instanceof ModuleSourceOrderEntry;
+ assert "Maven: test:systemDep:1".equals(((LibraryOrderEntry)orderEntries[2]).getLibraryName());
+ assert "Maven: junit:junit:4.0".equals(((LibraryOrderEntry)orderEntries[3]).getLibraryName());
+
+ rootModel.rearrangeOrderEntries(new OrderEntry[]{orderEntries[2], orderEntries[3], orderEntries[0], orderEntries[1]});
+
+ rootModel.commit();
+ }
+ }.execute();
+
+ resolveDependenciesAndImport();
+
+ // JDK position was saved
+ OrderEntry[] orderEntries = ModuleRootManager.getInstance(getModule("m1")).getOrderEntries();
+ assert orderEntries.length == 4;
+ assert "Maven: test:systemDep:1".equals(((LibraryOrderEntry)orderEntries[0]).getLibraryName());
+ assert "Maven: junit:junit:4.0".equals(((LibraryOrderEntry)orderEntries[1]).getLibraryName());
+ assert orderEntries[2] instanceof JdkOrderEntry;
+ assert orderEntries[3] instanceof ModuleSourceOrderEntry;
+ }
+
}
diff --git a/plugins/maven/src/test/java/org/jetbrains/idea/maven/inspections/MavenDuplicatedInspectionTest.groovy b/plugins/maven/src/test/java/org/jetbrains/idea/maven/inspections/MavenDuplicatedInspectionTest.groovy
index 9bee055ff90b..c5891687bb9c 100644
--- a/plugins/maven/src/test/java/org/jetbrains/idea/maven/inspections/MavenDuplicatedInspectionTest.groovy
+++ b/plugins/maven/src/test/java/org/jetbrains/idea/maven/inspections/MavenDuplicatedInspectionTest.groovy
@@ -216,4 +216,40 @@ class MavenDuplicatedInspectionTest extends MavenDomTestCase {
checkHighlighting(myProjectPom, true, false, true)
}
+ public void testDuplicatedInManagedDependencies() {
+ myFixture.enableInspections(MavenDuplicateDependenciesInspection)
+
+ createProjectPom("""
+ <groupId>mavenParent</groupId>
+ <artifactId>childA</artifactId>
+ <version>1.0</version>
+
+ <dependencyManagement>
+ <dependencies>
+ <<warning>dependency</warning>>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ <version>3.8.2</version>
+ <type>jar</type>
+ </dependency>
+
+ <<warning>dependency</warning>>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ <version>4.0</version>
+ </dependency>
+
+ <dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ <version>4.0</version>
+ <classifier>sources</classifier>
+ </dependency>
+ </dependencies>
+ </dependencyManagement>
+""")
+
+ checkHighlighting()
+ }
+
}
diff --git a/plugins/maven/src/test/java/org/jetbrains/idea/maven/plugins/groovy/MavenGroovyInjectionTest.groovy b/plugins/maven/src/test/java/org/jetbrains/idea/maven/plugins/groovy/MavenGroovyInjectionTest.groovy
index 4f0502dc4e58..31693eb342e3 100644
--- a/plugins/maven/src/test/java/org/jetbrains/idea/maven/plugins/groovy/MavenGroovyInjectionTest.groovy
+++ b/plugins/maven/src/test/java/org/jetbrains/idea/maven/plugins/groovy/MavenGroovyInjectionTest.groovy
@@ -155,4 +155,42 @@ class MavenGroovyInjectionTest extends LightCodeInsightFixtureTestCase {
assert element.getDeclaredType().getPresentableText() == "MavenProject"
}
+ public void testHighlighting() {
+ myFixture.configureByText("pom.xml", """<?xml version="1.0" encoding="UTF-8"?>
+<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/xsd/maven-4.0.0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+
+ <groupId>simpleMaven</groupId>
+ <artifactId>simpleMaven</artifactId>
+ <version>1.0</version>
+
+ <packaging>jar</packaging>
+
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.codehaus.gmaven</groupId>
+ <artifactId>gmaven-plugin</artifactId>
+ <version>1.3</version>
+ <configuration>
+ <!-- http://groovy.codehaus.org/The+groovydoc+Ant+task -->
+ <source>
+ import java.lang.String;
+
+ class SomeClass { public static String buildHi() { return "Hi 2!" } }
+ println SomeClass.buildHi()
+ </source>
+ </configuration>
+ </plugin>
+ </plugins>
+ </build>
+
+</project>
+""")
+
+ myFixture.checkHighlighting(true, false, true)
+ }
+
}