[maven] Workspace import: replace content of pre-existing modules when importing them as Maven modules (IDEA-288545)

GitOrigin-RevId: 473b6d9a0ffce08ea8034da4da53d4c0d6e027c0
This commit is contained in:
Anton Makeev
2022-07-01 17:27:31 +00:00
committed by intellij-monorepo-bot
parent 8d4226680c
commit ae28599833
5 changed files with 71 additions and 13 deletions
@@ -10,8 +10,10 @@ import com.intellij.workspaceModel.ide.JpsImportedEntitySource
import com.intellij.workspaceModel.ide.WorkspaceModel
import com.intellij.workspaceModel.ide.getInstance
import com.intellij.workspaceModel.ide.impl.legacyBridge.module.ModuleManagerBridgeImpl.Companion.findModuleByEntity
import com.intellij.workspaceModel.storage.EntitySource
import com.intellij.workspaceModel.storage.MutableEntityStorage
import com.intellij.workspaceModel.storage.bridgeEntities.api.ExternalSystemModuleOptionsEntity
import com.intellij.workspaceModel.storage.bridgeEntities.api.ModuleEntity
import com.intellij.workspaceModel.storage.bridgeEntities.api.ModuleId
import com.intellij.workspaceModel.storage.url.VirtualFileUrlManager
import org.jetbrains.idea.maven.importing.MavenModelUtil
@@ -137,8 +139,16 @@ class MavenProjectImporterToWorkspace(
val importModuleData = mutableListOf<AppliedModuleData>()
MavenUtil.invokeAndWaitWriteAction(myProject) {
WorkspaceModel.getInstance(myProject).updateProjectModel { current ->
current.replaceBySource(
{ (it as? JpsImportedEntitySource)?.externalSystemId == WorkspaceModuleImporter.EXTERNAL_SOURCE_ID }, builder)
// remove modules which should be replaced with Maven modules, in order to clean them from pre-existing sources, dependencies etc.
// It's needed since otherwise 'replaceBySource' will merge pre-existing Module content with imported module content, resulting in
// unexpected module configuration.
val importedModuleNames = createdModules.mapTo(mutableSetOf()) { it.moduleId.name }
current
.entities(ModuleEntity::class.java)
.filter { !isMainEntity(it.entitySource) && it.name in importedModuleNames }
.forEach { current.removeEntity(it) }
current.replaceBySource({ isMainEntity(it) }, builder)
}
val storage = WorkspaceModel.getInstance(myProject).entityStorage.current
for ((moduleId, mavenProject, moduleType) in createdModules) {
@@ -154,6 +164,9 @@ class MavenProjectImporterToWorkspace(
return importModuleData
}
private fun isMainEntity(it: EntitySource) =
(it as? JpsImportedEntitySource)?.externalSystemId == WorkspaceModuleImporter.EXTERNAL_SOURCE_ID
private fun finalizeImport(modules: List<AppliedModuleData>,
moduleNameByProject: Map<MavenProject, String>,
projectChanges: Map<MavenProject, MavenProjectChanges>,
@@ -217,7 +217,7 @@ public class FoldersImportingTest extends MavenMultiVersionImportingTestCase {
"</build>");
resolveFoldersAndImport();
if (supportsKeepingFoldersFromPreviousImport()) {
if (supportsLegacyKeepingFoldersFromPreviousImport()) {
assertSources("project", "src2", "src1");
}
else {
@@ -1560,9 +1560,9 @@ public class FoldersImportingTest extends MavenMultiVersionImportingTestCase {
testAssertions.accept(true);
importProject();
testAssertions.accept(supportsKeepingFoldersFromPreviousImport());
testAssertions.accept(supportsLegacyKeepingFoldersFromPreviousImport());
resolveFoldersAndImport();
testAssertions.accept(supportsKeepingFoldersFromPreviousImport());
testAssertions.accept(supportsLegacyKeepingFoldersFromPreviousImport());
}
@Test
@@ -19,7 +19,6 @@ import org.jetbrains.idea.maven.MavenCustomRepositoryHelper;
import org.jetbrains.idea.maven.model.MavenId;
import org.jetbrains.idea.maven.project.MavenProject;
import org.jetbrains.idea.maven.server.MavenServerManager;
import org.junit.Assume;
import org.junit.Test;
import java.io.File;
@@ -101,8 +100,6 @@ public class MiscImportingTest extends MavenMultiVersionImportingTestCase {
@Test
public void testImportingAllAvailableFilesIfNotInitialized() {
Assume.assumeTrue(supportsSeveralProjectsInSameFolders());
createModule("m1");
createModule("m2");
createProjectSubDirs("m1/src/main/java",
@@ -26,6 +26,7 @@ import com.intellij.openapi.roots.ModuleRootManager;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.pom.java.LanguageLevel;
import com.intellij.testFramework.PlatformTestUtil;
import com.intellij.testFramework.PsiTestUtil;
import org.jetbrains.idea.maven.project.MavenGeneralSettings;
import org.jetbrains.idea.maven.project.MavenProject;
import org.junit.Assume;
@@ -65,6 +66,57 @@ public class StructureImportingTest extends MavenMultiVersionImportingTestCase {
}
}
@Test
public void testImportWithAlreadyExistingModules() throws IOException {
createModule("m1");
createModule("m2");
createModule("m3");
PsiTestUtil.addSourceRoot(getModule("m1"), createProjectSubFile("m1/user-sources"));
PsiTestUtil.addSourceRoot(getModule("m2"), createProjectSubFile("m2/user-sources"));
PsiTestUtil.addSourceRoot(getModule("m3"), createProjectSubFile("m3/user-sources"));
assertModules("m1", "m2", "m3");
assertSources("m1", "user-sources");
assertSources("m2", "user-sources");
assertSources("m3", "user-sources");
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>");
createModulePom("m2", "<groupId>test</groupId>" +
"<artifactId>m2</artifactId>" +
"<version>1</version>");
createProjectSubDirs("m1/src/main/java",
"m2/src/main/java",
"m3/src/main/java");
importProject();
assertModules("project", "m1", "m2", "m3");
if (supportsLegacyKeepingFoldersFromPreviousImport()) {
assertSources("m1", "user-sources", "src/main/java");
assertSources("m2", "user-sources", "src/main/java");
assertSources("m3", "user-sources");
}
else {
assertSources("m1", "src/main/java");
assertSources("m2", "src/main/java");
assertSources("m3", "user-sources");
}
}
@Test
public void testMarkModulesAsMavenized() {
createModule("userModule");
@@ -121,10 +121,6 @@ public abstract class MavenImportingTestCase extends MavenTestCase {
);
}
public boolean supportsSeveralProjectsInSameFolders() {
return !MavenProjectImporter.isImportToWorkspaceModelEnabled(); // TODO should be supported!
}
public boolean supportModuleGroups() {
return !MavenProjectImporter.isImportToWorkspaceModelEnabled()
&& !MavenProjectImporter.isImportToTreeStructureEnabled(myProject);
@@ -139,7 +135,7 @@ public abstract class MavenImportingTestCase extends MavenTestCase {
&& !MavenProjectImporter.isImportToTreeStructureEnabled(myProject);
}
public boolean supportsKeepingFoldersFromPreviousImport() {
public boolean supportsLegacyKeepingFoldersFromPreviousImport() {
return !MavenProjectImporter.isImportToWorkspaceModelEnabled();
}