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 com
.intellij
.packaging
.impl
.run
;
18 import com
.intellij
.execution
.BeforeRunTaskProvider
;
19 import com
.intellij
.execution
.RunManagerEx
;
20 import com
.intellij
.execution
.configurations
.RunConfiguration
;
21 import com
.intellij
.execution
.impl
.ConfigurationSettingsEditorWrapper
;
22 import com
.intellij
.ide
.DataManager
;
23 import com
.intellij
.openapi
.actionSystem
.DataContext
;
24 import com
.intellij
.openapi
.application
.ApplicationManager
;
25 import com
.intellij
.openapi
.application
.ModalityState
;
26 import com
.intellij
.openapi
.application
.ReadAction
;
27 import com
.intellij
.openapi
.application
.Result
;
28 import com
.intellij
.openapi
.compiler
.*;
29 import com
.intellij
.openapi
.compiler
.Compiler
;
30 import com
.intellij
.openapi
.project
.Project
;
31 import com
.intellij
.openapi
.ui
.DialogBuilder
;
32 import com
.intellij
.openapi
.ui
.DialogWrapper
;
33 import com
.intellij
.openapi
.util
.Key
;
34 import com
.intellij
.openapi
.util
.Ref
;
35 import com
.intellij
.packaging
.artifacts
.Artifact
;
36 import com
.intellij
.packaging
.artifacts
.ArtifactManager
;
37 import com
.intellij
.packaging
.artifacts
.ArtifactPointer
;
38 import com
.intellij
.packaging
.artifacts
.ArtifactPointerManager
;
39 import com
.intellij
.packaging
.impl
.compiler
.ArtifactAwareCompiler
;
40 import com
.intellij
.packaging
.impl
.compiler
.ArtifactCompileScope
;
41 import com
.intellij
.packaging
.impl
.compiler
.IncrementalArtifactsCompiler
;
42 import com
.intellij
.util
.concurrency
.Semaphore
;
43 import com
.intellij
.util
.containers
.ContainerUtil
;
44 import gnu
.trove
.THashSet
;
45 import org
.jetbrains
.annotations
.NonNls
;
46 import org
.jetbrains
.annotations
.NotNull
;
49 import java
.util
.ArrayList
;
50 import java
.util
.List
;
56 public class BuildArtifactsBeforeRunTaskProvider
extends BeforeRunTaskProvider
<BuildArtifactsBeforeRunTask
> {
57 @NonNls public static final String BUILD_ARTIFACTS_ID
= "BuildArtifacts";
58 public static final Key
<BuildArtifactsBeforeRunTask
> ID
= Key
.create(BUILD_ARTIFACTS_ID
);
59 private Project myProject
;
61 public BuildArtifactsBeforeRunTaskProvider(Project project
) {
65 public Key
<BuildArtifactsBeforeRunTask
> getId() {
69 public String
getDescription(RunConfiguration runConfiguration
, BuildArtifactsBeforeRunTask task
) {
70 final List
<ArtifactPointer
> pointers
= task
.getArtifactPointers();
71 if (!task
.isEnabled() || pointers
.isEmpty()) {
72 return "Build Artifacts";
74 if (pointers
.size() == 1) {
75 return "Build '" + pointers
.get(0).getArtifactName() + "' artifact";
77 return "Build " + pointers
.size() + " artifacts";
80 public boolean hasConfigurationButton() {
84 public BuildArtifactsBeforeRunTask
createTask(RunConfiguration runConfiguration
) {
85 return new BuildArtifactsBeforeRunTask(myProject
);
88 public boolean configureTask(RunConfiguration runConfiguration
, BuildArtifactsBeforeRunTask task
) {
89 final Artifact
[] artifacts
= ArtifactManager
.getInstance(myProject
).getArtifacts();
90 Set
<ArtifactPointer
> pointers
= new THashSet
<ArtifactPointer
>();
91 for (Artifact artifact
: artifacts
) {
92 pointers
.add(ArtifactPointerManager
.getInstance(myProject
).createPointer(artifact
));
94 pointers
.addAll(task
.getArtifactPointers());
95 ArtifactChooser chooser
= new ArtifactChooser(new ArrayList
<ArtifactPointer
>(pointers
));
96 chooser
.markElements(task
.getArtifactPointers());
98 DialogBuilder builder
= new DialogBuilder(myProject
);
99 builder
.setTitle("Select Artifacts");
100 builder
.addOkAction();
101 builder
.addCancelAction();
102 builder
.setCenterPanel(chooser
);
103 builder
.setPreferedFocusComponent(chooser
);
104 if (builder
.show() == DialogWrapper
.OK_EXIT_CODE
) {
105 task
.setArtifactPointers(chooser
.getMarkedElements());
111 public boolean executeTask(DataContext context
, RunConfiguration configuration
, final BuildArtifactsBeforeRunTask task
) {
112 final Ref
<Boolean
> result
= Ref
.create(false);
113 final Semaphore finished
= new Semaphore();
115 final List
<Artifact
> artifacts
= new ArrayList
<Artifact
>();
117 protected void run(final Result result
) {
118 for (ArtifactPointer pointer
: task
.getArtifactPointers()) {
119 ContainerUtil
.addIfNotNull(pointer
.getArtifact(), artifacts
);
124 final CompileStatusNotification callback
= new CompileStatusNotification() {
125 public void finished(boolean aborted
, int errors
, int warnings
, CompileContext compileContext
) {
126 result
.set(!aborted
&& errors
== 0);
130 final CompilerFilter compilerFilter
= new CompilerFilter() {
131 public boolean acceptCompiler(Compiler compiler
) {
132 return compiler
instanceof IncrementalArtifactsCompiler
133 || compiler
instanceof ArtifactAwareCompiler
&& ((ArtifactAwareCompiler
)compiler
).shouldRun(artifacts
);
137 ApplicationManager
.getApplication().invokeAndWait(new Runnable() {
139 final CompilerManager manager
= CompilerManager
.getInstance(myProject
);
141 manager
.make(ArtifactCompileScope
.createArtifactsScope(myProject
, artifacts
), compilerFilter
, callback
);
143 }, ModalityState
.NON_MODAL
);
149 public static void setBuildArtifactBeforeRunOption(@NotNull JComponent runConfigurationEditorComponent
, @NotNull Artifact artifact
, final boolean enable
) {
150 final DataContext dataContext
= DataManager
.getInstance().getDataContext(runConfigurationEditorComponent
);
151 final ConfigurationSettingsEditorWrapper editor
= ConfigurationSettingsEditorWrapper
.CONFIGURATION_EDITOR_KEY
.getData(dataContext
);
152 if (editor
!= null) {
153 final BuildArtifactsBeforeRunTask task
= (BuildArtifactsBeforeRunTask
)editor
.getStepsBeforeLaunch().get(ID
);
155 task
.addArtifact(artifact
);
156 task
.setEnabled(true);
159 task
.removeArtifact(artifact
);
160 if (task
.getArtifactPointers().isEmpty()) {
161 task
.setEnabled(false);
164 editor
.updateBeforeRunTaskPanel(ID
);
168 public static void setBuildArtifactBeforeRun(@NotNull Project project
, @NotNull RunConfiguration configuration
, @NotNull Artifact artifact
) {
169 RunManagerEx runManager
= RunManagerEx
.getInstanceEx(project
);
170 final BuildArtifactsBeforeRunTask buildArtifactsTask
= runManager
.getBeforeRunTask(configuration
, ID
);
171 if (buildArtifactsTask
!= null) {
172 buildArtifactsTask
.setEnabled(true);
173 buildArtifactsTask
.addArtifact(artifact
);