option to run ant target before building artifact

This commit is contained in:
nik
2009-11-10 10:50:30 +03:00
parent 27106ff28a
commit 1a4f566e4d
10 changed files with 112 additions and 23 deletions
@@ -44,6 +44,7 @@ import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.openapi.vfs.newvfs.RefreshQueue;
import com.intellij.packaging.artifacts.Artifact;
import com.intellij.packaging.artifacts.ArtifactManager;
import com.intellij.packaging.artifacts.ArtifactProperties;
import com.intellij.packaging.artifacts.ArtifactPropertiesProvider;
import com.intellij.packaging.elements.CompositePackagingElement;
import com.intellij.packaging.elements.PackagingElementResolvingContext;
@@ -211,6 +212,11 @@ public class IncrementalArtifactsCompiler implements PackagingCompiler {
}
try {
onBuildStartedOrFinished(builderContext, false);
if (context.getMessageCount(CompilerMessageCategory.ERROR) > 0) {
return false;
}
int i = 0;
for (final ProcessingItem item0 : items) {
if (item0 instanceof MockProcessingItem) continue;
@@ -276,7 +282,7 @@ public class IncrementalArtifactsCompiler implements PackagingCompiler {
}
}
onBuildFinished(builderContext);
onBuildStartedOrFinished(builderContext, true);
}
catch (ProcessCanceledException e) {
throw e;
@@ -354,13 +360,18 @@ public class IncrementalArtifactsCompiler implements PackagingCompiler {
return outputPath;
}
protected static void onBuildFinished(ArtifactsProcessingItemsBuilderContext context)
throws Exception {
private static void onBuildStartedOrFinished(ArtifactsProcessingItemsBuilderContext context, final boolean finished) throws Exception {
final CompileContext compileContext = context.getCompileContext();
final Set<Artifact> artifacts = getAffectedArtifacts(compileContext);
for (Artifact artifact : artifacts) {
for (ArtifactPropertiesProvider provider : artifact.getPropertiesProviders()) {
artifact.getProperties(provider).onBuildFinished(artifact, compileContext);
final ArtifactProperties<?> properties = artifact.getProperties(provider);
if (finished) {
properties.onBuildFinished(artifact, compileContext);
}
else {
properties.onBuildStarted(artifact, compileContext);
}
}
}
}
@@ -26,6 +26,9 @@ import org.jetbrains.annotations.NotNull;
*/
public abstract class ArtifactProperties<S> implements PersistentStateComponent<S> {
public void onBuildStarted(@NotNull Artifact artifact, @NotNull CompileContext compileContext) {
}
public void onBuildFinished(@NotNull Artifact artifact, @NotNull CompileContext compileContext) {
}
@@ -22,7 +22,8 @@ import com.intellij.openapi.options.UnnamedConfigurable;
*/
public abstract class ArtifactPropertiesEditor implements UnnamedConfigurable {
protected static final String VALIDATION_TAB = "Validation";
protected static final String POSTPROCESSING_TAB = "Post-processing";
protected static final String POST_PROCESSING_TAB = "Post-processing";
protected static final String PRE_PROCESSING_TAB = "Pre-processing";
public abstract String getTabName();
+3 -1
View File
@@ -16,7 +16,9 @@
<errorHandler implementation="com.intellij.diagnostic.ITNReporter"/>
<renameHandler implementation="com.intellij.lang.ant.refactoring.AntRenameHandler"/>
<stepsBeforeRunProvider implementation="com.intellij.lang.ant.config.impl.AntBeforeRunTaskProvider"/>
<packaging.artifactPropertiesProvider implementation="com.intellij.lang.ant.config.impl.AntArtifactPostprocessingPropertiesProvider"/> <keymapExtension implementation="com.intellij.lang.ant.config.impl.AntKeymapExtension"/>
<packaging.artifactPropertiesProvider implementation="com.intellij.lang.ant.config.impl.artifacts.AntArtifactPostprocessingPropertiesProvider"/>
<packaging.artifactPropertiesProvider implementation="com.intellij.lang.ant.config.impl.artifacts.AntArtifactPreProcessingPropertiesProvider"/>
<keymapExtension implementation="com.intellij.lang.ant.config.impl.AntKeymapExtension"/>
<extendWordSelectionHandler implementation="com.intellij.lang.ant.AntPropertyRefSelectioner"/>
<annotator language="ANT" implementationClass="com.intellij.lang.ant.validation.AntAnnotator"/>
<lang.documentationProvider language="ANT" implementationClass="com.intellij.lang.ant.doc.AntDocumentationProvider"/>
@@ -54,7 +54,7 @@ public class TargetChooserDialog extends DialogWrapper {
private AntBuildTarget mySelectedTarget;
private Tree myTree;
protected TargetChooserDialog(final Project project, final AntBuildTarget selectedTarget) {
public TargetChooserDialog(final Project project, final AntBuildTarget selectedTarget) {
super(project, false);
myProject = project;
mySelectedTarget = selectedTarget;
@@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.intellij.lang.ant.config.impl;
package com.intellij.lang.ant.config.impl.artifacts;
import com.intellij.packaging.artifacts.ArtifactProperties;
import com.intellij.packaging.artifacts.ArtifactPropertiesProvider;
@@ -30,7 +30,7 @@ public class AntArtifactPostprocessingPropertiesProvider extends ArtifactPropert
@NotNull
public ArtifactProperties<?> createProperties(@NotNull ArtifactType artifactType) {
return new AntArtifactPostprocessingProperties();
return new AntArtifactProperties(true);
}
}
@@ -0,0 +1,36 @@
/*
* Copyright 2000-2009 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.intellij.lang.ant.config.impl.artifacts;
import com.intellij.packaging.artifacts.ArtifactProperties;
import com.intellij.packaging.artifacts.ArtifactPropertiesProvider;
import com.intellij.packaging.artifacts.ArtifactType;
import org.jetbrains.annotations.NotNull;
/**
* @author nik
*/
public class AntArtifactPreProcessingPropertiesProvider extends ArtifactPropertiesProvider {
public AntArtifactPreProcessingPropertiesProvider() {
super("ant-preprocessing");
}
@NotNull
@Override
public ArtifactProperties<?> createProperties(@NotNull ArtifactType artifactType) {
return new AntArtifactProperties(false);
}
}
@@ -13,18 +13,21 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.intellij.lang.ant.config.impl;
package com.intellij.lang.ant.config.impl.artifacts;
import com.intellij.lang.ant.config.*;
import com.intellij.lang.ant.config.impl.AntConfigurationImpl;
import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.actionSystem.impl.SimpleDataContext;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.compiler.CompileContext;
import com.intellij.openapi.compiler.CompilerMessageCategory;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.packaging.artifacts.Artifact;
import com.intellij.packaging.artifacts.ArtifactProperties;
import com.intellij.packaging.ui.ArtifactPropertiesEditor;
import com.intellij.packaging.ui.ArtifactEditorContext;
import com.intellij.packaging.ui.ArtifactPropertiesEditor;
import com.intellij.util.xmlb.XmlSerializerUtil;
import com.intellij.util.xmlb.annotations.Attribute;
import com.intellij.util.xmlb.annotations.Tag;
@@ -34,35 +37,64 @@ import org.jetbrains.annotations.Nullable;
/**
* @author nik
*/
public class AntArtifactPostprocessingProperties extends ArtifactProperties<AntArtifactPostprocessingProperties> {
public class AntArtifactProperties extends ArtifactProperties<AntArtifactProperties> {
private String myFileUrl;
private String myTargetName;
private boolean myEnabled;
private boolean myPostProcessing;
public ArtifactPropertiesEditor createEditor(@NotNull ArtifactEditorContext context) {
return new AntArtifactPostprocessingPropertiesEditor(this, context.getProject());
public AntArtifactProperties() {
}
public AntArtifactPostprocessingProperties getState() {
public AntArtifactProperties(boolean postProcessing) {
myPostProcessing = postProcessing;
}
public ArtifactPropertiesEditor createEditor(@NotNull ArtifactEditorContext context) {
return new AntArtifactPropertiesEditor(this, context.getProject(), myPostProcessing);
}
public AntArtifactProperties getState() {
return this;
}
@Override
public void onBuildStarted(@NotNull Artifact artifact, @NotNull CompileContext compileContext) {
if (!myPostProcessing) {
runAntTarget(compileContext, artifact);
}
}
@Override
public void onBuildFinished(@NotNull Artifact artifact, @NotNull final CompileContext compileContext) {
if (myPostProcessing) {
runAntTarget(compileContext, artifact);
}
}
private void runAntTarget(CompileContext compileContext, Artifact artifact) {
if (myEnabled) {
final Project project = compileContext.getProject();
final AntBuildTarget target = findTarget(AntConfiguration.getInstance(project));
if (target != null) {
final DataContext dataContext = SimpleDataContext.getProjectContext(project);
if (!myPostProcessing) {
final boolean success = AntConfigurationImpl.executeTargetSynchronously(dataContext, target);
if (!success) {
compileContext.addMessage(CompilerMessageCategory.ERROR, "Cannot build artifact '" + artifact.getName() + "': ant target '" + target.getDisplayName() + "' failed with error", null, -1, -1);
}
return;
}
ApplicationManager.getApplication().invokeLater(new Runnable() {
public void run() {
target.run(SimpleDataContext.getProjectContext(project), AntBuildListener.NULL);
target.run(dataContext, AntBuildListener.NULL);
}
});
}
}
}
public void loadState(AntArtifactPostprocessingProperties state) {
public void loadState(AntArtifactProperties state) {
XmlSerializerUtil.copyBean(state, this);
}
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<form xmlns="http://www.intellij.com/uidesigner/form/" version="1" bind-to-class="com.intellij.lang.ant.config.impl.AntArtifactPostprocessingPropertiesEditor">
<form xmlns="http://www.intellij.com/uidesigner/form/" version="1" bind-to-class="com.intellij.lang.ant.config.impl.artifacts.AntArtifactPropertiesEditor">
<grid id="27dc6" binding="myMainPanel" layout-manager="GridLayoutManager" row-count="2" column-count="1" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
<margin top="0" left="0" bottom="0" right="0"/>
<constraints>
@@ -13,10 +13,12 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.intellij.lang.ant.config.impl;
package com.intellij.lang.ant.config.impl.artifacts;
import com.intellij.lang.ant.config.AntBuildTarget;
import com.intellij.lang.ant.config.AntConfiguration;
import com.intellij.lang.ant.config.impl.artifacts.AntArtifactProperties;
import com.intellij.lang.ant.config.impl.TargetChooserDialog;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.FixedSizeButton;
import com.intellij.openapi.util.Comparing;
@@ -30,17 +32,19 @@ import java.awt.event.ActionListener;
/**
* @author nik
*/
public class AntArtifactPostprocessingPropertiesEditor extends ArtifactPropertiesEditor {
private final AntArtifactPostprocessingProperties myProperties;
public class AntArtifactPropertiesEditor extends ArtifactPropertiesEditor {
private final AntArtifactProperties myProperties;
private final Project myProject;
private JPanel myMainPanel;
private JCheckBox myRunTargetCheckBox;
private FixedSizeButton mySelectTargetButton;
private AntBuildTarget myTarget;
private boolean myPostProcessing;
public AntArtifactPostprocessingPropertiesEditor(AntArtifactPostprocessingProperties properties, Project project) {
public AntArtifactPropertiesEditor(AntArtifactProperties properties, Project project, boolean postProcessing) {
myProperties = properties;
myProject = project;
myPostProcessing = postProcessing;
mySelectTargetButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
selectTarget();
@@ -75,7 +79,7 @@ public class AntArtifactPostprocessingPropertiesEditor extends ArtifactPropertie
}
public String getTabName() {
return POSTPROCESSING_TAB;
return myPostProcessing ? POST_PROCESSING_TAB : PRE_PROCESSING_TAB;
}
public void apply() {