2 * Copyright (c) 2000-2006 JetBrains s.r.o. All Rights Reserved.
5 package com
.intellij
.testFramework
.fixtures
.impl
;
7 import com
.intellij
.openapi
.application
.ApplicationManager
;
8 import com
.intellij
.openapi
.module
.Module
;
9 import com
.intellij
.openapi
.module
.ModuleManager
;
10 import com
.intellij
.openapi
.module
.ModuleType
;
11 import com
.intellij
.openapi
.project
.Project
;
12 import com
.intellij
.openapi
.roots
.ContentEntry
;
13 import com
.intellij
.openapi
.roots
.ModifiableRootModel
;
14 import com
.intellij
.openapi
.roots
.ModuleRootManager
;
15 import com
.intellij
.openapi
.vfs
.LocalFileSystem
;
16 import com
.intellij
.openapi
.vfs
.VfsUtil
;
17 import com
.intellij
.openapi
.vfs
.VirtualFile
;
18 import com
.intellij
.testFramework
.builders
.ModuleFixtureBuilder
;
19 import com
.intellij
.testFramework
.fixtures
.IdeaProjectTestFixture
;
20 import com
.intellij
.testFramework
.fixtures
.ModuleFixture
;
21 import com
.intellij
.testFramework
.fixtures
.TestFixtureBuilder
;
22 import gnu
.trove
.THashSet
;
23 import org
.jetbrains
.annotations
.NotNull
;
25 import java
.util
.ArrayList
;
26 import java
.util
.List
;
32 abstract class ModuleFixtureBuilderImpl
<T
extends ModuleFixture
> implements ModuleFixtureBuilder
<T
> {
33 private static int ourIndex
;
35 private final ModuleType myModuleType
;
36 protected final List
<String
> myContentRoots
= new ArrayList
<String
>();
37 protected final List
<String
> mySourceRoots
= new ArrayList
<String
>();
38 protected final TestFixtureBuilder
<?
extends IdeaProjectTestFixture
> myFixtureBuilder
;
39 private T myModuleFixture
;
40 private String myOutputPath
;
42 public ModuleFixtureBuilderImpl(@NotNull final ModuleType moduleType
, TestFixtureBuilder
<?
extends IdeaProjectTestFixture
> fixtureBuilder
) {
43 myModuleType
= moduleType
;
44 myFixtureBuilder
= fixtureBuilder
;
47 public ModuleFixtureBuilder
<T
> addContentRoot(final String contentRootPath
) {
48 myContentRoots
.add(contentRootPath
);
52 public ModuleFixtureBuilder
<T
> addSourceRoot(final String sourceRootPath
) {
53 assert myContentRoots
.size() > 0 : "content root should be added first";
54 mySourceRoots
.add(sourceRootPath
);
58 public void setOutputPath(final String outputPath
) {
59 myOutputPath
= outputPath
;
62 protected Module
createModule() {
63 final Project project
= myFixtureBuilder
.getFixture().getProject();
64 assert project
!= null;
65 return ModuleManager
.getInstance(project
).newModule(getNextIndex() + ".iml", myModuleType
);
68 private static int getNextIndex() {
73 public synchronized T
getFixture() {
74 if (myModuleFixture
== null) {
75 myModuleFixture
= instantiateFixture();
77 return myModuleFixture
;
80 protected abstract T
instantiateFixture();
82 Module
buildModule() {
83 final Module
[] module
= new Module
[]{null};
85 ApplicationManager
.getApplication().runWriteAction(new Runnable() {
87 module
[0] = createModule();
88 initModule(module
[0]);
95 void initModule(Module module
) {
96 final Set
<String
> sourcesLeft
= new THashSet
<String
>();
97 final ModuleRootManager rootManager
= ModuleRootManager
.getInstance(module
);
98 final ModifiableRootModel rootModel
= rootManager
.getModifiableModel();
100 for (String contentRoot
: myContentRoots
) {
101 final VirtualFile virtualFile
= LocalFileSystem
.getInstance().refreshAndFindFileByPath(contentRoot
);
102 assert virtualFile
!= null : "cannot find content root: " + contentRoot
;
103 final ContentEntry contentEntry
= rootModel
.addContentEntry(virtualFile
);
106 for (String sourceRoot
: mySourceRoots
) {
107 String s
= contentRoot
+ "/" + sourceRoot
;
108 VirtualFile vf
= LocalFileSystem
.getInstance().refreshAndFindFileByPath(s
);
110 final VirtualFile file
= LocalFileSystem
.getInstance().refreshAndFindFileByPath(sourceRoot
);
111 if (file
!= null && VfsUtil
.isAncestor(virtualFile
, file
, false)) vf
= file
;
113 //assert vf != null : "cannot find source root: " + sourceRoot;
115 contentEntry
.addSourceFolder(vf
, false);
119 if (myOutputPath
!= null) {
120 final VirtualFile virtualFile
= LocalFileSystem
.getInstance().refreshAndFindFileByPath(myOutputPath
);
121 assert virtualFile
!= null : "cannot find output path: " + myOutputPath
;
122 rootModel
.setCompilerOutputPath(virtualFile
);