diff --git a/plugins/eclipse/src/org/jetbrains/idea/eclipse/conversion/EclipseClasspathWriter.java b/plugins/eclipse/src/org/jetbrains/idea/eclipse/conversion/EclipseClasspathWriter.java index 78879defff23..f134e7c376ea 100644 --- a/plugins/eclipse/src/org/jetbrains/idea/eclipse/conversion/EclipseClasspathWriter.java +++ b/plugins/eclipse/src/org/jetbrains/idea/eclipse/conversion/EclipseClasspathWriter.java @@ -159,7 +159,7 @@ public class EclipseClasspathWriter { } } } - if (addSrcRoots) setOrRemoveAttribute(orderEntry, EclipseXml.SOURCEPATH_ATTR, eclipseSrcVariablePath != null ? eclipseSrcVariablePath : srcRelativePath); + setOrRemoveAttribute(orderEntry, EclipseXml.SOURCEPATH_ATTR, addSrcRoots ? (eclipseSrcVariablePath != null ? eclipseSrcVariablePath : srcRelativePath) : null); EJavadocUtil.setupJavadocAttributes(orderEntry, libraryOrderEntry, myModel); setExported(orderEntry, libraryOrderEntry); 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 9eacfd3fc948..03f12a76291e 100644 --- a/plugins/eclipse/src/org/jetbrains/idea/eclipse/conversion/IdeaSpecificSettings.java +++ b/plugins/eclipse/src/org/jetbrains/idea/eclipse/conversion/IdeaSpecificSettings.java @@ -240,20 +240,10 @@ public class IdeaSpecificSettings { element.setAttribute("scope", scope.name()); if (((LibraryOrderEntry)entry).isModuleLevel()) { final String[] urls = entry.getUrls(OrderRootType.SOURCES); - if (urls.length > 1) { - for (String url : urls) { - Element srcElement = new Element(SRCROOT_ATTR); - srcElement.setAttribute("url", url); - element.addContent(srcElement); - } - } - else if (urls.length == 1 && urls[0].contains(JarFileSystem.JAR_SEPARATOR)) { - final VirtualFile virtualFile = JarFileSystem.getInstance().findFileByPath(VfsUtil.urlToPath(urls[0])); - if (virtualFile != null) { - Element srcElement = new Element(SRCROOT_ATTR); - srcElement.setAttribute("url", urls[0]); - element.addContent(srcElement); - } + for (String url : urls) { + Element srcElement = new Element(SRCROOT_ATTR); + srcElement.setAttribute("url", url); + element.addContent(srcElement); } for (String srcUrl : entry.getUrls(OrderRootType.SOURCES)) { diff --git a/plugins/eclipse/testData/eml/srcInZip/test/srcInZip.eml b/plugins/eclipse/testData/eml/srcInZip/test/srcInZip.eml index 4ff5ffac6447..418b83538ae0 100644 --- a/plugins/eclipse/testData/eml/srcInZip/test/srcInZip.eml +++ b/plugins/eclipse/testData/eml/srcInZip/test/srcInZip.eml @@ -4,5 +4,7 @@ + + \ No newline at end of file diff --git a/plugins/eclipse/testData/modification/replacedExistingWithVariablesCantReplaceSrc/expected/.classpath b/plugins/eclipse/testData/modification/replacedExistingWithVariablesCantReplaceSrc/expected/.classpath new file mode 100644 index 000000000000..8fb44aaed0aa --- /dev/null +++ b/plugins/eclipse/testData/modification/replacedExistingWithVariablesCantReplaceSrc/expected/.classpath @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/plugins/eclipse/testData/modification/replacedExistingWithVariablesCantReplaceSrc/expected/ws-internals.eml b/plugins/eclipse/testData/modification/replacedExistingWithVariablesCantReplaceSrc/expected/ws-internals.eml new file mode 100644 index 000000000000..aeb218a20352 --- /dev/null +++ b/plugins/eclipse/testData/modification/replacedExistingWithVariablesCantReplaceSrc/expected/ws-internals.eml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/plugins/eclipse/testData/modification/replacedExistingWithVariablesCantReplaceSrc/srcvariableidea1/test.jar b/plugins/eclipse/testData/modification/replacedExistingWithVariablesCantReplaceSrc/srcvariableidea1/test.jar new file mode 100644 index 000000000000..69d35ecffe38 Binary files /dev/null and b/plugins/eclipse/testData/modification/replacedExistingWithVariablesCantReplaceSrc/srcvariableidea1/test.jar differ diff --git a/plugins/eclipse/testData/modification/replacedExistingWithVariablesCantReplaceSrc/test/.classpath b/plugins/eclipse/testData/modification/replacedExistingWithVariablesCantReplaceSrc/test/.classpath new file mode 100644 index 000000000000..e6552e05aca7 --- /dev/null +++ b/plugins/eclipse/testData/modification/replacedExistingWithVariablesCantReplaceSrc/test/.classpath @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/plugins/eclipse/testData/modification/replacedExistingWithVariablesCantReplaceSrc/test/.project b/plugins/eclipse/testData/modification/replacedExistingWithVariablesCantReplaceSrc/test/.project new file mode 100644 index 000000000000..3c7030a86519 --- /dev/null +++ b/plugins/eclipse/testData/modification/replacedExistingWithVariablesCantReplaceSrc/test/.project @@ -0,0 +1,17 @@ + + + ws-internals + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/plugins/eclipse/testData/modification/replacedExistingWithVariablesCantReplaceSrc/variableidea/test.jar b/plugins/eclipse/testData/modification/replacedExistingWithVariablesCantReplaceSrc/variableidea/test.jar new file mode 100644 index 000000000000..69d35ecffe38 Binary files /dev/null and b/plugins/eclipse/testData/modification/replacedExistingWithVariablesCantReplaceSrc/variableidea/test.jar differ diff --git a/plugins/eclipse/testSources/org/jetbrains/idea/eclipse/EclipseEmlTest.java b/plugins/eclipse/testSources/org/jetbrains/idea/eclipse/EclipseEmlTest.java index 310654b895f9..4bde31d949ef 100644 --- a/plugins/eclipse/testSources/org/jetbrains/idea/eclipse/EclipseEmlTest.java +++ b/plugins/eclipse/testSources/org/jetbrains/idea/eclipse/EclipseEmlTest.java @@ -31,6 +31,7 @@ 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.io.FileUtil; import com.intellij.openapi.util.text.StringUtil; import com.intellij.testFramework.IdeaTestCase; @@ -76,11 +77,18 @@ public class EclipseEmlTest extends IdeaTestCase { final EclipseClasspathStorageProvider.EclipseClasspathConverter converter = new EclipseClasspathStorageProvider.EclipseClasspathConverter(module); - final ModifiableRootModel rootModel = ModuleRootManager.getInstance(module).getModifiableModel(); + ModifiableRootModel rootModel = ModuleRootManager.getInstance(module).getModifiableModel(); final Element classpathElement = JDOMUtil.loadDocument(new String(FileUtil.loadFileText(new File(path, EclipseXml.DOT_CLASSPATH_EXT)))).getRootElement(); converter.getClasspath(rootModel, classpathElement); + rootModel.commit(); + checkModule(path, module); + } + + protected static void checkModule(String path, Module module) throws WriteExternalException, IOException, JDOMException { + ModifiableRootModel rootModel; + rootModel = ModuleRootManager.getInstance(module).getModifiableModel(); final Element root = new Element("component"); IdeaSpecificSettings.writeIDEASpecificClasspath(root, rootModel); rootModel.dispose(); diff --git a/plugins/eclipse/testSources/org/jetbrains/idea/eclipse/EclipseLibrariesModificationsTest.java b/plugins/eclipse/testSources/org/jetbrains/idea/eclipse/EclipseLibrariesModificationsTest.java index cb3db4aecdd1..15a431bc6764 100644 --- a/plugins/eclipse/testSources/org/jetbrains/idea/eclipse/EclipseLibrariesModificationsTest.java +++ b/plugins/eclipse/testSources/org/jetbrains/idea/eclipse/EclipseLibrariesModificationsTest.java @@ -34,7 +34,7 @@ import java.util.Map; public class EclipseLibrariesModificationsTest extends EclipseVarsTest { - private void doTest(String[] classRoots, String[] sourceRoots) throws Exception { + private void doTestCreate(String[] classRoots, String[] sourceRoots) throws Exception { final Project project = getProject(); final String path = project.getBaseDir().getPath() + "/test"; final Module module = EclipseClasspathTest.setUpModule(path, project); @@ -54,38 +54,60 @@ public class EclipseLibrariesModificationsTest extends EclipseVarsTest { } public void testReplacedWithVariables() throws Exception { - doTest(new String[]{"/variableidea/test.jar!/"}, new String[]{"/srcvariableidea/test.jar!/"}); + doTestCreate(new String[]{"/variableidea/test.jar!/"}, new String[]{"/srcvariableidea/test.jar!/"}); } public void testCantReplaceWithVariables() throws Exception { - doTest(new String[]{"/variableidea1/test.jar!/"}, new String[]{"/srcvariableidea/test.jar!/"}); + doTestCreate(new String[]{"/variableidea1/test.jar!/"}, new String[]{"/srcvariableidea/test.jar!/"}); } public void testReplacedWithVariablesNoSrcExistOnDisc() throws Exception { - doTest(new String[]{"/variableidea/test.jar!/"}, new String[]{"/srcvariableidea/test.jar!/"}); + doTestCreate(new String[]{"/variableidea/test.jar!/"}, new String[]{"/srcvariableidea/test.jar!/"}); } public void testReplacedWithVariablesCantReplaceSrc() throws Exception { - doTest(new String[]{"/variableidea/test.jar!/"}, new String[]{"/srcvariableidea1/test.jar!/"}); + doTestCreate(new String[]{"/variableidea/test.jar!/"}, new String[]{"/srcvariableidea1/test.jar!/"}); } public void testReplacedWithVariablesNoSources() throws Exception { - doTest(new String[]{"/variableidea/test.jar!/"}, new String[]{}); + doTestCreate(new String[]{"/variableidea/test.jar!/"}, new String[]{}); + } + + public void testReplacedExistingWithVariablesCantReplaceSrc() throws Exception { + doTestExisting(new String[]{"/variableidea/test.jar!/"}, new String[]{"/srcvariableidea1/test.jar!/"}); + } + + private void doTestExisting(String[] classRoots, String[] sourceRoots) throws Exception { + final Project project = getProject(); + final String path = project.getBaseDir().getPath() + "/test"; + final Module module = EclipseClasspathTest.setUpModule(path, project); + final ModifiableRootModel model = ModuleRootManager.getInstance(module).getModifiableModel(); + final String parentUrl = VirtualFileManager.constructUrl(JarFileSystem.PROTOCOL, model.getContentRoots()[0].getParent().getPath()); + final Library library = model.getModuleLibraryTable().getLibraryByName("test.jar"); + final Library.ModifiableModel libModifiableModel = library.getModifiableModel(); + final String[] oldClsRoots = libModifiableModel.getUrls(OrderRootType.CLASSES); + for (String oldClsRoot : oldClsRoots) { + libModifiableModel.removeRoot(oldClsRoot, OrderRootType.CLASSES); + } + + final String[] oldSrcRoots = libModifiableModel.getUrls(OrderRootType.SOURCES); + for (String oldSrcRoot : oldSrcRoots) { + libModifiableModel.removeRoot(oldSrcRoot, OrderRootType.SOURCES); + } + for (String classRoot : classRoots) { + libModifiableModel.addRoot(parentUrl + classRoot, OrderRootType.CLASSES); + } + for (String sourceRoot : sourceRoots) { + libModifiableModel.addRoot(parentUrl + sourceRoot, OrderRootType.SOURCES); + } + libModifiableModel.commit(); + model.commit(); + EclipseClasspathTest.checkModule(project.getBaseDir().getPath() + "/expected", module); + EclipseEmlTest.checkModule(project.getBaseDir().getPath() + "/expected", module); } @Override protected String getRelativeTestPath() { return "modification"; } - - enum Bar{ - ONE; - } - class Foo { - void foo(String each) { - Map map = new HashMap(); - map.put(new Foo(), Bar.ONE); - } - } - } \ No newline at end of file