Merge remote-tracking branch 'origin/master'

This commit is contained in:
Mikhail Golubev
2014-04-28 17:33:47 +04:00
5 changed files with 168 additions and 31 deletions
@@ -107,6 +107,7 @@ public class MavenFoldersImporter {
configOutputFolders();
}
configGeneratedAndExcludedFolders();
myModel.sortSourceFolders();
}
private void configSourceFolders() {
@@ -25,6 +25,7 @@ import com.intellij.openapi.roots.libraries.Library;
import com.intellij.openapi.util.Pair;
import com.intellij.openapi.util.Ref;
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.VfsUtilCore;
import com.intellij.openapi.vfs.VirtualFileManager;
@@ -40,12 +41,15 @@ import org.jetbrains.idea.maven.project.MavenProjectsManager;
import org.jetbrains.idea.maven.utils.Path;
import org.jetbrains.idea.maven.utils.Url;
import org.jetbrains.jps.model.JpsElement;
import org.jetbrains.jps.model.java.JavaSourceRootProperties;
import org.jetbrains.jps.model.java.JavaSourceRootType;
import org.jetbrains.jps.model.java.JpsJavaExtensionService;
import org.jetbrains.jps.model.module.JpsModuleSourceRootType;
import java.io.File;
import java.util.Comparator;
import java.util.Set;
import java.util.TreeSet;
public class MavenRootModelAdapter {
@@ -501,4 +505,68 @@ public class MavenRootModelAdapter {
//bad value was stored
}
}
public void sortSourceFolders() {
for (ContentEntry eachEntry : myRootModel.getContentEntries()) {
final Set<SourceFolderData> sourceFolders = new TreeSet<SourceFolderData>(SourceFolderDataComparator.INSTANCE);
for (SourceFolder eachFolder : eachEntry.getSourceFolders()) {
final JpsElement properties = eachFolder.getJpsElement().getProperties();
//noinspection unchecked
JpsModuleSourceRootType<JpsElement> sourceRootType = (JpsModuleSourceRootType<JpsElement>)eachFolder.getRootType();
if (properties instanceof JavaSourceRootProperties) {
sourceFolders.add(
new SourceFolderData<JpsElement>(eachFolder.getUrl(), sourceRootType, ((JavaSourceRootProperties)properties).createCopy())
);
}
else {
sourceFolders.add(new SourceFolderData<JpsElement>(eachFolder.getUrl(), sourceRootType, null));
}
eachEntry.removeSourceFolder(eachFolder);
}
for (SourceFolderData data : sourceFolders) {
if (data.getProperties() == null) {
eachEntry.addSourceFolder(data.getUrl(), data.getType());
}
else {
eachEntry.addSourceFolder(data.getUrl(), data.getType(), data.getProperties());
}
}
}
}
private static final class SourceFolderData<P extends JpsElement> {
@NotNull private final String url;
@NotNull private final JpsModuleSourceRootType<P> type;
@Nullable private final P properties;
private SourceFolderData(@NotNull String url, @NotNull JpsModuleSourceRootType<P> type, @Nullable P properties) {
this.url = url;
this.type = type;
this.properties = properties;
}
@NotNull
public String getUrl() {
return url;
}
@NotNull
public JpsModuleSourceRootType<P> getType() {
return type;
}
@Nullable
public P getProperties() {
return properties;
}
}
private static final class SourceFolderDataComparator implements Comparator<SourceFolderData> {
public static final SourceFolderDataComparator INSTANCE = new SourceFolderDataComparator();
@Override
public int compare(@NotNull SourceFolderData o1, @NotNull SourceFolderData o2) {
return StringUtil.naturalCompare(o1.getUrl(), o2.getUrl());
}
}
}
@@ -179,7 +179,7 @@ public abstract class MavenImportingTestCase extends MavenTestCase {
actual.add(folderUrl);
}
assertUnorderedPathsAreEqual(actual, Arrays.asList(expected));
assertOrderedElementsAreEqual(actual, Arrays.asList(expected));
}
protected void assertModuleOutput(String moduleName, String output, String testOutput) {
@@ -321,7 +321,7 @@ public class FoldersImportingTest extends MavenImportingTestCase {
resolveFoldersAndImport();
assertModules("project");
assertSources("project", "src/main/java", "extraResources");
assertSources("project", "extraResources", "src/main/java");
assertResources("project", "src/main/resources");
}
@@ -361,7 +361,7 @@ public class FoldersImportingTest extends MavenImportingTestCase {
resolveFoldersAndImport();
assertModules("project");
assertTestSources("project", "src/test/java", "extraTestResources");
assertTestSources("project", "extraTestResources", "src/test/java");
assertTestResources("project", "src/test/resources");
}
@@ -399,7 +399,7 @@ public class FoldersImportingTest extends MavenImportingTestCase {
resolveFoldersAndImport();
assertModules("project");
assertSources("project", "src/main/java", "relativePath");
assertSources("project", "relativePath", "src/main/java");
assertResources("project", "src/main/resources");
}
@@ -500,7 +500,7 @@ public class FoldersImportingTest extends MavenImportingTestCase {
assertModules("project", "m1", "m2");
resolveFoldersAndImport();
assertSources("m1", "src/main/java", "src/foo");
assertSources("m1", "src/foo", "src/main/java");
assertResources("m1", "src/main/resources");
}
@@ -814,8 +814,8 @@ public class FoldersImportingTest extends MavenImportingTestCase {
assertModules("project");
assertExcludes("project",
"targetCustom",
"outputCustom",
"targetCustom",
"testCustom");
assertModuleOutput("project",
getProjectPath() + "/outputCustom",
@@ -902,7 +902,7 @@ public class FoldersImportingTest extends MavenImportingTestCase {
"<artifactId>project</artifactId>" +
"<version>1</version>");
assertExcludes("project", "target/foo", "target/bar");
assertExcludes("project", "target/bar", "target/foo");
assertSources("project",
"src/main/java",
@@ -996,6 +996,74 @@ public class FoldersImportingTest extends MavenImportingTestCase {
assertExcludes("project", "target/foo");
}
public void testSourceFoldersOrder() throws Exception {
createStdProjectFolders();
final VirtualFile target = createProjectSubDir("target");
createProjectSubDirsWithFile("anno",
"target/generated-sources/foo",
"target/generated-sources/annotations",
"target/generated-sources/test-annotations",
"target/generated-test-sources/foo");
createProjectSubDir("test-anno");
importProject("<groupId>test</groupId>" +
"<artifactId>project</artifactId>" +
"<version>1</version>" +
"<build>" +
" <plugins>" +
" <plugin>" +
" <groupId>org.apache.maven.plugins</groupId>" +
" <artifactId>maven-compiler-plugin</artifactId>" +
" <version>2.3.2</version>" +
" <configuration>" +
" <generatedSourcesDirectory>${basedir}/anno</generatedSourcesDirectory>" +
" <generatedTestSourcesDirectory>${basedir}/test-anno</generatedTestSourcesDirectory>" +
" </configuration>" +
" </plugin>" +
" </plugins>" +
"</build>");
final Runnable testAssertions = new Runnable() {
@Override
public void run() {
assertSources("project",
"anno",
"src/main/java",
"target/generated-sources/annotations",
"target/generated-sources/foo",
"target/generated-sources/test-annotations");
assertResources("project", "src/main/resources");
assertTestSources("project",
"src/test/java",
"target/generated-test-sources/foo");
assertTestResources("project", "src/test/resources");
}
};
testAssertions.run();
ApplicationManager.getApplication().runWriteAction(new Runnable() {
public void run() {
try {
target.delete(this);
}
catch (IOException e) {
fail("Unable to delete the file: " + e.getMessage());
}
}
});
testAssertions.run();
importProject();
testAssertions.run();
resolveFoldersAndImport();
testAssertions.run();
}
public void testUnexcludeNewSources() throws Exception {
createProjectSubDirs("target/foo");
createProjectSubDirs("target/src");
@@ -1060,8 +1128,8 @@ public class FoldersImportingTest extends MavenImportingTestCase {
assertSources("project",
"src/main/java",
"target/generated-sources/foo",
"target/generated-sources/annotations");
"target/generated-sources/annotations",
"target/generated-sources/foo");
assertResources("project", "src/main/resources");
assertTestSources("project",
@@ -1100,10 +1168,10 @@ public class FoldersImportingTest extends MavenImportingTestCase {
"</build>");
assertSources("project",
"src/main/java",
"anno",
"target/generated-sources/foo",
"src/main/java",
"target/generated-sources/annotations",
"target/generated-sources/foo",
"target/generated-sources/test-annotations");
assertResources("project", "src/main/resources");
@@ -92,12 +92,12 @@ public class GroovyImporterTest extends MavenImportingTestCase {
assertModules("project");
assertSources("project",
"src/main/java",
"src/main/groovy");
"src/main/groovy",
"src/main/java");
assertResources("project", "src/main/resources");
assertTestSources("project",
"src/test/java",
"src/test/groovy");
"src/test/groovy",
"src/test/java");
assertTestResources("project", "src/test/resources");
}
@@ -122,12 +122,12 @@ public class GroovyImporterTest extends MavenImportingTestCase {
assertModules("project");
assertSources("project",
"src/main/java",
"src/main/groovy");
"src/main/groovy",
"src/main/java");
assertResources("project", "src/main/resources");
assertTestSources("project",
"src/test/java",
"src/test/groovy");
"src/test/groovy",
"src/test/java");
assertTestResources("project", "src/test/resources");
}
@@ -185,12 +185,12 @@ public class GroovyImporterTest extends MavenImportingTestCase {
assertModules("project");
assertSources("project",
"src/main/java",
"src/main/groovy");
"src/main/groovy",
"src/main/java");
assertResources("project", "src/main/resources");
assertTestSources("project",
"src/test/java",
"src/test/groovy");
"src/test/groovy",
"src/test/java");
assertTestResources("project", "src/test/resources");
}
@@ -253,14 +253,14 @@ public class GroovyImporterTest extends MavenImportingTestCase {
assertModules("project");
assertSources("project",
"src/main/java",
"src/foo1",
"src/foo2");
"src/foo2",
"src/main/java");
assertResources("project", "src/main/resources");
assertTestSources("project",
"src/test/java",
"src/test-foo1",
"src/test-foo2");
"src/test-foo2",
"src/test/java");
assertTestResources("project", "src/test/resources");
}
@@ -406,8 +406,8 @@ public class GroovyImporterTest extends MavenImportingTestCase {
assertTestResources("project", "src/test/resources");
assertExcludes("project",
"target/generated-sources/foo",
"target/generated-sources/bar");
"target/generated-sources/bar",
"target/generated-sources/foo");
}
public void testDoNotAddCustomGroovySpecificGeneratedSourcesByRelativePath() throws Exception {
@@ -455,8 +455,8 @@ public class GroovyImporterTest extends MavenImportingTestCase {
assertTestSources("project");
assertExcludes("project",
"target/generated-sources/foo",
"target/generated-sources/bar");
"target/generated-sources/bar",
"target/generated-sources/foo");
}
public void testUpdatingGroovySpecificGeneratedSourcesOnFoldersUpdate() throws Exception {