From 0e1ae3cb0bbe305b3fdbc887544ad96d38411a65 Mon Sep 17 00:00:00 2001 From: anna Date: Mon, 11 Jul 2011 17:41:10 +0400 Subject: [PATCH] remember inherit jdk state for nonexistent sdks (IDEA-70561) --- .../eclipse/config/EclipseModuleManager.java | 9 ++++++ .../conversion/EclipseClasspathReader.java | 1 + .../conversion/IdeaSpecificSettings.java | 10 +++++++ .../test/.classpath | 5 ++++ .../preserveInheritedInvalidJdk/test/.project | 16 ++++++++++ .../expected/preserveInheritedInvalidJdk.eml | 4 +++ .../idea/eclipse/EclipseEmlTest.java | 29 ++++++++++++++----- 7 files changed, 67 insertions(+), 7 deletions(-) create mode 100644 plugins/eclipse/testData/eml/preserveInheritedInvalidJdk/test/.classpath create mode 100644 plugins/eclipse/testData/eml/preserveInheritedInvalidJdk/test/.project create mode 100644 plugins/eclipse/testData/eml/preserveInheritedInvalidJdk/test/expected/preserveInheritedInvalidJdk.eml diff --git a/plugins/eclipse/src/org/jetbrains/idea/eclipse/config/EclipseModuleManager.java b/plugins/eclipse/src/org/jetbrains/idea/eclipse/config/EclipseModuleManager.java index 15583947c4c7..858584f5a40e 100644 --- a/plugins/eclipse/src/org/jetbrains/idea/eclipse/config/EclipseModuleManager.java +++ b/plugins/eclipse/src/org/jetbrains/idea/eclipse/config/EclipseModuleManager.java @@ -63,11 +63,20 @@ public class EclipseModuleManager implements PersistentStateComponent{ @NonNls private static final String LIBELEMENT = "libelement"; private int myExpectedModuleSourcePlace; private Map mySrcPlace = new LinkedHashMap(); + private String myInvalidJdk; public EclipseModuleManager(Module module) { myModule = module; } + public void setInvalidJdk(String invalidJdk) { + myInvalidJdk = invalidJdk; + } + + public String getInvalidJdk() { + return myInvalidJdk; + } + public static EclipseModuleManager getInstance(Module module) { return ModuleServiceManager.getService(module, EclipseModuleManager.class); } diff --git a/plugins/eclipse/src/org/jetbrains/idea/eclipse/conversion/EclipseClasspathReader.java b/plugins/eclipse/src/org/jetbrains/idea/eclipse/conversion/EclipseClasspathReader.java index 48b94a9b4e19..0d11360e8661 100644 --- a/plugins/eclipse/src/org/jetbrains/idea/eclipse/conversion/EclipseClasspathReader.java +++ b/plugins/eclipse/src/org/jetbrains/idea/eclipse/conversion/EclipseClasspathReader.java @@ -244,6 +244,7 @@ public class EclipseClasspathReader { } else { rootModel.setInvalidSdk(jdkName, IdeaXml.JAVA_SDK_TYPE); + eclipseModuleManager.setInvalidJdk(jdkName); unknownJdks.add(jdkName); } } diff --git a/plugins/eclipse/src/org/jetbrains/idea/eclipse/conversion/IdeaSpecificSettings.java b/plugins/eclipse/src/org/jetbrains/idea/eclipse/conversion/IdeaSpecificSettings.java index 857ea4f603ca..80cbada9ea5c 100644 --- a/plugins/eclipse/src/org/jetbrains/idea/eclipse/conversion/IdeaSpecificSettings.java +++ b/plugins/eclipse/src/org/jetbrains/idea/eclipse/conversion/IdeaSpecificSettings.java @@ -43,6 +43,7 @@ import com.intellij.pom.java.LanguageLevel; import org.jdom.Element; import org.jetbrains.annotations.NonNls; import org.jetbrains.idea.eclipse.IdeaXml; +import org.jetbrains.idea.eclipse.config.EclipseModuleManager; import java.io.File; import java.io.IOException; @@ -66,6 +67,7 @@ public class IdeaSpecificSettings { @NonNls private static final String SRCROOT_BIND_ATTR = "bind"; private static final Logger LOG = Logger.getInstance("#" + IdeaSpecificSettings.class.getName()); @NonNls private static final String JAVADOCROOT_ATTR = "javadocroot_attr"; + public static final String INHERIT_JDK = "inheritJdk"; private IdeaSpecificSettings() { } @@ -100,6 +102,10 @@ public class IdeaSpecificSettings { } } + final String inheritJdk = root.getAttributeValue(INHERIT_JDK); + if (inheritJdk != null && Boolean.parseBoolean(inheritJdk)) { + model.inheritSdk(); + } for (Object o : root.getChildren("lib")) { Element libElement = (Element)o; final String libName = libElement.getAttributeValue("name"); @@ -278,6 +284,10 @@ public class IdeaSpecificSettings { isModified = true; } } + if (entry instanceof InheritedJdkOrderEntry && EclipseModuleManager.getInstance(entry.getOwnerModule()).getInvalidJdk() != null) { + root.setAttribute(INHERIT_JDK, "true"); + isModified = true; + } if (!(entry instanceof LibraryOrderEntry)) continue; final Element element = new Element("lib"); diff --git a/plugins/eclipse/testData/eml/preserveInheritedInvalidJdk/test/.classpath b/plugins/eclipse/testData/eml/preserveInheritedInvalidJdk/test/.classpath new file mode 100644 index 000000000000..8778ddd58a36 --- /dev/null +++ b/plugins/eclipse/testData/eml/preserveInheritedInvalidJdk/test/.classpath @@ -0,0 +1,5 @@ + + + + + diff --git a/plugins/eclipse/testData/eml/preserveInheritedInvalidJdk/test/.project b/plugins/eclipse/testData/eml/preserveInheritedInvalidJdk/test/.project new file mode 100644 index 000000000000..d7dbd1431746 --- /dev/null +++ b/plugins/eclipse/testData/eml/preserveInheritedInvalidJdk/test/.project @@ -0,0 +1,16 @@ + + + preserveInheritedInvalidJdk + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.jdt.core.javanature + + + diff --git a/plugins/eclipse/testData/eml/preserveInheritedInvalidJdk/test/expected/preserveInheritedInvalidJdk.eml b/plugins/eclipse/testData/eml/preserveInheritedInvalidJdk/test/expected/preserveInheritedInvalidJdk.eml new file mode 100644 index 000000000000..62b6377af0f3 --- /dev/null +++ b/plugins/eclipse/testData/eml/preserveInheritedInvalidJdk/test/expected/preserveInheritedInvalidJdk.eml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/plugins/eclipse/testSources/org/jetbrains/idea/eclipse/EclipseEmlTest.java b/plugins/eclipse/testSources/org/jetbrains/idea/eclipse/EclipseEmlTest.java index a8a7c69e5b56..296479e978d1 100644 --- a/plugins/eclipse/testSources/org/jetbrains/idea/eclipse/EclipseEmlTest.java +++ b/plugins/eclipse/testSources/org/jetbrains/idea/eclipse/EclipseEmlTest.java @@ -28,10 +28,7 @@ import com.intellij.openapi.module.StdModuleTypes; import com.intellij.openapi.project.Project; import com.intellij.openapi.roots.ModifiableRootModel; import com.intellij.openapi.roots.ModuleRootManager; -import com.intellij.openapi.util.Computable; -import com.intellij.openapi.util.JDOMUtil; -import com.intellij.openapi.util.SystemInfo; -import com.intellij.openapi.util.WriteExternalException; +import com.intellij.openapi.util.*; import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.util.text.StringUtil; import com.intellij.testFramework.IdeaTestCase; @@ -65,6 +62,13 @@ public class EclipseEmlTest extends IdeaTestCase { protected static void doTest(String relativePath, final Project project) throws Exception { final String path = project.getBaseDir().getPath() + relativePath; + final Module module = doLoadModule(path, project); + + + checkModule(path, module); + } + + private static Module doLoadModule(final String path, final Project project) throws IOException, JDOMException, InvalidDataException { final Module module = ApplicationManager.getApplication().runWriteAction(new Computable() { @Override public Module compute() { @@ -87,9 +91,7 @@ public class EclipseEmlTest extends IdeaTestCase { rootModel.commit(); } }); - - - checkModule(path, module); + return module; } protected static void checkModule(String path, Module module) throws WriteExternalException, IOException, JDOMException { @@ -119,4 +121,17 @@ public class EclipseEmlTest extends IdeaTestCase { doTest("/test", getProject()); } + public void testPreserveInheritedInvalidJdk() throws Exception { + final Project project = getProject(); + final String projectBasePath = project.getBaseDir().getPath(); + final String path = projectBasePath + "/test"; + + final Module module = doLoadModule(path, project); + + final ModifiableRootModel modifiableModel = ModuleRootManager.getInstance(module).getModifiableModel(); + modifiableModel.inheritSdk(); + modifiableModel.commit(); + + checkModule(projectBasePath + "/test/expected", module); + } }