package com.lightd.ideap.maven.execution;
import com.intellij.execution.Location;
import com.intellij.execution.PsiLocation;
import com.intellij.execution.actions.ConfigurationContext;
import com.intellij.execution.actions.RunConfigurationProducer;
import com.intellij.openapi.actionSystem.CommonDataKeys;
import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.util.Comparing;
import com.intellij.openapi.util.Ref;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile;
import com.lightd.ideap.maven.MvnRunConfiguration;
import com.lightd.ideap.maven.MvnRunConfigurationType;
import com.lightd.ideap.maven.RunType;
import org.jetbrains.idea.maven.execution.MavenRunnerParameters;
import org.jetbrains.idea.maven.model.MavenExplicitProfiles;
import org.jetbrains.idea.maven.project.MavenProject;
import org.jetbrains.idea.maven.project.MavenProjectsManager;
import org.jetbrains.idea.maven.utils.actions.MavenActionUtil;
import java.util.List;
/**
* maven module support
*/
public abstract class MavenModuleConfigurationProducer extends RunConfigurationProducer<MvnRunConfiguration> {
protected MavenProject mavenProject;
protected PsiFile psiFile;
protected MavenModuleConfigurationProducer() {
super(MvnRunConfigurationType.getInstance());
}
@Override
public boolean isConfigurationFromContext(MvnRunConfiguration config, ConfigurationContext context) {
if (isContext(context)) {
MavenRunnerParameters parameters = config.getRunnerParameters();
if (Comparing.strEqual(mavenProject.getDirectory(), parameters.getWorkingDirPath())) {
List<String> testParameters = generateMvnParameters();
return isSameParameters(testParameters, parameters.getGoals());
}
}
return false;
}
@Override
protected boolean setupConfigurationFromContext(MvnRunConfiguration config, ConfigurationContext context, Ref<PsiElement> ref) {
if (context == null) return false;
if (!initContext(context) || !isContext(context)) return false;
final MavenRunnerParameters params = createMavenParameters(context.getLocation(), context.getDataContext());
if (params != null) {
config.setRunnerParameters(params);
return setupMavenContext(config, config.getRunnerParameters().getGoals());
}
return false;
}
protected boolean initContext(ConfigurationContext context) {
mavenProject = MavenActionUtil.getMavenProject(context.getDataContext());
psiFile = CommonDataKeys.PSI_FILE.getData(context.getDataContext());
return true;
}
protected boolean isContext(ConfigurationContext context) {
boolean isContext = mavenProject != null;
if (isContext) {
MavenProjectsManager projectsManager = MavenProjectsManager.getInstance(context.getProject());
isContext = projectsManager.isMavenizedModule(context.getModule());
}
return isContext;
}
protected MavenRunnerParameters createMavenParameters(Location l, DataContext dataContext) {
if (l instanceof PsiLocation) {
MavenExplicitProfiles profiles = MavenActionUtil.getProjectsManager(dataContext).getExplicitProfiles();
return new MavenRunnerParameters(true, mavenProject.getDirectory(), null, profiles);
}
return null;
}
protected boolean setupMavenContext(MvnRunConfiguration config, List<String> goals) {
config.setName(generateName());
config.setRunType(getRunType());
goals.addAll(generateMvnParameters());
return true;
}
protected abstract String generateName();
protected abstract RunType getRunType();
protected abstract List<String> generateMvnParameters();
protected abstract boolean isSameParameters(List<String> parameters, List<String> configParameters);
}