diff options
author | Tor Norbye <tnorbye@google.com> | 2013-08-07 11:11:08 -0700 |
---|---|---|
committer | Tor Norbye <tnorbye@google.com> | 2013-08-07 11:11:08 -0700 |
commit | 6739a8f0977b70ddc8a8283b169902da3f2eecb3 (patch) | |
tree | 5c5573c2ac01544f02d9318671aa558769726289 /plugins/maven | |
parent | c1ace1f7e1e49c81bb4b75377c99f07be340abfe (diff) | |
download | idea-6739a8f0977b70ddc8a8283b169902da3f2eecb3.tar.gz |
Snapshot af729d01433bb5bbd6ca93c0fdf9778b36d624ce from master branch of git://git.jetbrains.org/idea/community.git
Change-Id: I214dd066d0d27444a26166c0eae1a5aaf3705d49
Diffstat (limited to 'plugins/maven')
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 &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="&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) + } + } |