summaryrefslogtreecommitdiff
path: root/plugins/eclipse
diff options
context:
space:
mode:
authorJean-Baptiste Queru <jbq@google.com>2013-04-01 14:41:51 -0700
committerJean-Baptiste Queru <jbq@google.com>2013-04-01 14:41:51 -0700
commit2bd2b7c2623d4266384e890271869efc044aabff (patch)
tree0b31f50e55975b6354ed458314e17b4441bb4e17 /plugins/eclipse
parent1d526b16d476792ca7ce47616d55833115e8d6ab (diff)
downloadidea-2bd2b7c2623d4266384e890271869efc044aabff.tar.gz
Snapshot ee98b298267d0e09d2cd2f0731b6480a56dd48e7 from master branch of git://git.jetbrains.org/idea/community.git
Change-Id: I4515f72af131fdea9fc6905a4dc0fe9532409a81
Diffstat (limited to 'plugins/eclipse')
-rw-r--r--plugins/eclipse/common-eclipse-util/src/AbstractEclipseClasspathReader.java23
-rw-r--r--plugins/eclipse/common-eclipse-util/src/EclipseModuleManager.java8
-rw-r--r--plugins/eclipse/common-eclipse-util/src/EclipseProjectFinder.java20
-rw-r--r--plugins/eclipse/common-eclipse-util/src/IdeaXml.java2
-rw-r--r--plugins/eclipse/common-eclipse-util/src/conversion/AbstractIdeaSpecificSettings.java23
-rw-r--r--plugins/eclipse/jps-plugin/src/org/jetbrains/jps/eclipse/model/JpsEclipseClasspathReader.java5
-rw-r--r--plugins/eclipse/jps-plugin/src/org/jetbrains/jps/eclipse/model/JpsEclipseClasspathSerializer.java13
-rw-r--r--plugins/eclipse/jps-plugin/src/org/jetbrains/jps/eclipse/model/JpsIdeaSpecificSettings.java22
-rw-r--r--plugins/eclipse/resources/EclipseBundle.properties2
-rw-r--r--plugins/eclipse/resources/META-INF/plugin.xml3
-rw-r--r--plugins/eclipse/src/org/jetbrains/idea/eclipse/config/EclipseModuleManagerImpl.java12
-rw-r--r--plugins/eclipse/src/org/jetbrains/idea/eclipse/conversion/EclipseClasspathReader.java6
-rw-r--r--plugins/eclipse/src/org/jetbrains/idea/eclipse/conversion/EclipseClasspathWriter.java2
-rw-r--r--plugins/eclipse/src/org/jetbrains/idea/eclipse/conversion/IdeaSpecificSettings.java47
-rw-r--r--plugins/eclipse/src/org/jetbrains/idea/eclipse/importWizard/EclipseImportBuilder.java101
-rw-r--r--plugins/eclipse/src/org/jetbrains/idea/eclipse/importWizard/EclipseNatureImporter.java52
16 files changed, 279 insertions, 62 deletions
diff --git a/plugins/eclipse/common-eclipse-util/src/AbstractEclipseClasspathReader.java b/plugins/eclipse/common-eclipse-util/src/AbstractEclipseClasspathReader.java
index 22dce5bfe9f9..6b1f53e8bc99 100644
--- a/plugins/eclipse/common-eclipse-util/src/AbstractEclipseClasspathReader.java
+++ b/plugins/eclipse/common-eclipse-util/src/AbstractEclipseClasspathReader.java
@@ -68,6 +68,8 @@ public abstract class AbstractEclipseClasspathReader<T> {
String srcUrl, ExpandMacroToPathMap macroMap);
protected abstract String expandEclipsePath2Url(T rootModel, String path);
+ protected abstract Set<String> getDefinedCons();
+
protected abstract int rearrange(T rootModel);
protected void readClasspathEntry(T rootModel,
@@ -197,18 +199,15 @@ public abstract class AbstractEclipseClasspathReader<T> {
else if (path.startsWith(EclipseXml.JUNIT_CONTAINER)) {
final String junitName = IdeaXml.JUNIT + getPresentableName(path);
addJUnitDefaultLib(rootModel, junitName, macroMap);
- }
- else if (path.equals(EclipseXml.GROOVY_DSL_CONTAINER)) {
- eclipseModuleManager.addGroovySupport(EclipseXml.GROOVY_DSL_CONTAINER);
- eclipseModuleManager.registerSrcPlace(EclipseXml.GROOVY_DSL_CONTAINER, idx);
- }
- else if (path.equals(EclipseXml.GROOVY_SUPPORT)) {
- eclipseModuleManager.addGroovySupport(EclipseXml.GROOVY_SUPPORT);
- eclipseModuleManager.registerSrcPlace(EclipseXml.GROOVY_SUPPORT, idx);
- }
- else {
- eclipseModuleManager.registerUnknownCons(path);
- addNamedLibrary(rootModel, new ArrayList<String>(), exported, path, true);
+ } else {
+ final Set<String> registeredCons = getDefinedCons();
+ if (registeredCons.contains(path)) {
+ eclipseModuleManager.registerCon(path);
+ eclipseModuleManager.registerSrcPlace(path, idx);
+ } else {
+ eclipseModuleManager.registerUnknownCons(path);
+ addNamedLibrary(rootModel, new ArrayList<String>(), exported, path, true);
+ }
}
}
else {
diff --git a/plugins/eclipse/common-eclipse-util/src/EclipseModuleManager.java b/plugins/eclipse/common-eclipse-util/src/EclipseModuleManager.java
index 1aa34e21763d..1ef8e7492309 100644
--- a/plugins/eclipse/common-eclipse-util/src/EclipseModuleManager.java
+++ b/plugins/eclipse/common-eclipse-util/src/EclipseModuleManager.java
@@ -30,9 +30,9 @@ public interface EclipseModuleManager {
@Nullable
String getInvalidJdk();
- void addGroovySupport(String name);
+ void registerCon(String name);
- String[] getGroovySupport();
+ String[] getUsedCons();
void registerEclipseVariablePath(String path, String var);
@@ -87,10 +87,10 @@ public interface EclipseModuleManager {
}
@Override
- public void addGroovySupport(String name) {}
+ public void registerCon(String name) {}
@Override
- public String[] getGroovySupport() {
+ public String[] getUsedCons() {
return ArrayUtil.EMPTY_STRING_ARRAY;
}
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<String> paths, final String rootPath, @Nullable Processor<String> progressUpdater) {
@@ -117,25 +116,6 @@ public class EclipseProjectFinder implements EclipseXml {
return null;
}
- public static void collectUnknownNatures(String path, Set<String> 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/common-eclipse-util/src/IdeaXml.java b/plugins/eclipse/common-eclipse-util/src/IdeaXml.java
index e10c3cbdf4e5..b32fe838f018 100644
--- a/plugins/eclipse/common-eclipse-util/src/IdeaXml.java
+++ b/plugins/eclipse/common-eclipse-util/src/IdeaXml.java
@@ -28,6 +28,8 @@ public interface IdeaXml {
@NonNls String SOURCE_FOLDER_TAG = "sourceFolder";
@NonNls String CONTENT_ENTRY_TAG = "contentEntry";
@NonNls String TEST_FOLDER_TAG = "testFolder";
+ @NonNls String PACKAGE_PREFIX_TAG = "packagePrefix";
+ @NonNls String PACKAGE_PREFIX_VALUE_ATTR = "value";
@NonNls String EXCLUDE_FOLDER_TAG = "excludeFolder";
@NonNls String FOR_TESTS_ATTR = "forTests";
@NonNls String TRUE_VALUE = "true";
diff --git a/plugins/eclipse/common-eclipse-util/src/conversion/AbstractIdeaSpecificSettings.java b/plugins/eclipse/common-eclipse-util/src/conversion/AbstractIdeaSpecificSettings.java
index eb586af7cb6d..3218f3a4d2ac 100644
--- a/plugins/eclipse/common-eclipse-util/src/conversion/AbstractIdeaSpecificSettings.java
+++ b/plugins/eclipse/common-eclipse-util/src/conversion/AbstractIdeaSpecificSettings.java
@@ -34,7 +34,6 @@ public abstract class AbstractIdeaSpecificSettings<T, C, SdkType> {
readLanguageLevel(root, model);
setupCompilerOutputs(root, model);
-
final List entriesElements = root.getChildren(IdeaXml.CONTENT_ENTRY_TAG);
if (!entriesElements.isEmpty()) {
for (Object o : entriesElements) {
@@ -53,6 +52,28 @@ public abstract class AbstractIdeaSpecificSettings<T, C, SdkType> {
readLibraryLevels(root, levels);
}
+ public void initLevels(final Element root, T model, Map<String, String> levels) throws InvalidDataException {
+ expandElement(root, model);
+ readLanguageLevel(root, model);
+ readLibraryLevels(root, levels);
+ }
+
+ public void updateEntries(Element root, T model, @Nullable SdkType projectSdkType) {
+ setupJdk(root, model, projectSdkType);
+ setupCompilerOutputs(root, model);
+ final List entriesElements = root.getChildren(IdeaXml.CONTENT_ENTRY_TAG);
+ if (!entriesElements.isEmpty()) {
+ for (Object o : entriesElements) {
+ readContentEntry((Element)o, createContentEntry(model, ((Element)o).getAttributeValue(IdeaXml.URL_ATTR)), model);
+ }
+ } else {
+ final C[] entries = getEntries(model);//todo
+ if (entries.length > 0) {
+ readContentEntry(root, entries[0], model);
+ }
+ }
+ }
+
protected abstract void readLibraryLevels(Element root, Map<String, String> levels);
protected abstract C[] getEntries(T model);
diff --git a/plugins/eclipse/jps-plugin/src/org/jetbrains/jps/eclipse/model/JpsEclipseClasspathReader.java b/plugins/eclipse/jps-plugin/src/org/jetbrains/jps/eclipse/model/JpsEclipseClasspathReader.java
index 5adca0bb5ed7..72a7065ba800 100644
--- a/plugins/eclipse/jps-plugin/src/org/jetbrains/jps/eclipse/model/JpsEclipseClasspathReader.java
+++ b/plugins/eclipse/jps-plugin/src/org/jetbrains/jps/eclipse/model/JpsEclipseClasspathReader.java
@@ -200,6 +200,11 @@ class JpsEclipseClasspathReader extends AbstractEclipseClasspathReader<JpsModule
return prepareValidUrlInsideJar(url);
}
+ @Override
+ protected Set<String> getDefinedCons() {
+ return Collections.emptySet();
+ }
+
@Override
protected int rearrange(JpsModule rootModel) {
diff --git a/plugins/eclipse/jps-plugin/src/org/jetbrains/jps/eclipse/model/JpsEclipseClasspathSerializer.java b/plugins/eclipse/jps-plugin/src/org/jetbrains/jps/eclipse/model/JpsEclipseClasspathSerializer.java
index 0da330c5437a..c7124f8ca8ea 100644
--- a/plugins/eclipse/jps-plugin/src/org/jetbrains/jps/eclipse/model/JpsEclipseClasspathSerializer.java
+++ b/plugins/eclipse/jps-plugin/src/org/jetbrains/jps/eclipse/model/JpsEclipseClasspathSerializer.java
@@ -48,15 +48,24 @@ public class JpsEclipseClasspathSerializer extends JpsModuleClasspathSerializer
final String eml = module.getName() + EclipseXml.IDEA_SETTINGS_POSTFIX;
final File emlFile = new File(baseModulePath, eml);
final Map<String, String> levels = new HashMap<String, String>();
+ final JpsIdeaSpecificSettings settings;
+ final Element root;
if (emlFile.isFile()) {
final Document emlDocument = JDOMUtil.loadDocument(emlFile);
- final Element root = emlDocument.getRootElement();
- new JpsIdeaSpecificSettings(expander).readIDEASpecific(root, module, projectSdkType, levels);
+ root = emlDocument.getRootElement();
+ settings = new JpsIdeaSpecificSettings(expander);
+ settings.initLevels(root, module, levels);
+ } else {
+ settings = null;
+ root = null;
}
final Document document = JDOMUtil.loadDocument(classpathFile);
final JpsEclipseClasspathReader reader = new JpsEclipseClasspathReader(classpathDir, paths, new HashSet<String>(), levels);
reader.readClasspath(module, null, document.getRootElement(), expander);//todo
+ if (settings != null) {
+ settings.updateEntries(root, module, projectSdkType);
+ }
}
catch (Exception e) {
LOG.info(e);
diff --git a/plugins/eclipse/jps-plugin/src/org/jetbrains/jps/eclipse/model/JpsIdeaSpecificSettings.java b/plugins/eclipse/jps-plugin/src/org/jetbrains/jps/eclipse/model/JpsIdeaSpecificSettings.java
index 9d722746650e..593ce86b4f0b 100644
--- a/plugins/eclipse/jps-plugin/src/org/jetbrains/jps/eclipse/model/JpsIdeaSpecificSettings.java
+++ b/plugins/eclipse/jps-plugin/src/org/jetbrains/jps/eclipse/model/JpsIdeaSpecificSettings.java
@@ -18,11 +18,13 @@ package org.jetbrains.jps.eclipse.model;
import com.intellij.openapi.util.Comparing;
import com.intellij.openapi.util.InvalidDataException;
import com.intellij.openapi.util.SystemInfo;
+import com.intellij.openapi.util.io.FileUtil;
import com.intellij.util.ArrayUtil;
import org.jdom.Element;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.idea.eclipse.IdeaXml;
import org.jetbrains.idea.eclipse.conversion.AbstractIdeaSpecificSettings;
+import org.jetbrains.jps.model.JpsSimpleElement;
import org.jetbrains.jps.model.java.*;
import org.jetbrains.jps.model.library.sdk.JpsSdkType;
import org.jetbrains.jps.model.module.JpsDependenciesList;
@@ -31,6 +33,7 @@ import org.jetbrains.jps.model.module.JpsModuleSourceRoot;
import org.jetbrains.jps.model.serialization.JpsMacroExpander;
import org.jetbrains.jps.model.serialization.library.JpsSdkTableSerializer;
+import java.io.File;
import java.util.List;
import java.util.Map;
@@ -150,6 +153,25 @@ class JpsIdeaSpecificSettings extends AbstractIdeaSpecificSettings<JpsModule, St
}
model.addSourceRoot(url, JavaSourceRootType.TEST_SOURCE);
}
+
+ for (Object o : root.getChildren(IdeaXml.EXCLUDE_FOLDER_TAG)) {
+ final String excludeUrl = ((Element)o).getAttributeValue(IdeaXml.URL_ATTR);
+ if (FileUtil.isAncestor(new File(contentUrl), new File(excludeUrl), false)) {
+ model.getExcludeRootsList().addUrl(excludeUrl);
+ }
+ }
+
+ for (Object o : root.getChildren(IdeaXml.PACKAGE_PREFIX_TAG)) {
+ Element ppElement = (Element)o;
+ final String prefix = ppElement.getAttributeValue(IdeaXml.PACKAGE_PREFIX_VALUE_ATTR);
+ final String url = ppElement.getAttributeValue(IdeaXml.URL_ATTR);
+ for (JpsModuleSourceRoot sourceRoot : model.getSourceRoots()) {
+ if (Comparing.strEqual(sourceRoot.getUrl(), url)) {
+ ((JpsSimpleElement)sourceRoot.getProperties()).setData(new JavaSourceRootProperties(prefix));
+ break;
+ }
+ }
+ }
}
private static JpsJavaExtensionService getService() {
diff --git a/plugins/eclipse/resources/EclipseBundle.properties b/plugins/eclipse/resources/EclipseBundle.properties
index bbf5b559ef25..658e139041d4 100644
--- a/plugins/eclipse/resources/EclipseBundle.properties
+++ b/plugins/eclipse/resources/EclipseBundle.properties
@@ -45,6 +45,6 @@ eclipse.message.rename.failed=Following modules could not be renamed because of
eclipse.title.unresolved.projects=Unresolved module references
eclipse.message.unresolved.projects=Some modules contain unresolved Eclipse-style project-relative library references:\n\n{0}
eclipse.file.type.descr=Eclipse project files
-eclipse.create.library.title=Locate Eclipse installation
+eclipse.create.library.title=Locate Eclipse Installation
eclipse.create.library.description=<html>Some of the projects you are importing depend on Eclipse platform.<br>\
IntelliJ IDEA will create a global library named {0} containing Eclipse libraries.</html> \ No newline at end of file
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 @@
<add-to-group group-id="ExportImportGroup" anchor="last"/>
</action>
</actions>
+ <extensionPoints>
+ <extensionPoint name="natureImporter" interface="org.jetbrains.idea.eclipse.importWizard.EclipseNatureImporter"/>
+ </extensionPoints>
</idea-plugin> \ No newline at end of file
diff --git a/plugins/eclipse/src/org/jetbrains/idea/eclipse/config/EclipseModuleManagerImpl.java b/plugins/eclipse/src/org/jetbrains/idea/eclipse/config/EclipseModuleManagerImpl.java
index 8ac2a9d1c500..0450e375ab64 100644
--- a/plugins/eclipse/src/org/jetbrains/idea/eclipse/config/EclipseModuleManagerImpl.java
+++ b/plugins/eclipse/src/org/jetbrains/idea/eclipse/config/EclipseModuleManagerImpl.java
@@ -63,7 +63,7 @@ public class EclipseModuleManagerImpl implements EclipseModuleManager, Persisten
private Map<String, Integer> mySrcPlace = new LinkedHashMap<String, Integer>();
private String myInvalidJdk;
- private Set<String> myGroovyDslSupport = new LinkedHashSet<String>();
+ private Set<String> myKnownCons = new LinkedHashSet<String>();
public EclipseModuleManagerImpl(Module module) {
myModule = module;
@@ -80,13 +80,13 @@ public class EclipseModuleManagerImpl implements EclipseModuleManager, Persisten
}
@Override
- public void addGroovySupport(String name) {
- myGroovyDslSupport.add(name);
+ public void registerCon(String name) {
+ myKnownCons.add(name);
}
@Override
- public String[] getGroovySupport() {
- return ArrayUtil.toStringArray(myGroovyDslSupport);
+ public String[] getUsedCons() {
+ return ArrayUtil.toStringArray(myKnownCons);
}
public static EclipseModuleManagerImpl getInstance(Module module) {
@@ -260,7 +260,7 @@ public class EclipseModuleManagerImpl implements EclipseModuleManager, Persisten
myEclipseVariablePaths.clear();
myUnknownCons.clear();
mySrcPlace.clear();
- myGroovyDslSupport.clear();
+ myKnownCons.clear();
}
@Override
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 b02f00013e76..951d161f9354 100644
--- a/plugins/eclipse/src/org/jetbrains/idea/eclipse/conversion/EclipseClasspathReader.java
+++ b/plugins/eclipse/src/org/jetbrains/idea/eclipse/conversion/EclipseClasspathReader.java
@@ -41,6 +41,7 @@ import org.jdom.Element;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.idea.eclipse.*;
import org.jetbrains.idea.eclipse.config.EclipseModuleManagerImpl;
+import org.jetbrains.idea.eclipse.importWizard.EclipseNatureImporter;
import org.jetbrains.idea.eclipse.util.ErrorLog;
import java.io.IOException;
@@ -128,6 +129,11 @@ public class EclipseClasspathReader extends AbstractEclipseClasspathReader<Modif
}
@Override
+ protected Set<String> getDefinedCons() {
+ return EclipseNatureImporter.getAllDefinedCons();
+ }
+
+ @Override
protected void addModuleLibrary(ModifiableRootModel rootModel,
Element element,
boolean exported,
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 4234301c7661..598d74cfb3f0 100644
--- a/plugins/eclipse/src/org/jetbrains/idea/eclipse/conversion/EclipseClasspathWriter.java
+++ b/plugins/eclipse/src/org/jetbrains/idea/eclipse/conversion/EclipseClasspathWriter.java
@@ -80,7 +80,7 @@ public class EclipseClasspathWriter {
outputPath = EPathUtil.collapse2EclipsePath(compilerOutputUrl, myModel);
}
}
- for (String support : eclipseModuleManager.getGroovySupport()) {
+ for (String support : eclipseModuleManager.getUsedCons()) {
final Integer place = eclipseModuleManager.getSrcPlace(support);
addOrderEntry(EclipseXml.CON_KIND, support, classpathElement, place != null ? place.intValue() : -1);
}
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 904e7ee4f97f..fa34a48a548d 100644
--- a/plugins/eclipse/src/org/jetbrains/idea/eclipse/conversion/IdeaSpecificSettings.java
+++ b/plugins/eclipse/src/org/jetbrains/idea/eclipse/conversion/IdeaSpecificSettings.java
@@ -27,7 +27,6 @@ import com.intellij.openapi.module.Module;
import com.intellij.openapi.module.ModuleManager;
import com.intellij.openapi.module.ModuleUtil;
import com.intellij.openapi.project.Project;
-import com.intellij.openapi.projectRoots.JavaSdk;
import com.intellij.openapi.projectRoots.ProjectJdkTable;
import com.intellij.openapi.projectRoots.Sdk;
import com.intellij.openapi.roots.*;
@@ -38,6 +37,7 @@ import com.intellij.openapi.util.Comparing;
import com.intellij.openapi.util.InvalidDataException;
import com.intellij.openapi.util.WriteExternalException;
import com.intellij.openapi.util.io.FileUtil;
+import com.intellij.openapi.util.text.StringUtil;
import com.intellij.openapi.vfs.JarFileSystem;
import com.intellij.openapi.vfs.VfsUtil;
import com.intellij.openapi.vfs.VirtualFile;
@@ -215,21 +215,41 @@ public class IdeaSpecificSettings extends AbstractIdeaSpecificSettings<Modifiabl
@Override
public void readContentEntry(Element root, ContentEntry entry, ModifiableRootModel model) {
+ final SourceFolder[] folders = entry.getSourceFolders();
+ final String[] sourceFoldersUrls = new String[folders.length];
+ for (int i = 0; i < folders.length; i++) {
+ final SourceFolder folder = folders[i];
+ sourceFoldersUrls[i] = folder.getUrl();
+ entry.removeSourceFolder(folder);
+ }
+
+ final boolean[] testFolders = new boolean[sourceFoldersUrls.length];
for (Object o : root.getChildren(IdeaXml.TEST_FOLDER_TAG)) {
final String url = ((Element)o).getAttributeValue(IdeaXml.URL_ATTR);
- SourceFolder folderToBeTest = null;
+ for (int i = 0; i < sourceFoldersUrls.length; i++) {
+ if (Comparing.strEqual(sourceFoldersUrls[i], url)) {
+ testFolders[i] = true;
+ break;
+ }
+ }
+ }
+
+ for (int i = 0; i < sourceFoldersUrls.length; i++) {
+ entry.addSourceFolder(sourceFoldersUrls[i], testFolders[i]);
+ }
+
+ for (Object o : root.getChildren(IdeaXml.PACKAGE_PREFIX_TAG)) {
+ Element ppElement = (Element)o;
+ final String prefix = ppElement.getAttributeValue(IdeaXml.PACKAGE_PREFIX_VALUE_ATTR);
+ final String url = ppElement.getAttributeValue(IdeaXml.URL_ATTR);
for (SourceFolder folder : entry.getSourceFolders()) {
if (Comparing.strEqual(folder.getUrl(), url)) {
- folderToBeTest = folder;
+ folder.setPackagePrefix(prefix);
break;
}
}
- if (folderToBeTest != null) {
- entry.removeSourceFolder(folderToBeTest);
- }
- entry.addSourceFolder(url, true);
}
-
+
final String url = entry.getUrl();
for (Object o : root.getChildren(IdeaXml.EXCLUDE_FOLDER_TAG)) {
final String excludeUrl = ((Element)o).getAttributeValue(IdeaXml.URL_ATTR);
@@ -278,6 +298,14 @@ public class IdeaSpecificSettings extends AbstractIdeaSpecificSettings<Modifiabl
element.setAttribute(IdeaXml.URL_ATTR, sourceFolder.getUrl());
isModified = true;
}
+ final String packagePrefix = sourceFolder.getPackagePrefix();
+ if (!StringUtil.isEmptyOrSpaces(packagePrefix)) {
+ Element element = new Element(IdeaXml.PACKAGE_PREFIX_TAG);
+ contentEntryElement.addContent(element);
+ element.setAttribute(IdeaXml.URL_ATTR, sourceFolder.getUrl());
+ element.setAttribute(IdeaXml.PACKAGE_PREFIX_VALUE_ATTR, packagePrefix);
+ isModified = true;
+ }
}
final VirtualFile entryFile = entry.getFile();
@@ -315,8 +343,7 @@ public class IdeaSpecificSettings extends AbstractIdeaSpecificSettings<Modifiabl
}
if (entry instanceof JdkOrderEntry) {
final Sdk jdk = ((JdkOrderEntry)entry).getJdk();
- if (EclipseModuleManagerImpl.getInstance(entry.getOwnerModule()).getInvalidJdk() != null ||
- (jdk != null && !(jdk.getSdkType() instanceof JavaSdk))) {
+ if (EclipseModuleManagerImpl.getInstance(entry.getOwnerModule()).getInvalidJdk() != null || jdk != null) {
if (entry instanceof InheritedJdkOrderEntry) {
root.setAttribute(INHERIT_JDK, "true");
} else {
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..fdbea3cafb7b 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;
@@ -171,17 +173,20 @@ public class EclipseImportBuilder extends ProjectImportBuilder<String> implement
public boolean validate(final Project currentProject, final Project dstProject) {
final Ref<Exception> refEx = new Ref<Exception>();
final HashSet<String> variables = new HashSet<String>();
- final Set<String> naturesNames = new HashSet<String>();
+ final Map<String, String> naturesNames = new HashMap<String, String>();
+ final List<String> projectsToConvert = getParameters().projectsToConvert;
+ final boolean oneProjectToConvert = projectsToConvert.size() == 1;
+ final String separator = oneProjectToConvert ? "<br>" : ", ";
ProgressManager.getInstance().runProcessWithProgressSynchronously(new Runnable() {
public void run() {
try {
- for (String path : getParameters().projectsToConvert) {
+ for (String path : projectsToConvert) {
final File classpathfile = new File(path, EclipseXml.DOT_CLASSPATH_EXT);
if (classpathfile.exists()) {
final Element classpathElement = JDOMUtil.loadDocument(classpathfile).getRootElement();
EclipseClasspathReader.collectVariables(variables, classpathElement, path);
}
- EclipseProjectFinder.collectUnknownNatures(path, naturesNames);
+ collectUnknownNatures(path, naturesNames, separator);
}
}
catch (IOException e) {
@@ -206,7 +211,19 @@ public class EclipseImportBuilder extends ProjectImportBuilder<String> implement
public void run() {
if (!naturesNames.isEmpty()) {
final String title = "Unknown Natures Detected";
- Notifications.Bus.notify(new Notification(title, title, "Imported projects contain unknown natures:<br>" + StringUtil.join(naturesNames, "<br>")+ "<br>" +
+ final String naturesByProject;
+ if (oneProjectToConvert) {
+ naturesByProject = naturesNames.values().iterator().next();
+ }
+ else {
+ naturesByProject = StringUtil.join(naturesNames.keySet(), new Function<String, String>() {
+ @Override
+ public String fun(String projectPath) {
+ return projectPath + "(" + naturesNames.get(projectPath) + ")";
+ }
+ }, "<br>");
+ }
+ Notifications.Bus.notify(new Notification(title, title, "Imported projects contain unknown natures:<br>" + naturesByProject + "<br>" +
"Some settings may be lost after import.", NotificationType.WARNING));
}
}
@@ -224,6 +241,7 @@ public class EclipseImportBuilder extends ProjectImportBuilder<String> implement
final Collection<String> unknownJdks = new TreeSet<String>();
final Set<String> refsToModules = new HashSet<String>();
final List<Module> result = new ArrayList<Module>();
+ final Map<Module, Set<String>> module2NatureNames = new HashMap<Module, Set<String>>();
try {
final ModifiableModuleModel moduleModel = model != null ? model : ModuleManager.getInstance(project).getModifiableModel();
@@ -296,6 +314,11 @@ public class EclipseImportBuilder extends ProjectImportBuilder<String> implement
final Module module = moduleModel.newModule(modulesDirectory + "/" + EclipseProjectFinder.findProjectName(path) + IdeaXml.IML_EXT,
StdModuleTypes.JAVA.getId());
result.add(module);
+ final Set<String> natures = collectNatures(path);
+
+ if (natures.size() > 0) {
+ module2NatureNames.put(module, natures);
+ }
final ModifiableRootModel rootModel = ModuleRootManager.getInstance(module).getModifiableModel();
rootModels[idx++] = rootModel;
@@ -330,7 +353,7 @@ public class EclipseImportBuilder extends ProjectImportBuilder<String> implement
catch (Exception e) {
LOG.error(e);
}
-
+ scheduleNaturesImporting(project, module2NatureNames);
createEclipseLibrary(project, unknownLibraries, IdeaXml.ECLIPSE_LIBRARY);
StringBuffer message = new StringBuffer();
@@ -400,6 +423,40 @@ public class EclipseImportBuilder extends ProjectImportBuilder<String> implement
return result;
}
+ private static void scheduleNaturesImporting(@NotNull final Project project,
+ @NotNull final Map<Module, Set<String>> module2NatureNames) {
+ if (module2NatureNames.size() == 0) {
+ return;
+ }
+ 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<Module> modulesToImport = new ArrayList<Module>();
+
+ for (Map.Entry<Module, Set<String>> entry : module2NatureNames.entrySet()) {
+ final Module module = entry.getKey();
+ final Set<String> 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<String> libraries, final String libraryName) {
if (libraries.contains(libraryName)) {
final FileChooserDescriptor fileChooserDescriptor = new FileChooserDescriptor(false, true, false, false, false, false) {
@@ -452,4 +509,38 @@ public class EclipseImportBuilder extends ProjectImportBuilder<String> implement
}
return parameters;
}
+
+ public static void collectUnknownNatures(String path, Map<String, String> naturesNames, String separator) {
+ final Set<String> natures = collectNatures(path);
+ natures.remove("org.eclipse.jdt.core.javanature");
+
+ for (EclipseNatureImporter importer : EclipseNatureImporter.EP_NAME.getExtensions()) {
+ natures.remove(importer.getNatureName());
+ }
+
+ if (!natures.isEmpty()) {
+ naturesNames.put(path, StringUtil.join(natures, separator));
+ }
+ }
+
+ @NotNull
+ public static Set<String> collectNatures(@NotNull String path) {
+ final Set<String> naturesNames = new HashSet<String>();
+ 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..d496d24145b4
--- /dev/null
+++ b/plugins/eclipse/src/org/jetbrains/idea/eclipse/importWizard/EclipseNatureImporter.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2000-2013 JetBrains s.r.o.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jetbrains.idea.eclipse.importWizard;
+
+import com.intellij.openapi.extensions.ExtensionPointName;
+import com.intellij.openapi.extensions.Extensions;
+import com.intellij.openapi.module.Module;
+import com.intellij.openapi.project.Project;
+import com.intellij.util.containers.HashSet;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.idea.eclipse.EclipseXml;
+
+import java.util.List;
+import java.util.Set;
+
+/**
+ * @author Eugene.Kudelevsky
+ */
+public abstract class EclipseNatureImporter {
+ public static final ExtensionPointName<EclipseNatureImporter> EP_NAME =
+ ExtensionPointName.create("org.jetbrains.idea.eclipse.natureImporter");
+
+ @NotNull
+ public abstract String getNatureName();
+ public abstract Set<String> getProvidedCons();
+
+ public abstract void doImport(@NotNull Project project, @NotNull List<Module> modules);
+
+ public static Set<String> getAllDefinedCons() {
+ final Set<String> allCons = new HashSet<String>();
+ allCons.add(EclipseXml.GROOVY_SUPPORT);
+ allCons.add(EclipseXml.GROOVY_DSL_CONTAINER);
+
+ for (EclipseNatureImporter provider : Extensions.getExtensions(EP_NAME)) {
+ allCons.addAll(provider.getProvidedCons());
+ }
+ return allCons;
+ }
+}