IDEADEV-21222
[fedora-idea.git] / source / com / intellij / testFramework / fixtures / impl / ModuleFixtureBuilderImpl.java
blob9b80a3afec1c92417c263d156db92b1a2f3d223e
1 /*
2 * Copyright (c) 2000-2006 JetBrains s.r.o. All Rights Reserved.
3 */
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;
27 import java.util.Set;
29 /**
30 * @author mike
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);
49 return this;
52 public ModuleFixtureBuilder<T> addSourceRoot(final String sourceRootPath) {
53 assert myContentRoots.size() > 0 : "content root should be added first";
54 mySourceRoots.add(sourceRootPath);
55 return this;
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() {
69 return ourIndex++;
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() {
86 public void run() {
87 module[0] = createModule();
88 initModule(module[0]);
90 });
92 return 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);
109 if (vf == null) {
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;
114 if (vf != null) {
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);
124 rootModel.commit();