package jetbrains.mps.testbench.junit.runners;
/*Generated by MPS */
import jetbrains.mps.tool.environment.ProjectStrategyBase;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.annotations.NotNull;
import jetbrains.mps.project.Project;
import java.io.File;
import java.util.List;
import java.util.Arrays;
import java.util.function.Function;
import jetbrains.mps.vfs.IFile;
import jetbrains.mps.vfs.impl.IoFileSystem;
import java.util.function.Predicate;
import java.util.stream.Collectors;
import com.intellij.openapi.vfs.newvfs.impl.VfsRootAccess;
import jetbrains.mps.library.ModulesMiner;
/**
* todo: merge with "modules collected from dir", or specify here paths to msd/mpl files
*/
public class FromModulesListProjectStrategy extends ProjectStrategyBase {
public static final String MODULES_PATHS_PROPERTY = "mps.test.modules";
private final String myModulesPath;
public FromModulesListProjectStrategy(@Nullable String modulesPath) {
myModulesPath = modulesPath;
}
public FromModulesListProjectStrategy() {
this(System.getProperty(MODULES_PATHS_PROPERTY));
}
@NotNull
@Override
public Project construct(@NotNull Project emptyProject) {
final String[] modules = myModulesPath.split(File.pathSeparator);
List<String> moduleFolders = Arrays.stream(modules).map(new Function<String, String>() {
@Override
public String apply(String module) {
IFile file = IoFileSystem.INSTANCE.getFile(module);
IFile parent = file.getParent();
if (parent == null) {
return null;
}
return parent.getPath();
}
}).filter(new Predicate<String>() {
public boolean test(String file) {
return file != null;
}
}).collect(Collectors.toList());
VfsRootAccess.allowRootAccess(moduleFolders.toArray(new String[moduleFolders.size()]));
ModulesMiner mm = new ModulesMiner();
for (String modulePath : modules) {
IFile fileByPath = IoFileSystem.INSTANCE.getFile(modulePath);
mm.collectModules(fileByPath);
}
return loadProjectFromModuleHandles(emptyProject, mm.getCollectedModules());
}
@Override
public boolean isApplicable() {
return myModulesPath != null;
}
}