package org.jetbrains.plugins.cucumber.java.run;
import com.intellij.execution.actions.ConfigurationContext;
import com.intellij.openapi.extensions.Extensions;
import com.intellij.openapi.util.NullableComputable;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.PsiDirectory;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiElementVisitor;
import com.intellij.psi.PsiFile;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.plugins.cucumber.CucumberBundle;
import org.jetbrains.plugins.cucumber.CucumberJvmExtensionPoint;
import org.jetbrains.plugins.cucumber.psi.GherkinFile;
import java.util.Set;
public class CucumberJavaAllFeaturesInFolderRunConfigurationProducer extends CucumberJavaRunConfigurationProducer {
@Override
protected NullableComputable<String> getStepsGlue(@NotNull final PsiElement element) {
final Set<String> glues = getHookGlue(element);
if (element instanceof PsiDirectory) {
final PsiDirectory dir = (PsiDirectory)element;
final CucumberJvmExtensionPoint[] extensions = Extensions.getExtensions(CucumberJvmExtensionPoint.EP_NAME);
return new NullableComputable<String>() {
@Nullable
@Override
public String compute() {
dir.accept(new PsiElementVisitor() {
@Override
public void visitFile(final PsiFile file) {
if (file instanceof GherkinFile) {
for (CucumberJvmExtensionPoint extension : extensions) {
extension.getGlues((GherkinFile)file, glues);
}
}
}
@Override
public void visitDirectory(PsiDirectory dir) {
for (PsiDirectory subDir : dir.getSubdirectories()) {
subDir.accept(this);
}
for (PsiFile file : dir.getFiles()) {
file.accept(this);
}
}
});
return StringUtil.join(glues, " ");
}
};
}
return null;
}
@Override
protected String getConfigurationName(@NotNull final ConfigurationContext context) {
final PsiElement element = context.getPsiLocation();
return CucumberBundle.message("cucumber.run.all.features", ((PsiDirectory)element).getVirtualFile().getName());
}
@Nullable
@Override
protected VirtualFile getFileToRun(ConfigurationContext context) {
final PsiElement element = context.getPsiLocation();
if (element != null && element instanceof PsiDirectory) {
return ((PsiDirectory) element).getVirtualFile();
}
return null;
}
}