From 8597fb4924ccb15315b866934c1269bafdf475bb Mon Sep 17 00:00:00 2001 From: Sergey Evdokimov Date: Fri, 11 May 2012 17:16:55 +0400 Subject: [PATCH] IDEA-84573 (Maven: configurable generate-sources behavior - use it as a source root or use intermediate folders) --- .../maven/importing/MavenFoldersImporter.java | 40 +++++++++++++++-- .../maven/project/MavenImportingSettings.java | 28 ++++++++++++ .../project/MavenImportingSettingsForm.form | 45 +++++++++++++++---- .../project/MavenImportingSettingsForm.java | 15 +++++++ .../maven/importing/FoldersImportingTest.java | 45 +++++++++++++++++-- 5 files changed, 157 insertions(+), 16 deletions(-) diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/MavenFoldersImporter.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/MavenFoldersImporter.java index 2cf3f3aed5bc..59c94ab487ed 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/MavenFoldersImporter.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/MavenFoldersImporter.java @@ -15,6 +15,8 @@ */ package org.jetbrains.idea.maven.importing; +import com.intellij.ide.util.projectWizard.importSources.JavaModuleSourceRoot; +import com.intellij.ide.util.projectWizard.importSources.JavaSourceRootDetectionUtil; import com.intellij.openapi.application.AccessToken; import com.intellij.openapi.application.WriteAction; import com.intellij.openapi.module.Module; @@ -23,6 +25,7 @@ import com.intellij.openapi.project.Project; import com.intellij.openapi.roots.ModifiableRootModel; import com.intellij.openapi.roots.ProjectRootManager; import com.intellij.openapi.util.Pair; +import com.intellij.util.ArrayUtil; import gnu.trove.THashMap; import org.jetbrains.annotations.NotNull; import org.jetbrains.idea.maven.model.MavenResource; @@ -33,6 +36,7 @@ import org.jetbrains.idea.maven.utils.Path; import java.io.File; import java.util.ArrayList; +import java.util.Collection; import java.util.List; import java.util.Map; @@ -169,7 +173,7 @@ public class MavenFoldersImporter { Boolean isGeneratedTestSources = generatedDirs.get(f); if (isGeneratedTestSources != null) { - addAllSubDirsAsSources(f, isGeneratedTestSources); + configGeneratedSourceFolder(f, isGeneratedTestSources); } else { if (myModel.hasRegisteredSourceSubfolder(f)) continue; @@ -195,7 +199,35 @@ public class MavenFoldersImporter { } } - private void addAllSubDirsAsSources(File dir, boolean isTestSources) { + private void configGeneratedSourceFolder(@NotNull File dir, boolean isTestSources) { + switch (myImportingSettings.getGeneratedSourcesFolder()) { + case GENERATED_SOURCE_FOLDER: + if (!myModel.hasRegisteredSourceSubfolder(dir)) { + myModel.addSourceFolder(dir.getPath(), isTestSources); + } + break; + + case SUBFOLDER: + addAllSubDirsAsSources(dir, isTestSources); + break; + + case AUTODETECT: + Collection sourceRoots = JavaSourceRootDetectionUtil.suggestRoots(dir); + if (sourceRoots.size() == 1) { + JavaModuleSourceRoot root = sourceRoots.iterator().next(); + if (dir.equals(root.getDirectory())) { + if (!myModel.hasRegisteredSourceSubfolder(dir)) { + myModel.addSourceFolder(dir.getPath(), isTestSources); + } + break; + } + } + addAllSubDirsAsSources(dir, isTestSources); + break; + } + } + + private void addAllSubDirsAsSources(@NotNull File dir, boolean isTestSources) { for (File f : getChildren(dir)) { if (!f.isDirectory()) continue; if (myModel.hasRegisteredSourceSubfolder(f)) continue; @@ -203,8 +235,8 @@ public class MavenFoldersImporter { } } - private File[] getChildren(File dir) { + private static File[] getChildren(File dir) { File[] result = dir.listFiles(); - return result == null ? new File[0] : result; + return result == null ? ArrayUtil.EMPTY_FILE_ARRAY : result; } } diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenImportingSettings.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenImportingSettings.java index 12c83e6fdebe..0604282bafdb 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenImportingSettings.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenImportingSettings.java @@ -16,6 +16,7 @@ package org.jetbrains.idea.maven.project; import com.intellij.util.containers.ContainerUtil; +import com.intellij.util.xmlb.annotations.Property; import org.jetbrains.annotations.NotNull; import java.util.List; @@ -46,8 +47,22 @@ public class MavenImportingSettings implements Cloneable { private boolean downloadSourcesAutomatically = false; private boolean downloadDocsAutomatically = false; + private GeneratedSourcesFolder generatedSourcesFolder = GeneratedSourcesFolder.AUTODETECT; + private List myListeners = ContainerUtil.createEmptyCOWList(); + public enum GeneratedSourcesFolder { + AUTODETECT("Auto detect"), + GENERATED_SOURCE_FOLDER("target/generated-sources"), + SUBFOLDER("subdirectories of \"target/generated-sources\""); + + public final String title; + + private GeneratedSourcesFolder(String title) { + this.title = title; + } + } + @NotNull public String getDedicatedModuleDir() { return dedicatedModuleDir; @@ -132,6 +147,18 @@ public class MavenImportingSettings implements Cloneable { this.downloadDocsAutomatically = value; } + @Property + @NotNull + public GeneratedSourcesFolder getGeneratedSourcesFolder() { + return generatedSourcesFolder; + } + + public void setGeneratedSourcesFolder(GeneratedSourcesFolder generatedSourcesFolder) { + if (generatedSourcesFolder == null) return; // null may come from deserializator + + this.generatedSourcesFolder = generatedSourcesFolder; + } + @Override public boolean equals(Object o) { if (this == o) return true; @@ -147,6 +174,7 @@ public class MavenImportingSettings implements Cloneable { if (lookForNested != that.lookForNested) return false; if (keepSourceFolders != that.keepSourceFolders) return false; if (useMavenOutput != that.useMavenOutput) return false; + if (generatedSourcesFolder != that.generatedSourcesFolder) return false; if (!dedicatedModuleDir.equals(that.dedicatedModuleDir)) return false; if (updateFoldersOnImportPhase != null ? !updateFoldersOnImportPhase.equals(that.updateFoldersOnImportPhase) 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 b139c1710d06..48df1820fa0a 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 @@ -1,6 +1,6 @@
- + @@ -42,7 +42,7 @@ - + @@ -59,7 +59,7 @@ - + @@ -108,7 +108,7 @@ - + @@ -116,7 +116,7 @@ - + @@ -176,13 +176,13 @@ - + - + @@ -211,7 +211,7 @@ - + @@ -223,6 +223,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 a87e516cf075..51d33ada7b05 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 @@ -15,12 +15,14 @@ */ package org.jetbrains.idea.maven.project; +import com.intellij.ide.ui.ListCellRendererWrapper; import com.intellij.ide.util.projectWizard.WizardContext; import com.intellij.openapi.fileChooser.FileChooserDescriptorFactory; import com.intellij.openapi.ui.TextFieldWithBrowseButton; import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.util.text.StringUtil; import com.intellij.projectImport.ProjectFormatPanel; +import com.intellij.ui.EnumComboBoxModel; import javax.swing.*; import java.awt.event.ActionEvent; @@ -48,6 +50,7 @@ public class MavenImportingSettingsForm { private JPanel myAdditionalSettingsPanel; private JPanel mySeparateModulesDirPanel; + private JComboBox myGeneratedSourcesComboBox; public MavenImportingSettingsForm(boolean isImportStep, boolean isCreatingNewProject) { mySearchRecursivelyCheckBox.setVisible(isImportStep); @@ -66,6 +69,16 @@ public class MavenImportingSettingsForm { FileChooserDescriptorFactory.createSingleFolderDescriptor()); myUpdateFoldersOnImportPhaseComboBox.setModel(new DefaultComboBoxModel(MavenImportingSettings.UPDATE_FOLDERS_PHASES)); + + myGeneratedSourcesComboBox.setModel(new EnumComboBoxModel(MavenImportingSettings.GeneratedSourcesFolder.class)); + myGeneratedSourcesComboBox.setRenderer(new ListCellRendererWrapper(myGeneratedSourcesComboBox.getRenderer()) { + @Override + public void customize(JList list, Object value, int index, boolean selected, boolean hasFocus) { + if (value instanceof MavenImportingSettings.GeneratedSourcesFolder) { + setText(((MavenImportingSettings.GeneratedSourcesFolder)value).title); + } + } + }); } private void createUIComponents() { @@ -101,6 +114,7 @@ public class MavenImportingSettingsForm { data.setUseMavenOutput(myUseMavenOutputCheckBox.isSelected()); data.setUpdateFoldersOnImportPhase((String)myUpdateFoldersOnImportPhaseComboBox.getSelectedItem()); + data.setGeneratedSourcesFolder((MavenImportingSettings.GeneratedSourcesFolder)myGeneratedSourcesComboBox.getSelectedItem()); data.setDownloadSourcesAutomatically(myDownloadSourcesCheckBox.isSelected()); data.setDownloadDocsAutomatically(myDownloadDocsCheckBox.isSelected()); @@ -120,6 +134,7 @@ public class MavenImportingSettingsForm { myUseMavenOutputCheckBox.setSelected(data.isUseMavenOutput()); myUpdateFoldersOnImportPhaseComboBox.setSelectedItem(data.getUpdateFoldersOnImportPhase()); + myGeneratedSourcesComboBox.setSelectedItem(data.getGeneratedSourcesFolder()); myDownloadSourcesCheckBox.setSelected(data.isDownloadSourcesAutomatically()); myDownloadDocsCheckBox.setSelected(data.isDownloadDocsAutomatically()); diff --git a/plugins/maven/src/test/java/org/jetbrains/idea/maven/importing/FoldersImportingTest.java b/plugins/maven/src/test/java/org/jetbrains/idea/maven/importing/FoldersImportingTest.java index b9a215951c0c..4e343e5f6011 100644 --- a/plugins/maven/src/test/java/org/jetbrains/idea/maven/importing/FoldersImportingTest.java +++ b/plugins/maven/src/test/java/org/jetbrains/idea/maven/importing/FoldersImportingTest.java @@ -21,6 +21,9 @@ import com.intellij.openapi.roots.ModuleRootManager; import com.intellij.openapi.vfs.VirtualFile; import org.jetbrains.idea.maven.MavenCustomRepositoryHelper; import org.jetbrains.idea.maven.MavenImportingTestCase; +import org.jetbrains.idea.maven.project.MavenGeneralSettings; +import org.jetbrains.idea.maven.project.MavenImportingSettings; +import org.jetbrains.idea.maven.project.MavenProjectsManager; import org.jetbrains.idea.maven.utils.Path; import java.io.File; @@ -530,10 +533,11 @@ public class FoldersImportingTest extends MavenImportingTestCase { public void testAddingExistingGeneratedSources() throws Exception { createStdProjectFolders(); - createProjectSubDirs("target/generated-sources/src1", - "target/generated-sources/src2", - "target/generated-test-sources/test1", - "target/generated-test-sources/test2"); + + createProjectSubFile("target/generated-sources/src1/com/A.java", "package com; class A {}"); + createProjectSubFile("target/generated-sources/src2/com/B.java", "package com; class B {}"); + createProjectSubFile("target/generated-test-sources/test1/com/test/A.java", "package com.test; class A {}"); + createProjectSubFile("target/generated-test-sources/test2/com/test/B.java", "package com.test; class B {}"); importProject("test" + "project" + @@ -552,6 +556,39 @@ public class FoldersImportingTest extends MavenImportingTestCase { "target/generated-test-sources/test2"); } + public void testAddingExistingGeneratedSources2() throws Exception { + createStdProjectFolders(); + + createProjectSubFile("target/generated-sources/com/A.java", "package com; class A {}"); + + importProject("test" + + "project" + + "1"); + + assertSources("project", + "src/main/java", + "src/main/resources", + "target/generated-sources"); + } + + public void testAddingExistingGeneratedSources3() throws Exception { + createStdProjectFolders(); + + MavenProjectsManager.getInstance(myProject).getImportingSettings().setGeneratedSourcesFolder( + MavenImportingSettings.GeneratedSourcesFolder.SUBFOLDER); + + createProjectSubFile("target/generated-sources/com/A.java", "package com; class A {}"); + + importProject("test" + + "project" + + "1"); + + assertSources("project", + "src/main/java", + "src/main/resources", + "target/generated-sources/com"); + } + public void testAddingExistingGeneratedSourcesWithCustomTargetDir() throws Exception { createStdProjectFolders(); createProjectSubDirs("targetCustom/generated-sources/src",