From 5e69a2ea3427b3fdcbb6ed5c4fc37ad4ac512d35 Mon Sep 17 00:00:00 2001 From: anna Date: Tue, 22 Dec 2009 18:59:14 +0300 Subject: [PATCH 1/3] eclipse: chooser for .userlibraries file added --- .../importWizard/EclipseImportBuilder.java | 39 +++++++++---------- 1 file changed, 18 insertions(+), 21 deletions(-) diff --git a/plugins/eclipse/src/org/jetbrains/idea/eclipse/importWizard/EclipseImportBuilder.java b/plugins/eclipse/src/org/jetbrains/idea/eclipse/importWizard/EclipseImportBuilder.java index 23c0da2aeb0b..2988afab6d80 100644 --- a/plugins/eclipse/src/org/jetbrains/idea/eclipse/importWizard/EclipseImportBuilder.java +++ b/plugins/eclipse/src/org/jetbrains/idea/eclipse/importWizard/EclipseImportBuilder.java @@ -38,8 +38,8 @@ import com.intellij.openapi.roots.libraries.LibraryTable; import com.intellij.openapi.roots.libraries.LibraryTablesRegistrar; import com.intellij.openapi.roots.ui.configuration.ModulesProvider; import com.intellij.openapi.ui.DialogWrapper; -import com.intellij.openapi.ui.InputValidator; import com.intellij.openapi.ui.Messages; +import com.intellij.openapi.util.Comparing; import com.intellij.openapi.util.IconLoader; import com.intellij.openapi.util.JDOMUtil; import com.intellij.openapi.util.Ref; @@ -319,31 +319,29 @@ public class EclipseImportBuilder extends ProjectImportBuilder implement } } if (!unknownLibraries.isEmpty()) { - if (message.length() > 0) message.append("\n"); - message.append(EclipseBundle.message("eclipse.import.warning.undefinded.libraries")); + final StringBuffer buf = new StringBuffer(); + buf.append(""); + buf.append(EclipseBundle.message("eclipse.import.warning.undefinded.libraries")); for (String name : unknownLibraries) { - message.append("\n").append(name); + buf.append("
").append(name); } if (model == null) { - message.append("\nPlease export Eclipse user libraries and import them now from"); - final String pathToUserLibraries = Messages.showInputDialog(project, message.toString(), getTitle(), Messages.getErrorIcon(), - project.getBaseDir().getPath() + - "/" + - project.getName() + - ".userlibraries", new InputValidator() { - public boolean checkInput(String inputString) { - return new File(inputString).exists(); - } - - public boolean canClose(String inputString) { - return checkInput(inputString); - } - }); - if (pathToUserLibraries != null) { + buf.append("
Please export Eclipse user libraries and import them now from resulted .userlibraries file"); + buf.append(""); + final FileChooserDescriptor descriptor = new FileChooserDescriptor(true, false, false, false, false, false) { + @Override + public boolean isFileSelectable(VirtualFile file) { + return super.isFileSelectable(file) && Comparing.strEqual(file.getExtension(), "userlibraries"); + } + }; + descriptor.setDescription(buf.toString()); + descriptor.setTitle(getTitle()); + final VirtualFile[] selectedFiles = FileChooser.chooseFiles(project, descriptor, project.getBaseDir()); + if (selectedFiles.length == 1) { ApplicationManager.getApplication().runWriteAction(new Runnable() { public void run() { try { - EclipseUserLibrariesHelper.readProjectLibrariesContent(new File(pathToUserLibraries), project, unknownLibraries); + EclipseUserLibrariesHelper.readProjectLibrariesContent(new File(selectedFiles[0].getPath()), project, unknownLibraries); } catch (Exception e) { LOG.error(e); @@ -351,7 +349,6 @@ public class EclipseImportBuilder extends ProjectImportBuilder implement } }); } - return result; } } From 5c6400283724f034fee4e6c55697ab013b44db02 Mon Sep 17 00:00:00 2001 From: anna Date: Tue, 22 Dec 2009 19:00:26 +0300 Subject: [PATCH 2/3] eclipse: write .classpath file if order entries were added (e.g. project library) (IDEA-26953) --- .../idea/eclipse/config/EclipseClasspathStorageProvider.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/eclipse/src/org/jetbrains/idea/eclipse/config/EclipseClasspathStorageProvider.java b/plugins/eclipse/src/org/jetbrains/idea/eclipse/config/EclipseClasspathStorageProvider.java index 8668f3876f42..ede4a8be0074 100644 --- a/plugins/eclipse/src/org/jetbrains/idea/eclipse/config/EclipseClasspathStorageProvider.java +++ b/plugins/eclipse/src/org/jetbrains/idea/eclipse/config/EclipseClasspathStorageProvider.java @@ -206,7 +206,7 @@ public class EclipseClasspathStorageProvider implements ClasspathStorageProvider element = null; } - if (element != null || model.getSourceRoots().length > 0) { + if (element != null || model.getSourceRoots().length > 0 || model.getOrderEntries().length > 2) { classpathWriter.writeClasspath(classpathElement, element); fileSet.write(new Document(classpathElement), EclipseXml.CLASSPATH_FILE); } From 00a6e8b8372990fb4c26acebeaaf5088c8435292 Mon Sep 17 00:00:00 2001 From: anna Date: Tue, 22 Dec 2009 19:01:35 +0300 Subject: [PATCH 3/3] eclipse: try to reuse eclipse paths with vars (IDEA-26838) --- .../eclipse/config/EclipseModuleManager.java | 31 ++++---- .../conversion/EclipseClasspathReader.java | 12 ++- .../conversion/EclipseClasspathWriter.java | 75 ++++++------------- 3 files changed, 49 insertions(+), 69 deletions(-) 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 1a195a0e0b4e..bfa1cdc646e6 100644 --- a/plugins/eclipse/src/org/jetbrains/idea/eclipse/config/EclipseModuleManager.java +++ b/plugins/eclipse/src/org/jetbrains/idea/eclipse/config/EclipseModuleManager.java @@ -17,13 +17,15 @@ package org.jetbrains.idea.eclipse.config; import com.intellij.openapi.module.Module; -import com.intellij.openapi.module.ModuleComponent; import com.intellij.openapi.module.ModuleServiceManager; -import org.jetbrains.annotations.NotNull; -public class EclipseModuleManager implements ModuleComponent{ +import java.util.HashMap; +import java.util.Map; +public class EclipseModuleManager { private CachedXmlDocumentSet myDocumentSet; + private Map myEclipseVariablePaths = new HashMap(); + private static final String SRC_PREFIX = "src:"; public EclipseModuleManager(Module module) {} @@ -39,18 +41,19 @@ public class EclipseModuleManager implements ModuleComponent{ myDocumentSet = documentSet; } - public void projectOpened() {} - - public void projectClosed() {} - - public void moduleAdded() {} - - @NotNull - public String getComponentName() { - return "EclipseModuleManager"; + public void registerEclipseVariablePath(String path, String var) { + myEclipseVariablePaths.put(path, var); } - public void initComponent() {} + public void registerEclipseSrcVariablePath(String path, String var) { + myEclipseVariablePaths.put(SRC_PREFIX + path, var); + } - public void disposeComponent() {} + public String getEclipseVariablePath(String path) { + return myEclipseVariablePaths.get(path); + } + + public String getEclipseSrcVariablePath(String path) { + return myEclipseVariablePaths.get(SRC_PREFIX + path); + } } 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 10a203cf9696..6284a6e65ca0 100644 --- a/plugins/eclipse/src/org/jetbrains/idea/eclipse/conversion/EclipseClasspathReader.java +++ b/plugins/eclipse/src/org/jetbrains/idea/eclipse/conversion/EclipseClasspathReader.java @@ -44,6 +44,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.idea.eclipse.EclipseXml; import org.jetbrains.idea.eclipse.IdeaXml; +import org.jetbrains.idea.eclipse.config.EclipseModuleManager; import org.jetbrains.idea.eclipse.util.ErrorLog; import java.io.File; @@ -199,8 +200,10 @@ public class EclipseClasspathReader { clsPath = null; } usedVariables.add(clsVar); - final String url = PathMacroManager.getInstance(rootModel.getModule()).expandPath(getVariableRelatedPath(clsVar, clsPath)); - modifiableModel.addRoot(getUrl(url), OrderRootType.CLASSES); + + final String url = getUrl(PathMacroManager.getInstance(rootModel.getModule()).expandPath(getVariableRelatedPath(clsVar, clsPath))); + EclipseModuleManager.getInstance(rootModel.getModule()).registerEclipseVariablePath(url, path); + modifiableModel.addRoot(url, OrderRootType.CLASSES); final String srcPathAttr = element.getAttributeValue(EclipseXml.SOURCEPATH_ATTR); if (srcPathAttr != null) { @@ -218,8 +221,9 @@ public class EclipseClasspathReader { srcPath = null; } usedVariables.add(srcVar); - final String srcUrl = PathMacroManager.getInstance(rootModel.getModule()).expandPath(getVariableRelatedPath(srcVar, srcPath)); - modifiableModel.addRoot(getUrl(srcUrl), OrderRootType.SOURCES); + final String srcUrl = getUrl(PathMacroManager.getInstance(rootModel.getModule()).expandPath(getVariableRelatedPath(srcVar, srcPath))); + EclipseModuleManager.getInstance(rootModel.getModule()).registerEclipseSrcVariablePath(srcUrl, srcPathAttr); + modifiableModel.addRoot(srcUrl, OrderRootType.SOURCES); } final List docPaths = getJavadocAttribute(element); 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 cf71b7650dd5..2fab1abd444f 100644 --- a/plugins/eclipse/src/org/jetbrains/idea/eclipse/conversion/EclipseClasspathWriter.java +++ b/plugins/eclipse/src/org/jetbrains/idea/eclipse/conversion/EclipseClasspathWriter.java @@ -20,8 +20,6 @@ */ package org.jetbrains.idea.eclipse.conversion; -import com.intellij.openapi.application.ApplicationManager; -import com.intellij.openapi.components.PathMacroManager; import com.intellij.openapi.module.Module; import com.intellij.openapi.module.ModuleUtil; import com.intellij.openapi.project.Project; @@ -30,7 +28,6 @@ import com.intellij.openapi.projectRoots.Sdk; import com.intellij.openapi.roots.*; import com.intellij.openapi.roots.impl.ProjectRootManagerImpl; import com.intellij.openapi.util.Comparing; -import com.intellij.openapi.util.text.CharFilter; import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vfs.JarFileSystem; import com.intellij.openapi.vfs.VfsUtil; @@ -42,6 +39,7 @@ import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.Nullable; import org.jetbrains.idea.eclipse.EclipseXml; import org.jetbrains.idea.eclipse.IdeaXml; +import org.jetbrains.idea.eclipse.config.EclipseModuleManager; import java.io.File; import java.util.ArrayList; @@ -107,27 +105,29 @@ public class EclipseClasspathWriter { setExported(orderEntry, libraryOrderEntry); } else { - final Project project = myModel.getModule().getProject(); - final String[] kind = new String[]{EclipseXml.LIB_KIND}; - String relativeClassPath = getRelativePath(files[0], kind); - - final String[] srcFiles = libraryOrderEntry.getUrls(OrderRootType.SOURCES); - final String relativePath; - if (srcFiles.length == 0) { - relativePath = null; + final String eclipseVariablePath = EclipseModuleManager.getInstance(libraryOrderEntry.getOwnerModule()).getEclipseVariablePath(files[0]); + final Element orderEntry; + if (eclipseVariablePath != null) { + orderEntry = addOrderEntry(EclipseXml.VAR_KIND, eclipseVariablePath, classpathRoot, oldRoot); } else { - final String[] srcKind = new String[1]; - final boolean replaceVarsInSrc = Comparing.strEqual(kind[0], EclipseXml.VAR_KIND); - relativePath = getRelativePath(srcFiles[srcFiles.length - 1], srcKind, replaceVarsInSrc, project, getContentRoot()); - if (replaceVarsInSrc && srcKind[0] == null) { - kind[0] = EclipseXml.LIB_KIND; - relativeClassPath = getRelativePath(files[0], kind, false, project, getContentRoot()); - } + orderEntry = addOrderEntry(EclipseXml.LIB_KIND, getRelativePath(files[0]), classpathRoot, oldRoot); } - final Element orderEntry = addOrderEntry(kind[0], relativeClassPath, classpathRoot, oldRoot); - setOrRemoveAttribute(orderEntry, EclipseXml.SOURCEPATH_ATTR, relativePath); + final String srcRelativePath; + final String eclipseSrcVariablePath; + + final String[] srcFiles = libraryOrderEntry.getUrls(OrderRootType.SOURCES); + if (srcFiles.length == 0) { + srcRelativePath = null; + eclipseSrcVariablePath = null; + } + else { + final String lastSourceRoot = srcFiles[srcFiles.length - 1]; + srcRelativePath = getRelativePath(lastSourceRoot); + eclipseSrcVariablePath = EclipseModuleManager.getInstance(libraryOrderEntry.getOwnerModule()).getEclipseSrcVariablePath(lastSourceRoot); + } + setOrRemoveAttribute(orderEntry, EclipseXml.SOURCEPATH_ATTR, eclipseSrcVariablePath != null ? eclipseSrcVariablePath : srcRelativePath); //clear javadocs before write new final List children = new ArrayList(orderEntry.getChildren(EclipseXml.ATTRIBUTES_TAG)); @@ -179,19 +179,9 @@ public class EclipseClasspathWriter { } } - private String getRelativePath(String srcFile, String[] kind) { - return getRelativePath(srcFile, kind, true, myModel.getModule().getProject(), getContentRoot()); - } - private String getRelativePath(String url) { - return getRelativePath(url, new String[1]); - } - - public static String getRelativePath(final String url, - String[] kind, - boolean replaceVars, - final Project project, - final VirtualFile contentRoot) { + final Project project = myModel.getModule().getProject(); + final VirtualFile contentRoot = getContentRoot(); final VirtualFile projectBaseDir = contentRoot != null ? contentRoot.getParent() : project.getBaseDir(); assert projectBaseDir != null; VirtualFile file = VirtualFileManager.getInstance().findFileByUrl(url); @@ -219,7 +209,7 @@ public class EclipseClasspathWriter { return "/" + VfsUtil.getRelativePath(file, projectBaseDir, '/'); } else { - return replaceVars ? stripIDEASpecificPrefix(url, kind) : ProjectRootManagerImpl.extractLocalPath(url); + return ProjectRootManagerImpl.extractLocalPath(url); } } else { @@ -234,7 +224,7 @@ public class EclipseClasspathWriter { return url.substring(projectUrl.length()); //leading / } - return replaceVars ? stripIDEASpecificPrefix(url, kind) : ProjectRootManagerImpl.extractLocalPath(url); + return ProjectRootManagerImpl.extractLocalPath(url); } } @@ -291,23 +281,6 @@ public class EclipseClasspathWriter { } } - private static String stripIDEASpecificPrefix(String path, String[] kind) { - String stripped = StringUtil - .strip(ProjectRootManagerImpl.extractLocalPath(PathMacroManager.getInstance(ApplicationManager.getApplication()).collapsePath(path)), - new CharFilter() { - public boolean accept(final char ch) { - return ch != '$'; - } - }); - boolean leaveLeadingSlash = false; - if (!Comparing.strEqual(stripped, ProjectRootManagerImpl.extractLocalPath(path))) { - leaveLeadingSlash = kind[0] == null; - kind[0] = EclipseXml.VAR_KIND; - } - return (leaveLeadingSlash ? "/" : "") + stripped; - } - - private static Element addOrderEntry(String kind, String path, Element classpathRoot, Element oldRoot) { if (oldRoot != null) { for (Object o : oldRoot.getChildren(EclipseXml.CLASSPATHENTRY_TAG)) {