Maven: updating sorce folders after goals execution
[fedora-idea.git] / plugins / maven / src / main / java / org / jetbrains / idea / maven / execution / MavenRunConfigurationType.java
blobe894b1feaacefce6049699bacdd565c31976e3a5
1 /*
2 * Copyright 2000-2009 JetBrains s.r.o.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
16 package org.jetbrains.idea.maven.execution;
18 import com.intellij.compiler.options.CompileStepBeforeRun;
19 import com.intellij.execution.*;
20 import com.intellij.execution.configurations.ConfigurationFactory;
21 import com.intellij.execution.configurations.ConfigurationTypeUtil;
22 import com.intellij.execution.configurations.RunConfiguration;
23 import com.intellij.execution.executors.DefaultRunExecutor;
24 import com.intellij.execution.impl.RunnerAndConfigurationSettingsImpl;
25 import com.intellij.execution.runners.ExecutionEnvironment;
26 import com.intellij.execution.runners.ProgramRunner;
27 import com.intellij.openapi.actionSystem.DataContext;
28 import com.intellij.openapi.project.Project;
29 import com.intellij.openapi.util.IconLoader;
30 import com.intellij.openapi.util.Key;
31 import com.intellij.openapi.util.text.StringUtil;
32 import com.intellij.openapi.vfs.LocalFileSystem;
33 import com.intellij.openapi.vfs.VirtualFile;
34 import com.intellij.psi.PsiFile;
35 import org.jetbrains.annotations.NonNls;
36 import org.jetbrains.annotations.NotNull;
37 import org.jetbrains.annotations.Nullable;
38 import org.jetbrains.idea.maven.project.MavenGeneralSettings;
39 import org.jetbrains.idea.maven.project.MavenProject;
40 import org.jetbrains.idea.maven.project.MavenProjectsManager;
41 import org.jetbrains.idea.maven.utils.MavenUtil;
43 import javax.swing.*;
44 import java.util.List;
46 /**
47 * @author Vladislav.Kaznacheev
49 public class MavenRunConfigurationType implements LocatableConfigurationType {
50 private final ConfigurationFactory myFactory;
51 private static final Icon ICON = IconLoader.getIcon("/images/phase.png");
52 private static final int MAX_NAME_LENGTH = 40;
54 /**
55 * reflection
57 MavenRunConfigurationType() {
58 myFactory = new ConfigurationFactory(this) {
59 public RunConfiguration createTemplateConfiguration(Project project) {
60 throw new UnsupportedOperationException();
63 public RunConfiguration createTemplateConfiguration(Project project, RunManager runManager) {
64 return new MavenRunConfiguration(project, this, "");
67 @Override
68 public void configureBeforeRunTaskDefaults(Key<? extends BeforeRunTask> providerID, BeforeRunTask task) {
69 if (providerID == CompileStepBeforeRun.ID) {
70 task.setEnabled(false);
76 public String getDisplayName() {
77 return RunnerBundle.message("maven.run.configuration.name");
80 public String getConfigurationTypeDescription() {
81 return RunnerBundle.message("maven.run.configuration.description");
84 public Icon getIcon() {
85 return ICON;
88 public ConfigurationFactory[] getConfigurationFactories() {
89 return new ConfigurationFactory[]{myFactory};
92 @NonNls
93 @NotNull
94 public String getId() {
95 return "MavenRunConfiguration";
98 public static String generateName(Project project, MavenRunnerParameters runnerParameters) {
99 StringBuilder stringBuilder = new StringBuilder();
101 final String name = getMavenProjectName(project, runnerParameters);
102 if (!StringUtil.isEmptyOrSpaces(name)) {
103 stringBuilder.append(name);
104 stringBuilder.append(" ");
107 stringBuilder.append("[");
108 listGoals(stringBuilder, runnerParameters.getGoals());
109 stringBuilder.append("]");
111 return stringBuilder.toString();
114 private static void listGoals(final StringBuilder stringBuilder, final List<String> goals) {
115 int index = 0;
116 for (String goal : goals) {
117 if (index != 0) {
118 if (stringBuilder.length() + goal.length() < MAX_NAME_LENGTH) {
119 stringBuilder.append(",");
121 else {
122 stringBuilder.append("...");
123 break;
126 stringBuilder.append(goal);
127 index++;
131 private static String getMavenProjectName(final Project project, final MavenRunnerParameters runnerParameters) {
132 LocalFileSystem localFileSystem = LocalFileSystem.getInstance();
133 final VirtualFile virtualFile = localFileSystem.findFileByPath(runnerParameters.getPomFilePath());
134 if (virtualFile != null) {
135 MavenProject mavenProject = MavenProjectsManager.getInstance(project).findProject(virtualFile);
136 if (mavenProject != null) {
137 if (!StringUtil.isEmptyOrSpaces(mavenProject.getMavenId().getArtifactId())) {
138 return mavenProject.getMavenId().getArtifactId();
142 return null;
145 public RunnerAndConfigurationSettings createConfigurationByLocation(Location l) {
146 final MavenRunnerParameters params = createBuildParameters(l);
147 if (params == null) return null;
148 return createRunnerAndConfigurationSettings(null, null, params, l.getProject());
151 public boolean isConfigurationByLocation(RunConfiguration configuration, Location location) {
152 return configuration instanceof MavenRunConfiguration &&
153 ((MavenRunConfiguration)configuration).getRunnerParameters().equals(createBuildParameters(location));
156 private static MavenRunnerParameters createBuildParameters(Location l) {
157 if (!(l instanceof MavenGoalLocation)) return null;
159 VirtualFile f = ((PsiFile)l.getPsiElement()).getVirtualFile();
160 List<String> goals = ((MavenGoalLocation)l).getGoals();
161 List<String> profiles = MavenProjectsManager.getInstance(l.getProject()).getActiveProfiles();
163 return new MavenRunnerParameters(true, f.getParent().getPath(), goals, profiles);
166 public static void runConfiguration(Project project,
167 MavenRunnerParameters params,
168 DataContext dataContext,
169 @Nullable ProgramRunner.Callback callback) {
170 MavenGeneralSettings settings = MavenProjectsManager.getInstance(project).getGeneralSettings();
171 MavenRunnerSettings runnerSettings = MavenRunner.getInstance(project).getState();
172 runConfiguration(project, params, settings, runnerSettings, dataContext, callback);
175 public static void runConfiguration(Project project,
176 MavenRunnerParameters params,
177 MavenGeneralSettings settings,
178 MavenRunnerSettings runnerSettings,
179 DataContext context,
180 @Nullable ProgramRunner.Callback callback) {
181 RunnerAndConfigurationSettings configSettings = createRunnerAndConfigurationSettings(settings,
182 runnerSettings,
183 params,
184 project);
186 ProgramRunner runner = RunnerRegistry.getInstance().findRunnerById(DefaultRunExecutor.EXECUTOR_ID);
187 ExecutionEnvironment env = new ExecutionEnvironment(runner, configSettings, context);
188 Executor executor = DefaultRunExecutor.getRunExecutorInstance();
190 try {
191 runner.execute(executor, env, callback);
193 catch (ExecutionException e) {
194 MavenUtil.showError(project, "Failed to execute Maven goal", e);
198 private static RunnerAndConfigurationSettings createRunnerAndConfigurationSettings(MavenGeneralSettings generalSettings,
199 MavenRunnerSettings runnerSettings,
200 MavenRunnerParameters params,
201 Project project) {
202 MavenRunConfigurationType type = ConfigurationTypeUtil.findConfigurationType(MavenRunConfigurationType.class);
204 final RunnerAndConfigurationSettingsImpl settings = RunManagerEx.getInstanceEx(project)
205 .createConfiguration(generateName(project, params), type.myFactory);
206 MavenRunConfiguration runConfiguration = (MavenRunConfiguration)settings.getConfiguration();
207 runConfiguration.setRunnerParameters(params);
208 if (generalSettings != null) runConfiguration.setGeneralSettings(generalSettings);
209 if (runnerSettings != null) runConfiguration.setRunnerSettings(runnerSettings);
211 return settings;