IDEA-150835: Provide an API which tells which production module corresponding to...
[idea/community.git] / platform / external-system-impl / src / com / intellij / openapi / externalSystem / service / project / manage / AbstractModuleDataService.java
index 81847f1ed9a2d001e0675d00448fe1b482f75d16..60c9d7d4e7b626c6b74de7d43f08f1ecfa008ec9 100644 (file)
@@ -45,7 +45,10 @@ import com.intellij.pom.java.LanguageLevel;
 import com.intellij.ui.CheckBoxList;
 import com.intellij.ui.IdeBorderFactory;
 import com.intellij.ui.components.JBScrollPane;
-import com.intellij.util.*;
+import com.intellij.util.ArrayUtil;
+import com.intellij.util.Consumer;
+import com.intellij.util.Function;
+import com.intellij.util.SmartList;
 import com.intellij.util.containers.ContainerUtil;
 import com.intellij.util.containers.ContainerUtilRt;
 import org.jetbrains.annotations.NotNull;
@@ -82,18 +85,35 @@ public abstract class AbstractModuleDataService<E extends ModuleData> extends Ab
     if (!toCreate.isEmpty()) {
       createModules(toCreate, modelsProvider, project);
     }
+
     for (DataNode<E> node : toImport) {
       Module module = node.getUserData(MODULE_KEY);
       if (module != null) {
         setModuleOptions(module, node);
-
-        final ModifiableModuleModel modifiableModel = modelsProvider.getModifiableModuleModel();
-        modifiableModel.setModuleGroupPath(module, node.getData().getIdeModuleGroup());
         ModifiableRootModel modifiableRootModel = modelsProvider.getModifiableRootModel(module);
         syncPaths(module, modifiableRootModel, node.getData());
         setLanguageLevel(modifiableRootModel, node.getData());
       }
     }
+
+    final boolean isOneToOneMapping = projectData != null && ExternalSystemApiUtil.isOneToOneMapping(project, projectData);
+    for (DataNode<E> node : toImport) {
+      Module module = node.getUserData(MODULE_KEY);
+      if (module != null) {
+        final String[] groupPath;
+        if (isOneToOneMapping || projectData == null) {
+          groupPath = node.getData().getIdeModuleGroup();
+        }
+        else {
+          final String externalProjectGroup = projectData.getInternalName() + " modules";
+          groupPath = node.getData().getIdeModuleGroup() == null
+                      ? new String[]{externalProjectGroup}
+                      : ArrayUtil.prepend(externalProjectGroup, node.getData().getIdeModuleGroup());
+        }
+        final ModifiableModuleModel modifiableModel = modelsProvider.getModifiableModuleModel();
+        modifiableModel.setModuleGroupPath(module, groupPath);
+      }
+    }
   }
 
   private void createModules(@NotNull Collection<DataNode<E>> toCreate,
@@ -103,8 +123,12 @@ public abstract class AbstractModuleDataService<E extends ModuleData> extends Ab
       ModuleData data = module.getData();
       final Module created = modelsProvider.newModule(data.getModuleFilePath(), data.getModuleTypeId());
       module.putUserData(MODULE_KEY, created);
+      String productionModuleId = data.getProductionModuleId();
+      if (productionModuleId != null) {
+        modelsProvider.setTestModuleProperties(created, productionModuleId);
+      }
       Set<String> orphanFiles = project.getUserData(ORPHAN_MODULE_FILES);
-      if(orphanFiles != null) {
+      if (orphanFiles != null) {
         orphanFiles.remove(created.getModuleFilePath());
       }
 
@@ -342,7 +366,7 @@ public abstract class AbstractModuleDataService<E extends ModuleData> extends Ab
   @Override
   public void onSuccessImport(@NotNull Project project) {
     final Set<String> orphanFiles = project.getUserData(ORPHAN_MODULE_FILES);
-    if(orphanFiles != null && !orphanFiles.isEmpty()) {
+    if (orphanFiles != null && !orphanFiles.isEmpty()) {
       ExternalSystemApiUtil.executeOnEdt(false, new Runnable() {
         @Override
         public void run() {