diff --git a/java/java-tests/testData/moduleRootManager/rootsChanged/emptyModule/a.iml b/java/java-tests/testData/moduleRootManager/rootsChanged/emptyModule/a.iml
new file mode 100644
index 000000000000..ddf828eec880
--- /dev/null
+++ b/java/java-tests/testData/moduleRootManager/rootsChanged/emptyModule/a.iml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/java/java-tests/testSrc/com/intellij/roots/RootsChangedTest.java b/java/java-tests/testSrc/com/intellij/roots/RootsChangedTest.java
index 8d61ad0b94b4..aae9f9a80c65 100644
--- a/java/java-tests/testSrc/com/intellij/roots/RootsChangedTest.java
+++ b/java/java-tests/testSrc/com/intellij/roots/RootsChangedTest.java
@@ -16,14 +16,14 @@
package com.intellij.roots;
import com.intellij.ProjectTopics;
+import com.intellij.openapi.application.ex.PathManagerEx;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.module.ModuleManager;
-import com.intellij.openapi.roots.impl.ModifiableModelCommitter;
import com.intellij.openapi.projectRoots.ProjectJdkTable;
import com.intellij.openapi.projectRoots.Sdk;
import com.intellij.openapi.projectRoots.SdkModificator;
-import com.intellij.openapi.projectRoots.impl.JavaSdkImpl;
import com.intellij.openapi.roots.*;
+import com.intellij.openapi.roots.impl.ModifiableModelCommitter;
import com.intellij.openapi.roots.libraries.Library;
import com.intellij.openapi.roots.libraries.LibraryTable;
import com.intellij.openapi.roots.libraries.LibraryTablesRegistrar;
@@ -68,16 +68,33 @@ public class RootsChangedTest extends ModuleTestCase {
verifyLibraryTableEditing(globalLibraryTable);
}
- public void testProjectLibraryEventsInUncommitedModel() throws Exception {
+ public void testProjectLibraryEventsInUncommittedModel() throws Exception {
final LibraryTable projectLibraryTable = LibraryTablesRegistrar.getInstance().getLibraryTable(myProject);
- verifyLibraryTableEditingInUncommitedModel(projectLibraryTable);
+ verifyLibraryTableEditingInUncommittedModel(projectLibraryTable);
}
- public void testGlobalLibraryEventsInUncommitedModel() throws Exception {
+ public void testGlobalLibraryEventsInUncommittedModel() throws Exception {
final LibraryTable globalLibraryTable = LibraryTablesRegistrar.getInstance().getLibraryTable();
- verifyLibraryTableEditingInUncommitedModel(globalLibraryTable);
+ verifyLibraryTableEditingInUncommittedModel(globalLibraryTable);
}
+ public void testEditLibraryForModuleLoadFromXml() throws IOException {
+ File moduleFile = PathManagerEx.findFileUnderProjectHome("java/java-tests/testData/moduleRootManager/rootsChanged/emptyModule/a.iml", getClass());
+ Module a = loadModule(moduleFile, true);
+ assertEventsCount(1);
+
+ final Sdk jdk = IdeaTestUtil.getMockJdk17();
+ ProjectJdkTable.getInstance().addJdk(jdk);
+ assertEventsCount(0);
+
+ ModuleRootModificationUtil.setModuleSdk(a, jdk);
+ assertEventsCount(1);
+
+ final SdkModificator sdkModificator = jdk.getSdkModificator();
+ sdkModificator.addRoot(getVirtualFile(createTempDirectory()), OrderRootType.CLASSES);
+ sdkModificator.commitChanges();
+ assertEventsCount(1);
+ }
public void testModuleJdkEditing() throws Exception {
final Module moduleA = createModule("a.iml");
@@ -93,9 +110,7 @@ public class RootsChangedTest extends ModuleTestCase {
rootModelA.setSdk(jdk);
rootModelB.setSdk(jdk);
ModifiableRootModel[] rootModels = new ModifiableRootModel[]{rootModelA, rootModelB};
- if (rootModels.length > 0) {
- ModifiableModelCommitter.multiCommit(rootModels, ModuleManager.getInstance(rootModels[0].getProject()).getModifiableModel());
- }
+ ModifiableModelCommitter.multiCommit(rootModels, ModuleManager.getInstance(rootModels[0].getProject()).getModifiableModel());
assertEventsCount(1);
final SdkModificator sdkModificator = jdk.getSdkModificator();
@@ -192,7 +207,7 @@ public class RootsChangedTest extends ModuleTestCase {
assertEventsCount(1);
}
- private void verifyLibraryTableEditingInUncommitedModel(final LibraryTable libraryTable) {
+ private void verifyLibraryTableEditingInUncommittedModel(final LibraryTable libraryTable) {
final Module moduleA = createModule("a.iml");
final Module moduleB = createModule("b.iml");
assertEventsCount(2);
diff --git a/java/testFramework/src/com/intellij/testFramework/ModuleTestCase.java b/java/testFramework/src/com/intellij/testFramework/ModuleTestCase.java
index 5930288f2c2c..5c63d391d11b 100644
--- a/java/testFramework/src/com/intellij/testFramework/ModuleTestCase.java
+++ b/java/testFramework/src/com/intellij/testFramework/ModuleTestCase.java
@@ -96,10 +96,19 @@ public abstract class ModuleTestCase extends IdeaTestCase {
}
protected Module loadModule(final File moduleFile) {
+ return loadModule(moduleFile, false);
+ }
+
+ protected Module loadModule(final File moduleFile, final boolean loadComponentStates) {
Module module = ApplicationManager.getApplication().runWriteAction(
new Computable() {
@Override
public Module compute() {
+ ProjectImpl project = (ProjectImpl)myProject;
+ boolean oldOptimiseTestLoadSpeed = project.isOptimiseTestLoadSpeed();
+ if (loadComponentStates) {
+ project.setOptimiseTestLoadSpeed(false);
+ }
try {
LocalFileSystem.getInstance().refreshIoFiles(Collections.singletonList(moduleFile));
return ModuleManager.getInstance(myProject).loadModule(moduleFile.getAbsolutePath());
@@ -108,6 +117,9 @@ public abstract class ModuleTestCase extends IdeaTestCase {
LOG.error(e);
return null;
}
+ finally {
+ project.setOptimiseTestLoadSpeed(oldOptimiseTestLoadSpeed);
+ }
}
}
);
diff --git a/platform/projectModel-impl/src/com/intellij/openapi/roots/impl/ModuleRootManagerImpl.java b/platform/projectModel-impl/src/com/intellij/openapi/roots/impl/ModuleRootManagerImpl.java
index 9fdfeae55282..23dd26fe7589 100644
--- a/platform/projectModel-impl/src/com/intellij/openapi/roots/impl/ModuleRootManagerImpl.java
+++ b/platform/projectModel-impl/src/com/intellij/openapi/roots/impl/ModuleRootManagerImpl.java
@@ -351,7 +351,7 @@ public class ModuleRootManagerImpl extends ModuleRootManager implements ModuleCo
protected void loadState(ModuleRootManagerState object, boolean throwEvent) {
try {
- final RootModelImpl newModel = new RootModelImpl(object.getRootModelElement(), this, myProjectRootManager, myFilePointerManager);
+ final RootModelImpl newModel = new RootModelImpl(object.getRootModelElement(), this, myProjectRootManager, myFilePointerManager, throwEvent);
if (throwEvent) {
makeRootsChange(new Runnable() {
diff --git a/platform/projectModel-impl/src/com/intellij/openapi/roots/impl/RootModelImpl.java b/platform/projectModel-impl/src/com/intellij/openapi/roots/impl/RootModelImpl.java
index 01e1b984ef74..eb7f0ea68c12 100644
--- a/platform/projectModel-impl/src/com/intellij/openapi/roots/impl/RootModelImpl.java
+++ b/platform/projectModel-impl/src/com/intellij/openapi/roots/impl/RootModelImpl.java
@@ -93,7 +93,7 @@ public class RootModelImpl extends RootModelBase implements ModifiableRootModel
RootModelImpl(@NotNull Element element,
@NotNull ModuleRootManagerImpl moduleRootManager,
ProjectRootManagerImpl projectRootManager,
- VirtualFilePointerManager filePointerManager) throws InvalidDataException {
+ VirtualFilePointerManager filePointerManager, boolean writable) throws InvalidDataException {
myProjectRootManager = projectRootManager;
myFilePointerManager = filePointerManager;
myModuleRootManager = moduleRootManager;
@@ -123,8 +123,7 @@ public class RootModelImpl extends RootModelBase implements ModifiableRootModel
myOrderEntries.add(new ModuleSourceOrderEntryImpl(this));
}
-
- myWritable = true;
+ myWritable = writable;
RootModelImpl originalRootModel = moduleRootManager.getRootModel();
for (ModuleExtension extension : originalRootModel.myExtensions) {