From f064c471238a9dfbd036cf415b3f0e3136f580bf Mon Sep 17 00:00:00 2001 From: Eugene Kudelevsky Date: Fri, 1 Mar 2013 15:03:40 +0400 Subject: [PATCH] add API allowing to do nature-specific work during importing process; collectUnknownNatures() was moved to "eclipse" module because it is actually not needed by eclipse-jps-plugin --- .../src/EclipseProjectFinder.java | 20 ------ plugins/eclipse/resources/META-INF/plugin.xml | 3 + .../importWizard/EclipseImportBuilder.java | 70 ++++++++++++++++++- .../importWizard/EclipseNatureImporter.java | 21 ++++++ 4 files changed, 92 insertions(+), 22 deletions(-) create mode 100644 plugins/eclipse/src/org/jetbrains/idea/eclipse/importWizard/EclipseNatureImporter.java diff --git a/plugins/eclipse/common-eclipse-util/src/EclipseProjectFinder.java b/plugins/eclipse/common-eclipse-util/src/EclipseProjectFinder.java index 41041ae54198..a22a4066c38b 100644 --- a/plugins/eclipse/common-eclipse-util/src/EclipseProjectFinder.java +++ b/plugins/eclipse/common-eclipse-util/src/EclipseProjectFinder.java @@ -33,7 +33,6 @@ import org.jetbrains.annotations.Nullable; import java.io.File; import java.io.IOException; import java.util.List; -import java.util.Set; public class EclipseProjectFinder implements EclipseXml { public static void findModuleRoots(final List paths, final String rootPath, @Nullable Processor progressUpdater) { @@ -117,25 +116,6 @@ public class EclipseProjectFinder implements EclipseXml { return null; } - public static void collectUnknownNatures(String path, Set naturesNames) { - final File projectfile = new File(path, DOT_PROJECT_EXT); - try { - final Element natures = JDOMUtil.loadDocument(projectfile).getRootElement().getChild("natures"); - if (natures != null) { - final List naturesList = natures.getChildren("nature"); - for (Object nature : naturesList) { - final String natureName = ((Element)nature).getText(); - if (!StringUtil.isEmptyOrSpaces(natureName)) { - naturesNames.add(natureName); - } - } - } - } - catch (Exception ignore) { - } - naturesNames.remove("org.eclipse.jdt.core.javanature"); - } - public static class LinkedResource { private String myURI; private String myLocation; diff --git a/plugins/eclipse/resources/META-INF/plugin.xml b/plugins/eclipse/resources/META-INF/plugin.xml index 18b92dd21ad5..a17e668f79d5 100644 --- a/plugins/eclipse/resources/META-INF/plugin.xml +++ b/plugins/eclipse/resources/META-INF/plugin.xml @@ -24,4 +24,7 @@ + + + \ No newline at end of file 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 c25a9429e8f3..61618146bdab 100644 --- a/plugins/eclipse/src/org/jetbrains/idea/eclipse/importWizard/EclipseImportBuilder.java +++ b/plugins/eclipse/src/org/jetbrains/idea/eclipse/importWizard/EclipseImportBuilder.java @@ -41,6 +41,7 @@ import com.intellij.openapi.roots.libraries.Library; 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.startup.StartupManager; import com.intellij.openapi.ui.DialogWrapper; import com.intellij.openapi.ui.Messages; import com.intellij.openapi.util.Comparing; @@ -54,6 +55,7 @@ import com.intellij.packaging.artifacts.ModifiableArtifactModel; import com.intellij.projectImport.ProjectImportBuilder; import com.intellij.util.Function; import com.intellij.util.Processor; +import com.intellij.util.containers.HashMap; import gnu.trove.THashSet; import icons.EclipseIcons; import org.jdom.Element; @@ -181,7 +183,7 @@ public class EclipseImportBuilder extends ProjectImportBuilder implement final Element classpathElement = JDOMUtil.loadDocument(classpathfile).getRootElement(); EclipseClasspathReader.collectVariables(variables, classpathElement, path); } - EclipseProjectFinder.collectUnknownNatures(path, naturesNames); + collectUnknownNatures(path, naturesNames); } } catch (IOException e) { @@ -224,6 +226,7 @@ public class EclipseImportBuilder extends ProjectImportBuilder implement final Collection unknownJdks = new TreeSet(); final Set refsToModules = new HashSet(); final List result = new ArrayList(); + final Map> module2NatureNames = new HashMap>(); try { final ModifiableModuleModel moduleModel = model != null ? model : ModuleManager.getInstance(project).getModifiableModel(); @@ -296,6 +299,8 @@ public class EclipseImportBuilder extends ProjectImportBuilder implement final Module module = moduleModel.newModule(modulesDirectory + "/" + EclipseProjectFinder.findProjectName(path) + IdeaXml.IML_EXT, StdModuleTypes.JAVA.getId()); result.add(module); + module2NatureNames.put(module, collectNatures(path)); + final ModifiableRootModel rootModel = ModuleRootManager.getInstance(module).getModifiableModel(); rootModels[idx++] = rootModel; @@ -330,7 +335,7 @@ public class EclipseImportBuilder extends ProjectImportBuilder implement catch (Exception e) { LOG.error(e); } - + scheduleNaturesImporting(project, module2NatureNames); createEclipseLibrary(project, unknownLibraries, IdeaXml.ECLIPSE_LIBRARY); StringBuffer message = new StringBuffer(); @@ -400,6 +405,37 @@ public class EclipseImportBuilder extends ProjectImportBuilder implement return result; } + private static void scheduleNaturesImporting(@NotNull final Project project, + @NotNull final Map> module2NatureNames) { + ApplicationManager.getApplication().invokeLater(new Runnable() { + @Override + public void run() { + StartupManager.getInstance(project).runWhenProjectIsInitialized(new Runnable() { + @Override + public void run() { + for (EclipseNatureImporter importer : EclipseNatureImporter.EP_NAME.getExtensions()) { + final String importerNatureName = importer.getNatureName(); + final List modulesToImport = new ArrayList(); + + for (Map.Entry> entry : module2NatureNames.entrySet()) { + final Module module = entry.getKey(); + final Set natureNames = entry.getValue(); + + if (natureNames.contains(importerNatureName)) { + modulesToImport.add(module); + } + } + + if (modulesToImport.size() > 0) { + importer.doImport(project, modulesToImport); + } + } + } + }); + } + }); + } + private static void createEclipseLibrary(final Project project, final Collection libraries, final String libraryName) { if (libraries.contains(libraryName)) { final FileChooserDescriptor fileChooserDescriptor = new FileChooserDescriptor(false, true, false, false, false, false) { @@ -452,4 +488,34 @@ public class EclipseImportBuilder extends ProjectImportBuilder implement } return parameters; } + + public static void collectUnknownNatures(String path, Set naturesNames) { + naturesNames.addAll(collectNatures(path)); + naturesNames.remove("org.eclipse.jdt.core.javanature"); + + for (EclipseNatureImporter importer : EclipseNatureImporter.EP_NAME.getExtensions()) { + naturesNames.remove(importer.getNatureName()); + } + } + + @NotNull + public static Set collectNatures(@NotNull String path) { + final Set naturesNames = new HashSet(); + final File projectfile = new File(path, EclipseXml.DOT_PROJECT_EXT); + try { + final Element natures = JDOMUtil.loadDocument(projectfile).getRootElement().getChild("natures"); + if (natures != null) { + final List naturesList = natures.getChildren("nature"); + for (Object nature : naturesList) { + final String natureName = ((Element)nature).getText(); + if (!StringUtil.isEmptyOrSpaces(natureName)) { + naturesNames.add(natureName); + } + } + } + } + catch (Exception ignore) { + } + return naturesNames; + } } diff --git a/plugins/eclipse/src/org/jetbrains/idea/eclipse/importWizard/EclipseNatureImporter.java b/plugins/eclipse/src/org/jetbrains/idea/eclipse/importWizard/EclipseNatureImporter.java new file mode 100644 index 000000000000..ca0e33370f78 --- /dev/null +++ b/plugins/eclipse/src/org/jetbrains/idea/eclipse/importWizard/EclipseNatureImporter.java @@ -0,0 +1,21 @@ +package org.jetbrains.idea.eclipse.importWizard; + +import com.intellij.openapi.extensions.ExtensionPointName; +import com.intellij.openapi.module.Module; +import com.intellij.openapi.project.Project; +import org.jetbrains.annotations.NotNull; + +import java.util.List; + +/** + * @author Eugene.Kudelevsky + */ +public abstract class EclipseNatureImporter { + public static final ExtensionPointName EP_NAME = + ExtensionPointName.create("org.jetbrains.idea.eclipse.natureImporter"); + + @NotNull + public abstract String getNatureName(); + + public abstract void doImport(@NotNull Project project, @NotNull List modules); +}